Можно ли загружать ядро Linux без создания образа initrd?
Как я понимаю, initrd - это небольшое изображение, которое загружается в ОЗУ. Он используется для загрузки полного ядра со всеми загружаемыми модулями. В рамках процесса нам понадобится образ ядра vmlinuz, который является переименованной версией bzImage.
Можно ли загружать ядро без создания образа initrd?
Ответы
Ответ 1
initrd/initramfs является необязательным, а не обязательным. bzImage - это чистый образ ядра и может быть загружен непосредственно загрузчиком. Однако может потребоваться выполнение некоторых задач (загрузка модулей файловой системы, драйверов для доступа к диску, установка корневой файловой системы с некоторых сменных носителей без фиксированного имени/пути и т.д.), Которые обычно требуют доступа к инструментам файловой системы и пользовательского пространства.
Для чего предназначены initramfs: это архив CPIO, который прикрепляется к изображению ядра (образ ядра - это контейнер для initramfs, а не наоборот) либо в самом изображении ядра, либо загрузчике во время загрузки.
В этом архиве CPIO содержатся исходные корневые файлы с модулями, необходимыми для настройки всех устройств для доступа к надлежащей корневой файловой системе, а также некоторых программ для идентификации этих устройств, загрузки модулей, выполнения некоторых других задач запуска для переустановки правильной корневой файловой системы в/и start/sbin/init
initrd аналогичен, и основное отличие состоит в том, что это изображение файловой системы, которое может быть и обычно сжимается. Ядро должно поддерживать файловую систему, встроенную в нее, и будет монтировать это изображение в качестве начального /.
Так как CPIO проще на несколько порядков величин, initramfs предпочтительнее по сравнению с initrd, так как это экономит как требование для любых модулей файловой системы, которые встроены, так и упрощает создание initramfs. Вместо того, чтобы создавать образ ext2, монтировать его и его заполнять, он сводится к простому созданию архива, в отличие от использования tar.
Однако, если вы скомпилируете ядро со всеми необходимыми драйверами и модулями, встроенными в образ ядра, а ваше корневое файловое системное устройство имеет фиксированное имя в системе, вам не нужны initramfs, так как ядро может делать что-то само собой, тогда.
Ответ 2
В initrd содержатся модули, необходимые для понимания корневой файловой системы и, таким образом, можно получить доступ к нормальному хранилищу модулей ядра.
Если ваше ядро скомпилировано со всем встроенным кодом, а не как с модулями, то initrd не требуется.
Ответ 3
Да, вы можете загрузить систему без изображения initrd.
Изображение initrd представляет собой либо изображение в формате gzipped ramdisc, либо, как правило, в настоящее время, gzipped.cpio.
В последнем случае .cpio расширяется в файловую систему под названием initramfs.
Если изображение .cpio отсутствует, ядро использует вместо него встроенное изображение, содержащее только несколько специальных файлов (например,/dev/console,/dev/null и несколько каталогов), но нет двоичные файлы.
Затем ядро использует встроенную логику и параметры командной строки, чтобы попытаться найти и смонтировать "настоящую" корневую файловую систему, которая смонтирована над "initramfs" и, следовательно, скрывает ее.
Эта "устаревшая" система загрузки в основном не используется в современных дистрибутивах.
Ответ 4
Минимальный пример QEMU + Buildroot
Вот минимальный конкретный пример, который показывает, что initrd не является обязательным: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/0b4f156b1b536a89c90882ed8ce551abcd3780af#initrd
С помощью этой настройки мы можем легко запустить две рабочие команды QEMU типа:
qemu-system-x86_64 -drive file=rootfs.ext2
и
qemu-system-x86_64 -initrd rootfs.cpio
Где:
-
rootfs.ext2
и rootfs.cpio
- это в основном одна и та же корневая файловая система, но в разных форматах
- первая команда имеет жесткий диск и
-initrd
- вторая команда
-initrd
, но без жесткого диска
В обоих случаях Linux загружается отлично, за исключением того, что в системе -initrd
запись файлов не является постоянной, поскольку все в памяти.