간단한 예로 100MB 원시 블록 장치를 고려하십시오. 총 102760448 바이트에 대해 각각 512 바이트의 204800 블록입니다.
문제는 첫 98MB (200704 블록)를 이동하여 그 앞에 2MB (4096 블록)의 간격이 있도록하는 것입니다. 이 작업을 제대로 수행하려면 읽지 않은 섹터에 아무것도 쓰지 않아도됩니다. 이를 달성하는 한 가지 방법은 버퍼를 도입하는 것입니다.
$ dd if=/dev/sdj2 count=200704 | mbuffer -s 512 -b 4096 -P 100 | dd of=/dev/sdj2 seek=4096
기대는 즉 mbuffer
따라서 아무것도 읽고 작가가 상기 버퍼의 크기에 의해 리더 지연 것을되지 않은 영역에 기록되지 않도록 보장 라이터 것을 전달하기 전에 4096 개 개의 블록을 저장할 것이다. 버퍼는 리더와 라이터가 해당 구성 요소 내에서 가능한 한 빨리 작동 할 수 있도록해야합니다.
그러나 안정적으로 작동하지 않는 것 같습니다. 실제 장치를 사용해 보았지만 결코 작동하지 않지만 파일을 사용한 실험은 64 비트 상자에서 작동했지만 32 비트 상자에서는 작동하지 않았습니다.
먼저, 준비 :
$ dd if=/dev/sdj2 count=200704 | md5sum
0f0727f6644dac7a6ec60ea98ffc6da9
$ dd if=/dev/sdj2 count=200704 of=testfile
작동하지 않습니다.
$ dd if=/dev/sdj2 count=200704 | mbuffer -s 512 -b 4096 -P 100 -H | dd of=/dev/sdj2 seek=4096
summary: 98.0 MiByte in 4.4sec - average of 22.0 MiB/s
md5 hash: 3cbf1ca59a250d19573285458e320ade
64 비트 시스템에서는 작동하지만 32 비트 시스템에서는 작동하지 않습니다.
$ dd if=testfile count=200704 | mbuffer -s 512 -b 4096 -P 100 -H | dd of=testfile seek=4096 conv=notrunc
summary: 98.0 MiByte in 0.9sec - average of 111 MiB/s
md5 hash: 0f0727f6644dac7a6ec60ea98ffc6da9
이것이 어떻게 안정적으로 이루어질 수 있습니까?
노트
버퍼링에 대한 다른 질문을 읽고 pv
, buffer
및을 보았습니다 mbuffer
. 후자는 필요한 버퍼 크기로 작업하게 할 수있었습니다.
종말점 스토리지를 사용하는 것은 항상 작동하는 문제에 대한 확실한 솔루션이지만 충분한 예비 용량을 사용할 수없는 경우에는 실용적이지 않습니다.
mbuffer
20140302 버전의 Arch Linux를 실행하는 테스트 플랫폼 .
mbuffer
실제로 초를 강제적으로 dd
첫번째에 대한 뒤쳐 당신은 단지 변화의 크기를 버퍼에 충분한 RAM이 필요합니다. 너무 나쁘면 dd
문제를 제거하기 때문에 블록을 역순으로 읽고 쓰는 것을 지원하지 않습니다!
-H
인수는이 기능을 가능하게합니다).
mbuffer
전혀 사용하지 않습니까? 대신dd
블록 장치의 전체 내용을 한 번에 읽으십시오dd bs=102760448
. 물론 한 가지 방법은 RAM에 버퍼링됩니다.