Zadnje čase sem se veliko ukvarjal z nix upravljalnikom paketov in Linux operacijskim sistemom NixOS, ki je nastal okoli njega. Celoten Nix projekt mi je kmalu postal zelo zanimiv in uporaben, morda celo revolucionaren, tako da ga bom v tem članku poskušal predstaviti ter bralca vsaj malo navdušiti nad njim. Ker je Nix več stvari hkrati, jih bom ločil na sledeč način: nix je upravljalnik paketov, “Nix” je upravljalnik paketov in programski jezik, kot tudi sam način pristopa k distribuciji programske opreme, “NixOS” pa je operacijski sistem (ponekod se bom zapletel, scuzzi).

Torej: nix je upravljalnik paketov (ang. package manager) za Linux, Windows in macOS (Darwin) operacijske sisteme. Njegova naloga je torej nameščanje, odstranjevanje ipd. programske opreme na naš računalnik. Microsoft s tem konceptom žal seznanja svoje uporabnike manj kot ostali, je pa vseeno do neke mere mogoče nameščati programe z upravljalnikom paketov tudi v Windowsih. Sicer nix v svoji vlogi gotovo ni unikaten — morda poznate bolj konvencionalni Debianov apt, ali pa Fedorin npm Archev pacman. Tehničnih razlik med nix-om in omenjenimi je kar nekaj, najbolj očitna je, da so paketi nameščeni popolnoma ločeno drug od drugega, v posameznih mapah direktorija /nix/store.

S tem odstopa od ustaljene Linux prakse, kjer so paketi ob namestitvi sortirani po sistemu glede na funkcije določenih komponent. Z nix-ovo strogo segregacijo lahko recimo brez problemov nameščamo več različic istega programa, kot tudi odstranjujemo programe brez skrbi, da bi s tem “poškodovali” preostanek sistema. pacman recimo tega ne dopušča, saj vsaka nova namestitev prepiše prejšnjo, če pa kaj odstranimo, lahko programi, ki so se zanašali na odstranjenega, trpijo. Ta ločitev med namestitvami je še posebej dobra za razvijalce, ki bi radi namestili različno konfiguriran program večkrat – nič od tega ne predstavlja problema za nix. Tudi navadni uporabniki, ki le želijo še naprej uporabljati starejšo različico nekega programa, imajo lahko dosti koristi od tega pristopa. nix v praksi vsak paket identificira s konvencionalnim imenom, iz vsebine pridobljeno (praktično) unikatno šifro in številko različice. Tako se recimo popularni program lupine bash različice 5.2.15 namesti v mapo /nix/store/1is51ksrrsh5z2zbaccn5rv17lgzgf2c-bash-5.2-p15, kjer so na voljo vse zadeve, ki bi se sicer namestile direktno na /.

Sam sem sicer v glavnem Arch Linux uporabnik, tako da sem zelo razvajen s selekcijo programja na uporabniškem repozitoriju AUR, kjer ima človek na voljo praktično vse pod soncem. Potem pa sem videl spodnji graf, ki prikazuje število “svežih” (nedavno posodobljenih) paketov v danem repozitorju v odvisnosti od števila paketov v tem repozitoriju.

Prikaz *nix repozitorijev različnih distribucij glede na število svežih in vseh paketov.

Nixovi repozitoriji se imenujejo nixpkgs, narisane so različne veje. Očitno ima nix celo več kot vse pod soncem! Ima tudi več svežih (sodobnejših) paketov. Poleg tega ima projekt že dvajset let zgodovine. Ob prehodu me torej ni čisto nič skrbelo, da ne bi našel vsega, kar sem uporabljal prej. Radovednim priporočam, da si ogledajo selekcijo programja tu.

Omembe vredno je, da je Nix tudi programski jezik, ki ga nix implementira za svoje delovanje (ta je sicer napisan v C++-u). Človek se ob delovanju z nix-om kar hitro sreča z njegovim programskim jezikom — mi se bomo že v naslednjem odstavku.

nix kot upravljalnik paketov lahko dejansko deluje popolnoma samostojno in enako na vseh omenjenih operacijskih sistemih – so pa ti paketi načeloma bolj uporabniške narave in ne vsebujejo ključnih komponent operacijskega sistema. Že to je ogromno, saj ima Nix še enega asa v rokavu: prepusti nam določiti konfiguracije naših paketov deklarativno in reproducibilno, tj. tako, da koda določa konfiguracijo naše namestitve, ki (načeloma) izgleda enako ne glede na to, kje ali kdaj jo izvedemo. To je glede na njegov modularen način delovanja skoraj samoumevno. Praktične implikacije niso koristne le za programerje, temveč pravzaprav za vse uporabnike, ki bi radi svoj sistem pripravili tako, da ga lahko potem prenašajo okoli, na recimo druge računalnike.

