Systemd
systemd — набор базовых компонентов Linux-системы. Представляет собой менеджер системы и служб, который выполняется как процесс с PID 1 и запускает остальную часть системы. systemd обеспечивает возможности агрессивной параллелизации, сокетную и D-Bus активацию для запуска служб, запуск демонов по запросу, отслеживание процессов с помощью контрольных групп Linux, обслуживание точек (авто)монтирования, а также предлагает развитую транзакционную логику управления службами на основе зависимостей. systemd поддерживает сценарии инициализации SysV и LSB и работает как замена sysvinit. Среди прочих элементов и функций — демон журнала, утилиты управления базовой конфигурацией системы (имя хоста, дата, языковой стандарт), ведение списков вошедших в систему пользователей, запущенных контейнеров, виртуальных машин, системных учётных записей, каталогов и настроек времени выполнения, а также демоны для управления несложными сетевыми конфигурациями, синхронизации времени по сети, пересылки журналов и разрешения имён.
Основы использования systemctl
Главная команда для работы с systemd — systemctl. Она позволяет (среди прочего) отлеживать состояние системы и управлять системой и службами. Подробнее см. systemctl(1).
Использование юнитов
Юнитами могут быть, например, службы (.service), точки монтирования (.mount), устройства (.device) или сокеты (.socket).
При работе с systemctl обычно необходимо указывать полное имя юнита с суффиксом, например, sshd.socket
. Существует несколько возможных сокращений:
- Если суффикс не указан, systemctl предполагает, что это .service. Например,
netctl
равнозначноnetctl.service
. - Точки монтирования автоматически преобразуются в юнит .mount. Например,
/home
равнозначноhome.mount
. - Аналогично точкам монтрования, имена устройств автоматически преобразуются в юнит .device. Например,
/dev/sda2
равнозначноdev-sda2.device
.
Действие | Команда | Примечание |
---|---|---|
Анализ состояния системы | ||
Состояние системы | $ systemctl status
|
|
Список запущенных юнитов | $ systemctl или
|
|
Список юнитов, запустить которые не удалось | $ systemctl --failed
|
|
Список установленных файлов юнитов1 | $ systemctl list-unit-files
|
|
Информация о процессе по его PID | $ systemctl status pid
|
cgroup slice, занимаемая память и родительский процесс |
Состояние юнита | ||
Страница руководства юнита | $ systemctl help юнит
|
если юнит её предоставляет |
Состояние юнита | $ systemctl status юнит
|
в т. ч. работает ли он в данный момент |
Проверить, добавлен ли юнит в автозапуск | $ systemctl is-enabled юнит
|
|
Запуск, перезапуск, перезагрузка юнита | ||
Незамедлительно запустить юнит | # systemctl start юнит
|
|
Незамедлительно остановить юнит | # systemctl stop юнит
|
|
Перезапустить юнит | # systemctl restart юнит
|
|
Перезагрузить юнит с новыми настройками | # systemctl reload юнит
|
|
Перезагрузить настройки systemd2 | # systemctl daemon-reload
|
сканировать систему на наличие новых или изменённых юнитов |
Включение юнита (автозапуск) | ||
Включить юнит, добавив его в автозапуск | # systemctl enable юнит
|
|
Включить юнит и сразу запустить | # systemctl enable --now юнит
|
|
Отключить запуск юнита при загрузке | # systemctl disable юнит
|
|
Включить юнит заново3 | # systemctl reenable юнит
|
т.е. отключить и снова включить |
Маскировка юнита | ||
Замаскировать юнит, сделав невозможным его запуск4 | # systemctl mask юнит
|
|
Снять маскировку юнита | # systemctl unmask юнит
|
Для управления питанием от имени непривилегированного пользователя необходим polkit. Если вы находитесь в локальном пользовательском сеансе systemd-logind и нет других активных сеансов, приведенные ниже команды сработают, даже если будут выполнены не от root. В противном случае (например, другой пользователь вошел в систему через tty) systemd автоматически запросит у вас пароль суперпользователя.
Действие | Команда |
---|---|
Завершить работу и перезагрузить систему | $ systemctl reboot
|
Завершить работу и выключить компьютер | $ systemctl poweroff
|
Перевести систему в ждущий режим | $ systemctl suspend
|
Перевести систему в спящий режим | $ systemctl hibernate
|
Перевести систему в режим гибридного сна (suspend-to-both) | $ systemctl hybrid-sleep
|
Написание файлов юнитов
Синтаксис файлов юнитов systemd (см. systemd.unit(5)) вдохновлён desktop-файлами XDG Desktop Entry Specification, а они, в свою очередь, основаны на синтаксисе файлов .ini Microsoft Windows. Файлы юнитов загружаются из целого ряда мест (команда systemctl show --property=UnitPath
выведет полный список), ключевыми из которых являются следующие (в порядке увеличения приоритета):
/usr/lib/systemd/system/
: юниты, добавленные пакетами при установке;/etc/systemd/system/
: юниты, созданные системным администратором.
Обработка зависимостей
В systemd зависимости определяются правильным построением файлов юнитов. Простой пример — юниту A требуется, чтобы юнит B был запущен перед запуском самого юнита A. Для этого добавьте строки Requires=B
и After=B
в раздел [Unit]
юнит-файла A. Если зависимость является необязательной, укажите Wants=B
и After=B
соответственно. Обратите внимание, что Wants=
и Requires=
не подразумевают After=
. Если After=
не указать, то юниты будут запущены параллельно.
Зависимости обычно указываются для служб, но не для целей. Так, цель network.target
будет "подтянута" ещё на этапе настройки сетевых интерфейсов одной из соответствующих служб, и можно спокойно указывать эту цель как зависимость в пользовательской службе, поскольку network.target
будет запущена в любом случае.
Типы служб
Службы различаются по типу запуска, и это следует учитывать при написании юнитов. Тип определяется параметром Type=
в разделе [Service]
:
Type=simple
(по умолчанию): systemd запустит эту службу незамедлительно. Процесс при этом не должен разветвляться (fork). Если после данной службы должны запускаться другие, то этот тип использовать не стоит (исключение — служба использует сокетную активацию).Type=forking
: systemd считает службу запущенной после того, как процесс разветвляется с завершением родительского процесса. Используется для запуска классических демонов за исключением тех случаев, когда в таком поведении процесса нет необходимости. Укажите параметрPIDFile=
, чтобы systemd мог отслеживать основной процесс.Type=oneshot
: удобен для сценариев, которые выполняют одно задание и завершаются. Если задать параметрRemainAfterExit=yes
, то systemd будет считать процесс активным даже после его завершения.Type=notify
: идентичен параметруType=simple
, но с уточнением, что демон пошлет systemd сигнал готовности. Реализация уведомления находится в библиотеке libsystemd-daemon.so.Type=dbus
: служба считается находящейся в состоянии готовности после появления указанногоBusName
в системной шине DBus.Type=idle
: systemd отложит выполнение двоичного файла службы до окончания запуска остальных ("более срочных") задач. В остальном поведение аналогичноType=simple
.
Цели
Systemd использует юнит типа цель (target) для группировки юнитов по зависимостям и в качестве стандартизированных точек синхронизации. Они выполняют ту же задачу, что и уровни запуска, но действуют немного по-другому. Каждая цель имеет имя, а не номер, и предназначена для конкретных задач; несколько целей могут быть активны одновременно. Некоторые цели реализованы путём наследования служб из других целей с добавлением собственных. В systemd также имеются цели, имитирующие общие уровни запуска SystemVinit, поэтому вы можете переключаться между целями, используя привычную команду telinit RUNLEVEL
.
Получение информации о текущих целях
В systemd для этого предназначена следующая команда (заменяющая runlevel
):
$ systemctl list-units --type=target
Создание пользовательской цели
Уровни запуска, имеющие определённое значение в sysvinit (0, 1, 3, 5 и 6), один в один соответствуют конкретным целям systemd. К сожалению, не существует хорошего способа сделать то же самое для пользовательских уровней 2 и 4. Их использование предполагает, что вы создаёте новый юнит-цель с названием /etc/systemd/system/цель
, который берет за основу один из существующих уровней запуска (взгляните, например, на /usr/lib/systemd/system/graphical.target
), создаёте каталог /etc/systemd/system/цель.wants
, а после этого — символические ссылки на те службы из каталога /usr/lib/systemd/system/
, которые вы хотите включить при загрузке.
Соответствие уровней SysV целям 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 | Аварийная оболочка |
Изменение текущей цели
В systemd цели доступны посредством целевых юнитов. Вы можете переключать их такой командой:
# systemctl isolate graphical.target
Данная команда только изменит текущую цель и не повлияет на следующую загрузку системы. Она соответствует командам Sysvinit вида telinit 3
и telinit 5
.
Изменение цели загрузки по умолчанию
Стандартная цель — default.target
, которая по умолчанию ссылается на graphical.target
(примерно соответствующего прежнему уровню запуска 5).
Узнать текущую цель можно так:
$ systemctl get-default
Для установки новой цели загрузки по умолчанию измените ссылку default.target
. С помощью команды systemctl это делается так:
# systemctl set-default multi-user.target
Removed /etc/systemd/system/default.target. Created symlink /etc/systemd/system/default.target -> /usr/lib/systemd/system/multi-user.target.
Альтернативный способ — добавить один из следующих параметров ядра в загрузчик:
systemd.unit=multi-user.target
(что примерно соответствует прежнему уровню запуска 3).systemd.unit=rescue.target
(что примерно соответствует прежнему уровню запуска 1).
Порядок выбора цели по умолчанию
systemd выбирает default.target
в следующем порядке :
- Параметр ядра, описанный выше.
- Символическая ссылка
/etc/systemd/system/default.target
. - Символическая ссылка
/usr/lib/systemd/system/default.target
.