Le Lab 1 installe NixOS avec disko et une flake ensemble — tout est automatisé, du partitionnement à la configuration. Mais que fait la flake exactement ? Que fait disko ? Pour le comprendre, il faut les séparer. Ce lab installe NixOS dans une VM KVM en partitionnant manuellement avec fdisk et en utilisant une flake minimale qui ne contient qu’un seul input : nixpkgs. À la fin, vous obtenez le même résultat fonctionnel que le Lab 1, mais vous savez précisément ce que chaque pièce apporte.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Partitionner manuellement un disque en GPT avec
fdisk(ESP + root) - Générer la configuration matérielle avec
nixos-generate-config - Créer une flake minimale avec un seul input (
nixpkgs) — sans disko - Installer NixOS avec
nixos-install --flakeet comprendre ce que la flake verrouille - Comparer cette approche avec le Lab 1 pour choisir quand utiliser disko
Dans quel contexte ?
Section intitulée « Dans quel contexte ? »Ce lab répond à des situations concrètes :
- Vous avez suivi le Lab 1, mais vous ne savez pas ce que disko fait exactement par rapport à la flake
- Vous préférez contrôler le partitionnement vous-même, comme sur une installation Arch ou Debian
- Vous voulez comprendre le socle minimal d’une installation NixOS : un fichier
flake.nix, un fichierconfiguration.nix, et c’est tout - Vous envisagez de provisionner des machines où disko n’est pas souhaité (serveurs existants, partitionnement spécifique)
Différence avec le Lab 1
Section intitulée « Différence avec le Lab 1 »| Aspect | Lab 1 (flake + disko) | Lab 2 (flake seule) |
|---|---|---|
| Partitionnement | Déclaratif (disko-config.nix) | Manuel (fdisk + mkfs) |
| Inputs de la flake | nixpkgs + disko | nixpkgs uniquement |
| Montage | Automatique (disko) | Manuel (mount) |
hardware-configuration.nix | Non utilisé (disko gère tout) | Généré par nixos-generate-config |
| Reproductibilité du disque | Totale (relancer disko suffit) | Manuelle (refaire fdisk) |
| Complexité | Plus de fichiers, mais tout automatisé | Moins de fichiers, mais gestes manuels |
L’objectif n’est pas de dire qu’une méthode est meilleure que l’autre. C’est de comprendre le rôle de chacune avant de décider quoi automatiser.
Prérequis
Section intitulée « Prérequis »- Le Lab 1 terminé (vous savez créer une VM KVM et booter sur l’ISO NixOS)
- KVM/QEMU et libvirt opérationnels sur l’hôte
- L’ISO NixOS 25.11 minimale téléchargée
- Une clé SSH existante sur l’hôte
- Familiarité avec les flakes Nix (structure inputs/outputs)
Lab 2 — Installer NixOS avec une flake minimale
Section intitulée « Lab 2 — Installer NixOS avec une flake minimale »Créer la VM
Section intitulée « Créer la VM »Réutilisez l’ISO du Lab 1. Créez un nouveau disque et une nouvelle VM :
# Créer le disque virtuelqemu-img create -f qcow2 ~/lab-nixos/images/nixos-lab2.qcow2 20G
# Créer la VMvirt-install \ --name nixos-lab2 \ --ram 8192 \ --vcpus 4 \ --disk path=$HOME/lab-nixos/images/nixos-lab2.qcow2,format=qcow2,bus=virtio \ --cdrom $HOME/lab-nixos/images/latest-nixos-minimal-x86_64-linux.iso \ --os-variant nixos-unstable \ --network network=default,model=virtio \ --graphics vnc,listen=127.0.0.1 \ --boot loader=/usr/share/OVMF/OVMF_CODE_4M.fd,loader.readonly=yes,loader.type=pflash,loader.secure=no \ --noautoconsolePréparer l’accès SSH à l’installateur
Section intitulée « Préparer l’accès SSH à l’installateur »L’ISO NixOS 25.11 démarre avec un utilisateur nixos connecté automatiquement sur la console. SSH est actif, mais il faut définir un mot de passe pour se connecter :
# Attendre ~40 secondes que l'ISO boot, puis définir le mot de passe# La commande passwd est destinée à l'utilisateur nixos (connecté sur la console)virsh send-key nixos-lab2 KEY_P KEY_A KEY_S KEY_S KEY_W KEY_D KEY_ENTERsleep 3# Taper le mot de passe "nixos" (deux fois)for key in KEY_N KEY_I KEY_X KEY_O KEY_S; do virsh send-key nixos-lab2 $key; sleep 0.3donevirsh send-key nixos-lab2 KEY_ENTERsleep 1for key in KEY_N KEY_I KEY_X KEY_O KEY_S; do virsh send-key nixos-lab2 $key; sleep 0.3donevirsh send-key nixos-lab2 KEY_ENTERRécupérez l’IP et connectez-vous en tant que nixos, puis basculez en root :
virsh domifaddr nixos-lab2sshpass -p 'nixos' ssh -o StrictHostKeyChecking=no nixos@192.168.122.xUne fois connecté, passez en root pour les opérations d’installation :
sudo -iPartitionner manuellement avec fdisk
Section intitulée « Partitionner manuellement avec fdisk »C’est la différence principale avec le Lab 1 : pas de disko-config.nix, tout se fait à la main.
Créez une table GPT avec deux partitions :
- Partition 1 : ESP (EFI System Partition) de 512 Mo
- Partition 2 : racine ext4 occupant le reste du disque
fdisk /dev/vdaDans fdisk, tapez les commandes suivantes :
g ← créer une nouvelle table GPTn ← nouvelle partition1 ← numéro 1[Entrée] ← secteur de début par défaut+512M ← taille 512 Mot ← changer le type1 ← type EFI Systemn ← nouvelle partition2 ← numéro 2[Entrée] ← secteur de début par défaut[Entrée] ← tout l'espace restantw ← écrire et quitterVérification :
lsblk -o NAME,FSTYPE,SIZE /dev/vda# NAME FSTYPE SIZE# vda 20G# ├─vda1 512M# └─vda2 19.5GFormater les partitions
Section intitulée « Formater les partitions »mkfs.fat -F32 -n BOOT /dev/vda1mkfs.ext4 -L nixos /dev/vda2Le label -n BOOT et -L nixos facilitent l’identification, mais NixOS utilise les UUID (via hardware-configuration.nix) pour monter les partitions — ce qui est plus fiable.
Monter les partitions
Section intitulée « Monter les partitions »mount /dev/vda2 /mntmkdir -p /mnt/bootmount /dev/vda1 /mnt/bootVérification :
lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT /dev/vda# NAME FSTYPE SIZE MOUNTPOINT# vda 20G# ├─vda1 vfat 512M /mnt/boot# └─vda2 ext4 19.5G /mntGénérer la configuration matérielle
Section intitulée « Générer la configuration matérielle »nixos-generate-config inspecte le matériel et crée deux fichiers :
nixos-generate-config --root /mntRésultat :
/mnt/etc/nixos/hardware-configuration.nix— modules noyau, UUID des partitions, type de système de fichiers/mnt/etc/nixos/configuration.nix— squelette de configuration NixOS (commenté)
Vérifiez le contenu généré :
cat /mnt/etc/nixos/hardware-configuration.nixVous devez voir :
imports = [ qemu-guest.nix ]— charge les modules virtiofileSystems."/"avec l’UUID de votre partition ext4fileSystems."/boot"avec l’UUID de votre partition FAT32
Personnaliser configuration.nix
Section intitulée « Personnaliser configuration.nix »Remplacez le configuration.nix généré par une version fonctionnelle. La différence avec le Lab 1 : ce fichier importe hardware-configuration.nix au lieu d’un module disko.
{ config, lib, pkgs, ... }:{ imports = [ ./hardware-configuration.nix ];
# Bootloader UEFI boot.loader.systemd-boot.enable = true; boot.loader.efi.canTouchEfiVariables = true;
# Réseau networking.hostName = "nixos-lab2"; networking.networkmanager.enable = true;
# Locale et timezone time.timeZone = "Europe/Paris"; i18n.defaultLocale = "fr_FR.UTF-8"; console.keyMap = "fr";
# SSH sécurisé services.openssh = { enable = true; settings = { PermitRootLogin = "prohibit-password"; PasswordAuthentication = false; }; };
# Utilisateur lab avec accès SSH par clé users.users.lab = { isNormalUser = true; extraGroups = [ "wheel" ]; openssh.authorizedKeys.keys = [ "ssh-ed25519 AAAA... votre-cle-publique" ]; };
# Sudo sans mot de passe (VM de test) security.sudo.wheelNeedsPassword = false;
# Paquets de base environment.systemPackages = with pkgs; [ vim git htop curl tmux ];
# Activer flakes et nix-command nix.settings.experimental-features = [ "nix-command" "flakes" ];
# Garbage collection automatique nix.gc = { automatic = true; dates = "weekly"; options = "--delete-older-than 30d"; };
system.stateVersion = "25.11";}Créer la flake minimale
Section intitulée « Créer la flake minimale »C’est le cœur de ce lab : une flake avec un seul input (nixpkgs), sans disko.
{ description = "NixOS Lab 2 — Flake minimale sans disko";
inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11"; };
outputs = { self, nixpkgs }: { nixosConfigurations.nixos-lab2 = nixpkgs.lib.nixosSystem { system = "x86_64-linux"; modules = [ ./configuration.nix ]; }; };}Comparée au Lab 1, cette flake est plus simple :
- Un seul input :
nixpkgs(pas dedisko) - Un seul module :
./configuration.nix(qui importe lui-mêmehardware-configuration.nix) - Pas de
disko.nixosModules.diskoni de./disko-config.nix
Le rôle de la flake reste le même : verrouiller la version de nixpkgs dans flake.lock pour garantir la reproductibilité.
Initialiser Git et verrouiller les dépendances
Section intitulée « Initialiser Git et verrouiller les dépendances »Les flakes exigent un dépôt Git. Sans lui, nix flake lock échoue :
cd /mnt/etc/nixosgit initgit config user.email "lab@nixos-lab2"git config user.name "lab"git add .git commit -m "initial nixos config with minimal flake"Verrouillez les dépendances :
nix flake lockCommittez le fichier de verrouillage :
git add flake.lockgit commit -m "add flake.lock"Vérifiez la flake :
nix flake metadataVous devez voir un seul input (nixpkgs) avec un commit et un hash précis.
Installer NixOS
Section intitulée « Installer NixOS »nixos-install --flake /mnt/etc/nixos#nixos-lab2 --no-root-passwdL’installation :
- Évalue la configuration NixOS à partir de la flake
- Télécharge les paquets depuis le cache binaire (~2,5 Go)
- Construit le système complet
- Installe le bootloader systemd-boot sur la partition ESP
Le message “installation finished!” confirme le succès.
--no-root-passwd est utilisé car notre configuration n’autorise que l’accès SSH par clé.
Préparer le premier démarrage
Section intitulée « Préparer le premier démarrage »Avant de redémarrer, retirez l’ISO :
# Sur l'hôte (pas dans la VM)virsh change-media nixos-lab2 sda --ejectvirsh reboot nixos-lab2Vérifier le système après installation
Section intitulée « Vérifier le système après installation »Attendez environ 40 secondes, puis connectez-vous par clé SSH :
# Supprimer l'ancienne clé hôte (a changé après installation)ssh-keygen -R 192.168.122.xssh lab@192.168.122.x-
Vérifier la version NixOS
Fenêtre de terminal nixos-version# 25.11.20260413.7e495b7 (Xantusia) -
Vérifier le hostname et le noyau
Fenêtre de terminal hostname && uname -r# nixos-lab2# 6.12.81 -
Vérifier le partitionnement
Fenêtre de terminal lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT /dev/vda# NAME FSTYPE SIZE MOUNTPOINT# vda 20G# ├─vda1 vfat 512M /boot# └─vda2 ext4 19.5G / -
Vérifier SSH et la sécurité
Fenêtre de terminal systemctl is-active sshd# activegrep -E "^(PermitRootLogin|PasswordAuthentication)" /etc/ssh/sshd_config# PasswordAuthentication no# PermitRootLogin prohibit-password -
Vérifier la configuration déclarative
/nix/store/...-nixos-system-nixos-lab2-25.11.20260413.7e495b7 readlink /run/current-system -
Vérifier la locale
Fenêtre de terminal echo $LANG# fr_FR.UTF-8 -
Vérifier que nixos-rebuild fonctionne
Fenêtre de terminal cd /etc/nixossudo nixos-rebuild switch --flake .#nixos-lab2Cette commande doit se terminer sans erreur. Elle confirme que la boucle de reconstruction fonctionne.
Comparaison avec le Lab 1
Section intitulée « Comparaison avec le Lab 1 »Maintenant que vous avez installé NixOS des deux façons, voici ce que chaque composant apporte :
Ce que la flake fait (dans les deux labs)
Section intitulée « Ce que la flake fait (dans les deux labs) »- Verrouille les versions :
flake.lockfige le commit exact de nixpkgs - Déclare les modules : liste les fichiers
.nixqui composent la configuration - Rend l’installation reproductible : deux personnes avec la même flake obtiennent le même système
Ce que disko fait (Lab 1 uniquement)
Section intitulée « Ce que disko fait (Lab 1 uniquement) »- Remplace fdisk/mkfs/mount : le partitionnement est décrit dans
disko-config.nix - Automatise tout le disque : une seule commande crée les partitions, formate et monte
- Élimine hardware-configuration.nix : disko génère directement les entrées
fileSystems
Quand utiliser l’une ou l’autre méthode
Section intitulée « Quand utiliser l’une ou l’autre méthode »| Situation | Méthode recommandée |
|---|---|
| VM de test ou lab | Flake + disko (Lab 1) — plus rapide |
| Serveur avec partitionnement spécifique | Flake seule (Lab 2) — plus de contrôle |
| Déploiement reproductible à grande échelle | Flake + disko + nixos-anywhere (Lab 4) |
| Apprentissage des fondamentaux | Flake seule (Lab 2) — comprendre chaque étape |
| Machine avec LUKS/LVM existant | Flake seule — adapter hardware-configuration.nix |
Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
fdisk ne voit pas /dev/vda | Driver virtio absent | Vérifier bus=virtio dans virt-install |
nix flake lock échoue | Pas de dépôt Git | git init && git add . && git commit |
nixos-install : « No space left on device » | RAM insuffisante | Passer la VM à 8 Go de RAM minimum |
| Boot : UEFI Shell au lieu de NixOS | Ordre de boot (CD avant HD) | virsh change-media ... --eject puis corriger le XML |
| SSH « Permission denied » sur l’ISO | Utilisateur nixos, pas root | Se connecter en tant que nixos, puis sudo -i |
nixos-generate-config : partitions non détectées | Partitions non montées sous /mnt | mount /dev/vda2 /mnt && mount /dev/vda1 /mnt/boot |
nix flake lock : « experimental feature disabled » | Flakes non activés sur l’ISO | Ajouter --extra-experimental-features 'nix-command flakes' |
À retenir
Section intitulée « À retenir »- La flake verrouille les versions, disko gère le disque — ce sont deux responsabilités distinctes
- Sans disko, le partitionnement est manuel (
fdisk+mkfs+mount) et le hardware est décrit parnixos-generate-config hardware-configuration.nixest généré automatiquement et contient les UUID des partitions et les modules noyau — ne le modifiez pas à la main- Une flake minimale ne contient qu’un seul input (
nixpkgs) et un seul module (configuration.nix) - Git est obligatoire avant toute opération
nix flake— les flakes ne fonctionnent qu’avec un dépôt initialisé nixos-rebuild switch --flake .#hostnameest la commande de reconstruction — elle fonctionne identiquement que l’installation utilise disko ou non- L’ISO NixOS 25.11 utilise l’utilisateur nixos (pas root) sur la console — adapatez votre méthode d’accès SSH en conséquence