Initramfs/Guide/ru

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

Введение
For many users, an initramfs system is of no concern. Their system uses a simple partitioning schema with no exotic drivers or setups (like encrypted file systems), so the Linux kernel is entirely capable to hand over control to the binary on their system. But for many systems, an initramfs is mandatory.

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

Процесс загрузки Linux
Once the Linux kernel has control over the system (which it gets after being loaded by the boot loader), it prepares its memory structures and drivers. It then hands over control to an application (usually ) whose task it is to further prepare the system and make sure that, at the end of the boot process, all necessary services are running and the user is able to log on. The application does that by launching, among other services, the  daemon who will further load up and prepare the system based on the detected devices. When is launched, all remaining file systems that have not been mounted are mounted, and the remainder of services is started.

For systems where all necessary files and tools reside on the same file system, the application can perfectly control the further boot process. But when multiple file systems are defined (or more exotic installations are done), this might become a bit more tricky:


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


 * If the root file system is encrypted, then the Linux kernel will not be able to find the application, resulting in an unbootable system.

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

Корневой диск для начальной инициализации (initial root disk)
The initrd is an in-memory disk structure (ramdisk) that contains the necessary tools and scripts to mount the needed file systems before control is handed over to the application on the root file system. The Linux kernel triggers the setup script (usually called but that name is not mandatory) on this root disk, which prepares the system, switches to the real root file system and then calls.

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


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


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

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

Файловая система в памяти для начальной инициализации (initramfs)
An initramfs is an initial ram file system based on tmpfs (a size-flexible, in-memory lightweight file system), which also did not use a separate block device (so no caching was done and all overhead mentioned earlier disappears). Just like the initrd, it contains the tools and scripts needed to mount the file systems before the binary on the real root file system is called. These tools can be decryption abstraction layers (for encrypted file systems), logical volume managers, software raid, bluetooth driver based file system loaders, etc.

The content of the initramfs is made by creating a cpio archive. is an old (but proven) file archiver solution (and its resulting archive files are called cpio files). cpio is definitely comparable to the archiver. The choice of here was because it was easier to implement (code-wise) and supported (back then) device files which   could not.

All files, tools, libraries, configuration settings (if applicable), etc. are put into the cpio archive. This archive is then compressed using the utility and stored alongside the Linux kernel. The boot loader will then offer it to the Linux kernel at boot time so the kernel knows an initramfs is needed.

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

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

Введение и настройка загрузчика
To create an initramfs, it is important to know what additional drivers, scripts and tools will be needed to boot the system. For instance, if LVM is used, then LVM tools will be needed in the initramfs. Likewise, if software RAID is used, utilities will be needed, etc.

Some tools exist that help users create initramfs' (compressed archives) for their system. But for those who want total control can easily create personal, custom initramfs' as well.

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

Использование genkernel
Gentoo's kernel building utility,, can be used to generate an initramfs, even if was not used to configure and build the kernel.

To use for generating an initramfs, it is recommended all necessary drivers and code that is needed to mount the  and  file systems be included in the kernel (not as modules). Then, call as follows:

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

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

Использование dracut
The utility is created for the sole purpose of managing initramfs files. It uses a highly modular approach on what support is to be included and what is not to be included.

To install, make special care to include support for the correct value(s) in the DRACUT_MODULES variable. This variable can be set in to include support for system specific setups:

It is advisable to set (or unset) the modules needed. After configuring the DRACUT_MODULES variable in, to install the Dracut utility.

The next step is to configure by editing. In the configuration file, which is well commented, in order to add support for needed modules.

Once configured, create an initramfs by calling as follows:

The resulting image supports generic system boots based on the configuration in. It is also possible to generate an initramfs specifically tailored to your system (which tries to detect the needed tools, drivers, etc. from the existing system). If the modules and drivers are built into the kernel (not as separate modules and references to the firmware), then the  option can be added:

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

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

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

Ссылки

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