여기에 Intenso 외장 1TB 2.5" HDD가 있습니다. 일종의 결함(Windows에서 무작위로 연결이 끊어지는 현상)이 발생했기 때문에 다음 명령을 실행하여 확인하기로 결정했습니다.
dd if=/dev/sdb of=/dev/null bs=4M status=progress
실행 시 출력은 다음과 같습니다.
715099471872 Bytes (715 GB, 666 GiB) kopiert, 16115 s, 44,4 MB/s
44.4MB/s는 USB3 디스크에 비해 너무 느리다는 사실 외에도 이상한 점은 시계가 12초마다 똑딱거린다는 것입니다. ("16115 s"는 dd 시계입니다.) 정상적인 디스크에서 동일한 명령을 실행하면 매초마다 틱합니다.
왜 그렇게 오랫동안 차단되는지 이해하려고 노력 중이지만 strace
메모리 매핑을 통해 디스크에서 읽는 것 같아서 아무것도 볼 수 없습니다.
디스크가 읽는 동안 단순히 12초 동안 차단하는 것도 불가능합니다. 속도가 44.4MB/s이므로 블록 크기는 4MB입니다. 따라서 dd는 매초 시계를 업데이트할 기회가 11번 있습니다.
그렇다면 여기서 정확히 무슨 일이 일어나고 있는 걸까요?
(디스크에 무슨 문제가 있는지 관심은 없지만 dd 시계가 왜 이렇게 느리게 가는지 궁금합니다. 그러니 SE Unix가 맞기를 바랍니다.)
답변1
dd
해당 디스플레이는 복사 작업 사이에만 업데이트될 수 있습니다. 실제로 GNU coreutils를 사용하면 dd.c
메인 while
루프가 다음과 같이 단순화된다는 것을 알 수 있습니다.
int dd_copy() {
// some setup
while(true) {
if(progress_reporting_enabled && minimum_time_passed) {
print_xfer_stats();
}
copy_a_block;
}
}
블록을 복사하는 데 반복당 12초가 걸린다면할 수 없다시각적 업데이트를 받으세요.
솔직히 dd
이것은 전혀 사용하고 싶은 프로그램이 아닙니다(많은 경우, 특히).
pv /dev/sdb > /dev/null
실제로 4MB 블록을 읽고 싶다면 더 이해하기 쉬울 것입니다(이유는 무엇입니까? 하드 드라이브에는 아마도 1024개의 B 블록이 있고 USB 전송은 훨씬 작으므로 더 큰 전송의 경우 속도가 매우 감소합니다).
pv -B 4M /dev/sdb > /dev/null
(디스크에 관심이 없다고 말씀하셨고 왜 dd
이런 일이 발생하는지에 대해 질문하셨지만, 미래의 독자들을 위해 하드 드라이브에 오류가 발생하고 있습니다 :)
하지만,더 높은 관점에서: 귀하는 손상된 하드 드라이브를 다루고 있습니다. 내용을 백업하는 경우를 제외하고는 가능한 한 적게 사용하는 것이 좋습니다.