Загрузка системы и процесс init

⏱ 20 мин · 🧩 заданий: 5

Этапы загрузки

питание → прошивка (BIOS / UEFI) │ тест оборудования, поиск загрузчика ▼ загрузчик (GRUB) │ загружает vmlinuz (ядро) и initramfs ▼ ядро Linux │ инициализация памяти, прерываний, планировщика, драйверов │ монтирует initramfs → находит и монтирует корневую ФС ▼ /sbin/init (PID 1) — первый процесс режима пользователя │ ├── службы (sshd, cron, bind ...) └── getty → login → shell пользователя

Процесс init

init — первый процесс в пространстве пользователя, его PID = 1. Все остальные процессы — его потомки (pstree -p покажет дерево с корнем systemd(1) или init(1)).

Обязанности init:

  1. Запуск системы: монтирование файловых систем, запуск служб в нужном порядке, запуск программ входа на терминалах.
  2. Усыновление сирот: если родитель процесса завершился, ядро делает родителем init (или ближайший процесс-«subreaper»).
  3. Сбор зомби: init в цикле вызывает wait, чтобы завершившиеся сироты не висели в таблице процессов.
  4. Выключение: остановка служб, посылка сигналов SIGTERM, затем SIGKILL оставшимся процессам.

init защищён

Ядро не доставляет процессу с PID 1 сигналы, для которых он не установил обработчик, — даже SIGKILL от root. А если init всё-таки завершится, ядро остановится: Kernel panic - not syncing: Attempted to kill init!.

SysV init

Классический init читает /etc/inittab. Каждая строка описывает процесс и когда его запускать:

# id:уровни:действие:команда
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l3:3:wait:/etc/rc.d/rc 3
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
  • уровни выполнения (runlevels): 0 — выключение, 1 — однопользовательский, 3 — многопользовательский текстовый, 5 — графический, 6 — перезагрузка;
  • respawn — перезапускать процесс, если он завершился (так getty снова появляется на терминале после выхода пользователя).

init и сеансы

Каждый процесс из inittab (например, getty на терминале) init запускает в новом сеансе: в потомке вызывается setsid(), и процесс становится лидером сеанса и группы процессов (у него PID = SID = PGID). Это даёт init две возможности:

  • При смене уровня выполнения init останавливает «лишние» процессы, посылая сигнал всей группе: kill(-pid, SIGTERM), а через несколько секунд kill(-pid, SIGKILL). Так завершаются не только getty/login, но и все порождённые ими процессы этого сеанса.
  • Для учёта входов init (и login) записывают в файл utmp сведения о сеансе: PID процесса, терминал, тип записи (INIT_PROCESS, LOGIN_PROCESS, USER_PROCESS, DEAD_PROCESS), есть и поле идентификатора сеанса ut_session. Когда процесс завершается, init отмечает его запись как DEAD_PROCESS и, если нужно (respawn), запускает процесс заново.

Подробно о сеансах и группах — в уроке «Группы процессов, сеансы и терминал». Там же вернёмся к вопросу 3(c) экзамена.

systemd

В большинстве современных дистрибутивов PID 1 — systemd. Вместо скриптов и уровней — юниты и цели (targets):

# /etc/systemd/system/myapp.service
[Unit]
Description=My app
After=network.target

[Service]
ExecStart=/usr/local/bin/myapp
Restart=on-failure

[Install]
WantedBy=multi-user.target
systemctl start myapp       # запустить
systemctl enable myapp      # запускать при загрузке
systemctl status myapp
journalctl -u myapp         # журнал службы

systemd отслеживает процессы каждой службы не по сеансам, а через cgroups: все потомки службы попадают в её контрольную группу, даже если они вызывают setsid и «убегают» из сеанса. При остановке службы systemd завершает все процессы её cgroup.

Итог

  • Загрузка: прошивка → загрузчик → ядро → initramfs → корневая ФС → init (PID 1).
  • init запускает службы, усыновляет сирот и собирает зомби; его нельзя убить, а его гибель — kernel panic.
  • SysV init запускает процессы в новых сеансах (setsid) и управляет ими через сигналы группе; systemd отслеживает службы через cgroups.

Практика решено 0 из 5

Вы не вошли — ответы проверяются, но прогресс не сохранится. Войти или зарегистрироваться.
Задание 1 Расставить по порядку

Расставьте этапы загрузки Linux на компьютере с UEFI:

  1. Ядро запускает первый процесс пользователя — init с PID 1
  2. Прошивка UEFI проверяет оборудование и находит загрузчик на EFI-разделе
  3. Ядро инициализирует память, планировщик, драйверы
  4. Ядро монтирует initramfs и затем настоящую корневую ФС
  5. Загрузчик (GRUB) загружает в память образ ядра и initramfs
  6. init запускает службы и программы входа (getty, графический менеджер)
Задание 2 Ввод ответа

Какой PID у процесса init?

Задание 3 Несколько вариантов

Какие обязанности у процесса init?

Задание 4 Один вариант ответа

Что произойдёт, если процесс init завершится?

Задание 5 Один вариант ответа

Можно ли убить init командой kill -9 1 от root?

Войдите, чтобы отмечать пройденные уроки.