Установка GuixSD

Проект GNU Guix (произносится geeks) — это не производная другого дистрибутива, а независимый дистрибутив со своим менеджером пакетов и Scheme — языком семейства лисп — в качестве системного скриптового языка.

В качестве системы управления сервисами Guix использует не SysV init и не systemd, а GNU sheperd, который произошел из GNU/Hurd и также поддерживает Scheme в качестве языка описания сервисов.

РЕКОМЕНДУЕМ:
Лучшие дистрибутивы для программистов

В этой статье я покажу, как установить GuixSD на виртуальную машину, настроить, обновить систему и создать пакеты.

Установка и базовая настройка GuixSD

Установка в VirtualBox не представляет никакой сложности. При загрузке с ISO нас встречает вполне типичный псевдографический установщик — на этом этапе заметить отличия от других дистрибутивов сложно.

Установка GNU GuixSD

Если ты решишься попробовать на физическом железе, нужно учитывать, что разработчики Guix — члены FSF, а значит, в поставке по умолчанию отсутствуют все несвободные драйверы и прошивки.

Под конец установки пользователь начинает понимать, куда попал, — нам советуют искать базовые настройки в /etc/config.scm и показывают файл с выбранными при установке настройками.

Установка Guix

Этот файл — скрипт на языке Scheme и хранит указанные при установке настройки в виде S-выражений.

Главное преимущество языков семейства лисп — расширяемый синтаксис. В этом файле operating-system и прочее — не ключевые слова языка или формата файла, а всего лишь макросы Scheme.
Но пока мы оставим его в стороне и посмотрим на установку пакетов из репозиториев.

Установка и обновление пакетов

Менеджер пакетов, как и сам дистрибутив, называется guix. Иногда, чтобы отличать их, дистрибутив называют GuixSD (Guix System Distribution). В отличие от dpkg или rpm, guix отвечает и за установку пакетов, и за создание системных конфигов из абстрактных высокоуровневых описаний. Также там нет разделения на менеджер пакетов и инструмент работы с репозиториями, как dpkg/APT или rpm/yum.

Для начала мы посмотрим, как использовать его в качестве менеджера пакетов. Перед тем как что-то обновлять или устанавливать, нужно обновить метаданные репозиториев, подобно apt-get update в Debian.

Делается это командой guix pull. Описания пакетов хранятся в Git, и вместо традиционных подписей файлов с метаданными разработчики используют подписанные коммиты. Командой guix pull --news можно посмотреть сводку изменений со времени последнего обновления. Обновляет все пакеты команда guix package --upgrade.

Нужно сразу отметить, что в Guix возможна установка пакетов от имени обычных пользователей — в их личный профиль. Более того, метаданные репозиториев у каждого пользователя тоже свои.

Для примера поставим очень полезную программу — GNU hello.

Что значит updating substitutes? В терминологии Guix так называются собранные двоичные пакеты. «Основным» способом установки считается сборка пакетов из исходников, но для удобства и экономии ресурсов поддерживается и установка двоичных пакетов как «суррогат» локальной сборки. Несмотря на такое уничижительное название, никаких особых недостатков у двоичных пакетов нет, и оба метода установки равноправны. Guix фокусируется на воспроизводимости окружений сборки и исполняемых файлов, поэтому причин бояться локальной сборки тоже нет. С опцией --no-substitutes Guix игнорирует двоичные пакеты, даже если они доступны, и собирает пакет из исходников.

Исполняемый файл окажется в /home/xakep/.guix-profile/bin/hello. Эта установка пакета будет доступна только нашему пользователю xakep. Другие пользователи вполне могут держать другую версию в своем профиле, и обновление другим пользователем своего пакета никак не затронет наш. Даже у root’а есть свой профиль — установка от его имени еще не значит глобальную установку для всех.

Поиск пакетов организован непривычно и на первый взгляд крайне неудобно. Команда guix search ищет совпадения во всех полях описания пакетов и не предоставляет никаких фильтров. Поиск по guix search hello выдает изрядное количество совершенно не относящихся к делу результатов из-за совпадений в описаниях. На самом деле это не баг, просто следование философии UNIX иногда принимает причудливые формы. В качестве фильтра для результатов поиска авторы рекомендуют GNU recutils. Формат recfile — это текстовый формат для простых баз данных (его можно описать как YAML с однозначной грамматикой), а утилита recsel — инструмент для работы с ним. К примеру, командой guix search hello | recsel -p name,synopsis можно ограничить вывод полями с именем и коротким описанием, как это делают большинство других менеджеров пакетов. С опцией -e можно использовать для поиска регулярные выражения POSIX.

