Процесс загрузки операционной системы linux

Загрузка Linux

В этой статье описаны основные этапы загрузки операционной системы Linux. Эта тема которую неплохо бы было знать любому ИТ-специалисту.

Основные этапы загрузки хоста с ОС Linux:

  1. BIOS/UEFI -> MBR/GPT
  2. MBR/GPT -> Boot loader (GRUB2)
  3. Boot loader (GRUB2) -> Инициализация ядра (Kernel)
  4. Инициализация ядра (Kernel) -> Init (Systemd)

В этой статье описываются GRUB2 и Systemd, поскольку они являются основными для большинства основных дистрибутивов, но на практике еще можно найти другие.

BIOS

Первый шаг процесса загрузки не имеет ничего общего с Linux. Это аппаратная часть процесса загрузки, которая является одинаковой для любой операционной системы. При включении питания запускается BIOS (basic input/output system базовая система ввода-вывода), которая запускает POST (Power-On Self-Test — «самотестирование при включении»), который является частью BIOS. В случае сбоя BIOS POST, компьютер нельзя будет использовать, поэтому процесс загрузки не продолжится.

BIOS POST проверяет базовую работоспособность оборудования, а затем BIOS определяет местонахождение главных загрузочных записей (MBR) на всех подключенных загрузочных устройствах. Первый обнаруженный загрузочный сектор, содержащий действительную загрузочную запись, загружается в ОЗУ, а затем управление передается коду (GRUB2), который был загружен из загрузочного сектора.

GRUB2

В большинстве современных дистрибутивов используются загрузчик GRUB2 (можно также встретить GRUB и LILO). GRUB2 (GRand Unified Bootloader, version 2) — это программа, которая делает компьютер достаточно умным, чтобы найти ядро ​​операционной системы (Kernel) и загрузить его в память.

GRUB2 позволяет загружать многие версии Linux и другие бесплатные операционные системы; он также может загружать по цепочке загрузочную запись проприетарных операционных систем. А также, может позволить пользователю выбрать загрузку из нескольких различных ядер для любого данного дистрибутива Linux. Это дает возможность загрузить предыдущую версию ядра, если обновленная версия даст сбой или будет несовместима с важной частью программного обеспечения. GRUB2 можно настроить с помощью файла /boot/grub/grub.conf.

Функция GRUB2 состоит в том, чтобы найти и загрузить ядро ​​Linux в оперативную память и передать управление компьютером ядру. Ядро и связанные с ним файлы находятся в каталоге /boot. Файлы ядра можно идентифицировать, так как все они имеют имена, начинающиеся с vmlinuz. Вы можете посмотреть содержимое каталога /boot, чтобы увидеть установленные в настоящее время ядра в вашей системе. По умолчанию GRUB2 предоставляет предзагрузочное меню установленных ядер, включая опцию rescue и, если настроено, опцию recovery.

Читайте также:  Linux commands on windows command prompt

GRUB2 загружает выбранное ядро ​​в память и передает управление компьютером ядру.

Kernel (ядро)

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

Так как файловые системы еще не смонтированы, ядро при запуске использует временную файловую систему из файла initrd.img, для того чтобы загрузиться полностью. После извлечения оно загружает инициализацию операционной системы — Systemd (PID 1) и передает ей управление.

Systemd

Systemd является основным родителем для всех процессов, имеет первый номер процесса (PID 1) и отвечает за доведение хоста Linux до состояния, в котором можно выполнять работу.

Systemd монтирует файловые системы, как определено в файле /etc/fstab, включая любые файлы подкачки или разделы. На этом этапе он уже может получить доступ к файлам конфигурации, расположенным в /etc, включая свои конфигурационные файлы. Он использует свой файл конфигурации, чтобы определить, в каком состоянии должен загрузить хост.

Загрузка linux с UEFI

Новые компьютеры используют UEFI (Unified Extensible Firmware Interface) вместо BIOS. UEFI содержит множество преимуществ перед BIOS, одна из которых — поддержка GPT, который позволяет использовать большие диски и помещать загрузчик на специальный раздел, а также позволяет создавать много разделов.

Раньше диски разбивались на разделы с помощью MBR, но было ограничение — диск не мог быть больше 2 TB, а разделов не могло быть больше четырёх. При этом таблица разделов и первичный загрузчик помещались на первый сектор диска в MBR. Диск разбитый с помощью GPT в первом секторе продолжает хранить MBR запись, для того, чтобы старые системы с BIOS могли использовать диски с таблицей разделов GPT.

UEFI не использует загрузчик MBR, вместо этого используется загрузчик со специального раздела на диске, который отформатирован в FAT32 и называется ESP или EFI. Обычно это файл /efi/boot/bootx64.efi. Дальше процесс такой же как и загрузкой с помощью BIOS.

Источник

Загрузка ОС Linux — процесс

img

Каждое семейство операционных систем производит загрузку по-своему. Это связанно с различной архитектурой ядра операционной системы, разными инструкциями по работе с подключенными устройствами. В данной статье попробую разобрать загрузку популярной операционной системы на ядре Linux Ubuntu.

Схематично процесс загрузки можно отобразить следующим образом.

Схематично процесс загрузки

Загружаемся

