/dev/zero와 /dev/urandom의 파일 크기가 다릅니다.

/dev/zero와 /dev/urandom의 파일 크기가 다릅니다.

dd명령을 통해 임의의 1G 테스트 파일을 생성하려고 합니다 .

dd status=progress if=/dev/zero of=/tmp/testfile.zer bs=100M count=10
dd status=progress if=/dev/urandom of=/tmp/testfile1.ran bs=100M count=10
dd status=progress if=/dev/urandom of=/tmp/testfile2.ran bs=100M count=20

출력은 다음과 같습니다

-rw-rw-r-- 1 dorinand dorinand  320M dub 21 12:37 testfile1.ran
-rw-rw-r-- 1 dorinand dorinand  640M dub 21 12:37 testfile2.ran
-rw-rw-r-- 1 dorinand dorinand 1000M dub 21 12:37 testfile.zer

생성된 출력 테스트 파일이 /dev/urandom3배 더 작은 이유는 무엇입니까? testfile1.ran의 크기는 1000M, testfile2.ran의 크기는 2000M가 될 것으로 예상했습니다. 왜 이런 일이 발생하는지 설명할 수 있는 사람이 있나요? 무작위 테스트 파일을 어떻게 생성해야 합니까?

답변1

블록 크기가 클수록 읽기가 불완전해질 위험이 있습니다. 이는 블록 장치가 아닌 파이프에서 읽을 때도 자주 발생합니다.

count특정 사이즈( * ) 를 받으려면 bs해당 사이즈도 제공해야 합니다 iflag=fullblock.

필요하지 않거나 bs=1M더 작을 수도 있지만 여전히 권장됩니다.

dd또한 불완전한 읽기 수를 표시하려고 시도합니다. n+mn개의 완전한 블록과 m개의 불완전한 블록을 복사합니다 . 블록 크기의 배수가 아닌 파일을 복사할 때 마지막 블록이 불완전한 것은 정상입니다.

예:

$ dd status=progress if=/dev/urandom of=/dev/null bs=100M count=20 
dd: warning: partial read (33554431 bytes); suggest iflag=fullblock
536870896 bytes (537 MB, 512 MiB) copied, 2 s, 254 MB/s
0+20 records in
0+20 records out
671088620 bytes (671 MB, 640 MiB) copied, 2.64391 s, 254 MB/s

이 경우 단일 완전한 100M 블록 대신 불완전한 읽기만 얻습니다. 분명히 /dev/urandom은 한 번의 읽기로 너무 많은 데이터를 제공하고 싶지 않습니다. 내 버전의 dd에서는 직접 사용하라고 지시하기도 합니다 iflag=fullbock.

fullblock을 사용하면 모든 것이 잘 작동합니다.

$ dd status=progress if=/dev/urandom of=/dev/null bs=100M count=20 iflag=fullblock
2097152000 bytes (2.1 GB, 2.0 GiB) copied, 8 s, 255 MB/s 
20+0 records in
20+0 records out
2097152000 bytes (2.1 GB, 2.0 GiB) copied, 8.22914 s, 255 MB/s

실제로는 데이터 양의 두 배 이상을 복사하기 때문에 시간이 더 오래 걸립니다.

관련 정보