dd를 일시 중지하고 대상을 더 큰 디스크로 교체한 다음 계속할 수 있습니까?

dd를 일시 중지하고 대상을 더 큰 디스크로 교체한 다음 계속할 수 있습니까?

드라이브를 파일에 복사하고 있었지만 차지하는 공간을 과소평가했습니다. 그래서 대상 드라이브에 충분한 공간이 없고 프로세스를 중단하고 싶지 않습니다(오랜 시간 동안 손상된 드라이브에서 실행되었습니다).

물론 CTRL-Z를 사용하여 dd를 일시 중지할 수 있으며 대상 드라이브를 더 큰 드라이브로 교체하고 파일을 더 큰 드라이브에 복사한 다음 dd를 다시 시작하고 싶습니다. 이를 달성하는 방법에 대한 아이디어가 있습니까?

dd if=/dev/sdc conv=sync,noerror bs=64M | gzip -c -9 > /media/extD/drive.img.gz

편집: ddrescue가 사용하기 더 좋은 도구라고 언급한 사람들의 말이 맞습니다. 그러나 어떤 이유에서인지 ddrescue는 계속해서 토하고 오류를 발생시켰고, dd는 아무런 불평 없이 쭉 버텼습니다.

답변1

가능하지만 조금 고통스럽습니다.

첫째, dd전송되면 복사본의 현재 위치(복사된 바이트)를 인쇄한다는 것을 알고 있습니다.USR1신호. 그래서 찾았다PIDof dd, or ps또는 pidof유사한 것을 사용하여 or pgrep(notPOSIX모든 unix-y 시스템 IIRC에서는 작동하지 않습니다.

ps나에게 도움이 된 명령( , in 도 사용 awk)데비안환경):

ps aux|awk '/dd/ {print $2}'|grep -v awk

grep -v awk예방하기 위해 필요하다PIDawk또한 인쇄에서.

가지다PIDdd, 보내세요USR1신호:

kill -USR1 [pid of dd]

실행 중인 콘솔 창은 dd복사한 바이트 수를 인쇄합니다. 이제 dd실제로 사람을 죽일 수 있습니다(ctrl+c kill -9등). dd이런 식으로 종료되면 중단된 진행 상황이 보고되는지 기억이 나지 않습니다.POSIX, 그러니 보내세요USR1먼저 신호를 보내세요.

dd중지한 이후 더 많은 바이트가 복사되었을 수 있으므로 다음을 실행하십시오.

head -c [number of bytes reported copied from dd] > \
     /path/to/drive/you/are/moving/to/filename.bin

잘린 복사본을 대상 디스크에 배치합니다. 복사가 재개될 때 전송 속도를 높이기 위해 정확한 바이트 수 대신 원하는 블록 크기로 균등하게 나눌 수 있는 값을 선택할 수 있습니다. 선택한 내용을 기록해 두고 이미지를 확대하지 말고 자르기만 하세요.

새 드라이브에 복사한 후 다음을 실행합니다.

dd if=/dev/sdc bs=64M skip=[truncated size divided by block size, e.g. 64000000] \
   of=/path/to/part2

더 작은 원본 디스크에 이미지의 나머지 부분을 저장할 공간이 있는 경우 새 디스크에 복사된 요약되지 않은 이미지를 삭제합니다.1 부공간을 확보하고 dd해당 디스크에 출력하십시오. 전송이 완료되면 실행할 수 있습니다.

cat /path/to/part2 >> /path/to/part1

...을 더한2 부끝까지1 부, 완전한 디스크 이미지를 만드세요! 최소한 충분한 여유 디스크 공간이 필요합니다.1 부두 번째 섹션에 있는 모든 콘텐츠는 해당 위치에 추가됩니다.

전체 전송을 수행해도 괜찮다면 cat /dev/sdc | gzip -c - > /path/to/imagefile.img.gzgzip 압축 아카이브를 생성하겠습니다. 이것은 다음과 같은 것을 사용하여 하드 드라이브 파티션에 기록될 수 있습니다 zcat /path/to/imagefile.img.gz > /dev/sdX.

[내 의견에서 답변으로 복사]

또한 of=가 지정되지 않은 경우 dd가 stdout에 기록한다고 생각했습니다(기억이 나지 않습니다). 이것이 사실이라면 파트 2를 별도의 파일에 작성하는 것을 건너뛰고 다음을 사용할 수 있습니다.

dd bs=64M skip=[skip-block-count] if=/dev/sdc >> /path/to/part1

dd_rescue@MatijaNalis는 OR ddrescue(동일한 작업을 수행하는 두 개의 다른 프로그램)를 사용하여 디스크 이미지를 복사할 것을 올바르게 제안했습니다 . 파티션/드라이브에 불량 섹터가 있거나 기타 하드웨어 오류가 있는 경우 이 작업을 수행합니다.

답변2

파일을 다른 드라이브로 이동한 후에는 프로세스를 일시 중지하고 다시 시작할 수 없습니다. 하지만 꼭 이렇게 할 필요는 없습니다. 프로세스를 종료하고 dd파일 전송을 수행한 다음 나머지 데이터에 대해 새 복사 프로세스를 시작하면 됩니다.

첫 번째 부분이 중지되는 위치를 확인하려면 를 실행하세요 gzip -l /media/extD/drive.img.gz. "압축되지 않은" 숫자는 복사된 바이트 수와 새 복사 프로세스를 시작해야 하는 오프셋입니다.

나머지 데이터를 복사하려면 dd오프셋에 시작 위치를 지정하세요.NNNN.

dd if=/dev/sdc 전환=동기, 오류 없음, iflag=skip_bytes, 건너뛰기=NNNNbs=64M |
gzip -c -9 >> /media/extE/drive.img.gz

dd복사 데이터를 사용하지 않는 것이 좋습니다 . 일반적인 통념과는 달리, 디스크에 액세스하는 데에는 마법이 없습니다 . 게다가 dd마법이 전부입니다 ./dev/sdcdd데이터가 자동으로 손실될 수 있습니다.— 플래그를 사용하면 conv=sync,noerror일부 데이터가 0으로 바뀌어 성공적으로 복사된 모든 데이터가 올바른 위치에 있게 되지만 이에 대한 위험은 사용자 본인이 감수해야 한다고 생각합니다.

작업 디스크에서 디스크 이미지를 복사하려면 cp또는 를 사용하면 됩니다 cat. 부품을 복사하려면 tail -c +$((start_offset+1)) | head -c $bytes_to_copy.

고장난 디스크에서 데이터를 복구하려면 다음을 사용하십시오.구조하다. Ddrescue는 읽을 수 없는 데이터를 건너뛰고 성공적으로 읽은 데이터를 추적할 수 있을 만큼 똑똑합니다. 실패한 하드 드라이브의 경우 여러 번 통과할 수 있으며, 드라이브를 잠시 쉬게 한 후 다시 시도하면 첫 번째 시도에서 일부 섹터를 읽을 수 없더라도 전체 하드 드라이브를 복구할 수 있는 경우가 많습니다.

ddrescue는 기존 부분 복사본을 사용하여 완료할 수 있습니다.하지만 압축하지 않은 상태로 유지해야 합니다.

1 실제로 ptrace디버거를 사용하여 프로세스에 연결하고, 일시 중지하고, 새 파일을 가리키도록 내부 데이터 구조를 업데이트한 다음 재개할 수 있습니다. 하지만 이를 수행하는 방법에 익숙하더라도 이는 단순한 추가 기능 솔루션보다 더 복잡합니다.

관련 정보