понедельник, 3 сентября 2012 г.

Этапы загрузки системы c Linux

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


Для подробной информации стоит воспользоваться следующими ресурсами на основе которых была написана эта статья:
  1. Исследуем процесс загрузки Linux  ,
  2. Новая модель инициализации initramfs
  3. Процесс загрузки Linux