Перейти к содержанию

6.1 Процесс загрузки Linux (The Linux Boot Process)

Ключевая концепция, которую вам как администратору Linux необходимо хорошо понимать, — это порядок загрузки самой операционной системы. Процесс загрузки Linux несколько сложнее, чем процесс загрузки других операционных систем, с которыми вы, возможно, уже знакомы. Поэтому в начале этой главы мы уделим время подробному разбору того, как он работает. Понимание процесса загрузки принесёт вам большую пользу, когда мы будем обсуждать настройку загрузчиков, уровней выполнения и сценариев init далее в этой главе.

Примечание

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

Когда я впервые загрузил систему Linux в середине 1990-х годов, при запуске системы на экране промелькнула вереница сообщений, которые были для меня совершенно непонятны. Я начинал работать с DOS и NetWare и понятия не имел, о чём говорили эти сообщения. Что это вообще такое — vmlinuz?

Сегодня загрузочные сообщения операционной системы Linux скрыты за экранами приветствия (splash screens) в большинстве популярных дистрибутивов, как показано на рис. 6-1.

Рис. 6-1. Экран приветствия Linux.

Рис. 6-1. Экран приветствия Linux.

Такие экраны приветствия делают запуск системы более привлекательным и менее пугающим для начинающего пользователя, однако одновременно скрывают немало полезной информации. К счастью, в большинстве дистрибутивов эти сообщения всё же можно просмотреть, нажав клавишу Esc во время отображения экрана приветствия. Пример показан на рис. 6-2.

Рис. 6-2. Загрузочные сообщения Linux.

Рис. 6-2. Загрузочные сообщения Linux.

Совет

Загрузочные сообщения зачастую прокручиваются слишком быстро, чтобы их успеть прочитать. Вы можете ввести dmesg | more в приглашении командной строки, чтобы просмотреть сообщения, выведенные в процессе загрузки.

Настоятельно рекомендую сделать именно это после прочтения данной части главы: это поможет закрепить концепции процесса загрузки, которые мы рассмотрим. Чтобы облегчить восприятие процесса загрузки Linux, мы разобьём его на следующие фазы:

  • фаза BIOS;
  • фаза загрузчика;
  • фаза ядра.

Начнём с обсуждения фазы BIOS.

Фаза BIOS

Независимо от того, какую операционную систему вы используете, при первом включении персонального компьютера с архитектурой x86 или x86-64 первым компонентом, берущим управление процессом загрузки, является системный BIOS (Basic Input/Output System). Системный BIOS — это микросхема ПЗУ (ROM), встроенная в материнскую плату, которая содержит набор небольших программ и драйверов, позволяющих центральному процессору взаимодействовать с основными устройствами системы: клавиатурой, портами ввода-вывода, системным динамиком, оперативной памятью, дисководами для гибких дисков и жёсткими дисками. Переменные данные о системе — в частности, объём установленной оперативной памяти и геометрия жёстких дисков — хранятся в микросхеме CMOS. BIOS использует данные микросхемы CMOS для адресации этих устройств.

В процессе загрузки BIOS выполняет две ключевые функции. Первая — тестирование различных компонентов системы и проверка их работоспособности. Эта процедура называется самотестированием при включении питания (power-on self-test, POST). Если в ходе POST BIOS обнаруживает неисправности системных устройств, он либо выводит на экран малопонятное сообщение об ошибке, либо воспроизводит серию звуковых сигналов определённого кода. Расшифровать эти сообщения и определить, что именно не так с системой, можно с помощью документации к BIOS — она легко находится в Интернете по номеру модели материнской платы или названию производителя BIOS, а иногда прилагается к руководству по эксплуатации материнской платы.

Вторая функция BIOS — выбор устройства хранения данных, с которого будет загружаться операционная система. Большинство программ настройки CMOS позволяют задать порядок, в котором BIOS будет перебирать загрузочные носители. На рис. 6-3 система настроена таким образом, что сначала BIOS проверяет съёмные устройства, затем локальный жёсткий диск, а затем оптический привод.

Рис. 6-3. Параметры загрузочного носителя в программе настройки BIOS.

Рис. 6-3. Параметры загрузочного носителя BIOS.

BIOS загружается с первого загрузочного устройства, которое найдёт в списке. Вспомните: в предыдущей главе я рекомендовал убедиться, что в BIOS установлена загрузка с оптического привода первой — иначе, вероятно, не удастся запустить программу установки Linux. Если BIOS обнаружит загрузочное устройство, стоящее выше в списке, он не дойдёт до оптического диска, с которого вы хотите загрузиться.