Итак, Нажимаем кнопку включения компьютера, и центральный процессор переходит на адрес BIOS. BIOS или UEFI, в более современных компьютерах, проводит систему проверок и выбирает носитель информации с которого будет производится загрузка операционной системы. На носителе находится MBR (Master Boot Record) или GPT (Guid Partition table) на новых компьютерах в которых находится загрузчик. А дальше уже в зависимости от настройки. Загрузчик может самостоятельно загружать операционную систему, а может передавать управление следующему загрузчику. Например, если Windows и Linux установлены на одном компьютере и находятся на разных разделах жесткого диска.

Читайте также:  Mint linux установка opera

В любом случае, если идет речь о Linux у нас есть первая стадия с небольшой частью кода, которая загружает у нас загрузчик. Загрузчик знает где лежит ядро операционной системы, загружает ядро, загружает initial run disk, там находятся необходимые файлы и модули для загрузки ядра. Далее уже ядро берет процесс управления на себя. Происходит инициализация устройств, конфигурирование процессов памяти и так далее. После всех этих процессов ядро запускает процесс init.

Вернемся к вопросу загрузчиков, для каждой операционной системы разработан свой загрузчик, а иногда и несколько. NTLDR — Загрузчик операционной системы Windows, LILO — один из стандартных загрузчиков для Linux и BSD системы. GRUB — загрузчик операционной системы от проекта GNU. Нас интересуют последние два. Данные загрузчики работают в два этапа. На первом этапе у них крошечный код на MBR или GPT, который запускает исполнение кода второго этапа.

Перейдем непосредственно к самой загрузке.

загрузчик GRUB версии 2.04

Данное меню мы можем получить при загрузке если зажать клавишу Shift. Как видно на картинке в данном примере загрузчик GRUB версии 2.04. У нас есть несколько вариантов. Загрузка Ubuntu по умолчанию и вариант загрузки с расширенными опциями. В нашем случае расширенные опции не дают многого, а всего лишь позволяют начать загрузку в режиме восстановления recovery mode. Данная опция не является целью стати, и мы ее опустим. Вернемся к первому пункту загрузки. Выбираем, нажимаем «e» получаем следующую картину загрузки.

корневой раздел монтируется по uuid

На данной картинке можно увидеть, что корневой раздел монтируется по uuid, он будет корневым root и непосредственно сам id. ID раздела можно посмотреть после загрузки операционной системы командой blkid. Можно часть параметров отредактировать или большинство. Более подробно можно поискать в интернете. По нажатию F10 осуществляется продолжение загрузки операционной системы.

продолжение загрузки операционной системы

После загрузки операционной системы, мы можем с помощью команды dmesg посмотреть, сообщения ядра, все что происходило с ядром. Нужно различать сообщения ядра и лог ядра. Который можно посмотреть cat /var/log/dmesg. Данный файл содержи информацию только о загрузке операционной системы. В данном файле содержится информация с самого начала загрузки операционной системы и до конца. Если событие происходит позднее, то в данном файле этой информации вы не найдете.

Читайте также:  Tcp payload on linux

Система инициализации ОС

Есть такое понятие Init — это первый или родительский процесс, который запускает все последующие процессы. Это может быть проверка и монтирование файловых систем запуск служб и.т.д. Существует 3 варианта работы этого родительского процесса.

pstree

  1. Init в стиле SysV — родительский процесс инициализации системы на одном из заданных уровней запуска (runlevel); Т.е. есть несколько уровней загрузки (runlevel) обычно их 7 штук. Один из них — это обычный многопользовательский режим. Другие это выключение компьютера, перезагрузка, режим восстановления и т.д.
  2. Init в стиле systemd — родительский процесс инициализации системы в ускоренном режиме, за счёт параллельного запуска задач; Ускоренный режим достигается за счет использования процессора в частности Intel, который позволяет запускать процессы инициализации параллельно. К этому режиму есть еще куча софта библиотек, которые расширяют функционал.
  3. Init в стиле Upstart — родительский процесс инициализации системы на основе отслеживания событий; Данный режим используется на Ubuntu уже давным — давно, тут не только запускаются скрипты инициализации, но и запускаются скрипты отслеживания событий и реагирования на них. Т.е. это более гибкий процесс инициализации, например, если какая-то служба не запустилась или упала в процессе загрузки то, upstart умеет это отследить и запустить это повторно

В операционной систему Ubuntu можно посмотреть дерево процессов использую команду pstree. В результате ее вывода мы можем увидеть, что родительским процессом являлся процесс systemd. Который запускал уже свои, какие-то дочерние процессы. Перейдем в корневую директорию boot.

Перейдем в корневую директорию boot

Здесь мы можем увидеть директорию загрузчика grub. Ядра линуксовые vmlinuz (ссылка на ядро) и до обновления старое ядро vmlinux.old (ссылка на старое ядро). Соответственно пара initrd* — файлы диска, эти файлы содержат диск, который грузится в оперативную память, данный диск содержит файлы необходимые самому ядру Linux для нормальной загрузки.

Перейдя в директорию grub, мы можем найти конфигурационный файл grub.cfg и несколько вспомогательных, но не менее важных фалов. Соответственно мы можем внести изменения в данный файл на постоянной основе и соответственно данный код будет выполнятся при каждой загрузке операционной системы.

Источник

Оцените статью
Adblock
detector