Можно ли загрузить ядро ​​Linux без создания образа initrd? - PullRequest
11 голосов
/ 20 июня 2011

Как я понимаю, initrd - это небольшой образ, который загружается в ОЗУ. Он используется для загрузки полного ядра со всеми загружаемыми модулями. В рамках этого процесса нам нужен образ ядра vmlinuz, который является переименованной версией bzImage.

Можно ли загрузить ядро ​​без создания образа initrd?

Ответы [ 4 ]

17 голосов
/ 20 июня 2011

initrd / initramfs является необязательным и не обязательным. bzImage - это чистый образ ядра, который может быть загружен непосредственно загрузчиком. Однако может потребоваться выполнение некоторых задач (загрузка модулей файловой системы, драйверов для доступа к диску, монтирование корневой файловой системы с некоторых сменных носителей без фиксированного имени / пути и т. Д.), Которые обычно требуют доступа к файловой системе и инструментам пользовательского пространства.

Вот для чего initramfs : Это архив CPIO, который присоединяется к образу ядра (образ ядра является контейнером для initramfs, а не наоборот) либо в самом образе ядра, либо загрузчиком во время загрузки.

Этот архив CPIO содержит начальные rootfs с модулями, необходимыми для настройки всех устройств для доступа к соответствующей корневой файловой системе, и некоторыми программами для идентификации этих устройств, загрузки модулей, выполнения некоторых других задач запуска, перемонтирования соответствующей корневой файловой системы в / и start / sbin / init

initrd аналогичен, с основным отличием в том, что это образ файловой системы, который может быть и обычно является сжатым. Ядро должно иметь встроенную поддержку используемой файловой системы и будет монтировать этот образ как начальный /.

Поскольку CPIO проще на несколько порядков, initramfs предпочтительнее, чем initrd, так как это избавляет от необходимости для любых встроенных модулей файловой системы, а также облегчает создание initramfs. Вместо того чтобы создавать образ ext2, монтировать loopdevice и заполнять его, он сводится к простому созданию архива, мало чем отличающемуся от использования tar.

Однако, если вы компилируете свое ядро ​​со всеми необходимыми драйверами и модулями, встроенными в образ ядра, и ваше устройство корневой файловой системы имеет фиксированное имя в системе, вам не нужен initramfs, поскольку ядро ​​может что-то делать самостоятельно, тогда .

2 голосов

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

2 голосов
/ 20 июня 2011

Да, вы можете загрузить систему без образа initrd.

Образ initrd представляет собой образ виртуального диска в формате gzipped или (чаще в наше время) образ .cpio в формате gzipped.

В последнем случае .cpio расширяется до файловой системы с именем initramfs.

Если образ .cpio отсутствует, ядро ​​использует вместо него встроенный образ, который содержит всего несколько специальных файлов (таких как / dev / console, / dev / null и несколько каталогов), но без двоичных файлов.

Затем ядро ​​использует некоторые встроенные параметры логики и параметры командной строки, чтобы попытаться найти и смонтировать «настоящую» корневую файловую систему, которая монтируется «поверх» initramfs и поэтому скрывает ее..

Эта «устаревшая» загрузочная система в основном не используется в современных дистрибутивах.

2 голосов
/ 20 июня 2011

В initrd содержатся модули, необходимые для понимания корневой файловой системы, и, следовательно, для доступа к обычному хранилищу модулей ядра.

Если ваше ядро ​​скомпилировано со всем встроенным кодом, а не какмодулей, тогда initrd не требуется.

...