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.: Да будет срач.

















