Процесс загрузки Linux‑системы

catbot
31.01.2026 18:18
9 просмотров

Когда мы нажимаем кнопку питания на компьютере, до появления приглашения ввода логина проходит несколько этапов. Каждый из них решает свою задачу: проверка железа, поиск загрузчика, запуск ядра и подготовка пользовательской среды.

1. BIOS/UEFI: старт системы

После включения процессор начинает выполнять код встроенной прошивки материнской платы - BIOS или UEFI.

Прошивка выполняет самотест (POST), инициализирует базовые устройства (оперативная память, контроллеры, видеосистема) и по настройкам выбирает загрузочное устройство: диск, флешку, сетевую карту и т.д.

Основная задача этого этапа - подготовить железо и найти, откуда загружать операционную систему.

2. MBR/GPT: первая стадия загрузки

В начале диска находится область, отвечающая за разметку и начальный код загрузки:

MBR (Master Boot Record) - классическая схема, занимает первые 512 байт диска.

GPT (GUID Partition Table) - современная схема, логически отделяет таблицу разделов и код загрузки.

В этой области лежит крошечный фрагмент кода - первая стадия загрузчика. Его возможности ограничены: он только считывает таблицу разделов и находит место, где расположена "вторая стадия" полноценного загрузчика (обычно на разделе /boot).

3. Загрузчик (GRUB/LILO): выбор и запуск ядра

Дальше управление получает загрузчик второго этапа - чаще всего GRUB.

Он уже умеет работать с файловыми системами и конфигурационными файлами.

Типичные задачи загрузчика:

  • Показать меню с вариантами загрузки (разные ядра, режим восстановления, другие ОС).
  • По выбору пользователя загрузить в память образ ядра Linux и initramfs (initial RAM filesystem).
  • Передать управление загруженному ядру.

В системах с dual‑boot GRUB может не только загружать Linux, но и "передавать эстафету" загрузчику Windows (chainloading).

4. initramfs: временная файловая система в памяти

После загрузки в память ядро получает вместе с ним образ initramfs - это небольшая файловая система, расположенная в оперативной памяти.

Зачем она нужна:

  • На "настоящем" корневом разделе (/) лежат драйверы и модули, но чтобы его смонтировать, эти драйверы уже должны быть доступны.
  • initramfs решает эту проблему, предоставляя ядру временный root с необходимыми модулями, скриптами и утилитами.

Типичный сценарий работы initramfs:

  1. Ядро монтирует initramfs как временную корневую файловую систему и запускает из неё скрипт /init.
  2. /init подгружает модули ядра, настраивает RAID, LVM, расшифровывает шифрованные разделы и ищет постоянный корневой раздел.
  3. После нахождения и монтирования «настоящего» root выполняется переход (switch_root/pivot_root) на него, и система готова стартовать основную init‑систему.

По сути initramfs - одноразовая мини‑система, которая существует только во время старта и "исчезает" после перехода на основной root.

5. Ядро Linux: инициализация системы

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

На этом этапе формируется базовый программный "скелет" системы: ядро уже умеет работать с устройствами и файловыми системами и готово запускать пользовательские процессы.

Когда корневой раздел смонтирован, ядро запускает первый пользовательский процесс с PID 1 - init‑систему.

6. Init‑система: запуск служб и пользовательской среды

Init‑система - это первый процесс в пространстве пользователя, который отвечает за запуск всех остальных сервисов и подготовку окружения для пользователя.

В современных дистрибутивах чаще всего используется systemd, но исторически применялись и другие варианты:

SysV init - набор shell‑скриптов и runlevel’ов (0,1,3,5 и т.д.), запускающих службы в определённом порядке.

Upstart - событийная система, где службы стартуют в ответ на события (запуск системы, поднятие сети и т.п.).

systemd - современная система с unit‑файлами, параллельным запуском служб, зависимостями и мощным журналированием.

Основные задачи init‑системы:

  • Запустить системные службы (журналы, сеть, диспетчер входа, SSH, cron и др.).
  • Смонтировать дополнительные файловые системы.
  • Запустить графический сервер и рабочее окружение пользователя либо выдать текстовое приглашение логина.

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

Глоссарий терминов

BIOS и UEFI - "Начальники железа"

  • BIOS (Basic Input/Output System - базовая система ввода‑вывода)
    Представьте BIOS как "бригадира" на стройке. Когда вы включаете компьютер, он просыпается первым, проверяет, что все рабочие (железо) на месте и в состоянии работать, а затем показывает, откуда начинать строительство (загрузку системы).
    Это старая технология: она простая, но имеет ограничения (например, не видит очень большие современные диски и имеет примитивный текстовый интерфейс).
  • UEFI (Unified Extensible Firmware Interface)
    Это "современный менеджер" на замену старому бригадиру BIOS. Он делает то же самое (проверяет железо и ищет загрузчик), но гораздо умнее:
    • Понимает мышку и имеет красивый графический интерфейс.
    • Видит диски огромного объёма (больше 2 ТБ).
    • Умеет загружаться быстрее и безопаснее (Secure Boot).
      Сегодня почти на всех новых компьютерах стоит именно UEFI, хотя по привычке мы часто называем его BIOS.
  • POST (Power-On Self Test)
    Это "утренняя перекличка" железа. Сразу после включения BIOS/UEFI быстро проверяет основные узлы:
    • Оперативная память (RAM) - целая ли?
    • Видеокарта - работает ли вывод на экран?
    • Клавиатура - подключена ли?
      Если всё хорошо - компьютер пикнет один раз или просто покажет логотип. Если что-то сломалось - начнёт пищать кодами ошибок (например, три длинных гудка - проблема с памятью).

