Présentation
Sur les postes de travail Linux, la mise en veille prolongée (hibernation) nécessite un espace de swap capable de stocker l’image mémoire. Sous NixOS, la configuration du swap influence directement la réussite de la reprise, notamment lorsqu’on utilise des fichiers de swap chiffrés ou des partitions dédiées. L’auteur décrit les difficultés rencontrées entre zram et zswap, puis propose une configuration minimale qui fonctionne avec le système de fichiers btrfs et le chiffrement LUKS.
Configuration du swap sous NixOS
Deux approches sont présentées : une partition de swap identifiée par UUID pour le bureau, et un fichier de swap placé dans un sous‑volume btrfs dédié pour l’ordinateur portable chiffré. Exemple de déclaration de partition :
swapDevices = [ {device = "/dev/disk/by-uuid/f2fc399a-9703-450b-88df-5671b776fc71";} ];et de fichier de swap :
fileSystems."/.swapvol" = { device = "/dev/disk/by-uuid/33682d1d-87c4-4166-8d3b-66d900387e42"; fsType = "btrfs"; options = ["subvol=swap"]; };
swapDevices = [ { device = "/.swapvol/swapfile"; size = 32 * 1024; } ];Le texte souligne que le résumeur d’initramfs doit connaître l’emplacement exact du swap avant le montage des systèmes de fichiers, ce qui complique l’usage des fichiers de swap sur UEFI : les informations sont stockées dans une variable EFI au moment du déclenchement de l’hibernation.
zswap vs zram : mécanismes et choix
zswap agit comme un cache compressé en RAM devant un swap « disk‑backed », tandis que zram crée un dispositif de swap entièrement en mémoire compressée. L’auteur a d’abord activé zramSwap.enable, pensant que c’était recommandé, mais a constaté que cela empêche l’hibernation car aucune donnée n’est écrite sur le disque. La correction consiste à désactiver zramSwap et à activer zswap :
boot.zswap.enable = true;
boot.zswap.compressor = "lz4"; # ou "zstd" par défaut NixOS
boot.kernel.sysctl."vm.swappiness" = 100;Le paramètre vm.swappiness fixe la propension du noyau à évacuer des pages vers le swap ; la valeur 100, recommandée pour les SSD, maximise l’utilisation du swap dès que la RAM est saturée. Le choix du compresseur influe sur la latence et le taux de compression : le noyau Linux utilise lzo par défaut (équilibre vitesse/ratio), NixOS préfère zstd (meilleur ratio, utile pour les builds Nix), alors que lz4 offre la plus faible latence mais un ratio moindre.
Impact sur la hibernation et limites
Avec zswap activé, les pages sont d’abord stockées compressées en RAM, réduisant le trafic disque. Si la pression mémoire persiste, les pages sont écrites sur le swap disque, garantissant que l’image d’hibernation reste complète. Cette double couche évite les pertes de données lors de la reprise, contrairement à zram qui ne persiste pas après un redémarrage. NixOS a récemment ajouté la prise en charge des offsets de fichiers de swap, ce qui élimine la nécessité de calculs manuels pour les systèmes chiffrés.
Les limites restent liées à la capacité du disque et à la vitesse du compresseur : un compresseur très rapide (lz4) peut saturer la RAM plus rapidement, tandis qu’un ratio élevé (zstd) réduit la quantité de données à écrire mais augmente le temps CPU. De plus, la valeur de swappiness doit être adaptée à chaque matériel ; la recommandation « 100 » fonctionne bien avec des SSD, mais peut entraîner une usure prématurée si le disque est lent.
En résumé, la configuration recommandée par l’auteur repose sur deux lignes de NixOS : activer zswap avec le compresseur par défaut et fixer vm.swappiness à 100. Cette approche minimise la complexité du fichier de configuration tout en assurant une hibernation fiable sur des machines de bureau et portables, même lorsqu’elles utilisent du chiffrement LUKS et des sous‑volumes btrfs.