입/출력 오류가 발생하면 dd는 무엇을 쓰나요?

입/출력 오류가 발생하면 dd는 무엇을 쓰나요?

드라이브가 곧 실패할 예정이어서(C5 및 C6이 트리거됨) 아직 할 수 있을 때 또 다른 백업을 수행하기로 결정했습니다. 이를 위해 동일한 모델의 다른 드라이브에 dd를 사용합니다. 예상대로 입력/출력 오류가 발생했으며 오류가 발생하면 dd가 수행하는 작업을 알고 싶습니다. 아무 것도 쓰지 않고 해당 섹터를 건너뛰나요? 아니면 대상 드라이브의 이전 데이터를 0으로 대체합니까?

또한 64K 블록을 사용하고 있으므로 복사가 더 많은 데이터를 가져오지 못하는 경우 더 작은 블록 크기로 dd를 실행할 수 있습니까?

답변1

댓글에서 언급했듯이,암소 비슷한 일종의 영양ddrescue이 사용 사례에 더 나은 도구입니다. 어쨌든, 귀하의 명백한 질문에 답변해 드리겠습니다 dd.

dd오류가 발생하면 어떻게 해야 하는지 알고 싶습니다.

주어지지 않으면 종료되어 conv=noerror도구가 무시하게 됩니다.입력하다실수. 가정이 noerror주어졌고 인쇄상 오류가 발생했습니다. 그 다음에

아무 것도 쓰지 않고 해당 섹터를 건너뛰나요? 아니면 대상 드라이브의 이전 데이터를 0으로 대체합니까?

그것은 당신이 그것을 사용했는지 여부에 따라 달라집니다 conv=sync. 이렇게 하면 dd각 입력 블록이 채워지고 ibs=null 바이트가 추가됩니다. 나추측하다소스 블록 장치의 섹터 크기 와 ibs같으면 읽기 오류가 발생할 경우 출력 스트림이 입력과 동기화된 상태로 유지됩니다. 그러나 잘못된 경우 ibs읽기 오류로 인해 스트림이 비동기화될 가능성이 높습니다.이 훌륭한 답변. 도움이 될 것 같습니다 iflag=fullblock.

또한 읽기 오류가 없더라도 출력이 입력보다 클 수 있습니다. 이는 버퍼가 가득 차기 전에 sync마지막 블록이 EOF에 도달하는 경우 ibs발생할 수 있습니다 .

참고 noerror하고 sync있습니다POSIX 요구 사항, fullblock아니요.

dd복사본에서 더 많은 데이터를 가져오지 못한 경우 더 작은 블록 크기로 실행할 수 있습니까 ?

이론적으로는 그렇습니다. 하지만 이를 위해서는 위의 문제를 계속 처리하면서 skip=수동 으로 사용해야 합니다 . 새로운 블록 크기를 다시 계산 하고 그에 맞춰야 seek=한다는 점을 잊지 마세요 . 가능하지만 곧 프로세스를 자동화하고 싶을 것입니다.skipseek


이제 ddrescue이러한 모든 문제를 GNU 기본 동작과 비교해 보세요.

  • 읽기 오류는 건너뛰고 나중에 "의심스러운" 세그먼트로 돌아가서 점점 더 작은 청크로 읽으려고 시도합니다.
  • 무슨 일이 있어도 적절한 오프셋을 유지합니다.

관련 정보