💾 Archived View for thasmanie.fr › podman-nixos.gmi captured on 2023-07-10 at 13:05:36. Gemini links have been rewritten to link to archived content
-=-=-=-=-=-=-
publié le 2023/06/28
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)
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.
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
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