Главная » 2017 » Ноябрь » 19 » man 4 initrd
21:45
man 4 initrd

SEO sprint - Всё для максимальной раскрутки!





ИМЯ


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 завершается и
имеется какая-либо файловая система, примонтированная к начальной корневой
файловой системе, то поведение ядра НЕ ОПРЕДЕЛЕНО. Смотрите подробности о
поведении текущей версии ядра в разделе ЗАМЕЧАНИЯ.
ЗАМЕЧАНИЯ.

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 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 с CD-ROM без необходимости в дискетах. Дистрибутив также
может использовать загрузочную дискету LILO и затем запускаться с помощью
/dev/initrd с большего RAM-диска, находящегося на CD-ROM.



ФАЙЛЫ


/dev/initrd
/dev/ram0
/linuxrc
/initrd



ЗАМЕЧАНИЯ


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

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

3. При использовании /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.



Категория: (4) Специальные файлы (находящиеся обычно в каталоге /dev) | Просмотров: 433 | Добавил: Администратор | Рейтинг: 0.0/0
Всего комментариев: 0
avatar