Можно ли загружать ядро ​​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 запись файлов не является постоянной, поскольку все в памяти.