리눅스 하드 디스크 복제 우분투 환경에서 dd 명령어 등일 사용하여 하드디스크 복사 방법에 대해 설명드립니다.
용량이 다른 디스크로 복사할 경우 추가적으로 sfdisk 명령어를 이용하여 파티션 테이블을 수정하는 방법에 대해서도 함께 설명드립니다.
Logical Volumn Manager 으로 구성된 디스크도 한번에 복사 할 수도 있습니다. LVM과 관련된 자세한 내용은 아래의 글을 참고해 주시기 바랍니다.
디스크 데이터가 유실될 가능성이 있습니다. 주의하여 실행해 주시기 바랍니다.
1. 디스크 용량이 동일할 경우
다음 이미지 처럼, 디스크 용량이 동일할 경우 입니다.

/dev/vdb 와 /dev/vdd 의 sector와 byte 용량을 확인하면 동일한 크기임을 알 수 있습니다. 디스크 용량이 정확하게 일치해야 합니다.
이 경우 다음 명령어로 간단하게 파티션 정보와 데이터등 바로 디스크를 복사 할 수 있습니다.
# dd if=/dev/vdb of=/dev/vdd status=progress
하드 디스크 외에도 파티션을 생성 한 뒤에 /dev/vdb1 과 /dev/vdd1 를 지정하면서 특정 파티션만 복사를 할 수도 있습니다.
2. 디스크 용량이 다를 경우(기본)
용량이 달라도 dd 명령어로 데이터를 복사하고, parted 명령어로 파티션을 조절하면 간편하게 작업이 가능합니다.
/dev/nvme0n1 디스크를 복사 대상인 원본 디스크라 가정하고, /dev/nvme1n1 디스크를 새롭게 저장할 디스크라 고 가정합니다.
# dd if=/dev/nvme0n1 of=/dev/nvme1n1 status=progress
먼저 위의 명령어로 디스크 볼륨을 복사하고, 아래의 명령어로 파티션 크기를 조절합니다.
# parted /dev/nvme1n1
GNU Parted 3.4
Using /dev/nvme1n1
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Warning: Not all of the space available to /dev/nvme1n1 appears to be used, you can fix the GPT to use all of the space (an extra 976752000 blocks) or continue with the current
setting?
Fix/Ignore? Fix
Model: WDS100T3X0C-00SJG0 (nvme)
Disk /dev/nvme1n1: 1000GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 538MB 537MB fat32 boot, esp
2 538MB 500GB 500GB ext4
(parted) q
# parted /dev/nvme1n1
GNU Parted 3.4
Using /dev/nvme1n1
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: WDS100T3X0C-00SJG0 (nvme)
Disk /dev/nvme1n1: 1000GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 538MB 537MB fat32 boot, esp
2 538MB 500GB 500GB ext4
(parted) resizepart 2 -1
(parted) p
Model: WDS100T3X0C-00SJG0 (nvme)
Disk /dev/nvme1n1: 1000GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 538MB 537MB fat32 boot, esp
2 538MB 1000GB 1000GB ext4
(parted) q
3. 디스크 용량이 다를 경우(고급)
위의 방법으로 진행하기 어려운 경우, 섹터단위로 복사하고 파티션 정보를 수정하여 적용할 수도 있습니다.
HDD 디스크를 /dev/vdb 라하고, 용량이 적은 SSD를 /dev/vdc라고 정의하여, HDD 디스크 보다 용량이 적은 SSD 으로 디스크를 복사하는 시나리오에 대해 설명드리도록 하겠습니다.
2-1. 환경
작업을 수행하기전 /dev/vdb 파티션 전체 크기를 /dev/vdc 용량보다 줄인 뒤에, /dev/vdc 으로 복사하도록 해야 합니다. 아래의 명령어로 디스크 정보를 확인합니다.
fdisk -l [디스크경로]

/dev/vdb 정보는 위와 같고, /dev/vdc 디스크 정보는 아래와 같습니다.

2-2. 데이터 복사
2개의 디스크 용량 차이가 나기 때문에, 전체 HDD sector 데이터를 SSD 으로 복사할 수 없습니다. 따라서 데이터가 존재하는 sector 만큼만 SSD으로 복사해야 합니다. 정확한 계산이 필요합니다.

이미지에서 보시면 /dev/vdb1 테이블의 sector가 2048 위치부터 시작하고, 마지막 /dev/vdb3 테이블이 13635583 까지입니다.
/dev/vdb1 이전의 sector도 모두 복사해야 하기 때문에 총 13635583 + 1인 13635584 개의 sector 를 복사해야 합니다.
sector의 기본크기는 512 Byte으로 디스크 복사는 아래의 명령어로 수행할 수 있습니다.
# dd if=/dev/vdb of=/dev/vdc bs=512 count=13635584 status=progress
복사의 속도를 높이기 위해서 위의 명령어를 아래와 같이 수정해서, 사용가능합니다.
bs : 512 * 8 = 4096, count : 13635584÷8 = 1704448
# dd if=/dev/vdb of=/dev/vdc bs=4096 count=1704448 status=progress
2-3. 파티션 테이블 수정
dd 명령어를 실행 할 경우, 기존 디스크의 파티션 테이블이 그대로 복사가됩니다.
전체 디스크 용량이 다르기 때문에 /dev/vdc 디스크에 맞게 파티션 테이블을 수정합니다.
먼저 아래의 명령어를 이용하여, /dev/vdb 파티션 테이블을 저장합니다.
# sfdisk -d /dev/vdb > part_table.txt

저장된 part_table.txt 내용을 확인하면 last-lba 라는 값이 있습니다. 이 값은 아래와 같이 계산되어집니다.
last-lba : (/dev/vdb의 20971520 sectors) – (first-lba, 34) = 20971486
따라서, /dev/vdc 디스크 정보에 맞게 수정하여 저장합니다.
수정후 last-lba : (/dev/vdc의 16777216 sectors) – (first-lba, 34) = 16777182

그리고 마지막으로 아래의 명령어를 실행하면, /dev/vdc 디스크에 파티션 정보가 적용되게 됩니다.
# sfdisk /dev/vdc < part_table.txt
기존 파티션 테이블 정보가 그대로 복사되었지만, sfdisk 명령어 실행후 디스크 및 파티션 정보가 /dev/vdc 환경에 맞게 적용되게 됩니다.

리눅스 하드 디스크 복제 관한 내용을 설명드렸습니다. sfdisk 와 관련된 보다 자세한 명령어는 아래의 페이지를 참고해 주시기 바랍니다.
( 본문 인용시 출처를 밝혀 주시면 감사하겠습니다.)