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/urandom
3배 더 작은 이유는 무엇입니까? testfile1.ran의 크기는 1000M, testfile2.ran의 크기는 2000M가 될 것으로 예상했습니다. 왜 이런 일이 발생하는지 설명할 수 있는 사람이 있나요? 무작위 테스트 파일을 어떻게 생성해야 합니까?
답변1
블록 크기가 클수록 읽기가 불완전해질 위험이 있습니다. 이는 블록 장치가 아닌 파이프에서 읽을 때도 자주 발생합니다.
count
특정 사이즈( * ) 를 받으려면 bs
해당 사이즈도 제공해야 합니다 iflag=fullblock
.
필요하지 않거나 bs=1M
더 작을 수도 있지만 여전히 권장됩니다.
dd
또한 불완전한 읽기 수를 표시하려고 시도합니다. n+m
n개의 완전한 블록과 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
실제로는 데이터 양의 두 배 이상을 복사하기 때문에 시간이 더 오래 걸립니다.