bs
, размер буфера, означает размер одного вызова read(), выполняемого dd.
(Например, оба bs=1M count=1
и bs=1k count=1k
приведут к файлу размером 1 МБ, но первая версия сделает это за один шаг, а вторая сделает это за 1024 маленьких фрагмента.)
Обычные файлы могут быть прочитаны практически при любом размере буфера (при условии, что этот буфер помещается в ОЗУ), но устройства и "виртуальные" файлы часто работают очень близко к отдельным вызовам и имеют некоторые произвольные ограничения на объем данных, которые они будут создавать в чтение () вызов.
Для /dev/urandom
это ограничение определено в urandom_read() в drivers/char/random.c:
#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 не будет повторять попытку после получения меньшего количества данных, чем запрошено - вы получаете 32 МБ и все. (Чтобы повторить попытку автоматически, как в ответе Камила, вам нужно указать iflag=fullblock
.)
Также обратите внимание, что «размер одного read()» означает, что весь буфер должен помещаться в памяти одновременно, поэтому огромные размеры блоков также соответствуют массовому использованию памяти dd.
И все это бессмысленно, потому что вы обычно не получаете никакой производительности, когда превышаете ~ 16–32 МБ блоков - системные вызовы здесь не медленная часть, а генератор случайных чисел.
Так что для простоты просто используйте head -c 1G /dev/urandom > output
.