Čisto konkretno lahko tako že vnaprej določimo sistemski font, kateri programi se bodo zagnali ob prižigu računalnika, vse nastavitve v Firefoxu in celo gesla za prijavo v različne aplikacije. nix je vsega tega seveda zmožen, saj je modularno pakiranje programov zanj že mačji kašelj – zakaj torej ne bi pakiral še ostalih komponent našega sistema. En izmed nix-ovih modulov, imenovan home-manager, se ukvarja recimo s konfiguracijo okolja posameznih uporabnikov, torej vse pod /home/uporabnik. Da na hitro demonstriram njegovo moč, si oglejmo, kako preprosto je namestiti program git

home-manager.users.uporabnik.programs.git = {
  enable = true;
  userName = "uporabnik";
  userEmail = "uporabnik@example.com";
};

Tu sem nastavil še ime in email naslov, da mi ga ne bo treba urejati ročno v terminalu, v enable = true; pa se skriva namestitev programa. Enako enostavno je tudi z ostalimi paketi – urejevalnik besedila emacs z nekaj uporabnimi dodatki namestimo s kodo

home-manager.users.uporabnik.programs.emacs = {
  enable = true;
  extraPackages = epkgs: with epkgs; [
	gruvbox-theme 
	nix-mode
	auctex
	direnv
	rainbow-mode
  ];
};

Vse omenjeno in še več lahko postorimo v eni tekstovni datoteki, kamor dodajamo konfiguracije za različne programe. Ko v njej nekaj spremenimo ter želimo realizirati spremembe na dejanski sistem, moramo pognati le kratek ukaz in počakati nekaj sekund. Na ostalih distribucijah Linuxa je zadeva v osnovi bolj kompleksna: treba je poznati sintakso večih konfiguracijskih datotek in jih postaviti na prava mesta, tu pa je vse lepo abstrahirano v Nix jezik. Za radovedne je tu seznam vseh možnih opcij za home-manager.

NixOS je čudovit Linux operacijski sistem, ki je nastal po Nix filozofiji. Ta zapakira vse pakete z nix-om, kar pomeni, da lahko tudi sistem kot celoto upravljamo deklarativno in reproducibilno. To je še posebej fino za ljudi, ki več kot pogosteje nameščajo Linuxe – popolno zame, torej. Vsekakor je lepo imeti sfrizirano okolje, ki ga ni težko nositi naokoli ter namestiti kjerkoli. Kot home-manager ima ta tudi dokumentirane vse konfiguracijske možnosti, na search.nixos.org. Prav v tem je glavni čudež Nixa – vsa konfiguracija se dogaja v le eni datoteki, ki jo lahko prenašamo naokoli na druge računalnike in bo (izvzemši različno strojno opremo) imela enak rezultat. Obstajajo tudi mehanizmi za sledenje različicam programov, da imamo res eksaktno isto zadevo vsakič imenovani flakes (snežinke), ki se uporabljajo povsod, vendar delujejo z bolj naprednimi koncepti Nix jezika, tako da jih ne bom preveč omenjal (Nix flakes je novejši sistem sledenja, obstajajo tudi starejši). Za občutek praktičnih razlik od drugih Linux distribucij ter v nadaljnje raziskovanje priporočam branje te tabele, ki primerja NixOS z Ubuntujem.

Ena izmed zvenečih besed v svetu operacijskih sistemov je stabilnost. Stabilni sistemi so takšni, ki se le redko “polomijo” in se lahko zanašamo na njihovo neprekinjeno in pravilno delovanje še daleč v prihodnost. Najvišjo odliko na tem področju dobi kakšen Debian. Veliko mero stabilnosti lahlo operacijski sistem doseže tako, da je zelo previden s paketi oz. programi, ki jih pusti uporabnikom na razpolago. Tako recimo tipičen izvod Debiana vsebuje nekaj mesecev zastarelo programje, ki pa je bilo skrbno preizkušeno – bolj preizkušeno je, bolj je tudi stabilno. NixOS da uporabniku na izbiro svoj analog stabilnih izdaj, ki nastajajo na pol leta, uporabnik pa se lahko prav tako odloči za manj stabilen kanal, ki posodablja pakete bolj ažurno. Za razliko od Debiana ni nobenih resnih (“trdih”) migracij med izdajami sistema. Ker pa nix namešča programe ločeno, nas lahko nekompatibilnosti ob namestitvi različno starih različic ne skrbijo, tako da so tudi “delne nadgradnje” (ang. partial upgrades), ki so drugod pogosto odsvetovane, tu trivialne.

NixOS po svoji modularni naravi implementira še t. i. generacije celega sistema. Te se ustvarijo ob vsaki spremembi, ki jo naredimo v konfiguraciji in jo udejanjimo, tako da imamo v primeru kakšnih hujših kiksov ob zagonu vedno na voljo nekaj točk povratka. Posledično je povsem neproblematično zavrteti čas nazaj na trenutek, ko so stvari še delovale. Vse te lastnosti, ki so v Nix filozofiji inherentne, pripomorejo k zelo stabilnemu sistemu.