Как же BIOS определяет, является ли устройство загрузочным? Он читает первый сектор устройства — так называемый загрузочный сектор (boot sector). На жёстком диске загрузочный сектор содержит главную загрузочную запись (master boot record, MBR). Рассмотрим роль MBR в рамках следующей фазы — фазы загрузчика.

Фаза загрузчика

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

MBR находится в загрузочном секторе жёсткого диска системы и играет ключевую роль в процессе загрузки Linux. MBR указывает системе, где располагается загрузчик (bootloader). У загрузчика очень важная задача. Суть проблемы в том, что компьютеру нужна операционная система, чтобы обратиться к жёсткому диску и загрузить данные из него в оперативную память. В данной точке процесса загрузки нам необходимо загрузить саму операционную систему с жёсткого диска в память. Но как загрузить операционную систему в память с жёсткого диска, если для чтения данных с диска нужна операционная система?

Вот для чего нужен загрузчик. Загрузчик — это программа, которую BIOS может загрузить из MBR жёсткого диска; она позволяет центральному процессору обратиться к диску и загрузить операционную систему в оперативную память. Для этого в загрузчике задано расположение файлов операционной системы на жёстком диске.

Сам программный код загрузчика может располагаться в MBR или не располагаться там. Как будет показано далее в этой главе, некоторые загрузчики можно установить в MBR, а можно установить в раздел на жёстком диске и разместить в MBR лишь указатель на него. Другие загрузчики фактически размещаются в обоих местах.

После загрузки программного кода загрузчика в память BIOS передаёт управление системой загрузчику. Загрузчик может быть настроен на автоматическую загрузку операционной системы с жёсткого диска, либо он может предоставлять конечным пользователям меню, позволяющее выбрать, какую операционную систему загрузить.

В более новых версиях ядра Linux загрузчик может также создавать в оперативной памяти временную виртуальную файловую систему, называемую RAM-диском (ramdisk). В зависимости от дистрибутива эта файловая система называется образом initrd или образом initramfs.

Примечание

Термин initrd расшифровывается как «initial ramdisk» (начальный RAM-диск), а initramfs — как «initial RAM file system» (начальная RAM-файловая система). Оба типа образов выполняют одну и ту же функцию: предоставляют программу linuxrc, которая инициализирует систему.

Образ содержит базовую файловую систему, которая может использоваться для выполнения различных задач инициализации. Причина использования образа в RAM состоит в том, что в системах Linux в качестве корневой файловой системы (/) может использоваться широкий спектр устройств. Некоторые устройства могут создаваться на основе внешних USB-накопителей или программного RAID-массива; некоторые устройства могут даже находиться на другом компьютере и быть доступны через службы NFS, Samba или iSCSI. Такие типы файловых систем не могут быть смонтированы ядром до загрузки специального программного обеспечения, которое, в свою очередь, размещается именно на этих файловых системах. Получается замкнутый круг!

Чтобы обеспечить корректную загрузку системы в подобных ситуациях, загрузчик создаёт в памяти небольшой виртуальный жёсткий диск — RAM-диск — и переносит на него временную корневую файловую систему из образа initrd или initramfs. Ядро Linux может затем использовать эту временную файловую систему для загрузки необходимого программного обеспечения и выполнения задач, необходимых для монтирования настоящих файловых систем на устройствах других типов.

Фаза ядра

После выбора операционной системы для запуска загрузчик загружает ядро (kernel) операционной системы с жёсткого диска в оперативную память. В нашем случае загрузчик загружает ядро Linux в RAM. Ядро Linux находится в каталоге /boot файловой системы, как показано в следующем листинге:

