NixOS

La storia di NixOS è abbastanza lunga, pure se al momento per me completamente ignota. Come presentazione lascio dei link presi da widipedia.

Nel 2003, Eelco Dolstra ha iniziato NixOS come un progetto di ricerca. Nel 2015, è stata fondata Stichting NixOS con lo scopo di supportare progetti come NixOS che implementano il modello di distribuzione puramente funzionale.

Andremo a farci una semplice - per quanto possibile - passeggiata cercando di installare NixOS in una macchina virtuale e configurarla per i nostri scopi, nel nostro caso una macchina per sviluppare con nodejs.

Installatione #

Potete scaricare NixOS in più modalita dalla pagina NixOS Download page. Sceglieremo la ISO della versione minima - corrispondente alle nostre naked - per poter customizzare la stessa secondo le nostre esigenze.

Effettuare il boot dalla iso nixos-minimal, se si desidera la lingua italiana: sudo loadkeys it. Se i caratteri sono troppo piccoli, potete lanciare il comando: setfont ter-v32n, se desiderate è possibile connettervi alla VM con ssh. Creare una password per l’utente nixos che di default non è presente, rilevate l’indirizzo con ip a e quindi da terminale, sulla macchina ospite, connettevi digitando: ssh nixos@192.168.61.100

A questo punto siamo pronti all’installazione ed abbiamo disponibile la possibilità di effettuare dei cut and past dei vari comandi di seguito riportati.

Partizionamento dei dischi per BIOS standard #

La prima cosa da fare è partizionare il disco, nixos non prevede un installer grafico.

1
2
3
parted /dev/sda -- mklabel msdos
parted /dev/sda -- mkpart primary 1MiB -8GiB
parted /dev/sda -- mkpart primary linux-swap -8GiB 100%

Formattazione per BIOS standard #

1
2
mkfs.ext4 -L nixos /dev/sda1
mkswap -L swap /dev/sda2

Installazione #

1
2
mount /dev/disk/by-label/nixos /mnt
swapon /dev/sda2

Creazione configurazione #

1
nixos-generate-config --root /mnt

Adattamento e customizzazione #

A questo punto andiamo a modificare la configurazione per stabilire servizi, programmi etc di cui vogliamo disporre. I commenti nel codice ci indicano la strada, ma volendo potete anche abbreviarla copiando la configurazione posta a fine articolo e salvarla configuration.nix in /mnt.

nano /mnt/etc/nixos/configuration.nix

Dovete impostare l’opzione boot.loader.grub.device per specificare in quale disco risiede il grub boot loader altrimenti NixOS non può avviarsi. Esempio: boot.loader.grub.device=/dev/sda

Installazione #

1
nixos-install

Alla fine dell’installazione verrà immessa la password di root.

All’avvio non spaventatevi se il vostro utente non entra, bisognerà creare la password dello stesso. Basta aprire un terminale di root e digitare: sudo password artisan per creare la password.

Visual studio code #

Installiamo visual studio code, dobbiamo in primo luogo abilitare i programi non free.

1
2
export NIXPKGS_ALLOW_UNFREE=1
nix-env -iA nixos.vscode

Nodejs #

Installiamo nodejs.

1
nix-env -iA nixos.nodejs

Proviamo l’ebbrezza di smanettare su eggs #

A questo punto scarichiamo eggs dalla repository con git e quindi anchiamo a provare a compilarlo.

1
2
3
git clone https://github.com/pieroproietti/penguins-eggs
cd penguins-eggs
./init

NB eggs, prima di installare i pacchetto npm, necessita che siano installati pure perrisbrewery e oclif.dev che vendono prelevati sempre dalle mie repo con il comando custom ./init.

Va tutto bene, però l’installarione dei pacchetti npm viene interrotta e genera errore in quanto mancano i pacchetti per la compilazione, le cosidette - in termini Debian - build-essential.

Qua la faccenda è complessa, risolveremo in una prossima puntata, ma in ogni modo, brevemente ci siamo costruiti una nostra stazione di lavoro di cui, in buona sostanza, tutto quel che ci serve è raccolto nel file di descrizione.

Conclusioni #

NixOS è interessante, perchè in ultima analisi permette un approccio semplice alla costruzione di una macchina di lavoro, è come dire nato per essere customizzato ed molto affidabile.

Mi piacerebbe però - se fosse possibile - miscelare i due sistemi Debian e NixOS, per non dover disimpare ed apprendere di nuovo.

La cosa - per adesso - non sò se sia fattibile.

