Загружается ли все ядро ​​в память при загрузке?

14

Я прочитал этот популярный документ IBM (я часто упоминаю в Интернете), объясняющий функцию начального RAM-диска.

Я наткнулся на стену, осмысливая, как это работает.

В документе сказано

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

Я уже запутался: копирует ли оно все ядро ​​в память или только его часть? Если все ядро ​​находится в памяти, зачем нам вообще нужен начальный RAM-диск?

Я думал, что целью initrd было иметь возможность иметь небольшой обобщенный образ ядра, и initrd установит в него правильные модули перед загрузкой образа ядра. Но если все ядро ​​уже находится в памяти, зачем нам нужен initrd?

Это также поднимает еще одну вещь, которая смущает меня - где находятся модули, которые загружаются в ядро? Все ли модули ядра хранятся в initrd?

user1028270
источник
Да. Все ядро. И его первые rootfs. Но ядра Linux не использовали initrd в течение многих лет.
mikeserv
Хорошо, я читал это. Его в значительной степени заменили initramfs, верно? И все же похожий процесс с initramfs правильный?
user1028270
1
начиная с версии 2.6 он был полностью заменен для всех ядер. Но процесс в некоторой степени похож, за исключением того, что initramfs никогда не монтируется - он всегда там и всегда тоже root. Вы должны смонтировать свой корневой dev поверх него, на самом деле. Есть также преимущества отсутствия необходимости эмулировать отдельный блок dev и подобные.
mikeserv
Круто, я прочитаю ту статью, на которую вы ссылались. То есть модули ядра хранятся в initramfs rootfs?
user1028270
1
@edwardtorvalds - это все обрабатывается udevобычно, и да, автоматически.
mikeserv

Ответы:

17

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

initramfsРоль» в том , чтобы обеспечить функциональные возможности, необходимые для установки„реальные“файловых систем и продолжить загрузку системы. Это включает в себя модули ядра, а также различные двоичные файлы: вам нужно, по крайней мере udev, возможно, некоторые сети, иkmod которые загружают модули.

Модули могут быть загружены в ядро ​​позже, чем просто загрузка, поэтому специальной подготовки ядра к initramfs. Они могут храниться в любом месте: initramfs, /lib/modulesна реальной файловой системе, в дереве разработки , если вы разрабатываете модуль ... The initramfsдолжен содержать только те модули , которые необходимы для монтирования корневой файловой системы (который содержит остаток).

Стивен Китт
источник
ОК, это имеет смысл для меня. Я думаю, что я совмещал образ ядра и файловую систему, которую он использует, которые, очевидно, совершенно разные.
user1028270
5

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

Тоби Спейт
источник
3

Ядро в современных установках Linux в значительной степени основано на модулях, то есть собственно ядро ​​(загружаемое при загрузке в ОЗУ) включает лишь минимальные функциональные возможности, все остальное компилируется как модули (загружаемые во время выполнения). Чтобы это работало, даже если, например, устройства или файловые системы, необходимые для загрузки, являются модулями, initramfsядро загружается (как следует из названия, это область ОЗУ с простой файловой системой, смонтированной при загрузке). Эта временная файловая система смонтирована /и содержит программы запуска и необходимые модули. Как только запуск initramfsзавершен, Linux выполняет pivot_root(8), монтирует реальное /и бросаетinitramfs содержимое.

Смысл этой сложности в том, что, например, дистрибутив может скомпилировать одно ядро (минимальное ядро ​​и полный набор модулей), а при установке ядра создать с initramfsучетом оборудования и настройки целевой машины. Все это требуется благодаря дикому разнообразию устройств и конфигураций «Персональных компьютеров».

vonbrand
источник
Это не делает pivot_root.
mikeserv