LXC : un conteneur nixos

Rédigé par Alexandre le 06/05/2022

#nixos #lxc #autohébergement

Cela fait maintenant quelques jours que je découvre NixOS dans une machine virtuelle sous gnome-boxes. D'abord un peu perdu, j'ai finalement pris en main cette distribution un peu particulière que je prendrais le temps de présenter au travers d'un autre article.

Dans cet article, je vais simplement expliquer comment j'ai créé une image LXC fonctionnelle de NixOS.

Créer l'image

J'ai eu beau suivre des procédures ici ou là, je ne suis pas parvenu à obtenir un conteneur fonctionnel avec ces méthodes. Du coup, je donne ma méthode, qui n'est sans doute pas la meilleure.

L'import d'une image LXC nécessite :

  • le fichier de métadonnées
  • l'image système

Ces éléments se génèrent à l'aide d'un outil qu'il faut installer sur une machine disposant déjà de NixOS :

$ nix-env -f https://github.com/nix-community/nixos-generators/archive/master.tar.gz -i

Comme mon cluster LXD est sur l'architecture aarch64, j'ai dû activer l’émulation sur ma machine d’administration :

$ cat /etc/nixos/configuration.nix
{ config, pkgs, ... }

{
[...]
  boot.binfmt.emulatedSystems = [ "aarch64-linux" ];
[...]

Après un redémarrage, j'ai pu générer le fichier de métadonnées :

$ nixos-generate --format lxc-metadata --system aarch64-linux

Générer l'image système :

$ nixos-generate --format lxc --system aarch64-linux --configuration /tmp/configuration.nix

Chacune des commandes retourne le chemin complet vers l'élément généré. Ces fichiers doivent être envoyés sur un emplacement disponible pour les hôtes LXD/LXC.

Distribution

Au lieu d'obliger ceux qui veulent simplement tester NixOS à l'installer dans une VM et d'effectuer l'ensemble des étapes précédentes, voici un dossier contenant les éléments générés (métadonnées et image).`

Importer l'image

Maintenant que nous avons l'image système et sa description, importer l'image :

$ lxc image import --alias nixos nixos-21.11-lxd-aarch64/metadata.tar.xz nixos-21.11-lxd-aarch64/system.tar.xz

L'image est maintenant importée :

$ lxc image list --format=compact
  ALIAS  FINGERPRINT   PUBLIC                       DESCRIPTION                        ARCHITECTURE    TYPE       SIZE            UPLOAD DATE           
  nixos  0f496288836c  no      NixOS Porcupine 21.11.337266.feea25c5865 aarch64-linux  aarch64       CONTAINER  112.64MB  May 21, 2022 at 9:26pm (UTC)  
         68da863ba2e6  no      Debian bullseye arm64 (20220518_05:25)                  aarch64       CONTAINER  98.24MB   May 18, 2022 at 7:28am (UTC)

Utiliser l'image

Déployer un conteneur à partir de l'image importée précédemment :

$ lxc launch nixos ct50189 --config limits.memory=2GB --config security.nesting=true

Se connecter au conteneur :

$ lxc exec ct50189 -- bash

Avec le fichier minimal utilisé pour générer l'image, l'IP doit être fourni par le DHCP. De mon côté, je n'ai pas de DHCP, donc je fixe temporairement l'IP manuellement :

# systemctl stop dhcpcd.service; \
ip addr add 192.168.50.27/24 dev eth0 && \
ip route add default via 192.168.50.60 && \
echo "nameserver 192.168.50.11" | tee /etc/resolv.conf

Configurer NixOS avec au minimum les éléments suivants :

$ tee /tmp/configuration.nix <<EOF
{ config, pkgs, ... }:

{
  imports = [
    # Include container module
    <nixpkgs/nixos/modules/virtualisation/lxc-container.nix>
  ];

  # Tell NixOS that we are a container
  boot.isContainer = true;

  # This value determines the NixOS release from which the default
  # settings for stateful data, like file locations and database versions
  # on your system were taken. It‘s perfectly fine and recommended to leave
  # this value at the release version of the first install of this system.
  # Before changing this value read the documentation for this option
  # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
  system.stateVersion = "21.11"; # Did you read the comment?
}
EOF

Reconstruire et mettre à jour le système :

# nixos-rebuild switch --upgrade

Références