dd 입력 장치의 끝을지나 실행
dd
수리 한 하드 드라이브를 복제하는 데 사용하려고합니다 . dd
10GB 청크로 드라이브에서 복사 데이터 를 만들려고하는데 드라이브에 포함되어야하는 것보다 더 많은 데이터를 전송하고 있습니다. 드라이브 자체가 작동하고 파티션을 마운트 할 수 있습니다.
사용 df -h
하여 드라이브의 크기는 1000204886016 바이트 (1TB 드라이브)입니다.
나는 처음에 시도했다 :
sudo dd if=/dev/sdb of=/dev/sdd status=progress
그러나 약 300GB 후에 크롤링 속도가 느려지고 결국 읽기 오류로 인해 실패했습니다. 나는 그것을 10GB 청크로 복사하기로 결정했다. 128kByte 블록 크기로 10GB를 읽으려면 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'명령을 작성하는 더 좋은 방법이 있습니까?
답변
문제는 seek
실제로는 블록 카운트를 취할 때 바이트 값을 취 한다고 가정한다는 것 입니다. 당신이 사용되어야한다 seek=0
, 78125
, 156250
, 등
그러나 다음을 제거하면 많이 단순화 할 수 있습니다 dd
.
split -b 10G < /dev/sdd
dd를 사용하여 수리 한 하드 드라이브를 복제하려고합니다.
하지마.
ddrescue대신 사용하면 읽을 수없는 블록 및 기타 미디어 오류에 잘 대처할 수 있습니다.
내 솔루션이 실패한 이유는 탐색 플래그가 무엇을했는지 오해하는 것임을 발견했습니다. 출력 드라이브의 쓰기 위치 만 이동했습니다. 따라서 스크립트는 처음 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
계산은 블록이 아닌 바이트 단위로 수행됩니다.
그러나 roaima (ddrescue 사용)와 다른 사람 ( split -b 10G < /dev/sdd
)이 제공하는 옵션은 손상된 드라이브를 복구하고 각각 분할 된 전송을 수행하는 더 좋은 방법입니다.