Quantcast
Channel: 우분투 한국 커뮤니티
Viewing all articles
Browse latest Browse all 4577

Re: 하드디스크 복사를 하려고 합니다.

$
0
0
Author: protochaos
Forum: 설치/부팅 관련
Date: 2014-02-07

GRUB2의 설정파일은 /boot/grub/grub.cfg의 파일입니다.
그러나 막상 열어보면,
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
이와 같이 시작하고, 이 파일은 편집하지 말라고 나오며,
grub-mkconfig에 의해 이 파일은 자동으로 생성되기고,
/etc/grub.d/*과 /etc/default/grub 파일이 사용됨을 알 수 있습니다.

sudo update-grub 명령으로 grub.cfg 파일이 변경됩니다.
위에서 쓰여진 대로 내부적으로 grub-mkconfig가 불려집니다.
grub-mkconfig는 /usr/share/grub/grub-mkconfig_lib를 source명령으로 실행하여,
필요한 함수들을 로드하고, /etc/default/grub을 source명령으로 실행하여,
정의된 변수들을 로드합니다.
또한 /etc/default/grub.d/*.cfg를 source 명령으로 실행합니다.
허나 실제적으로 이것은 존재하지 않고, 사용자가 변수나 함수를 따로 설정하기 위해 사용될 수 있을 것입니다.

그런 다음 /etc/grub.d/* 스크립트들 중에 실행권한이 있는
파일들에 한해 번호 순으로 실행하고, 그 결과로 출력되는 내용을 합쳐서 grub.cfg 파일을 만들게 됩니다.

/etc/grub.d/의 스크립들은 다음과 같습니다.
00_header 각종 변수들과 함수들의 정의 및 기본적인 설정
05_debian_theme 색깔 및 그림, 글꼴 등의 화면 꾸미기
10_linux 리눅스 커널 메뉴 생성
20_linux_xen 리눅스 xen (가상머신종류) 메뉴 생성
30_os-prober 리눅스 외의 운영체제 검출 및 메뉴 추가
30_uefi-firmware EFI 펌웨어 설정 메뉴
40_custom 사용자가 추가할 내용 (정적 포함-인클루드)
41_custom 사용자가 추가할 내용 (동적 포함-인클루드)

10_linux 등은 grub-probe를 사용하여, 부트파티션과 루트파티션을 찾아내고, 관련 UUID 및 Label, 파일시스템종류, 파티션 종류 등을 알아내며,
이것을 사용하여 리눅스 메뉴를 만듭니다.
30_os-prober는 os-prober를 사용하여, 다른 운영체제를 검출하고, 이것을 부트메뉴에 추가합니다.
40_custom은 자신의 내용을 3번째 줄 부터 그대로 출력하기 때문에, grub 명령이나 스크립트로 작성되어야 합니다.
하지만 평가의 시점은 grub_mkconfig가 실행되고 있는 동안 내용을 출력하여 grub.cfg에 합치는 것이므로,
수정 후에는 sudo update-grub 명령이 필요합니다.
41_cutom은 단순히 /boot/grub/custom.cfg를 읽어서 실행하라는 GRUB 명령입니다.
그렇기에 /boot/grub/custom.cfg의 내용이 어떻게 변경되는지는 상관하지 않습니다.
평가의 시점은 grub으로 부팅하는 도중, GRUB 부트로더에 의해 실행되는 것입니다.

자 그러면, UUID의 변경은 어떻게 처리하느냐의 문제로 들어가 봅시다.
만일, 리눅스의 루트파티션이나 부트파티션이라면, 10_linux에서 grub-probe를 사용하여 평가할 것이고,
윈도우즈 등의 파티션이라면, 30_os-prober에서 os-prober를 사용하여 평가할 것입니다.
두 경우, 모두 자동으로 생성한다는 것이고, 이것은 /etc/default/grub과는 거의 무관합니다.

만일, UUID를 수동으로 설정하고 싶으시다면,

당연히 먼저 생각해 봐야 할 것은

1) 40_custom과 /boot/grub/custom.cfg 입니다.

먼저 기존 리눅스나, 라이브 CD나 USB등으로 부팅하시고,
새로운 디스크를 마운트하시고, grub부트 로더를 설치해 주셔야 부팅이 가능해집니다.
sudo grub-install /dev/sdb --boot-directory="부트파티션의 마운트위치나 디렉토리" 이렇게 해주시면 됩니다.
이후,/boot/grub/grub.cfg를 참조하여, /boot/grub/custom.cfg에 변경될 부트메뉴를 추가해 주시면 됩니다.
sudo blkid 명령으로 파티션의 UUID, 파일시스템종류, 장치명, Label등을 알아내시고,
/etc/fstab 파일도 그에 맞게 수정해 주셔야 합니다.

2) 자동 메커니즘을 최대한 사용하는 방법도 있습니다.

chroot 환경에서 update-grub 을 해주는 것입니다.
먼저 기존 리눅스나 라이브 CD나 USB로 부팅하신 후,
mkdir t

#/dev/sdb1이 부트파티션, /dev/sdb2가 루트파티션인 경우
sudo mount /dev/sdb2 r
sudo mount /dev/sdb1 r/boot
sudo grub-install /dev/sdb --boot-directory=r/boot

sudo blkid 명령으로 파티션의 UUID, 파일시스템종류, 장치명, Label등을 알아내시고,
sudo vi r/etc/fstab 또는 sudo gedit r/etc/fstab 으로 fstab 변경
sudo mount -o bind /dev/proc r/proc
sudo mount -o bind /dev/sys r/sys
sudo mount -o bind /dev r/dev
sudo mount -o bind /dev/pts r/dev/pts
sudo chroot r /bin/bash
update-grub
exit
sudo umount r/dev/pts r/{dev,sys,proc}

아래의 경우는 chroot로 update-grub을 사용하기에, device.map 파일 등도,
그 시스템에 맞게 적용됩니다.


3) grub.cfg를 변경하지 않는 방법도 있습니다.

먼저 기존 리눅스나 라이브 CD나 USB로 부팅하신 후,
mkdir r
sudo mount /dev/sdb2 r
sudo mount /dev/sdb1 r/boot
이렇게 마운트 하신 후, 부트로더 설치를 아래와 같이 하시고,
sudo grub-install /dev/sdb --boot-directory=r/boot
sudo gedit r/etc/fstab으로 fstab을 변경하시고,
sudo e2label /dev/sdb1 LINUX_BOOT
sudo e2label /dev/sdb2 LINUX_ROOT
이런식으로 Label를 설정하신 후,
sudo umount r/boot r
새로운 디스크로 부팅
SHIFT키를 계속 누르시다 보면, 메뉴가 뜹니다. (이게 안뜬다면, /boot/grub/grub.cfg나 /boot/grub/custom.cfg 등에서, set timeout=-1로 강제 설정하셔서, 메뉴를 보이게 하세요)
원하시는 메뉴 위로 커서를 옮기신 후, e키를 눌러 편집모드로 가신 후,
search로 시작하는 부분의 --fs-uuid 대신 --fs-label로 변경, 뒷 부분의 UUID문자열 대신 이름을 적어주세요
그리고, linux로 시작하는 줄의 root=UUID=문자열 대신 root=LABEL=이름 으로 바꿔주시고,
F10이나 Ctrl+x 키로 부팅을 하세요.
부팅하신 후, sudo update-grub 명령으로 grub메뉴를 갱신하시면 됩니다.

4) 다른 도구를 사용한 마이그레이션을 생각해 볼 수 있습니다.
dd 명령으로 그대로 떠서, MBR의 GRUB부트로더 까지 복사하는 방법이 있는데, 그렇게 하더라도, grub.cfg 파일과 /etc/fstab파일은 변경을 요합니다.
다른 방법으로 clonezilla라는 강력한 도구를 사용하여 백업/복원하는 방법이 있습니다.

그 외에 생각해 볼 것은 /etc/fstab에서의 UUID의 사용입니다.
UUID는 파일시스템의 변경시 (크기 변경, 이동 등) 변화됩니다. 그러나, 한번 적용되면, 다른 디스크와는 확실하게 구별됩니다.
예) UUID=909673cc-1c9b-4554-91d8-a18f267e6a95 / ext4 errors=remount-ro,noatime,nodiratime 0 1
/dev/장치명 의 형태로 사용시 이것은, udev에 의해 자동으로 장치가 /dev에 생성되기에, 부팅순서등에 영향을 받습니다.
예) /dev/sda1 / ext4 errors=remount-ro,noatime,nodiratime 0 1
Label의 형태로 사용시 파티션을 변경하더라도, 동일 이름을 사용하는 경우, 설정을 바꿔주지 않아도 됩니다.
그러나, 동일 이름이 사용되는 파티션의 경우 문제 발생의 소지가 있습니다.
예) /dev/disk/by-label/LINUX_ROOT / ext4 errors=remount-ro,noatime,nodiratime 0 1
그렇지만 이것이 가장 인간적인 이름이기 때문에, UUID를 사용하더라도, Label를 구별하여 정의해 두는 것이 좋습니다.
이유는, GRUB 부트메뉴에서 편집모드로 들어가셔서, linux로 시작하는 커널파라미터 부분에,
root=UUID=xxxxxxxxxxxxxx 이런 식으로 적기보다는
root=LABEL=이름 이런식으로 적는 것이 기억하기 쉽기에, 편집하기 용이합니다.

Viewing all articles
Browse latest Browse all 4577

Trending Articles