Неважно, что вы делаете, у вас есть 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 в нескольких отношениях:
Старый initrd всегда был отдельным файлом, а архив initramfs связан с образом ядра linux. (Каталог linux - * / usr предназначен для создания этого архива во время сборки.)
Старый файл initrd представлял собой образ файловой системы в формате gzip (в каком-то формате, например ext2, для которого требовался встроенный в ядро драйвер), в то время как новый архив initramfs представляет собой архив в формате gzip cpio (как и в tar, проще, см. Cpio (1) и Documentation / early-userspace / buffer-format.txt). Код извлечения cpio в ядре не только чрезвычайно мал, но также содержит текст и данные __init, которые могут быть отброшены в процессе загрузки.
Программа, запущенная старым initrd (которая называлась / initrd, а не / init), выполнила некоторую настройку и затем вернулась к ядру, в то время как не ожидается, что программа init из initramfs вернется к ядру. (Если / init нужно передать управление, он может смонтировать / с новым корневым устройством и выполнить другую программу init. См. Утилиту switch_root ниже.)
При переключении другого корневого устройства initrd будет pivot_root, а затем размонтирует виртуальный диск. Но initramfs - это rootfs: вы не можете ни pivot_root rootfs, ни размонтировать его. Вместо этого удалите все из rootfs, чтобы освободить место (find -xdev / -exec rm '{}' ';'), перемонтируйте rootfs с новым корнем (cd / newmount; mount --move. /; Chroot.), присоедините stdin / stdout / stderr к новой / dev / console и выполните новый init.
Так как это очень придирчивый процесс (и включает удаление команд до того, как вы сможете их запустить), пакет 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, каталог, содержащий файлы, которые нужно заархивировать, или спецификацию текстового файла, такую как следующий пример:
dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/loop0 644 0 0 b 7 0
dir /bin 755 1000 1000
slink /bin/sh busybox 777 0 0
file /bin/busybox initramfs/busybox 755 0 0
dir /proc 755 0 0
dir /sys 755 0 0
dir /mnt 755 0 0
file /init initramfs/init.sh 755 0 0
Запустите «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 во время сборки ядра полностью автономен, а экстрактор времени загрузки ядра (очевидно) также самодостаточен.