NixOS
Un sistema operativo che utilizza Nix# per la gestione dei pacchetti e della configurazione.
Alcuni link utili
una discussione che mostra come i moduli di configurazione siano estensibili. Alla luce di questo si capisce ad esempio come possa essere possibile definire la configurazione generica per dei siti (intesa come la configurazione di un virtual host + il setup dell’application server) e che poi la stessa possa essere estesa per ogni tipologia;
un esempio di gestione della configurazione di server utilizzando solo strumenti senza NixOps, utilizzando i soli strumenti di Nix. Interssante perché fa il giro a cosa vuol dire rendere effettiva una nuova configurazione su un host che utilizza NixOS;
lo stato di avanzamento dei canali per l’installazione;
come installare NixOS a partire da una qualsiasi altra distribuzione;
Configurazione in NixOS
Prende la forma di una serie di moduli che definiscono tre elementi principali:
la dichiarazione di proprietà di configurazione che hanno tipo ben definito e sono organizzate ad albero;
la valorizzazione di queste proprietà ad opera dell’utente;
la definizione di che configurazioni di base modificare e che pacchetti installare quando queste proprietà vengono valorizzate, attivandole.
Un breve esempio di configurazione
Il seguente esempio di configurazione di un fantomatico servizio foo
: è diviso in due parti di cui la prima è preparata da uno sviluppatore, mentre la seconda è compilata da un utente.
# file modules/foo.nix
{config, pkgs, lib, ...}:
cfg = config.services.foo;
let
in {
options.services.foo = {
enable = lib.mkEnableOption "Foo service";
port = mkOption {
description = ''
The port where the service is listening
'';
default = 9999;
type = lib.types.int;
};
};
config = lib.mkIf cfg.enable {
systemd.services.foo = {
description = "The foo service";
wantedBy = [ "multi-user.target" ];
script = ''
${pkgs.foo}/bin/foo -p ${cfg.port}
''
}
};
}
Come puoi vedere grazie alle qualità di Nix, il modulo definisce una piccola parte della configurazione e allo stesso tempo ha riferimenti a parte di essa. In particolare la riga in cui possiamo leggere lib.mkIf cfg.enable ...
si riferisce alla configurazione del sistema come definita dall’utente (di cui riporto un esempio più avanti) e nella riga successiva modifica la stessa aggiungendo un nuovo servizio.
La configurazione di base che l’utente può definire è quella che si può vedere qui (qui una versione ricercabile della stessa) o su ogni sistema NixOS eseguendo man configuration.nix
.
In Nix, il solo fatto di utilizzare un pacchetto nella definizione del servizio significa includerlo nella configurazione del sistema.
Ecco qui l’ultima parte della configurazione che è sostanzialmente il punto 2 della lista precedente:
# configuration.nix
{config, pkgs, lib, ...}: {
imports = [
# ...
./modules/foo.nix
];
# ...
services.foo = {
enable = true;
port = 2222;
};
# ...
}
Quindi questa configurazione installerà nel sistema il pacchetto software foo
e farà partire il servizio all’avvio del sistema sulla porta 2222.
Esempi più esaustivi di configurazione sono disponibili sul manuale.