드라이브를 파일에 복사하고 있었지만 차지하는 공간을 과소평가했습니다. 그래서 대상 드라이브에 충분한 공간이 없고 프로세스를 중단하고 싶지 않습니다(오랜 시간 동안 손상된 드라이브에서 실행되었습니다).
물론 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
또한 인쇄에서.
가지다PID네 dd
, 보내세요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.gz
gzip 압축 아카이브를 생성하겠습니다. 이것은 다음과 같은 것을 사용하여 하드 드라이브 파티션에 기록될 수 있습니다 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/sdc
dd
데이터가 자동으로 손실될 수 있습니다.— 플래그를 사용하면 conv=sync,noerror
일부 데이터가 0으로 바뀌어 성공적으로 복사된 모든 데이터가 올바른 위치에 있게 되지만 이에 대한 위험은 사용자 본인이 감수해야 한다고 생각합니다.
작업 디스크에서 디스크 이미지를 복사하려면 cp
또는 를 사용하면 됩니다 cat
. 부품을 복사하려면 tail -c +$((start_offset+1)) | head -c $bytes_to_copy
.
고장난 디스크에서 데이터를 복구하려면 다음을 사용하십시오.구조하다. Ddrescue는 읽을 수 없는 데이터를 건너뛰고 성공적으로 읽은 데이터를 추적할 수 있을 만큼 똑똑합니다. 실패한 하드 드라이브의 경우 여러 번 통과할 수 있으며, 드라이브를 잠시 쉬게 한 후 다시 시도하면 첫 번째 시도에서 일부 섹터를 읽을 수 없더라도 전체 하드 드라이브를 복구할 수 있는 경우가 많습니다.
ddrescue는 기존 부분 복사본을 사용하여 완료할 수 있습니다.하지만 압축하지 않은 상태로 유지해야 합니다.
1 실제로 ptrace
디버거를 사용하여 프로세스에 연결하고, 일시 중지하고, 새 파일을 가리키도록 내부 데이터 구조를 업데이트한 다음 재개할 수 있습니다. 하지만 이를 수행하는 방법에 익숙하더라도 이는 단순한 추가 기능 솔루션보다 더 복잡합니다.