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

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

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

4 ответа

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

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

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

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

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

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

Минимальный пример QEMU + Buildroot

Вот минимальный конкретный пример, который показывает, что initrd не является обязательным: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/0b4f156b1b536a89c90882ed8ce551abcd3780af

С этой настройкой мы можем легко запустить две рабочие команды QEMU типа:

qemu-system-x86_64 -drive file=rootfs.ext2

а также:

qemu-system-x86_64 -initrd rootfs.cpio

Куда:

  • rootfs.ext2 а также rootfs.cpio в основном одна корневая файловая система, но в разных форматах
  • первая команда имеет жесткий диск и нет -initrd
  • вторая команда -initrd но нет жесткого диска

В обоих случаях Linux загружается нормально, за исключением того, что в -initrd система, запись файла не является постоянной, так как все находится в памяти.

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

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

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

Образ initrd - это либо сжатый образ ramdisc, либо (чаще в наше время) сжатый образ.cpio.

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

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

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

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

В моем Debian Linux есть собственное ядро. Я сам компилирую ядра и затем знакомлю с системой dpkg.

При настройке ядра первым делом удаляю initrd. Я знаю, как моя установка получает доступ к корневой файловой системе (последовательный ATA, поддержка SCSI, SCSI-диск и ext4), поэтому я компилирую их в ядро. Другие модули доступны из корневой файловой системы /lib/modules

Это меня много раз спасало. Если что-то пойдет не так, ядро ​​откроет мне рабочее приглашение, которое я могу использовать для доступа к своей установке. Если initrd выходит из строя, мне нужна загрузочная флешка (обычно она отсутствует). Теперь, когда ядро ​​знает, что делать, чтобы получить приглашение к загрузке, я могу использовать свои системные инструменты, как правило, для решения проблемы.

Другие вопросы по тегам