dd
저는 Linux에서 외부 USB 하드 드라이브를 덮어쓰기 위해 이 프로그램을 사용해 왔습니다 .
기본 블록 크기인 512바이트를 사용할 때 다음 명령을 사용합니다.
# dd if=/dev/zero of=/dev/sdb
작업 전반에 걸쳐 하드 드라이브(/dev/sdb)는 한 번에 약 1GB씩 교대로 읽고 씁니다. 그것은 read 1GB
......... 등등입니다. 하드 드라이브에 기록된 만큼의 데이터가 하드 드라이브에서 읽혀집니다 write 1GB
.read 1GB
write 1GB
나는 이것이 디스크 I/O 활동에 대한 100% 신뢰할 수 있는 지표인 내 사용자 정의 Conky 패널( diskio_read
, ) 에 표시되기 때문에 이런 일이 발생한다는 것을 알고 있습니다 .diskio_write
다른 외장 하드 드라이브를 사용하는 다른 컴퓨터에서 이 작업을 반복했습니다. 이는 USB 2.0 및 USB 3.0을 통해 발생합니다.
대신, 다음 명령을 사용하여 동일한 작업을 수행하지만 1MB의 블록 크기를 사용합니다.
# dd if=/dev/zero of=/dev/sdb bs=1M
처음에 약간의 읽기 횟수를 제외하면 작업 중에는 하드 드라이브를 전혀 읽지 않습니다.
표준 Linux 배포판(Xubuntu 14.04)을 사용하여 두 대의 다른 컴퓨터와 두 개의 다른 하드 드라이브에서 이런 일이 발생한다는 점을 고려하면 원하는 사람은 누구나 자신의 컴퓨터에서 이를 복제할 수 있어야 합니다.
누군가 여기서 무슨 일이 일어나고 있는지 설명해 줄 수 있습니까?
답변1
지정된 블록 크기(512바이트)가 디스크의 블록 크기(일반적으로 4096바이트이지만 현재는 더 많음)보다 작은 경우 블록이 부분적으로 기록되므로 쓰기 전에 블록의 나머지 내용을 보존해야 합니다.
디스크 블록은 512바이트만 쓸 수 없고, 전체 블록(4096 이상)을 한 번에 써야 하기 때문이다. 이(4096)개 이상의 숫자를 쓰면 부분 쓰기가 되지 않으므로 읽을 필요가 없습니다.
답변2
이는 기본적으로 Linux 시스템의 버퍼링된 I/O의 증상입니다. 이 명령과 관련된 좋은 개요는 dd
다음 위치에 있습니다.dd의 bs 매개변수에 가장 적합한 값을 결정하는 방법이 있습니까?이것은 ctrl-d의 답변을 지원합니다. 그러나 이는 또한 더 큰 블록 크기(즉, 1M보다 큼)가 성능을 더욱 향상시킬 수 있음을 시사합니다.