След година и половина разработки, беше публикувана новата стабилна версия на инструмента Flatpak 1.18, която предлага система за изграждане на самостоятелни пакети, независими от конкретни Linux дистрибуции и работещи в специален контейнер, изолиращ приложението от останалата част на системата. Подкрепа за изпълнение на Flatpak пакети е осигурена за Fedora, CentOS, Debian, Arch Linux, Gentoo, Linux Mint, Alt Linux и Ubuntu. Flatpak пакети са включени в репозитория на Fedora и се поддържат в стандартните приложения за управление на приложения GNOME и KDE.
Ключови нововъведения в версията Flatpak 1.18:
- Реализирана е поддръжка на условни разрешения, позволяващи при искане на разрешения да се провери наличието на определени способности в системата или в runtime. Например, при необходимост от достъп до входно устройство, вместо „—device=all“ можете да поискате разрешение „—device-if=all:!has-input-device —device=input“, което ще предостави достъп само до входни устройства или ще се върне обратно за достъп до всички устройства, ако селективното предоставяне на достъп не се поддържа в runtime. По подобен начин може да се поиска достъп до USB устройства („has-usb-device“ и „has-usb-portal“) или споделени подсистеми.
- Разрешен е достъп до устройството /dev/ntsync за взаимодействие с
ядрен модул NTSYNC, който реализира набор от примитиви за синхронизация, използвани в ядрото на Windows NT и позволяващи значително да се увеличи производителността на Windows игри, стартирани с Wine. - За GPU Intel Xe е включена поддръжка на API VA-API за хардуерно ускорение при декодиране на видео.
- Реализирана е възможността за достъп до устройството /dev/kfd (Kernel Fusion Driver) с използване на правомощия, предоставени за DRI устройства. Драйверът kfd реализира интерфейс за директно извършване на изчисления на GPU AMD от приложения, използващи AMD ROCm, HIP и OpenCL.
- Добавена е поддръжка за използване на опции от командния ред за пренасочване на достъпа до директории в изолирани приложения.
- Добавена е поддръжка за директорията „preinstall.d“, която определя списък с предварително инсталирани Flatpak приложения (за включване на Flatpak приложения в операционната система).
- Разрешена е директна инсталация на приложения от контейнери в OCI формат, които могат да бъдат изтегляни от собствени OCI репозитории и локални архиви.
- В командата „flatpak install —from“ е добавена поддръжка за URI „flatpak+https://“.
- Към командата „flatpak run“ е добавена опция „—clear-env“ за изчистване на променливите на средата преди стартиране на приложението.
- Предоставена е възможността за експортиране на кореновата директория на хост-средата в изолирана среда на приложението с достъп чрез директория /run/host/root.
- Добавена е възможност за извеждане на резултата от изпълнението на командите във формат JSON.
- Усилена е изолацията на сборната среда — командата „flatpak build“ сега по подразбиране не предоставя достъп до хоста.
- Добавена е команда „reinstall“ за преинсталиране на зависимости (bundle).
- Настройките на D-Bus по подразбиране са преместени от директория /etc в /usr.
- Съкратено е времето за стартиране при използване на командния интерпретатор fish.
- В libflatpak е добавена функция за получаване на информация за времето на създаване на конфигурацията, която позволява на приложения като GNOME Software да определят, че кешираните данни изискват обновление.
- Премахната е сборната опция http_backend, вместо libsoup2 за зареждане по HTTP/HTTPS е задействана библиотека libcurl.
- По подразбиране е включено използването на escape-последователности за индикация на напредъка на операцията.
- Разрешено е предаването на права за достъп до устройства в вложени sandbox-среди, създадени чрез портали Flatpak.
- За приложения, предлагани под формата на OCI-образи, е реализиран механизъм „extra-data“, позволяващ например организирането на възпроизвеждане на видео h.265 в Flatpak-пакетите на Fedora Linux.
- Добавена е поддръжка за компресия на зависимости (OCI bundle) с използване на алгоритъма zstd, който по-ефективно компресира данни. По подразбиране за компресия продължава да се използва gzip, осигуряващ максимална съвместимост.
Flatpak опростява разпространението на програми, които не са включени в стандартните репозитории на дистрибуциите, чрез подготовката на един универсален контейнер, който освобождава разработчиците от необходимостта да създават отделни сборки за всяка дистрибуция. За потребителите, които се интересуват от сигурността, Flatpak предлага възможност за изпълнение на съмнителни приложения в контейнер, предоставяйки селективен достъп само до необходимите мрежови функции и файлове на потребителя. За потребителите, които искат да бъдат в крак с новостите, Flatpak позволява инсталирането на най-новите тестови и стабилни версии на приложения без необходимост от промени в системата. Например, Flatpak пакети са налични за LibreOffice, GIMP, Inkscape, Kdenlive, Steam, 0 A.D., Visual Studio Code, VLC, Slack, Telegram Desktop, Android Studio и др.
За намаляване на размера на пакета се включват само специфичните за приложението зависимости. Основните системни и графични библиотеки (GTK, Qt, библиотеки GNOME и KDE и т.н.) се предоставят под формата на добавяеми стандартни runtime среди. Ключовата разлика между Flatpak и Snap е, че Snap използва компоненти от основната система и изолация, основана на филтриране на системни повици, докато Flatpak създава контейнер, отделен от системата, и оперира с големи набори от runtime, предоставяйки като зависимости не пакети, а стандартни системни среди (например, всички библиотеки, необходими за работата на програми GNOME или KDE).
В допълнение към стандартната системна среда (runtime), която се инсталира чрез специален репозиторий, се предоставят допълнителни зависимости (bundle), необходими за работата на приложението. В сумата "runtime" и "bundle" образуват съдържанието на контейнера, като "runtime" се инсталира отделно и се свързва с няколко контейнера, което позволява избягването на дублиране на общи системни файлове за контейнерите.
В една система могат да бъдат инсталирани различни „runtime“ (GNOME, KDE) или няколко версии на едно и също „runtime“ (GNOME 50, GNOME 49). Контейнерът с приложението като зависимост използва само определено „runtime“, без да взема предвид отделните пакети, които формират избраното „runtime“. Всички липсващи елементи се опаковат директно заедно с приложението. При създаване на контейнера съдържанието на „runtime“ се монтира като дял /usr, а „bundle“ се монтира в директорията /app.
Начинът на изграждане на „runtime“ и контейнерите на приложенията се реализира с помощта на технологията OSTree, при която образът се обновява атомарно от Git-подобно хранилище, позволяващо прилагане на методи за контрол на версиите на компонентите на дистрибуцията (например, бързо връщане на системата в предишно състояние). RPM пакетите се трансформират в репозиторий OSTree с помощта на прослойка rpm-ostree.
Изборното инсталиране и обновление на пакети в работната среда не се поддържа — системата се обновява не на ниво отделни компоненти, а изцяло, атомарно променяйки своето състояние. Предоставят се средства за инкрементално прилагане на обновления, които освобождават от необходимостта от пълна замяна на образа при всяко обновление.
Създадената изолирана среда не зависи от използвания дистрибутив и при правилна настройка на пакета няма достъп до файловете и процесите на потребителя или основната система, както и не може да се обръща директно към оборудването, с изключение на извеждане през DRI. Изходът на графиката и организацията на входа се реализират чрез протокола Wayland или чрез пренасочване на сокет X11. Взаимодействието с външната среда е построено чрез системата за обмен на съобщения DBus и специален API Portals.
За изолация се използва прослойка Bubblewrap и традиционни за Linux технологии на контейнерна виртуализация, основани на използването на cgroups, пространствата на имена (namespaces), Seccomp и SELinux. При създаване на пакета изолацията може да бъде деактивирана, което разработчиците на някои пакети използват, за да получат пълен достъп до файловата система и всички устройства в системата.
Източник: opennet.ru
