При включения компьютера, первоначально происходит запуск
BIOS (
basic input/output system — «базовая система ввода-вывода»), которая производит инициализацию и проверку аппаратных средств машины (
POST - power-on-self-test). Сама
BIOS представляет из себя микросхему с неизменным набором микропрограмм (
ПЗУ), пользовательские настройки к которым находятся в динамической энергозависимой памяти
CMOS. По завершению тестирования,
BIOS ищет на доступных носителях информации запись
MBR - данные необходимые для дальнейшей загрузки операционной системы расположенную в первых секторах носителей, загружает его в оперативную память и передает ей управление.
В
MBR находится программа-загрузчик (скорее всего
GRUB(GRand Unified
Bootloader), так как
LILO(LInux LOader) уже практически не используется). Основная задача загрузчика состоит в переносе ядра ОС в оперативную память и передача ему управления дальнейшим функционированием компьютера.
Ядро при загрузке производит опрос присутствующих устройств с целью определения "что есть в системе". Если драйвер вкомпилирован в ядро, то устройство инициализируется, а если нет, то оно должно подключиться в виде модуля, а модуль лежит в виде файла на файловой системе, причем на неизвестно каком носителе. То есть для загрузки модулей ядра порождения процесса
init (отвечающего за создание процессов описанных в /etc/inittab) необходимо получить доступ к файловой системе. Но файловая система не является частью ядра - значит её модуль тоже надо загрузить из файла который лежит где? Правильно, где то на диске.
Для решения этой проблемы была реализована технология
initrd, а в настоящий момент
initramfs.
initramfs - виртуальная файловая система, образ которой хранится рядом с образом ядра. при этом минимальный набор драйверов включается в ядро, а остальные подгружаются в виде модулей из виртуальной системы.
Цитата:
Все сказанное выше относительно процедур загрузки и использования файла
initrd справедливо для ядер версии 2.4.xx и более ранних.
В ядрах версии 2.6 (а точнее, начиная с экспериментального ядра версии 2.5.46)
разработчики решили реализовать иной механизм. Причиной послужили несколько недостатков
ранее использовавшегося варианта реализации временной корневой файловой системы.
Во-первых, виртуальный диск, как и все блочные устройства, требует драйвер
файловой системы для интерпретации данных во время выполнения. Этот драйвер приходилось
включать в ядро.
Во-вторых, неэфективно используется оперативная память, так как размер
виртуального диска фиксирован и не может изменяться во время работы без его
переформатирования (даже если диск не заполнен, невозможно отдать эту память
под другие нужды).
В третьих, в Linux осуществляется кэширование всех файлов и записей каталогов,
прочитанных или записанных на блочное устройство. Виртуальный диск тоже
кешируется, как и обычные диски, то есть часть данных будет храниться не только
на RAM диске, но и в страничном кэше "page cache" (для файловых данных)
и в кэше для записей каталогов "dentry cache", что еще больше снижает
эффективность использования памяти.
Для устраненеия этих недостатков Линус Торвальдс предложил
монтировать кэш ядра Линукс как особую файловую систему, работающую полностью в
кэше ядра. При этом нет лишнего
дублирования информации между блочным устройством и кэшем, так как блочного
устройства попросту нет. Файловая система, реализующая эти идеи,
была разработана и получила название initramfs. Ее использование имеет
следующие преимущества:
- Система, использующая initramfs в качестве корневой файловой
системы, более не нуждается в соответствующем драйвере файловой системы,
встроенном в ядро, так как нет блочных устройств для интерпретации файловых
систем.
- Размер этой файловой системы автоматически изменяется в соответствии с обьёмом
данных, которые она содержит. При добавлении новых файлов (как и при
расширении существующих) автоматически выделяется память, при удалении
или уменьшении файла происходит высвобождение памяти.
- Достоинством initramfs является также то, что это не новый код,
а новое применение уже
существующего кода кэширования ядра Линукс, что практически не влечёт
увеличение размера ядра, выполнение будет очень простым и основано на
чрезвычайно хорошо протестированной инфраструктуре.
- Исчезают некоторые проблемы загрузки с SATA-дисков.
- Initramfs загружается немного быстрее, чем initrd.
Формат initramfs используется по умолчанию для всех ядер,
начиная с версии 2.6.15.
После загрузки модулей происходит монтирование корневой системы в режиме "только чтение"
и запуск процесса
init, который является родоначальником всех других процессов в LINUX.
init отвечает за продолжение загрузки системы и перевод её от состояния "после загрузки ядра" к рабочему состоянию обработки запросов многих пользователей. init так же выполняет много различных операций необходимых для дальнейшей работы операционной системы, таких как проверка и монтирование файловых систем, запуск различных служб и демонов, запуск процедур логирования, загрузка оболочек пользователя...
Для подробной информации стоит воспользоваться следующими ресурсами на основе которых была написана эта статья:
- Исследуем процесс загрузки Linux ,
- Новая модель инициализации initramfs
- Процесс загрузки Linux