openSUSE:/boot # ls -l
total 71624
-rw-r--r-- 1 root root 2121532 Jul 22 10:03 System.map-3.11.10-21-desktop
-rw-r--r-- 1 root root 2133585 Nov  1 2013 System.map-3.11.6-4-desktop
-rw-r--r-- 1 root root     512 Nov 12 09:06 backup_mbr
lrwxrwxrwx 1 root root       1 Nov 12 08:53 boot -> .
-rw-r--r-- 1 root root    1484 Oct 18 2013 boot.readme
-rw-r--r-- 1 root root  142128 Jul 22 09:19 config-3.11.10-21-desktop
-rw-r--r-- 1 root root  141289 Nov  1 2013 config-3.11.6-4-desktop
drwxr-xr-x 2 root root    4096 Nov 12 08:53 grub
drwxr-xr-x 7 root root    4096 Nov 25 19:21 grub2
lrwxrwxrwx 1 root root      25 Nov 25 19:20 initrd -> initrd-3.11.10-21-desktop
-rw------- 1 root root 22073671 Nov 25 19:20 initrd-3.11.10-21-desktop
-rw------- 1 root root 22072513 Nov 25 19:21 initrd-3.11.6-4-desktop
-rw-r--r-- 1 root root  620544 Nov  6 2013 message
-rw-r--r-- 1 root root  259397 Jul 22 10:15 symvers-3.11.10-21-desktop.gz
-rw-r--r-- 1 root root  258310 Nov  1 2013 symvers-3.11.6-4-desktop.gz
-rw-r--r-- 1 root root     500 Jul 22 10:14 sysctl.conf-3.11.10-21-desktop
-rw-r--r-- 1 root root     500 Nov  1 2013 sysctl.conf-3.11.6-4-desktop
-rw-r--r-- 1 root root 6576950 Jul 22 10:14 vmlinux-3.11.10-21-desktop.gz
-rw-r--r-- 1 root root 6614802 Nov  1 2013 vmlinux-3.11.6-4-desktop.gz
lrwxrwxrwx 1 root root      26 Nov 12 11:12 vmlinuz -> vmlinuz-3.11.10-21-desktop
-rw-r--r-- 1 root root 5125904 Jul 22 10:03 vmlinuz-3.11.10-21-desktop
-rw-r--r-- 1 root root 5154672 Nov  1 2013 vmlinuz-3.11.6-4-desktop

Ядро системы — это файл vmlinuz-version.gz, находящийся в данном каталоге. Обратите внимание, что ядро имеет расширение .gz. Это объясняется тем, что ядро хранится на жёстком диске в сжатом виде. Возможно, при первой загрузке системы Linux вы видели на экране сообщение наподобие «Uncompressing Linux» («Распаковка Linux»). Теперь вы знаете, почему оно появляется!

После загрузки ядра происходит несколько важных событий:

  • Ядро инициализирует базовое аппаратное обеспечение системы, используя различные параметры BIOS и микросхемы CMOS.
  • Ядро выполняет поиск и использует файловую систему initrd или initramfs для запуска программы linuxrc, выполняющей начальную настройку системы.
  • После завершения работы linuxrc файловая система initrd или initramfs отмонтируется, а RAM-диск уничтожается.
  • Ядро проверяет наличие нового оборудования и загружает соответствующие модули драйверов.
  • Монтируется настоящая корневая файловая система (/).
  • Ядро запускает процесс init или systemd.

То, какой из процессов будет использоваться, зависит от дистрибутива. В более старых дистрибутивах Linux практически повсеместно применялся демон (daemon) init. Однако большинство современных дистрибутивов перешли на демон systemd. В связи с этим процесс systemd заменяет процесс init и связанные с ним сценарии инициализации (которые мы рассмотрим далее в этой главе). Процесс systemd также управляет многими другими службами Linux, которые не находились в ведении традиционного демона init, например входом пользователей в систему и настройкой имени хоста. Ещё одно принципиальное отличие состоит в том, что systemd может запускать свои процессы инициализации параллельно, тогда как старый процесс init делал это последовательно.

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

Примечание

Переход с init на systemd вызвал споры в сообществе Linux. Многие разработчики программного обеспечения и администраторы Linux предпочитают init, тогда как другие придерживаются противоположного мнения. Из-за этого некоторые дистрибутивы отказались переходить на systemd и настаивают на использовании init. Следует также знать, что в середине 2000-х годов существовал недолговечный третий вариант — демон Upstart. Он выполнял ту же функцию, что и init и systemd. В настоящее время только дистрибутив Google Chrome OS по-прежнему использует Upstart. Все остальные дистрибутивы, ранее применявшие Upstart, с тех пор перешли на systemd.

Общий обзор процесса загрузки представлен на рис. 6-4.

Рис. 6-4. Общий обзор процесса загрузки Linux.

Рис. 6-4. Общий обзор процесса загрузки Linux.

Имея эти сведения, вы готовы приступить к изучению настройки загрузчиков. Рассмотрим это в следующем разделе.