dd의 "a+b 레코드" 통계에서 이 두 숫자는 무엇을 의미합니까?

dd의 "a+b 레코드" 통계에서 이 두 숫자는 무엇을 의미합니까?

통계의 처음 두 줄의 dd형식은 다음과 같습니다.

a+b records in
c+d records out

왜 값이 2개인가요? 이 더하기 기호는 무엇을 의미하나요? 일반적으로 이렇지 a+0만 때로는 더 큰 블록 크기를 사용하면 dd가 인쇄됩니다.0+b records out

답변1

이는 해당 크기의 전체 블록 bs과 bs보다 작은 크기의 추가 블록을 의미합니다.

pushd "$(mktemp -d)"
dd if=/dev/zero of=1 bs=64M count=1 # and you get a 1+0
dd if=1 of=/dev/null bs=16M # 4+0
dd if=1 of=/dev/null bs=20M # 3+1
dd if=1 of=/dev/null bs=80M # 0+1
_crap=$PWD; popd; rm -rf "$_crap"; unset _crap
# frostschutz's case
yes | dd of=/dev/null bs=64M count=1 # 0+1

편집하다:frostschutz의 답변에는 불완전한 블록을 생성하는 또 다른 사례가 언급되어 있습니다. 읽을 가치가 있습니다. 당신은 또한 볼 수 있습니다https://unix.stackexchange.com/a/17357/73443.

답변2

0+b records outb>1bs=X데이터를 충분히 빠르게 제공할 수 없는 파이프나 기타 소스에서 읽을 때 불완전한 읽기가 되는 경우가 많습니다. dd전체 데이터 블록에 대해 강제 대기를 사용할 수 있습니다 iflag=fullblock. 이 옵션은 불완전한 블록도 계산하기 위해 개수를 사용하는 경우 특히 유용하므로 count=X완전한 블록이 없으면 신뢰할 수 없습니다.

답변3

설명자에 매달리고 입력을 기다릴 수 있는 표준 명령줄 유틸리티가 많이 있습니다. 이것이 모두 작동하는 방식입니다. dd설명자가 어떻게 생겼는지 보여 준다는 점에서 독특합니다.지금.

개인적으로 저는 GNU 옵션의 목적을 잘 이해하지 못합니다 iflag=fullblock. 내 말은, cat적어도 쉽게 입력을 할 수 있고 I/O 블록 크기에 대해 전혀 걱정할 필요가 없다는 것입니다.

하지만 dd걸릴 수 있습니다부분스트리밍 - read()상당히 현대적인 시스템의 가장자리에서 이를 수행할 수 있습니다.write()

{ (     sleep 1                     #don't write() til dd is definitely setup
        printf 123                  #write() 3  bytes
        printf %-30s\\n 456         #write() 31 bytes
        printf you\ there\?         #write() 10 bytes
)|      dd bs=64 count=2 conv=sync| #2 64 byte read()/write() \0-padded blocks
        od -vtc                     #show it with octal radices
}       2>/dev/null                 #drop stderr

0000000   1   2   3  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000020  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000040  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000060  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000100   4   5   6
0000120                                                          \n  \0
0000140  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000160  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000200

ddread()각 입력 블록은 작업을 수행합니다. 시도하는 파일에 read()요청한 만큼의 데이터가 없으면 괜찮습니다.하나 read()다음으로 계산하나입력 블록. 이것이 작동 방식입니다. 이것이 dd주요 목적입니다.

작업이 완료되면 dd처리한 모든 입력/출력 블록을 다시 보고합니다. 위 명령을 다시 실행하되 이번에는 stdout을 제거합니다...


dd: warning: partial read (3 bytes); suggest iflag=fullblock
0+2 records in
2+0 records out
128 bytes (128 B) copied, 1.00161 s, 0.1 kB/s

매번 짧게 반환 dd합니다 read(0,&in,64) read. 표준 입력 파일 설명자에는 요청이 완료될 때까지 기다릴 만큼 충분한 바이트가 없기 때문입니다. 따라서 dd read()전체 입력 레코드는 0개이고 짧은 입력 레코드는 2개입니다. 그것이 바로 그 보고서가 의미하는 바였습니다.

관련 정보