Я прочитал этот популярный документ IBM (я часто упоминаю в Интернете), объясняющий функцию начального RAM-диска.
Я наткнулся на стену, осмысливая, как это работает.
В документе сказано
Загрузчик, такой как GRUB, идентифицирует ядро, которое должно быть загружено, и копирует этот образ ядра и любой связанный initrd в память
Я уже запутался: копирует ли оно все ядро в память или только его часть? Если все ядро находится в памяти, зачем нам вообще нужен начальный RAM-диск?
Я думал, что целью initrd было иметь возможность иметь небольшой обобщенный образ ядра, и initrd установит в него правильные модули перед загрузкой образа ядра. Но если все ядро уже находится в памяти, зачем нам нужен initrd?
Это также поднимает еще одну вещь, которая смущает меня - где находятся модули, которые загружаются в ядро? Все ли модули ядра хранятся в initrd?
udev
обычно, и да, автоматически.Ответы:
Все ядро загружается в память при загрузке, как правило, в
initramfs
настоящее время. (По-прежнему можно настроить систему для загрузки без,initramfs
но это необычно для настольных компьютеров и серверов.)initramfs
Роль» в том , чтобы обеспечить функциональные возможности, необходимые для установки„реальные“файловых систем и продолжить загрузку системы. Это включает в себя модули ядра, а также различные двоичные файлы: вам нужно, по крайней мереudev
, возможно, некоторые сети, иkmod
которые загружают модули.Модули могут быть загружены в ядро позже, чем просто загрузка, поэтому специальной подготовки ядра к
initramfs
. Они могут храниться в любом месте:initramfs
,/lib/modules
на реальной файловой системе, в дереве разработки , если вы разрабатываете модуль ... Theinitramfs
должен содержать только те модули , которые необходимы для монтирования корневой файловой системы (который содержит остаток).источник
Все ядро (но не его модули) будет загружено в память. Если существуют модули, которые понадобятся ядру до того, как будут доступны какие-либо файловые системы (это обычно означает драйверы для файловых систем и их устройств), тогда эти модули будут в initramfs (в памяти), и ядро будет загружать их оттуда. Другие модули могут быть загружены позже из файловой системы.
источник
Ядро в современных установках Linux в значительной степени основано на модулях, то есть собственно ядро (загружаемое при загрузке в ОЗУ) включает лишь минимальные функциональные возможности, все остальное компилируется как модули (загружаемые во время выполнения). Чтобы это работало, даже если, например, устройства или файловые системы, необходимые для загрузки, являются модулями,
initramfs
ядро загружается (как следует из названия, это область ОЗУ с простой файловой системой, смонтированной при загрузке). Эта временная файловая система смонтирована/
и содержит программы запуска и необходимые модули. Как только запускinitramfs
завершен, Linux выполняетpivot_root(8)
, монтирует реальное/
и бросаетinitramfs
содержимое.Смысл этой сложности в том, что, например, дистрибутив может скомпилировать одно ядро (минимальное ядро и полный набор модулей), а при установке ядра создать с
initramfs
учетом оборудования и настройки целевой машины. Все это требуется благодаря дикому разнообразию устройств и конфигураций «Персональных компьютеров».источник
pivot_root
.