Vous en avez marre des serveurs « flocons de neige » ? Ces VMs que vous avez mis des heures à configurer, mais que vous seriez incapable de reproduire à l’identique ? Vous priez à chaque apt upgrade pour que rien ne casse ? Alors laissez-moi vous présenter votre nouveau meilleur ami : NixOS.
NixOS n’est pas juste une autre distribution Linux. C’est une approche radicalement différente de la gestion de système, basée sur trois piliers magiques :
- Déclaratif : Vous ne donnez pas d’ordres à votre système. Vous décrivez l’état final que vous souhaitez dans un seul fichier de configuration (
configuration.nix), et NixOS se charge de le réaliser. « Je veux Nginx, PostgreSQL et Docker » est tout ce que vous avez à dire. - Reproductible : Ce fichier de configuration est la recette exacte de votre système. Donnez-le à une autre machine NixOS, et vous obtiendrez un clone parfait, au bit près. Fini le « ça marche sur ma machine » !
- Atomique : Les mises à jour ne se font jamais en direct. NixOS construit la nouvelle version de votre système à côté de l’ancienne. Si quelque chose se passe mal, vous pouvez redémarrer sur la version précédente instantanément, comme un voyage dans le temps.
Combiné à Proxmox, NixOS devient une arme absolue pour créer des templates de VMs parfaits, robustes et que vous pouvez recréer à l’infini sans jamais dévier. Prêt à construire votre première brique ? C’est parti !

Étape 1 : Récupérer l’ISO NixOS (Proprement !)
Avant toute chose, nous avons besoin de l’installateur de NixOS. On pourrait le télécharger à la main, mais un bon administrateur système automatise, n’est-ce pas ? Voici un petit script qui va s’en charger pour nous.
# ----- Variables -----
destination="/var/lib/vz/template/iso/"
url="https://channels.nixos.org/nixos-25.05/latest-nixos-minimal-x86_64-linux.iso"
nom_fichier=$(basename "$url")
# ----- Logique de téléchargement -----
# On vérifie si le dossier de destination existe, sinon on le crée
if [ ! -d "$destination" ]; then
echo "Le répertoire n'existe pas. Création de $destination..."
mkdir -p "$destination"
fi
# On vérifie si on n'a pas déjà l'ISO
if [ -f "$destination/$nom_fichier" ]; then
echo "Le fichier $nom_fichier existe déjà. Aucun téléchargement effectué."
else
echo "Téléchargement de $nom_fichier..."
wget -P "$destination" "$url"
echo "Téléchargement terminé."
fi
Ce que fait ce script :
- Il définit où stocker nos ISOs (
destination) et l’URL de la dernière version de NixOS. - Il vérifie intelligemment si le dossier existe, et le crée si besoin.
- Plus malin encore, il regarde si le fichier est déjà là pour éviter de le télécharger à nouveau inutilement. C’est propre, c’est efficace, on aime.
Étape 2 : Créer la Machine Virtuelle (avec qm)
Maintenant que nous avons notre carburant (l’ISO), il est temps de construire la fusée (la VM). On va utiliser la puissante commande qm de Proxmox.
# ----- Variables de la VM (à personnaliser si besoin) -----
VM_ID="8000"
VM_STORAGE="local-lvm" # Adaptez à votre stockage
# ----- Création et configuration -----
echo "Création de la VM ${VM_ID}..."
qm create ${VM_ID} --name nixos-25.05-template --memory 2048 --cores 4 --cpu cputype=host
echo "Configuration du matériel..."
qm set ${VM_ID} --agent 1 --machine q35 --ostype l26 --onboot 1 --scsihw virtio-scsi-pci
qm set ${VM_ID} --net0 virtio,bridge=vmbr0 --ipconfig0 ip=dhcp
# L'ISO est montée comme un CD-ROM
qm set ${VM_ID} --scsi0 ${VM_STORAGE}:32 --ide2 local:iso/$nom_fichier,media=cdrom
# Configuration du boot en UEFI
qm set ${VM_ID} --bios ovmf --boot order='scsi0;ide2' --efidisk0 ${VM_STORAGE}:0,pre-enrolled-keys=0,efitype=4m,size=528K
echo "Démarrage de la VM..."
qm start ${VM_ID}
Décryptage de la magie qm :
qm create: C’est l’acte de naissance de notre VM. On lui donne un nom, de la RAM, des cœurs.qm set(matériel) : On affine la configuration : activation de l’agent QEMU (très utile !), type de machineq35, configuration réseau…qm set(disques) : C’est le point crucial. On crée un disque dur virtuel (scsi0) de 32Go et on attache notre ISO téléchargée comme un lecteur CD-ROM (ide2). L’optionmedia=cdromest vitale !qm set(boot) : On configure la VM pour démarrer en mode UEFI (ovmf), et on lui dit de tenter de démarrer sur le disque dur d’abord, puis sur le CD-ROM.qm start: On allume la machine !
Prochaines étapes
Et voilà ! En quelques secondes, vous avez une VM NixOS démarrée sur son installateur, prête à être configurée.
La prochaine étape est la plus intéressante : se connecter à la console de la VM via Proxmox et commencer l’installation en écrivant notre fameux configuration.nix. Mais ça, c’est une aventure pour le prochain article !
Vous venez de poser la première pierre d’une infrastructure propre, reproductible et incroyablement résiliente. Bienvenue dans le futur de l’administration système !


