Hlavní navigace

The GNU System s pomocí Guix

14. 1. 2015
Doba čtení: 10 minut

Sdílet

Projekt GNU je svět tak nějak sám pro sebe. Ale je nutno si přiznat, že ač téměř fanatický přístup RMS může někoho odrazovat, v mnoha směrech měl pravdu a jeho paranoia byla ještě malá. Ukazuje na to jak dění posledních let v oblasti bezpečnosti a ochrany soukromí, tak dění v linuxovém ekosystému.

Nejlépe to stále i po letech vystihuje princip katedrály a tržiště, kdy to v posledních letech vypadá, že z linuxového ekosystému stává spíše katedrála – pokud někdo tento princip ne zcela jasně chápe, stejně jako mají mnozí problém s chápáním „pivo zdarma nebo svoboda slova“, doporučuji prostudovat, je to minimálně velmi zajímavý fundamentální princip svobodného software.

V GNU se tedy zřejmě něco pohnulo a místo mlácení slov v nesmyslných diskusích prostě lidi v rámci tržiště začali pracovat na něčem jiném, co by mělo aspoň nějaký čas – tedy než to zahyne nebo to někdo zkusí překopat v katedrálu – zachovávat myšlenky GNU.

U Guixu je potřeba si ujasnit jednu věc, která není marketingově nejlepší, ale je typicky GNU – dosud neexistuje žádný oficiální GNU operační systém, který by se nedejGNU jmenoval Guix. Je to celé postavené tak, že Guix je nástroj, který slouží k distribuci GNU „produktů“, ze kterých se „shodou náhod“ dá sestavit celý GNU systém. Vzhledem k přetrvávajícím nepochopením tohoto principu širokou veřejností bude od příští verze obdařena distribuce OS založená pouze na Guixu jménem „Guixotic“ (zatím ve fázi schvalování) s přízviskem „GNU's reference distribution“. Návrh loga by měl být ve stylu Quixote – tedy Don Quijote [čti don kichot].

Guix není až tak původní myšlenka GNU a pochází z Nix OS, ovšem byla forknuta, a přesto, že upstream nějakým způsobem sleduje, jde si svou cestou. Nutno říci, že zatím to rozhodně není ve stavu, aby ho mohl používat každý, stále je označován přívlastkem „alfa“.

Podstatou Guixu jako funkcionálního správce balíků, je dosáhnout možnosti distribuovat svobodný software zároveň jako zdrojový kód i jako předkompilované balíky – každý si pak může vybrat. Důležité je, že zkompilovaný vlastní balík bude binárně identický se substitutem, což je velmi důležitý prvek kontroly obsahu binárního kódu vs. zdrojového kódu.

Kde získat The System

Všechno podstatné je popsáno v dokumentaci ke Guixu, která se vyvíjí zároveň s projektem, což je poměrně důležité. Dokumentace ovšem není zdaleka dokonalá, protože neobsahuje spoustu věcí, které jsou dlouholetým uživatelům GNU zcela jasné, pro ostatní ale velká neznámá.

V zásadě tedy:

# wget ftp://alpha.gnu.org/gnu/guix/gnu-usb-install-0.8-linux.x86_64.xz
# unxz gnu-usb-install-0.8-linux.x86_64.xz
# dd if=gnu-usb-install-0.8-linux.x86_64 of=/dev/sdX bs=512

Nyní nastartujte počítač z USB, jste automaticky přihlášení jako root a může začít ta správná ruční instalace. V podstatě si musíte napsat „kickstart“ soubor s konfigurací systému, ale to až dál, za ručičku vás tedy nikdo nepovede:

# dhclient eth0

Ujistěte se, jak se jmenuje vaše síťové zařízení z dmesg | grep eth, i sem již dorazila BIOS jména, což v zásadě není špatně, protože linuxové jádro již negarantuje pořadí detekce zařízení a moc jiných možností tak není.

Vytvořte třeba sda1 s třeba Linux ext4 fs a připojte třeba do /mnt:

