Состоялся релиз пакетного менеджера GNU Guix 1.3 и построенного на его основе дистрибутива GNU/Linux. Для загрузки сформированы образы для установки на USB Flash (610 МБ) и использования в системах виртуализации (972 МБ). Поддерживается работа на архитектурах i686, x86_64, Power9, armv7 и aarch64.
Дистрибутив допускает установку как в качестве обособленной ОС в системах виртуализации, в контейнерах и на обычном оборудовании, так и запуск в уже установленных дистрибутивах GNU/Linux, выступая в роли платформы для развёртывания приложений. Пользователю предоставляются такие функции, как учёт зависимостей, повторяемые сборки, работа без root, откат на прошлые версии в случае проблем, управление конфигурацией, клонирование окружений (создание точной копии программного окружения на других компьютерах) и т.п.
Основные новшества:
- Реализована начальная поддержка архитектуры POWER9 (powerpc64le-linux).
- Предоставлена возможность использования декларативного режима развёртывания, при котором вместо серии команд “guix install” и “guix remove” запускается одна команда “guix package –manifest=manifest.scm” с определением в файле manifest.scm всех приложений, которые требуется установить. Для генерации манифеста на основе имеющегося профиля установки в команде “guix package” предложены опции “–export-manifest” и “–export-channels”.
- Добавлена опция трансформации пакетов “–with-latest”, полезная для тех, кто хочет иметь самые свежие версии программ, даже если для приложения ещё не сформирован готовый пакет для Guix. Также добавлена опция “–with-patch” для сборки серии пакетов c применением патча к одному или нескольким из них.
- В командах “guix” реализован вывод рекомендаций с предложением замен в случае опечатки или наличия альтернативных подкоманд. $ guix package –export-manifests guix package: error: export-manifests: unrecognized option hint: Did you mean ‘export-manifest’?
- В “guix refresh” добавлена поддержка загрузки обновлений с хостинга SourceForge, а также режим generic-html для получения обновления с домашней страницы проекта.
- Добавлена новая команда “guix import go” для рекурсивного импорта пакетов на языке Go с учётом зависимостей. В команде “guix import opam” реализована поддержка пакетов Coq. В “guix import crate” обеспечен учёт семантического версионирования в режиме рекурсивной загрузки. Удалена команда “guix import nix”.
- Проведена оптимизация установки предварительно собранных бинарных пакетов (substitute) и ускорена работа команды “guix system init”.
- В команду “guix environment” добавлена опция “–profile”.
- В guix-daemon добавлена опция “–discover” для обнаружения в локальной сети серверов, отдающих собранные бинарные пакеты (substitute), используя протоколы mDNS/DNS-SD. Для отправки анонсов с серверов в команду “guix publish” добавлена опция “–advertise”.
- Реализована возможность использования алгоритма Zstd для сжатия пакетов.
- В режиме “–verbosity=1” прекращён вывод загружаемых URL.
- Вместо подкоманд “disk-image” и “vm-image” предложена общая команда “guix system image”.
- В образе дистрибутива для виртуальных машин добавлена поддержка протокола SPICE.
- В установочный скрипт добавлен режим автоматической инсталляции.
- Добавлен сервис lvm-device-mapping для поддержки менеджера томов LVM (Linux Logical Volumne Manager).
- Добавлен режим “guix system image -t rock64-raw” для генерации образов дистрибутива для плат Rock64.
- В initrd по умолчанию включена поддержка bcachefs.
- В сервере печати CUPS по умолчанию включён сервис “brlaser” для поддержки принтеров Brother.
- Добавлены новые системные сервисы agate, cuirass-remote-worker, ipfs, keepalived, laminar, radicale, syncthing, transmission-daemon, wireguard, xorg-server.
- Обновлены версии программ в 3100 пакетах, добавлено 2009 новых пакетов. В том числе обновлены версии gcc 10.3.0, glibc 2.31, GNOME 3.34.5, gnupg 2.2.27, go 1.14.15, guile 3.0.5, icecat 78.10.0-guix0-preview1, icedtea 3.7.0, inkscape 1.0.2, julia 1.5.3, libreoffice 6.4.7.2, linux-libre 5.11.15, ocaml 4.11.1, octave 6.2.0, openjdk 14.0, python 3.8.2, racket 8.0, rust 1.51.0, r 4.0.4, sbcl 2.1.3, Xfce 4.16.0 и xorg-server 1.20.10.
- Устранена уязвимость CVE-2021-27851 в guix-daemon, позволяющая локальному пользователю поднять свои привилегии в системе. Проблема связана с тем, что во время выполнения команды “guix build” сборочный каталог оставался доступен всем на запись и пользователь мог создать жёсткую ссылку на файл, принадлежащий пользователю root и размещённый вне сборочного каталога, например, “/etc/shadow”. Если при сборке была указана опция
“–keep-failed” то в случае сбоя guix-daemon менял владельца для всего сборочного дерева на текущего пользователя, включая жёсткие ссылки.
Напомним, что пакетный менеджер GNU Guix основан на наработках проекта Nix и кроме типичных функций управления пакетами поддерживает такие возможности, как выполнение транзакционных обновлений, возможность отката обновлений, работа без получения привилегий суперпользователя, поддержка привязанных к отдельным пользователям профилей, возможность одновременной установки нескольких версий одной программы, средства уборки мусора (выявление и удаление неиспользуемых версий пакетов). Для определения сценариев сборки приложений и правил формирования пакетов предлагается использовать специализированный высокоуровневый предметно-ориентированный язык и компоненты Guile Scheme API, позволяющие выполнять все операции по управлению пакетами на функциональном языке программирования Scheme.
Поддерживается возможность использования пакетов, подготовленных для пакетного менеджера Nix и размещённых в репозитории Nixpkgs. Кроме операций с пакетами возможно создание сценариев для управления конфигурацией приложений. При сборке пакета автоматически загружаются и собираются все связанные с ним зависимости. Возможна как загрузка готовых бинарных пакетов из репозитория, так и сборка из исходных текстов со всеми зависимостями. Реализованы средства для поддержания версий установленных программ в актуальном состоянии через организацию установки обновлений из внешнего репозитория.
Сборочное окружение для пакетов формируется в виде контейнера, содержащего все необходимые для работы приложений компоненты, что позволяет сформировать набор пакетов, способный работать без оглядки на состав базового системного окружения дистрибутива, в котором Guix используется в качестве надстройки. Между пакетами Guix возможно определение зависимостей, при этом для поиска наличия уже установленных зависимостей используется сканирование хэшей-идентификаторов в директории установленных пакетов. Пакеты устанавливаются в отдельное дерево директорий или поддиректорию в каталоге пользователя, что позволяет обеспечить его параллельное сосуществование с другими пакетными менеджерами и обеспечить поддержку широкого спектра существующих дистрибутивов. Например, пакет устанавливается как /nix/store/452a5978f3b0b426064a2b64a0c6f41-firefox-88.0.0/, где “452a59…” является уникальным идентификатором пакета, используемым для контроля зависимостей.
Дистрибутив включает только свободные компоненты и поставляется с ядром GNU Linux-Libre, очищенным от несвободных элементов бинарных прошивок. Для сборки применяется GCC 9.3. В качестве системы инициализации используется сервисный менеджер GNU Shepherd (бывший dmd), развиваемый как альтернатива SysV-init с поддержкой зависимостей. Управляющий демон и утилиты Shepherd написаны на языке Guile (одна из реализаций языка Scheme), который также используется и для определения параметров запуска сервисов. Базовый образ поддерживает работу в консольном режиме, но для установки подготовлено 17243 готовых пакета, среди которых и компоненты графического стека на базе X.Org, оконные менеджеры dwm и ratpoison, рабочий стол Xfce, а также подборка графических приложений.