Systemd — система инициализации.

Установка, настройка, эксплуатация.
Ответить
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Systemd — система инициализации.

Сообщение root »

Оглавление
Темы
Система инициализации
Перезапуск сервисов
Таймеры systemd
Диагностика запуска модулей ядра
Диагностика запуска сервисов
Редактирование и переопределение стандартных юнитов и таймеров
Управление порядком запуска служб
материал взят из статьи Шпаргалка по управлению сервисами systemd и дополнен

Systemd приносит концепцию юнитов systemd. Юниты представлены конфигурационными файлами, размещенными
в одной из директорий:
/usr/lib/systemd/system/ – юниты из установленных пакетов RPM.
/run/systemd/system/ — юниты, созданные в рантайме. Этот каталог приоритетнее каталога с установленными
юнитами из пакетов.
/etc/systemd/system/ — юниты, созданные и управляемые системным администратором. Этот каталог приоритетнее
каталога юнитов, созданных в рантайме.

Типы юнитов systemd:

Код: Выделить всё

.service – системный сервис
.target — группа юнитов systemd
.automount – точка автомонтирования файловой системы
.device – файл устройства, распознанного ядром
.mount – точка монтирования файловой системы
.path – файл или директория в файловой системе
.scope – процесс, созданный извне
.slice – группа иерархически организованных юнитов, управляющая системными процессами
.snapshot – сохраненное состояние менеджера systemd
.socket – сокет межпроцессорного взаимодействия
.swap – Swop-устройство или swop-файл (файл подкачки)
.timer – таймер systemd
Runlevel 3 это сейчас multi-user.target и runlevel 5 сейчас graphical.target.

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

Код: Выделить всё

systemctl start name.service – запуск сервиса.
systemctl stop name.service — остановка сервиса
systemctl restart name.service — перезапуск сервиса
systemctl try-restart name.service — перезапуск сервиса только, если он запущен
systemctl reload name.service — перезагрузка конфигурации сервиса
systemctl status name.service — проверка, запущен ли сервис с детальным выводом состояния сервиса
systemctl is-active name.service — проверка, запущен ли сервис с простым ответом: active или inactive
systemctl list-units --type service --all – отображение статуса всех сервисов
systemctl enable name.service – активирует сервис (позволяет стартовать во время запуска системы)
systemctl disable name.service – деактивирует сервис
systemctl reenable name.service – деактивирует сервис и сразу активирует его
systemctl is–enabled name.service – проверяет, активирован ли сервис
systemctl list-unit-files --type service – отображает все сервисы и проверяет, какие из них активированы
systemctl mask name.service – заменяет файл сервиса символической ссылкой на /dev/null, делая юнит недоступным для systemd
systemctl unmask name.service – возвращает файл сервиса, делая юнит доступным для systemd
systemctl daemon-reload - Перечитать конфигурацию systemd (после внесения правок в файлы сервисов)
systemctl list-timers --all - Вывести все запланированные задания
systemctl set-default multi-user.target - Установить целевой юнит multi-user 
systemctl set-default graphical.target - Установить целевой юнит graphical.target
systemctl isolate multi-user.target - Переключиться с graphical (runlevel5.target) на multi-user (runlevel2-4.target)
systemctl isolate graphical.target - Переключиться с  multi-user (runlevel2-4.target) на graphical (runlevel5.target)
systemctl get-default - Узнать какой текущий режим в системе используется  (graphical.target или multi-user.target)
systemctl daemon-reexec - Перезапустить systemd и заставит его переварить свою новую конфигурацию в процессе.
systemctl --failed - Вывести всё сервисы которые не запустились

Код: Выделить всё

poweroff.target (runlevel0.target) – завершение работы и отключение системы
rescue.target (runlevel1.target) – настройка оболочки восстановления
reboot.target (runlevel6.target) – выключение и перезагрузка системы
Выключение и перезагрузка системы
В systemctl заменяет значительное количество команд управления питанием. Прежние
команды сохранены для совместимости, но рекомендуется использовать systemctl:

Код: Выделить всё