Za konec motivacije povem še osebno anekdoto o nameščanju NixOS-a na šifrirano particijo. S tem mislim namestitev operacijskega sistema na particijo trdega diska, ki je v mirovanju (ko je računalnik izklopljen) šifrirana ter mora biti ob vsakem zagonu dešifrirana, v mojem primeru z geslom. To je dobro za varnost podatkov na prenosnikih, ki nam jih zlahka kdo odtuji. Isto je standard tudi na Androidovih telefonih. Na Arch Linuxu je postopek (ponavadi) sledeč

  1. particijo šifriramo z ukazom cryptsetup luksFormat,
  2. šifrirano particijo formatiramo z mkfs.ext4,
  3. vstavimo vrstico v datoteko /etc/fstab,
  4. dodamo vrednost encrypt v datoteko /etc/mkinitcpio.conf,
  5. dodamo parameter cryptdevice v bootloader.

Nič od tega ni posebej problematično, moramo pa prebrati in razumeti to in to wiki stran. NixOS, po drugi strani, pa nas s to proceduro sploh ne mori, postopek je dejansko identičen kot za nešifrirane particije — preprosto ga namestimo na šifrirano particijo, on pa se zaveda, da jo bo moral ob zagonu dešifrirati. Ko sem se s tem prvič ukvarjal, sem pričakoval, da se bom moral prej izobraziti kako zadnje tri korake izvesti na Nix način. Nekaj časa sem brskal po forumih, kjer je nekdo predlagal, da preprosto poskusimo, saj bi moralo pač delati — in delalo tudi je. NixOS ima teh prijetnih presenečenj kar dosti, tako da ga bralcu toplo priporočam vsaj v pokušnjo ;)

Ima to čudo kakšne slabosti

Žal jih nekaj je, in niso zanemarljive. Ena je visok nivo težavnosti. Dokumentacija – za razliko od Arch Linuxa – pričakuje od bralca globoko domačnost s konvencijami Linux sistemov, kot tudi z Nix programskim jezikom. Takšnega nivoja zverziranosti ni za pričakovati od vsakega uporabnika. Nix in NixOS bi zato priporočal le tistim, ki se jim da malo več ukvarjati s svojim računalnikom (obstajajo projekti za “začetnike”, npr. distribucija SnowflakeOS). Pravzaprav je tudi za veterane težaven, saj se načini reševanja problemov od drugod ne prenesejo na NixOS – jih pa je dobro poznati, saj Nix gradi na njih s svojimi pristopi. Čisto spodaj navajam tudi nekaj dobre literature, ki mi je osebno prišla prav.

NixOS ne implementira standardne sistemske datotečne strukture (večina Linux distribucij implementira FHS), tako da je poleg navigacije tudi sestavljati pakete iz izvorne kode (ang. compile software from source) mukotrpno. Čeprav ni to od uporabnika skoraj nikoli pričakovano, in res je veliko paketov v uradnih repozitorijih za Nix, se kdaj zgodi, da paketa preprosto ni. V tem primeru lahko

  1. program uporabljamo v virtualki z nekim drugim operacijskim sistemom, ki spoštuje FHS,
  2. mrzlično iščemo in čakamo, da program nekdo zapakira za Nix,
  3. se naučimo Nix jezika in delo opravimo sami.

Obstajajo sicer tudi projekti kot nix-init, ki postopek pakiranja poskušajo avtomatizirati, ali pa Distrobox ki poenostavlja kreacijo virtualk in integracijo aplikacij v sistem, vendar vse to dodaja k kompleksnosti, ki je v drugih Linux distribucijah ni.

Poleg tega je lahko Nix štorast na zelo zanimive načine. Ima tudi nekaj svojevrstnosti, na katere se moramo pač navaditi.

Kako namestiti Nix

Samostojen upravljalnik paketov nix je na voljo za praktično vse operacijske sisteme, za pomoč pri namestitvi priporočam uraden vodič. Z dobljenim programom lahko eksperimentiramo in prosto nameščamo Nix pakete. Večino stvari bi moralo delati dobro, edino grafični programi znajo potrebovati več pozornosti. Poleg nameščanja programov lahko uporabljamo tudi nekatere Nix module, kot je recimo najbolj slaven že omenjen modul za deklarativno urejanje uporabniškega okolja home-manager, ki obstaja neodvisno od Linux distribucije, na kateri smo.

Z veseljem bi se razpisal o vseh načinih nameščanja nix-a in NixOS-a v različna okolja, vendar verjamem, da je na spletu že dovolj vodičev, bi pa priporočal nekaj uporabnih povezav, ki mi osebno pridejo prav praktično vsak dan

Začetnikom priporočam tudi sledečo videe in literaturo, sortirano po težavnosti