Что такое 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 (в General Setup в 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
полностью автономен, а экстрактор времени загрузки ядра (очевидно) также самодостаточен.