# fdisk /dev/sda
# mkfs.ext4 /dev/sda1
# mount /dev/sda1 /mnt

Spusťte službu, která na cílovém disku založí /gnu/store, do kterého se pak nainstalují komponenty systému (v podstatě je to overlay pro /gnu/store z USB).

# deco start cow-store /mnt

Nyní zbývá vytvořit konfiguraci:

# cp /etc/configuration-template.scm /mnt/config.scm
# zile /mnt/config.scm

Tady je to již hodně na vás a vaší odvaze. Konfigurace systému je v podstatě kód ve scheme, kdy konfigurujete jednotlivé moduly systému. Výhoda je, že pokud si konfiguraci jednou vytvoříte k obrazu svému a nesmažete si ji, můžete ji recyklovat, doplňovat a pomocí ní buď instalovat další systémy nebo rekonfigurovat již nainstalované prostředí.

Základní úpravy (komentář se ve scheme dělá pomocí „;;“)

device "root"
na
device "/dev/sda1"

dále

(grub-configuration (device "/dev/sda"))

Uložit a ukončit (C-x C-c).

Instalace se provede příkazem

# guix system init /mnt/config.scm /mnt

Ta trvá jen několik minut, ve kterých se stahují data a instaluje Grub. Následně proveďte reboot. Teď teprve začíná legrace.

Jádro systému je Linux, ale Libre – jádro, které neobsahuje nesvobodné či sporné části, tedy především firmware pro různá zařízení. Můžete se tedy setkat s problémy s grafikou (tedy ještě jinými než obvykle, takže se připravte na VESA režim), síťovými kartami (především Wi-Fi, že) atd. Kdo má svobodný hardware, je v suchu, dokonce existuje návod k instalaci na gluglug x60, což je i osvobozený IBM X60 – trochu starší model, ale co už.

Jistě si všimnete i případné nefunkčnosti síťové karty, pokud to není chybějícím firmware, pak nejspíš pomůže něco jako

# dhclient eth0

Balíčkovací systém je zcela jiný. Celý systém v zásadě leží v /gnu/store  a zbytek je jen hromada symbolických odkazů.

Každý uživatel může mít svůj systémový profil, např. ten pro roota je v /root/.guix-profile/. V něm má svůj pohled na systém, který může být zcela odlišný od jiných uživatelů. Tohle je jedna ze základních odlišností Guixu. Každý uživatel si udržuje svůj vlastní OS, a to včetně instalací balíčků.

Výchozí způsob instalace balíčků je „build“ – tedy sestavení balíčku ze zdrojového kódu podle recipes, včetně jeho závislostí, pokud již v systému nejsou v příslušné verzi. To je druhý velký rozdíl – v systému může existovat několik verzí stejného balíku a aplikace může záviset na konkrétní verzi. Alternativou k instalaci ze zdrojových kódů je použití tzv. substitutes, předkompilovaných balíčků. K tomu ovšem musíte autorizovat zdroj:

# guix archive --authorize < /gnu/store/<long-hash>-guix-0.<somebuild>/share/guix/hydra.gnu.org.pub

Nainstalování balíčku se provede

# guix package -i <packagename>

Pokud nějaká závislost chybí v substitutech, pak se zkompiluje. Každý balík může mít nainstalovaný vlastní strom závislostí. Všechny balíky se pak umísťují do /gnu/store. Pozor ovšem na to, že balíky instaluje každý uživatel zvlášť, aby se stal součástí jeho profilu. Pokud už balík v systému je, pak se v podstatě neinstaluje, jen se nalinkuje do uživatelova profilu.

Pokud se instalace nezdaří, zůstane ve stromě i dost nepoužitých balíků. K jejich odstranění slouží garbage collector:

# guix package gc

Vyhledávání si každý zdatný již dohledá v nápovědě… tedy poté, co si doinstaluje info a man. GNU samozřejmě preferuje info. Pro začátek ale vystačíte s něčím jako:

# guix package --help

