Appunti NixOS
Introduzione
NixOS è una distribuzione Linux basata sul gestore di pacchetti Nix che, a differenza dei tradizionali gestori di pacchetti, offre un approccio cosiddetto funzionale e dichiarativo. Nix permette infatti di creare ambienti isolati e indipendenti (installa i programmi in directory il cui nome viene generato univocamente tramite un hash crittografico) dove tutti i pacchetti e le rispettive dipendenze sono gestiti in modo sicuro e riproducibile. È anche possibile installare diverse versioni di un pacchetto senza che entrino in conflitto tra loro o con il sistema host.
Una delle caratteristiche principali di Nix e NixOS è la possibilità di effettuare rollback degli aggiornamenti. Questo significa che è possibile tornare a una versione precedente del sistema in caso di problemi o incompatibilità con le nuove versioni. Inoltre, grazie alla gestione dichiarativa dei pacchetti, è possibile condividere facilmente le configurazioni del sistema con altri utenti, rendendo semplice la collaborazione e la riproducibilità dell'ambiente.
Link utili
- Ricerca pacchetti
- Nix Cheatsheet (apt vs nix)
Gestione software
Cercare un pacchetto
nix-env -aqP | grep <package>
Si consiglia di configurare un alias su .profile del tipo alias nix-search='nix-env -qaP | grep'
Installare un pacchetto
nix-env --install <package>
Provare un pacchetto senza installarlo
nix-shell -p <package>
«Disinstallare» un pacchetto (in realtà rimuove solo il link)
nix-env --uninstall <package>
Eliminare le vecchie versioni dei pacchetti (compresi i pacchetti che non hanno più un link)
nix-collect-garbage -d
Verificare la lista dei ripository
nix-channel --list
Allineare NixOS dalla versione stabile di release a quella di test
nix-channel --add https://nixos.org/channels/nixpkgs-unstable nixos
Aggiornare la lista dei repository
nix-channel --update
Aggiornare tutti i pacchetti
nix-env --upgrade
Calcolare l'hash di un file
nix-prefetch-url url_del_file_da_scaricare/pacchetto.tgz
Ricompilare il sistema dopo aver modificato il file /etc/nixos/configuration.nix
nixos-rebuild switch
Server Cache
Per prima cosa occorrerà creare la coppia di chiavi di cifratura con
nix-store --generate-binary-cache-key hostname /root/nixos-cache.sec /root/nixos-cache.pub
Configurarne i permessi
chown root:root /root/nixos-cache.* chmod 600 /root/nixos-cache.*
- Su sistemi NON-NixOS installare nix-serve
nix-env -i nix-serve
Eseguire nix-serve mettendolo in ascolto sulla porta 8080
NIX_SECRET_KEY_FILE="/root/nixos-cache-key.sec" nix-serve -p 8080
- Su NixOS aggiungere al
/etc/nixos/configuration.nix
services.nix-serve = { enable = true; bindAddress = "0.0.0.0"; # Indirizzo IP su cui il servizio sar in ascolto port = 8080; # Porta su cui il servizio sar in ascolto secretKeyFile = "/root/nixos-cache.sec"; # Percorso del file della chiave segreta };
E ricompilare il sistema nixos-rebuild switch
Binary Cache
Lato client si può configurare Nix per usare la cache aggiungendo l'opzione extra-binary-caches
nix-env -i firefox --option extra-trusted-binary-caches http://local_ip_address:8080/
Oppure si può aggiungere la seguente riga al file /etc/nixos/configuration.nix
nix = { settings.substituters = [ "https://cache.nixos.org" "http://127.0.0.1:8080" ]; settings.trusted-public-keys = [ "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" "nix-serve:NCHdNCHdD5[..]yp1o0gWyp" # la nostra /root/nix-cache-key.pub ]; };
Su sistemi NON-NixOS, ma che utilizzano nix, per non dover specificare ogni volta l'opzione extra-trusted-binary-caches si può modificare il file /etx/nix/nix.conf
aggiungendo il nostro server ai substituters
substituters = http://127.0.0.1 https://cache.nixos.org/ trusted-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= nix-serve:NCHdNCHdD1[..]0gWyp
Derivation
Qualora si desideri installare un software non ancora supportato da Nix o si voglia modificare un pacchetto esistente sarà necessario editare o creare un apposito file .nix. Questo file andrà importato nel /etc/nixos/configuration.nix
in modo da poter essere compilato. Per esempio, se volessimo aggiungere il driver per permettere al sistema di leggere le nuove tessere sanitarie occorrerà installare il driver bit4id-xpki
Condivisione
È possibile creare un fork su github di NixOS/nixpkgs dove caricare la nostra derivation rispetto al ramo principale del progetto.
Driver NVIDIA
NixOS supporta nativamente i driver proprietari NVIDIA, basterà configurare nel seguente modo /etc/nixo/configuration.nix
nixpkgs.config.allowUnfree = true; services.xserver.videoDrivers = ["nvidia"];
Nel caso si necessiti di una versione diversa dall'ultima disponibile è possibile specificarla aggiungendo una di queste righe
hardware.nvidia.package = config.boot.kernelPackages.nvidia_x11_production; #Al momento la 525 hardware.nvidia.package = config.boot.kernelPackages.nvidia_x11_legacy470; hardware.nvidia.package = config.boot.kernelPackages.nvidia_x11_legacy390; hardware.nvidia.package = config.boot.kernelPackages.nvidia_x11_legacy340;
Polikit
Con l'ambiente Plasma troviamo attivo polkit che però chiede la password dell'utente per effettuare operazioni innocue come l'utilizzo del programma xsane anche se l'utente fa parte del gruppo scanner. Per ovviare a questo problema si può aggiungere quanto segue al file /etc/nixos/configuration.nix
security.polkit.extraConfig = polkit.addRule(function(action, subject) { if (subject.isInGroup("scanner")) { return polkit.Result.YES; } }); ;
Sudo
Per poter utilizzare il comando sudo
un utente deve far parte del gruppo 'wheel, però affinché possa eseguire il comando senza che il sistema chieda la password occorrerà effettuare questa modifica al /etc/nixos/configuration.nix
security.sudo.wheelNeedsPassword = false;
Dual Boot
Per la particolarità della sua architettura non è intuitivo configurare il dual boot tra NixOS ed un altro sistema Linux se si vuole mantenere come boot loader quello dell'altro sistema operativo. In questo caso occorrerà configurare NixOS per creare tutti i file di configurazione di grub, ma senza installarlo. Le seguenti righe per /etc/nixos/configuration.nix
generano la corretta configurazione.
boot.loader.grub.device = "/dev/sdw"; boot.loader.grub.enable = true; boot.loader.grub.version = 2;
NixOS proverà ad installare GRUB su /dev/sdw, che però non esiste e restituirà un errore che possiamo ignorare. Se invece non si specifica il grub.device la configurazione non va a buon fine, mentre se si utilizza il device principale sovrascriverà il boot loader dell'altra distribuzione.
Grub
Il file /etc/grub.d/40_custom
della distribuzione principale andrà modificato in modo che vada a leggere ed aggiungere NixOS con tutta la sua particolare configurazione dei rollback.
menuentry "NixOS" { insmod part_gpt insmod btrfs set root='hd2,gpt3' search --no-floppy --fs-uuid --set=root 5da82d4b-a3ad-4207-ac2a-135aaedf44ab configfile '/nixos/boot/grub/grub.cfg' }
In questo esempio NixOS è installato nel subvolume btrfs di nome nixos della terza partizione gtp del disco sdc.
ZFS
NixOS supporta nativamente ZFS, una volta creato il pool potremo gestirlo inserendo nel /etc/nixos/configuration.nix
le seguenti righe
boot.supportedFilesystems = [ "zfs" ]; boot.zfs.forceImportRoot = false; networking.hostId = "47645622"; boot.zfs.extraPools = [ "poolname" ];
L'hostID può essere generato col seguente comando
head -c4 /dev/urandom | od -A none -t x4
Se invece il pool è configurato per essere montato in modalità legacy occorrerà sostituire al parametro boot.zfs.extraPools
fileSystems."/mount/point" = { device = "pool/dataset"; fsType = "zfs"; };
Dato che l'ultima versione del kernel disponibile su NixOS potrebbe non essere compatibile con l'ultimo modulo per lo ZFS si consiglia di aggiungere questa riga al solito /etc/nixos/configuration.nix
boot.kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages;