December 9, 2022

Branches Tech

Engagé pour la qualité technologique

NixOS : Activer les machines virtuelles LXD à l’aide de Flakes

6 min read

Nixpkgs est une collection sans cesse croissante de progiciels pour Nix et NixOS. Même avec plus de 80 000 packages, vous vous retrouvez facilement dans une situation où il existe une fonctionnalité qui n’est pas encore implémentée.

Plus tôt cette année, nous avons écrit un tutoriel sur la façon d’implémenter votre propre package dans NixOS. L’implémentation du package dans le système était fastidieuse et nécessitait de garder une trace du package que vous vouliez implémenter.

Plongeons-nous dans un exemple pratique : LXD est un gestionnaire de conteneurs et de machines virtuelles. Il endosse nativement les machines virtuelles depuis LXD 4.0. Cependant, l’exécution sur NixOS casse la fonctionnalitéet nous devons trouver solutions de contournement pour l’utiliser. Pour permettre à LXD de démarrer des machines virtuelles sur NixOS, nous avons besoin d’un correctif, et nous voulons qu’il soit à la fois reproductible et portable.

Pour ce faire, nous utilisons le lxd-agent fonctionnalité qui résout efficacement le problème susmentionné. Il a été publié par Astridyu, un contributeur de nixpkgs. Il n’a pas encore été implémenté dans la branche Master de nixpkgs et est, au 19/04/2022, un demande d’extraction.

Notre objectif est d’intégrer la pull request à nos nixpkgs pour pouvoir démarrer des machines virtuelles. Pour cela, nous utiliserons Flocons. Il s’agit d’une fonctionnalité expérimentale du gestionnaire de packages Nix qui permet reproductibilité dans le déploiement des dépendances. Nous l’utilisons pour assembler différents nixpkgs ensemble. C’est un trait connu sous le nom de composabilité.

Si la demande d’extraction a été fusionnée, ce didacticiel devient inutile. Pour obtenir la fonctionnalité, mettez à jour votre Nix ou NixOS vers la version actuelle de la branche principale.

Conditions préalables

Étape 1 – Installation de ZFS

ZFS est un système de fichiers que nous utilisons pour générer des pools de stockage dans LXD. C’est le seul système de fichiers pris en charge par cette méthode, pour l’instant.

ZFS doit être installé sur la machine NixOS avant l’installation de LXD. Pour cela, rendez-vous dans votre configuration.nix fichier situé dans /etc/nixos/ et ajoutez les lignes suivantes à votre configuration.

boot =         
  
  initrd.supportedFilesystems = [ "zfs" ];        
  supportedFilesystems = [ "zfs" ];         
  zfs.requestEncryptionCredentials = true;  

  
  loader.grub.copyKernels=true;

  
  kernelParams= [ "nohibernate" ];
;

services.zfs =    
  
  autoScrub.enable = true;                  
  autoSnapshot.enable = true;               
;

Dans le dossier, le networking.hostId propriété doit être définie. C’est un peu délicat car il n’accepte que les ID 32 bits que vous générez sur le terminal avec head -c 8 /etc/machine-id.

Avec cet ID, accédez à votre fichier de configuration et définissez-le.

networking = 
  hostId = "<id>";
;

Maintenant, reconstruisez le lecteur de commutateur. Ceci est réalisé en faisant sudo nixos-rebuild switch.

Si la construction échoue parce que vous avez déjà installé LXD, reportez-vous à cette partie de l’article.

Étape 2 – Installation des flocons

À installer Floconstout simplement, dans configuration.nix:


nix = 
  package = pkgs.nixFlakes; 
  extraOptions = ''experimental-features = nix-command flakes'';
;

Vous devez reconstruire votre lecteur de commutateur à nouveau.

Premiers pas avec Flakes

Nous allons puiser dans la puissance de Flakes pour patcher notre système en combinant différentes versions de nixpkgs. Les versions que nous utiliserons sont :

Vous pouvez suivre la pull request avec son numéro : #166858.

Ensuite, nous remplacerons le package LXD de la version de la branche principale nixpkgs par la version de la branche nixpkgs lxd-vms d’astridyu pour obtenir le lxd-agent fonction appliquée sur LXD.

Pour utiliser Flakes, il est nécessaire de créer un flake.nix déposer dans /etc/nixos. Cela se fait en faisant sudo nano /etc/nixos/flake.nix.

Dans ce fichier, nous décrivons quel dépôt nixpkgs nous voulons ajouter à notre configuration, et comment les fusionner.

