22 июня был представлен очередной релиз systemd — набора служебных компонентов для операционных систем на основе ядра Linux, в который (в числе прочего) входит система инициализации, служба ведения общесистемного лога (журнала), механизм управления пользовательскими сессиями и подсистема для работы с контейнерами. Система инициализации systemd основана на модели зависимостей (в противовес событийной модели upstart), включает в себя элементы супервизора на базе механизма cgroups ядра Linux, реализует концепции сокет- и dbus-активации процессов и предоставляет удобный декларативный синтаксис для описания демонов и других сущностей.
В рамках проекта также разрабатывается ряд легковесных вспомогательных программ, выполняющих второстепенные, но распространённые вспомогательные задачи — от настройки виртуальных терминалов (systemd-vconsole-setup) до управления сетью (systemd-networkd), SNTP-клиента (systemd-timesyncd) и UEFI-загрузчика (бывший gummiboot).
Нововведением этого релиза можно назвать концепцию Portable Services. Portable service — это образ корневой ФС с точкой входа в виде набора юнитов, среднее между chroot()
и Docker-контейнером. Отличие portable services от контейнеров в том, что их не предполагается изолировать от хоста (за исключением смены корня).
Изменения в CLI systemd
- Добавлена утилита portablectl для управления portable services. В этом релизе она устанавливается вне
$PATH
(в/usr/lib/systemd
) поскольку её интерфейс (как и сама концепция) ещё не стабилизирован. - Утилита
systemd-resolve
переименована в resolvectl для единообразия с остальными утилитами, а её синтаксис приведён к видуresolvectl <подкоманда>
(например,resolvectl status
вместоresolvectl --status
— прим. пер.). Старый синтаксис сохранён для совместимости, но его описание исключено из документации. - Вновь переименованная утилита
resolvectl
теперь поддерживает операции и синтаксис команды resolvconf(1) (а также кучу других новых команд — прим. пер.) и может заменять её, будучи установленной под этим именем. - Утилита systemd-analyze теперь имеет новую подкоманду
cat-config
, которая позволяет вывести содержимое любого конфигурационного файла systemd (со всеми дополнениями и с соблюдением правил замещения).Например,
systemd-analyze cat-config systemd/system.conf
распечатает первый из следующих файлов:-
/usr/lib/systemd/system.conf
-
/run/systemd/system.conf
-
/etc/systemd/system.conf
…после чего распечатает все .conf-файлы в
/usr/lib/systemd/system.conf.d
,/run/systemd/system.conf.d
и/etc/systemd/system.conf.d
, соблюдая для одноимённых файлов те же правила замещения. -
- Аналогично вышеописанному, прочие вспомогательные программы из systemd теперь имеют ключ
--cat-config
, который позволяет вывести эффективное содержимое их конфигурации.Например,
systemd-tmpfiles --cat-config
распечатает все.conf
-файлы в/usr/lib/tmpfiles.d
,/run/tmpfiles.d
и/etc/tmpfiles.d
, соблюдая стандартные правила замещения. - Команда
systemd-nspawn
теперь имеет несколько новых ключей, дублирующих для удобства настройки из юнитов:- --rlimit= задаёт исходные ограничения использования ресурсов процессами внутри контейнера;
- --hostname= явно устанавливает имя хоста контейнера (по умолчанию в качестве имени хоста используется имя контейнера – прим. пер.);
- --no-new-privileges= устанавливает prctl(2)-флаг
PR_SET_NO_NEW_PRIVS
(аналогично директиве NoNewPrivileges=); - --oom-score-adjust= задаёт исходное значение поправки OOM score для процессов внутри контейнера (аналогично директиве OOMScoreAdjust=);
- --cpu-affinity= задаёт исходное значение привязки процессов контейнера к ядрам CPU (аналогично директиве CPUAffinity=);
- --resolv-conf= позволяет управлять содержанием файла /etc/resolv.conf(5) внутри контейнера (например, скопировать или примонтировать его из хоста или из комплекта systemd-resolved);
- Наконец, --timezone= позволяет управлять содержимым файла /etc/localtime(5) внутри контейнера.
- Подкоманда
coredumpctl gdb
была переименована в coredumpctl debug, чтобы подчеркнуть независимость от gdb. Старый синтаксис сохранён для совместимости, но его описание исключено из документации.Выбрать вместо gdb другой отладчик можно с помощью ключа --debugger= или переменной окружения $SYSTEMD_DEBUGGER.
- Команда
systemctl
и многие другие при выводе на экран терминала теперь генерируют управляющие последовательностиOSC 8
, добавляющие гиперссылки там, где это уместно (например, в выводеsystemctl status
можно найти гиперссылки на расположение unit-файла).Это поведение можно контролировать с помощью переменной окружения $SYSTEMD_URLIFY.
Авторы отдельно отмечают, что пейджер less(1) не совместим с этими управляющими последовательностями, поэтому гиперссылки будут автоматически отключаться при использовании пейджеров до исправления проблем в less.
Про управляющую последовательность
OSC 8
можно прочесть по ссылке. - Утилита
timedatectl
получила три новые подкоманды:- timedatectl show выводит состояние systemd-timedated;
- timedatectl show-timesync выводит состояние systemd-timesyncd;
- timedatectl timesync-status выводит состояние NTP-протокола из systemd-timesyncd.
- Утилита
systemd-detect-virt
теперь имеет ключ --list, который выводит список всех известных систем виртуализации. - Утилиты
journalctl
иsystemctl
теперь поддерживают формат вывода журнала -o with-unit. Этот формат аналогичен-o short
за исключением того, что метка syslog заменяется на имя юнита, а временные метки отображаются с часовым поясом. - Исполняемый файл
systemd
теперь имеет ключ --dump-bus-properties, который выводит список всех поддерживаемых (инитом, на всех путях и интерфейсах – прим. пер.) свойств D-Bus (за исключением свойств, ещё поддерживаемых, но объявленных устаревшими — они не отображаются). - Утилита systemd-path теперь имеет подкоманду
search-binaries-default
, которая выводит значение$PATH
по умолчанию во всех запускаемых systemd процессах.
Изменения в поведении
- Повторное использование директивы RestrictNamespaces= теперь объединяет ограничения, а не замещает первый список ограничений вторым.
- Изменена схема именования сетевых интерфейсов в некоторых особых случаях:
- виртуальных интерфейсов NPAR,
- виртуальных интерфейсов SR-IOV,
- PCI-интерфейсов, для которых неизвестен номер PCI-слота.
Для виртуальных интерфейсов, созданных через SR-IOV, будет использовано имя родительского интерфейса с добавлением суффикса
v<N>
, где N — номер виртуального устройства (ранее имена выдавались независимо).Для NPAR-интерфейсов с номерами 9 и выше будет использована та же схема, что и для первых восьми (ранее они не переименовывались).
Для PCI-интерфейсов, для которых неизвестен номер PCI-слота, будет использован номер PCI-слота любого из родительских устройств, если он есть (ранее такие интерфейсы не переименовывались).
- (мейнтейнерам) В юните
systemd-logind.service
адресные пространства AF_INET и AF_INET6 исключены из разрешённого списка (RestrictAddressFamilies=
). Начиная с systemd 235, для достижения того же эффекта применяется директиваIPAddressDeny=any
.Это не должно как-либо изменить поведение, но если кто-то ранее отключил
IPAddressDeny=
, чтобы разрешить systemd-logind доступ в сеть, следует иметь это в виду и вернуть AF_INET и AF_INET6 обратно в список разрешённых адресных пространств. - Все долгоживующие демоны из состава systemd (в частности, systemd-udevd) теперь запускаются с белым списком разрешённых системных вызовов (вместо запрета отдельных системных вызовов, как раньше).
Это не должно как-либо изменить поведение, но если кто-то ранее отключал или изменял ограничения для systemd-udevd, следует иметь новые ограничения в виду, т. к. они, в числе прочего, запрещают работу с точками монтирования, swap-устройствами, изменение часов и перезагрузку системы из правил udev.
- При использовании директивы
Restart=
совместно сOnFailure=
, действиеOnFailure=
теперь выполняется только в том случае, если юнит не будет перезапущен (напр., после исчерпания попыток перезапуска). Историческое поведение противоречило документации и было исправлено. - systemd-tmpfiles теперь выводит замечание, когда какое-либо правило ссылается на файлы в
/var/run
. Согласно рекомендациям systemd,/var/run
должен ссылаться на/run
и использоваться только для совместимости. Начиная с данного релиза, systemd-tmpfiles будет исходить из этого предположения при проверке конфликтов правил.(Не очень понятно, почему нужно делать какие-то предположения вместо того, чтобы делать эквивалент realpath(1), ну да ладно. – прим. пер.) - Подкоманды
systemctl disable
,systemctl unmask
,systemctl preset
иsystemctl preset-all
теперь не поддерживают флаг--runtime
. Ранее это было разрешено, но приводило к контринтуитивному поведению (не «временное отключение» или «временная размаскировка», а «отмена временного включения» и «отмена временной маскировки» и т. п.).Вместо этого, подкоманды
disable
иunmask
теперь будут автоматически работать и в/run
, и в/etc
, т. е. будут удалять релевантные ссылки в обоих местах.
Изменения в ядре systemd
- В файле
system.conf
доступна новая глобальная директива NoNewPrivileges=, которая отключает поднятие привилегий для всех процессов в системе. В частности, теряют силу setuid-биты и биты capabilities на файлах.Этот режим может быть полезен в особых случаях (таких, как контейнеры — прим. пер.), но вряд ли пригоден для повсеместного использования, поэтому по умолчанию не задействован.
- При входе в гибернацию systemd научился сообщать ядру смещение образа гибернации внутри устройства. Это означает, что гибернация теперь может работать со swap-файлами.
- В systemd добавлена поддержка «обобщённых» drop-in’ов. В частности, если юнит называется
foo-bar-baz.service
, то systemd теперь будет искать drop-in’ы в следующих местах (в порядке уменьшения приоритета):-
foo-bar-baz.service.d/*.conf
(было ранее) -
foo-bar-.service.d/*.conf
-
foo-.service.d/*.conf
Эта возможность будет наиболее полезна в .mount- и .slice-юнитах (т. к. их схемы именования иерархичны), но технически поддерживается везде.
Вдогонку к этой возможности, в юнит-файлах появились две новые подстановки:
%j
и%J
. Они заменяются на часть названия юнита после последнего дефиса в названии текущего drop-in’а (соответственно без декодирования строки и с). -
- Помимо вышеописанных, в юнит-файлах появились ещё три новые подстановки:
-
%T
заменяется на/tmp
или временный каталог текущего пользователя, -
%V
заменяется на/var/tmp
или, опять же, временный каталог текущего пользователя, -
%E
заменяется на/etc
(для системных юнитов) или$XDG_CONFIG_HOME
(для пользовательских юнитов).
-
- В директивах Exec*= юнит-файлов теперь допускается использование неабсолютных путей к исполняемым файлам. Они будут разрешены с использованием
$PATH
по умолчанию (см. выше пункт оsystemd-path search-binaries-default
). - В systemd добавлено новое состояние юнитов (load state) bad-setting. Юниты, содержащие критические ошибки, теперь будут помечаться этим состоянием.
- В .socket-юнитах с
Accept=yes
в дополнение к счётчику принятых соединений («accepted») теперь также ведётся счётчик отвергнутых соединений («refused»).(Вsystemctl show
он пока не отображается — прим. пер.) - В systemd добавлена поддержка гибридного режима сна (suspend-then-hibernate).
- Модуль nss-systemd для glibc NSS теперь поддерживает перечисление всех существующих в настоящий момент динамических учётных записей и групп. Ранее для таких учётных записей поддерживались операции преобразования из имён в номера, но получить их список было нельзя.
- systemd теперь будет перепланировать уже запущенные (ожидающие) таймеры при изменении часового пояса. (Ранее это происходило только при изменении системного времени.)
- В юнитах, запускающих процессы, добавлена директива
PrivateMounts=
, которая помещает процессы юнита в отдельное пространство имён файловой системы. Включение этой директивы подразумевается при использовании прочих директив, связанных с изоляцией файловой системы (PrivateTmp=
,PrivateDevices=
,ProtectSystem=
и т. п.). - В секции
[Unit]
юнит-файлов добавлена директива ConditionSecurity=uefi-secureboot, проверяющая, включен ли UEFI Secure Boot.
Новые специальные юниты
- Добавлен юнит systemd-time-sync-wait.service, который ожидает завершения первичной синхронизации времени по NTP. Если его включить, он будет добавлен в зависимости цели time-sync.target, задерживая запуск зависимых от этой цели юнитов.
Эта возможность будет полезна в системах, в которых нет встроенного энергонезависимого RTC или он плохого качества.
- Добавлена цель system-update-pre.target, которая позволяет упорядочить запуск других юнитов до начала offline-обновления системы.
Прочие изменения
- В systemd-boot теперь можно отключать автоматическое обнаружение Windows и macOS.
- В systemd-boot появилось автоматическое определение оптимального разрешения экрана в HiDPI-системах, а также настройки, позволяющие изменить разрешение экрана вручную.
- pam_systemd теперь может устанавливать некоторые параметры .scope-юнита создаваемой сессии из PAM-параметров
systemd.memory_max
,systemd.tasks_max
,systemd.cpu_weight
иsystemd.io_weight
(если эти параметры заданы предыдущими PAM-модулями). Таким образом, сторонние PAM-модули получили возможность настраивать ограничения для сессии. - (мейнтейнерам) systemd-timedated теперь может управлять состоянием произвольного NTP-клиента, а не только systemd-timesyncd. Имя альтернативного NTP-клиента может быть указано в переменной окружения $SYSTEMD_TIMEDATED_NTP_SERVICES (ожидается список имён юнитов, разделённых двоеточием).
- systemd теперь будет по умолчанию включать TCP ECN установкой sysctl-переменной
net.ipv4.tcp_ecn
в 1. - В файле
journald.conf
теперь поддерживается задание порогового размера объекта для сжатия (ранее он составлял 512 байт). Пороговый размер может быть задан директивой Compress=<N>, где N — размер в байтах с суффиксами (ранее принимались только значенияon
иoff
).
Изменения в networkd и resolved
- systemd-resolved теперь поддерживает DNS-over-TLS. По умолчанию этот протокол не задействован, пока не решены проблемы с задержкой установления соединения; его можно включить с помощью глобальной директивы DNSOverTLS= в файле
resolved.conf
. - systemd-resolved и systemd-networkd теперь используют DynamicUser=yes. Таким образом, учётные записи systemd-resolve и systemd-network больше не должны создаваться заранее.
- systemd-networkd теперь будет автоматически передавать в ядро Linux информацию о времени жизни маршрутов (route expiration; Linux 4.4+).
- Директива ClientIdentifier= секции
[DHCP]
.network-файлов теперь может принимать значениеClientIdentifier=duid-only
. В этом случае systemd-networkd не будет включать IAID в передаваемый DHCPv4 client identifier. Такое поведение не соответствует RFC 4361, но может быть полезно в некоторых случаях. - В секции
[Network]
.network-файлов появилась директива IPv6MTUBytes=, позволяющая задать IPv6 MTU.Также в секции
[Route]
.network-файлов появилась директива MTUBytes=, позволяющая задать MTU для конкретного маршрута. - В секции
[DHCP]
.network-файлов появилась директива UserClass=, позволяющая задать DHCPv4-опцию User Class. - В .network-файлах появилась новая секция [CAN] с директивами BitRate=, SamplePoint= и RestartSec= для настройки CAN-интерфейсов.
- В секции
[Link]
.network-файлов появились директивы Multicast= и AllMulticast=, позволяющие управлять флагами MULTICAST и ALLMULTI на сетевом интерфейсе. - Исключена поддержка директивы
UDPSegmentationOffload=
в секции[Link]
.link-файлов ввиду ограниченной поддержки UDP Segmentation Offload в драйверах и прикладном софте. - В секции
[Link]
.link-файлов появились директивы RxChannels=, TxChannels=, OtherChannels= и CombinedChannels=, позволяющие настраивать количество каналов приёма/передачи на сетевой карте. - С помощью .netdev-файлов появилась возможность создавать виртуальные интерфейсы с драйвером «netdevsim» (Kind=netdevsim).
Изменения в API и документации
- В DBus-интерфейсе systemd появился вызов
GetUnitByControlGroup()
. - У systemd-timesyncd появился DBus-интерфейс.
- В библиотеке sd-bus появились некоторые новые методы.
- В библиотеке sd-event появился метод
sd_event_add_inotify()
для эффективного наблюдения за inotify-событиями без перерасхода inotify handle. - В библиотеках sd-bus и sd-event появилась возможность задавать пользовательские деструкторы для некоторых типов объектов.
- В репозиторий systemd было добавлено несколько новых спецификаций: