Чому 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 байт?


Дивіться 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. (Це була відповідь на мою проблему, поки прориву не було).
супербоб
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.