Я пытаюсь понять вывод 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 байтов?
linux
command-line
fo_x86
источник
источник
Ответы:
Вам нужно использовать
/dev/urandom
или «разблокирующий» случайный источник./dev/random
использует своего рода пул энтропии для увеличения случайности источника битов. Этот метод будет возвращать только столько случайных битов / байтов, сколько может быть возвращено в зависимости от состояния энтропийного пула в данный момент, поэтому, если используется аппаратный генератор случайных чисел, это иногда может быть константой. Из справочной страницы Linux :/dev/urandom
Файл сохраняет повторно использовать внутренний бассейн как есть , чтобы генерировать номер до тех пор , как вам нужно. Побочным эффектом этого является: не использовать/dev/urandom
в криптографических целях , так как оно менее случайно, чем биты, создаваемые/dev/random
. Смотрите ссылку на страницу руководства выше для деталей.источник
Поскольку чтение
/dev/random
возвращает только доступное количество байтов , необходимо указать размер блока 1 . В вашем примере вы устанавливаете размер блока на 512, который не выполняется после первого чтения.Следовательно, правильные аргументы, которые читают ровно 512 байт:
Обратите внимание, что команда будет блокироваться до тех пор, пока в системе не будет достаточно энтропии для генерации всех данных. Вот как это
/dev/random
работает. Если вы не хотите ждать и у вас все в порядке с меньшей энтропией, используйте/dev/urandom
вместо этого. В подавляющем большинстве случаев использование/dev/urandom
является предпочтительным.источник
/dev/random
становится практически неприменимым, поскольку выполнение команды может занять много минут. Кроме того, даже при том,bs=512 count=1
что кажется, что вызов все еще блокируется, если там вообще нет доступных байтов, правильно? Альтернативой переключениюbs
иcount
значениям является использованиеiflag=fullblock
; то естьbs=512 count=1 iflag=fullblock
.