systemctl halt – останавливает систему
systemctl poweroff – выключает систему
systemctl reboot – перезагружает систему
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Сообщение root »


  • после вывода компьютера из сна здесь.
  • Для автоматизации процесса перезапуска служб после обновления можно воспользоваться однострочным скриптом

    Код: Выделить всё

    for s in $(sudo needs-restarting -s); do sudo systemctl restart $s; done
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Сообщение root »

Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Сообщение root »


Код: Выделить всё

systemctl -l status systemd-modules-load.service
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Сообщение root »


Вывести список сервисов не загрузившихся при старте системы можно так:

Код: Выделить всё

systemctl --state=failed
или
systemctl --failed
Для диагностики правильности указания зависимостей в директивах After и Before можно использовать штатную команду поиска конфликтов systemd-analyze

Код: Выделить всё

systemd-analyze verify default.target
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Сообщение root »


В случае если нужно отредактировать какой-то из уже установленных в системе юнитов или таймеров, ни в коем случае не следует непосредственно править файл внутри каталога /usr/lib/systemd/, т.к. при следующем обновлении системы все изменения в нём будут перезаписаны.
Вместо этого следует использовать штатную возможность systemd:

Код: Выделить всё

systemctl edit --full foobar.service
Здесь foobar.service — имя нужного нам юнита/таймера, который мы будем редактировать. Systemd автоматически сделает копию файла в пользовательский каталог настроек /etc/systemd/system/, загрузит его в системном редакторе по умолчанию, а по окончании внесения изменений заставит systemd применить их.
Чтобы изменить редактор по умолчанию, можно воспользоваться системой изменения альтернатив:

Код: Выделить всё

update-alternatives --config editor
Для отката любых внесённых изменений следует использовать:

Код: Выделить всё

systemctl revert foobar.service
Для предотвращения очистки консоли после загрузки создайте каталог с именем /etc/systemd/system/getty@.service.d и разместите в нём файл nodisallocate.conf, чтобы переопределить параметр TTYVTDisallocate на no.

Код: Выделить всё

$EDITOR /etc/systemd/system/getty@.service.d/nodisallocate.conf
[Service]
TTYVTDisallocate=no
Аватара пользователя
root
Site Admin
Сообщения: 501
Зарегистрирован: 15 авг 2026 01:31

Сообщение root »

Для того чтобы ваш сервис в systemd гарантированно запускался после активации сетевого интерфейса, управляемого NetworkManager, необходимо подключить его к network-online.target. Важно убедиться, что NetworkManager на самом деле сигнализирует о network-online.target.
Сначала, вам нужно удостовериться, что NetworkManager-wait-online.service включен и активен. Этот сервис обязан запускаться до network-online.target и ожидать, пока NetworkManager установит соединение.
Вы можете включить это с помощью systemd:

Код: Выделить всё

systemctl enable NetworkManager-wait-online.service
Также, чтобы обеспечить зависимость вашего сервиса от сети, вы должны указать:

Код: Выделить всё

[Unit]
...
Requires=network-online.target
After=network-online.target ...
...

[Service]
# Здесь определите свои опции конкретного сервиса

[Install]
WantedBy=multi-user.target
Requires: Если используется, тогда ваш сервис не будет запущен, если network-online.target не активен.
After: Гарантирует, что ваш сервис будет запущен после активации целевых unit'ов, объявленных в этой директиве.
Wants: Слабее, чем Requires. Если целевой unit не будет запущен, systemd всё равно попытается запустить ваш сервис.
После внесения этих изменений, необходимо перезагрузить systemd чтобы он знал о вашем новом или измененном unit-файле:

Код: Выделить всё

systemctl daemon-reload
Наконец, включите ваш сервис, чтобы он автоматически запускался при загрузке:

Код: Выделить всё

systemctl enable ваш_сервис.service
Также убедитесь, что ваши network интерфейсы правильно настроены в NetworkManager, чтобы network-online.target активировался после установления сетевого соединения.
Если у вас возникают проблемы с этим процессом, полезно проверить логи systemd и NetworkManager для диагностики проблем:

Код: Выделить всё

journalctl -u NetworkManager
journalctl -u ваш_сервис.service
Это базовые шаги для обеспечения запуска сервиса после установления сетевого соединения. Частные случаи могут требовать дополнительной настройки в зависимости от конкретных потребностей настраиваемого сервиса.
Ответить