Merci pour votre article.
J’avais tenté l’expérience NixOS sur un vaillant ancien ordinateur portable (en remplacement de Debian) et avais été séduit. Puis je m’étais un peu perdu dans les « flakes » et autres fonctionnalités « expérimentales » mais relativement hégémoniques, ce qui m’avait refroidi (j’ai réinstallé Debian).
Parallèlement à cela j’ai tenté l’expérience Proxmox en lieu et place de LXD (puis Incus) sur Debian, et j’en suis enchanté.
L’intersection de ces deux mondes (Proxmox et NixOS) me donnera sans doute un regard frais et bienvenu sur NixOS !
Hâte d’en lire davantage.
Au lieu de lancer un installateur, Nixos-generators permet de créer directement une image VMA pour Promox depuis une configuration Nix, automatisant toute la configuration.
https://github.com/nix-community/nixos-generators
Merci pour le com.
Oui, je connais cette méthode aussi et j’en parlerais dans de futurs tutos, mais je commence par simple.
Salut,
Je débute avec Proxmox en ligne de commande. Pour le premier script j’ai dû supprimer tout ce qui est entre crochets mais c’était assez facile à corriger mê si je ne sais pas pourquoi il fallait corriger.
Par contre le 2e, bien plus intéressant, ne déploie rien du tout, la VM cherche à booter en PXE. Voici l’output:
Création de la VM 200…
Configuration du matériel…
update VM 200: -agent 1 -machine q35 -onboot 1 -ostype l26 -scsihw virtio-scsi-pci
update VM 200: -ipconfig0 ip=dhcp -net0 virtio,bridge=vmbr0
unable to parse directory volume name ‘iso/’
update VM 200: -scsi0 local-lvm:32,format=qcow2
unsupported format ‘qcow2’ at /usr/share/perl5/PVE/Storage/LvmThinPlugin.pm line 101.
update VM 200: -bios ovmf -boot order=scsi0;ide2 -efidisk0 local-lvm:0,pre-enrolled-keys=0,efitype=4m,size=528K
invalid bootorder: device ‘scsi0′ does not exist’
Démarrage de la VM…
WARN: no efidisk configured! Using temporary efivars disk.
Task finished with 1 warning(s)!
root@pve2:/# nano nixos_deploy.sh
root@pve2:/# chmod +x nixos_deploy.sh
root@pve2:/# ./nixos_deploy.sh
Création de la VM 200…
Configuration du matériel…
update VM 200: -agent 1 -machine q35 -onboot 1 -ostype l26 -scsihw virtio-scsi-pci
update VM 200: -ipconfig0 ip=dhcp -net0 virtio,bridge=vmbr0
unable to parse directory volume name ‘iso/’
update VM 200: -bios ovmf -boot order=scsi0;ide2 -efidisk0 local-lvm:0,pre-enrolled-keys=0,efitype=4m,size=528K
Rounding up size to full physical extent 4.00 MiB
WARNING: You have not turned on protection against thin pools running out of space.
WARNING: Set activation/thin_pool_autoextend_threshold below 100 to trigger automatic extension of thin pools before they get full.
Logical volume « vm-200-disk-0 » created.
WARNING: Sum of all thin volume sizes (<502.01 GiB) exceeds the size of thin pool pve/data and the size of whole volume group (237.97 GiB).
Logical volume pve/vm-200-disk-0 changed.
transferred 0.0 B of 528.0 KiB (0.00%)
transferred 528.0 KiB of 528.0 KiB (100.00%)
transferred 528.0 KiB of 528.0 KiB (100.00%)
efidisk0: successfully created disk 'local-lvm:vm-200-disk-0,efitype=4m,pre-enrolled-keys=0,size=4M'
invalid bootorder: device 'scsi0' does not exist'
Démarrage de la VM…
Problème résolu, il suffisait d’ajouter le chemin pour l’iso mais encore une fois, pourquoi le script n’est-il pas complet?
Bonsoir, je pense surtout que vous n’avez pas compris que c’est UN seul script…
Le nom de l’iso est là : local:iso/$nom_fichier et il est défini par : nom_fichier=$(basename « $url »)
Cdt.
Bonjour, j’ai effectivement procédé par étape, la première partie posant déjà problème en ne téléchargeant pas l’iso. Quoiqu’il en soit ça fonctionne parfaitement maintenant alors j’attends avec impatience la suite.
C’est corrigé pour l’url. Un copié/collé trop rapide à partir de mon wiki… J’expliquerai d’ailleurs aussi comment héberger son propre wiki.
Merci pour votre réactivité.
Merci pour cette article, j’ai justement réinstaller mon laptop hier sur NixOS, et franchement c’est plutôt cool
Juste une petite remarque, en configuration standard, c’est pas totalement reproductible, il peut y avoir des différences, souvent légère, sauf si on utilise les flakes, ce qui complexifie les choses.
Par contre je me posais une question, jusqu’à quel point c’est transportable ? Car il y a quand même le hardware-configuration.nix qui peux être propre a chaque machine, puisque auto générer, comment ça se passe ?