Что запускает образ Linux при старте системы?

«Что запускает образ Linux при старте системы?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Запуск образа Linux — это многоуровневый процесс, инициируемый загрузчиком и завершаемый пространством пользователя. Вот ключевые этапы с точки зрения DevOps (например, при загрузке виртуальной машины или контейнера):

  1. Загрузчик (Bootloader): Программа типа GRUB или systemd-boot загружает ядро Linux (vmlinuz) и initramfs (initial RAM filesystem) в память из образа диска (например, qcow2, raw) и передает им управление.

  2. Ядро (Kernel): Ядро распаковывается в память, инициализирует оборудование (или виртуальное оборудование от гипервизора), монтирует корневую файловую систему (rootfs), указанную в параметрах загрузки (root=). Initramfs содержит временные драйверы, необходимые для этого этапа (например, для LVM или сетевого root).

  3. Первый процесс пользователя (PID 1): После монтирования rootfs ядро выполняет программу, указанную параметром init= (по умолчанию /sbin/init). В современных системах это почти всегда systemd. Этот процесс становится родителем всех остальных процессов.

  4. Systemd и целевые юниты (targets): Systemd монтирует файловые системы из /etc/fstab, активирует сокеты, запускает системные сервисы (через .service файлы) и переходит в целевое состояние, например, multi-user.target (текстовый режим) или graphical.target.

Контекст контейнеров: В контейнере (Docker/containerd) процесс похож, но упрощен:

  • Ядро хоста используется совместно.
  • Загрузчик и этап инициализации оборудования отсутствуют.
  • Специализированная среда выполнения (runc) монтирует корневую файловую систему из образа контейнера и напрямую запускает указанную команду (например, /bin/bash), которая становится PID 1 внутри пространства имен (namespace) контейнера.
    # Docker делает примерно следующее:
    # 1. Создает namespaces (pid, net, mnt, etc.)
    # 2. Монтирует слои образа в rootfs контейнера
    # 3. Запускает /bin/bash как первый и главный процесс
    docker run -it ubuntu:22.04 /bin/bash

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