Путешествие по процессам Linux – PID 1 (init)

287
Путешествие по процессам Linux - PID 1 (init)
Путешествие по процессам Linux - PID 1 (init)

После объяснения PID 0, теперь мы поговорим о PID 1. Наиболее известный как “init”. init – это первый созданный процесс в пользовательском режиме Linux, который выполняется до выключения системы. init управляет службами (в Linux они называются демонами, подробнее о них в следующей статье). Также, если мы проверим дерево процессов машины Linux, то обнаружим, что корнем дерева является init.

Существует множество реализаций init, каждая из которых обеспечивает различные преимущества, среди них: SysVinit, launched, systemd, runit, upstart, busybox-init и OpenRC (это только примеры и не полный список). Таким образом, в зависимости от реализации считываются специфические конфигурационные файлы (например, /etc/inittab – SysVinit), разные команды/инструменты для управления демонами (например, service – SysVinit и systemctl – systemd), и разные скрипты/профайлы могут выполняться в процессе загрузки (runlevels SysVinit против targets в systemd).

Создание init выполняется функцией ядра “rest_init”.

(https://elixir.bootlin.com/linux/latest/source/init/main.c#L680– показывает исходный код). В коде мы видим вызов “user_mode_thread”, который порождает init, позже в функции есть вызов “kernel_thread”, который создает PID 2 (но это для нашего следующего поста ;-).

Теперь мы рассмотрим несколько интересных фактов о init. Во-первых, если родительский процесс завершается раньше, чем все его дочерние процессы, init принимает эти дочерние процессы. Во-вторых, в init можно посылать только те сигналы, для которых явно установлен обработчик. Таким образом, посылка “kill -9 1” ничего не даст в большинстве дистрибутивов (попробуйте и увидите, что ничего не произойдет). Помните, что разные реализации init обрабатывают сигналы по-разному.

Поскольку существует несколько реализаций init (как мы уже говорили), мы можем определить установленную следующим образом. Можно выполнить команду “ls -l /sbin/init“. Если это не симлинк, то это, вероятно, SysVinit, если же он указывает на “/lib/systemd/systmed”, то используется systemd (и, конечно же, есть другие симлинки на другую реализацию – об этом можно прочитать в документации каждой реализации init).

Как вы видите на прилагаемом снимке экрана, Ubuntu 22.04 использует systemd:

прочитав ссылку "/sbin/init", проверьте, какая реализация init используется. В данном случае это systemd
прочитав ссылку “/sbin/init”, проверьте, какая реализация init используется. В данном случае это systemd