Как загружается операционная система linux

ИТ База знаний

Курс по Asterisk

Полезно

— Узнать IP — адрес компьютера в интернете

— Онлайн генератор устойчивых паролей

— Онлайн калькулятор подсетей

— Калькулятор инсталляции IP — АТС Asterisk

— Руководство администратора FreePBX на русском языке

— Руководство администратора Cisco UCM/CME на русском языке

— Руководство администратора по Linux/Unix

Серверные решения

Телефония

FreePBX и Asterisk

Настройка программных телефонов

Корпоративные сети

Протоколы и стандарты

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

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

Бесплатный вводный урок на онлайн курс по Linux

Мы собрали концентрат самых востребованных знаний, которые позволят начать карьеру администраторов Linux, расширить текущие знания и сделать уверенный щаг в DevOps

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

Загружаемся

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

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

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

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

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

READ  Как выбрать драйвер для светодиодной лампы

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

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

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

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

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

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

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

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

Бесплатный вводный урок на онлайн курс по Linux

Мы собрали концентрат самых востребованных знаний, которые позволят начать карьеру администраторов Linux, расширить текущие знания и сделать уверенный щаг в DevOps

Источник

Sysadminium

База знаний системного администратора

Алгоритм загрузки linux (BIOS/UEFI)

Если вам интересно узнать как загружается Linux, то эта статья для вас. Рассмотрим алгоритм загрузки Linux на компьютерах с BIOS и UEFI.

READ  Как обновить драйвера для видеокарты nvidia geforce 940mx

Алгоритм загрузки linux (BIOS)

BIOS расшифровывается как Basic Input/Output System, что в переводе – Базовая Система Ввода/Вывода. Это специальная микросхема, которая находится на материнской плате компьютера.

Когда компьютер только включается, то выполняется код из микросхемы BIOS. Вначале этот код выполняет тестирование системы POST (power-on self test), этим тестированием проверяется аппаратная часть системы. А затем из всех дисков определяется загрузочный.

BIOS умеет работать только с дисками размеченными MBR способом. На первом секторе такого диска находится так называемый MBR (master boot record). Сектор диска имеет размер 512 байт. В эти 512 байт помещается маленький загрузчик и таблица разделов. Кстати, если диск не загрузочный, то вместо загрузчика там может находится код, который сообщает, что это не загрузочный диск (No bootable device).

Так вот, BIOS передает управление маленькому загрузчику из MBR на загрузочном диске.

Загрузчик MBR и GRUB 2

Код загрузчика из MBR очень маленький и он способен лишь найти и запустить следующий загрузчик.

Следующий загрузчик больше и умнее. Бывают разные загрузчики для Linux, но самым популярным является GRUB 2. Он позволяет пользователю выбрать операционную систему для загрузки. А также умеет загружать операционные системы с логических разделов. GRUB 2 расположен на разделе жесткого диска в каталоге /boot и довольно часто этот каталог выносят на отдельный раздел.

Давайте посмотрим что находится в этом каталоге на Debian:

Ubuntu в этом каталоге содержит примерно тоже самое, но ядро новее:

Разберем некоторые файлы в этом каталоге. Здесь находится:

  • подкаталог с загрузчиком – grub;
  • ядра разных версий – файлы vmlinuz;
  • архивы с временной файловой системой и утилитами необходимыми для загрузки ядра – файлы initrd.img;
  • остальные файлы я рассматривать пока не буду.

После того, как GRUB 2 получил управление, он загружает ядро Linux (файл vmlinuz). При этом GRUB 2 загружает в память файловую систему из файла initrd.img. А затем запускает ядро, и при запуске, передаёт ему некие параметры, которые мы рассмотрим в следующей статье.

Вы можете спросить, зачем вообще нужен образ корневой файловой системы с утилитами initrd.img? Он необходим, потому что, когда GRUB 2 начинает загружать систему корневая файловая система еще не смонтирована. Поэтому GRUB 2 использует initrd как временную корневую файловую систему, которая загружается из файла в оперативную память.

