16 февраля был представлен очередной релиз системного менеджера systemd, совмещающего в себе функции системы инициализации, ведения журнала, управления сессиями пользователей и работы с контейнерами. systemd основан на модели зависимостей (в противовес событийной модели), производит отслеживание процессов запущенных сервисов при помощи механизма cgroups ядра Linux, поддерживает механизмы сокет- и dbus-активации сервисов и предоставляет удобный декларативный синтаксис для описания демонов и других сущностей. Это позволяет производить агрессивную параллелизацию при запуске и остановке сервисов.
В рамках проекта также разрабатывается ряд легковесных приложений и демонов, выполняющих второстепенные, но распространённые вспомогательные задачи (т. н. plumbing layer) — от настройки подсистемы VT (systemd-vconsole-setup) и первичного конфигурирования системы (systemd-firstboot) до управления сетью (systemd-networkd) и профилирования загрузки (systemd-bootchart).
Большая часть изменений, вошедших в этот релиз, была направлена на расширение возможностей по работе с контейнерами. Эти изменения сконцентрированы в компонентах systemd-machined
и systemd-nspawn
и нескольких сопутствующих утилитах.
Примечание переводчика: в плане новых контейнерных фич релиз получился крайне сырой; по факту мало что работает. Такое ощущение, что они тупо сделали промежуточный тарболл, чтобы заиметь чуть побольше тестеров.
Изменения в ядре systemd:
- При остановке mount-юнита, соответствующего директории, на которую примонтировано более одного устройства, теперь производится отмонтирование всех устройств на этой точке монтирования. [Раньше, надо полагать, отмонтировалось только последнее. Более того, примонтировать несколько устройств на одну директорию средствами mount-юнитов по-прежнему невозможно. — Прим. пер.]
- device-юниты, соответствующие приводам оптических дисков, теперь считаются активными только при наличии диска в приводе.
- Все mount-юниты теперь автоматически получают зависимость
BindsTo=
от «своих» device-юнитов. Вкупе с предыдущим изменением это обеспечивает автоматическое [небезопасное, но так хотя бы /etc/mtab не захламляется — Прим. пер.] отмонтирование дисков и других носителей при их извлечении. - Введена концепция «неподдерживаемых» типов юнитов. Так, например, при попытке активировать busname-юнит на системе без kdbus он будет помечен как сбойный с комментарием «unsupported».
Список типов юнитов, не поддерживаемых на некоторых конфигурациях:
- .busname — на системах без kdbus;
- .swap — в контейнерах; на системах с
CONFIG_SWAP=n
; - .automount — в контейнерах; на системах с
CONFIG_AUTOFS4_FS=n
; - .device — в контейнерах.
- Суммарное потребление памяти всеми процессами юнита (атрибут
memory.usage_in_bytes
соответствующей контрольной группы) теперь экспортируется как свойствоMemoryCurrent
объекта юнита на шине и отображается в выводе командыsystemctl status
. Например:$ systemctl status systemd-journald ● systemd-journald.service - Journal Service [...] Main PID: 210 (systemd-journal) Status: "Processing requests..." Memory: 90.4M [...] $ busctl introspect org.freedesktop.systemd1 /org/freedesktop/systemd1/unit/systemd_2djournald_2eservice org.freedesktop.systemd1.Service NAME TYPE SIGNATURE RESULT/VALUE FLAGS [...] .MemoryAccounting property b true - .MemoryCurrent property t 94887936 - [...]
[Стоит отметить, что это свойство отражает суммарный RSS и объём файлового кэша процессов в контрольной группе. Также, разумеется, это возможно только при задействовании контроллера memcg, т. е.
CONFIG_MEMCG=y
в конфигурации ядра иDefaultMemoryAccounting=true
в /etc/systemd/system.conf. — Прим. пер.] - Генераторы юнитов теперь можно маскировать (по аналогии с самими юнитами), размещая в
/{etc,run}/systemd/system-generators/
пустые файлы (или симлинки на /dev/null). - Для юнитов, присоединённых к терминалу (
StandardInput=tty
,StandardOutput=tty
), будет автоматически устанавливаться переменная окруженияTERM=vt220
(вместо vt102, как было ранее). Это должно исправить ошибки в приложениях, использующих нетривиальные возможности терминала (например, клавиши PgUp/PgDn). - Добавлен механизм, позволяющий процессам «сохранять» в PID 1 открытые файловые дескрипторы (например, на время собственного перезапуска). Эта возможность уже задействована в systemd-journald для того, чтобы избежать потери сообщений при перезапуске.
Таким образом, все три «ключевых» компонента systemd (systemd, logind, journald) теперь способны перезапускаться с сохранением состояния.
Технически этот механизм реализован через расширение API sd_notify(3) (функция
sd_pid_notify_with_fds()
). Для прикрепления файловых дескрипторов к сообщению используется концепция fd passing, а само сообщение должно содержать строкуFDSTORE=1
.Количество файловых дескрипторов, которое процессы юнита могут единовременно «сохранить» таким образом, ограничивается значением директивы
FileDescriptorStoreMax=
в секции[Service]
unit-файлов (по умолчанию 0, т. е. нисколько). - Нажатие Ctrl-Alt-Del более семи раз в течение двух секунд теперь вызывает аварийный перезапуск системы, эквивалентный результату выполнения
systemctl reboot -f
(т. е. при этом все процессы завершаются, а файловые системы демонтируются или переводятся в режим «только для чтения»). Этот механизм стоит рассматривать как более «щадящую» альтернативу Alt-SysRq-B. - В файле
/etc/crypttab
(за его обработку отвечает systemd-cryptsetup-generator) добавлена поддержка параметраheader=
(как в Debian). Этот параметр позволяет указать расположение LUKS-заголовка, если он хранится на отдельном устройстве. - При копировании куда-либо каких-либо файлов (например, в контексте действия
C
в systemd-tmpfiles) компоненты systemd теперь сначала пытаются создавать reflink (на тех ФС, которые это поддерживают, в частности, btrfs и ocfs2). При отсутствии поддержки выполняется обычное копирование.
Изменения в утилитах и вспомогательных компонентах:
- Команды
loginctl user-status
,loginctl session-status
иmachinectl status
теперь также выводят (подобноsystemctl status
) последние несколько строчек из лога, ассоциированных с данным пользователем, сессией или контейнером соответственно. При этом в последнем случапе имеется в виду не внутренний лог самого контейнера, а лог того юнита, в котором он запущен (т. е., например, вывод systemd-nspawn). - Все подкоманды loginctl, которые принимают в качестве аргумента идентификатор сессии или имя пользователя (например, две вышеупомянутые), теперь могут быть вызваны без аргумента. В этом случае они применяются к той сессии, в которой (к тому пользователю, от имени которого) запущены.
- В systemd-run добавлен параметр командной строки
-t
(--pty
), позволяющий перенаправить ввод/вывод запускаемого процесса в текущую консоль (при этом он всё равно запускается как дочерний процесс systemd). Стоит отметить, что это также поддерживается при запуске процесса в другом контейнере.Например, команда
systemd-run -t /bin/bash
запустит рутовую оболочку в обход PAM и регистрации сессии. - В systemd-tmpfiles добавлено действие
v
— создание btrfs subvolume по указанному пути. В случае невозможности (если используется другая ФС) создаётся обычная директория (эквивалентно действию d). - В systemd-tmpfiles добавлено действие
a
— назначение файлу заданных ACL. - В комплект поставки включён скрипт для
xinitrc.d
, который сообщает systemd --user текущие значения переменных$DISPLAY
и$XAUTHORITY
. Это позволит «из коробки» запускать с помощью systemd --user графические приложения, взаимодействующие с X-сервером.[При этом никаких дополнительных зависимостей не проставляется, поэтому при завершении работы X-сервера все эти приложения не будут корректно прибиты и упадут вслед за сервером. Но лучше так, чем никак. Ждём, пока кто-нибудь придумает, как вписать иксы или вейланд в эту концепцию. — Прим. пер.]
- В спецификацию формата файла
/etc/os-release
добавлено новое полеPRIVACY_POLICY_URL=
, позволяющее создателям дистрибутива указать ссылку на его Privacy Policy.
Изменения в udev:
- Часть API libudev, относящаяся к работе с hwdb (декларативной базой данных оборудования), вынесена в отдельную библиотеку sd-hwdb (заголовочный файл
sd-hwdb.h
), отделённую от libudev.Также добавлена вспомогательная утилита systemd-hwdb, позволяющая взаимодействовать с этой базой данных (пересобирать и производить тестовые запросы).
- Эта самая hwdb теперь включает в себя информацию о «разрешающей способности» колёс прокрутки мышей (что-то вроде «повороту на какой угол соответствует одно событие») и различные сведения о тачпадах.
[Напомню, что в версии 218 в hwdb начали собирать информацию о разрешающей способности самих оптических сенсоров мышей. Это делается для того, чтобы настройки ускорения курсора и скорости прокрутки работали одинаково на любом оборудовании. Разумеется, необходима поддержка этих свойств со стороны того, кто будет обрабатывать события с устройств ввода; насколько мне известно, это пилят в libinput. — Прим. пер.]
- Физические размеры сенсорных экранов теперь отражены в атрибутах соответствующих им устройств ввода.
Изменения в journald:
- systemd-journald теперь устанавливает btrfs-специфичный флаг
FS_NOCOW
на файлах журнала. Это должно повысить производительность на btrfs, поскольку типичная последовательность обращений к этим файлам [то, как journald работает с этими файлами] достаточно плохо ложится на механизм Copy-on-Write.Побочный эффект состоит в том, что также отключается btrfs-специфичный механизм проверки целостности файлов. Однако, это не является проблемой, поскольку формат файла журнала предусматривает собственный механизм контрольных сумм.
Ещё одно изменение состоит в том, что systemd-journald теперь более корректно обрабатывает события переполнения диска (а именно — сигнал SIGBUS для файлов, отображённых в память) в тех случаях, когда использование fallocate(2) по тем или иным причинам не гарантирует выделения места. [Видимо, имеются в виду Copy-on-Write-ФС, отличные от btrfs. — Прим. пер.]
- При удалении текущего файла журнала (того, в который сейчас ведётся запись) systemd-journald теперь это замечает и немедленно начинает запись в новый файл.
В networkd добавлена поддержка:
- FDB-таблиц для соединений типа «мост» (секция
[BridgeFDB]
network-файлов); - сбора LLDP-оповещений (отображаются в выводе утилиты
networkctl
); - нескольких новых типов виртуальных сетевых устройств, а именно ipvlan, gretap, ip6gre, ip6gretap и ip6tnl (директива
Kind=
секции[NetDev]
netdev-файлов); - автонастройки link-local IPv6-адресов (директива
LinkLocalAddressing=
секции[Network]
network-файлов); - настройки перенаправления и маскарадинга IPv4/IPv6 отдельно для каждого интерфейса (директивы
IPForward=
,IPMasquerade=
секции[Network]
network-файлов); - явного задания scope (global, link, host) для создаваемых маршрутов (директива
Scope=
секции[Route]
network-файлов); - явного задания нижних 64 бит IPv6-адреса при задействовании SLAAC (директива
IPv6Token=
секции[Network]
network-файлов); - перечислений и wildcard'ов в директивах секции
[Match]
всех файлов конфигурации.[например, можно указать список MAC-адресов, к которым нужно применить link-файл, или же что-то вроде
Name=en*
— Прим. пер.]
Другие изменения в networkd:
- Утилита systemd-networkd-wait-online теперь позволяет указывать подмножество интерфейсов, настройки которых требуется дождаться, и таймаут этого ожидания.
- systemd-networkd теперь автоматически завершается, когда ему нечего делать (это случается, когда все присутствующие интерфейсы либо не требуют настройки, либо конфигурируются статически). При появлении в системе новых интерфейсов networkd запускается заново, для чего используется вариант механизма сокет-активации.
Изменения, связанные с поддержкой контейнеров:
- Директория
/var/lib/containers
, предназначенная для хранения файловых систем контейнеров и образов ВМ, переименована в/var/lib/machines
ради единообразия терминологии. - Добавлен юнит
machines.target
, группирующий все автозапускаемые контейнеры в системе. - В утилите
systemd-nspawn
добавлены следующие параметры командной строки:-
--template
(только btrfs) — указание эталонного дерева ФС, которое будет скопировано в корневую директорию контейнера (--directory
) в случае отсутствия последней; -
--ephemeral
(только btrfs) — запуск контейнера без внесения изменений в его корневую директорию посредством создания временного btrfs-снапшота этой директории (например, можно сделатьsystemd-nspawn --ephemeral --directory /
и запустить в контейнере копию ОС хоста, не мешая самому хосту); -
--image
— запуск контейнера из образа диска с таблицей разделов MBR или GPT (при этом раздел должен быть один — или, в случае GPT, все разделы должны быть помечены согласно спецификации); -
--machine
,-M
— запуск контейнера из дерева ФС или из образа c указанным именем в/var/lib/machines
; -
--network-veth
,-n
— создание для контейнера собственного veth-интерфейса (теперь для этих интерфейсов по умолчанию задействована вышеописанная директиваIPMasquerade=yes
, что даёт контейнеру доступ ко всем сконфигурированным на хосте сетям); -
--port
,-p
— «проброс» указанного порта из контейнера в хост-систему (в сочетании с--network-veth
это позволяет запускать в контейнерах серверные приложения так, как будто они запущены на хосте).
-
- Прочие изменения в
systemd-nspawn
:- На директорию
/tmp
внутри контейнера теперь автоматически монтируется tmpfs - Реализована защита от повторных запусков одного и того же образа (read-write блокировка)
- Почти вся иерархия контрольных групп (
/sys/fs/cgroup
) теперь отображается внутрь контейнеров (в режиме read-only, за исключением собственного поддерева контейнера)
- На директорию
- В команде
machinectl
, предназначенной для взаимодействия с менеджером контейнеров systemd-machined, добавлены следующие подкоманды:-
machinectl list-images
,machinectl image-status
— отображение информации об образах контейнеров в/var/lib/machines
; -
machinectl start
— запуск контейнера с помощью systemd-nspawn -M (эквивалентsystemctl start systemd-nspawn@<имя>
); -
machinectl clone
(только btrfs),machinectl rename
,machinectl read-only
,machinectl remove
— различные операции с образами в/var/lib/machines
; -
machinectl copy-from
,machinectl copy-to
— копирование файлов из контейнера на хост или в обратном направлении; -
machinectl bind
(только systemd-nspawn) — bind-монтирование директорий из хоста в контейнер; -
machinectl pull-tar
,machinectl pull-raw
,machinectl pull-dkr
(на данный момент только btrfs) — загрузка и распаковка в/var/lib/machines
, соответственно, архивов ФС, образов дисков и образов Docker.
-
- Последние три подкоманды, предназначенные для загрузки образов контейнеров из Интернета, обеспечивают реализованы посредством нового демона — systemd-importd. Он обеспечивает загрузку данных в фоновом режиме.
P. S.: Да будет срач.