Система инициализации systemd
Что такое система инициализации
Система инициализации — это система в Linux, которая подготавливает к работе операционную систему. Система инициализации запускается ядром как первый процесс в операционной системе. И уже затем, этот первый процесс, запускает все остальные процессы. Также при выключении система инициализации занимается остановкой всех процессов.
Алгоритм загрузки операционной системы я описывал в этой статье .
Систем инициализации много, первой такой системой была SysV, потом для Ubuntu написали Upstart. Но сейчас система инициализации SystemD становится системой инициализации по умолчанию во многих популярных дистрибутивах Linux. В том числе и в Ubuntu 22.04, и в Debian 11.
В этой статье я некоторые примеры выполнял на Debian 11, а другие на Ubuntu 22.04, разницы нет никакой. Единственная разница — это версия SystemD:
- Ubuntu 22.04 — Version: 249.11-0
- Debian 11 — Version: 247.3-7
В первой системе инициализации SysV программа инициализации называлась init, для совместимости в SystemD оставили это название, но init это всего лишь символьная ссылка на systemd.
С помощью утилиты ps мы можем узнать какой процесс в системе является первым, то есть у какого процесса номер равен единице (PID=1).
$ ps 1
PID TTY STAT TIME COMMAND
1 ? Ss 0:10 /sbin/init
Из вывода мы узнали, что первым процессом в системе является процесс приложения /sbin/init. Посмотрим, что это за файл:
$ ls -l /sbin/init
lrwxrwxrwx 1 root root 20 мар 20 22:55 /sbin/init -> /lib/systemd/systemd
- /sbin/init - это символьная ссылка на /lib/systemd/systemd. Про ссылки я писал здесь .
Основная цель SystemD
Основная цель systemd это ускорение загрузки операционной системы за счет распараллеливания запуска процессов и отложенного запуска.
Распараллеливание достигается одновременным запуском не связанных служб. То есть, если одна служба не зависит от второй и у обоих есть достаточно ресурсов для запуска, то они запускаются одновременно.
Отложенный старт достигается за счет подготовки всего необходимого к запуску службы, но сама служба запускается позже, по требованию. Например, создаются все сокеты для работы службы, но служба запустится только когда к сокету обратятся.
Юниты
Все задачи которые выполняет SystemD описываются в специальных файлах, которые называются юниты (unit). Юниты бывают разных типов, в этом курсе мы рассмотрим только три типа юнитов:
- service — описывает сервис (службу) или скрипт, в общем все то что можно запустить;
- target — группирует юниты, то есть мы можем объединить две службы и запускать их как одну;
- timer — определяет таймер (аналог cron). То есть службы могут запускаться по определённому расписанию, или с задержкой.
Вот примеры юнитов разных типов:
$ ls -l /lib/systemd/system/ssh.service
-rw-r--r-- 1 root root 538 мар 13 2021 /lib/systemd/system/ssh.service
$ ls -l /lib/systemd/system/default.target
lrwxrwxrwx 1 root root 16 мар 20 22:55 /lib/systemd/system/default.target -> graphical.target
$ ls -l /lib/systemd/system/logrotate.timer
-rw-r--r-- 1 root root 191 окт 14 2019 /lib/systemd/system/logrotate.timer
- ssh.service — служба ssh сервера;
- default.target — таргет который запускается при включении системы по умолчанию;
- logrotate.timer — таймер, который запускает службу logrotate.service для ротации логов.
Список всех активных юнитов в системе можно посмотреть с помощью следующей команды:
$ systemctl list-units
Но так как юнитов слишком много, обычно выводят не все юниты а юниты определённого типа, например:
$ systemctl list-units -t service
$ systemctl list-units -t timer
$ systemctl list-units -t target
Если нужно получить список не только активных юнитов, то просто добавьте опцию all, например:
$ systemctl list-units -t target --all
Расположение юнитов
Юниты можно найти в следующих каталогах:
- /lib/systemd/system — системные юниты, устанавливаются обычно вместе с приложениями. Они имеют самый низкий приоритет.
- /run/systemd/system — динамически создаваемые юниты. Имеют средний приоритет.
- /etc/systemd/system — юниты создаваемые вручную. Имеют наивысший приоритет.
$ ls -ld /*/systemd/system
drwxr-xr-x 9 root root 4096 июн 20 15:09 /etc/systemd/system
drwxr-xr-x 19 root root 36864 июн 20 15:09 /lib/systemd/system
drwxr-xr-x 2 root root 40 июл 11 12:50 /run/systemd/system
Если мы создадим юнит в каталоге /etc/systemd/system, и с таким-же именем будет юнит в /lib/systemd/system, то наш созданный юнит будет иметь более высокий приоритет.
Если понравилась статья, подпишись на мой канал в VK или Telegram .