Remarque : Vérifiez que votre nom d’hôteest défini sous la networking.hostName champ dans votre configuration. C’est requis.


  description = "NixOS Configuration of LXD";

  
  inputs = 
    
    nixpkgs.url = "nixpkgs/master";

    
    nixpkgs-lxdvm = 
      url = "github:astridyu/nixpkgs/lxd-vms";
    ;
  ;

  
  outputs =  self, nixpkgs, nixpkgs-lxdvm :
    let
      system = "x86_64-linux";
      
      overlay-lxdvm = final: prev: 
         lxdvm = import nixpkgs-lxdvm 
           inherit system;
           
           config.allowUnfree = true;
         ;
      ;
    in 
      nixosConfigurations."<hostname>" = nixpkgs.lib.nixosSystem 
        inherit system;
        modules = [
          
          ( config, pkgs, ... :  nixpkgs.overlays = [ overlay-lxdvm ]; )
          ./configuration.nix
        ];
      ;
    ;

Installation de LXD

Nous devons modifier notre configuration.nix pour activer la virtualisation LXD.


boot.kernelModules = ["vhost_vsock"];


virtualisation = 
  lxd = 
    enable=true;

    
    package = pkgs.lxdvm.lxd.override useQemu = true;;
    recommendedSysctlSettings=true;
  ;

  
;

Nous reconstruisons le lecteur de commutateur. Il est nécessaire d’utiliser le --impure option lors de la reconstruction si elle est demandée par le système.

La raison derrière cela est que Flakes fonctionne en mode d’évaluation pure qui est sous-documenté. Flakes interdit l’utilisation de chemins absolus, ce qui pourrait rendre l’évaluation impure. Cela peut arriver parce que nous exécutons des packages non pris en charge.

Premiers pas avec LXD et les machines virtuelles

Pour commencer avec LXD, nous vous recommandons d’initialiser un pool de stockage. Ceci est fait par sudo lxd init.

Ensuite, des questions sont posées concernant le premier pool de stockage créé par LXD. Nous recommandons cette configuration pour la première utilisation.

Would you like to use LXD clustering? (yes/no) [default=no]: no
Do you want to configure a new storage pool? (yes/no) [default=yes]: yes

Name of the new storage pool [default=default]: test-storage

Name of the storage backend to use (btrfs, dir, zfs) [default=zfs]: zfs

Create a new ZFS pool? (yes/no) [default=yes]:

Would you like to use an existing empty block device (e.g. a disk or partition)? (yes/no) [default=no]:

Size in GB of the new loop device (1GB minimum) [default=30GB]:

Would you like to connect to a MAAS server? (yes/no) [default=no]:

Would you like to create a new local network bridge? (yes/no) [default=yes]:

What should the new bridge be called? [default=lxdbr0]: test-bridge

What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:

What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:

Would you like the LXD server to be available over the network? (yes/no) [default=no]:

Would you like stale cached images to be updated automatically? (yes/no) [default=yes]:

Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:

Lorsqu’il n’y a pas de réponse, la valeur par défaut est supposée.

Une fois le pool de stockage configuré, de nouvelles machines virtuelles peuvent être initialisées avec lxc launch --vm -s . Il télécharge automatiquement l’image de votre machine virtuelle et en configure une.

Pour vérifier vos machines virtuelles, faites lxc ls.

Problèmes courants

Si la reconstruction échoue, cela est dû au fait que LXD est déjà installé. Cela mène à nixos-rebuild switch échoue car un pool de stockage LXD existe déjà. Cela signifie que les volumes sont toujours montés et que vous devez les supprimer car il est nécessaire de reconstruire LXD à partir de zéro.

Commencez par régénérer votre hardware-configuration.nix en faisant nixos-generate-config.

Dans ce fichier, le chemin vers vos volumes montés est mentionné, et vous devez les démonter et les supprimer de la manière suivante :

  • sudo umount -v /var/lib/lxd/storage-pools/ pour démonter le pool de stockage.
  • sudo rm -r /var/lib/lxd pour supprimer tout le dossier LXD.

La reconstruction de votre système est à nouveau nécessaire.

Conclusion

Toutes nos félicitations! Vous pouvez maintenant lancer des machines virtuelles à l’aide de LXD sur NixOS et vous avez appris à utiliser des flocons pour créer une superposition pour vos nixpkgs.

Cette méthode deviendra obsolète une fois la pull request fusionnée, mais elle reste pertinente si vous souhaitez intégrer des fonctionnalités qui ne sont pas dans la branche master.