21 мая был представлен очередной релиз системного менеджера systemd, совмещающего в себе функции системы инициализации, ведения журнала, управления сессиями пользователей и работы с контейнерами. systemd основан на модели зависимостей (в противовес событийной модели), производит отслеживание процессов запущенных сервисов при помощи механизма cgroups ядра Linux, поддерживает механизмы сокет- и dbus-активации сервисов и предоставляет удобный декларативный синтаксис для описания демонов и других сущностей. Это позволяет производить агрессивную параллелизацию при запуске и остановке сервисов.
В рамках проекта также разрабатывается ряд легковесных приложений и демонов, выполняющих второстепенные, но распространённые вспомогательные задачи (т. н. plumbing layer) — от настройки подсистемы VT (systemd-vconsole-setup) и первичного конфигурирования системы (systemd-firstboot) до управления сетью (systemd-networkd) и профилирования загрузки (systemd-bootchart). А теперь ещё и легковесный загрузчик для UEFI (бывший gummiboot).
В этот релиз вошли по большей части различные исправления и усовершенствования внутренней логики, а также расширения уже существующей функциональности. В частности, были существенно стабилизированы новые «контейнерные» фичи из systemd 219.
Изменения в ядре systemd
- systemd больше не поддерживает обновление без перезагрузки («daemon-reexec») с версий, предшествующих systemd 44. Это не должно создать никаких реальных проблем, поскольку во всех актуальных на данный момент версиях распространённых дистрибутивов используются более новые версии systemd.
- При генерации юнитов из sysvinit-скриптов соответствие между уровнями запуска sysvinit и стандартными целями systemd теперь жёстко задано:
- уровням запуска 2, 3 и 4 соответствует
multi-user.target
; - уровню запуска 5 соответствует
graphical.target
.
Раньше это соответствие можно было изменить, делая вспомогательные юниты
runlevel[2-5].target
симлинками на ту или иную цель. Оказалось, что устоявшаяся семантика алиасов юнитов в systemd приводит к неразрешимым проблемам при таком подходе. - уровням запуска 2, 3 и 4 соответствует
- Из состава systemd был исключён вспомогательный демон systemd-shutdownd, предназначавшийся для отложенного завершения работы в стиле shutdown(8). Теперь эта функциональность реализуется в systemd-logind. Интерфейс остался тем же — команда
shutdown
.(Если в вашей конфигурации systemd-logind не используется, отложенное завершение работы можно устроить с помощью systemd-run и таймерных юнитов — прим. пер.) - При использовании сокет-активации в режиме
Accept=true
(когда на каждое соединение запускается отдельный инстанс демона) systemd теперь устанавливает для каждой запускаемой копии демона переменные$REMOTE_ADDR
и$REMOTE_PORT
. - В секции
[Automount]
unit-файлов добавлена директиваTimeoutIdleSec=
, позволяющая указать таймаут автомонтирования — время, по истечении которого с момента последнего обращения к автоматической точке монтирования она будет отключена.Таймаут также можно установить из
/etc/fstab
, указав для соответствующего устройства параметрx-systemd.idle-timeout=
(наряду сx-systemd.automount
). - Помимо вышеуказанной x-systemd.idle-timeout=, обработчик
/etc/fstab
(systemd-fstab-generator) теперь поддерживает опцииx-systemd.requires=
иx-systemd.requires-mounts-for=
. С их помощью можно задать дополнительные зависимости для соответствующего .mount-юнита.Это может пригодиться, например, при хранении журнала ФС на отдельном устройстве (
-o logdev=
в случае XFS), или при использовании оверлейных ФС, объединяющих несколько точек монтирования (-o lowerdir=<path1>,upperdir=<path2>
). В каждом из этих случаев список зависимостей .mount-юнита требуется дополнять вручную. - Раздел ESP (EFI System Partition), автоматически монтируемый systemd-efi-boot-generator на
/boot
, теперь автомонтируется с таймаутом в 2 минуты. Это сделано ради того, чтобы уменьшить риск повреждения раздела при аварийном отключении системы — драйвер VFAT в ядре Linux по-прежнему ни на что не годен. - Суммарный расход процессорного времени всеми процессами юнита (атрибут
cpuacct.usage
соответствующей контрольной группы) теперь экспортируется как свойствоCPUUsageNSec=
объекта юнита на шине и отображается в выводе командыsystemctl status
.(Разумеется, это требует задействования контроллера cpuacct, т. е.CONFIG_CGROUP_CPUACCT=y
в конфигурации ядра иDefaultCPUAccounting=yes
в/etc/systemd/system.conf
. Что, в частности, несовместимо с планировщиком задач BFS, поэтому примера не будет. – Прим. пер.) - Команды
systemctl enable
,systemctl disable
иsystemctl mask
теперь поддерживают параметр--now
, позволяющий вдобавок ко включению, отключению или маскировке юнитов также немедленно запустить или остановить их. Другими словами, командаsystemctl enable --now
эквивалентна последовательному выполнениюsystemctl enable
иsystemctl start
(аналогично дляdisable
иmask
). - Команда
systemctl reboot
теперь поддерживает параметр--firmware-setup
, позволяющий после перезагрузки войти в режим настройки прошивки (то, что называют Setup). Разумеется, это требует поддержки со стороны самой прошивки и применимо только к UEFI.Соответствующий вызов был добавлен в шинное API systemd-logind, так что DE также могут предоставлять графический интерфейс для этого.
- Многие методы в шинных API systemd, systemd-logind и systemd-machined теперь поддерживают асинхронную авторизацию через polkit и могут использоваться непривилегированными процессами. Действия над своей сессией также по умолчанию разрешены и не требуют дополнительных привилегий (например,
loginctl lock-session
илиloginctl kill-session
теперь можно делать от имени пользователя). - В файле
/etc/crypttab
(за его обработку отвечает systemd-cryptsetup-generator) добавлена поддержка параметровoffset=
иskip=
(как в Debian). Эти параметры позволяют указать расположение зашифрованных данных внутри блочного устройства. - В спецификацию формата файла
/etc/os-release
добавлены новые поляVARIANT=
иVARIANT_ID=
, позволяющие создателям дистрибутива указать «разновидность» дистрибутива (в человекочитаемом и машиночитаемом виде соответственно) — такую, как «Workstation», «Server» и так далее. - systemd-fsck теперь умеет передавать информацию о текущем состоянии fsck в сокет
/run/systemd/fsck.progress
. Это может пригодиться при реализации загрузочных сплеш-скринов.
Изменения во вспомогательных компонентах
- В состав проекта systemd под именем systemd-boot был влит исходный код UEFI-загрузчика gummiboot. Соответствующая утилита командной строки называется bootctl.
Вместе с ним в проект был добавлен примитивный EFI-«контейнер», предназначенный для объединения файла ядра, initcpio и других вспомогательных файлов в один самозагружающийся образ. Это позволяет, к примеру, подписать совокупность ядра, initcpio и строки параметров в соответствии со стандартами Secure Boot (и при необходимости обойтись без использования загрузчика-прослойки).
Загрузчик systemd-boot был соответственно доработан для того, чтобы извлекать из таких контейнеров метаданные (название, версию, …) и отображать их при выборе варианта загрузки.
- В systemd-tmpfiles добавлены действия
h
иH
— установка атрибутов файлов аналогично chattr(1).
Изменения в journald
- systemd-journald больше не пытается самостоятельно устанавливать флаг
FS_NOCOW
на файлах журнала. Вместо этого используется вновь добавленное действиеh
в systemd-tmpfiles. Это позволяет администратору системы переопределить поведение, замаскировав файлjournal-nocow.conf
в конфигурации tmpfiles.d. - systemd-journald при обработке сообщений audit-подсистемы ядра теперь декодирует типы сообщений и записывает в лог текстовые идентификаторы.
Изменения в udev
- Библиотека gudev (биндинги udev к GObject) была выделена в отдельный репозиторий; теперь её поддержка ведётся в рамках проекта GNOME. Копия исходного кода gudev ещё некоторое время будет оставаться в дереве systemd, но в ближайшее время оттуда исчезнет.
Мейнтейнерам дистрибутивов рекомендуется ознакомиться с обсуждением в списке рассылки и постепенно переходить на новый репозиторий.
- udev не будет создавать симлинки (
/dev/disk/by-foo/bar
) для неизвестных типов блочных устройств (чёрный список в соответствующем udev-правиле был заменён на белый).(Это не должно никого затронуть, но если у вас феерически странная конфигурация устройств хранения данных и вдруг исчезли эти самые симлинки — теперь вы знаете, куда копать. — Прим. пер.) - Начата работа над новым API sd-device, которое является модернизацией традиционного API libudev и в итоге его заменит. (Ещё не скоро: новый API не стабилизирован и извне systemd на данный момент не доступен.)
- База данных аппаратного обеспечения (hwdb) udev’а теперь содержит базу данных Trackpoint-подобных устройств. На данный момент она состоит из информации об их чувствительности и требуемом ускорении курсора. Опять же, предполагается, что это будет использоваться в libinput.
Изменения в networkd
systemd-networkd теперь поддерживает:
- отключение интерфейсов при потере аплинка а-ля Uplink Failure Detection (директива
BindCarrier=
секции[Network]
network-файлов); - установку идентификатора DHCP-клиента (директива
ClientIdentifier=
секции[DHCP]
network-файлов); - явное включение или отключение использования NTP-серверов, полученных через DHCP на конкретном интерфейсе (директива
UseNTP=
секции[DHCP]
network-файлов); - создание IPv6-over-IPSec туннелей (директива
Kind=vti6
секции[NetDev]
netdev-файлов); - множество новых настроек для VXLAN- и bond-интерфейсов (секции
[VXLAN]
и[BOND]
netdev-файлов).
Также в systemd-networkd было исправлено управление IP forwarding. Начиная с данного релиза, не требуется вручную включать глобальный форвардинг с помощью sysctl-переменных net.ipv[46].ip_forward
. Вместо этого предлагается использовать директиву IPForward=
секции [Network]
network-файлов (что эквивалентно включению форвардинга для конкретного интерфейса).
Изменения, связанные с поддержкой контейнеров
- systemd-nspawn теперь поддерживает:
- параметр
--property
— установка произвольных свойств для scope-юнита контейнера (в частности, ограничений ресурсов); - параметр
--private-users=<нулевой UID>,<количество UID>
— переход в изолированное пространство имён пользователей; - параметр
--overlay=<lower>:<higher>:...:<точка монтирования>
— монтирование директорий из хоста в контейнер с использованием оверлейной ФС (по аналогии с--bind
); - параметр
--kill-signal
— явное указание сигнала, передаваемого PID 1 контейнера при его остановке; - запуск в составе конвейера, в каковом случае псевдо-TTY не создаётся, а файловые дескрипторы стандартного ввода и вывода напрямую передаются запускаемому процессу.
- параметр
- systemd-importd теперь способен импортировать контейнеры из локальных tar-архивов, побайтовых (.img, .raw) и .qcow2-образов, а также записывать их в tar-архивы и побайтовые образы. Ещё он научился импортировать Docker-образы через его Docker Registry HTTP API v2 (раньше умел только v1 — прим. пер.).
- systemd-importd теперь поддерживает верификацию загруженных образов с помощью gpg2 (опять же, раньше умел только gpg1 — прим. пер.).
- Многие (почти все) операции с контейнерами (в частности, импортирование) поддерживаются только для файловой системы btrfs, поскольку основаны на присутствующей в этой ФС функциональности снапшотов. Если используется другая ФС, при первой операции с контейнерами автоматически создаётся файл
/var/lib/machines.raw
, на котором создаётся btrfs, и этот файл монтируется на/var/lib/machines
.Файл-образ (и файловая система на нём) автоматически расширяется при необходимости.
(Почему они не сделали всё то же самое через overlayfs — загадка природы. — прим. пер.) - Наконец, была добавлена команда
machinectl set-limit
, позволяющая устанавливать ограничение на дисковое пространство для каждого контейнера. Эта функциональность реализована, опять же, через механизм квот btrfs.