Подход, безусловно, гибкий, но крайне необычный. Мне хочется верить, что другие менеджеры пакетов добавят машиночитаемый вывод — и что Guix сделает свой поиск проще.

Просмотреть информацию об установленном пакете можно командой guix package -I.

Удалить пакет — командой guix package -r ( --remove).

Обновление системы и конфигурации

В Guix управление пакетами тесно связано с управлением конфигурацией. Каждое обновление системы с помощью guix package --upgrade создает новое «поколение» (generation) состояния системы.

Командой sudo guix system roll-back можно откатить систему к предыдущему состоянию, если с обновлением что-то пошло не так. Но и это еще не все: команда guix system switch-generation $number позволяет откатить ее к любому предыдущему состоянию, не только последнему.

Очевидно, держать большое количество снимков системы на диске накладно. Командой sudo guix delete-generations $num можно удалить состояние с указанным номером, а этой же командой без аргумента — все состояния, кроме текущего.
Полезно также помнить про команду sudo guix gc. Ей можно принудительно удалить все неиспользуемые данные, оставшиеся от прошлых поколений.

Теперь вернемся к файлу настроек /etc/config.scm. В нем хранятся все настройки системы, которыми управляет сам Guix, от имени хоста до списка включенных сервисов. В чем-то это похоже на rc.conf из систем BSD, но с куда более структурированным синтаксисом. Доступные опции описаны в руководстве.

Применить настройки после редактирования файла можно командой sudo guix system reconfigure /etc/config.scm. Эта команда создаст новое «поколение» состояния системы. Как и обновление пакетов, эти изменения можно откатить. Это существенно уменьшает потребность в инструментах вроде Ansible.

В то же время и возможностей управлять настройками вручную в Guix куда меньше. Традиционные команды вроде useradd оказываются бесполезными: guix system reconfigure приведет состояние системы в полное соответствие с файлом /etc/config.scm и удалит все, что ты создал руками.

Создание пакетов

Описания пакетов в Guix тоже пишутся с использованием макросов Scheme. Хорошее введение можно найти в посте A packaging tutorial for Guix. Мы не будем рассматривать создание дополнительных репозитариев и вместо этого воспользуемся возможностью установить пакет из локального файла с описанием.

Для примера возьмем генератор статических блогов blogc. Он не требует никаких зависимостей и использует стандартную процедуру ./configure && make && make install, что сильно упрощает дело.

Сначала нам нужно получить хеш пакета. Стандартная sha256sum выводит хеш в Base64, а Guix по каким-то причинам предпочитает Base32. К счастью, вычисление хешей в нужном формате — встроенная функция.

Теперь напишем файл описания пакета по аналогии с постом.

Осталось сохранить его в файл. Имя файла не имеет значения, вся информация хранится внутри. Назовем его blogc.scm и выполним guix package  --install-from-file=blogc.scm. Теперь команда blogc доступна текущему пользователю.

Просмотреть и даже поправить описание любого установленного пакета можно командой guix edit $packageName. Очень помогает в написании файлов по аналогии.

Заключение

Рекомендовать столь необычный и во многом экспериментальный дистрибутив для широкого применения явно рано, но и обойти стороной тоже невозможно.

Самый заметный недостаток — требования к месту на диске. Классические менеджеры пакетов создавались с целью сделать как можно больше библиотек и данных общими для всех пакетов и таким образом сэкономить место. Подход Nix и Guix уничтожает это преимущество. С другой стороны, он заметно уменьшает потребность в резервных копиях системы и отдельных решениях для установки программ от имени пользователя, так что это скорее компромисс, чем недостаток.

Более заметный минус — склонность Guix принудительно синхронизировать состояние системы с последними репозиториями, когда его об этом не просят. Во многих случаях редактирование настроек в /etc/config.scm и выполнение guix system reconfigure /etc/config.scm «заодно» производит обновление системы, если оно не совпадает с данными из последнего guix pull. Хочется верить, что авторы это исправят.

В официальных репозиториях почти 14 тысяч пакетов. Для независимого дистрибутива довольно внушительно, и все основное там есть, но с более популярными дистрибутивами не сравнить, особенно когда дело касается несвободного ПО — увы, порой без него сложно обойтись.

РЕКОМЕНДУЕМ:
Обзор дистрибутива Feren OS

Сложность ручного управления настройками для одних людей и сценариев применения — явный недостаток, а для других — огромное преимущество. Ну и Scheme как системный язык — это весьма смелое решение, хотя у пользователей куда более популярного Clojure с его изучением не будет никаких проблем.

В целом каждый в итоге решает сам, но посмотреть на новые идеи всегда интересно.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий