initrd(4)

НАИМЕНОВАНИЕ
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. Устройство, определяемое этим параметром, должно быть монтируемым устройством, имеющим подходящую корневую файловую систему.

  Смена нормальной корневой файловой системы
By default, the kernel's settings (e.g., set in the kernel file with rdev(8) or compiled into the kernel file), or the boot loader option setting is used for the normal root filesystems. For an NFS-mounted normal root filesystem, one has to use the nfs_root_name and nfs_root_addrs boot options to give the NFS settings. For more information on NFS-mounted root see the kernel documentation file Documentation/filesystems/nfs/nfsroot.rst. For more information on setting the root filesystem see also the LILO and LOADLIN documentation.

Также сменить нормальное корневое устройство можно из /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

Note: The use of /proc/sys/kernel/real-root-dev to change the root filesystem is obsolete. See the Linux kernel source file Documentation/admin-guide/initrd.rst as well as pivot_root(2) and pivot_root(8) for information on the modern method of changing the root filesystem.

  Использование
Основной причиной реализации 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 in the Linux kernel source tree, the LILO documentation, the LOADLIN documentation, the SYSLINUX documentation

ПЕРЕВОД
Русский перевод этой страницы руководства разработал(и) Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков (debian-l10n-russian@lists.debian.org).