Initramfs/Руководство
Все больше и больше систем требуют initramfs для правильной загрузки. В этом руководстве будет рассмотрены основные понятия initramfs, а также как правильно создать и управлять initramfs на отдельных примерах.
Основные понятия initramfs
Введение
Для большинства пользователей initramfs не является чем-то необходимым. Их система использует простую схему разбиения жесткого диска без экзотических драйверов или установок (таких как зашифрованные файловые системы), поэтому ядро Linux вполне способно передать управление двоичному файлу init на их системе. Но для большинства систем, использование initramfs почти обязательно.
Процесс загрузки Linux
Как только ядро Linux получает контроль над системой (который был передан ему после загрузки загрузчиком), оно подготавливает свои области памяти и драйвера. Затем оно передает управление приложению (обычно init), чьей задачей является дальнейшая подготовка системы и проверка того, что в конце процесса загрузки, все необходимые сервисы запущены и пользователь способен войти в систему. Приложение init делает это с помощью запуска, в числе прочих сервисов, демона udev, который далее загружает и подготавливает систему, основываясь на обнаруженных устройствах. Когда udev запущен, все оставшиеся файловые системы, которые не были примонтированы, монтируются, и запускаются остальные сервисы.
Для систем, где все необходимые файлы и инструменты располагаются на той же самой файловой системе, приложение init может в совершенстве управлять дальнейшим процессом загрузки. Но когда определены множественные файловые системы (или в случае более неординарных установок), этот процесс может стать немного более усложненным:
- В случае, когда раздел /usr размещается на отдельной файловой системе, инструменты и драйвера, чьи файлы хранятся на /usr не могут использоваться, пока раздел /usr не станет доступным. Если эти инструменты требуются для предоставления доступа к разделу /usr, то мы не сможем загрузить систему.
- Если файловая система root зашифрована, то ядро Linux не сможет найти приложение init и это приведет к тому что система не сможет загрузиться.
С давних пор решением для этой проблемы является использование initrd (initial root device).
Корневой диск для начальной инициализации (initial root disk)
initrd — это дисковая структура в оперативной памяти (ramdisk), которая содержит необходимые инструменты и скрипты для монтирования требуемых файловых систем перед тем как управление передается приложению init на корневой файловой системе. Ядро Linux запускает скрипт настройки (обычно называемый linuxrc, но не обязательно такое имя) на этом корневом диске, который подготавливает систему, переключается к действительной корневой файловой системе и затем вызывает init.
Хотя способ, включающий в себя initrd - это все, что требуется, он имеет несколько недостатков:
- Это полноценное блочное устройство, требующее дополнительные расходы на целую файловую систему, и оно имеет фиксированный размер. Если выбрать initrd достаточно маленьким, то все требуемые скрипты не поместятся. Если сделайте его слишком большим, то растратите память впустую.
- По той причине, что это действительное устройство, оно также требует кэш-память ядра Linux и подлежит используемым методам управления памятью и файлами (таким как подкачка страниц), что делает расходы памяти еще более худшими.
Чтобы решить эти вопросы, была создана initramfs.
Файловая система в памяти для начальной инициализации (initramfs)
initramfs - это начальная файловая система в оперативной памяти, основанная на tmpfs (легковесной файловой системе в памяти с изменяемым размером), которая также не использовала отдельное блочное устройство (чтобы отсутствовало кэширование и все накладные расходы, упомянутые ранее, исчезли). Так же как и initrd, она содержит утилиты и скрипты, требуемые для монтирования файловых систем перед вызовом бинарного файла init, располагающегося на действительной корневой файловой системе. Эти утилиты могут быть уровнями абстракции расшифровывающих процедур (для зашифрованных файловых систем), менеджерами логических томов, программными (software) raid массивами, загрузчиками файловых систем, основанными на драйверах bluetooth, и так далее.
Содержимое initramfs делается путем создания cpio-архива. cpio — это старое (но проверенное) решение для архивирования файлов (архивы, получаемые в результате его работы, называются cpio-архивы). Безусловно, cpio можно сравнить с tar архиватором. Здесь cpio был выбран потому, что проще создать (с программной точки зрения) и поддерживать (на то время) файлы устройств (тогда как tar этого не мог).
Все файлы, утилиты, библиотеки, настройки конфигурации (если они применимы), и т.д. помещаются в cpio-архив. Этот архив затем сжимается с использованием утилиты gzip и сохраняется в том же месте, что и ядро Linux. Далее, загрузчик передаст его ядру Linux во время загрузки, чтобы ядро знало о том, что требуется initramfs.
При его обнаружении, ядро Linux создаст файловую систему tmpfs, извлечет на нее содержимое архива и затем запустит init-скрипт, расположенный в корневом каталоге файловой системы tmpfs. Этот скрипт затем примонтирует действительную корневую файловую систему (после того, как убедится, что он может ее примонтировать, например, с помощью загрузки дополнительных модулей, подготовки уровней абстракции шифрования, и т.д.), также как и другие существенно важные файловые системы (такие как /usr и /var).
Как только корневая файловая система и другие существенные файловые системы примонтированы, init-скрипт из initramfs затем переключает root на действительную корневую файловую систему и, в завершение, вызывает /sbin/init на этой системе, для продолжения процесса загрузки.
Создание initramfs
Введение и настройка загрузчика
Для создания initramfs, важно знать какие дополнительные драйверы, скрипты и утилиты необходимы для загрузки системы. Например, если используется LVM, то потребуется инструменты LVM в initramfs. Таким же образом, если используется программный RAID, будут нужна утилита mdadm, и так далее.
The root disk and root filesystem needs to be accessible
In practice, this usually means CONFIG_SATA_AHCI or CONFIG_BLK_DEV_NVME (for the disk), and CONFIG_EXT4_FS (the filesystem) should ideally be built-in [=y] to the kernel; otherwise having these as modules [=m] will require these modules to be loaded by the initramfs first so booting can continue.
If LVM is used, then LVM tools will be needed in the initramfs.
If software RAID is used, mdadm utilities will be needed, or DMRAID, etc... ZFS and BTRFS would also require consideration here.
Существуют несколько инструментов, которые помогут создать initramfs (сжатые cpio-архивы) для системы. Тем, кому требуется полный контроль, также могут легко создать собственный, пользовательский образ initramfs.
После создания initramfs, необходимо настроить конфигурацию загрузчика для сообщения загрузчику, что будет использоваться initramfs. Например, если файл initramfs сохранен как /boot/initramfs-3.2.2-gentoo-r5, то конфигурация в /boot/grub/grub.conf будет выглядеть следующим образом:
Usually this is done by re-generating the config file grub-mkconfig -o /boot/grub/grub.cfg
For instance, if the initramfs file is stored as /boot/initramfs-5.15.32-gentoo-r1.img, then afterwards, the GRUB configuration in /boot/grub/grub.cfg would look somewhat like the following:
title Gentoo Linux 3.2.2-r5
root (hd0,0)
kernel /boot/kernel-3.2.2-gentoo-r5
initrd /boot/initramfs-3.2.2-gentoo-r5
Использование genkernel
Утилита для сборки ядра Gentoo, genkernel, может использоваться для генерирования initramfs, даже если не использовался genkernel для конфигурации и сборки ядра.
Чтобы использовать genkernel для генерации initramfs, рекомендуется все необходимые драйверы и код, который требуется для монтирования / и /usr файловых систем, включить в ядро (а не как модули). Затем, вызвать команду genkernel следующим образом:
If modules are required in the initramfs, call genkernel as follows:
root #
genkernel --install --no-ramdisk-modules initramfs
В зависимости от системы, одна или более из следующих опций могут быть необходимы:
Опция | Описание |
---|---|
--disklabel
|
Включить поддержку LABEL= настроек в файл /etc/fstab
|
--dmraid
|
Включить поддержку fake hardware RAID |
--firmware
|
Включить firmware code, найденный на системе |
--gpg
|
Включить поддержку GnuPG |
--iscsi
|
Включить поддержку iSCSI |
--luks
|
Включить поддержку зашифрованных контейнеров luks |
--lvm
|
Включить поддержку LVM |
--mdadm
|
Включить поддержку программного (software) RAID |
--multipath
|
Включить поддержку множественного I/O-доступа к SAN |
--zfs
|
Включить поддержку ZFS |
По завершении, файл initramfs, полученный в результате, будет сохранен в каталоге /boot.
Использование dracut
Утилита dracut создана с единственной целью управления файлами initramfs. Она использует весьма модульный подход в плане выбора поддержки; что требуется включить, а что нет.
Рекомендуется установить (или убрать) необходимые модули. После настройки переменной DRACUT_MODULES в файле /etc/portage/make.conf запустите команду emerge dracut для установки утилиты Dracut.
root #
emerge --ask sys-kernel/dracut
Далее необходимо настроить dracut посредством редактирования /etc/dracut.conf. В файле конфигурации, который хорошо прокомментирован, включите поддержку необходимых модулей.
После конфигурации, создайте initramfs вызовом dracut следующим образом:
root #
dracut
Образ, полученный в результате, поддерживает общую загрузку системы, основанную на конфигурации в /etc/dracut.conf. Также, можно выбрать генерирование initramfs специально приспособленной под вашу систему (в которой dracut пытается определить необходимые инструменты, драйверы, и так далее из существующей системы). Если модули и драйверы встроены в ядро (не отдельными модулями и ссылками на firmware), то можно добавить опцию --no-kernel
:
root #
dracut --host-only --no-kernel
Чтобы найти больше информации, проконсультируйтесь с man-страницами:
user $
man dracut
user $
man dracut.cmdline
Смотрите также
Ссылки
- ramfs-rootfs-initramfs.txt файл в документации ядра Linux.