Abyste získali seznam svých nainstalovaných balíků, spusťte:

# guix package -A

Např. instalaci xorg lze provést pod uživatelem

# guix package -i xorg-server xf86-video-intel xf86-input-keyboard xf86-input-mouse

Je ovšem potřeba počítat s trochu jiným chováním. Např. Xorg -configure vypíše „Missing output drivers“. Proč? Je potřeba mu dodat správnou cestu do profilu:

# Xorg -modulepath  /root/.guix-profile/lib/xorg/modules/

Povedlo se zprovoznit Xorg? Můžete zkusit třeba ssh. K dispozici je i OpenSSH, ale GNU má vlastní implementaci zvanou lsh.

# guix package -i lsh

Tím jste ale jen napůl cesty, pro lsh je potřeba vygenerovat yarrow seed.

# mkdir -p /var/spool/lsh
# lsh-make-seed -o /var/spool/lsh/yarrow-seed-file
# lsh-keygen  > /etc/lsh_host_key
# /gnu/store/*-lsh-2.1/sbin/lshd --daemonic --root-login

Pokud nyní budete chtít udělat z lsh službu, musíte si napsat definiční soubor podle manuálu, což je trochu otravné a pro systémovou službu nevhodné. Takže si ukážeme, jak to udělat jinak.

Rekonfigurujeme systém

Nejjednodušší způsob, jak přidat systémové služby, je redefinovat konfiguraci celého systému a využít definic služeb, které jsou v Guixu už připravené.

# zile /config.scm

Odměnou těm, kdo dočetli až sem, budiž tento příklad konfiguračního souboru, který vám přidá start do Xorg (resp. slim login manager), automaticky start dhclienta a lsh (k funkci lsh je stále potřeba vygenerovat klíče – postup je v dokumentaci síťových služeb).

;; This is an operating system configuration template.

(use-modules (gnu)
             (gnu services ssh)
             (gnu services networking)
             (gnu services xorg)
             )

