NixOS : Activer les machines virtuelles LXD à l’aide de Flakes
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 démarrer 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 utilisée.
Une fois le pool de stockage configuré, de nouvelles machines virtuelles peuvent être initialisées avec lxc launch
. 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.