Введение / Зачем это нужно
Выбор init-системы — это фундаментальное решение при выборе или сборке дистрибутива Linux. Init-система (PID 1) — это первый процесс, который запускает ядро, и она отвечает за инициализацию всей системы, запуск и контроль служб (демонов), а также за обработку завершения работы.
Понимание различий между systemd, SysV init, OpenRC и runit критически важно для:
- Системных администраторов: для эффективного управления службами и диагностики проблем.
- Разработчиков встраиваемых систем: для минимизации потребления ресурсов.
- Энтузиастов: для создания кастомных, легковесных или специализированных сборок.
- Всех, кто сталкивается с проблемами загрузки или управления службами.
Этот гайд даст вам четкие критерии для выбора, основанные не на идеологии, а на практических потребностях вашего проекта.
Требования / Подготовка
Для выполнения этого гайда и осмысленного сравнения вам потребуется:
- Базовое понимание архитектуры Linux (процессы, демоны, ядро).
- Доступ к терминалу Linux (можно в виртуальной машине).
- (Опционально) Возможность загружать Live-ISO различные дистрибутивов для тестирования.
Сравнение архитектур и концепций
Что такое PID 1?
Это первый процесс, запускаемый ядром. Всё остальное — его потомки. Его задача — запустить остальную систему и потом "умереть" не должен, чтобы не оставить "зомби"-процессы. Современные init-системы выполняют гораздо больше.
Ключевые различия в таблице
| Критерий | systemd | SysV init (ISC) | OpenRC | runit |
|---|---|---|---|---|
| Параллелизм | Полный, на основе зависимостей и cgroups. | Последовательный (runlevels), слабый параллелизм через startpar. | Частичный, требует явного указания зависимостей. | Полный, независимые службы запускаются параллельно. |
| Конфигурация | Декларативные unit-файлы (.service, .timer). | Скрипты (/etc/init.d/) и симлинки в /etc/rc?.d/. | Скрипты (/etc/init.d/) и зависимости в /etc/conf.d/. | Простое управление через каталоги (/etc/sv/, /var/service/). |
| Управление | systemctl (единая утилита для всего). | service, chkconfig, /etc/init.d/. | rc-service, rc-update. | sv (управление), ln -s (включение). |
| Журналинг | Встроенный (journald), бинарный, с фильтрацией. | Внешний (rsyslog, syslog-ng). | Внешний (обычно syslog-ng). | Внешний (svlogd, или любой syslog). |
| Зависимости | Глубокая, через After=, Requires=, PartOf=. | Через номера в именах скриптов (S01name, K01name). | Через need, use, before, after в скриптах. | Нет встроенного механизма, зависит от порядка запуска в каталоге. |
| Требует cgroups? | Да, для контроля ресурсов и деревьев процессов. | Нет. | Нет. | Нет. |
| Пример дистрибутивов | Ubuntu, Debian, RHEL/Fedora, Arch, openSUSE. | Devuan, старые версии Debian (до 8). | Alpine, Gentoo, Artix. | Void Linux, Artix, Alpine (опционально). |
| Философия | "Всё в одном", интеграция, сложность ради функциональности. | Простота, "делай одну thing и делай её хорошо". | Гибкость, простые скрипты, совместимость с BSD. | Простота, надежность, "сделай и забудь". |
Подробный разбор каждой системы
1. systemd: Современный стандарт
Архитектура: Монолитная, но модульная. PID 1 (systemd) — это менеджер системы и служб. Он управляет:
- cgroups для изоляции и учета ресурсов.
- Journal для централизованного логирования.
- D-Bus для IPC.
- Сети (networkd), логин (logind), таймеры (timer units).
Преимущества:
- Скорость загрузки: Параллельный запуск на основе зависимостей.
- Мощность: Глубокий контроль над жизненным циклом служб (рестарт, таймауты, ресурсы).
- Интеграция: Единая точка входа (
systemctl), единый журнал (journalctl). - Стандартизация: Фактический отраслевой стандарт, огромная поддержка.
Недостатки:
- Сложность: Большая кодобаза, много "магии" под капотом.
- Потребление ресурсов: Выше, чем у альтернатив (хотя и минимальное).
- Философские споры: Нарушает Unix-философию "одна программа — одна задача".
Когда выбирать: Для десктопов, серверов, где важны скорость, современные функции (снимки, изоляция) и доступ к обширной документации/сообществу.
2. SysV init: Классика
Архитектура: Простая. PID 1 — это init, который читает /etc/inittab и запускает скрипты из /etc/init.d/ в соответствии с текущим runlevel'ом (0-6). Управление через service и chkconfig.
Преимущества:
- Простота: Код маленький, понятный, легко читать и отлаживать.
- Стабильность: Проверена десятилетиями.
- Минимализм: Почти нулевые накладные расходы.
Недостатки:
- Медленная загрузка: Последовательный запуск служб.
- Слабое управление: Нет встроенного контроля зависимостей, сложно управлять динамическими службами.
- Устаревание: Подавляющее большинство современных дистрибутивов отказались от него.
Когда выбирать: Только для legacy-систем, образовательных целей или в дистрибутивах, сознательно отказавшихся от systemd (Devuan). В новых проектах — не рассматривать.
3. OpenRC: Гибкий и совместимый
Архитектура: PID 1 — это init, а управление службами осуществляется через скрипты в /etc/init.d/ (совместимы с SysV) и файлы зависимостей в /etc/conf.d/. Запуск параллельный, но зависимости нужно описывать явно в скриптах.
Преимущества:
- Гибкость: Совместимость с скриптами SysV, но с современным параллелизмом.
- Контроль: Понятные скрипты на Bash/POSIX sh.
- Минимализм: Нет глобального демона, только
initиrc. - Надежность: Используется в Alpine Linux (контейнеры, роутеры) и Gentoo.
Недостатки:
- Меньше "из коробки": Нет встроенного журналинга, управления сетью, сессий.
- Требует ручной настройки: Зависимости нужно прописывать в каждом скрипте.
Когда выбирать: Для встраиваемых систем, роутеров, контейнерных базовых образов (Alpine), где нужен баланс между простотой и современными возможностями. Идеален для Gentoo.
4. runit: Простота и надежность
Архитектура: PID 1 — это runsvdir, который мониторит каталоги в /etc/service/ (или /var/service/). Для каждой службы запускается runsv, который следит за одним процессом. Управление через sv (start/stop/status). Зависимости реализуются через скрипты-обертки.
Преимущества:
- Крайняя простота: Конфигурация — это просто каталог с исполняемым файлом
run. - Надежность: Автоматический перезапуск упавших служб.
- Минимализм: Очень малый размер и потребление памяти.
- Читаемость: Легко понять, как работает каждая служба.
Недостатки:
- Очень мало встроенного: Нет ничего, кроме управления процессами. Журналинг, таймеры — только внешние инструменты.
- Нет встроенных зависимостей: Требует хакерских решений для сложных цепочек.
- Меньше распространен: Меньше документации и примеров, чем для systemd/OpenRC.
Когда выбирать: Для простых, изолированных сервисов (микросервисы), встраиваемых систем, где важна предсказуемость и простота. Основа Void Linux.
Пошаговая инструкция: Как выбрать?
Шаг 1: Определите текущую init-систему
ps -p 1 -o comm=
systemd→ у вас systemd.init→ скорее всего, SysV или OpenRC (нужно смотреть в/etc/inittabили/etc/rc.conf).runit→ у вас runit.
Шаг 2: Ответьте на ключевые вопросы
- Для чего система? (Десктоп, сервер, встраиваемое устройство, контейнер).
- Важна ли максимальная скорость загрузки? (systemd > OpenRC ≈ runit > SysV).
- Нужны ли сложные зависимости между службами? (systemd > OpenRC > runit > SysV).
- Критично ли потребление памяти/CPU? (runit ≈ OpenRC < systemd).
- Нужен ли встроенный журналинг? (только systemd).
- Планируете ли вы глубоко кастомизировать? (OpenRC и runit проще для понимания и модификации).
Шаг 3: Сопоставьте ответы с таблицей выше
- Десктоп/современный сервер:
systemd. - Контейнер/роутер (Alpine):
OpenRC. - Минималистичный сервер/пользовательская сборка (Void/Gentoo):
runitилиOpenRC. - Legacy или максимальный минимализм:
SysV(только если нет выбора).
Шаг 4: Протестируйте
Скачайте Live-ISO:
- Alpine Linux (OpenRC) — для теста легковесной системы.
- Void Linux (runit) — для теста простой и быстрой системы.
- Ubuntu/Fedora (systemd) — для теста стандарта.
Загрузитесь с них в VM и пощупайте команды управления (
rc-service,sv,systemctl).
Шаг 5: Примите решение
Выбирайте дистрибутив, который по умолчанию использует нужную init. Не пытайтесь "втыкать" другую init в Ubuntu или Fedora — это путь к бесконечным проблемам. Если нужен полный контроль — используйте Gentoo или собирайте систему с нуля (LFS).
Проверка результата
Вы успешно выбрали init-систему, если:
- Понимаете её основные концепции и философию.
- Можете наглядно объяснить её преимущества для вашего случая.
- Умеете выполнять базовые операции: запуск/остановка/статус службы, включение/отключение автозапуска.
- Знаете, где хранятся конфигурационные файлы служб.
- Осознанно выбрали дистрибутив, соответствующий вашему выбору.
Возможные проблемы
Проблема: "Мне нужен systemd, но я хочу минимализм"
Решение: Используйте дистрибутивы на base systemd, но без лишних компонентов (например, Debian netinst с выбором только standard system utilities). Или настройте systemd на отключение ненужных юнитов (systemctl mask). Альтернатива — Alpine с OpenRC, если функционал systemd не критичен.
Проблема: "OpenRC/runit не могут управлять сложными зависимостями как systemd"
Решение: Для сложных сервисов (веб-сервер + БД + кэш) в OpenRC/runit придется создавать "мета"-скрипты-обертки, которые запускают несколько служб в нужном порядке, или использовать внешние оркестраторы (supervisor, s6). В systemd это делается декларативно в одном файле.
Проблема: "Нужен journald, но я на Alpine (OpenRC)"
Решение: Установите и настройте классический стек логирования: syslog-ng или rsyslog для сбора логов, и logrotate для ротации. Для централизованного сбора — fluentd или loki. Полноценной замены journalctl не будет, но функциональность достижима.
Проблема: "Скрипты служб в OpenRC не запускаются"
Решение: Проверьте:
- Права на скрипт в
/etc/init.d/: должен быть исполняемым (chmod +x). - Синтаксис скрипта (должен начинаться с
#!/sbin/openrc-runили быть совместим с SysV). - Файл зависимости в
/etc/conf.d/(если используется). - Вывод команды:
rc-service <имя_службы> start— она покажет ошибку.
Проблема: "runit служба не перезапускается после падения"
Решение: Проверьте, что каталог службы в /etc/service/ содержит исполняемый файл run и что он запускает процесс в foreground (не как демон). runsv управляет только foreground-процессами. Пример run-файла:
#!/bin/sh
exec /usr/bin/myapp --config /etc/myapp.conf
(без & и nohup).