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

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

BIOS

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

Чип BIOS

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

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

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

BIOS - MBR

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

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

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

MBR - /boot

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

alex@deb:~$ ls -l /boot
итого 68864
-rw-r--r-- 1 root root   236056 дек  8 19:21 config-5.10.0-10-amd64
-rw-r--r-- 1 root root   236106 мар 17 18:40 config-5.10.0-13-amd64
drwxr-xr-x 5 root root     4096 апр  7 15:28 grub
-rw-r--r-- 1 root root 28162067 апр  7 15:22 initrd.img-5.10.0-10-amd64
-rw-r--r-- 1 root root 28173240 апр  7 15:25 initrd.img-5.10.0-13-amd64
-rw-r--r-- 1 root root       83 дек  8 19:21 System.map-5.10.0-10-amd64
-rw-r--r-- 1 root root       83 мар 17 18:40 System.map-5.10.0-13-amd64
-rw-r--r-- 1 root root  6841280 дек  8 19:21 vmlinuz-5.10.0-10-amd64
-rw-r--r-- 1 root root  6840768 мар 17 18:40 vmlinuz-5.10.0-13-amd64

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

alex@ubu:~$ ls -l /boot/
total 120420
-rw-r--r-- 1 root root    260559 мая  5 09:45 config-5.15.0-30-generic
drwxr-xr-x 5 root root      4096 мая 13 07:35 grub
lrwxrwxrwx 1 root root        28 мая 13 07:34 initrd.img -> initrd.img-5.15.0-30-generic
-rw-r--r-- 1 root root 105732146 мая 13 07:35 initrd.img-5.15.0-30-generic
lrwxrwxrwx 1 root root        28 мая 13 07:34 initrd.img.old -> initrd.img-5.15.0-30-generic
-rw------- 1 root root   6241208 мая  5 09:45 System.map-5.15.0-30-generic
lrwxrwxrwx 1 root root        25 мая 13 07:34 vmlinuz -> vmlinuz-5.15.0-30-generic
-rw------- 1 root root  11066784 мая  5 09:46 vmlinuz-5.15.0-30-generic
lrwxrwxrwx 1 root root        25 мая 13 07:34 vmlinuz.old -> vmlinuz-5.15.0-30-generic

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

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

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

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

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

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

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

alex@deb:~$ lsinitramfs -l /boot/initrd.img-5.10.0-13-amd64 | head -n 20
drwxr-xr-x   7 root     root            0 Apr  7 15:25 .
lrwxrwxrwx   1 root     root            7 Apr  7 15:25 bin -> usr/bin
drwxr-xr-x   3 root     root            0 Apr  7 15:25 conf
-rw-r--r--   1 root     root           16 Apr  7 15:25 conf/arch.conf
drwxr-xr-x   2 root     root            0 Apr  7 15:25 conf/conf.d
-rw-r--r--   1 root     root           49 Apr  7 15:22 conf/conf.d/resume
-rw-r--r--   1 root     root         1365 Jan 14  2021 conf/initramfs.conf
drwxr-xr-x   5 root     root            0 Apr  7 15:25 etc
-rw-r--r--   1 root     root            0 Apr  7 15:25 etc/fstab
-rw-r--r--   1 root     root         1622 Apr  7 15:25 etc/ld.so.cache
-rw-r--r--   1 root     root           34 Jul 29  2019 etc/ld.so.conf
drwxr-xr-x   2 root     root            0 Apr  7 15:25 etc/ld.so.conf.d
-rw-r--r--   1 root     root           44 Jul 29  2019 etc/ld.so.conf.d/libc.conf
-rw-r--r--   1 root     root          100 Oct  2  2021 etc/ld.so.conf.d/x86_64-linux-gnu.conf
drwxr-xr-x   2 root     root            0 Apr  7 15:25 etc/modprobe.d
lrwxrwxrwx   1 root     root           12 Apr  7 15:25 etc/mtab -> /proc/mounts
drwxr-xr-x   2 root     root            0 Apr  7 15:25 etc/udev
-rw-r--r--   1 root     root          305 Feb  2  2021 etc/udev/udev.conf
-rwxr-xr-x   1 root     root         6301 Jan 14  2021 init
lrwxrwxrwx   1 root     root            7 Apr  7 15:25 lib -> usr/lib

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

alex@ubu:~$ lsinitramfs -l /boot/initrd.img | head -n 20
drwxr-xr-x   3 root     root            0 Dec 18  2019 .
drwxr-xr-x   3 root     root            0 Dec 18  2019 kernel
drwxr-xr-x   3 root     root            0 Dec 18  2019 kernel/x86
drwxr-xr-x   2 root     root            0 Dec 18  2019 kernel/x86/microcode
-rw-r--r--   1 root     root        30546 Dec 18  2019 kernel/x86/microcode/AuthenticAMD.bin
drwxr-xr-x   2 root     root            0 Apr 25  2021 kernel
drwxr-xr-x   2 root     root            0 Apr 25  2021 kernel/x86
drwxr-xr-x   2 root     root            0 Apr 25  2021 kernel/x86/microcode
drwxr-xr-x   2 root     root            0 Apr 25  2021 kernel/x86/microcode/.enuineIntel.align.0123456789abc
-rw-r--r--   1 root     root      4609024 Apr 25  2021 kernel/x86/microcode/GenuineIntel.bin
drwxr-xr-x   9 root     root            0 May 13 07:35 .
-rw-r--r--   1 root     root         4096 May 13 07:35 .random-seed
lrwxrwxrwx   1 root     root            7 May 13 07:34 bin -> usr/bin
drwxr-xr-x   3 root     root            0 May 13 07:35 conf
-rw-r--r--   1 root     root           16 May 13 07:34 conf/arch.conf
drwxr-xr-x   2 root     root            0 May 13 07:34 conf/conf.d
-rw-r--r--   1 root     root         1284 Feb  8 19:54 conf/initramfs.conf
-rw-r--r--   1 root     root           64 May 13 07:35 conf/modules
drwxr-xr-x   2 root     root            0 May 13 07:34 cryptroot
-rw-r--r--   1 root     root            0 May 13 07:34 cryptroot/crypttab

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

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

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

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

alex@deb:~$ ps -p 1
    PID TTY          TIME CMD
      1 ?        00:00:01 systemd

alex@deb:~$ ls -l /sbin/init
lrwxrwxrwx 1 root root 20 июл 13 20:29 /sbin/init -> /lib/systemd/systemd

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

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

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

Алгоритм загрузки Linux используя 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.

UEFI - /efi/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

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

Меню Grub 2

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

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

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

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


Сводка
Алгоритм загрузки linux (BIOS/UEFI)
Имя статьи
Алгоритм загрузки linux (BIOS/UEFI)
Описание
Если вам интересно узнать как загружается Linux, то эта статья для вас. Рассмотрим алгоритм загрузки Linux на компьютерах с BIOS и UEFI

One Reply to “Алгоритм загрузки linux (BIOS/UEFI)”

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *