Найти в Дзене

Linux загрузка. Процессы управления системой. Init. Systemd.

После загрузки и завершения процесса инициализации ядро создает спонтанные процессы в пользовательском пространстве. Спонтанные, потому что они запускаются автономно, а не создаются, как должно быть, только по воле существующих процессов. Такие процессы можно распознать с помощью команды ps, у них будет низкое значение PID и скобки вокруг их имени. Например, [netns], [kworker/0:0H] и т.д. Исключением из этого шаблона является демон init или менеджер systemd. Они имеют идентификатор процесса 1. Init Init - это, грубо говоря, программа, которая запускает другие программы (процессы, службы) и имеет PID процесса 1. Главной целью Init является обеспечение того, чтобы система запускала правильные комплекты служб и демонов в любой момент времени. Для достижения этой цели существует понятие режима. Вот некоторые из этих режимов: Каждый режим связан с определенным наборам служб, а Init запускает и останавливают службы по мере необходимости, чтобы привести систему в соответствии с активным р
Оглавление

После загрузки и завершения процесса инициализации ядро создает спонтанные процессы в пользовательском пространстве. Спонтанные, потому что они запускаются автономно, а не создаются, как должно быть, только по воле существующих процессов. Такие процессы можно распознать с помощью команды ps, у них будет низкое значение PID и скобки вокруг их имени. Например, [netns], [kworker/0:0H] и т.д. Исключением из этого шаблона является демон init или менеджер systemd. Они имеют идентификатор процесса 1.

Init

-2

Init - это, грубо говоря, программа, которая запускает другие программы (процессы, службы) и имеет PID процесса 1. Главной целью Init является обеспечение того, чтобы система запускала правильные комплекты служб и демонов в любой момент времени. Для достижения этой цели существует понятие режима. Вот некоторые из этих режимов:

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

Каждый режим связан с определенным наборам служб, а Init запускает и останавливают службы по мере необходимости, чтобы привести систему в соответствии с активным режимом.

Init ничего не знает о запущенных командах. Он просто запускает набор команд или сценариев, которые были назначены для выполнения в том или ином контексте выполнения.

Традиционно системные режимы называются уровнями выполнения или инициализации. По умолчанию, в системе существует 7 уровней инициализации:

0 - остановка системы
1 - загрузка в однопользовательском режиме
2 - загрузка в многопользовательском режиме без поддержки сети
3 - загрузка в многопользовательском режиме с поддержкой сети
4 - не используется
5 - загрузка в многопользовательском режиме с поддержкой сети и графического входа в систему
6 - перезагрузка

Выполнив команды init n в терминале, где n - номер уровня, можно переключиться в любой из вышеперечисленных уровней.

Реализация запусков процессов выполняются лишь в заданном порядке. То есть более поздние действия не могут выполнятся до тех пор, пока не будут закончены все предыдущие, поэтому выполнять параллельно их невозможно. Система из-за этого тратит много времени, чтобы изменить состояние какого-либо процесса. Этого удалось избежать, благодаря менеджеру systemd.

Systemd

-3

Менеджер systemd пришел на смену init. В новой системе управления были реализованы не только все функции init, но так же были определена надежная модель зависимостей не только среди служб, но и среди "целей". Менеджер systemd не только управляет процессами параллельно, в отличии от init, но также управляет сетевыми подключениями (networkd), записями журнала ядра (journald) и авторизацией (logind).

Systemd управляет модулями (unit). Модулем может быть что угодно: служба, сокет, устройство, точка монтирования и т.д. Внутри systemd поведение каждого модуля определяется и настраивается модульным файлом. Эти файлы расположены обычно в следующих каталогах:
/usr/lib/systemd/system - содержимое этого каталога считается ресурсом и здесь менять ничего не надо.
/etc/systemd/system - здесь хранятся локальные модульные файлы, они имеют приоритет выше чем у остальных, поэтому и настраивают их здесь.
/run/systemd/system - здесь так же хранятся модульные файлы.

Более подробно из чего состоят модульные файлы рассмотрим немного позже. Сейчас давайте остановимся на командах управления.

Для управления и изучения состояния менеджера systemd используется команда systemctl. У этой команды существуют еще и подкоманды, синтаксис их вызова следующий

$systemctl подкоманда

Вызов systemctl без каких либо аргументов по умолчанию вызывает подкоманду list-units, в которой отображаются все загруженные и активные службы, сокеты, цели, смонтированные диски и устройства. Для того, чтобы отобразить только загруженные и активные службы, нужно использовать ключ --type=service:

$systemctl list-units --type=service

Так же иногда полезно видеть все инсталлированные модули, независимо активны они или нет, это можно сделать следующей командой:

$systemctl list-unit-files --type=service

Наиболее распространенные подкоманды команды systemctl:

  • list-unit-files - Показывает установленные модули;
  • enable модуль - включает модуль для активации при загрузке
  • disable модуль - запрещает запуск модуля при загрузке
  • isolate цель - Изменяет режим работы на целевой
  • start модуль - Немедленно активирует модуль
  • stop модуль - Немедленно деактивирует модуль
  • restart модуль - Перезапускает модуль
  • status модуль - Показывает статус модуля
  • kill шаблон - Отправляет сигнал в модуль, соответствующий шаблону
  • reboot - Перезагрузка ПК
  • daemon-reload -Перезагружает файлы модулей и конфигурацию systemd

Давайте рассмотрим вывод подкоманды status на основе модуля chronyd

$systemctl status chronyd

-4

Здесь команда systemctl с подкомандой status показывает, что служба запускается вместе с загрузкой системы. Об этом говорит параметр enabled в строке loaded. В строке Active сказано, что служба активна(запущена), когда и сколько времени прошло с момента запуска. Далее идут строчки Docs - это где можно посмотреть информацию о службе и в каком разделе, а так же с каким PID запущена эта служба. Вот как-то так.

Резюме.

В этой статье вкратце постарался написать про такие важные вещи, как init и systemd. Более подробно опишу их работу в будущем, так как эти вещи одной статьей не опишешь. На данном этапе вы должны уже понимать, что происходит во время "от нажатия кнопки Power до того момента, когда на машине можно работать" + немного рассмотрели как поверхностно провести траблшутинг (поиск проблем) системы. Надеюсь было интересно, а так же надеюсь на обратную связь от Вас. Так же не забываем полписываться на мой канал в телеге https://t.me/crazy_linuxoid/, чтобы не пропустить появление новых статей.