전체 파티션 또는 하드 드라이브를 스파 스 파일로 복제


35

전체 파티션 또는 전체 하드 드라이브를 더 큰 외부 디스크에 복제하지만 스파 스 파일을 만드는 것을 좋아합니다. dd복제에 자주 사용 하지만 스파 스 파일은 지원하지 않습니다. 해결 방법으로 다음과 같은 것을 사용했습니다.

cp --sparse=always <(dd if=/dev/sda1 bs=8M) /mount/external/backup/sda1.raw

그러나 이것은 내 취향에 너무 까다 롭고 중단 된 경우 프로세스를 다시 시작할 수 없습니다. 이것에 대한 NTFS 도구가 ntfsclone있지만 ( ), Linux의 기본 파일 시스템 (EXT2-4)에는 해당 도구가 없습니다.

dd스파 스를 지원 하는 변형과 같은 더 좋은 도구가 있습니까? 디스크 백업을위한 일부 독점 소프트웨어를 찾지 않고 필요한 경우 루프 장치로 마운트 할 수있는 희소 복제본을 만들려고합니다.


7
의 크리에이티브 사용을 위해 +1을 사용 cp하면 디스크 이미지를 스파 스 복사 할 수 없었습니다. 공간을 절약해야 할 경우 항상 압축했습니다. 왜 질문에 답이 아닌가?
Caleb

답변:


21

당신은 원합니다 dd_rescue.

dd_rescue -a -b 8M /dev/sda1 /mount/external/backup/sda1.raw

1
큰! 매뉴얼에 "복사 프로세스가 사용자에 의해 중단되면 나중에 어느 위치에서나 계속할 수 있습니다"라고 말합니다. "-spArse 파일 쓰기 (기본값 = no)". 정확히 내가 원하는 것! 감사!
Martin Scharrer

3
dd_rescue온라인을 찾고 나는 ddrescue독립적으로 개발 dd_rescue되었지만 기본적으로 동일한 것으로 보이는 ( 밑줄없이) 라는 다른 도구가 있음을 알았습니다 . 나는 여기에 일반적인 참고로 언급합니다.
Martin Scharrer

그래, dd_rescueddrescue같은 것이 아니다. 이론적으로 그들은 같은 일을하지만 일반적으로 나는 나이든 / 원래와 더 나은 행운을 얻었습니다 dd_rescue.
Steven Pritchard

1
궁금한 점이 있으면 언제든지 Ctrl-C를 사용하여 복사를 중지 할 수 있습니다. 현재 위치가 표시되며 해당 값을 사용 -s하여 원래 명령에 위치를 추가하여 다시 시작할 수 있습니다 . (그래서처럼 보일 것 dd_rescue -a -b 8M -s 42000k /dev/sda1 /mount/external/backup/sda1.raw입니다.)
Steven Pritchard

1
@Steven Pritchard : 위치를 기억할 필요가 없습니다. 로그 파일이 될 세 번째 파일 이름을 지정하고 다시 시작할 때 해당 파일을 읽고 중단 된 부분을 선택합니다.
Tanith Rosenbaum

20

완전성을 위해 ddrescue를 요구 합니다. --sparse또는 -S플래그는 대상이 드문 드문 기록 될 수 있습니다 :

$ ddrescue -S -b8M /dev/sda1 /mount/external/backup/sda1.raw

또는 긴 옵션으로 :

$ ddrescue --sparse --block-size 8M /dev/sda1 /mount/external/backup/sda1.raw

또는 MiB 를 선호하는 경우 :

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw

복구를 중단하고 재개 할 수 있도록 로그 파일을 사용할 수도 있습니다.

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw ~/sda1.rescue.log

그 GNU를 참고 ddrescue하고 dd_rescue다른 프로그램입니다. 그러나 GNU ddrescue가 더 널리 퍼져있는 것 같습니다. 예를 들어 GRML 과 함께 이미 패키지되어 있습니다.


복원 할 때 이미지에 특별한 처리가 필요합니까, 드레 드레스를 복원하는 데 사용되는 명령을 제공 할 수 있습니까?
user12439

이론적으로는 복구에 사용하는 저장 매체가보다 안정적이므로 일반적으로 dd를 사용하여 교체 디스크에 쓸 수 dd if=sda1.raw of=/dev/sdb1있습니다. 그러나 복원에 ddrescue를 사용하려면 복구에 사용한 소스 / 대상을 새 로그 파일을 사용하여 새 소스 / 대상으로 변경하면됩니다. 가능하면 (종종 그렇지 않은 경우) ddrescue를 사용 하여 불량 소스 디스크에서 교체 디스크로 직접 데이터를 복사 할 수 있습니다 .
zaTricky

3