Da quello che mi risulta è possibile installare facilmente nix in un sistema Debian o altre distribuzioni e, per quello che ho capito, non è un problema la coesistenza dei due package manager apt e nix un po’ come succede con flatpack. Tuttavia ignoro sino a che punto si possa spingere nella coesistenza degli stessi. In soldoni se, partendo da una Debian minimale, sul quale si installata nix sia poi possibile aggiungere nixos e far convivere i due sistemi. Per essere ancora più chiari, se partendo da una ristretta repository Debian dal quale installare i pacchetti deb indispensabili, sia poi possibile attingere ed installare tutto il resto via nix-env -iA nixos.xfce4 etc.

Ai poster l'ardua sentenza, mi sento di poter dire che il sistema è figo, pure se richiede l’ennesimo cambiamento di paradigma, memorizzazione di nuovi termini, comendi e sintassi, etc. Nulla in contrario in linea di massima, ma è evidente che anche in questo caso le “limitate” umane capacità meritino di essere prese in considerazione. Questo tuttavia non è un problema per un giovane che sta iniziando ma può esserlo per uno sviluppatore di una certa età come il sottoscritto e, forse è anche all’origine della scarsa diffusione di NixOS stesso, che in effetti è veramente una perla in termini di possibilità di modificare, tornare indietro, consolidare il lavoro fatto, etc.

/images/nixos-xfce-code

Esempio di configurazione #

Questo è un esempio della configurazione utilizzata, potete fare un cut e copy e sostituirlo al file /mnt/etc/nixos/configuration.nix creato con il comando nixos-generate-config –root /mnt per il vostro esperimento.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# Edit this configuration file to define what should be installed on
# your system. Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running ‘nixos-help’).

{ config, pkgs, ... }:

{
imports =
[ # Include the results of the hardware scan.
./hardware-configuration.nix
];

# Use the GRUB 2 boot loader.
boot.loader.grub.enable = true;
boot.loader.grub.version = 2;
# boot.loader.grub.efiSupport = true;
# boot.loader.grub.efiInstallAsRemovable = true;
# boot.loader.efi.efiSysMountPoint = "/boot/efi";
# Define on which hard drive you want to install Grub.
boot.loader.grub.device = "/dev/sda"; # or "nodev" for efi only

networking.hostName = "nixos"; # Define your hostname.
# networking.wireless.enable = true; # Enables wireless support via wpa_supplicant.

# Set your time zone.
time.timeZone = "Europe/Rome";

# The global useDHCP flag is deprecated, therefore explicitly set to false here.
# Per-interface useDHCP will be mandatory in the future, so this generated config
# replicates the default behaviour.
networking.useDHCP = false;
networking.interfaces.ens18.useDHCP = true;

# Configure network proxy if necessary
# networking.proxy.default = "http://user:password@proxy:port/";
# networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";

# Select internationalisation properties.
i18n.defaultLocale = "it_IT.UTF-8";
console = {
font = "Lat2-Terminus16";
keyMap = "it";
};

# Enable the X11 windowing system.
services.xserver = {
enable = true;
desktopManager = {
xterm.enable = false;
xfce.enable = true;
};
displayManager.defaultSession = "xfce";
};


# Configure keymap in X11
services.xserver.layout = "it";
services.xserver.xkbOptions = "eurosign:e";

# Enable CUPS to print documents.
# services.printing.enable = true;

# Enable sound.
# sound.enable = true;
# hardware.pulseaudio.enable = true;

# Enable touchpad support (enabled default in most desktopManager).
# services.xserver.libinput.enable = true;

# Define a user account. Don't forget to set a password with ‘passwd’.
users.users.artisan = {
isNormalUser = true;
extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user.
};

# List packages installed in system profile. To search, run:
# $ nix search wget
environment.systemPackages = with pkgs; [
nano # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default.
wget
firefox
git
];

# Some programs need SUID wrappers, can be configured further or are
# started in user sessions.
# programs.mtr.enable = true;
# programs.gnupg.agent = {
# enable = true;
# enableSSHSupport = true;
# };

# List services that you want to enable:

# spice-vdagent
services.spice-vdagentd.enable = true;

# Enable the OpenSSH daemon.
services.openssh.enable = true;

# Open ports in the firewall.
# networking.firewall.allowedTCPPorts = [ ... ];
# networking.firewall.allowedUDPPorts = [ ... ];
# Or disable the firewall altogether.
# networking.firewall.enable = false;

# This value determines the NixOS release from which the default
# settings for stateful data, like file locations and database versions
# on your system were taken. It‘s perfectly fine and recommended to leave
# this value at the release version of the first install of this system.
# Before changing this value read the documentation for this option
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
system.stateVersion = "21.05"; # Did you read the comment?

}