Initramfs/Guide/ru

Все больше и больше систем требуют initramfs для правильной загрузки. В этом руководстве будет рассмотрена основная идея initramfs, а также как правильно создать и управлять initramfs на отдельных примерах.

Введение
Для большинства пользователей initramfs не является чем-то необходимым. Их система использует простую схему разбиения жесткого диска без экзотических драйверов или установок (таких как зашифрованные файловые системы), поэтому ядро Linux вполне способно передать управление двоичному файлу  на их системе. Но для большинства систем, использование initramfs обязательно.

Основной ключ к пониманию того, чем является initramfs (или для чего она необходима) - это понимание того, как работает процесс загрузки Linux, даже в достаточно высокоуровневом подходе.

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

Для систем, где все необходимые файлы и инструменты располагаются на той же самой файловой системе, приложение  может в совершенстве управлять дальнейшим процессом загрузки. Но когда определены множественные файловые системы (или в случае более неординарных установок), этот процесс может стать немного более усложненным:


 * В случае, когда раздел размещается на отдельной файловой системе, инструменты и драйвера, чьи файлы хранятся на  не могут использоваться, пока раздел  не станет доступным. Если эти инструменты требуются для предоставления доступа к разделу, то мы не сможем загрузить систему.


 * Если корневой каталог root зашифрован, то ядро Linux не сможет найти приложение, что приведет к незагружаемой системе.

С давних пор решением для этой проблемы является использование "initrd" (initial root device).

Корневой диск для начальной инициализации (initial root disk)
initrd - это дисковая структура в оперативной памяти (ramdisk), которая содержит необходимые инструменты и сценарии для монтирования требуемых файловых систем перед тем как управление передается приложению  на корневой файловой системе. Ядро Linux запускает сценарий настройки (обычно называемый, но это не обязательно так) на этом корневом диске, который подготавливает систему, переключается к действительной корневой файловой системе и затем вызывает.

Хотя способ, включающий в себя initrd - это все, что требуется, он имеет несколько недостатков:


 * Это полноценное блочное устройство, требующее дополнительные расходы на целую файловую систему, располагающуюся на нем, и оно имеет фиксированный размер. Выберите initrd достаточно маленьким, и Вы не сможете уместить все требуемые сценарии. Сделайте его слишком большим, и Вы растратите память впустую.


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

Для решения этих (для кого-то едва-ли) проблем, была создана initramfs.

Файловая система в памяти для начальной инициализации (initramfs)
initramfs - это начальная файловая система в оперативной памяти, основанная на tmpfs (легковесной файловой системе в памяти с изменяемым размером), которая также не использовала отдельное блочное устройство (чтобы отсутствовало кэширование и все накладные расходы, упомянутые ранее, исчезли). Так же как и initrd, она содержит инструменты и сценарии, требуемые для монтирования файловых систем перед вызовом двоичного файла, располагающегося на действительной корневой файловой системе. Эти инструменты могут быть уровнями абстракции расшифровывающих процедур (для зашифрованных файловых систем), менеджерами логических томов, программными (software) raid массивами, загрузчиками файловых систем, основанными на драйверах bluetooth, и т.д.

Содержимое initramfs делается путем создания -архива. - это старое (но проверенное) решение для архивирования файлов (архивы, получаемые в результате его работы называются cpio-архивы). Вы определенно можете сравнить его с. Здесь  был выбран потому, что проще создать (с программной точки зрения) и поддерживать (на то время) файлы устройств (тогда как   этого не мог).

Все файлы, инструменты, библиотеки, настройки конфигурации (если они применимы), и т.д. помещаются в cpio-архив. Этот архив затем сжимается с использованием утилиты  и сохраняется в том же месте, что и ядро Linux. Далее, загрузчик передаст его ядру Linux во время загрузки, чтобы ядро знало о том, что требуется initramfs.

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

Как только корневая файловая система и другие существенные файловые системы примонтированы, сценарий  из initramfs затем переключает root на действительную корневую файловую систему и, в завершение, вызывает   на этой системе, для продолжения процесса загрузки.

Введение и настройка загрузчика
Для создания initramfs, важно чтобы Вы знали какие дополнительные драйверы, сценарии и инструменты Вам необходимы для загрузки Вашей системы. Например, если Вы используете LVM, то Вам потребуется поддержка инструментов LVM на initramfs. Таким же образом, если Вы используете программный RAID, Вам нужен, и т.д.

Существуют несколько инструментов, которые помогут Вам создать initramfs (сжатые -архивы) для Вашей системы. Но для тех, кому требуется полный контроль, также потребуется создать свою собственную initramfs.

После создания initramfs, Вам необходимо настроить конфигурацию загрузчика для сообщения загрузчику, что будет использоваться initramfs. Например, если файл initramfs сохранен как, то конфигурация в будет выглядеть следующим образом:

Использование genkernel
Утилита для сборки ядра Gentoo,, может использоваться для генерирования initramfs, даже если Вы не использовали   для конфигурации и сборки ядра.

Чтобы использовать  для генерации initramfs, рекомендуется чтобы Вы включили все необходимые драйверы и код, который требуется для монтирования Ваших  и  файловых систем, в ядро (а не как модули). Затем, вызовите genkernel следующим образом:

В зависимости от Вашей системы, Вы можете пожелать добавить одну или более из следующих опций:

По завершении, файл initramfs, полученный в результате, будет сохранен в.

Использование dracut
Утилита  создана с единственной целью управления файлами initramfs. Она использует модульный подход в том, поддержку чего Вам требуется включить, и чего нет.

При установке, Вам нужно позаботиться о включении поддержки корректных модулей dracut -. Это переменная, которую Вы можете установить в, чтобы включить поддержку специфических настроек:

Рекомендуется установить (или убрать) те модули, которые Вам требуются (и не требуются). После этого, введите команду emerge dracut для установки утилиты Dracut на Вашу систему.

Следующим шагом является конфигурация  посредством редактирования. В файле конфигурации, который хорошо прокомментирован, Вы можете включить поддержку специфичных модулей там, где это требуется.

После конфигурации, создайте initramfs вызовом dracut следующим образом:

Образ, полученный в результате, поддерживает общую загрузку системы, основанную на конфигурации в. Вы также можете выбрать генерирование initramfs специально приспособленной под вашу систему (в которой  пытается определить необходимые инструменты, драйверы, и т.д. из вашей существующей системы). Если Вы знаете, что требуемая поддержка (код и драйвера) встроена в ядро (не в качестве модуля), то Вы можете добавить опцию --no-kernel:

Чтобы найти больше информации, проконсультируйтесь с man-страницами  и.

Смотрите также

 * Initramfs на официальной Gentoo Wiki
 * Dracut на официальной Gentoo Wiki

Ссылки

 * ramfs-rootfs-initramfs.txt в документации ядра Linux