Зачем мне нужен initramfs?

Зачем мне нужен initramfs?

Я обнаружил, что если я выберу jffsили sdв качестве файловой системы (а не initramfs), размер ядра будет очень маленьким (1,4 МБ по сравнению с initramfs3,4 МБ). Это означает, что он initramfsзанимает значительно больше места. Так что если я могу, я бы полностью удалил его, и таким образом получил бы очень маленькое ядро, что мне и нужно.

Основной вопрос, который приходит мне в голову: Зачем мне это нужно initramfs? Разве ядро ​​Linux не может загрузиться без какой-либо начальной файловой системы?

Мое конечное приложение будет выполнять только вычисления и коммуникацию - никакого хранения вообще. Поэтому ОС без файловой системы имеет смысл - по крайней мере для моего приложения.

решение1

Увеличение размера при наличии initramfs происходит не из-за драйвера ramfs (он всего несколько кБ и в любом случае нужен для других целей), а из-за самого initramfs. Initramfs содержит программы, необходимые для сборки и монтирования настоящей корневой файловой системы.

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

Ядро, конечно, должно загружаться в файловую систему: должен быть какой-то способ загрузить любое приложение, которое вы хотите запустить. Если вы не собираетесь ничего запускать, то вы можете также выключить машину.

Если вы не хотите использовать initramfs, просто скажите вашему загрузчику не передавать его. Также не включайте его в вывод сборки ядра, конечно — как это происходит, зависит от архитектуры и загрузчика: например, vmlinuxи bzImageне включайте initramfs (это сырое и сжатое ядро ​​соответственно), но uImage(для U-Boot) упаковывайте и ядро, и initramfs, если он есть.

(Технически, какmikeservпримечания, всегда есть initramfs — но по умолчанию это пустой 134-байтовый архив. То, что вы видите и от чего хотите избавиться, — это «истинный», непустой initramfs, созданный вашим процессом сборки и содержащий инструменты, которые затем используются для монтирования корневой файловой системы.)

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

решение2

ОтЛФС:

Единственная цель initramfs — монтировать корневую файловую систему. Initramfs — это полный набор каталогов, которые вы найдете в обычной корневой файловой системе. Он упакован в один архив cpio и сжат одним из нескольких алгоритмов сжатия.

...

Есть только четыре основные причины иметь initramfs в среде LFS: загрузка rootfs из сети, загрузка с логического тома LVM, наличие зашифрованной rootfs, где требуется пароль, или для удобства указания rootfs как МЕТКИ или UUID. Все остальное обычно означает, что ядро ​​не было настроено должным образом.

...

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

Другой источникwww.kernel.org

Помимо этого, существует множество систем Linux, которые, как и маршрутизаторы, не используют initramfs.

решение3

Вам нужна initramfs для более сложных настроек, таких как сетевая загрузка, или lvm или raid, так как они требуют некоторых утилит пользовательского режима для настройки доступа к корневой файловой системе. Для простого, обычного раздела на диске, если у вас есть встроенные в ядро ​​драйверы диска и вы указываете аргумент root по пути к устройству, а не по UUID, то вы можете обойтись без initramfs. Конечно, путь к устройству может меняться в зависимости от того, какие устройства plug and play (то есть usb) вы подключили, или даже просто от случайных отклонений во времени, поэтому почти все используют uuid и initramfs для надежности.

решение4

Если ваш корневой раздел находится на диске, который использует таблицу разделов MBR, и вы хотите постоянное имя блочного устройства в качестве root=параметра для ядра, вам нужно использовать initramfs. /dev/sdXне является постоянным, PARTUUID=является функцией только GPT и LABEL=и UUID=не видны ядру на ранних этапах загрузки. Initramfs может загружать драйверы хранилища и файловой системы, поэтому LABEL=и UUID=видны ядру.

Связанный контент