Разметка диска: MBR и GPT
Чтобы компьютер понял, где на диске лежат файлы, диск нужно разметить.

  • MBR (Master Boot Record - главная загрузочная запись)
    Старый способ разметки, как старая карта города.
    • Ограничение: видит диск размером максимум 2 Терабайта.
    • Может иметь всего 4 главных раздела (например, диск C, D, E и F).
    • Хранит информацию о разделах только в одном месте (в самом начале диска) - если это место повредится, можно потерять все данные.
      Загрузчик при такой разметке часто "втискивается" прямо в эти первые байты диска.
  • GPT (GUID Partition Table - таблица разделов GUID)
    Современная "карта города".
    • Понимает диски любого реального размера (хоть 100 ТБ).
    • Позволяет создать огромное количество разделов (теоретически - бесконечно, практически - 128 и больше).
    • Хранит копии таблицы разделов в начале и в конце диска - если начало повредится, данные можно восстановить из копии.
      Обычно используется в паре с UEFI.

Загрузчики в мир ОС

  • Загрузчик (Bootloader)
    Это маленькая программа-посредник. BIOS/UEFI слишком примитивен, чтобы разбираться в файлах операционной системы. Поэтому он запускает загрузчик, а уже загрузчик знает: "Ага, ядро Linux лежит вот в этой папке на этом диске, сейчас я его прочитаю и запущу".
    Примеры: GRUB (для Linux), Windows Boot Manager (для Windows).
  • GRUB (GRand Unified Bootloader)
    Самый популярный и мощный загрузчик в мире Linux.
    Его суперсилы:
    • Умеет загружать почти любую операционную систему.
    • Показывает меню при включении компьютера, где вы можете выбрать: "Загрузить Ubuntu", "Загрузить Windows" или "Восстановить систему".
    • Если что-то сломалось, у него есть своя командная строка, через которую иногда можно починить загрузку вручную.
  • Chainloading (Цепная загрузка)
    Это когда один загрузчик не грузит систему сам, а передает управление другому загрузчику.
    Представьте: вы выбрали в меню GRUB пункт «Windows». GRUB не умеет запускать ядро Windows напрямую, он просто говорит: «Эй, загрузчик Windows, твой выход!», и передаёт управление ему. Для пользователя это выглядит просто как выбор пункта меню.

Внутренности Linux: Ядро и его помощники

  • Ядро (Kernel)
    Это "мозг" операционной системы.
    Ядро - это самая главная программа, которая управляет всем компьютером.
    • Оно решает, какой программе дать поработать процессором прямо сейчас.
    • Оно выделяет память программам и следит, чтобы они не мешали друг другу.
    • Оно общается с железом (дисками, видеокартой, мышкой).
      Пользователь с ядром напрямую не общается - для этого есть оболочки и программы.
  • Драйвер
    Это "словарь" или "инструкция" для ядра.
    Ядро само по себе не знает, как управлять конкретной моделью видеокарты NVIDIA или принтером Canon. Драйвер - это модуль, который объясняет ядру: "Чтобы напечатать страницу на этом принтере, нужно отправить вот такие команды в порт USB".
    Без драйверов железо просто "мертвый груз".
  • initramfs (Initial RAM Filesystem)
    Это "аварийный чемоданчик" для старта ядра.
    Проблема: чтобы прочитать файлы с диска, ядру нужен драйвер диска. Но драйвер диска сам лежит на диске! Как его прочитать, если мы еще не умеем читать диск?
    Решение: initramfs - это маленький архив, который загрузчик кладёт в оперативную память вместе с ядром. В нём уже лежат самые важные драйверы. Ядро сначала открывает этот архив, берёт оттуда драйвер диска, а уже потом может читать настоящий большой диск с системой.
  • Root (Корень, /)
    Это главная папка всей системы Linux.
    В Windows есть диски C:, D:, E:. В Linux всё начинается от одного корня - символа /.
    Все остальные диски и флешки "подключаются" (монтируются) внутрь папок в этом корне. Когда система загружена, именно в корне лежат все ваши программы, настройки и файлы.

Init-системы: "Управляющие процессами"
После того как ядро запустилось, оно запускает самый первый процесс (PID 1). Этот процесс должен запустить всё остальное (сеть, звук, экран входа в систему). Это и есть Init-система.

  • SysV init (System V init)
    Классический, "дедовский" метод.
    • Работает по строгой очереди: сначала запусти сеть, потом (когда сеть готова) запусти SSH, потом запусти веб-сервер.
    • Использует простые и понятные скрипты (текстовые файлы с командами).
    • Минус: загрузка идёт медленно, потому что процессы ждут друг друга.
  • systemd
    Современный стандарт (используется в Ubuntu, Debian, CentOS, Fedora).
    • Умеет запускать всё параллельно: сеть и звук грузятся одновременно, не ожидая друг друга, если не зависят друг от друга.
    • Очень мощная и сложная: умеет перезапускать упавшие службы, следить за логами, управлять таймерами.
    • Многие критикуют её за сложность ("комбайн, который делает всё"), но она де-факто стандарт сегодня.
  • Upstart
    Попытка сделать что-то среднее между старым SysV и новым systemd.
    Главная идея - "события". Не просто "запусти сеть", а "если вставили сетевой кабель - запусти настройку сети".
    Сейчас почти не используется, так как systemd победила в "войне init-систем".