dd
수리한 하드 드라이브를 복제 하려고 합니다 . dd
드라이브에서 10GB 청크로 데이터를 복사 하려고 했지만 드라이브에 포함되어야 하는 것보다 더 많은 데이터가 전송되었습니다. 드라이브 자체가 작동하고 파티션을 마운트할 수 있습니다.
이것을 사용하여 df -h
1000204886016바이트(1TB 드라이브)의 드라이브 크기를 얻었습니다.
나는 처음에 다음을 시도했습니다.
sudo dd if=/dev/sdb of=/dev/sdd status=progress
하지만 300GB 정도 지나면 속도가 느려지더니 결국 읽기 오류로 실패했다. 10GB 청크로 복제해보기로 결정했습니다. 10GB의 128kByte 블록 크기를 읽으려면 78125 블록을 복사해야 한다고 계산했습니다.
이를 위해 다음을 사용하고 있습니다.
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=n
dd
전송당 10240000000바이트를 보고합니다. 각 반복에 대한 조회 값을 계산하기 위해 전송된 바이트를 집계하고 1GB를 빼서 일부 중복이 있는지 확인했습니다. 결과 시퀀스는 다음과 같습니다.
seek=0
seek=9240000000
seek=18480000000
seek=27720000000
seek=36960000000
...
seek=1071840000000
개별 dd 명령을 사용하여 쉘 스크립트에 작성하고 실행했습니다. 필요한 데이터를 복사하기 위해 마지막 반복을 무료로 두었습니다.
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=0
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=9240000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=18480000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=27720000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=36960000000
...
sudo dd if=/dev/sdb of=/dev/sdd bs=128k status=progress oflag=seek_bytes seek=1071840000000
마지막 반복에서는 드라이브 종료를 훨씬 넘어야 했지만 계속 진행되었습니다. 복제본이 설치되었지만 분명히 손상되었으며 데이터가 누락되었습니다.
- 내 수학이나 내가 사용하는 인수에 문제가 있나요
dd
? - 10GB 청크로 데이터를 가져오기 위해 "dd" 명령을 작성하는 더 좋은 방법이 있습니까?
답변1
문제는 seek
실제로는 블록 수를 사용하는데 바이트 값을 사용한다고 가정한다는 것입니다. seek=0
, 등을 사용해야 합니다 78125
.156250
그러나 다음을 제거하여 단순화할 수 있습니다 dd
.
split -b 10G < /dev/sdd
답변2
답변3
내 솔루션이 실패한 이유는 검색 플래그의 기능을 오해했기 때문이라는 것을 알았습니다. 출력 드라이브의 쓰기 위치만 이동합니다. 따라서 스크립트는 처음 10GB를 출력에 계속해서 복사합니다. 장치 끝까지 도달하지 않습니다.
입력을 이동하려면 건너뛰기 플래그도 사용해야 합니다.
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress skip=n seek=n
oflag=seek_bytes
합계를 설정하면 iflag=skip_bytes
블록 대신 바이트 단위로 수학을 수행할 수 있습니다.
그러나 제공되는 옵션은로에마(ddrescue 사용) 및다른 사람( split -b 10G < /dev/sdd
)는 손상된 드라이브를 복구하고 분할된 전송을 별도로 수행하는 더 좋은 방법입니다.