Я обнаружил, что если я выберу jffs
или в sd
качестве файловой системы (а не initramfs
), размер ядра будет очень маленьким (1,4 МБ по сравнению с initramfs
3,4 МБ). Это означает, что initramfs
занимает значительно больше места. Так что если бы я мог, я бы полностью удалил его, и, таким образом, у меня было бы очень маленькое ядро, чего я и хочу.
Основной вопрос, который возникает у меня в голове: «Зачем мне это нужно initramfs
? Ядро Linux не может загрузиться без какой-либо начальной файловой системы
Мое конечное приложение будет выполнять только расчеты и связь - без хранения вообще. Поэтому ОС без файловой системы имеет смысл - по крайней мере, для моего приложения.
/root
вот и все. Единственное, что он делает по-другому, - этоswitch_root
то, что даже в том случае, если при определенных загруженных модулях ядра соблюдаются надлежащие меры предосторожности, это можно сделать в любое время. Initramfs - это не что иное, как образ диска - заполнен или нет, он есть. И ты никогда не без этого - ведь это твой корень. Это просто не должно быть загадкой, это то, что я думаю, и мне не нравится вся ненужная путаница вокруг этого.Ответы:
Увеличение размера наличия initramfs происходит не из-за драйвера ramfs (это всего лишь несколько килобайт и все равно нужно для других вещей), а из-за самого initramfs. Initramfs содержит программы, необходимые для сборки и монтирования настоящей корневой файловой системы.
Initramfs делает
/
загрузку системы намного проще, а в некоторых случаях (например, зашифрованной ). Настоятельно рекомендуется хранить его на оборудовании в стиле ПК с большим количеством подключаемых периферийных устройств. С другой стороны, имеет смысл загружать встроенное устройство без каких-либо initramfs, с ядром, которое просто поддерживает конкретную аппаратную конфигурацию, для которой оно построено.Разумеется, ядро должно загружаться с файловой системы: должен быть какой-то способ загрузить любое приложение, которое вы хотите запустить. Если вы не собираетесь ничего запускать, то вы можете оставить машину выключенной.
Если вы не хотите использовать initramfs, просто скажите вашему загрузчику, чтобы он не пропускался. Также, конечно, не включайте один в вывод сборки ядра - как это происходит, если вообще зависит от архитектуры и загрузчика: например,
vmlinux
иbzImage
не включайте initramfs (они являются сырым и сжатым ядром соответственно ), ноuImage
(для U-Boot) упаковывает и ядро, и initramfs, если он есть.(Технически, как отмечает mikeserv , всегда есть initramfs - но по умолчанию это пустой 134-байтовый архив. То, что вы видите и хотите от него избавиться, - это «истинные», непустые initramfs, созданные ваш процесс сборки и содержащие инструменты, которые затем используются для монтирования корневой файловой системы.)
Имейте в виду, initramfs может быть разумным способом создания системы из одного приложения без постоянных данных: поместите все свое приложение в initramfs, загрузите его и сохраните. Это облегчает организацию вашего постоянного хранилища или загрузочного образа (все, что вам нужно - это ядро и initramfs, которые можно объединить). Однако у этого подхода есть свои недостатки: все данные в initramfs будут постоянно храниться в оперативной памяти, и вы не можете легко изменить файлы в образе загрузки, вам нужно перестроить архив.
источник
Из LFS :
...
...
Другой источник www.kernel.org
Кроме того, есть много систем Linux, которые любят маршрутизаторы, которые не используют initramfs.
источник
Вам нужен initramfs для более сложных установок, таких как загрузка по сети, lvm или raid, поскольку для настройки доступа к корневому файлу требуются утилиты пользовательского режима. Для простого обычного раздела на диске, если у вас есть встроенные в ядро драйверы дисков и вы указываете корневой аргумент по пути к устройству, а не по UUID, вы можете обойтись без initramfs. Конечно, путь к устройству может меняться в зависимости от того, какие подключенные устройства (например, usb) вы подключили, или даже от случайных временных вариаций, поэтому почти все используют uuids и initramfs для надежности.
источник
Это старый вопрос, но все еще не получен принятый ответ, поэтому я добавлю его туда (я здесь не эксперт, я пытаюсь выяснить это для себя).
С https://www.kernel.org/doc/Documentation/early-userspace/README (полностью внизу, где говорится, что оно не обновлялось с 2004 года.)
Я считаю, что устройства / дистрибутивы, такие как Raspberry Pi и т. Д., Не используют initramfs; в некоторых случаях ядро находится в корневом разделе (смонтирован загрузчиком, имеющим необходимые модули fs.) В других случаях, когда ядро находится, например, в
/boot
разделе, к initramfs в этом же разделе можно обращаться непосредственно перед монтированием rootfs, как и другие. заявили.В некоторых случаях initramfs может быть встроен в тот же файл, что и ядро, но это не всегда так. (а), кажется, довольно ясно заявляет, что в некоторых случаях initramfs не требуется.
источник
Я нахожу следующее объяснение более ясным,
источник
Неважно, что вы делаете, у вас есть
initramfs
. Без этого не обойтись - это единственная файловая система, навязанная вам. С kernel.org :Что такое rootfs?
Rootfs
это особый экземплярramfs
(илиtmpfs
, если он включен), который всегда присутствует в системах 2.6. Вы не можете размонтироватьrootfs
по той же причине, по которой не можете убить процесс инициализации; вместо того, чтобы иметь специальный код для проверки и обработки пустого списка, ядру меньше и проще просто убедиться, что определенные списки не могут стать пустыми.Большинство систем просто монтируют другую файловую систему
rootfs
и игнорируют ее. Количество места, которое занимает пустой экземпляр ramfs, ничтожно мало.Если * CONFIG_TMPFS * включен,
rootfs
будет использоватьсяtmpfs
вместоramfs
по умолчанию. Чтобы заставитьramfs
, добавьте"rootfstype=ramfs"
в командную строку ядра.Что такое initramfs?
Все 2.6 ядра Linux содержат архив в
"cpio"
форматеgzipped, который извлекаетсяrootfs
при загрузке ядра. После извлечения ядро проверяет,rootfs
содержит ли файл файл"init"
, и если это так, оно выполняет его как PID 1. Если он найден, этотinit
процесс отвечает за доведение системы до конца, включая поиск и подключение реального корневого устройства ( если есть) Еслиrootfs
не содержитinit
программу послевстроенныйcpio
архив извлекается в него, ядро будет проваливаться к старому кодучтобы найти и смонтировать корневой раздел,затем EXEC некоторый вариант/sbin/init
из этого.Все это отличается от старого initrd в нескольких отношениях:
Так как это очень придирчивый процесс (и включает удаление команд до того, как вы сможете их запустить), пакет klibc представил вспомогательную программу (utils / run_init.c), которая сделает все это за вас. Большинство других пакетов (таких как busybox) назвали эту команду "switch_root".
Заполнение initramfs:
Процесс сборки ядра 2.6 всегда создает архив initramfs в формате gzipped cpio и связывает его с результирующим двоичным файлом ядра. По умолчанию этот архив пуст (занимает 134 байта на x86).
Параметр конфигурации CONFIG_INITRAMFS_SOURCE (в общих настройках в menuconfig и в usr / Kconfig) можно использовать для указания источника для архива initramfs, который будет автоматически включен в получившийся двоичный файл. Эта опция может указывать на существующий архив cpio gzipped, каталог, содержащий файлы, которые нужно заархивировать, или спецификацию текстового файла, такую как следующий пример:
Запустите «usr / gen_init_cpio» (после сборки ядра), чтобы получить сообщение об использовании, документирующее указанный выше формат файла.
Одно из преимуществ файла конфигурации заключается в том, что для установки разрешений или создания узлов устройства в новом архиве не требуется root-доступ. (Обратите внимание, что эти две примерные записи «file» ожидают найти файлы с именами «init.sh» и «busybox» в каталоге с именем «initramfs», в каталоге linux-2.6. *. См. Documentation / early-userspace / README для подробнее.)
Ядро не зависит от внешних инструментов cpio. Если вы указываете каталог вместо файла конфигурации, инфраструктура сборки ядра создает файл конфигурации из этого каталога (usr / Makefile вызывает scripts / gen_initramfs_list.sh) и приступает к упаковке этого каталога с помощью файла конфигурации (передавая его usr / gen_init_cpio, который создается из usr / gen_init_cpio.c). Код создания cpio во время сборки ядра полностью автономен, а экстрактор времени загрузки ядра (очевидно) также самодостаточен.
источник
do_mounts.c
частностиprepare_namespace
, в том, чтоsaved_root_name
заполняетсяroot=
аргументом командной строки.