23.10.2021

Выпуск системного менеджера systemd 247


После четырёх месяцев разработки представлен релиз системного менеджера systemd 247. В новом выпуске добавлен экспериментальный обработчик нехватки памяти, проведено нарушающее совместимость обновление правил udev, в systemd-homed по умолчанию задействована ФС Btrfs, предложен механизм для безопасной передачи конфиденциальных данных в сервисы, стабилизирована утилита systemd-dissect.

Основные изменения:

  • В правила udev внесены нарушающие обратную совместимость изменения, необходимые для корректной реализации в udev uevent-событий «bind» и «unbind», внесённых в модель устройств ядра Linux 4.14 и обычно генерируемых для USB-устройств и устройств для которых необходимо до начала работы загрузить прошивку. Для использования нового systemd-udevd дистрибутивам потребуется обновить правила udev, заменив вызовы ‘ACTION!=»add|change»,GOTO=»xyz_end»‘ на ‘ACTION==»remove»,GOTO=»xyz_end»‘. Помимо изменения поставляемых в разных пакетах правил udev, изменения также необходимо будет внести в различные программы мониторинга, библиотеки и утилиты, работающие с правилами udev.

    Утверждается, что необходимость подобного изменения обусловлена не проблемами в systemd или udev, а нарушающим совместимость изменением в ядре Linux, которое привело к тому, что всё больше и больше драйверов используют события «bind» и «unbind», для поддержки которых требуется кардинальное изменение логики обработки событий. В качестве решения в systemd-udevd полностью переработана концепция тегов, позволяющих помечать и фильтровать устройства в процессе их отслеживания. Теги udev теперь жёстко привязываются к устройству и не могут быть удалены до того, как само устройство будет удалено. Такая мера гарантирует, что приложения смогут получить uevent для тегов, после применения вызова «unbind», так как тег теперь связывается не с событием устройства, а с самим устройством, и не меняется после нового события.

  • Добавлена экспериментальная поддержка раннего реагирования на нехватку памяти в системе (systemd-oomd), реализованная на базе обработчика oomd, который развивает компания Facebook. Oomd использует подсистему ядра PSI (Pressure Stall Information), позволяющую в пространстве пользователя проанализировать информацию о времени ожидания получения различных ресурсов (CPU, память, ввод/вывод) для точной оценки уровня загруженности системы и характера замедления работы.

    PSI позволяет выявить начало возникновения задержек из-за нехватки ресурсов и выборочно завершить работу ресурсоёмких процессов на стадии, когда система ещё не находится в критическом состоянии и не начинает интенсивно урезать кэш и вытеснять данные в раздел подкачки. Для управления предложена утилита oomctl. В unit-ах, допускающих ограничение ресурсов (.service, .mount, .swap, .slice, .socket и .slice), реализованы настройки ManagedOOMSwap, ManagedOOMMemoryPressure и ManagedOOMMemoryPressureLimitPercent.

  • В системных сервисах предложена (задействована в systemd-nspawn) новая логика безопасной передачи конфиденциальных данных, таких как пароли и ключи шифрования, а также сопутствующей информации, например, имён пользователей и сертификатов. Для организации передачи данных предложено два параметра SetCredential и LoadCredential, а сами учётные данные передаются через промежуточные файлы в отдельном каталоге, определяемом через переменную окружения $CREDENTIALS_DIRECTORY.
  • При создании домашних каталогов в разделах LUKS при помощи сервиса systemd-homed, обеспечивающем управление переносимыми домашними каталогами, по умолчанию теперь используется файловая система Btrfs. Для изменения типа ФС можно воспользоваться параметром DefaultFileSystemType в homed.conf. Отмечается, что в отличие от ext4 и xfs, применение Btrfs позволяет не только увеличивать, но и уменьшать размер примонтированного раздела.
  • В JSON-профили пользователей systemd-homed добавлена поддержка ключей восстановления, включающих автоматически сгенерированные запасные парольные фразы для разблокировки учётной записи или домашнего каталога, на случай потери токена FIDO2 или PKCS#11. Для прикрепления ключа восстановления к учётной записи предложена опция «—recovery-key», а сам ключ отображается в форме QR-кода для его сканирования и сохранения в надёжном месте.
  • Для каждого шифрованного каталога LUKS в systemd-homed реализована обработка флага «dirty», который сигнализирует, что каталог не был отключён должным образом, т.е. перед отключением не была запущена чистка освобождённых блоков.
  • Стабилизирован и размещён в /usr/bin инструмент systemd-dissect, выполняющий работу по разбору дисковых образов в соответствии с Bootable Partition Specification, по аналогии с systemd-nspawn. systemd-dissect может применяться для монтирования в локальную директорию дисковых образов со сложной раскладкой разделов (например, включающих разделы LUKS и Verity). В новом выпуске systemd-dissect также предложен новый параметр «—mkdir», который при указании в комбинации с параметром «—mount» позволяет создавать каталоги для монтирования образов, если они не созданы заранее. Также добавлены параметры «—copy-from» и «—copy-to» для копирования файлов и каталогов в образы и из образов без их монтирования. Для вывода отчёта о проверке образа в формате JSON предложена опция «—json».
  • Библиотеки libqrencode, libpcre2, libidn/libidn2, libpwquality и libcryptsetup теперь загружаются динамически с использованием dlopen(), вместо жёсткого указания зависимостей в заголовке ELF. Изменение позволяет загружать указанные зависимости при необходимости и только если они доступны. Если библиотеки не найдены, привязанная к ним операция не выполняется или вызывается запасной обработчик. Например, для создания урезанных системных образов дистрибутивов можно минимизировать список зависимостей, которые требуются для пакета systemd, переведя дополнительные библиотеки из категории «required» в «recommended».

  • Для сервисов, использующих параметры RootImage и RootDirectory, по умолчанию активирована настройка MountAPIVFS, включающая автоматическое подключение псевдо-ФС /proc/, /sys/ и /dev/.
  • PAM-настройки сервиса «systemd-user» перенесены из /etc/pam.d/ в каталог /usr/lib/pam.d/ (подразумевается, что в /usr/lib/pam.d/ размещены системные PAM-файлы, а /etc/pam.d/ позволяет их переопределить).
  • Для unit-файлов реализована настройка RootImageOptions, позволяющая переопределить параметры монтирования для любых ФС, монтируемых при обработке опции RootImage. Также добавлена настройка MountImages для монтирования дополнительных образов в доступное сервису дерево каталогов.
  • В таймеры добавлена настройка FixedRandomDelay, позволяющая при настройке случайно задержки через RandomizedDelaySec обеспечить стабильность данной задержки на указанной системе (но для разных юнитов задержки будут разными).
  • В сокеты добавлена настройка Timestamping для управления включением параметров SO_TIMESTAMP/SO_TIMESTAMPNS, которая может принимать значения «us», «ns» и «off».
  • В systemd-repart добавлена возможность генерации вывода в формате JSON (—json).
  • В systemd-tmpfiles добавлена опция «-E» для исключения служебных каталогов (эквивалентна набору «—exclude-prefix=/dev —exclude-prefix=/proc —exclude=/run —exclude=/sys»). Также добавлена опция «—image», которая похожа на «—root», но использует дисковый образ вместо каталога.
  • В journalctl добавлена опция «—image» для обращения к логам в дисковом образе. Обеспечена подсветка вывода в режиме «—output=cat».
  • В systemctl добавлен параметр «—timestamp», который можно использовать для настройки стиля выводимого времени (точность, часовой пояс).
  • В systemd-detect-virt и ConditionVirtualization реализовано определение системы управления контейнерами Pouch и виртуальных машин IBM PowerVM.
  • Systemd-nspawn переведён на использование каталога /run/host/incoming/ для проброса внешних точек монтирования в контейнеры, а также /run/host/notify для определения управляющих сокетов для контейнеров
  • Добавлен новый фильтр системных вызовов «@known», включающий все системные вызовы, известные на момент сборки systemd. Поведение списка «allow» фильтра системных вызовов немного изменено, и по умолчанию теперь допускаются (EPERM) только вызовы «@known», а для остальных выдаётся код ENOSYS. При выполнении команды «systemd-analyze syscall-filter» теперь выводятся две отдельные секции системными вызовами, известными на момент сборки, и системными вызовами, добавленными после. При установке переменной окружения $SYSTEMD_LOG_SECCOMP=1 в systemd-nspawn обеспечено отражение в логе аудита всех нарушений фильтра системных вызовов. Для отключения фильтра системных вызовов предложена переменная окружения $SYSTEMD_SECCOMP=0.
  • Для unit-файлов реализованы настройки ProtectProc и ProcSubset, включающие механизмы защиты procfs (hidepid и subset) для ограничения просмотра в /proc только своих процессов.
  • В сокеты добавлена настройка FlushPending для сброса всех ожидающих соединений после завершения связанного сервиса.
  • В systemd-repart добавлены настройки Format, Encrypt и CopyFiles для форматирования, LUKS-шифрования и заполнения любых новых разделов. В опции «—size» реализовано значение «auto» для автоматического выбора минимально возможного размера образа.
  • В systemd-resolved в дополнение к D-Bus и локального DNS (127.0.0.53) добавлен ещё один IPC-интерфейс — Varlink, который позволяет определять имена в initrd и на раннем этапе загрузки, когда D-Bus ещё недоступен. Добавлен параметр DNSStubListenerExtra для указания дополнительных IP для приёма запросов, в дополнение к 127.0.0.53:53. При обработке запросов через D-Bus и Varlink указание точки после имени хоста теперь воспринимается как отключение проверки с доменом, указанным в параметре «search», т.е. вызов «resolvectl query foo.» эквивалентен «resolvectl query —search=off foo.».
  • В systemd-tmpfiles при автоматической чистке старых файлов в /tmp/ и /var/tmp/, помимо atime, mtime и ctime теперь учитывается и btime («birth time»).
  • В systemd-logind добавлена обработка клавиши KEY_RESTART и выполнение перезагрузки при её нажатии, по аналогии с обработкой клавиш EY_POWER, KEY_SUSPEND и KEY_SLEEP. Для переопределения обработчика предложены настройки HandleRebootKey и RebootKeyIgnoreInhibited.
  • В systemd-nspawn и systemd-machined обеспечена реконструкция жёстких ссылок при копировании содержимого OSTree.
  • В systemd-networkd в файлах .netdev появилась возможность создания туннелей «BareUDP». В файлах .network в параметр Gateway добавлена поддержка спецзначений «_dhcp4» и «_ipv6ra для настройки дополнительных локально определённых маршрутов к шлюзу при помощи DHCP и IPv6 Router Advertisement. Настройка и секция IPv6PrefixDelegation переименованы в IPv6SendRA.
  • В systemd-shutdown на последней стадии завершения работы реализована попытка отсоединения MD-устройств (программные RAID) по аналогии с отключением блочных устройств loopback и DM, в качестве подстраховки на случай если ранее подсистема хранения корректно их не отключила.
  • Изменена логика вызова обработчиков многостраничного просмотра (autopaging) — при запуске с использованием утилиты «sudo» в less теперь включается режим «secure» ($LESSECURE=1), запрещающий вызов внешних программ.
  • В «systemctl edit» реализован вывод в комментарии оригинального содержимого редактируемого юнита.
  • Юниты в пользовательском режиме разделены на три части: session.slice (юниты базового графического сеанса), app.slice (обычные пользовательские приложения) и background.slice (низкоприоритетные задачи). В дальнейшем для данных наборов планируется реализовать раздельные ограничения и защиту от исчерпания ресурсов.
  • Добавлена поддержка нового типа GPT-разделов RISCV32/64, который можно использовать для корневого раздела и раздела /usr.

Источник: https://www.opennet.ru/opennews/art.shtml?num=54155

Добавить комментарий