Системы инициализации Linux
В операционной системе Linux и других системах семейства Unix после завершения загрузки ядра начинается инициализация Linux системы, сервисов и других компонентов. За это отвечает процесс инициализации, он запускается ядром сразу после завершения загрузки, имеет PID 1, и будет выполняться пока будет работать система.
Процесс инициализации запускает все другие процессы, которые должны быть запущены, это родительский процесс для всего, что выполняется в системе. Другие процессы могут тоже создавать дочерние процессы, но если родительский процесс завершается, для его дочерних процессов родительским становится процесс инициализации.
Системы инициализации Linux
За время развития операционных систем были созданы различные системы инициализации Linux. В разных дистрибутивах использовались разные системы. В этой статье мы рассмотрим лучшие системы инициализации, которые вы можете сейчас использовать. Мы начнем с более старых систем с меньшим функционалом, чтобы понять с чего все начиналось, затем подойдем к более новым, созданным в последнее время.
1. System V Init
System V или SysV — это довольно старая, но до сих пор ещё популярная система инициализации Linux и Unix подобных операционных систем. Она была основой для создания многих других систем инициализации, а также первой коммерческой системой инициализации разработанной для Unix в AT&T. Она была разработана еще в 1983 году.
Почти все дистрибутивы Linux изначально использовали SysV. Исключением была только Gentoo, в которой использовалась собственная система инициализации и Slackware, с инициализацией в стиле BSD.
Основные возможности SysV:
- Написание файлов запуска служб на bash;
- Последовательный запуск служб;
- Сортировка порядка запуска с помощью номеров в именах файлов;
- Команды для запуска, остановки и проверки состояния служб.
Никакой параллельной загрузки, системы зависимостей, запуска по требованию и автоматического запуска здесь не было и в помине.
С момента ее разработки прошло много лет и из-за некоторых недостатков были разработаны другие системы для ее замены, они хоть и имели новые функции и были более эффективны, но они были по-прежнему совместимы с SysV.
2. OpenRC
OpenRC — это система инициализации Linux и Unix подобных операционных систем совместимая с Sys V Init и поддерживающая систему зависимостей во время запуска. Она приносит некоторые улучшения в SysV, и как и другие системы инициализации Linux, совместима с ней, но вы должны иметь в виду, что OpenRC не заменяет полностью файл /sbin/init. Эта система инициализации используется в Gentoo и дистрибутивах BSD.
Кроме стандартных возможностей SysV, здесь поддерживается также:
- Поддержка зависимостей служб;
- Поддержка параллельного запуска служб;
- Поддерживает настройку в одном отдельном файле;
- Работает как демон;
По сравнению с SysV тут появилось много новых возможностей, но все еще не все те, что нужны для оптимальной работы системы.
3. Systemd
Systemd — это новая система инициализации Linux. Она была введена по умолчанию в Fedora 15, а сейчас используется почти во всех популярных Linux дистрибутивах. Это не только инициализирующий процесс, поддерживающий огромное количество возможностей, но и набор инструментов для управления службами и этими возможностями из системы. Основная цель — иметь полный контроль над всеми процессами во время их запуска и на протяжении всего выполнения.
Systemd очень сильно отличается от всех существующих систем инициализации, тем как она работает с сервисами, и даже конфигурационными файлами сервисов. Совместимости со скриптами SysV нет, их нужно преобразовать в linux systemd unit файлы.
Вот ее основные особенности:
- Понятный, простой и эффективный дизайн;
- Параллельная загрузка служб на основе зависимостей;
- Поддерживается завершение дополнительных процессов;
- Поддерживается собственный журнал с помощью journald;
- Поддерживается планирование заданий с помощью таймеров Systemd;
- Поддерживается управление сетью с помощью networkd;
- Для управления DNS используется systemd-resolved;
- Хранение журналов в бинарных файлах;
- Сохранение состояния сервисов linux systemd для возможного восстановления;
- Улучшенная интеграция с Gnome;
- Запуск сервисов по требованию;
4. Runinit
Runinit — это кроссплатформенная система инициализации, которая может работать в GNU Linux, Solaris, BSD и MacOS. Это отличная альтернатива для SysV с поддержкой мониторинга состояния служб.
Здесь есть некоторые интересные особенности, которых нет в других системах инициализации:
- Полный контроль сервисов, каждый сервис привязывается к своему каталогу;
- Надежное средство журналирования и ротации логов;
- Быстрая система загрузки и выключения;
- Портативность;
- Легкое создание файлов конфигурации служб;
- Небольшое количество кода системы инициализации.
5. Upstart
Upstart — это система инициализации на основе событий, разработанная в Canonical и призванная заменять SysV. Она может запускать системные службы, выполнять над ними различные задачи, инспектировать их во время выполнения, а также выполнять нужные действия в ответ на события в системе.
Это гибридная система инициализации, она использует как SysV скрипты запуска, так и файлы служб Systemd. Вот ее самые заметные особенности:
- Изначально разработанная для Ubuntu, но может использоваться и в других дистрибутивах;
- Запуск и остановка служб на основе событий;
- Генерация событий во время запуска и остановки служб;
- События могут быть отправлены обычными процессами;
- Связь с процессом инициализации через DBus;
- Пользователи могут запускать и останавливать свои процессы;
- Перезапуск служб, которые неожиданно завершились;
- Параллельная загрузка сервисов;
- Автоматический перезапуск служб;
Большинство ее возможностей работают благодаря интеграции с системой инициализации Systemd. В последнее время всё меньше используются скрипты SysV init и всё больше применяются юнит файлы Systemd. Рано или поздно Systemd вытеснит и полностью заменит Upstart в Ubuntu.
Выводы
Как я уже говорил, система инициализации запускает и управляет всеми другими процессами в системе Linux. SysV до недавнего времени была основной системой инициализации в большинстве дистрибутивов Linux, но из-за некоторых своих недостатков для нее было разработано несколько замен, в том числе Systemd.
Какие системы инициализации Linux используются в вашем дистрибутиве? В списке обозначены не все существующие системы, какую из них нужно добавить в список? Напишите в комментариях!
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
Sysadminium
Из этой статьи вы узнаете что такое система инициализации SystemD, её основную цель, а также познакомимся с юнитами SystemD.
Что такое система инициализации
Система инициализации — это система в Linux, которая подготавливает к работе операционную систему. Система инициализации запускается ядром как первый процесс в операционной системе. И уже затем, этот первый процесс, запускает все остальные процессы. Также при выключении система инициализации занимается остановкой всех процессов.
Алгоритм загрузки операционной системы я описывал в этой статье.
Систем инициализации много, первой такой системой была SysV, потом для Ubuntu написали Upstart. Но сейчас система инициализации SystemD становится системой инициализации по умолчанию во многих популярных дистрибутивах Linux. В том числе и в Ubuntu 22.04, и в Debian 11.
В этой статье я некоторые примеры выполнял на Debian 11, а другие на Ubuntu 22.04, разницы нет никакой. Единственная разница — это версия SystemD:
Как видите в Ubuntu она поновее.
В первой системе инициализации SysV программа инициализации называлась init, для совместимости в SystemD оставили это название, но init это всего лишь символьная ссылка на systemd.
С помощью утилиты ps мы можем узнать какой процесс в системе является первым, то есть у какого процесса номер равен единице (PID=1).
alex@deb:~$ ps 1 PID TTY STAT TIME COMMAND 1 ? Ss 0:10 /sbin/init
Из вывода мы узнали, что первым процессом в системе является процесс приложения /sbin/init.
Посмотрим, что это за файл:
alex@deb:~$ 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). То есть службы могут запускаться по определённому расписанию, или с задержкой.
Вот примеры юнитов разных типов:
alex@deb:~$ ls -l /lib/systemd/system/ssh.service -rw-r--r-- 1 root root 538 мар 13 2021 /lib/systemd/system/ssh.service alex@deb:~$ ls -l /lib/systemd/system/default.target lrwxrwxrwx 1 root root 16 мар 20 22:55 /lib/systemd/system/default.target -> graphical.target alex@deb:~$ ls -l /lib/systemd/system/logrotate.timer -rw-r--r-- 1 root root 191 окт 14 2019 /lib/systemd/system/logrotate.timer
- ssh.service — служба ssh сервера, с помощью которого мы удалённо управляем linux системой;
- default.target — таргет который запускается при включении системы по умолчанию, при этом запускаются службы у которых настроен автозапуск для этого таргета.
- logrotate.timer — таймер, который запускает службу logrotate.service для ротации логов.
Список всех активных юнитов в системе можно посмотреть с помощью следующей команды:
alex@ubu:~$ systemctl list-units
Но так как юнитов слишком много, обычно выводят не все юниты а юниты определённого типа, например:
alex@ubu:~$ systemctl list-units -t service alex@ubu:~$ systemctl list-units -t timer alex@ubu:~$ systemctl list-units -t target
Если нужно получить список не только активных юнитов, то просто добавьте опцию all, например:
alex@ubu:~$ systemctl list-units -t target --all
Расположение юнитов
Юниты можно найти в следующих каталогах:
- /lib/systemd/system — системные юниты, устанавливаются обычно вместе с приложениями. Они имеют самый низкий приоритет.
- /run/systemd/system — динамически создаваемые юниты. Имеют средний приоритет.
- /etc/systemd/system — юниты создаваемые вручную. Имеют наивысший приоритет.
alex@s-deb:~$ 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, то наш созданный юнит будет иметь более высокий приоритет.
Итог
Вот мы и познакомились с системой инициализации SystemD, которая используется в Debian 11 и в Ubuntu 22.04 по умолчанию. В следующих статьях подробнее разберёмся с юнитами, и даже напишем свой сервис и таймер. А затем пробежимся по основным утилитам этой системы.
Узнали новую команду systemctl, с помощью которой в этой статье смотрели список юнитов в системе:
systemctl list-units # все активные юниты systemctl list-units --all # все юниты (не только активные) systemctl list-units -t # активные юниты определённого типа systemctl list-units -t --all # все юниты определённого типа