Можно ли загрузить ядро 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 выходит из строя, мне нужна загрузочная флешка (обычно она отсутствует). Теперь, когда ядро знает, что делать, чтобы получить приглашение к загрузке, я могу использовать свои системные инструменты, как правило, для решения проблемы.