Provided by: manpages-ru_4.21.0-2_all 

ИМЯ
initrd - RAM-диск, инициализируемый загрузчиком
НАСТРОЙКА
Устройство /dev/initrd — это блочное устройство, доступное только для чтения, имеющее старший номер 1 и
младший номер 250. Обычно, /dev/initrd принадлежит root:disk с правами 0400 (читать может только root).
Если /dev/initrd ещё не создано, то это можно сделать с помощью команд:
mknod -m 400 /dev/initrd b 1 250
chown root:disk /dev/initrd
Для использования /dev/initrd с поддержкой «диска в RAM» и «начального диска в RAM» ядро Linux должно
быть собрано с параметрами CONFIG_BLK_DEV_RAM=y и CONFIG_BLK_DEV_INITRD=y. При использовании /dev/initrd
драйвер диска в RAM не может загружаться как модуль.
ОПИСАНИЕ
Специальный файл /dev/initrd — блочное устройство, доступное только для чтения. Данное устройство
представляет собой диск, расположенный в оперативной памяти, который инициализируется (т.е. загружается)
системным загрузчиком до запуска ядра. Затем ядро может использовать содержимое блочного устройства
/dev/initrd для двухфазовой загрузки системы.
Во время первой фазы ядро запускается и монтирует начальную корневую файловую систему из содержимого
/dev/initrd (например, RAM-диска, инициализированного системным загрузчиком). Во время второй фазы из
начального содержимого корневого устройства загружаются дополнительные драйверы и модули. После загрузки
дополнительных модулей с другого устройства монтируется новая корневая файловая система (т.е., нормальная
корневая файловая система).
Выполнение загрузки
При загрузке с initrd система загружается следующим образом:
(1) Загрузчик загружает файл ядра и содержимое /dev/initrd в память.
(2) При запуске ядра, оно разархивирует и копирует содержимое устройства /dev/initrd на устройство
/dev/ram0, а затем освобождает память, занятую /dev/initrd.
(3) Затем ядро монтирует устройство /dev/ram0 для чтения и записи в качестве начальной корневой файловой
системы.
(4) Если заданная нормальная корневая файловая система также является начальной корневой файловой
системой (например, /dev/ram0), то ядро переходит к последнему пункту для нормальной загрузки.
(5) Если в начальной корневой файловой системе находится исполняемый файл /linuxrc, то он исполняется с
UID 0. Файл /linuxrc должен иметь разрешения на исполнение. Файл /linuxrc может быть любым
допустимым исполняемым файлом, даже файлом сценария.
(6) Если /linuxrc не выполняется или когда /linuxrc заканчивает выполнение, монтируется нормальная
корневая файловая система. Если /linuxrc завершается и имеется какая-либо файловая система,
примонтированная к начальной корневой файловой системе, то поведение ядра НЕ ОПРЕДЕЛЕНО. Смотрите
подробности о поведении текущей версии ядра в разделе ЗАМЕЧАНИЯ.
(7) Если в нормальной корневой файловой системе есть каталог /initrd, то устройство /dev/ram0
перемещается из / в /initrd. Иначе, если каталог /initrd не существует, то устройство /dev/ram0
размонтируется. При перемещении из / в /initrd устройство /dev/ram0 не размонтируется, и потому
процессы, запущенные с /dev/ram0, продолжают выполняться. Если каталог /initrd не существует в
нормальной корневой файловой системе и какие-либо процессы с /dev/ram0 продолжают выполняться после
завершения /linuxrc, то поведение ядра НЕ ОПРЕДЕЛЕНО. Смотрите подробности о поведении текущей
версии ядра в разделе ЗАМЕЧАНИЯ.
(8) Выполняется обычная процедура загрузки (например, вызов /sbin/init) с нормальной корневой файловой
системой.
Параметры
При использовании initrd на загрузку ядра влияют следующие параметры системного загрузчика:
initrd=имя_файла
Определяет файл, который нужно загрузить в качестве содержимого /dev/initrd. Для LOADLIN это
параметр командной строки. Для LILO вы должны использовать эту команду в файле настройки LILO —
/etc/lilo.config. Имя файла, определяемое этим параметром, обычно является образом файловой
системы, сжатым программой gzip.
noinitrd
Этот загрузочный параметр отменяет двухфазную процедуру загрузки. Ядро выполняет обычную процедуру
загрузки так, если бы устройство /dev/initrd не было инициализировано. С этим параметром всё
содержимое /dev/initrd, загруженное в память системным загрузчиком, сохраняется. Этот параметр
разрешает устройству /dev/initrd содержать любые данные, не ограничиваясь образом файловой
системы. Однако, устройство /dev/initrd доступно только для чтения и может быть прочитано только
один раз после запуска системы.
root=имя_устройства
Определяет устройство, которое должно быть использовано в качестве нормальной корневой файловой
системы. Для LOADLIN это параметр командной строки Для LILO этот параметр определяется во время
загрузки или строкой в файле настройки LILO — /etc/lilo.config. Устройство, определяемое этим
параметром, должно быть монтируемым устройством, имеющим подходящую корневую файловую систему.
Смена нормальной корневой файловой системы
По умолчанию, для определения нормальной корневой файловой системы используются настройки ядра (например,
установленные в файле ядра с помощью rdev(8) или на этапе сборки ядра) или параметр системного
загрузчика. При монтировании нормальной корневой файловой системы по NFS для задания настроек NFS нужно
использовать загрузочные параметры nfs_root_name и nfs_root_addrs. Дополнительную информацию об этом
можно найти в файле документации к ядру Documentation/filesystems/nfs/nfsroot.txt (или
Documentation/filesystems/nfsroot.txt в Linux 2.6.33). Также дополнительная информация по настройкам
корневой файловой системы содержится в документации к LILO и LOADLIN.
Также сменить нормальное корневое устройство можно из /linuxrc. Для этого должен быть смонтирован каталог
/proc. После монтирования /proc, сменить нормальное корневое устройство из /linuxrc можно записав
настройки в proc-файлы /proc/sys/kernel/real-root-dev, /proc/sys/kernel/nfs-root-name и
/proc/sys/kernel/nfs-root-addrs. Для смены физического корневого устройства из /linuxrc нужно записать
номер нового устройства корневой файловой системы в /proc/sys/kernel/real-root-dev. Для смены корневой
файловой системы NFS из /linuxrc нужно записать настройки NFS в файлы /proc/sys/kernel/nfs-root-name и
/proc/sys/kernel/nfs-root-addrs, а затем записать 0xff (номер псевдо-NFS-устройства) в файл
/proc/sys/kernel/real-root-dev. Так, например, следующие команды изменят нормальное корневое устройство
на /dev/hdb1:
echo 0x365 >/proc/sys/kernel/real-root-dev
В качестве примера c NFS, следующие команды изменят нормальное корневое устройство на каталог NFS
/var/nfsroot на NFS-сервере локальной сети с IP-адресом 193.8.232.7 для системы с IP-адресом 193.8.232.2
и именем 'idefix':
echo /var/nfsroot >/proc/sys/kernel/nfs-root-name
echo 193.8.232.2:193.8.232.7::255.255.255.0:idefix \
>/proc/sys/kernel/nfs-root-addrs
echo 255 >/proc/sys/kernel/real-root-dev
Замечание: Файл /proc/sys/kernel/real-root-dev для смены корневой файловой системы больше не применяется.
Современный метод смены корневой файловой системы описан в файле кода ядра Linux
Documentation/admin-guide/initrd.rst (или Documentation/initrd.txt до Linux 4.10), а также в
pivot_root(2) и pivot_root(8).
Использование
Основной причиной реализации initrd стала потребность в настройках модулей ядра во время установки
системы.
Возможный сценарий установки системы:
(1) Программа-загрузчик стартует с дискеты или другого носителя с минимальным ядром (например,
включающим поддержку /dev/ram, /dev/initrd и файловой системы ext2) и загружает в /dev/initrd
начальную файловую систему, сжатую программой gzip.
(2) Исполняемый файл /linuxrc определяет: (1) что необходимо, чтобы смонтировать нормальную корневую
файловую систему (т.е., тип устройства, драйверы, файловую систему) и (2) носитель распространения
(например, CD-ROM, сеть, лента, …). Для этого может быть задан вопрос пользователю, запущена
автоматического определения или использован гибридный подход.
(3) Исполняемый файл /linuxrc загружает необходимые модули из начальной корневой файловой системы.
(4) Исполняемый файл /linuxrc создаёт и заполняет корневую файловую систему (на этой стадии нормальная
корневая файловая система ещё не является законченной системой).
(5) Исполняемый файл /linuxrc устанавливает /proc/sys/kernel/real-root-dev, размонтирует /proc,
нормальную корневую файловую систему и все другие файловые системы, которые он монтировал, а затем
завершает работу.
(6) Затем ядро монтирует нормальную корневую файловую систему.
(7) Теперь, поскольку файловая система доступна и полноценна, может быть установлен системный загрузчик.
(8) Системный загрузчик настраивается так, чтобы загружать в /dev/initrd файловую систему с набором
модулей, которые были использованы для запуска системы в первый раз (например, устройство /dev/ram0
может быть изменено, затем размонтировано и, наконец, образ записывается из /dev/ram0 в файл).
(9) Система теперь может загружаться, и можно выполнять дополнительные действия по установке.
Ключевая роль /dev/initrd в вышеописанном механизме — в повторном использовании данных настройки во время
нормальных действий системы без необходимости начального выбора ядра, загрузки ядра большего размера или
пересборки ядра.
Второй вариант, где пригодится initrd — установка Linux на системы с различными наборами оборудования в
одной обслуживаемой сети. В таких случаях может быть желательно использовать лишь небольшой набор ядер (в
идеале — одно) и поддерживать как можно меньше по объему специфических изменений под конкретные системы.
В этом случае создайте общий файл со всеми необходимыми модулями. После этого будет разным только файл
/linuxrc или файл, запускаемый /linuxrc.
Третий вариант — более удобные диски восстановления системы. Поскольку информация, например расположение
раздела корневой файловой системы, не нужна во время начальной загрузки, загруженная с /dev/initrd
система может использовать диалоговый режим и/или автоматическое определение с последующей, возможно,
проверкой правильности.
И наконец, дистрибутивы Linux на CD-ROM могут использовать initrd для упрощения установки с CD-ROM.
Дистрибутив может использовать LOADLIN для непосредственной загрузки /dev/initrd с CD-ROM без
необходимости в дискетах. Дистрибутив также может использовать загрузочную дискету LILO и затем
запускаться с помощью /dev/initrd с большего RAM-диска, находящегося на CD-ROM.
ФАЙЛЫ
/dev/initrd
/dev/ram0
/linuxrc
/initrd
ЗАМЕЧАНИЯ
• В текущем ядре все файловые системы, которые остаются смонтированными, когда /dev/ram0 перемещается из
/ в /initrd, остаются доступными. Между тем, элементы /proc/mounts не обновляются.
• В текущем ядре, если каталог /initrd не существует, то /dev/ram0 НЕ будет полностью размонтирован,
если /dev/ram0 используется какими-либо процессами или на нём смонтирована какая-либо файловая
система. Если /dev/ram0 НЕ размонтирован полностью, то /dev/ram0 остаётся в памяти.
• При использовании /dev/initrd не нужно полагаться на поведение, описанное ранее. Поведение ядра Linux
может измениться в будущих версиях.
СМ. ТАКЖЕ
chown(1), mknod(1), ram(4), freeramdisk(8), rdev(8)
Файл Documentation/admin-guide/initrd.rst (или Documentation/initrd.txt до Linux 4.10) из дерева
исходного кода ядра Linux, документация к LILO, документация к LOADLIN, документация к SYSLINUX.
ПЕРЕВОД
Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy
S. Seregin <dseregin@59.ru>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3
или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо
на man-pages-ru-talks@lists.sourceforge.net.
Linux man-pages 6.03 5 февраля 2023 г. initrd(4)