dd가 출력 장치에서 읽는 이유는 무엇입니까?

dd가 출력 장치에서 읽는 이유는 무엇입니까?

CentOS 7 x86_64 DVD 이미지를 USB 드라이브(sdb)에 복사할 ddiostat.

주로 USB 드라이브에 쓰는 작업이 계속 번갈아 가며 진행됩니다.

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              18,00       380,00        28,00        380         28
sdb              79,00        16,00      9000,00         16       9000

그리고 하드 드라이브와 USB 드라이브 모두에서 읽습니다.

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              53,00      5180,00         0,00       5180          0
sdb            1329,00      5316,00         0,00       5316          0

머신에서는 아무 일도 일어나지 않으며 dd중지되면 디스크가 사용 가능해집니다.

이것은 일종의 내부 체크섬 프로세스입니까 dd?

Linux 3.16.0의 USB 드라이브 드라이버에 고유한 기능이 있습니까?

답변1

외부(USB 2.0) 하드 드라이브를 안전하게 지울 때도 비슷한 상황이 발생했습니다. 100% 쓰기를 예상했는데 긴 읽기와 몇 초의 높은 처리량 쓰기가 뒤따랐습니다. 전체 쓰기 속도를 표시하기 위해 pv를 사용했으며(아래 명령 참조) 평균 쓰기 속도는 10MB/s였으며 14MB/s의 버스트는 약 10초 동안 지속된 다음 몇 kB/s로 지속되었습니다. 내 iostat 출력은 귀하의 출력과 매우 유사합니다.

알고보니 내 문제였어dd 블록 크기가 너무 작습니다.(512바이트). 내가 의심하는 것은 커널이 블록당 1k의 버퍼로 블록을 읽어서 dd가 한 번에 512바이트를 덮어쓴 다음 플러시할 수 있다는 것입니다. 저는 커널 전문가가 아니기 때문에 이것은 단지 추측일 뿐입니다.

나는 그렇게 말할 수 있다dd 블록 크기를 72K로 늘리면 큰 차이가 발생합니다.. 현재 지속 쓰기 속도가 40MB/s를 초과하는 것으로 나타났습니다. 이는 USB 2.0이 제공할 수 있는 이론적 최대치(480Kb/s, USB 오버헤드 제외)에 매우 가깝고, 이 10년 된 디스크가 달성할 수 있는 최대 지속 쓰기 속도(약 55MB/s)에도 매우 가깝습니다. 나는 그 속도가 거의 베어 메탈 속도에 매우 만족합니다.

다음은 드라이브를 지우는 데 사용하는 명령입니다.

openssl enc -aes-256-ctr -pass \
pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" \
-nosalt </dev/zero \
| pv -bartpes 160041885696 -B 128K \
| dd bs=72K count=2170707 of=/dev/sdf iflag=fullblock

1-3행은 /dev/urandom에서 생성된 비밀번호를 사용하여 AES-256-CTR을 통해 /dev/zero를 암호화합니다. 따라서 그것은 암호화된 무작위 쓰레기 스트림입니다.

4행에서는 160GB 드라이브의 바이트를 고려하고 128KiB 전송 버퍼 크기의 pv를 사용하여 진행 상황을 보여줍니다.

5행에서는 계산기를 사용하여 선택한 블록 크기를 사용하여 드라이브의 총 바이트 수의 일부인 512의 최대 배수를 찾으려고 합니다. iflag=fullblock을 사용하면 쓰기 전에 1개의 전체 블록이 있을 때까지 dd가 해당 버퍼를 반복해서 읽게 됩니다.

관련 정보