Provided by: manpages-ru_4.18.1-1_all bug

ИМЯ

       random, urandom - ядерные устройства-источники случайных чисел

СИНТАКСИС

       #include <linux/random.h>

       int ioctl(fd, RNDrequest, param);

ОПИСАНИЕ

       Специальные  символьные  файлы  /dev/random  и  /dev/urandom  (появились  в  Linux 1.3.30)
       предоставляют интерфейс к генератору случайных чисел, встроенному в ядро. Файл /dev/random
       имеет  старший  номер  устройства  1 и младший номер устройства 8. Файл /dev/urandom имеет
       старший номер устройства 1 и младший номер устройства 9.

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

       В Linux 3.17 и новее предоставляется более простой и  безопасный  интерфейс  getrandom(2),
       который не требует специальных файлов; смотрите справочную страницу getrandom(2).

       При  чтении  из  устройства  /dev/urandom  возвращаются  произвольные байты, полученные из
       генератора псевдослучайных чисел, инициализированного из пула энтропии.  Чтение  из  этого
       устройства  не  приводит к блокировке (то есть, ЦП не отдаёт управление), но может вызвать
       заметную задержку при запросе большого количества данных.

       При чтении во  время  начальной  загрузки  ОС  /dev/urandom  может  возвращать  данные  до
       инициализации пула энтропии. Если это неприемлемо для приложения, используйте getrandom(2)
       или /dev/random.

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

       When  the  entropy  pool  is  empty,  reads  from  /dev/random will block until additional
       environmental noise is gathered.  Since Linux 5.6,  the  O_NONBLOCK  flag  is  ignored  as
       /dev/random  will  no longer block except during early boot process.  In earlier versions,
       if open(2)  is called for /dev/random with the O_NONBLOCK flag, a subsequent read(2)  will
       not block if the requested number of bytes is not available.  Instead, the available bytes
       are returned.  If no byte is available, read(2)  will return -1 and errno will be  set  to
       EAGAIN.

       При  открытии  /dev/urandom  флаг  O_NONBLOCK  не  учитывается.  При  вызове  read(2)  для
       устройства /dev/urandom чтение до 256 байт вернёт запрошенное количество байт и  не  будет
       прервано   обработчиком  сигнала.  Чтение  с  буфером  больше  ограничения  может  вернуть
       количество  байт  меньше  запрошенного  или  завершиться  ошибкой  EINTR  при   прерывании
       обработчиком сигнала.

       Since Linux 3.16, a read(2)  from /dev/urandom will return at most 32 MB.  A read(2)  from
       /dev/random will return at most 512 bytes (340 bytes before Linux 2.6.12).

       При  записи  в  /dev/random  или  /dev/urandom  выполняется   обновление   пула   энтропии
       записываемыми  данными,  но  при этом не увеличивается счётчик энтропии. Это означает, что
       изменения отразятся в обоих файлах, но это не ускорит процесс чтения из /dev/random.

   Использование
       Интерфейс /dev/random считается устаревшим, во всех случаях  предпочтительно  использовать
       /dev/urandom;  исключением  являются приложения, которым нужны произвольные байты во время
       загрузки системы; в таких приложениях нужно использовать getrandom(2), так как этот  вызов
       выполняет блокировку для ожидания наполнения пула энтропии.

       If   a   seed   file  is  saved  across  reboots  as  recommended  below,  the  output  is
       cryptographically secure against attackers without local root access  as  soon  as  it  is
       reloaded in the boot sequence, and perfectly adequate for network encryption session keys.
       (All major Linux distributions have saved the seed  file  across  reboots  since  2000  at
       least.)   Since  reads  from  /dev/random may block, users will usually want to open it in
       nonblocking mode (or perform  a  read  with  timeout),  and  provide  some  sort  of  user
       notification if the desired entropy is not immediately available.

   Настройка
       Если в системе нет /dev/random и /dev/urandom, то их можно создать следующими командами:

           mknod -m 666 /dev/random c 1 8
           mknod -m 666 /dev/urandom c 1 9
           chown root:root /dev/random /dev/urandom

       Когда  Linux-система  запускается  без  участия  человека,  пул энтропии может оказаться в
       довольно предсказуемом состоянии. Это снижает значимый объём шума  в  пуле  энтропии  ниже
       оцениваемого.  Для  преодоления  этого эффекта можно сохранять информацию пула энтропии во
       время выключения и восстанавливать во время запуска системы. Для этого добавьте  строки  в
       сценарий, который выполняется при запуске Linux-системы:

           echo "Инициализация генератора случайных чисел…"
           random_seed=/var/run/random-seed
           #  перенос случайного начального числа от запуска к запуску
           # загрузка и сохранение всего пула энтропии
           if [ -f $random_seed ]; then
               cat $random_seed >/dev/urandom
           else
               touch $random_seed
           fi
           chmod 600 $random_seed
           poolfile=/proc/sys/kernel/random/poolsize
           [ -r $poolfile ] && bits=$(cat $poolfile) || bits=4096
           bytes=$(expr $bits / 8)
           dd if=/dev/urandom of=$random_seed count=1 bs=$bytes

       Также  добавьте  следующие  строки  в  сценарий, который выполняется при завершении работы
       Linux-системы:

           # перенос случайного начального числа от выключения до запуска
           # сохранение всего пула энтропии
           echo "Сохранение случайного начального числа…"
           random_seed=/var/run/random-seed
           touch $random_seed
           chmod 600 $random_seed
           poolfile=/proc/sys/kernel/random/poolsize
           [ -r $poolfile ] && bits=$(cat $poolfile) || bits=4096
           bytes=$(expr $bits / 8)
           dd if=/dev/urandom of=$random_seed count=1 bs=$bytes

       В примерах выше мы предполагаем, что используется ядро Linux 2.6.0 или  новее,  в  котором
       /proc/sys/kernel/random/poolsize содержит размер пула энтропии в битах (смотрите ниже).

   Интерфейс /proc
       The  files  in  the directory /proc/sys/kernel/random (present since Linux 2.3.16) provide
       additional information about the /dev/random device:

       entropy_avail
              Файл доступен только для чтения и показывает  количество  бит  доступной  энтропии.
              Данное число находится в диапазоне от 0 до 4096.

       poolsize
              Файл содержит размер пула энтропии. Формат файла зависит от версии ядра:

              Linux 2.4:
                     В  файле  содержится размер пула энтропии в байтах. Обычно это число 512, но
                     так как файл доступен на запись, значение можно изменить, подстроив его  под
                     доступный  алгоритм.  Возможные  значения  — 32, 64, 128, 256, 512, 1024 или
                     2048.

              Linux 2.6 и новее:
                     Файл доступен только на чтение и содержит  размер  пула  энтропии  в  битах.
                     Значение равно 4096.

       read_wakeup_threshold
              В  файле  содержится  количество бит энтропии, требуемое для пробуждения процессов,
              которые спят в ожидании энтропии из /dev/random. Значение по умолчанию равно 64.

       write_wakeup_threshold
              В файле содержится количество бит энтропии, менее которого мы пробуждаем  процессы,
              которые  выполнили  вызовы select(2) или poll(2) для ожидания записи в /dev/random.
              Эти значения можно изменить, записав новые числа в эти файлы.

       uuid и boot_id
              Эти  файлы,  доступные  только  для  чтения,  содержат  произвольные  строки   вида
              6fd5a44b-35f4-4ad4-a9b9-6b9be13e1fe9.  Значение  первого  генерируется  заново  при
              каждом чтении, а значение второго генерируется только один раз.

   Интерфейс ioctl(2)
       Для файловых дескрипторов, соединённых с файлами /dev/random  и  /dev/urandom,  определены
       запросы  ioctl(2),  перечисленные ниже. Все выполняемые запросы обращаются к входному пулу
       энтропии, который относится к и к /dev/random,  и  к  /dev/urandom.  Для  выполнения  всех
       запросов (кроме RNDGETENTCNT) требуется мандат CAP_SYS_ADMIN.

       RNDGETENTCNT
              Возвращает  счётчик  энтропии  входного  пула,  возвращается  содержимое  из  файла
              entropy_avail в proc. Результат сохраняется в int, указанный в параметре.

       RNDADDTOENTCNT
              Увеличивает или уменьшает счётчик энтропии входного пула на значение аргумента.

       RNDGETPOOL
              Удалён из Linux 2.6.9.

       RNDADDENTROPY
              Вносит дополнительную энтропию во входной пул, увеличивая счётчик энтропии.  Запись
              в  /dev/random  или /dev/urandom добавляет только данные, но не увеличивает счётчик
              энтропии (в этом отличие). Используется следующая структура:

                  struct rand_pool_info {
                      int    entropy_count;
                      int    buf_size;
                      __u32  buf[0];
                  };

              Здесь entropy_count — добавляемое (или вычитаемое) значение к счётчику энтропии,  а
              buf — буфер с размером buf_size, из которого в пул энтропии добавляются данные.

       RNDZAPENTCNT, RNDCLEARPOOL
              Обнуляет  счётчики  всех  пулов и добавляет в них некоторые системные данные (такие
              как время).

ФАЙЛЫ

       /dev/random
       /dev/urandom

ЗАМЕЧАНИЯ

       Обзор и сравнение возможных интерфейсов, через которые можно  получать  случайные  данные,
       смотрите в random(7).

ДЕФЕКТЫ

       Во  время  начальной  загрузки  ОС  чтение  из  /dev/urandom  может  возвращать  данные до
       инициализации пула энтропии.

СМ. ТАКЖЕ

       mknod(1), getrandom(2), random(7)

       RFC 1750, "Randomness Recommendations for Security"

ПЕРЕВОД

       Русский перевод этой страницы руководства был сделан aereiae  <aereiae@gmail.com>,  Azamat
       Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Katrin Kutepova
       <blackkatelv@gmail.com>, Lockal <lockalsash@gmail.com>, Yuri Kozlov  <yuray@komyakino.ru>,
       Баринов Владимир и Иван Павлов <pavia00@gmail.com>

       Этот  перевод  является  бесплатной  документацией;  прочитайте  Стандартную  общественную
       лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если  вы  обнаружите  ошибки  в  переводе этой страницы руководства, пожалуйста, отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.