В документации ядра объясняется, как упаковать образ в само ядро. Из kernel.org :
Что такое rootfs?
Rootfs
- это особый экземплярramfs
(илиtmpfs
, ] если это включено), который всегда присутствует в системах 2.6. Вы не можете размонтироватьrootfs
примерно по причине, по которой вы не можете убить процесс инициализации; вместо того, чтобы иметь специальный код для проверки и обработки пустого списка, ядру меньше и проще просто следить за тем, чтобы определенные списки не могли стать пустыми.Большинство систем просто монтируют другую файловую систему поверх
rootfs
и игнорируют ее. Пустой экземпляр ramfs занимает крошечное место.Если CONFIG_TMPFS включен,
rootfs
по умолчанию будет использоватьtmpfs
вместоramfs
. Чтобы заставитьramfs
, добавить"rootfstype = ramfs"
в командную строку ядра.Что такое initramfs?
Все ядра Linux 2.6 содержат архив в формате gzip
«cpio»
, который извлекается вrootfs
при загрузке ядра вверх. После распаковки ядро проверяет, содержит лиrootfs
файл"init"
, , и если да, то выполняет его как PID 1. ] Если обнаружен, этот процессinit
отвечает за доведение системы до конца, включая обнаружение и установку настоящего корневого устройства (если есть). Еслиrootfs
не содержит программуinit
после извлечения в него встроенного архиваcpio
, ядро перейдет к старому коду, чтобы найти и смонтируйте корневой раздел, затем выполните из него какой-нибудь вариант/ 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 необходимо передать управление, он может перемонтировать / с новым корневым устройством и выполнить другую программу инициализации. См. Служебную программу switch_root ниже.)
При переключении другого корневого устройства initrd будет pivot_root, а затем размонтировать ramdisk. Но initramfs - это rootfs: вы не можете ни pivot_root rootfs, ни размонтировать его. Вместо этого удалите все из rootfs, чтобы освободить место (найдите -xdev / -exec rm '{}' ';'), перемонтируйте rootfs с новым корнем (cd / newmount; mount --move. /; Chroot .), прикрепите stdin / stdout / stderr к новому / dev / console и выполните новый init.
Поскольку это чрезвычайно привередливый процесс (и включает в себя удаление команд перед их запуском), в пакете klibc появилась вспомогательная программа (utils / run_init.c), которая сделает все это за вас. Большинство других пакетов (например, busybox) назвали эту команду «каталог-переключателя».
Заполнение файлов initramfs:
Процесс сборки ядра 2.6 всегда создает архив initramfs в формате gzip cpio и связывает его с полученным двоичным файлом ядра. По умолчанию этот архив пуст (занимает 134 байта на x86).
Параметр конфигурации CONFIG_INITRAMFS_SOURCE (в General Setup в
menuconfig,
и проживание вusr / Kconfig
) можно использовать для указания исходный код для архиваinitramfs
, который автоматически включается в полученный двоичный файл. Этот параметр может указывать на * существующий gzippedcpio
* архив, каталог , содержащий файлы для архивации, или текст спецификация файла, например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 {{1} } 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
не требуется для установки разрешений или создания узлов устройств в новом архиве.(Обратите внимание на , что эти два примера записей «файл» ожидают найти файлы с именами «
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
ядра во время сборки полностью самодостаточен, и экстрактор времени загрузки ядра также (очевидно) самодостаточный.
Похоже, fdisk
и fsck
использовали кешированные данные даже после выдачи partprobe
. Это заставило fdisk использовать неправильную таблицу разделов и fsck неправильный суперблок.
Я попытался перезагрузить машину, и fdisk, и fsck сообщили об ожидаемых результатах, но, кроме того, такие же результаты для физического диска и LV.
Я ожидал, что FS может сообщать об ошибках (все 4 ТБ, но 2 МБ были восстановлены с исходного диска на LV ), но я смонтировал раздел на физическом диске, и файлы оказались в порядке.
Возможно, будет проще вручную создать новую таблицу разделов на целевом жестком диске/sdd, заново создать файловую систему (с )и скопировать данные с диска LVM -.
Я лично использую для этого rsync -avxHAX (source) (target)
.