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

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

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


person Neel    schedule 19.06.2011    source источник
comment
Вы пытались исключить параметр initrd=... из загрузчика? В принципе, initrd необязателен, если в вашем ядре собраны все необходимые драйверы для поиска корневой файловой системы. Кроме того, как это вопрос программирования?   -  person Kerrek SB    schedule 20.06.2011
comment
Возможно, и раньше все Linux-системы загружались без initrd. Но initrd многое упрощает. Мне любопытно... Почему вы хотите загрузиться без initrd? Знание этого, вероятно, облегчит предоставление более осмысленного ответа.   -  person Flimzy    schedule 20.06.2011
comment
Я занимался разработкой проекта openwrt и хотел создать небольшой образ ядра. Отсутствие части initrd приводило к ошибкам загрузки.   -  person Neel    schedule 20.06.2011


Ответы (5)


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

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

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

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

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

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

person datenwolf    schedule 19.06.2011

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

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

person Douglas Leeder    schedule 19.06.2011

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

Вот минимальный конкретный пример, показывающий, что initrd не является обязательным: ://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 запись файлов не является постоянной, поскольку все находится в памяти.

person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 16.02.2018

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

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

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

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

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

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

person MarkR    schedule 20.06.2011
comment
Интересно, а где я могу найти более подробную информацию об этом встроенном образе? Это то, что используется, когда я запускаю QEMU без -initrd? stackoverflow.com/a/48823924/895245 - person Ciro Santilli 新疆再教育营六四事件ۍ 16.02.2018
comment
Похоже, встроенный образ создан из gen_init_cpio программы из default_cpio_list — см. github.com/ торвальдс/linux/tree/master/usr - person Chih-Hsuan Yen; 01.03.2021

У меня есть собственное ядро ​​в моей машине Debian Linux. Я сама компилирую ядра, а потом ставлю их на знание системы dpkg.

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

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

person Pekka Takala    schedule 28.07.2020