목적은 일반 MBR디스크가 아닌 GPT디스크 (2TB이상 파티션 지원시 필수)에 설치된 리눅스 ext4 파티션을 다른 디스크의
파티션으로 통째로 복사하는 방법입니다. 하지만 이 방법은 솔직히 무식한 방법입니다. 인터넷에서 영문게시글 들까지 찾아다가
하다하다 안되서 결국 cp -rp로 복사하는 만행(?)을 저지른 방법인데요, 어쨌든 온전히 부팅성공 시켰습니다. 단지 이 방법은
실무서버에 적용하기에는 아직 무리가 있는 방법일 수도 있다고 판단되니 유념하시길 바랍니다.
제 환경은 이렇습니다.
MB : Asrock Z77 Pro4, UEFI
CPU : Intel Xeon E3-1230 V2
MEM : 16GB
OS : ubuntu 12.04.4 LTS amd64
BOOTLOADER : GRUB2 grub-efi
Source disk : 640GB HDD GPT, /dev/sda
/boot/efi : fat32, 200MB, /dev/sda1
/ : ext4, 200GB, /dev/sda2
Target disk : 60GB SSD GPT, /dev/sdb
/boot/efi : fat32, 200MB, /dev/sdb1
/ : ext4, 20GB, /dev/sdb2
HDD보다 SSD용량이 작은 관계로 파티션 통째복사를 위해 클론질라, dd 등을 사용했는데 ext/GPT라서 그런지 연일 실패
제 환경은 이렇습니다.
MB : Asrock Z77 Pro4, UEFI
CPU : Intel Xeon E3-1230 V2
MEM : 16GB
OS : ubuntu 12.04.4 LTS amd64
BOOTLOADER : GRUB2 grub-efi
Source disk : 640GB HDD GPT, /dev/sda
/boot/efi : fat32, 200MB, /dev/sda1
/ : ext4, 200GB, /dev/sda2
Target disk : 60GB SSD GPT, /dev/sdb
/boot/efi : fat32, 200MB, /dev/sdb1
/ : ext4, 20GB, /dev/sdb2
HDD보다 SSD용량이 작은 관계로 파티션 통째복사를 위해 클론질라, dd 등을 사용했는데 ext/GPT라서 그런지 연일 실패
또는 에러만 떴습니다. 혹시 방법을 알고계신 분들 방법을 알려주시면 시간날 때 이미지백업 후 restore시켜 정상부팅 등을
확인해 보겠습니다. 만약 swap파티션이 있는데 새로 복사하는 디스크에는 없앨 경우, 모든 내용을 복사 완료 후에 부팅 전에
swap 관련 옵션을 꺼두셔야 커널패닉 없이 정상부팅 됩니다. 저는 개인용이라 램도 충분하여 swap을 쓰지 않았습니다.
이 강좌에서 진행한 방법 : 실장비에서 부팅상태로 live로 진행합니다.
1. 공장초기화 상태의 SSD 디스크를 GPT디스크 형식으로 지정하고 EFI와 root 파티션을 각각 생성
2. cp -arpx를 사용해 각각의 파티션을 수동복사
3. /etc/fstab 파일에 새로운 파티션의 UUID 정보를 기입
4. grub2에 등록
5. 부팅시험
6. 기존디스크 제거
구체적인 내용
$ sudo parted /dev/sdb (sudo 명령을 이용하여 관리자권한으로 파티션매니저로 SSD를 다룹니다)
(parted) print (디스크의 파티션 정보를 봅니다)
Error: /dev/sdb: unrecognised disk label (공장초기화 상태로 아무것도 설정되지 않은 상태를 의미합니다)
(parted) mktable gpt (디스크를 GPT형식으로 지정합니다)
(parted) print (mktable 명령이 잘 실행됐는지 확인하기 위해 파티션정보를 다시 봅니다)
Model: ATA KINGMAX SSD 60GB (scsi)
Disk /dev/sdb: 60.0GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
(parted) mkdisk EFI fat32 0% 100MB (주 파티션으로 파티션 ID를 fat32 및 영역을 처음부터 시작해서 100MB를 생성합니다)
(parted) set 1 boot on (생성된 첫 파티션에 boot 플래그를 설정합니다)
(parted)
EFI파티션은 FAT32로 포멧을 해주어야 하며, 용량은 보통 윈도우에서도 100MB로 지정해주고 있습니다.
주의할 점은 아직 포멧은 안했으며, 이는 다 설정하고 나중에 할 것입니다. parted에서도 되긴 하는데, parted에서는
1. 공장초기화 상태의 SSD 디스크를 GPT디스크 형식으로 지정하고 EFI와 root 파티션을 각각 생성
2. cp -arpx를 사용해 각각의 파티션을 수동복사
3. /etc/fstab 파일에 새로운 파티션의 UUID 정보를 기입
4. grub2에 등록
5. 부팅시험
6. 기존디스크 제거
구체적인 내용
$ sudo parted /dev/sdb (sudo 명령을 이용하여 관리자권한으로 파티션매니저로 SSD를 다룹니다)
(parted) print (디스크의 파티션 정보를 봅니다)
Error: /dev/sdb: unrecognised disk label (공장초기화 상태로 아무것도 설정되지 않은 상태를 의미합니다)
(parted) mktable gpt (디스크를 GPT형식으로 지정합니다)
(parted) print (mktable 명령이 잘 실행됐는지 확인하기 위해 파티션정보를 다시 봅니다)
Model: ATA KINGMAX SSD 60GB (scsi)
Disk /dev/sdb: 60.0GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
(parted) mkdisk EFI fat32 0% 100MB (주 파티션으로 파티션 ID를 fat32 및 영역을 처음부터 시작해서 100MB를 생성합니다)
(parted) set 1 boot on (생성된 첫 파티션에 boot 플래그를 설정합니다)
(parted)
EFI파티션은 FAT32로 포멧을 해주어야 하며, 용량은 보통 윈도우에서도 100MB로 지정해주고 있습니다.
주의할 점은 아직 포멧은 안했으며, 이는 다 설정하고 나중에 할 것입니다. parted에서도 되긴 하는데, parted에서는
프로그램 자체적으로 파티션만 만들고 포멧까지는 가능하면 하지 말기를 권장하더군요. mkpartfs 명령으로 생성하면
그 경고문구를 볼 수 있습니다.
(parted) mkdisk primary ext4 100MB 20GB (주 파티션으로 파티션 ID를 ext4 및 영역을 100MB부터 20GB까지 파티션을 생성합니다)
(parted) quit
Information: You may need to update /etc/fstab.
$ (shell로 돌아옵니다)
$ sudo mkfs.vfat -F 32 /dev/sdb1 (fat32형식으로 위에서 생성한 efi파티션을 포멧해줍니다)
$ sudo mkfs.ext4 /dev/sdb2 (ext4형식으로 루트 디렉토리 파티션을 포멧합니다)
$ sudo mkdir /target_efi (소스디스크의 내용 복사를 위해 target_efi이라는 디렉토리를 임시로 루트에 만듭니다)
$ sudo mkdir /target_root (소스디스크의 내용 복사를 위해 target_root이라는 디렉토리를 임시로 루트에 만듭니다)
$ sudo mount /dev/sdb1 /target_efi (새로 만든 디렉토리에 새 디스크의 EFI파티션을 마운트합니다)
$ sudo cp -arp /boot/efi/* /target_efi (/boot/efi에 마운트된 기존 EFI파티션 파일들을 새 디스크의 EFI파티션으로 복사합니다)
$ sudo umount /dev/sdb1(복사완료된 새 디스크의 EFI파티션을 마운트 해제합니다)
$ sudo mount /dev/sdb2 /target_root
$ sudo cp -arpx / /target_root (/에 마운트된 기존 루트파티션 파일들을 새 디스크의 루트파티션으로 복사합니다)
$ sudo umount /dev/sdb2 (복사완료된 새 디스크의 루트파티션을 마운트 해제합니다)
이것으로 복사 자체는 완료되었습니다. 마지막으로 /etc/fstab에 새 디스크의 uuid 정보를 얻어 /dev/sdb1 등이 아닌 파티션의
고유id를 직접 지정합니다. 이것을 하는 이유는 혹여나 디스크 순서 등이 바뀌어도 부팅이 안되는 최악의 사태를 면하기 위함입니다.
$ sudo blkid /dev/sdb1 /dev/sdb2
/dev/sdb1: UUID="A676-006D" TYPE="vfat" (새로운 디스크의 EFI 파티션의 UUID코드는 하이픈을 제외하고 8자리입니다)
/dev/sdb2: UUID="a04bbe98-7ea7-4d55-8da6-f787a3441c3a" TYPE="ext4" (마찬가지로 ext4는 좀 길게 되어있습니다)
위의 각각의 UUID값을 새 디스크의 /etc/fstab에 복사하여 수정합니다. 위치는 /target_root/etc/fstab 파일을 수정합니다.
$ sudo vi /target_root/etc/fstab
(파일내용 블라블라블라...생략)
# /boot/efi was on /dev/sda1 during installation
UUID=A676-006D /boot/efi vfat noatime,nodiratime,discard,defaults 0 1
# / was on /dev/sda2 during installation
UUID=a04bbe98-7ea7-4d55-8da6-f787a3441c3a / ext4 noatime,nodiratime,discard,errors=remount-ro 0 1
(파일내용 블라블라블라...생략)
뒷쪽의 파티션의 옵션이 약간 다른 이유는 SSD용으로 변경 된 옵션이기 문입니다. 만약 HDD to HDD일 경우 특별히 옵션을
$ sudo blkid /dev/sdb1 /dev/sdb2
/dev/sdb1: UUID="A676-006D" TYPE="vfat" (새로운 디스크의 EFI 파티션의 UUID코드는 하이픈을 제외하고 8자리입니다)
/dev/sdb2: UUID="a04bbe98-7ea7-4d55-8da6-f787a3441c3a" TYPE="ext4" (마찬가지로 ext4는 좀 길게 되어있습니다)
위의 각각의 UUID값을 새 디스크의 /etc/fstab에 복사하여 수정합니다. 위치는 /target_root/etc/fstab 파일을 수정합니다.
$ sudo vi /target_root/etc/fstab
(파일내용 블라블라블라...생략)
# /boot/efi was on /dev/sda1 during installation
UUID=A676-006D /boot/efi vfat noatime,nodiratime,discard,defaults 0 1
# / was on /dev/sda2 during installation
UUID=a04bbe98-7ea7-4d55-8da6-f787a3441c3a / ext4 noatime,nodiratime,discard,errors=remount-ro 0 1
(파일내용 블라블라블라...생략)
뒷쪽의 파티션의 옵션이 약간 다른 이유는 SSD용으로 변경 된 옵션이기 문입니다. 만약 HDD to HDD일 경우 특별히 옵션을
변경할 필요는 없습니다.
마지막으로 grub에 등록해줍니다.
$ sudo modprobe efivars
$ sudo update-grub2
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.2.0-60-generic
Found initrd image: /boot/initrd.img-3.2.0-60-generic
Found linux image: /boot/vmlinuz-3.2.0-23-generic
Found initrd image: /boot/initrd.img-3.2.0-23-generic
Found memtest86+ image: /boot/memtest86+.bin
Found Ubuntu 12.04.4 LTS (12.04) on /dev/sdb2 (이게 잡히면 정상힙니다)
Adding boot menu entry for EFI firmware configuration
done
만들면서 느끼는 것이지만, 이렇게 메뉴얼 방법(?)으로 복사하느니 좀 편하게 할 수 있는 툴이 있었으면 좋겠습니다..
그냥 새로 설치하는 게 낫지 않나 싶지만, 기존 환경을 유지하고 싶을 때는 복사하자니 에러 뜨고 참 답답했지요.
잘못된 점 지적 또는 더 나은 방법 코멘트 바랍니다.
감사합니다.
마지막으로 grub에 등록해줍니다.
$ sudo modprobe efivars
$ sudo efibootmgr -c --disk /dev/sdb --part 1
$ sudo update-grub2
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.2.0-60-generic
Found initrd image: /boot/initrd.img-3.2.0-60-generic
Found linux image: /boot/vmlinuz-3.2.0-23-generic
Found initrd image: /boot/initrd.img-3.2.0-23-generic
Found memtest86+ image: /boot/memtest86+.bin
Found Ubuntu 12.04.4 LTS (12.04) on /dev/sdb2 (이게 잡히면 정상힙니다)
Adding boot menu entry for EFI firmware configuration
done
만들면서 느끼는 것이지만, 이렇게 메뉴얼 방법(?)으로 복사하느니 좀 편하게 할 수 있는 툴이 있었으면 좋겠습니다..
그냥 새로 설치하는 게 낫지 않나 싶지만, 기존 환경을 유지하고 싶을 때는 복사하자니 에러 뜨고 참 답답했지요.
잘못된 점 지적 또는 더 나은 방법 코멘트 바랍니다.
감사합니다.
|