INITRD(4)

ИМЯ
initrd - RAM-диск, инициализируемый загрузчиком

ОПИСАНИЕ
Специальный файл /dev/initrd - это блочное устройство только для чтения. Устройство /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. Имя файла, определяемое этой опцией, обычно является образом файловой системы, сжатым программoй gzip.

noinitrd
    Эта загрузочная опция отменяет двухфазную процедуру загрузки. Ядро проделывает обычную процедуру загрузки так, если бы /dev/initrd не был инициализировано. С этой опцией все содержимое /dev/initrd , загруженное в память загрузчиком, сохраняется. Эта опция разрешает содержимому /dev/initrd быть любыми данными, не ограничивая их образом файловой системы. Однако, устройство /dev/initrd доступно только для чтения и может быть прочитано только один раз после запуска системы.

root=имя устройства
    Определяет устройство, которое должно быть использовано в качестве нормальной корневой файловой системы. Для LOADLIN это опция командной строки. Для LILO это опция определяется во время загрузки или строкой в конфигурационном файле LILO - /etc/lilo.config. Устройство, определяемое этой опцией, должно быть монтируемым устройством, имеющим подходящую корневую файловую систему.

СМЕНА НОРМАЛЬНОЙ КОРНЕВОЙ ФАЙЛОВОЙ СИСТЕМЫ
По умолчанию, конфигурация ядра (например, установленная в файле ядра с помощью rdev или на этапе компиляции ядра) или установки загрузчика используются определения нормальной корневой файловой системы. Для NFS-монтируемой нормальной корневой файловой системы нужно использовать загрузочные опции nfs_root_name и nfs_root_addrs для задания установок NFS. За дополнительной информацией по NSF-монтируемой корневой ФС обращайтесь к файлу документации к ядру nfsroot.txt. Также дополнительная информация по установкам корневой файловой системы содержится в документации к LILO и LOADLIN.

Кроме того, /linuxrc может сменить нормальное корневое устройство. Для того, чтобы /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. Для корневой файловой системы NSF корневое устройство меняется, если /linuxrc записывает установки NSF в файлы /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
В качестве примера для NSF, следующие команды изменят нормальное корневое устройство на каталог NSF /var/nfsroot на локальном сетевом NSF-сервере с IP-адресом 193.8.232.7 для системы с IP-адресом 193.8.232.7 и именем '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

ИСПОЛЬЗОВАНИЕ
Основной причиной реализации initrd была потребность в modular (***) конфигурации ядра во время инсталляции системы.

Возможный сценарий инсталляции системы - следующий:

    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 в вышеописанном механизме в повторном использовании данных конфигурации во время нормальных действий системы без необходимости начального выбора ядра, загрузки огромного общего ядра или перекомиляции ядра.

Второй сценарий предназначен для установки Linux на системы с различной конфигурацией оборудования в одной административной сети. В таких случаях может быть желательно использовать лишь небольшой набор ядер (в идеале - одно) и сделать специфическую для конкретной системы часть данных о конфигурации как можно меньшей по объему. В этом случае создайте общий файл со всеми необходимыми модулями. После этого, только файл /linuxrc или файл, запускаемый /linuxrc будет разным для разных конфигураций.

Третий сценарий предназначен для более удобных дисков восстановления системы. Поскольку информация, такая как расположение раздела корневой файловой системы не нужна во время начальной загрузки, загруженная с /dev/initrd система может использовать диалоговый режим и/или автоопределение с последующей, возможно, проверкой "на дурака".

И наконец, дистрибутивы Linux на CD-ROM могут использовать initrd для легкой инсталляции с CD-ROM. Дистрибутив может использовать LOADLIN для непосредственной загрузки /dev/initrd с CD-ROM без необходимости в дискетах. Дистрибутив также может использовать загрузочную дискету LILO и затем загрузить больший ram-диск с помощью /dev/initrd с CD-ROM.

КОНФИГУРАЦИЯ
/dev/initrd - это блочное устройство только для чтения со старшим номером 1 и младшим номером 250. Обычно владельцем /dev/initrd является root.disk с правами доступа 0400 (доступ на чтение только для root). Если в система на основе Linux не создано устройство /dev/initrd , оно может быть создано следующими командами:

        mknod -m 400 /dev/initrd b 1 250
        chown root:disk /dev/initrd

Также поддержка RAM-диска и начального RAM-диска (например, CONFIG_BLK_DEV_RAM=y и CONFIG_BLK_DEV_INITRD=y ) должна быть обеспечена соответствующими установками на этапе компиляции ядра, чтобы оно могло использовать /dev/initrd. При использовании /dev/initrd драйвер RAM-диска не может быть загружен как модуль.

ФАЙЛЫ
/dev/initrd
/dev/ram0
/linuxrc
/initrd

СМ. ТАКЖЕ
chown(1), mknod(1), /dev/ram(4), freeramdisk(8), rdev(8), Файл документации initrd.txt из пакета исходных текстов ядра, документацию LILO, документацию LOADLIN, документацию SYSLINUX.

ПРИМЕЧАНИЯ
1. В текущем ядре все файловые системы, которые остаются смонтированными, когда /dev/ram0 перемещается из / в /initrd, остаются доступными. Между тем, элементы /proc/mounts не обновляются.

2. В текущем ядре если каталог /initrd не существует, то /dev/ram0 НЕ будет полностью размонтировано, если /dev/ram0 используется какими-либо процессами или на нем смонтирована какая-либо файловая система. Если /dev/ram0 НЕ размонтируется полностью, то /dev/ram0 остается в памяти.

3. При использовании /dev/initrd не нужно полагаться на поведение, описанное в предыдущих примечаниях. Поведение ядра может измениться в будущих его версиях.

АВТОР
Код ядра для устройства initrd был написан Werner Almesberger <almesber@lrc.epfl.ch> и Hans Lermen <lermen@elserv.ffm.fgan.de>. Код для initrd был добавлен в базовую версию ядра Linux в версии разработки 1.3.73.