1GB의 임의 파일을 생성하고 싶었으므로 다음 명령을 사용했습니다.
dd if=/dev/urandom of=output bs=1G count=1
그러나 대신이 명령을 시작할 때마다 32MB 파일이 생성됩니다.
<11:58:40>$ dd if=/dev/urandom of=output bs=1G count=1
0+1 records in
0+1 records out
33554431 bytes (34 MB, 32 MiB) copied, 0,288321 s, 116 MB/s
뭐가 잘못 되었 니?
편집하다:
이 주제에 대한 큰 답변 덕분에 32GB를 32MB로 읽는 솔루션이 제공되어 1GB가됩니다.
dd if=/dev/urandom of=output bs=32M count=32
1GB를 메모리로 직접 읽은 다음 디스크에 쓰는 다른 솔루션이 제공되었습니다. 이 솔루션은 많은 메모리를 사용하므로 선호되지 않습니다.
dd if=/dev/urandom of=output bs=1G count=1 iflag=fullblock
답변
bs
버퍼 크기 는 dd가 수행 한 단일 read () 호출 의 크기를 의미합니다 .
(예를 들어, 모두 bs=1M count=1
와 bs=1k count=1k
1 개 MIB 파일을 초래할 것이지만, 제 1024 개 작은 덩어리를 수행 할 때 첫 번째 버전은 단일 단계에서 수행된다.)
일반 파일은 거의 모든 버퍼 크기로 읽을 수 있지만 (버퍼가 RAM에 맞는 경우) 장치 및 “가상”파일은 종종 개별 호출에 매우 가깝게 작동하며 데이터 당 생성되는 데이터의 양에 대한 임의의 제한이 있습니다. read () 호출.
의 /dev/urandom
경우이 한계는 drivers / char / random.c의 urandom_read () 에 정의되어 있습니다 .
#define ENTROPY_SHIFT 3
static ssize_t
urandom_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
{
nbytes = min_t(size_t, nbytes, INT_MAX >> (ENTROPY_SHIFT + 3));
...
}
이것은 함수가 호출 될 때마다 요청 된 크기를 33554431 바이트로 고정한다는 것을 의미합니다.
기본적으로 다른 대부분의 도구와 달리 dd 는 요청한 것보다 적은 데이터를받은 후에 다시 시도하지 않습니다. 32MiB를 얻으면 그게 전부입니다. (Kamil의 답변 에서처럼 자동으로 다시 시도하려면을 지정해야합니다 iflag=fullblock
.)
또한 “단일 read ()의 크기”는 전체 버퍼가 한 번에 메모리에 맞아야한다는 것을 의미하므로 대규모 블록 크기는 dd의 대규모 메모리 사용량과도 일치합니다 .
~ 16-32 MiB 블록 이상으로 올라갈 때 일반적으로 성능을 얻지 못하기 때문에 모든 것이 의미가 없습니다. 여기서 syscall은 느린 부분이 아니며 난수 생성기입니다.
따라서 간단하게하려면을 사용하십시오 head -c 1G /dev/urandom > output
.
답변
dd
를 지정 하지 않으면 보다 작게 읽을 수 있습니다 ibs
(주 : 와 bs
모두 지정). 전체 블록 및 부분 블록을 읽었 음을 나타냅니다 . 그러나 전체 또는 부분 블록은 카운터를 증가시킵니다.ibs
obs
iflag=fullblock
0+1 records in
0
1
나는 이 특별한 경우 편집 : 이 동시 답변 은이 특별한 경우 dd
보다 적은 블록을 읽는 정확한 메커니즘을 모른다 1G
. 블록을 작성하기 전에 블록을 메모리로 읽은 것으로 추측되므로 메모리 관리가 방해를받을 수 있습니다 (그러나 이것은 추측 일뿐입니다). dd
보다 적은 블록을 읽는 메커니즘을 설명합니다 1G
.
어쨌든, 나는 그렇게 큰 것을 권장하지 않습니다 bs
. 사용 bs=1M count=1024
합니다. 가장 중요한 것은 :없이 iflag=fullblock
어떤 읽기 시도가보다 읽을 수 있습니다 ibs
(하지 않는 한 ibs=1
나는이 비록 매우 비효율적 인 생각을).
따라서 정확한 양의 데이터를 읽어야하는 경우을 사용하십시오 iflag=fullblock
. 참고가 iflag
POSIX에 의해 필요하지 않습니다, 당신은 dd
그것을 지원하지 않을 수 있습니다. 이 대답 에 따르면 ibs=1
아마도 정확한 바이트 수를 읽는 유일한 POSIX 방법 일 것입니다. 물론 변경 ibs
하면을 다시 계산해야합니다 count
. 귀하의 경우 ibs
에 32M
또는 이하로 낮추면 아마도 없이도 문제를 해결할 수 iflag=fullblock
있습니다.
쿠분투에서는 다음과 같이 명령을 수정합니다.
dd if=/dev/urandom of=output bs=1M count=1024 iflag=fullblock