Роль участников проекта GNU в развитии свободного программного обеспечения невозможно переоценить. Шелл по умолчанию в большинстве UNIX-подобных систем — GNU bash, GCC — все так же один из самых популярных компиляторов, а GNU Emacs — бессменный участник войн редакторов. При этом изначальной цели проекта — разработать свободную операционную систему — так до сих пор и не достигли.

Проект был ведущим поставщиком компонентов UNIX-подобных ОС, но большая часть новшеств в разработке дистрибутивов GNU/Linux появлялась в не связанных с GNU и FSF проектах, а их собственные дистрибутивы вроде gNewSense не представляли особого интереса. Чаще всего они были вариантами других дистрибутивов, очищенными от всего несвободного кода.

Многие участники проекта GNU, включая основателя проекта Ричарда Столлмана, также отличались любовью к языкам семейства лисп. Неудивительно, если вспомнить, что основатели проекта работали в лаборатории искусственного интеллекта в MIT вместе с разработчиками лисп-машин. При этом в самих операционных системах языки семейства лисп не занимали особого места со времен тех самых лисп-машин — их роль ограничивалась приложениями.

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

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

Тем не менее Guix появился не на пустом месте. Пакетный менеджер Guix основан на части кода Nix, расширяет его идеи и добавляет поддержку Scheme в качестве языка описаний пакетов и конфигураций.

 

NixOS — идейный предшественник Guix

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

Все популярные дистрибутивы используют отработанную еще в девяностых схему управления пакетами. У каждого пакета есть версия, в каждый момент в системе может быть только одна версия каждого пакета, обновление пакета требует обновления всех его зависимостей. Эта схема гораздо лучше тех, когда каждый пакет поставляется вместе со всеми зависимостями или когда все управление зависимостями остается на совести пользователя. Однако у нее есть существенные недостатки.

  • Иногда все же требуется держать в одной системе две разные версии одной программы, например для тестирования.
  • При обновлении дистрибутива может сложиться так, что один пакет требует новую версию зависимостей, а другой с ней конфликтует и пользователь вынужден выбирать, какой пакет оставить.
  • Обновление системы — необратимое действие.
  • Отключение питания во время обновления может разрушить всю систему.

Эти проблемы обычно решаются обходными путями — контейнерами, виртуальными окружениями, снимками файловой системы. Лучшие ли это решения из возможных? Есть ли способ разобраться с проблемой на уровне управления пакетами? Авторы Nix задались целью выяснить это экспериментально.

Все установленные пакеты Nix устанавливаются в отдельные каталоги с хешем пакета в имени вроде /nix/store/b6gvzjyb2pg0kjfwrjmg1vfhh54ad73z-firefox-33.1/. При этом в отличие от AppImage и подобного, где все зависимости хранятся вместе с приложением, одни пакеты Nix вполне могут служить зависимостями для других. Поскольку разные версии изолированы друг от друга, обновление одного пакета и его зависимостей никогда не сломает другие пакеты. Как в контейнерах, но с меньшим расходом места на диске за счет общих зависимостей.

Кроме того, обновление системы — атомарная операция. Если во время обновления выдернуть кабель питания, система после перезагрузки окажется в состоянии как до начала обновления. Более того, обновление можно откатить назад.

Что это — будущее управления пакетами или тупиковый путь? Говорить об этом пока рано. Сейчас контейнеры в моде и у Docker есть финансовая поддержка крупных компаний, в то время как исследования управления пакетами и разработка новых дистрибутивов держатся на голом энтузиазме.

 

Язык программирования Scheme

Scheme — язык из семейства Lisp. Это семейство весьма велико, и его языки объединяет, по сути, одно общее свойство — тождественность кода и данных, а значит, и неограниченно расширяемый синтаксис. Язык Clojure во многом построен именно на идеях Scheme, а не Common Lisp.

При этом сам Scheme оставался широко известным языком, но редко применялся на практике. Его использует культовая книга Structure and Interpretation of Computer Programs, но на нем не написано ни одной сколько-нибудь популярной программы. Некоторые программы поддерживают его в качестве скриптового (например, графический редактор GIMP поддерживает Scheme и Python). Но этим все и ограничивается.

Так что идея использовать Scheme как фундаментальную часть ОС выглядит весьма радикально, но авторы Guix решились. Давай посмотрим, что из этого вышло.

 

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

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

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

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

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

;; This is an operating system configuration generated
;; by the graphical installer.

(use-modules (gnu))
(use-service-modules desktop networking ssh xorg)

(operating-system
  (locale "en_US.utf8")
  (timezone "America/Anchorage")
  (keyboard-layout (keyboard-layout "us"))
  (host-name "guix")
  (users (cons* (user-account
                  (name "xakep")
                  (comment "Xakep")
                  (group "users")
                  (home-directory "/home/xakep")
                  (supplementary-groups
                    '("wheel" "netdev" "audio" "video")))
                %base-user-accounts))
  (packages
    (append
      (list (specification->package "nss-certs"))
      %base-packages))
  (services
    (append
      (list (service xfce-desktop-service-type)
            (service openssh-service-type)
            (set-xorg-configuration
              (xorg-configuration
                (keyboard-layout keyboard-layout))))
      %desktop-services))
  (bootloader
    (bootloader-configuration
      (bootloader grub-bootloader)
      (target "/dev/sda")
      (keyboard-layout keyboard-layout)))
  (swap-devices (list "/dev/sda2"))
  (file-systems
    (cons* (file-system
             (mount-point "/")
             (device
               (uuid "8f368be5-0dee-4bcc-b9d2-54c8f36a77ab"
                     'ext4))
             (type "ext4"))
           %base-file-systems)))

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

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


1 комментарий

  1. Аватар

    Владимир Тимофеев

    30.06.2020 в 06:12

    а не скучные обои то там есть?

Оставить мнение