-- Leo's gemini proxy

-- Connecting to thasmanie.fr:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini;lang=fr

Podman sous NixOS : Netavark Error

publié le 2023/06/28

retour



EDIT du 06/12/2023


En fait j'avais cette erreur car j'applique le profile hardened de NixOS, qui empêche le chargement à chaud des modules kernel. Il suffit d'ajouter celui qui manque pour ne plus avoir besoin de slirp4netns :


boot.kernelModules = [ "xt_conntrack" ];

Intro


Je suis en train de migrer sous NixOS (vraiement un super OS, j'en ferai peut-être un article) et je me suis pris les pieds dans le tapis lors de l'installation de podman :


Error: netavark: create veth pair: Netlink error: Operation not supported (os error 95)

Site officiel de NixOS


Détails


Dans NixOS, on installe rien à la main, tout est déclaratif, voici comment j'active podman :


  virtualisation.podman = {
    enable = true;
    defaultNetwork.settings = { dns_enabled = false; };
  };

Après l'application de cette configuration, je peux lancer un container avec mon user normal, mais pas en root :


$ podman run --rm -ti alpine:3.18 hostname
2e982f4c3469
$ sudo podman run --rm -ti alpine:3.18 hostname
Error: netavark: create veth pair: Netlink error: Operation not supported (os error 95)

On remarque ici que l'erreur vient du module netavark, le composant réseau de podman depuis la version 4. C'est tout frais, et à ce jour, peu d'issues existent.


En cherchant un peu dans les sources, on voit que la fonction create_veth_pair veut juste renvoyer l'adresse mac de l'interface veth après sa création, rien de bien gros.

Donc la question, c'est pourquoi il ne peut pas créer cette interface.


Je débute sous NixOS mais je sais que pas mal de ressources système sont montées en readonly, ça vient peut-être de là. J'ai déjà joué avec le mode rootless de docker et podman et je me souviens qu'il attendait slirp4netns, un package pour la couche réseau.


Sources de netavark

Wiki Archlinux sur Podman


Solution


Le package est déjà installé, il suffit de le spécifier lors du run, et ça marche :


sudo podman run --rm -ti --network=slirp4netns alpine:3.18 hostname
c2d9f54fad8c

Bonus : définition d'un container systemd


Voici comment déclarer un service systemd qui va lancer un container (une image samba perso pour le'exemple) :


  virtualisation.oci-containers.containers = {
    "samba" = {
      image = "localhost/samba:prod";
      extraOptions = [ "--network=slirp4netns" ];
      ports = [ "445:445" ];
      log-driver = "json-file";
      environment = { TZ = "Europe/Paris"; };
      volumes = [
        "/data/samba:/data"
      ];
    };
  };

Bon on peut aussi utiliser un manifest type Pod de kubernetes, et lancer :


podman kube play

-- Response ended

-- Page fetched on Sun May 5 20:07:08 2024