12 декабря был представлен очередной релиз системного менеджера systemd, совмещающего в себе функции системы инициализации, ведения журнала и управления сессиями пользователей. systemd основан на модели зависимостей (в противовес событийной модели), производит отслеживание процессов запущенных сервисов при помощи механизма cgroups ядра Linux, поддерживает механизмы сокет- и dbus-активации сервисов и предоставляет удобный декларативный синтаксис для описания демонов и других сущностей. Это позволяет производить агрессивную параллелизацию при запуске и остановке сервисов.
В рамках проекта также разрабатывается ряд легковесных приложений и демонов, выполняющих второстепенные, но распространённые задачи по управлению системой — от настройки подсистемы VT (systemd-vconsole-setup) до управления сетью (systemd-networkd) и профилирования загрузки (systemd-bootchart).
Список изменений:
- Все компоненты systemd, обладающие конфигурационными файлами в /etc/systemd, теперь умеют считывать настройки из соответствующих *.d-директорий в /usr/lib, /run и /etc.
Например,
/etc/systemd/system.conf
можно дополнять из/{usr/lib,run,etc}/systemd/system.conf.d/*.conf
. - Добавлена команда
systemctl edit
, которая позволяет редактировать unit-файлы (используется редактор, указанный в переменной окружения$EDITOR
).Возможные режимы работы таковы:
- (по умолчанию): «режим дополнения», т. е. редактирование нового drop-in'а (создаётся и открывается
/etc/systemd/system/$unit.d/override.conf
) -
--full
: «режим исправления», т. е. редактирование всего юнит-файла (он предварительно копируется в/etc/systemd/system
, если необходимо) -
--runtime
: «режим временных изменений», т. е. вместо/etc
используется/run
и все внесённые изменения живут только до перезагрузки
- (по умолчанию): «режим дополнения», т. е. редактирование нового drop-in'а (создаётся и открывается
- Команда
systemctl is-enabled
теперь выводит «indirect» вместо «static» (при этом код возврата равен 0) в тех случаях, когда секция[Install]
юнита содержит только директивыAlso=
, т. е. когда сам юнит не может быть включен, но «включает» другие юниты. - Команда
systemctl status ЮНИТ
теперь выводит также и «предлагаемое» состояние юнита согласно preset'ам. Это показывает, должен ли юнит быть включен согласно дистроспецифичному дефолту.Пример:
$ grep -R remote-fs.target /usr/lib/systemd/system-preset /usr/lib/systemd/system-preset/90-systemd.preset:enable remote-fs.target $ systemctl status remote-fs.target ● remote-fs.target - Remote File Systems Loaded: loaded (/usr/lib/systemd/system/remote-fs.target; disabled; vendor preset: enabled)
- Команда
systemd-run
теперь поддерживает отложенный запуск команд в стиле at(1) (параметры командной строки--on-calendar
и аналогичные). Это реализовано с помощью создания временного timer-юнита наряду с основным service-юнитом (поддержка создания timer-юнитов как раз была добавлена в API systemd). - В команде
busctl
, предназначенной для работы с шиной D-Bus, добавлены следующие подкоманды и параметры командной строки:-
busctl capture
(захват всех данных, проходящих через шину, в формате libpcap) -
busctl tree
(отображение дерева объектов для конкретного сервиса или для всех сервисов на шине) -
busctl introspect
(отображение подробной информации о конкретном объекте на шине) -
busctl call
,busctl get-property
иbusctl set-property
(предназначение очевидно из названий) -
busctl --augment-creds=
(включение или отключение сбора вспомогательных данных о процессах на шине из /proc)Последняя опция по умолчанию включена, но в некоторых случаях это может привести к race conditions, поэтому и была добавлена возможность её отключения.
-
- В команде
journalctl
добавлены параметры командной строки--vacuum-size=
и--vacuum-time=
, позволяющие принудительно удалить старые файлы журнала. Как легко понять из названий параметров, критерием очистки может быть или суммарный размер файлов журнала, или давность сообщений в конкретном файле. - В команде
systemd-nspawn
добавлены параметры командной строки--link-journal=try-guest
и--link-journal=try-host
, которые работают аналогично значениям guest и host (а именно — включают объединение журналов хоста и контейнера), но не возвращают ошибку, если на хосте ведение постоянного журнала отключено.Параметр командной строки
-j
теперь является синонимом для--link-journal=try-guest
. - Команда
systemd-inhibit
при отображении списка активных ингибиторов теперь поддерживает фильтрацию по типу (block или delay). - Для каждой директивы вида
ConditionXYZ=
в секции[Unit]
unit-файлов добавлена аналогичная директиваAssertXYZ=
в той же секции.Отличие между ними состоит в том, что невыполнение Condition-директив приводит к пропуску (игнорированию) юнита, а невыполнение Assert-директив переводит юнит в состояние «failed».
- В секциях
[Scope]
и[Service]
unit-файлов добавлена директиваDelegate=
, разрешающая процессам юнита самостоятельно управлять своим поддеревом контрольных групп. - В секции
[Service]
unit-файлов добавлена директиваSmackProcessLabel=
, позволяющая установить для всех процессов юнита указанную метку SMACK64. - Директива
ConditionSecurity=
unit-файлов теперь может принимать значениеaudit
, что будет приводить к проверке доступности audit-подсистемы ядра. - systemd-coredump теперь собирает и кладёт в журнал вместе с core-дампом некоторое количество метаданных об упавшем процессе, а именно:
- контрольные группы, к которым принадлежал процесс (
/proc/$PID/cgroup
) - список переменных окружения и их значения (
/proc/$PID/environ
) - карту адресного пространства процесса (
/proc/$PID/maps
) - рабочую директорию (
/proc/$PID/cwd
) - корневую директорию (
/proc/$PID/root
) - состояние процесса (
/proc/$PID/status
) - список открытых файловых дескрипторов (
/proc/$PID/fd
)
- контрольные группы, к которым принадлежал процесс (
- journald теперь умеет собирать сообщения audit-подсистемы ядра (с обработкой сопутствующих метаданных) и записывать их в общий лог. В частности, это означает, что journalctl становится альтернативой традиционному audit-клиенту ausearch.
- systemd-networkd теперь поддерживает:
- конфигурирование VXLAN-устройств (секция
[VXLAN]
netdev-файлов) - указание «стоимости» портов bridge-устройств (директива
Cost=
в секции[Bridge]
network-файлов) - настройку правил IP source routing (директива
Source=
в секции[Route]
network-файлов) - выбор сетевого интерфейса по его исходному имени (до переименования; директива
OriginalName=
в секции[Match]
link-файлов) - изменение MAC-адреса и MTU интерфейса из network-файлов (директивы
MACAddress=
иMTUBytes=
в секции[Link]
network-файлов)
- конфигурирование VXLAN-устройств (секция
- В systemd-networkd начата работа по реализации протокола PPPoE.
- NSS-модуль nss-myhostname теперь ресолвит имя «gateway» в IP-адрес шлюза по умолчанию. Если таковых несколько — они сортируются по значению метрики.
Отмечу, что это изменение не нарушает работу конфигураций, в которых имя «gateway» уже как-либо используется, поскольку модуль nss-myhostname обычно идёт последним в списке NSS-модулей.
- macvlan-устройства, создаваемые systemd-nspawn внутри контейнеров, теперь имеют стабильные MAC-адреса (в том смысле, что они не будут изменяться каждый раз).
- systemd-cryptsetup-generator теперь поддерживает указание key-файлов и назначение имён для отдельных устройств из командной строки ядра (
luks.key=<UUID>=<имя файла>
иluks.name=<UUID>=<назначаемое имя устройства>
). - В systemd-tmpfiles добавлено действие
t
— назначение файлу произвольных расширенных атрибутов (xattrs). - systemd-localed теперь опционально зависит от libxkbcommon. Эта библиотека будет использоваться для проверки корректности устанавливаемых настроек раскладки клавиатуры X11 (напр., с помощью
localectl set-x11-keymap
). - В systemd-hostnamed список текстовых описаний типов системы (chassis type) был пополнен значением «embedded».
- systemd-rfkill теперь ассоциирует запоминаемое состояние rfkill'а не с его именем (rfkill0, rfkill1, ...), а с комбинацией его типа (wlan, bluetooth, ...) и свойства
ID_PATH
.Это связано с тем, что имя rfkill'а не обязано сохраняться между перезагрузками или переподключениями устройства. Более того, в последнем случае оно никогда не остаётся прежним.
- База данных аппаратного обеспечения (hwdb) udev'а теперь содержит базу данных разрешений оптических сенсоров мышей. Она будет использоваться в libinput для автоматической коррекции ускорения курсора.
Ситуация более подробно описана в этом сообщении.
- systemd теперь умеет корректно обрабатывать ситуации, в которых система одновременно
- не имеет файла
/etc/machine-id
- запускается с корневой ФС в режиме «только чтение»
Для обработки этих случаев была добавлена вспомогательная утилита systemd-machine-id-commit, которая запускается сразу после перемонтирования корневой ФС в режим «чтение и запись» и атомарно перемещает временный файл machine-id из tmpfs в
/etc/machine-id
. - не имеет файла