Леннарт Поттеринг представил релиз системного менеджера systemd 239. Из новшеств можно отметить концепцию переносимых сервисов, изменение наименования виртуальных сетевых интерфейсов, усиление защиты системных сервисов, поддержку DNS-over-TLS, режим suspend-then-hibernate, возможность сохранения дампа памяти при спящем режиме в файлы подкачки.
Основные изменения:
- Представлена экспериментальная поддержка переносимых сервисов («Portable Services»), позволяющих создавать системные сервисы в виде самодостаточных контейнеров. Переносимый сервис поставляется в виде системного образа, но обрабатывается как обычный сервис. Из достоинств переносимых сервисов отмечается возможность упаковки одного или нескольких приложений, сервисов и связанных с ними зависимостей в отдельный образ, с возможностью запуска компонентов с применением дополнительной sandbox-изоляции.
При этом, в отличие от контейнеров переносимые сервисы не запускаются в отдельном изолированном окружении со своим PID 1, а представляют из себя часть системы (выполняются в текущем системном окружении), отделённую в независимую самодостаточную иерархию каталогов. Для управления переносимыми сервисами предложена утилита «portablectl» (/usr/lib/systemd/portablectl). Для создания образов можно применять любые инструменты для формирования начинки контейнеров, такие как «dnf —installroot», «debootstrap» и «mkosi«;
- В systemd-resolved добавлена поддержка резолвинга доменных имён с использованием механизма DNS-over-TLS, при котором применяется штатный протокол DNS (обычно используется сетевой порт 853), завёрнутый в шифрованный канал связи, организованный при помощи протокола TLS с проверкой валидности хоста через TLS/SSL-сертификаты, заверенные удостоверяющим центром. Для активации DNS-over-TLS следует явно выставить в настройках resolved.conf параметр «DNSOverTLS=opportunistic» (по умолчанию поддержка отключена до внесения оптимизаций, направленных на сокращение задержек из-за дополнительных накладных расходов по установке TLS-сеанса поверх TCP);
- Реализован режим suspend-then-hibernate, при котором система вначале переходит в ждущий режим, но в случае непробуждения в течение определённого таймаута активируется и уходит в глубокий спящий режим;
- Обеспечена возможность использования файлов подкачки, а не только разделов подкачки, для сохранения дампа памяти во время перехода в спящий режим;
- Изменено наименование виртуальных сетевых интерфейсов, созданных с использованием технологий SR-IOV ( Single Root Input/Output Virtualization) и NPAR (NIC Partitioning), а также для устройств, PCI-контроллер которых не выставляет номер слота. Имена устройств SR-IOV теперь устанавливаются с учётом имени родительского сетевого интерфейса с добавлением суффикса «vN», где N — номер интерфейса. Все виртуальные устройства NPAR теперь именуются по единой схеме (ранее начиная с 9 устройства назначались имена ethN). Для PCI-устройств без номера слота выбирается имя в соответствии со схемой «net_id», вместо определяемых ядром имён ethN;
- Все длительно работающие системные сервисы переведены по умолчанию на использование белого списка системных вызовов, т.е. если раньше был определён список блокируемых опасных системных вызовов, а все остальные вызовы были разрешены, то теперь задан список разрешённых вызовов, а все остальные запрещены;
- В system.conf предложена новая настройка NoNewPrivileges, которая позволяет отключить получение новых привилегий (выставить флаг PR_SET_NO_NEW_PRIVS для PID 1), что не позволяет исполняемым файлам с setuid и выставленными capabilities менять свои привилегии;
- Вывод systemctl и других утилит теперь включает escape-последовательности, позволяющие отобразить доступные для клика ссылки в разных терминалах (например в выводе «systemctl status» теперь можно кликнуть на имени юнита для вызова программы для его просмотра или редактирования);
- В файлы «.network» в секцию [Route] добавлены новые опции IPv6MTUBytes и MTUBytes для явного выставления MTU для определённых маршрутов, добавлена опция «UserClass» для определения класса пользователя в DHCP, опции Multicast и AllMulticast для выставления для сетевого интерфейса флагов MULTICAST и ALLMULTI, а также новая секция «[CAN]» с настройками CAN-сетей;
- В файлах «.link» появились опции RxChannels, TxChannels, OtherChannels и CombinedChannels для определения числа принимающих и передающих каналов;
- В файлах «.netdev» появилась возможность создания интерфейсов «netdevsim»;
- В systemd-analyze добавлена новая команда «cat-config» для вывода содержимого любых файлов конфигурации, соответствующих маске. Например, «systemd-analyze cat-config systemd/system.conf» выдаст содержимое всех файлов конфигурации, которые обрабатываются при запуске процесса PID 1. В утилиты, подобные systemd-tmpfiles и
systemd-sysusers, добавлена опция «—cat-config», позволяющая просмотреть все настройки, учтённые данными утилитами. Например, «systemd-tmpfiles —cat-config» покажет в одном месте все строки файлов в «tmpfiles.d/»; - В systemd-nspawn добавлены опции: «—rlimit» для определения начальных лимитов ресурсов для процессов в контейнере, «—hostname» для переопределения имени хоста контейнера, «—no-new-privileges» для выставления флага PR_SET_NO_NEW_PRIVS (отключение suid и capabilities), «—oom-score-adjust» для корректировки поведения в случае нехватки памяти, «—cpu-affinity» для настройки привязки к ядрам CPU, «—resolv-conf» для управления обработкой /etc/resolv.conf, «—timezone» для управления обработкой /etc/localtime. В systemd-detect-virt добавлена опция «—list» для вывода всех известных виртуальных машин и контейнеров;
- Изменена схема поиска файлов, переопределяющих параметры unit-файлов. Например, если раньше для юнита «foo-bar-baz.service» переопределения проверялись по маске «foo-bar-baz.service.d/*.conf», то теперь проверяются все совпадения до первого дефиса, т.е. подпадают «foo-bar-.service.d/*.conf» и «foo-.service.d/», что позволяет создавать переопределения настроек для типовых групп юнитов;
- В systemd-logind.service убраны ограничения для сокетов AF_INET и AF_INET6 (убраны из настройки RestrictAddressFamilies), но данное изменение не повлияет на безопасность так как начиная с выпуска 235 для юнитов также выставляется дублирующая блокировка «IPAddressDeny=any» и изменение поведения может наблюдаться только в случае изменения настроек по умолчанию;
- При указании нескольких настроек RestrictNamespaces в юните, данные настройки теперь объединяются (ранее действовало только последнее значение RestrictNamespaces);
- При использовании для сервисных юнитов комбинации настроек OnFailure и Restart, обработчик сбоя больше не вызывается в случае автоматического перезапуска (ранее такое поведение было определено в документации, но на деле обработчик сбоя вызывался);
- В systemd-tmpfiles добавлен вывод предупреждения в случае упоминания в файлах «tmpfiles.d/» каталога «/var/run/», вместо которого предлагается использовать каталог «/run»;
- Команды systemctl disable/unmask/preset/preset-all теперь запрещено использовать с опцией «—runtime», так как результат зачастую не тот, что ожидает пользователь. При выполнении «systemctl disable/unmask» сейчас возвращается состояние как сеансовых (runtime), так и постоянных настроек, т.е. удаляются символические ссылки, как в каталоге /run, так и в /etc;
- В sd-boot добавлены новые настройки загрузчика, позволяющие опционально отключить поиск загрузочных разделов Windows и macOS и отображение в загрузочному меню режима reboot-into-firmware. Также можно изменить разрешение экрана при загрузке (например для HiDPI);
- В systemd-resolved.service и systemd-networkd.service по умолчанию выставлена настройка DynamicUser=yes для работы с использованием динамически генерируемого идентификатора пользователя вместо заранее определённых системных пользователей;
- Утилита systemd-resolve переименована в resolvectl, а интерфейс приведён в соответствие с другими утилитами *ctl, такими как systemctl и loginctl (для обеспечения обратной совместности утилита systemd-resolve сохранена). Кроме того, в утилиты resolvectl/systemd-resolve добавлены опции для совместимости с утилитой ‘resolvconf’, предлагаемой в Debian и FreeBSD;
- В networkd в настройке ClientIdentifier теперь допустимо использовать опцию «duid-only», при которой клиент будет отправлять только идентификатор DUID;
- В nss-systemd (NSS-модуль для glibc) добавлена поддержка перечисления (enumeration) динамических пользователей и групп (ранее поддерживался только маппинг UID/GID в имена и обратно);
- В journald в настройке Compress теперь можно задать порог, при превышении которого будет использовано сжатие, а объекты меньше которого сохранятся как есть (ранее порог был жестко выставлен а 512 байт);
- Добавлен новый сервис systemd-time-sync-wait.service, который откладывает запуск юнита time-sync.target на этапе загрузки до момента получения данных синхронизации точного времени по сети, что может оказаться полезным для систем без локальных часов;
- Для юнитов реализованы три новых спецификатора: %T и %V для подстановки каталогов с временными файлами (/tmp и /var/tmp) и %E для каталога с настройками ( /etc для системных юнитов или $XDG_CONFIG_HOME для пользовательских юнитов);
- В ExecStart теперь допускается использование относительных путей к исполняемым файлам (список путей в $PATH можно узнать через «systemd-path search-binaries-default»);
- Добавлено новое состояние загрузки юнитов — «bad-setting», выставляемого если юнит был загружен, но содержит мешающие запуску ошибки (например, отсутствуют настройки ExecStart и ExecStop);
- В coredumpctl команда «gdb» переименована в «debug» для абстрагирования от типа отладчика (например, может быть использован lldb). Для выбора альтернативного отладчика добавлена опция «—debugger» и переменная окружения $SYSTEMD_DEBUGGER;
- В timedatectl добавлена новая команда «show» для отображения свойств шины systemd-timedated, а также «timesync-status» для текущего состояния синхронизации времени по NTP и «show-timesync» для показа свойств шины systemd-timesyncd. В systemd-timedated добавлена обработка переменной окружения $SYSTEMD_TIMEDATED_NTP_SERVICES, в которой можно указать список имён юнитов NTP-клиентов;
- В journalctl и systemctl добавлена опция «-o», при указании которой в каждой строке лога отображаются имена юнитов вместо тегов syslog, а даты указываются с учётом часового пояса;
- Добавлен новый юнит «system-update-pre.target», определяющий предварительные действия по синхронизации перед установкой системных обновлений в offline-режиме;
- В исполняемый файл systemd добавлена опция «—dump-bus-properties» для вывода всех свойств D-Bus;
- Для юнитов добавлена настройка «PrivateMounts», при выставлении которой юнит запускается в отдельном собственном пространстве имён в файловой системе;
- В настройку ConditionSecurity добавлен параметр «uefi-secureboot», который выставляется в значение «true» в случае загрузки в режиме UEFI Secure boot;
- По умолчанию отключен sysctl «net.ipv4.tcp_ecn»;
- Добавлены новые документы CGROUP_DELEGATION.md, PORTABLE_SERVICES.md, CODE_QUALITY.md и BOOT_LOADER_SPECIFICATION.md.