Во время первой фазы ядро запускает и монтирует начальную корневую файловую систему из содержимого /dev/initrd (например, RAM-диска, инициализируемого загрузчиком). Во время второй фазы из начального содержимого корневого устройства загружаются дополнительные драйвера или другие модули. После загрузки дополнительных модулей с другого устройства монтируется новая корневая файловая система (т.е., нормальная корневая файловая система).
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).
Кроме того, /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
Возможный сценарий инсталляции системы - следующий:
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.
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-диска не может быть загружен как модуль.
2. В текущем ядре если каталог /initrd не существует, то /dev/ram0 НЕ будет полностью размонтировано, если /dev/ram0 используется какими-либо процессами или на нем смонтирована какая-либо файловая система. Если /dev/ram0 НЕ размонтируется полностью, то /dev/ram0 остается в памяти.
3. При использовании /dev/initrd не нужно полагаться на поведение, описанное в предыдущих примечаниях. Поведение ядра может измениться в будущих его версиях.
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |