Почему dd копирует только 128 байтов из / dev / random, когда я запрашиваю больше?

10

Я пытаюсь понять вывод ddкоманды. Я попытался

dd if=/dev/zero of=/dev/null bs=512 count=1

и получил (как и ожидалось):

 1+0 records in
 1+0 records out
 512 bytes (512 B) copied, 2e-05 seconds, 26 MB/s

Однако, когда я пытался

dd if=/dev/random of=/dev/null bs=512 count=1

я получил

 0+1 records in
 0+1 records out
 128 bytes (128 B) copied, 0.00012 seconds, 1.1 MB/s

Почему он копирует только 128 байтов?

fo_x86
источник
См. Superuser.com/questions/359599/… для более полного обсуждения / dev / random и urandom
BobT

Ответы:

8

Вам нужно использовать /dev/urandomили «разблокирующий» случайный источник.

/dev/randomиспользует своего рода пул энтропии для увеличения случайности источника битов. Этот метод будет возвращать только столько случайных битов / байтов, сколько может быть возвращено в зависимости от состояния энтропийного пула в данный момент, поэтому, если используется аппаратный генератор случайных чисел, это иногда может быть константой. Из справочной страницы Linux :

Генератор также сохраняет оценку количества битов шума в пуле энтропии. Из этого энтропийного пула создаются случайные числа.

/dev/urandomФайл сохраняет повторно использовать внутренний бассейн как есть , чтобы генерировать номер до тех пор , как вам нужно. Побочным эффектом этого является: не использовать /dev/urandomв криптографических целях , так как оно менее случайно, чем биты, создаваемые /dev/random. Смотрите ссылку на страницу руководства выше для деталей.

Прорыв, достижение, открытие
источник
3

Поскольку чтение /dev/randomвозвращает только доступное количество байтов , необходимо указать размер блока 1 . В вашем примере вы устанавливаете размер блока на 512, который не выполняется после первого чтения.

Следовательно, правильные аргументы, которые читают ровно 512 байт:

dd if=/dev/random of=filename bs=1 count=512

Обратите внимание, что команда будет блокироваться до тех пор, пока в системе не будет достаточно энтропии для генерации всех данных. Вот как это /dev/randomработает. Если вы не хотите ждать и у вас все в порядке с меньшей энтропией, используйте /dev/urandomвместо этого. В подавляющем большинстве случаев использование /dev/urandomявляется предпочтительным.

Вилиам
источник
+1 для объяснения, хотя следует сказать, что при количестве байтов до 512 использование /dev/randomстановится практически неприменимым, поскольку выполнение команды может занять много минут. Кроме того, даже при том, bs=512 count=1что кажется, что вызов все еще блокируется, если там вообще нет доступных байтов, правильно? Альтернативой переключению bsи countзначениям является использование iflag=fullblock; то есть bs=512 count=1 iflag=fullblock.
mklement0
ИМХО, этот ответ должен быть объединен с ответом @ Breakthrough. (Это был ответ на мою проблему, в то время как прорыва не было).
Супербоб