Выпуск системного менеджера systemd 256 с утилитой run0 для замены sudo

После полугода разработки представлен релиз системного менеджера systemd 256. Ключевые изменения: утилита run0 для замены sudo, утилита importctl для работы с дисковыми образами, возможность версионированного доступа к ресурсам, концепция капсул для запуска дополнительных сервисных менеджеров, режим перенаправления логов systemd-journald в произвольный сокет, поддержка протокола Varlink в systemd-networkd, systemd-machined, bootctl, systemd-creds и systemd-hostnamed, генератор юнитов “systemd-ssh-generator” и утилита “systemd-ssh-proxy”.

Среди изменений в новом выпуске:

  • В состав включена утилита run0 для выполнения процессов под идентификаторами других пользователей, которая позиционируется как более безопасная замена программы sudo, реализованная в форме надстройки над командой systemd-run. В run0 вместо использования SUID осуществляется обращение к системному менеджеру с запросом запуска процесса, создания нового псевдотерминала (PTY) и пересылки данных между ним и текущим терминалом (TTY). Привилегированный процесс запускается в изолированном контексте, который порождается процессом PID 1, а не процессом пользователя, т.е. не наследует свойства окружения пользователя. Для авторизации и определения возможностей пользователя применяется Polkit. При работе с повышенными привилегиями в заголовок добавляется индикатор в виде красной точки, а оттенок фона в терминале меняется на красный.
  • Добавлена новая утилита командной строки importctl, предназначенная для загрузки, импорта и экспорта дисковых образов с использованием сервиса systemd-importd. В importctl реализованы команды pull-tar, pull-raw, import-tar, import-raw, import-fs, export-tar, export-raw, list-transfers и cancel-transfer, функциональность которых выделена в отдельную утилиту из программы machinectl.
  • Добавлен исполняемый файл systemd-vpick c реализацией протокола vpick, обеспечивающего версионированный доступ к ресурсам, таким как дисковые образы. Systemd-vpick позволяет загружать ресурсы из каталогов “*.v/“, в которых может храниться несколько версий определённых файлов. Номер версии указывается в имени файлов, например, “mymachine_2.1.5.raw”. Если при запросе явно не указывается номер версии, то автоматически будет использован файл с наиболее свежей версией. Поддержка версионированной загрузки ресурсов реализована в командах “systemd-nspawn –image=/–directory=”, systemd-dissect и systemd-portabled, а также в настройках юнитов “RootDirectory=”, “RootImage=”, “ExtensionImages=” и “ExtensionDirectories=”.
  • Реализована концепция капсул (“capsules”), позволяющих запускать дополнительные отдельные сервисные менеджеры для управления группой процессов, работающих под временными пользователями, создаваемыми динамически и удаляемыми после завершения работы сервисного менеджера. Капсулы позволяют обойтись без создания учётных записей пользователей для запуска групп сервисов, используют домашний каталог “/var/lib/capsules/” и набор типовых сервисов. Для запуска капсулы достаточно выполнить команду “systemctl start [email protected]”. Для работы в контексте капсул в различные утилиты, такие как systemctl и systemd-run, добавлена опция
    “–capsule=”/”-C”.
  • В systemd-journald добавлена возможность перенаправления потока записей в сетевой или локальный сокет (AF_INET, AF_INET6, AF_UNIX, AF_VSOCK), указанный через параметр ForwardToSocket в journald.conf или через свойство ‘journald.forward_to_socket’. Для ограничения отправляемых данных уровнем логгирования предложен параметр MaxLevelSocket. Для приёма логов может использоваться процесс systemd-journal-remote, в который добавлена поддержка сокетов AF_VSOCK и AF_UNIX.

    В systemd-vmspawn добавлена опция “–forward-journal” для перенаправления логов из виртуальной машины в хост-окружение, используя сокет AF_VSOCK. В systemd-journal-gatewayd добавлена возможность ограничения периодов времени, в которые будут приниматься логи. В утилиту journalctl добавлена опция “-T” (“–exclude-identifier”) для игнорирования определённых идентификаторов syslog, а также опция “–list-namespaces” для показа списка доступных пространств имён.

  • Расширены возможности по интеграции с sshd. Добавлена поддержка использования при авторизации входящих соединений ключей, полученных через userdbctl. Добавлен новый генератор юнитов “systemd-ssh-generator”, который при наличии исполняемого файла sshd позволяет настроить его активацию в привязке к различным сокетам (например, в контейнерах можно настроить вызов sshd при обращении к 22 порту через AF_VSOCK). Добавлен “systemd-ssh-proxy” – плагин к утилите ssh (включается через ProxyCommand/ProxyUseFdpass), позволяющий подключаться через сокеты AF_VSOCK и AF_UNIX (например, можно использовать ssh вместо sudo для организации доступа локальных пользователей к ресурсам).
  • В рамках инициативы по сокращению зависимостей у libsystemd реализована динамическая загрузка библиотек liblz4, libzstd, liblzma, libkmod и libgcrypt при помощи вызова dlopen() в ситуациях, когда их функции действительно необходимы.
  • Помимо каталога /etc, различные компоненты systemd теперь пытаются загрузить основной файл конфигурации из каталогов /usr/lib, /usr/local/lib и /run. Например, systemd-logind будет определять файл конфигурации в следующей последовательности: /etc/systemd/logind.conf, /run/systemd/logind.conf, /usr/local/lib/systemd/logind.conf и /usr/lib/systemd/logind.conf. В systemd-udevd аналогичным способом реализовано переопределние файла udev.conf.
  • Непривилегированным пользователям предоставлена возможность доступа к зашифрованным учётным данным сервисов. Для шифрования и расшифровки учётных данных для определённого пользователя в утилиту systemd-creds добавлены опции “–user” и “–uid”.
  • Реализована возможности сборки systemd из исходных текстов при отключении всех устаревших возможностей в OpenSSL 3.0.
  • В системный менеджер добавлена настройка “ProtectSystem=“, позволяющая управлять монтированием частей ФС в режиме только для чтения на уровне всей системы, а не только отдельных unit-ов. По умолчанию параметр ProtectSystem активирован для initrd для запрета записи в каталог /usr во время загрузки.
  • Для unit-ов предложены новые настройки “WantsMountsFor=” для определения монтирования раздела как необязательной зависимости и “MemoryZSwapWriteback=” для управления параметром memory.zswap.write, появившемся в ядре Linux 6.8. В unit-ах .mount и .swap разрешено использование настройке “What=” идентификаторов в стиле fstab, таких как “UUID=…” и “LABEL=…”. В настройке “RestrictNetworkInterfaces=” разрешено использование альтернативных имён сетевых интерфейсов.
  • В юниты “.socket” с опцией “Accept=yes” добавлена настройка “MaxConnectionsPerSource=”, позволяющая задать лимит на число одновременных соединений с одного IP-адреса или UID (для UNIX-сокетов).
  • В процесс “systemd-bsod“, реализующий аналог “синего экрана смерти”, добавлена опция “–tty” для выбора терминала, на котором будет показано полноэкранное уведомление в случае возникновения критических ошибок (LOG_EMERG).
  • В каталоге /dev обеспечено создание символических ссылок, сочетающих информацию на основе пути (by-path) и меток (by-{label,uuid}): “/dev/disk/by-path//by-/”, что позволяет выделить одинаковые разделы на разных устройствах хранения (например, после клонирования содержимого диска на другое устройство). Для мультимедийных контроллеров systemd-udevd теперь создаёт символические ссылки “/dev/media/by-path/*” (например, “/dev/media/by-path/pci-0000:04:00.3-usb-0:1:1.0-media-controller”).
  • Добавлен сервис systemd-udev-load-credentials.service для загрузки udev-правил из базы учётных записей (credential).
  • В процессах systemd-networkd и systemd-hostnamed реализован интерфейс Varlink. В systemd-hostnamed добавлена поддержка отдачи идентификатора системы и загрузки через D-Bus, а также всех данных из файлов os-release и machine-info через D-Bus и Varlink. В systemd-networkd реализован экспорт свойств NamespaceId и NamespaceNSID через D-Bus и Varlink, а также перебор
    пиров LLDP, используя API на базе Varlink.
  • В systemd-networkd реализованы настройки IPv6RetransmissionTimeSec и
    UseRetransmissionTime для управлением временем повторной отправки NS-сообщений (Neighbor Solicitation), применяемых для определения соседних хостов IPv6. Добавлена поддержка получения ключей для VPN Wireguard из базы учётных записей (credential). В link-файлы добавлен параметр ReceivePacketSteeringCPUMask для организации привязки обработчиков входящих пакетов к определённым CPU.
  • В утилиту networkctl добавлены параметры ‘mask’ и ‘unmask’ для игнорирования файлов конфигурации (.network). Реализована команда ‘networkctl edit –runtime’ для редактирования непостоянной конфигурации в /run/systemd/network/.
  • В systemd-nspawn добавлена поддержка переноса в контейнер сетевых интерфейсов для Wi-Fi-устройств.
  • В systemd-resolved добавлена поддержка расширенных кодов ошибок DNS (Extended DNS Errors, RFC 8914), а также DNS-записей SVCB, NAPTR и HTTPS (RFC 9460, RFC 2915). Добавлена поддержка команды “systemctl reload systemd-resolved” для перезагрузки конфигурации без перезапуска сервиса.
  • Добавлен режим ‘systemctl edit –stdin’, позволяющий создавать и изменять unit-файлы на основе содержимого, передаваемого через стандартный входной поток (например, для создания юнитов из скриптов).
  • Добавлена команда ‘systemd-analyze architectures’ для вывода списка известных архитектур CPU.
  • Добавлена команда ‘systemd-tmpfiles –purge’ для удаления всех временных файлов и каталогов, созданных через настройки в tmpfiles.d, а также команда “systemd-tmpfiles –dry-run” для отображения журнала действий без их фактического выполнения. В portablectl добавлена опций “–clean” для очистки всех данных, связанных переносимыми сервисом (кэш, логи, состояние, runtime-данные и fdstore), после его отключения.
  • В hostnamectl, resolvectl и loginctl добавлена опция ‘-j’ для вывода в формате JSON.
  • В утилите systemd-dissect реализована опция “–make-archive” для создания архивного файла (например, tar.gz) из дискового образа.
  • Расширены возможности по запуску виртуальных машин. В утилиту systemd-vmspawn, предназначенную для запуска виртуальных машин, добавлены опции: “–firmware” для настройки прошивки, “–tpm” для включения программной реализации TPM, “–linux” для указания загружаемого ядра, “–initrd” для указания образа initrd, “-D” для задания корневого каталога, “–private-users” для включения пространства имён для пользователей, “–bind=” и “–bind-ro” для проброса частей ФС их хост-окружения в гостевую систему, “–extra-drive” для подключения дополнительных устройств хранения, “-n/–network-tap/–network-user-mode” для настройки сети, “–console/–background” для выбора метода взаимодействия с VM, “–pass-ssh-key/–ssh-key-type” для размещения SSH-ключей в VM. В команде “machinectl start” обеспечена возможность как запуска контейнеров через systemd-nspawn, так и виртуальных машин через systemd-vmspawn.
  • В systemd-homed реализована возможность разблокировки домашнего каталога пользователя после его входа через SSH. В утилиту homectl добавлен режим “–offline”, позволяющий изменять свойства учётной записи без разблокировки домашнего каталога.
  • Переработаны компоненты для обработки дисковых квот в ФС XFS и EXT4, что позволило реализовать возможность включения квот во время работы, а не только на стадии загрузки.
  • В файл конфигурации sleep.conf добавлен параметр MemorySleepMode для настройки спящего режима.
  • В утилиту varlinkctl добавлена поддержка нового транспорта “ssh:”, который можно использовать с OpenSSH 9.4 и более новыми выпусками.
  • Время хранения core-дампов увеличено с 3 дней до 2 недель.
Release. Ссылка here.