systemd 247

systemd — подсистема инициализации и управления службами в Linux, фактически вытеснившая в 2010-е годы традиционную подсистему init.

Проведено нарушающее совместимость обновление правил udev, в systemd-homed по умолчанию задействована FS 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".

Основная особенность — интенсивное распараллеливание запуска служб в процессе загрузки системы, что позволяет существенно ускорить запуск операционной системы.