Initrd – представляет собой файл, содержащий загружаемые модули ядра и минимальный набор утилит для загрузки этих модулей. Он сжимается и загружается в оперативную память с помощью загрузчика. Ядро получает доступ к нему, как если бы была установлена файловая система.

Вы можете использовать команду lsinitramfs чтобы перечислить содержимое файла initrd.img.

Вот пример для Debian:

А вот пример для Ubuntu:

Ядро Linux и процесс инициализации

Ядро при запуске использует временную файловую систему из файла initrd.img для того чтобы загрузиться полностью.

А дальше ядро запускает процесс инициализации операционной системы. Процесс инициализации является первым процессом в системе, так как ядро запускалось не как процесс. Каким именно будет процесс инициализации зависит от используемой системы инициализации. Существуют разные системы инициализации, но в Debian 11 и Ubuntu 22.04 используется система инициализации под названием SystemD.

То есть, первым процессом при запуске этих двух систем является systemd. Чтобы это проверить выполним следующие две команды, которые на обоих системах выполняются одинаково:

READ  Как выбрать драйвер для сканирования

Первой командой мы смотрим, какой процесс в системе работает под номером 1 – это systemd. Второй командой смотрим на что ссылается файл, который традиционно считается файлом системы инициализации – а ссылается он на /lib/systemd/systemd.

И наконец, система инициализации запускает все остальные процессы в системе.

Итог по загрузке с BIOS

Алгоритм загрузки linux (UEFI)

Сейчас на смену BIOS пришёл UEFI (Unified Extensible Firmware Interface). UEFI содержит множество преимуществ перед BIOS, одна из которых это поддержка GPT.

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

Диск разбитый на разделы с помощью таблицы разделов GPT в первом секторе продолжает хранить MBR запись. Это делается для того, чтобы старые системы с BIOS могли использовать GPT диски.

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

Secure Boot

UEFI имеет специальный режим, который называется Secure Boot. Если этот режим включен, то загрузчик без специальной подписи не будет работать. Windows и некоторые системы Linux имеют такие подписи, а для других систем приходится этот режим отключать.

Или можно не отключать Secure Boot, а просто очистить ключи производителя и добавить туда ключи от необходимого загрузчика. Например в UbuntuGRUB 2 подписан подписью от Canonical, именно эту подпись и следует добавить в Secure Boot.

Дальнейшая загрузка

А дальше все происходит также как и в системах с BIOS. Загрузчик запускает GRUB 2, хотя может сразу запустить и ядро Linux, но тогда мы теряем гибкость GRUB 2.

GRUB 2 в свою очередь запускает ядро Linux. Дальше ядро запускает систему инициализации. А уже система инициализации запускает все остальные процессы в системе.

Итог по загрузке с UEFI

Немного про GRUB 2

GRUB 2 в настоящее время является основным загрузчиком для большинства систем Linux. Он позволяет запустить не только ядро Linux, но и Windows систему. Он имеет собственную командную строку с помощью которой можно, например устранить некоторые ошибки при загрузки.

Существует две версии загрузчика GRUB 2: для BIOS и для UEFI. Но для UEFI он не имеет цифровой подписи для режима Secure Boot.

Ubuntu, кстати, поддерживает Secure Boot. Для этого используется загрузчик Shim подписанный подписью от Microsoft. И этот загрузчик запускает GRUB 2, который подписан цифровой подписью от Canonical.

Взаимодействуя с GRUB 2 при старте системы вы можете выбрать, какую из возможных конфигураций загрузить или изменить:

Когда отображается меню, вы можете нажать:

  • Enter” – чтобы немедленно загрузить выбранную строку меню;
  • любую другую клавишу — чтобы остановить тайм-аут;
  • e” – чтобы отредактировать запись;
  • c” – чтобы войти в командную строку GRUB2.

Если ваш тайм-аут установлен на 0, то GRUB 2 немедленно загружает систему не показывая подобное меню.

На следующем уроке подробнее разберём загрузчик GRUB 2.

Источник