| 목적 | 방법 |
|---|---|
| 부팅 가능한 OS 디스크를 통째로 옮긴다 | dd · Clonezilla · partclone |
| 파일과 디렉터리만 옮긴다 | rsync · cp -a · tar 파이프 |
| 중단 없이 반복 동기화한다 | rsync |
디스크 전체 복제는 빈 블록까지 복사하므로 사용량이 적은 큰 디스크에서는 압도적으로 느리다. 파일만 필요하다면 파일 단위 복사가 거의 항상 빠르다.
원본은 마운트 해제된 상태여야 한다. 동작 중인 OS 디스크를 복제하려면 Live USB 로 부팅해 양쪽을 모두 마운트하지 않은 채 작업한다.
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,MODEL
dd if=/dev/sda of=/dev/sdb bs=4M conv=noerror,sync status=progress
if 와 of 를 바꿔 쓰면 원본이 그 자리에서 사라진다. 실행 전에 두 장치 이름을 다시 읽는다. bs 는 64K 이상이면 충분하고 보통 1M~4M 을 쓴다. 대상 디스크는 원본보다 작으면 안 된다.
복제 후 확인은 다음과 같다.
cmp /dev/sda /dev/sdb
빈 공간이 많은 디스크라면 dd 대신 사용 중인 블록만 복사하는 도구가 훨씬 낫다. Clonezilla 와 partclone 은 파일시스템을 이해해 쓰이지 않는 블록을 건너뛴다.
복제 후 두 디스크를 같은 시스템에 물리면 UUID 가 겹친다. /etc/fstab 과 부트로더가 어느 쪽을 잡을지 알 수 없게 되므로, 한쪽의 UUID 를 바꾸고 호스트명·네트워크 설정도 고친다.
blkid
xfs_admin -U generate /dev/sdb2
tune2fs -U random /dev/sdb2
rsync 가 기본 선택이다. 중단된 지점부터 다시 시작할 수 있고, 속성과 ACL 을 보존하며, 무엇이 얼마나 남았는지 볼 수 있다.
rsync -aAXH --info=progress2 /mnt/disk1/ /mnt/disk2/
| 옵션 | 뜻 |
|---|---|
-a |
재귀 · 권한 · 소유자 · 시각 · 심볼릭 링크 보존 |
-A |
ACL 보존 |
-X |
확장 속성 보존 |
-H |
하드 링크 관계 보존 |
--info=progress2 |
전체 진행률 표시 |
원본 경로 끝의 / 는 "이 디렉터리의 내용" 을 뜻한다. 붙이고 안 붙이고에 따라 결과 디렉터리 깊이가 달라진다.
작은 파일이 아주 많으면 rsync 의 파일별 오버헤드가 커진다. 이럴 때는 tar 파이프가 빠르다.
tar -C /mnt/disk1 -cf - . | tar -C /mnt/disk2 -xf -
진행률이 필요하면 가운데에 pv 를 끼운다.
tar -C /mnt/disk1 -cf - . | pv | tar -C /mnt/disk2 -xf -
원본과 대상이 같은 물리 디스크면 헤드가 왔다 갔다 하며 느려진다. 서로 다른 장치로 나눈다. 네트워크를 건너는 복사라면 압축 여부(rsync -z) 와 암호화 오버헤드가 병목일 수 있으므로, 내부망에서는 rsync --rsh 대신 rsync 데몬 모드나 nc 파이프가 빠른 경우가 있다. 진행 중에는 iostat -x 1 로 어느 쪽이 포화됐는지 본다.