거기에 있었다 제공하는 패치 GNU는 DD 형식의 스파 스 파일 지원을 제공하기 위해 2007 년에는하지만 (8.4 기준으로 적어도되지 않음)로 coreutils에 그것을하지 않았 보인다. 그 이후로 dd가 너무 많이 변경되었다고 의심됩니다. 패치가 많은 작업없이 현재 버전에 적용될 수 있습니다.

나는 또한 cp귀하의 질문에 창조적 인 사용에 깊은 감명을 받았으며 , 재개를 수행하는 데 사용했습니다 (여기서 ~ 80M에서 소스로 재개).

cp --sparse=always \
  <(dd if=/dev/sda1 bs=8M skip=10) /dev/stdout \
  | dd bs=8M seek=10 of=/mount/external/backup/sda1.raw

편집 : 긁습니다. 두 번째 dd는 물론 출력 파일에서 길이가 다르기 때문에 출력 파일에서 잘못된 위치를 찾는 것입니다.


1
bhinesley의 답변과 마찬가지로 정확한 재개를 위해 dd의 진행 상황을 기록하는 것이 가장 좋습니다. 첫 번째 실행과 이력서 모두 에이 접근 방식을 사용하고 두 병렬 dd를 독립적으로 기록하면 출력에서 ​​얼마나 멀리 탐색 해야하는지 알 수 있습니다. 시간이 있으면 이것을 해결하려고 노력할 것입니다.
Eli Heady

2
패치 링크를 주셔서 감사합니다. 나는 스스로 비슷한 프로그래밍을 생각하기 시작했다 :-) 스파 스 파일은 들여다 볼 수 없으므로 코드가 작동하지 않습니다.
Martin Scharrer

네, 방금 저 자신을 발견했습니다. 음, 미친 새로운 용도를 찾는 것이 재미있었습니다 cp. 감사합니다!
Eli Heady

1
dd 커밋 2012 : git.savannah.gnu.org/cgit/coreutils.git/commit/… "dd : conv = sparse 옵션에 대한 지원 추가"( "(iwrite) : NUL 블록 쓰기를 찾기로 변환 요청 된 경우. ")
osgx

1

내 2 센트 만 추가하면됩니다. 원시 디스크에서 스파 스 파일을 만드는 또 다른 방법은 qemu-img를 사용하여 다음과 같은 방법을 사용하는 것입니다.

qemu-img convert -f raw /dev/sda /tmp/sda.raw

단일 파티션에서도 사용할 수 있습니다. 또한 원시 디스크 / 파티션을 qemu-img가 지원하는 다른 형식 (QCOW2, VHD [x], vmdk 등)으로 변환 할 수 있습니다.


1

또 다른 옵션은 rsync 입니다. 예를 들면 다음과 같습니다.

rsync -SP --copy-devices /dev/sda1 /mount/external/backup/sda1.raw

설명:

  • -S--sparse쓰기시 스파 스 블록을 건너 뛰려면 /
  • -P/ --partial --progress진행 상황을 표시하고 부분적으로 전송 된 파일을 유지
  • --copy-devices 장치 내용을 복사

--append중단 된 복사본을 재개하거나 --append-verify새 데이터와 기존 데이터 일치에 대한 체크섬을 확인하기 위해 추가 할 수 있습니다 .

편집 : 방금 copy-devices.diff 가 고려 중이며 많은 시스템에 존재하지 않을 수 있음을 깨달았습니다 ( Fedora , Ubuntu , Debian 및 기타 시스템에 포함되어 있음 ).


0

참고 : 이것은 의견에 설명 된 이유로 작동하지 않으므로 참조를 위해 여기에 남겨 둡니다.

kill -USR1을 사용하여 dd 통계를 모니터하십시오.

$ cp --sparse=always <(dd if=/dev/urandom bs=8M) \
    /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

skip / seek를 사용하여 다시 시작하십시오.

$ i_bytes= # get from the last dd statistic
$ o_bytes=`du -b /mount/external/backup/sda1.raw | cut -f 1`   
$ cp --sparse=always <(dd if=/dev/urandom bs=8M skip=$i_bytes \
    seek=$o_bytes) /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

$ i_bytes가 없으면 다시 시작하기가 더 어려워집니다. 머신이 충돌하는 경우 등을 대비하여 dd 통계를 파일에 기록하는 것이 가장 쉬운 방법 일 것입니다.


두 번째 cp는 기존 파일을 덮어 쓰지 않습니까? 의 skip및 기타 옵션을 알고 있습니다 dd. 문제는 cp부분입니다.
Martin Scharrer

흠, 맞아.
bhinesley


0

왜 간단하게 :

cp --sparse=always /dev/sda1 /mount/external/backup/sda1.raw
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.