unixforum.org
Обнаружил, что Мандрива и Дебиан в раздел /boot «кинули» свои ядра а так же странные файлы initrd.img. Соответственно в /boot/grub/menu.lst в разделах для Мандривы и Дебиана есть строки с указанием на эти файлы.
Зенвок такой файл почему-то не создал.
По FAQ`ам GRUB часто не упоминается об этих файлах.
Так что же это такое: нужен он или нет?
P-IV 2.66 GHz; 768Mb RAM; Nvidia GeForce FX-5200; hda: IDE 160Gb; hdb: IDE 250Gb; Monitor: Acer AL1916WAs.
Linux user number: 460542
Как монтировать initrd.img ?
Обычно это cpio-архив. Соответственно, распаковывать при помощи cpio.
Deleted
( 24.03.19 01:30:19 MSK )
Ответ на: комментарий от Deleted 24.03.19 01:30:19 MSK
$ file initrd.img-4.18.0-16-generic initrd.img-4.18.0-16-generic: ASCII cpio archive (SVR4 with no CRC)
superuser ★★★★
( 24.03.19 01:33:42 MSK ) автор топика
Ответ на: комментарий от Deleted 24.03.19 01:30:19 MSK
Обычно это cpio-архив. Соответственно, распаковывать при помощи cpio.
вот тут Параметр ядра «recovery» пытался при помощи cpio и никак
superuser ★★★★
( 24.03.19 01:35:38 MSK ) автор топика
Ответ на: комментарий от superuser 24.03.19 01:35:38 MSK
Возможно там не один архив, а два или больше. Ядро такое позволяет, при загрузке просто распаковывая их по очереди.
Если после незапакованного cpio идёт cpio.gz (как у меня на федоре), то однострочник для распаковки будет примерно таким:
(cpio -ivd && gunzip | cpio -ivd)
Если у тебя что-то другое, то скрипт надо будет подправить.
Deleted
( 24.03.19 01:48:26 MSK )
Последнее исправление: Deleted 24.03.19 01:49:02 MSK (всего исправлений: 1)
Ответ на: комментарий от Deleted 24.03.19 01:48:26 MSK
$ (cpio -ivd && gunzip | cpio -ivd) < initrd.img-4.18.0-16-generic . kernel kernel/x86 kernel/x86/microcode kernel/x86/microcode/AuthenticAMD.bin 56 блоков gzip: stdin: not in gzip format cpio: преждевременный конец архива
superuser ★★★★
( 24.03.19 01:52:38 MSK ) автор топика
Ответ на: комментарий от superuser 24.03.19 01:52:38 MSK
(cpio -ivd && cat >/tmp/second.img)
Deleted
( 24.03.19 01:53:42 MSK )
Ответ на: комментарий от Deleted 24.03.19 01:53:42 MSK
$ (cpio -ivd && cat >/tmp/second.img)
superuser ★★★★
( 24.03.19 01:55:45 MSK ) автор топика
Ответ на: комментарий от superuser 24.03.19 01:55:45 MSK
(cpio -ivd && cpio -ivd && cat >/tmp/third.img)
Если после двух несжатых cpio есть что-то ещё, то оно окажется в /tmp/third.img.
Deleted
( 24.03.19 01:57:28 MSK )
Ответ на: комментарий от superuser 24.03.19 01:55:45 MSK
у меня немного по другому 🙂
~/pfg/test/kernell$ (cpio -ivd && cat >./second.img) < /boot/initrd.img-4.18.0-16-generic kernel kernel/x86 kernel/x86/microcode kernel/x86/microcode/.enuineIntel.align.0123456789abc kernel/x86/microcode/GenuineIntel.bin 32 блока ~/pfg/test/kernell$ file ./second.img ./second.img: gzip compressed data, last modified: Fri Mar 22 23:37:12 2019, from Unix, original size 17290240
но тоже есть вопросы.
pfg ★★★★★
( 24.03.19 02:03:27 MSK )
Ответ на: комментарий от Deleted 24.03.19 01:57:28 MSK
file /tmp/third.img /tmp/third.img: gzip compressed data, last modified: Thu Mar 21 21:17:46 2019, from Unix
(cpio -ivd && cpio -ivd && gunzip | cpio -ivd) < initrd.img-4.18.0-16-generic
жжжжж!
а Универсального скрипта не бывает? и в Ubuntu там какой-то страшный скрипт распаковывает
superuser ★★★★
( 24.03.19 02:03:56 MSK ) автор топика
Последнее исправление: superuser 24.03.19 02:04:30 MSK (всего исправлений: 1)
Ответ на: комментарий от superuser 24.03.19 02:03:56 MSK
а Универсального скрипта не бывает?
Можно написать. Но зачем?
Deleted
( 24.03.19 02:05:21 MSK )
Ответ на: комментарий от Deleted 24.03.19 02:05:21 MSK
superuser ★★★★
( 24.03.19 02:06:53 MSK ) автор топика
Ответ на: комментарий от superuser 24.03.19 02:03:56 MSK
а Универсального скрипта не бывает?
gzip -dc initrd.img-3.2.0-4-686-pae | cpio -iv
Deleted
( 24.03.19 02:07:11 MSK )
Ответ на: комментарий от Deleted 24.03.19 02:07:11 MSK
$ gzip -dc initrd.img-4.18.0-16-generic | cpio -iv gzip: initrd.img-4.18.0-16-generic: not in gzip format cpio: преждевременный конец архива $
mc показывает только дир. kernel
superuser ★★★★
( 24.03.19 02:10:15 MSK ) автор топика
Ответ на: комментарий от Deleted 24.03.19 02:05:21 MSK
а всё-таки как монтировать? ядро то как-то просто должно это делать
superuser ★★★★
( 24.03.19 02:12:43 MSK ) автор топика
Ответ на: комментарий от superuser 24.03.19 02:10:15 MSK
initrd не представляет собой gzip архив 🙂 заголовок не тот
pfg ★★★★★
( 24.03.19 02:13:24 MSK )
Ответ на: комментарий от superuser 24.03.19 02:12:43 MSK
груб его распаковывает в подмонтированную tmpfs
в момент запуска ядра в нем нет ни одного подмонтированного раздела. так что монтировать не из чего.
pfg ★★★★★
( 24.03.19 02:15:01 MSK )
Последнее исправление: pfg 24.03.19 02:16:50 MSK (всего исправлений: 1)
Ответ на: комментарий от superuser 24.03.19 02:10:15 MSK
А если не gzip -dc , а zcat ?
Deleted
( 24.03.19 02:16:22 MSK )
Ответ на: комментарий от Deleted 24.03.19 02:16:22 MSK
superuser ★★★★
( 24.03.19 02:17:44 MSK ) автор топика
Ответ на: комментарий от pfg 24.03.19 02:15:01 MSK
а как это всё тогда ядро находит/понимает?
superuser ★★★★
( 24.03.19 02:22:01 MSK ) автор топика
Ответ на: комментарий от Deleted 24.03.19 02:16:22 MSK
в начале инит нет заголовка gzip вот и не может распаковать
инитрам грузит груб и передает его ядру, как хз. тонкие материи едреной магии 🙂
pfg ★★★★★
( 24.03.19 02:24:59 MSK )
Последнее исправление: pfg 24.03.19 02:26:14 MSK (всего исправлений: 1)
Ответ на: комментарий от pfg 24.03.19 02:24:59 MSK
в начале инит нет заголовка gzip
Так в чем проблема?:
echo "TEST" > test.txt gzip test.txt cat test.txt.gz initrd.img-3.2.0-4-686-pae > initrd.img-3.2.0-4-686-pae.gz gzip -dc initrd.img-3.2.0-4-686-pae.gz | cpio -iv
Deleted
( 24.03.19 02:31:48 MSK )
Ответ на: комментарий от superuser 24.03.19 02:03:56 MSK
а Универсального скрипта не бывает?
#!/bin/sh unpack() < local comp_alg decomp_cmd comp_alg=$( file --brief --mime-type "$" ) case "$" in "application/x-gzip") decomp_cmd="gunzip" ;; "application/octet-stream") decomp_cmd="" ;; *) echo "Unknown compression: $" >&2 exit 1 ;; esac ( rm --force "$" set -xeu if [ -n "$" ]; then $decomp_cmd | cpio -ivd else cpio -ivd fi cat >"$" ) <"$" > set -xeu TMPDIR="" trap '[ -n "$" ] && rm --force --recursive "$"' EXIT TMPDIR=$( mktemp --directory --tmpdir="/tmp" --suffix=".unpackinitcpio" ) TMPNEXT="$/next" next="$" while [ -s "$" ]; do unpack "$" next="$" done
Запускать с одним аргументом: путём до файла.
Deleted
( 24.03.19 02:41:21 MSK )
Ответ на: комментарий от Deleted 24.03.19 02:41:21 MSK
$ ./_uinitrd initrd.img-5.0.2-pc + TMPDIR= + trap [ -n "$" ] && rm --force --recursive "$" EXIT + mktemp --directory --tmpdir=/tmp --suffix=.unpackinitcpio + TMPDIR=/tmp/tmp.UJKYFGUx5y.unpackinitcpio + TMPNEXT=/tmp/tmp.UJKYFGUx5y.unpackinitcpio/next + next=initrd.img-5.0.2-pc + [ -s initrd.img-5.0.2-pc ] + unpack initrd.img-5.0.2-pc + local comp_alg decomp_cmd + file --brief --mime-type initrd.img-5.0.2-pc + comp_alg=application/octet-stream + decomp_cmd= + rm --force /tmp/tmp.UJKYFGUx5y.unpackinitcpio/next + set -xeu + [ -n ] + cpio -ivd . kernel kernel/x86 kernel/x86/microcode kernel/x86/microcode/AuthenticAMD.bin 56 блоков + cat + next=/tmp/tmp.UJKYFGUx5y.unpackinitcpio/next + [ -s /tmp/tmp.UJKYFGUx5y.unpackinitcpio/next ] + unpack /tmp/tmp.UJKYFGUx5y.unpackinitcpio/next + local comp_alg decomp_cmd + file --brief --mime-type /tmp/tmp.UJKYFGUx5y.unpackinitcpio/next + comp_alg=application/octet-stream + decomp_cmd= + rm --force /tmp/tmp.UJKYFGUx5y.unpackinitcpio/next + set -xeu + [ -n ] + cpio -ivd kernel kernel/x86 kernel/x86/microcode kernel/x86/microcode/.enuineIntel.align.0123456789abc kernel/x86/microcode/GenuineIntel.bin 3080 блоков + cat + next=/tmp/tmp.UJKYFGUx5y.unpackinitcpio/next + [ -s /tmp/tmp.UJKYFGUx5y.unpackinitcpio/next ] + unpack /tmp/tmp.UJKYFGUx5y.unpackinitcpio/next + local comp_alg decomp_cmd + file --brief --mime-type /tmp/tmp.UJKYFGUx5y.unpackinitcpio/next + comp_alg=application/gzip + echo Unknown compression: application/gzip Unknown compression: application/gzip + exit 1 + [ -n /tmp/tmp.UJKYFGUx5y.unpackinitcpio ] + rm --force --recursive /tmp/tmp.UJKYFGUx5y.unpackinitcpio $
Исследуем процесс загрузки Linux
Как было сказано в предыдущем разделе, в процессе начальной загрузки вначале монтируется временный виртуальный диск, содержащий корневую файловую систему (очевидно, тоже временную), с помощью которой осуществляется запуск на выполнение ядра операционной системы. Образ этой корневой системы хранится на загрузочном устройстве в каталоге /boot и обычно носит имя initrd-2.x.yy-zzzz (точное наименование файла смотрите в вашей системе, далее он будет именоваться просто initrd). Загрузчик переносит образ корневой файловой системы из файла initrd в оперативную пямять одновременно с образом ядра, ядро преобразует initrd в "нормальный" RAM диск, монтирует временную корневую файловую систему, извлекает из нее нужные драйверы и другие служебные файлы, с помощью которых инициализирует все необходимые устройства. После этого происходит перемонтирование корневой файловой системы, временная ФС заменяется на постоянную, размещающуюся уже на долговременном носителе и процесс загрузки системы продолжается.
После того, как будет смонтирована корневая файловая система с жесткого диска, файл initrd уже никак не используется и место, занимаемое им в памяти, тоже освобождается. А теперь давайте подробнее рассмотрим как устроен этот файл. При этом надо сразу сказать, что внутреннее устройство initrd и его применение в ядрах версий 2.6 было изменено по сравнению с ядрами версий 2.4, так что придется рассмотреть эти случаи по отдельности.
3.2.1. Внутреннее устройство initrd
Как сказано в статье [10] в дистрибутиве Fedora Core 3 (и его предшественниках) файл initrd создавался с использованием виртуального loop-устройства. В этом случае сделать содержимое файла initrd доступным для просмотра можно с помощью следующих команд (напомню, что имя вашего образа initrd может отличаться):
Листинг 2. Просматриваем initrd в варианте loop-устройства (до FC3)
# mkdir temp ; cd temp # cp /boot/initrd.img.gz . # gunzip initrd.img.gz # mount -t ext -o loop initrd.img /mnt/initrd # ls -la /mnt/initrd
После этого вы можете посмотреть содержимое initrd в директории /mnt/initrd.
Заметьте что даже если имя вашего образа initrd не заканчивается на ".gz", это все равно сжатый файл и добавив к концу имени суффикс ".gz", вы сможете воспользоваться командой gunzip, чтобы его распаковать.
В таких дистрибутивах, как Fedora Core 4, SUSE 10, . файл initrd представляет собой cpio-архив, сжатый упаковщиком gzip. Чтобы просмотреть его содержимое, надо выполнить команды, приведенные в листинге 3
Листинг 3. Просматриваем initrd в варианте cpio-архива (FC3 и позже)
mkdir ~/tmp cd ~/tmp cp /boot/initrd-2.6.16.13-4-default initrd-2.6.16.13-4-default.gz gzip -d .gz mv initrd-2.6.16.13-4-default initrd-2.6.16.13-4-default.cpio cpio -i < initrd-2.6.16.13-4-default
После этого в каталоге ~/tmp вы найдете каталоговую структуру, аналогичную структуре каталогов обычной Linux-системы. В ней вы обнаружите обычные для корневого каталога подкаталоги, а также файл linuxrc. Могут там оказаться и другие файлы, например, файл bootsplash (судя по названию он содержит картинку, которая отображается при запуске).
Познакомившись с внутренним содержанием файла initrd можно вернуться к рассмотрению его роли в процессе загрузки.
3.2.2. Загрузка системы в случае использования initrd (ядра версий 2.4.х)
Приводимое ниже описание последовательности операций на этапе загрузки я позаимствовал из [11,12].
1. Загрузчик загружает ядро и содержимое initrd в память (очевидно, по вполне определенным адресам . ), после чего передает управление ядру.
2. Ядро содержит в себе небольшую несжатую часть, которая вначале разархивирует само ядро. Видимо как раз на этом этапе на экране монитора отображается сообщение "Uncompressing Linux. Ok, booting the kernel."
3. Ядро инициализирует устройства, создает файловую систему устройств /dev, разархивирует initrd и копирует его содержимое на устройство /dev/ram0, а затем освобождает память, занятую initrd.
4. Ядро монтирует устройство /dev/ram0 для чтения и записи в качестве начальной корневой файловой системы.
5. Если в начальной корневой файловой системе находится исполняемый файл /linuxrc, он исполняется с uid 0. Этот файл должен иметь разрешения на исполнение, он может быть как обычным исполняемым файлом, так и просто скриптом оболочки, но в последнем случае должен быть и интерпретатор скриптов.
6. Cкрипт /linuxrc монтирует нормальную корневую файловую систему.
7. Корневая файловая система помещается в корневую директорию. Смена корневого устройства выполняется системным вызовом pivot_root, который также доступен через утилиту pivot_root (см. pivot_root(8); pivot_root распространяется в составе util-linux версии не ниже 2.10h ). Смена корневой директории не включает её демонтирование. Следовательно, при выполнении данной процедуры можно сохранить процессы, запущенные с файловой системы initrd.
8. Если нормальная корневая файловая система имеет каталог /initrd, то устройство /dev/ram0 перемещается из / в /initrd. Иначе, если каталог /initrd не существует, устройство /dev/ram0 размонтируется.
9. На нормальной корневой файловой системе следует обычная процедура загрузки (например, вызов /sbin/init).
10. Теперь можно демонтировать /dev/ram0 и освободить память, занятую RAM диском.
3.2.3. Initramfs - новая модель инициализации (ядра версий 2.6.х)
Все сказанное выше относительно процедур загрузки и использования файла initrd справедливо для ядер версии 2.4.xx и более ранних. В ядрах версии 2.6 (а точнее, начиная с экспериментального ядра версии 2.5.46) разработчики решили реализовать иной механизм. Причиной послужили несколько недостатков ранее использовавшегося варианта реализации временной корневой файловой системы.
Во-первых, виртуальный диск, как и все блочные устройства, требует драйвер файловой системы для интерпретации данных во время выполнения. Этот драйвер приходилось включать в ядро.
Во-вторых, неэфективно используется оперативная память, так как размер виртуального диска фиксирован и не может изменяться во время работы без его переформатирования (даже если диск не заполнен, невозможно отдать эту память под другие нужды).
В третьих, в Linux осуществляется кэширование всех файлов и записей каталогов, прочитанных или записанных на блочное устройство. Виртуальный диск тоже кешируется, как и обычные диски, то есть часть данных будет храниться не только на RAM диске, но и в страничном кэше "page cache" (для файловых данных) и в кэше для записей каталогов "dentry cache", что еще больше снижает эффективность использования памяти.
- Система, использующая initramfs в качестве корневой файловой системы, более не нуждается в соответствующем драйвере файловой системы, встроенном в ядро, так как нет блочных устройств для интерпретации файловых систем.
- Размер этой файловой системы автоматически изменяется в соответствии с обьёмом данных, которые она содержит. При добавлении новых файлов (как и при расширении существующих) автоматически выделяется память, при удалении или уменьшении файла происходит высвобождение памяти.
- Достоинством initramfs является также то, что это не новый код, а новое применение уже существующего кода кэширования ядра Линукс, что практически не влечёт увеличение размера ядра, выполнение будет очень простым и основано на чрезвычайно хорошо протестированной инфраструктуре.
- Исчезают некоторые проблемы загрузки с SATA-дисков.
- Initramfs загружается немного быстрее, чем initrd.
/bin /dev /etc /lib /loopfs /proc /sbin -> bin /sys /sysroot
В подкаталоге /bin обнаружилось всего 4 исполняемых файла и две ссылки, в подкаталоге /dev - 8 файлов устройств, в /etc - конфигурационный файл udev/udev.conf, в каталоге lib - два файла: ext3.ko и jbd.ko. Остальные подкаталоги - пустые. Файл init оказался скриптом оболочки следующего вида: Листинг 4. Содержимое файла init в дистрибутиве ASP Linux версии 11.
#!/bin/nash mount -t proc /proc /proc setquiet echo Mounted /proc filesystem echo Mounting sysfs mount -t sysfs /sys /sys echo Creating /dev mount -o mode=0755 -t tmpfs /dev /dev mknod /dev/console c 5 1 mknod /dev/null c 1 3 mknod /dev/zero c 1 5 mkdir /dev/pts mkdir /dev/shm echo Starting udev /sbin/udevstart echo -n "/sbin/hotplug" > /proc/sys/kernel/hotplug echo "Loading jbd.ko module" insmod /lib/jbd.ko echo "Loading ext3.ko module" insmod /lib/ext3.ko /sbin/udevstart echo Creating root device mkrootdev /dev/root echo Mounting root filesystem mount -o defaults,errors=remount-ro --ro -t ext3 /dev/root /sysroot echo Switching to new root switchroot --movedev /sysroot
Обратите внимание на первую строку этого файла: это скрипт для оболочки nash, которая является сильно урезанной версией командного процессора и тоже включена в состав initramfs. Другие, более мощные оболочки на этом этапе еще недоступны. Как видно из листинга 4, скрипт init монтирует файловые системы /sys и /dev, инициализирует несколько устройств, загружает модули из подкаталога /lib и монтирует корневую файловую систему. Сколько я ни вглядывался в экран при перезагрузках системы, я не увидел сообщений, которые вроде бы должны выдаваться командами echo, включенными в этот скрипт. Образ виртуальной файловой системы initramfs хранится на диске по-прежнему в файле /boot/initrd-version и создается такой файл как и ранее командой mkinitrd. Прочитать о том, как создать такой файл, можно в статье [10]. Перечень модулей (иначе говоря, драйверов), которые будут включены в эту файловую систему, приведен в переменой INITRD_MODULES в файле /etc/sysconfig/kernel. Если вам требуется включить в /boot/initrd-version какие-то дополнительные модули (например, в случае изменения состава оборудования), вы можете скорректировать соответствующим образом список модулей в файле /etc/sysconfig/kernel, после чего заново создать файл /boot/initrd-version. Примечание: Встроенные Linux-систем часто просто-напросто используют файловую систему на виртуальном диске в качестве основной и единственной файловой системы. В принципе и десктопные системы могут работать также, если имеется достаточно оперативной памяти под виртуальный диск. Такой подход имеет свои преимущества и недостатки.
Initramfs/Руководство
Все больше и больше систем требуют initramfs для правильной загрузки. В этом руководстве будет рассмотрены основные понятия initramfs, а также как правильно создать и управлять initramfs на отдельных примерах.
- 1 Основные понятия initramfs
- 1.1 Введение
- 1.2 Процесс загрузки Linux
- 1.3 Корневой диск для начальной инициализации (initial root disk)
- 1.4 Файловая система в памяти для начальной инициализации (initramfs)
- 2.1 Введение и настройка загрузчика
- 2.2 Использование genkernel
- 2.3 Использование dracut
Основные понятия initramfs
Введение
Для большинства пользователей initramfs не является чем-то необходимым. Их система использует простую схему разбиения жесткого диска без экзотических драйверов или установок (таких как зашифрованные файловые системы), поэтому ядро Linux вполне способно передать управление двоичному файлу init на их системе. Но для большинства систем, использование initramfs почти обязательно.
Процесс загрузки Linux
Как только ядро Linux получает контроль над системой (который был передан ему после загрузки загрузчиком), оно подготавливает свои области памяти и драйвера. Затем оно передает управление приложению (обычно init ), чьей задачей является дальнейшая подготовка системы и проверка того, что в конце процесса загрузки, все необходимые сервисы запущены и пользователь способен войти в систему. Приложение init делает это с помощью запуска, в числе прочих сервисов, демона udev , который далее загружает и подготавливает систему, основываясь на обнаруженных устройствах. Когда udev запущен, все оставшиеся файловые системы, которые не были примонтированы, монтируются, и запускаются остальные сервисы.
Для систем, где все необходимые файлы и инструменты располагаются на той же самой файловой системе, приложение init может в совершенстве управлять дальнейшим процессом загрузки. Но когда определены множественные файловые системы (или в случае более неординарных установок), этот процесс может стать немного более усложненным:
- В случае, когда раздел /usr размещается на отдельной файловой системе, инструменты и драйвера, чьи файлы хранятся на /usr не могут использоваться, пока раздел /usr не станет доступным. Если эти инструменты требуются для предоставления доступа к разделу /usr , то мы не сможем загрузить систему.
- Если файловая система root зашифрована, то ядро Linux не сможет найти приложение init и это приведет к тому что система не сможет загрузиться.
С давних пор решением для этой проблемы является использование initrd (initial root device).
Корневой диск для начальной инициализации (initial root disk)
initrd — это дисковая структура в оперативной памяти (ramdisk), которая содержит необходимые инструменты и скрипты для монтирования требуемых файловых систем перед тем как управление передается приложению init на корневой файловой системе. Ядро Linux запускает скрипт настройки (обычно называемый linuxrc , но не обязательно такое имя) на этом корневом диске, который подготавливает систему, переключается к действительной корневой файловой системе и затем вызывает init .
Хотя способ, включающий в себя initrd - это все, что требуется, он имеет несколько недостатков:
- Это полноценное блочное устройство, требующее дополнительные расходы на целую файловую систему, и оно имеет фиксированный размер. Если выбрать initrd достаточно маленьким, то все требуемые скрипты не поместятся. Если сделайте его слишком большим, то растратите память впустую.
- По той причине, что это действительное устройство, оно также требует кэш-память ядра Linux и подлежит используемым методам управления памятью и файлами (таким как подкачка страниц), что делает расходы памяти еще более худшими.
Чтобы решить эти вопросы, была создана initramfs.
Файловая система в памяти для начальной инициализации (initramfs)
initramfs - это начальная файловая система в оперативной памяти, основанная на tmpfs (легковесной файловой системе в памяти с изменяемым размером), которая также не использовала отдельное блочное устройство (чтобы отсутствовало кэширование и все накладные расходы, упомянутые ранее, исчезли). Так же как и initrd, она содержит утилиты и скрипты, требуемые для монтирования файловых систем перед вызовом бинарного файла init , располагающегося на действительной корневой файловой системе. Эти утилиты могут быть уровнями абстракции расшифровывающих процедур (для зашифрованных файловых систем), менеджерами логических томов, программными (software) raid массивами, загрузчиками файловых систем, основанными на драйверах bluetooth, и так далее.
Содержимое initramfs делается путем создания cpio-архива. cpio — это старое (но проверенное) решение для архивирования файлов (архивы, получаемые в результате его работы, называются cpio-архивы). Безусловно, cpio можно сравнить с tar архиватором. Здесь cpio был выбран потому, что проще создать (с программной точки зрения) и поддерживать (на то время) файлы устройств (тогда как tar этого не мог).
Все файлы, утилиты, библиотеки, настройки конфигурации (если они применимы), и т.д. помещаются в cpio-архив. Этот архив затем сжимается с использованием утилиты gzip и сохраняется в том же месте, что и ядро Linux. Далее, загрузчик передаст его ядру Linux во время загрузки, чтобы ядро знало о том, что требуется initramfs.
При его обнаружении, ядро Linux создаст файловую систему tmpfs, извлечет на нее содержимое архива и затем запустит init -скрипт, расположенный в корневом каталоге файловой системы tmpfs. Этот скрипт затем примонтирует действительную корневую файловую систему (после того, как убедится, что он может ее примонтировать, например, с помощью загрузки дополнительных модулей, подготовки уровней абстракции шифрования, и т.д.), также как и другие существенно важные файловые системы (такие как /usr и /var ).
Как только корневая файловая система и другие существенные файловые системы примонтированы, init -скрипт из initramfs затем переключает root на действительную корневую файловую систему и, в завершение, вызывает /sbin/init на этой системе, для продолжения процесса загрузки.
Создание initramfs
Введение и настройка загрузчика
Для создания initramfs, важно знать какие дополнительные драйверы, скрипты и утилиты необходимы для загрузки системы. Например, если используется LVM, то потребуется инструменты LVM в initramfs. Таким же образом, если используется программный RAID, будут нужна утилита mdadm , и так далее.
Заметка
The root disk and root filesystem needs to be accessibleIn practice, this usually means CONFIG_SATA_AHCI or CONFIG_BLK_DEV_NVME (for the disk), and CONFIG_EXT4_FS (the filesystem) should ideally be built-in [=y] to the kernel; otherwise having these as modules [=m] will require these modules to be loaded by the initramfs first so booting can continue.
If LVM is used, then LVM tools will be needed in the initramfs.
If software RAID is used, mdadm utilities will be needed, or DMRAID, etc. ZFS and BTRFS would also require consideration here.
Существуют несколько инструментов, которые помогут создать initramfs (сжатые cpio -архивы) для системы. Тем, кому требуется полный контроль, также могут легко создать собственный, пользовательский образ initramfs.
После создания initramfs, необходимо настроить конфигурацию загрузчика для сообщения загрузчику, что будет использоваться initramfs. Например, если файл initramfs сохранен как /boot/initramfs-3.2.2-gentoo-r5 , то конфигурация в /boot/grub/grub.conf будет выглядеть следующим образом:
Usually this is done by re-generating the config file grub-mkconfig -o /boot/grub/grub.cfg
For instance, if the initramfs file is stored as /boot/initramfs-5.15.32-gentoo-r1.img , then afterwards, the GRUB configuration in /boot/grub/grub.cfg would look somewhat like the following:
ФАЙЛ grub.conf Пример записи в grub.conf для загрузки с initramfs
title Gentoo Linux 3.2.2-r5 root (hd0,0) kernel /boot/kernel-3.2.2-gentoo-r5 initrd /boot/initramfs-3.2.2-gentoo-r5
Использование genkernel
Утилита для сборки ядра Gentoo, genkernel , может использоваться для генерирования initramfs, даже если не использовался genkernel для конфигурации и сборки ядра.
Чтобы использовать genkernel для генерации initramfs, рекомендуется все необходимые драйверы и код, который требуется для монтирования / и /usr файловых систем, включить в ядро (а не как модули). Затем, вызвать команду genkernel следующим образом:
If modules are required in the initramfs, call genkernel as follows:
root # genkernel --install --no-ramdisk-modules initramfs
В зависимости от системы, одна или более из следующих опций могут быть необходимы:
Опция Описание --disklabel Включить поддержку LABEL= настроек в файл /etc/fstab --dmraid Включить поддержку fake hardware RAID --firmware Включить firmware code, найденный на системе --gpg Включить поддержку GnuPG --iscsi Включить поддержку iSCSI --luks Включить поддержку зашифрованных контейнеров luks --lvm Включить поддержку LVM --mdadm Включить поддержку программного (software) RAID --multipath Включить поддержку множественного I/O-доступа к SAN --zfs Включить поддержку ZFS По завершении, файл initramfs, полученный в результате, будет сохранен в каталоге /boot .
Использование dracut
Утилита dracut создана с единственной целью управления файлами initramfs. Она использует весьма модульный подход в плане выбора поддержки; что требуется включить, а что нет.
Рекомендуется установить (или убрать) необходимые модули. После настройки переменной DRACUT_MODULES в файле /etc/portage/make.conf запустите команду emerge dracut для установки утилиты Dracut.
root # emerge --ask sys-kernel/dracut
Далее необходимо настроить dracut посредством редактирования /etc/dracut.conf . В файле конфигурации, который хорошо прокомментирован, включите поддержку необходимых модулей.
После конфигурации, создайте initramfs вызовом dracut следующим образом:
root # dracut
Образ, полученный в результате, поддерживает общую загрузку системы, основанную на конфигурации в /etc/dracut.conf . Также, можно выбрать генерирование initramfs специально приспособленной под вашу систему (в которой dracut пытается определить необходимые инструменты, драйверы, и так далее из существующей системы). Если модули и драйверы встроены в ядро (не отдельными модулями и ссылками на firmware), то можно добавить опцию --no-kernel :
root # dracut --host-only --no-kernel
Чтобы найти больше информации, проконсультируйтесь с man-страницами: