CentOS 7 x86_64 DVD 이미지를 USB 드라이브(sdb)에 복사할 dd
때 iostat
.
주로 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가 해당 버퍼를 반복해서 읽게 됩니다.