Differenze tra le versioni di "Appunti NixOS"

Da GolemWiki.
Jump to navigation Jump to search
 
(19 versioni intermedie di uno stesso utente non sono mostrate)
Riga 5: Riga 5:
  
 
= Link utili =
 
= Link utili =
* [https://nixos.org/nixos/packages.html Ricerca pacchetti]
+
* [https://search.nixos.org/packages Ricerca pacchetti]
 
* [https://nixos.wiki/wiki/Cheatsheet Nix Cheatsheet] (''apt'' vs ''nix'')
 
* [https://nixos.wiki/wiki/Cheatsheet Nix Cheatsheet] (''apt'' vs ''nix'')
 +
* [https://nixos.wiki Wiki Ufficiale]
 +
* [https://zero-to-nix.com Guida non ufficiale]
 +
* [https://nixos.org/manual/nixos/stable/index.html Manuale]
  
 
= Gestione software =
 
= Gestione software =
Riga 12: Riga 15:
 
  nix-env -aqP | grep <package>
 
  nix-env -aqP | grep <package>
  
Si consiglia di configurare un alias su ''.profile'' del tipo <code>alias nix-search='nix-env -qaP | grep' </code>
+
Si consiglia di configurare un alias su ''.zshrc'' o ''.bashrc'' del tipo <code>alias nix-search='nix-env -qaP | grep' </code>
  
 
Installare un pacchetto
 
Installare un pacchetto
 
  nix-env --install <package>
 
  nix-env --install <package>
 +
 +
Lista dei pacchetti installati
 +
nix-env -q
  
 
Provare un pacchetto senza installarlo
 
Provare un pacchetto senza installarlo
Riga 45: Riga 51:
  
 
== Server Cache ==
 
== Server Cache ==
Con nix è facile creare un proxy di cache per il software, sarà sufficiente installare '''nix-serve'''
+
Per prima cosa occorrerà creare la coppia di chiavi di cifratura con
  nix-env -i nix-serve
+
nix-store --generate-binary-cache-key '''hostname''' /root/nixos-cache.sec /root/nixos-cache.pub
Ed eseguirlo, in questo caso sarà messo in ascolto sulla porta 8080
+
 
  nix-store --generate-binary-cache-key nixos-cache.net nixos-cache-key.sec
+
Configurarne i permessi
nix-serve -p 8080
+
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 è preferibile agire modificando direttamente <code>/etc/nixos/configuration.nix</code>
+
* Su NixOS aggiungere al <code>/etc/nixos/configuration.nix</code>
 
  services.nix-serve = {
 
  services.nix-serve = {
      enable = true;
+
    enable = true;
      bindAddress = "";
+
    bindAddress = "0.0.0.0"; # Indirizzo IP su cui il servizio sar  in ascolto
      port = 8080;
+
    port = 8080; # Porta su cui il servizio sar  in ascolto
};
+
    secretKeyFile = "/root/nixos-cache.sec"; # Percorso del file della chiave segreta
 +
  };
  
E poi ricompilare il sistema con <code>nixos-rebuild switch</code>
+
E ricompilare il sistema <code>nixos-rebuild switch</code>
  
== Client Cache ==
+
== Binary Cache ==
 
Lato client si può configurare Nix per usare la cache aggiungendo l'opzione '''extra-binary-caches'''
 
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/
 
  nix-env -i firefox --option extra-trusted-binary-caches http://''local_ip_address'':8080/
  
 
Oppure si può aggiungere la seguente riga al file <code>/etc/nixos/configuration.nix</code>
 
Oppure si può aggiungere la seguente riga al file <code>/etc/nixos/configuration.nix</code>
  substituters = http://''local_ip_address'':8080/ https://cache.nixos.org/
+
  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 <code>/etx/nix/nix.conf</code> 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 ==
 
== Derivation ==
Riga 72: Riga 98:
 
=== Condivisione ===
 
=== Condivisione ===
 
È possibile creare un fork su github di [https://github.com/NixOS/nixpkgs NixOS/nixpkgs] dove caricare la nostra ''derivation'' rispetto al ramo principale del progetto.
 
È possibile creare un fork su github di [https://github.com/NixOS/nixpkgs NixOS/nixpkgs] dove caricare la nostra ''derivation'' rispetto al ramo principale del progetto.
 
  
 
= Driver NVIDIA =
 
= Driver NVIDIA =
Riga 81: Riga 106:
 
Nel caso si necessiti di una versione diversa dall'ultima disponibile è possibile specificarla aggiungendo una di queste righe
 
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_production; #Al momento la 525
   hardware.nvidia.package = config.boot.kernelPackages.nvidia_x11_legacy470
+
   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_legacy390;
   hardware.nvidia.package = config.boot.kernelPackages.nvidia_x11_legacy340
+
   hardware.nvidia.package = config.boot.kernelPackages.nvidia_x11_legacy340;
 
 
  
 
= Polikit =
 
= Polikit =
Riga 102: Riga 126:
 
   boot.loader.grub.device = "/dev/sdw";
 
   boot.loader.grub.device = "/dev/sdw";
 
   boot.loader.grub.enable = true;
 
   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.
 
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.
  
Riga 116: Riga 139:
 
  }
 
  }
  
In questo esempio NixOS è installato nel subvolume btrfs di nome nixos della terza partizione gtp del disco sdc.
+
In questo esempio NixOS è installato nel subvolume btrfs di nome nixos della terza partizione gtp (gpt3) del disco sdc (hd2).
  
 
= ZFS =
 
= ZFS =
Riga 136: Riga 159:
 
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 <code>/etc/nixos/configuration.nix</code>
 
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 <code>/etc/nixos/configuration.nix</code>
 
  boot.kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages;
 
  boot.kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages;
 +
 +
 +
= Server LAMP =
 +
[https://nixos.wiki/wiki/Nginx#LEMP_stack Nginx/MySQL/PHP] su <code>/etc/nixos/configuration.nix</code>
 +
 +
services.nginx = {
 +
  enable = true;
 +
  virtualHosts."blog.example.com" = {
 +
    enableACME = true;
 +
    forceSSL = true;
 +
    root = "/var/www/blog";
 +
    locations."~ \.php$".extraConfig = ''
 +
      fastcgi_pass  unix:${config.services.phpfpm.pools.mypool.socket};
 +
      fastcgi_index index.php;
 +
    '';
 +
  };
 +
};
 +
services.mysql = {
 +
  enable = true;
 +
  package = pkgs.mariadb;
 +
};
 +
services.phpfpm.pools.mypool = {                                                                                                                                                                                                           
 +
  user = "nobody";                                                                                                                                                                                                                         
 +
  settings = {                                                                                                                                                                                                                             
 +
    pm = "dynamic";           
 +
    "listen.owner" = config.services.nginx.user;                                                                                                                                                                                                             
 +
    "pm.max_children" = 5;                                                                                                                                                                                                                 
 +
    "pm.start_servers" = 2;                                                                                                                                                                                                                 
 +
    "pm.min_spare_servers" = 1;                                                                                                                                                                                                             
 +
    "pm.max_spare_servers" = 3;                                                                                                                                                                                                             
 +
    "pm.max_requests" = 500;                                                                                                                                                                                                               
 +
  };                                                                                                                                                                                                                                       
 +
};
 +
 +
 +
= Server FTP =
 +
Per abilitare l'ftp anonimo editare <code>/etc/nixos/configuration.nix</code>
 +
services.vsftpd = {
 +
    enable = true;
 +
    anonymousUser = true;
 +
    anonymousUserNoPassword = true;
 +
    #allowWriteableChroot = true;
 +
    #anonymousMkdirEnable = true;
 +
    #anonymousUploadEnable = true;
 +
    localUsers = true;
 +
    writeEnable = true;
 +
  };
 +
 +
= Virtualizzazione =
 +
Uno dei modi più nixos-like per gestire le macchine virtuali è attraverso il tool '''vagrant'''. Sul [https://app.vagrantup.com/boxes/search sito ufficiale] è possibile cercare la macchina virtuale che desideriamo scaricare.
 +
 +
Per scaricare l'immagine di Debian 12 basterà usare i seguenti comandi
 +
vagrant init potyarkin/debian12
 +
vagrant up --provider=libvirt
 +
 +
Per eseguire la macchina virtuale
 +
vagrant ssh
 +
 +
  
 
[[Category: Howto]]
 
[[Category: Howto]]

Versione attuale delle 14:59, 13 giu 2023

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

Gestione software

Cercare un pacchetto

nix-env -aqP | grep <package>

Si consiglia di configurare un alias su .zshrc o .bashrc del tipo alias nix-search='nix-env -qaP | grep'

Installare un pacchetto

nix-env --install <package>

Lista dei pacchetti installati

nix-env -q

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;
 

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 (gpt3) del disco sdc (hd2).

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;


Server LAMP

Nginx/MySQL/PHP su /etc/nixos/configuration.nix

services.nginx = {
 enable = true;
 virtualHosts."blog.example.com" = {
   enableACME = true;
   forceSSL = true;
   root = "/var/www/blog";
   locations."~ \.php$".extraConfig = 
     fastcgi_pass  unix:${config.services.phpfpm.pools.mypool.socket};
     fastcgi_index index.php;
   ;
 };
};
services.mysql = {
 enable = true;
 package = pkgs.mariadb;
};
services.phpfpm.pools.mypool = {                                                                                                                                                                                                             
 user = "nobody";                                                                                                                                                                                                                           
 settings = {                                                                                                                                                                                                                               
   pm = "dynamic";            
   "listen.owner" = config.services.nginx.user;                                                                                                                                                                                                              
   "pm.max_children" = 5;                                                                                                                                                                                                                   
   "pm.start_servers" = 2;                                                                                                                                                                                                                  
   "pm.min_spare_servers" = 1;                                                                                                                                                                                                              
   "pm.max_spare_servers" = 3;                                                                                                                                                                                                              
   "pm.max_requests" = 500;                                                                                                                                                                                                                 
 };                                                                                                                                                                                                                                         
};


Server FTP

Per abilitare l'ftp anonimo editare /etc/nixos/configuration.nix

services.vsftpd = {
   enable = true;
   anonymousUser = true;
   anonymousUserNoPassword = true;
   #allowWriteableChroot = true;
   #anonymousMkdirEnable = true;
   #anonymousUploadEnable = true;
   localUsers = true;
   writeEnable = true;
 };

Virtualizzazione

Uno dei modi più nixos-like per gestire le macchine virtuali è attraverso il tool vagrant. Sul sito ufficiale è possibile cercare la macchina virtuale che desideriamo scaricare.

Per scaricare l'immagine di Debian 12 basterà usare i seguenti comandi

vagrant init potyarkin/debian12
vagrant up --provider=libvirt

Per eseguire la macchina virtuale

vagrant ssh