systemd/systemctl
Команда systemctl
без параметров или с подкомандой list-units
выведет список запущенных юнитов
Вывод выглядит такboot.mount loaded active mounted /boot
-
UNIT -
boot.mount
- Название юнита и его тип -
LOAD -
loaded
- Состояние юнита, загружен или нет -
ACTIVE -
active
- Обобщенный статус -
SUB -
mounted
- Текущий статус -
DESCRIPTION -
/boot
- Описание
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
JOB = Pending job for the unit.
Параметр --failed
покажет список юнитов, запуск которых не удался
root@mars:~# systemctl --failed
0 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.
Файлы юнитов находятся в /usr/lib/systemd/system/
и /etc/systemd/system/
(последний каталог имеет приоритет). Команда systemctl list-unit-files
покажет список установленных юнитов
Юнитами могут быть сервисы, точки монтирования, устройства или сокеты
Обычно при использовании systemctl
нужно указывать полное имя файла юнита (вметсе с суффиксом типа - sshd.socket
). Но есть сокращения:
- Если суффикс не указан, то предполагается что это сервис
- Точки монтирования автоматически преобразуются в
mount
(напр./home
->home.mount
) - Имена устройств автоматически преобразуются в
device
(напр./dev/sda2
->dev-sda2.device
)
Некоторые юниты содержат в названии символ
@
-название@строка.service
Это значит что они являются экземплярами юнита-шаблона. Имя юнита шаблона не содержит частистрока
-название@.service
строка
- это идентификатор экземпляра
-
systemctl help ntp.service
- показать man для юнита -
systemctl status ntp.service
- статус юнита -
systemctl is-enabled ntp.service
- добавлен ли в автозагрузку -
systemctl start/stop/restart/reload/enable/disable ntp.servec
- и так понятно -
systemctl daemon-reload
- systemd при запуске загружает файлы юнитов с файловой системы в память, при изменении файла юнита, systemd изменения не увидит. Эта команда заставит systemd перечитать все юниты заново (и мягко перезапустит их)
systemctl mask/unmask ntp.service
- маскирует юнит. Это делает невозможным его запуск
root@mars:/etc/systemd/system# systemctl mask ntp.service
Created symlink /etc/systemd/system/ntp.service → /dev/null.
root@mars:/etc/systemd/system# systemctl stop ntp.service
root@mars:/etc/systemd/system# systemctl start ntp.service
Failed to start ntp.service: Unit ntp.service is masked.
Файлы юнитов загружаются из разных мест, и чтобы увидеть эти места можно выполнить такую команду
root@mars:/etc/systemd# systemctl show --property=UnitPath
UnitPath=/etc/systemd/system.control /run/systemd/system.control /run/systemd/transient /etc/systemd/system /run/systemd/system /run/systemd/generator /lib/systemd/system /run/systemd/generator.late
-
/usr/lib/systemd/system/
- юниты, предоставляемые пакетами при их установке -
/etc/systemd/system/
- юниты, устанавливаемые системным администратором
В файлах юнитов допустимы комментарии. Но каждый комментарий на отдельной строке. Комментарий начинается с решетки
Юнит файлы пакетов редактировать напрямую не стоит. Это вызовет проблемы с пакетным менеджером. Есть два пути редактирования юнит файла пакета (см. документацию)
Файлы из /etc/systemd/system/
переопределяют /usr/lib/systemd/system
А для того чтобы новый файл подтянулся, нужно выполнить systemctl reenable UNIT
Это можно сделать через утилиту systemctl edit --full UNIT
Она либо откроет файл из /etc/...
, либо скопирует файл из /usr/lib/...
в /etc/...
и после редактирования автоматически перезагрузит все что нужно
Но этот метод может вызвать проблемы с пакетным менеджером
Также можно переопределять юнит файлы через drop-in файлы. Нужно создать каталог /etc/systemd/system/UNIT.d/
и в нем создать .conf файлы (описываются так же как и юнит-файлы). systemd будет применять эти файлы поверх оригинального
Это делает команда systemctl edit UNIT
(без флага --full
)
Чтобы отменить изменения сделанные через
edit
нужно выполнитьsystemctl revert UNIT
Для просмотра юнитов можно использовать systemctl cat ntp.service
systemd-delta
- позволяет увидеть какие есть оверрайды для каких юнитов
root@mars:/etc/systemd# systemd-delta
[OVERRIDDEN] /etc/systemd/system/ntp.service → /usr/lib/systemd/system/ntp.service
Files /usr/lib/systemd/system/ntp.service and /etc/systemd/system/ntp.service are identical
[EXTENDED] /usr/lib/systemd/system/rc-local.service → /usr/lib/systemd/system/rc-local.service.d/debian.conf
[EXTENDED] /usr/lib/systemd/system/systemd-resolved.service → /usr/lib/systemd/system/systemd-resolved.service.d/resolvconf.conf
[EXTENDED] /usr/lib/systemd/system/systemd-timesyncd.service → /usr/lib/systemd/system/systemd-timesyncd.service.d/disable-with-time-daemon.conf
4 overridden configuration files found.
Цели ( target ) используются для группировки юнитов по зависимостям в качестве точек синхронизации (как уровни запуска)
Показать все текущие цели можно такой командой
systemctl list-units --type=target
Уровни запуска, имеющие определённое значение в sysvinit (0, 1, 3, 5 и 6), один в один соответствуют конкретным целям systemd
Уровнень запуска SysV | Цель systemd | Примечания |
---|---|---|
0 | runlevel0.target, poweroff.target | Выключение системы |
1, s, single | runlevel1.target, rescue.target | Однопользовательский уровень запуска |
2, 4 | runlevel2.target, runlevel4.target, multi-user.target | Уровни запуска, определенные пользователем/специфичные для узла. По умолчанию соответствует уровню запуска 3 |
3 | runlevel3.target, multi-user.target | Многопользовательский режим без графики. Пользователи, как правило, входят в систему при помощи множества консолей или через сеть |
5 | runlevel5.target, graphical.target | Многопользовательский режим с графикой. Обычно эквивалентен запуску всех служб на уровне 3 и графического менеджера входа в систему |
6 | runlevel6.target, reboot.target | Перезагрузка |
emergency | emergency.target | Аварийная оболочка |
Переключаться между режимами можно так
systemctl isolate default.target
systemctl isolate rescue.target
systemctl isolate emergency.target
systemctl default
systemctl rescue
systemctl emergency
systemctl reboot
systemctl poweroff
Создаёте новый юнит-цель с названием
/etc/systemd/system/цель
, который берет за основу один из существующих уровней запуска (взгляните, например, на/usr/lib/systemd/system/graphical.target
), создаёте каталог/etc/systemd/system/цель.wants
, а после этого — символические ссылки на те службы из каталога/usr/lib/systemd/system/
, которые вы хотите включить при загрузке
Зависимости, о которых сказано выше, можно добавлять с помощью команд
systemctl add-wants <target-unit-name> <requirement-name>
systemctl add-requires <target-unit-name> <requirement-name>
Изменить текущую цель можно командой systemctl isolate UNIT.target
Это не повлияет на последующие загрузки (только на текущую)
Стандартная цель это default.target
Узнать текущую цель можно так
# systemctl get-default
graphical.target
А указать цель можно через systemctl set-default UNIT
Также это можно указать через параметры ядра
systemd.mount - отвечает за монтирование разделов и ФС из файла /etc/fstab
systemd-tmpfiles позволяет управлять временными файлами и каталогами (пример: samba предполагает что существует каталог /run/samba с нужными правами доступа)
systemctl preset <unit-name>
Восстановит параметры автозагрузки по умолчанию, т. е. если изначально юнит не загружался автоматически, а это было изменено администратором, то юнит будет извлечён из автозагрузки
Бывает так что юнит файл находится вне путей стандартного авто-поиска юнитов
В этом случае можно слинковать этот файл в нужно место
systemctl preset <unit-name>
Эта команда создаст ссылку в на файл в нужной папке
systemctl revert <unit-name>
Восстановит юнит-файл к изначальному состоянию. Сотрет drop-in юниты, отменит результаты команд edit
, set-property
, mask
С помощью systemctl show-environment
можно увидеть переменные окружения которые доступны всем запускаемым юнитам
Устанавливать переменные можно через set-environment
systemctl set-environment MY_VAR=test
А удалять через unset-environment
systemctl unset-environment MY_VAR
No Comments