Загрузка системы и процесс init
Этапы загрузки
Процесс init
init — первый процесс в пространстве пользователя, его PID = 1. Все остальные процессы — его потомки (pstree -p покажет дерево с корнем systemd(1) или init(1)).
Обязанности init:
- Запуск системы: монтирование файловых систем, запуск служб в нужном порядке, запуск программ входа на терминалах.
- Усыновление сирот: если родитель процесса завершился, ядро делает родителем init (или ближайший процесс-«subreaper»).
- Сбор зомби: init в цикле вызывает
wait, чтобы завершившиеся сироты не висели в таблице процессов. - Выключение: остановка служб, посылка сигналов
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
Расставьте этапы загрузки Linux на компьютере с UEFI:
- Ядро запускает первый процесс пользователя — init с PID 1
- Прошивка UEFI проверяет оборудование и находит загрузчик на EFI-разделе
- Ядро инициализирует память, планировщик, драйверы
- Ядро монтирует initramfs и затем настоящую корневую ФС
- Загрузчик (GRUB) загружает в память образ ядра и initramfs
- init запускает службы и программы входа (getty, графический менеджер)
Какой PID у процесса init?
Какие обязанности у процесса init?
Что произойдёт, если процесс init завершится?
Можно ли убить init командой kill -9 1 от root?
Войдите, чтобы отмечать пройденные уроки.