(operating-system
  (host-name "antelope")
  (timezone "Europe/Paris")
  (locale "en_US.UTF-8")

  ;; Assuming /dev/sdX is the target hard disk, and "root" is
  ;; the label of the target root file system.
  (bootloader (grub-configuration (device "/dev/sda")))
  (file-systems (cons (file-system
                        (device "/dev/sda1")
                        ;;(title 'label)
                        (mount-point "/")
                        (type "ext4"))
                      %base-file-systems))

  ;; This is where user accounts are specified.  The "root"
  ;; account is implicit, and is initially created with the
  ;; empty password.
  (users (list (user-account
                (name "covex")
                (comment "The User Covex")
                (group "users")

                ;; Adding the account to the "wheel" group
                ;; makes it a sudoer.
                (supplementary-groups '("wheel"))
                (home-directory "/home/covex"))))

  (packages (cons* (emacs) (xterm) (mc) (man-db) (info) (shadow) %base-packages))
  (services (cons* (slim-service)

;;                   (avahi-service)
;;                   (dbus-service (list avahi))

                   (lsh-service #:port-number 22 #:root-login? #t)
                   (dhcp-client-service)
                   %base-services))
)
# guix system reconfigure /config.scm

Aktuálně je vhodné systém restartovat, což není úplně ideální, pokud by člověk touto cestou chtěl běžně instalovat balíky nebo přidávat uživatele. Restart a vypnutí se zatím provádí příkazy reboot a halt.

O Guile a scheme…

Podstatou celého OS je jazyk Scheme – dialekt Lispu, což u někoho může navodit pocit, že je to něco z minulého století.

Init použitý v Guixu – dmd (daemon managing daemons) je ve Scheme, definice služeb je ve Scheme, konfigurační soubor OS je ve Scheme, samotný Guix je ve Scheme, stejně tak jako definice balíků.

Abyste aspoň jemně pochopili, co se vlastně píše v definičních souborech a jak jednoduché či složité Scheme je, dovolím si malý příklad, další tutoriály jistě každý nalezne sám.

Vše co se ve Scheme zapisuje, má formát:

(operantor operand1 operand2 ...)

připomíná to trochu kalkulačky s prefixovanou notací, „složitější“ příkaz pak vypadá zhruba takto

(+ 5 (* 2 4))

Další důležitý princip je definice… čehokoli

(define (sqrt x) (* x x))

Pak máme list

(list hodnota1 hodnota2 ...)

Skládáním těchto tří základních principů se vytvoří téměř vše, co je potřeba k pochopení základů Scheme a trochu lepšímu porozumění, proč konfigurace a definice balíků vypadají tak, jak vypadají.

Jazyk Scheme je interpretován pomocí Guile, je to tedy interpretovaný jazyk. Hlavní úlohou startu OS je tedy zavést Guile, zbytek startu OS je již interpretace kódu Scheme. Trochu záludné je např. zjištění běžících služeb:

# deco status dmd

Tedy dotaz na stav init démona ukáže přehled služeb

# deco detailed-status dmd

Ukáže detaily ke každé službě. Jinak ale dmd žádné velké záludnosti nepřináší.

Co se bude dít dál

Zatímco dmd se aktuálně příliš nevyvíjí, Guix se mění s každou verzí velmi výrazně. Nyní lze např. sestavit virtuál, který sdílí /gnu/store s hostem, nebo zcela samostatný obraz virtuálu z existující instalace. Připravuje se podpora populárních kontejnerů, ovšem založených na pflasku, uvažuje se nad způsobem, jak umožnit distribuované sestavování balíků tak, aby každý mohl nabídnout jím sestavené balíky jako substituty, což považuji za velmi zajímavou myšlenku, i když může být poněkud dvousečná. Na jednu stranu se tím je možné zbavit centrálního zdroje balíků a přiblížit se více distribuované distribuci, na druhou stranu to umožní relativně snadno infikovat balíky škodlivým kódem – i když by to mělo být snadno odhalitelné znovusestavením balíku, který by pak měl mít stejný kontrolní součet, nebo porovnáním zdrojových kódů jiných verzí.

Pro uživatele jiných OS – instalace Guixu ve VirtualBoxu

Stáhněte vydaný obraz pro USB, který je pouze hrubým obrazem disku i se zavaděčem Grub. Ten je potřeba pro VirtualBox zkonvertovat do VDI

"C:\Program Files\Oracle\VirtualBox\VBoxManage" convertfromraw gnu-usb-install-version-linux-i686 gnu.vdi --format vdi

Připojte jej jako SATA storage k novému virtuálnímu stroji a povolte v něm PAE, jinak start skončí pádem. Připojte druhý prázdný disk, na který budete instalovat a pokračujte od začátku článku.

Funguje To?

Ano i ne. V první řadě je nutno říct, že i autoři sami používají Guix spíš jako doplněk jiné distribuce. Lidí, kteří by používali čistě Guix system, je zatím poměrně málo. Co je nezvyklé, je princip instalace aplikací „per uživatel“. Vznikají tak nepříjemné problémy s tím, kdo má co nainstalované.

Další muška, kterou jsem zaznamenal, je např. to, že instalace některých komponent může do systému přitáhnout jako závislost i jiné jádro. Více jader v systému ale jaksi běžet nemůže, takže se v Grubu hromadí různá jádra (většinou ± stejná kolem nějaké verze) – je to trochu podivné. Marně byste hledali i podporu locales, takže česky si v Guixu ještě chvíli nic nenapíšete.

root_podpora

V podstatě nikdy se mi na instalaci Guixu z USB nepovedlo provést úspěšně guix pull, což je obdoba update/upgrade z jiných balíčkovacích systémů. Údajně to má opravovat novější verze Guixu – problém je způsoben tím, že distribuční obraz Guixu 0.8 byl sestavován Guixem 0.7 (problém slepice a vejce).

Základ tedy funguje. Jen ke každodenní použitelnosti to potřebuje ještě hodně (naší/vaší) práce.

Byl pro vás článek přínosný?