<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>LXC on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/lxc/</link><description>Recent content in LXC on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr-fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Mon, 24 Nov 2025 18:00:00 +0200</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/lxc/index.xml" rel="self" type="application/rss+xml"/><item><title>Les artefacts OCI comme base de machines LXC sur Proxmox 9.1, enfin ?</title><link>https://blog.zwindler.fr/2025/11/24/artefacts-oci-lxc-proxmox-9-1/</link><pubDate>Mon, 24 Nov 2025 18:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2025/11/24/artefacts-oci-lxc-proxmox-9-1/</guid><description>&lt;img src="https://blog.zwindler.fr/2025/11/pve-oci2.webp" alt="Featured image of post Les artefacts OCI comme base de machines LXC sur Proxmox 9.1, enfin ?" /&gt;&lt;h2 id="contexte"&gt;Contexte
&lt;/h2&gt;&lt;p&gt;Il y a quelques jours, &lt;a class="link" href="https://proxmox.com/en/about/company-details/press-releases/proxmox-virtual-environment-9-1" target="_blank" rel="noopener"
&gt;la dev team de Proxmox VE a annoncé une nouvelle version (la 9.1)&lt;/a&gt; dont la nouvelle fonctionnalité majeure est l&amp;rsquo;ajout du support des artefacts OCI comme base pour créer des containers LXC.&lt;/p&gt;
&lt;p&gt;Une fonctionnalité attendue depuis TREEEEES longtemps, puisqu&amp;rsquo;en théorie cela ouvre enfin la porte au lancement de containers de type &amp;ldquo;Docker&amp;rdquo; dans Proxmox, ce que les devs de Proxmox avaient toujours refusé.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est d&amp;rsquo;ailleurs la raison pour laquelle un de mes articles de blog cartonne le plus sur Google (snif, bientôt la fin de la gloire) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2022/11/07/containers-docker-dans-proxmox-avec-lxc/" target="_blank" rel="noopener"
&gt;Cet article où j&amp;rsquo;explique comment lancer des containers Docker (via LXC) dans Proxmox VE (normalement pas possible)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Create LXC containers from OCI images&lt;/p&gt;
&lt;p&gt;Proxmox VE 9.1 integrates support for Open Container Initiative (OCI) images, a standard format for container distribution. Users can now download widely-adopted OCI images directly from registries or upload them manually to use as templates for LXC containers. Depending on the image, these containers are provisioned as full system containers or lean application containers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="on-teste--dabord-les-prérequis"&gt;On teste ? D&amp;rsquo;abord les prérequis
&lt;/h2&gt;&lt;p&gt;Du coup, je suis curieux, comment ça fonctionne ?&lt;/p&gt;
&lt;p&gt;D&amp;rsquo;abord, il faut aller pré-télécharger l&amp;rsquo;image qui vous intéresse dans votre stockage (pouvant accueillir des &amp;ldquo;CT Templates&amp;rdquo;).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/11/pve-oci1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Truc fun, il y a un bouton qui s&amp;rsquo;appelle &amp;ldquo;Query tags&amp;rdquo;, qui j&amp;rsquo;imagine permet de récupérer une liste des tags. Bon ben, ça commence mal, ça ne fonctionne pas (en tout cas pas sur docker.io&amp;hellip;).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;command &amp;#39;skopeo list-tags docker://docker.io/zwindler/prime-calculator&amp;#39; failed: exit code 1 (500)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;EDIT : depuis, ça refonctionne, sur tous mes nodes. Peut être un problème temporaire&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/12/qwen.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Note : &lt;code&gt;skopeo&lt;/code&gt; c&amp;rsquo;est justement une des dépendances utilisées dans mon article &amp;ldquo;hack proxmox+docker&amp;rdquo; et qui permet de manipuler (télécharger surtout) des containers depuis des registries distantes.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/11/pve-oci2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/11/pve-oci3.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/11/pve-oci4.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="création-du-container-lxc"&gt;Création du container LXC
&lt;/h2&gt;&lt;p&gt;Maintenant que le template (l&amp;rsquo;image OCI) est disponible sur notre stockage, on peut créer un container LXC comme d&amp;rsquo;habitude. On clique sur &amp;ldquo;Create CT&amp;rdquo;, on donne un CT ID, un password :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/11/pve-oci5.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Pour le template, on choisit notre artefact OCI :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/11/pve-oci6.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Et on valide. Proxmox devrait créer notre container :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/11/pve-oci7.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Même si le terminal nous indique que les containers applicatifs peuvent ne pas bien fonctionner dans la console JS, pour tous les containers que j&amp;rsquo;ai réussi à démarrer (cf la suite), j&amp;rsquo;ai toujours eu une console fonctionnelle.&lt;/p&gt;
&lt;p&gt;Le pari a l&amp;rsquo;air donc plutôt réussi.&lt;/p&gt;
&lt;p&gt;Exemple avec &lt;code&gt;docker.io/python:3.11.14-trixie&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/12/python.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="quand-ça-ne-marchait-pas-encore"&gt;Quand ça ne marchait pas (encore)
&lt;/h2&gt;&lt;p&gt;J&amp;rsquo;ai eu 2 soucis sur un proxmox VE 91 (qui avait été mis à jour et un peu bidouillé, bref, une machine qui avait vécue) pour démarrer un container LXC sur base OCI avec Proxmox VE 9.1 car je suis tombé sur 2 bugs.&lt;/p&gt;
&lt;p&gt;Je n&amp;rsquo;ai pas reproduit ces bugs sur une installe &amp;ldquo;fraiche&amp;rdquo;.&lt;/p&gt;
&lt;h3 id="premier-bug--image-from-scratch"&gt;Premier bug : image &amp;ldquo;from scratch&amp;rdquo;
&lt;/h3&gt;&lt;p&gt;D&amp;rsquo;abord, mon image &lt;code&gt;prime-calculator&lt;/code&gt; n&amp;rsquo;est même pas créée.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;TASK ERROR: unable to create CT 106 - Error while extracting OCI image: Unknown layer digest sha256:2bc4d17e1eb16f6b52acbafeb6d86c8f3eaf9588a5e2a7a245b6bb1d85e93396 found in rootfs.diff_ids: Unknown layer digest sha256:2bc4d17e1eb16f6b52acbafeb6d86c8f3eaf9588a5e2a7a245b6bb1d85e93396 found in rootfs.diff_ids
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Bon, admettons. Mon image, c&amp;rsquo;est un binaire &amp;ldquo;from scratch&amp;rdquo;, sans rien à part le binaire, et je me suis peut-être trompé quelque part&amp;hellip;&lt;/p&gt;
&lt;p&gt;Ca ne marche toujours pas.&lt;/p&gt;
&lt;h3 id="deuxième-bug--impossible-de-démarrer"&gt;Deuxième bug : impossible de démarrer
&lt;/h3&gt;&lt;p&gt;Cependant, même avec des images connues, le container est bien créé :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/11/pve-oci8.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Mais impossible de le démarrer :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;problem with monitor socket, but continuing anyway: got timeout
TASK ERROR: unable to get PID for CT 105 (not running?)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Même erreur avec la ligne de commande&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pct start 105 --debug
problem with monitor socket, but continuing anyway: got timeout
lxc_start_main: 257 Container is already running
- Read uid map: type u nsid 0 hostid 100000 range 65536
INFO confile - ../src/lxc/confile.c:set_config_idmaps:2295 - Read uid map: type g nsid 0 hostid 100000 range 65536
ERROR lxc_start - ../src/lxc/tools/lxc_start.c:lxc_start_main:257 - Container is already running
unable to get PID for CT 105 (not running?)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/11/pve-oci9.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Après investigation (laborieuse), il se trouve que c&amp;rsquo;est un problème AppArmor. Je ne sais pas si c&amp;rsquo;est moi qui l&amp;rsquo;ai causé avec mes bidouilles ou si c&amp;rsquo;est un bug plus généralisé pour l&amp;rsquo;instant (probablement l&amp;rsquo;option 1, mais 2 n&amp;rsquo;est pas impossible non plus&amp;hellip;)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Nov 23 10:37:26 node01 systemd[1]: Started pve-container-debug@105.service - PVE LXC Container: 151.
Nov 23 10:37:27 node01 kernel: audit: type=1400 audit(1764067047.008:175): apparmor=&amp;#34;DENIED&amp;#34; operation=&amp;#34;create&amp;#34; class=&amp;#34;net&amp;#34;
Nov 23 10:37:27 node01 kernel: audit: type=1400 audit(1764067047.008:176): apparmor=&amp;#34;DENIED&amp;#34; operation=&amp;#34;create&amp;#34; class=&amp;#34;net&amp;#34;
Nov 23 10:37:27 node01 systemd[1]: pve-container-debug@105.service: Deactivated successfully.
Nov 23 10:37:37 node01 pct[21369]: unable to get PID for CT 105 (not running?)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le workaround temporaire (et cracra) est de désactiver le profil appArmor pour &lt;code&gt;lxc-start&lt;/code&gt;, et supprimer les éventuels fichiers / process zombies.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apparmor_parser -R /etc/apparmor.d/usr.bin.lxc-start
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ps aux &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s2"&gt;&amp;#34;lxc-start&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s2"&gt;&amp;#34;105&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; xargs -r &lt;span class="nb"&gt;kill&lt;/span&gt; -9
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -f /var/lib/lxc/105/config.lock
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -f /run/lxc/lock/var/lib/lxc/105
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note : On peut aussi le désactiver de manière permanente, mais c&amp;rsquo;est évidemment quelque chose à ne pas faire.&lt;/p&gt;
&lt;p&gt;À partir de là, le container est accessible, parfois en console (ça dépend du container)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/11/pve-oci10.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;A priori, les problèmes que j&amp;rsquo;ai rencontré ne se reproduisent pas sur une &amp;ldquo;fresh install&amp;rdquo;. C&amp;rsquo;est donc probablement un souci lié à mes &amp;ldquo;vieilles&amp;rdquo; machines.&lt;/p&gt;
&lt;p&gt;En bonus, un autre article en anglais qui m&amp;rsquo;a fait persévérer quand j&amp;rsquo;ai compris que ça marchait chez certains :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://raymii.org/s/tutorials/Finally_run_Docker_containers_natively_in_Proxmox_9.1.html" target="_blank" rel="noopener"
&gt;blog Raymii.org - Finally, run Docker containers natively in Proxmox 9.1 (OCI images)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note : l&amp;rsquo;article m&amp;rsquo;a permis de redécouvrir la commande &lt;code&gt;pct enter CTID&lt;/code&gt; qui permet de se logger au container.&lt;/p&gt;
&lt;p&gt;En attendant, vous avez toujours mon hack ;-)&lt;/p&gt;</description></item><item><title>Transformer Proxmox VE en node Kubernetes avec LXC et lxcri</title><link>https://blog.zwindler.fr/2025/11/17/transformer-proxmox-ve-en-node-kubernetes-avec-lxc-et-lxcri/</link><pubDate>Mon, 17 Nov 2025 18:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2025/11/17/transformer-proxmox-ve-en-node-kubernetes-avec-lxc-et-lxcri/</guid><description>&lt;img src="https://blog.zwindler.fr/2025/11/proxmox-k8s.webp" alt="Featured image of post Transformer Proxmox VE en node Kubernetes avec LXC et lxcri" /&gt;&lt;h2 id="il-ne-savait-pas-que-cétait-complètement-stupide-alors-il-la-fait"&gt;Il ne savait pas que c&amp;rsquo;était complètement stupide, alors il l&amp;rsquo;a fait
&lt;/h2&gt;&lt;p&gt;Quel mensonge&amp;hellip; &lt;strong&gt;Bien sûr, je sais très bien que c&amp;rsquo;est débile&lt;/strong&gt;. Raison pour laquelle cette idée est donc irrésistible.&lt;/p&gt;
&lt;p&gt;Si vous suivez le blog, vous savez que j&amp;rsquo;utilise beaucoup Proxmox VE (les articles qui attirent le plus sur le blog sont d&amp;rsquo;ailleurs des articles sur cette technologie de virtualisation).&lt;/p&gt;
&lt;p&gt;Proxmox VE, c&amp;rsquo;est très cool ; on peut faire des VMs (QEMU) avec, mais aussi, si on n&amp;rsquo;a pas de VT-x ou qu&amp;rsquo;on veut des &amp;ldquo;lightweight VMs&amp;rdquo; (terme dont on a abusé à outrance), on peut installer des OS complets dans des containers avec LXC.&lt;/p&gt;
&lt;p&gt;Mais au delà de ces deux solutions, les devs du projet Proxmox VE sont assez rigides (et pas que là dessus). C&amp;rsquo;est d&amp;rsquo;ailleurs pour ça que j&amp;rsquo;ai posté quelques &amp;ldquo;hacks&amp;rdquo; pour contourner les limitations de Proxmox, notamment &lt;a class="link" href="https://blog.zwindler.fr/2022/11/07/containers-docker-dans-proxmox-avec-lxc/" target="_blank" rel="noopener"
&gt;cet article où j&amp;rsquo;explique comment lancer des containers Docker (via LXC) dans Proxmox VE (normalement pas possible)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Et si on allait encore plus loin dans le hack idiot ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Et si, non seulement on exécutait des containers OCI dans Proxmox VE, mais qu&amp;rsquo;EN PLUS, on transformait nos hôtes Proxmox VE en ✨️ &lt;strong&gt;Nodes Kubernetes&lt;/strong&gt; ✨️ ???&lt;/p&gt;
&lt;h2 id="on-sy-prend-comment-"&gt;On s&amp;rsquo;y prend comment ?
&lt;/h2&gt;&lt;p&gt;Le but n&amp;rsquo;est évidemment pas d&amp;rsquo;installer Kubernetes à côté de Proxmox VE, mais réutiliser le plus de choses possibles. Typiquement, je vais réutiliser la techno de &amp;ldquo;virtu&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Proxmox VE supportant 2 technos de virtualisation différentes (qemu et LXC), il faut choisir. Et comme j&amp;rsquo;aime bien LXC et que j&amp;rsquo;ai déjà expérimenté sur le hack Docker =&amp;gt; LXC sur Proxmox VE, &lt;strong&gt;la question était vite répondue&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Toute la difficulté de l&amp;rsquo;exercice est de trouver comment rendre LXC &amp;ldquo;CRI-compatible&amp;rdquo;. Et on a de la chance, Linux Containers, la fondation qui chapeaute LXC et Incus (ex LXD, &amp;ldquo;refermé&amp;rdquo; par Canonical), a écrit il y a quelques années un CRI pour LXC appelé &lt;a class="link" href="https://github.com/lxc/lxcri" target="_blank" rel="noopener"
&gt;lxcri&lt;/a&gt;. Et bien sûr, comme c&amp;rsquo;est un projet à l&amp;rsquo;utilité discutable, le truc n&amp;rsquo;est plus maintenu depuis 2021.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;avais d&amp;rsquo;ailleurs essayé de l&amp;rsquo;utiliser, passé pas mal de temps dessus en février 2024 (j&amp;rsquo;ai essuyé bug sur bug, suis passé par des forks, &amp;hellip;) pour échouer lamentablement sur un problème de compatibilité avec ma version de LXC (5+ sous Proxmox 8, 6 en Proxmox 9), entre autres bugs.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;lxcri is a wrapper around LXC which can be used as a drop-in container runtime replacement for use by CRI-O.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;On va donc quand même avoir besoin de 3 trucs en plus sur notre serveur Proxmox pour que mon idée débile fonctionne :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;lxcri&lt;/strong&gt; comme container runtime de base niveau&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cri-o&lt;/strong&gt; comme container runtime de haut niveau&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;kubelet&lt;/strong&gt; pour piloter le runtime et communiquer avec le control plane&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="cest-parti"&gt;C&amp;rsquo;est parti
&lt;/h2&gt;&lt;p&gt;OK. lxcri s&amp;rsquo;appuie donc sur &lt;a class="link" href="https://cri-o.io/" target="_blank" rel="noopener"
&gt;cri-o&lt;/a&gt;, le container runtime de Red Hat. On commence donc par installer cri-o :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/cri-o/cri-o/blob/main/install.md" target="_blank" rel="noopener"
&gt;https://github.com/cri-o/cri-o/blob/main/install.md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note : mon serveur Proxmox VE 8 de l&amp;rsquo;époque utilisait Debian 12 comme OS de base. On devrait donc se baser là-dessus pour la variable $OS (comme l&amp;rsquo;indique la doc). Cependant, à l&amp;rsquo;heure où j&amp;rsquo;ai testé la première fois, les dépôts de CRI-O étaient en cours de migration, avec une documentation pas à jour et des releases manquantes. Le répo &lt;a class="link" href="https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o/" target="_blank" rel="noopener"
&gt;download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o&lt;/a&gt; n&amp;rsquo;avait pas le PATH Debian_12, ni la version 1.29 de Kubernetes&amp;hellip; &lt;strong&gt;J&amp;rsquo;avais BIEN ragé&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/cri-o/cri-o/issues/7657" target="_blank" rel="noopener"
&gt;https://github.com/cri-o/cri-o/issues/7657&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://kubernetes.io/blog/2023/10/10/cri-o-community-package-infrastructure/" target="_blank" rel="noopener"
&gt;https://kubernetes.io/blog/2023/10/10/cri-o-community-package-infrastructure/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On ne devrait plus avoir de soucis maintenant :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;KUBERNETES_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;v1.32
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;CRIO_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;v1.32
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# créer un répertoire pour les keyrings (il n&amp;#39;existe pas toujours sur une install fraiche)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkdir -p /usr/share/keyrings
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# répo de kubernetes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsSL https://pkgs.k8s.io/core:/stable:/&lt;span class="nv"&gt;$KUBERNETES_VERSION&lt;/span&gt;/deb/Release.key &lt;span class="p"&gt;|&lt;/span&gt; sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/&lt;/span&gt;&lt;span class="nv"&gt;$KUBERNETES_VERSION&lt;/span&gt;&lt;span class="s2"&gt;/deb/ /&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo tee /etc/apt/sources.list.d/kubernetes.list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# répo de crio&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsSL https://download.opensuse.org/repositories/isv:/cri-o:/stable:/&lt;span class="nv"&gt;$CRIO_VERSION&lt;/span&gt;/deb/Release.key &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://download.opensuse.org/repositories/isv:/cri-o:/stable:/&lt;/span&gt;&lt;span class="nv"&gt;$CRIO_VERSION&lt;/span&gt;&lt;span class="s2"&gt;/deb/ /&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo tee /etc/apt/sources.list.d/cri-o.list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install cri-o
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A partir de là, on a cri-o. On pourrait le configurer mais si on fait ça, il utilisera runc et on n&amp;rsquo;utiliserait pas LXC en tant que runtime.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ce n&amp;rsquo;est pas le but de ce hack !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est donc à ce moment là qu&amp;rsquo;on rebascule sur la documentation de lxcri :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/lxc/lxcri/blob/main/doc/setup.md" target="_blank" rel="noopener"
&gt;github.com/lxc/lxcri&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ya-pas-de-release"&gt;Ya pas de release
&lt;/h2&gt;&lt;p&gt;Et oui&amp;hellip; il faut préalablement &lt;strong&gt;builder&lt;/strong&gt; le binaire &lt;code&gt;lxcri&lt;/code&gt; et le déposer dans le /usr/local de notre serveur Proxmox VE. Il n&amp;rsquo;y a pas de binaire précompilé dans le projet, &lt;a class="link" href="https://github.com/lxc/lxcri/issues/57" target="_blank" rel="noopener"
&gt;c&amp;rsquo;est une issue ouverte juste avant qu&amp;rsquo;il ne soit abandonné 😬😬&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Et pour que ce soit encore plus fun, le processus de build passe par un Dockerfile, ce qui est rigolo puisqu&amp;rsquo;on n&amp;rsquo;a pas Docker sur notre node Proxmox&amp;hellip;&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai donc essayé de &lt;a class="link" href="https://github.com/lxc/lxcri/blob/main/README.md" target="_blank" rel="noopener"
&gt;builder lxcri&lt;/a&gt; depuis une machine avec Docker, en suivant la commande indiquée sur le GitHub. Patatra. (Déjà, il manque un &amp;ldquo;.&amp;rdquo; en fin de commande &lt;code&gt;docker build&lt;/code&gt; dans la doc) ça fail misérablement à la compilation&amp;hellip;&lt;/p&gt;
&lt;p&gt;Note : je n&amp;rsquo;ai plus l&amp;rsquo;erreur en question, probablement un problème de dépendances. C&amp;rsquo;est relou parce qu&amp;rsquo;on va devoir faire plein de choses à la main&amp;hellip; Mais ne vous embêtez pas à &lt;code&gt;git clone&lt;/code&gt;, on va partir sur un fork (d&amp;rsquo;un fork).&lt;/p&gt;
&lt;p&gt;En allant jeter un œil au Dockerfile, on se rend vite compte qu&amp;rsquo;on ne fait que lancer un script (install.sh)&amp;hellip;&lt;/p&gt;
&lt;p&gt;Quand on appelle Docker avec le buildarg &lt;code&gt;installcmd=install_runtime&lt;/code&gt;, on lance la fonction &lt;code&gt;install_runtime&lt;/code&gt;, qui appelle &lt;code&gt;install_runtime_noclean&lt;/code&gt;, qui lance &lt;code&gt;add_lxc&lt;/code&gt; puis &lt;code&gt;add_lxcri&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Je veux juste compiler &lt;strong&gt;lxc&lt;/strong&gt; (pour les bindings) et &lt;strong&gt;lxcri&lt;/strong&gt;. Je vais donc le faire à la main. Pour ça, il faut golang 1.16 (ça date&amp;hellip;).&lt;/p&gt;
&lt;p&gt;Il y a pas mal de code pété un peu partout et plusieurs issues ouvertes dans lesquelles les mainteneurs conseillent de partir sur un fork :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/drachenfels-de/lxcri" target="_blank" rel="noopener"
&gt;https://github.com/drachenfels-de/lxcri&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J&amp;rsquo;ai passé pas mal de temps à le débugger, et au final j&amp;rsquo;ai fait mon propre fork (&lt;a class="link" href="https://github.com/zwindler/lxcri%29" target="_blank" rel="noopener"
&gt;https://github.com/zwindler/lxcri)&lt;/a&gt;, qui nécessite golang 1.22+ et qui ajoute un gros paquet de fixes.&lt;/p&gt;
&lt;h2 id="prérequis-pour-builder-lxcri"&gt;Prérequis pour builder lxcri
&lt;/h2&gt;&lt;p&gt;On va installer un paquet de trucs :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt update
sudo apt install curl git meson pkg-config cmake libdbus-1-dev docbook2x
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On installe Golang si on ne l&amp;rsquo;a pas (peu de chance que vous ayez Golang sur un node Proxmox VE) :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://go.dev/dl/go1.25.4.linux-amd64.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo rm -rf /usr/local/go &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo tar -C /usr/local -xzf go1.25.4.linux-amd64.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;:/usr/local/go/bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; go version go1.25.4 linux/amd64
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Je vais aussi devoir &lt;strong&gt;récupérer et compiler lxc&lt;/strong&gt;. Pendant un moment, j&amp;rsquo;étais bloqué sur la version 4.0.12 (très précisément) car la 4.0.6 qu&amp;rsquo;on trouve sur Debian 11 ne fonctionne &lt;strong&gt;pas&lt;/strong&gt; avec le code de lxcri (j&amp;rsquo;ai mangé plein de bugs).&lt;/p&gt;
&lt;p&gt;Mais la bonne nouvelle, c&amp;rsquo;est que comme je suis un try-harder de l&amp;rsquo;espace, à force de fixes sur mon fork, celui-ci fonctionne avec la dernière version de lxc (6.x), ce qui tombe bien parce que c&amp;rsquo;est la version sur mon Proxmox VE 9 à jour.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/lxc/lxc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; lxc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;meson setup -Dprefix&lt;span class="o"&gt;=&lt;/span&gt;/usr -Dsystemd-unitdir&lt;span class="o"&gt;=&lt;/span&gt;PATH build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Build targets in project: &lt;span class="m"&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; lxc 6.0.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; User defined options
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; prefix : /usr
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; systemd-unitdir: PATH
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Found ninja-1.12.1 at /usr/bin/ninja
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;meson compile -C build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; INFO: autodetecting backend as ninja
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; INFO: calculating backend &lt;span class="nb"&gt;command&lt;/span&gt; to run: /usr/bin/ninja -C /root/lxc/build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ninja: Entering directory &lt;span class="sb"&gt;`&lt;/span&gt;/root/lxc/build&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;544/544&lt;span class="o"&gt;]&lt;/span&gt; Linking target src/lxc/tools/lxc-monitor
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ça a buildé plein de trucs, c&amp;rsquo;est cool. Mais les fichiers qui m&amp;rsquo;intéressent sont ici :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find . -name &lt;span class="s2"&gt;&amp;#34;lxc.pc&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./build/meson-private/lxc.pc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls build/*lxc*
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;build/liblxc.so build/liblxc.so.1 build/liblxc.so.1.8.0 build/lxc.spec
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;build/liblxc.so.1.8.0.p:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;liblxc.so.1.8.0.symbols
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Je mets ça aux bons endroits dans mon Proxmox VE avec un :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo make install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ldconfig
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="builder-comme-jamais"&gt;Builder comme jamais
&lt;/h2&gt;&lt;p&gt;Ok, c&amp;rsquo;est parti pour jouer &lt;strong&gt;avec mon fork&lt;/strong&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/zwindler/lxcri.git lxcri.zwindler
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; lxcri.zwindler
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; go build -ldflags &lt;span class="s1"&gt;&amp;#39;-X main.version=8805687-dirty -X github.com/lxc/lxcri.defaultLibexecDir=/usr/local/libexec/lxcri&amp;#39;&lt;/span&gt; -o lxcri ./cmd/lxcri
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cc -Werror -Wpedantic -o lxcri-start cmd/lxcri-start/lxcri-start.c &lt;span class="k"&gt;$(&lt;/span&gt;pkg-config --libs --cflags lxc&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;CGO_ENABLED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; go build -o lxcri-init ./cmd/lxcri-init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# this is paranoia - but ensure it is statically compiled&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ! ldd lxcri-init 2&amp;gt;/dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; go build -o lxcri-hook ./cmd/lxcri-hook
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; go build -o lxcri-hook-builtin ./cmd/lxcri-hook-builtin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -alrt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total &lt;span class="m"&gt;15288&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;...&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -rwxr-xr-x &lt;span class="m"&gt;1&lt;/span&gt; debian debian &lt;span class="m"&gt;7108288&lt;/span&gt; Nov &lt;span class="m"&gt;16&lt;/span&gt; 20:06 lxcri
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -rwxr-xr-x &lt;span class="m"&gt;1&lt;/span&gt; debian debian &lt;span class="m"&gt;17520&lt;/span&gt; Nov &lt;span class="m"&gt;16&lt;/span&gt; 20:06 lxcri-start
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -rwxr-xr-x &lt;span class="m"&gt;1&lt;/span&gt; debian debian &lt;span class="m"&gt;2942584&lt;/span&gt; Nov &lt;span class="m"&gt;16&lt;/span&gt; 20:06 lxcri-init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -rwxr-xr-x &lt;span class="m"&gt;1&lt;/span&gt; debian debian &lt;span class="m"&gt;2834743&lt;/span&gt; Nov &lt;span class="m"&gt;16&lt;/span&gt; 20:06 lxcri-hook
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -rwxr-xr-x &lt;span class="m"&gt;1&lt;/span&gt; debian debian &lt;span class="m"&gt;2519097&lt;/span&gt; Nov &lt;span class="m"&gt;16&lt;/span&gt; 20:06 lxcri-hook-builtin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si on était sur une machine de dev, on pourrait envoyer les binaires sur le serveur Proxmox VE (lxcri dans /usr/local/bin, le reste dans /usr/local/libexec/lxcri).&lt;/p&gt;
&lt;p&gt;Dans mon cas, je suis directement sur la machine qui build et qui run, je fais donc :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo make install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mkdir -p /usr/local/bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cp -v lxcri /usr/local/bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;lxcri&amp;#39;&lt;/span&gt; -&amp;gt; &lt;span class="s1"&gt;&amp;#39;/usr/local/bin/lxcri&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mkdir -p /usr/local/libexec/lxcri
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cp -v lxcri-start lxcri-init lxcri-hook lxcri-hook-builtin /usr/local/libexec/lxcri
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;lxcri-start&amp;#39;&lt;/span&gt; -&amp;gt; &lt;span class="s1"&gt;&amp;#39;/usr/local/libexec/lxcri/lxcri-start&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;lxcri-init&amp;#39;&lt;/span&gt; -&amp;gt; &lt;span class="s1"&gt;&amp;#39;/usr/local/libexec/lxcri/lxcri-init&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;lxcri-hook&amp;#39;&lt;/span&gt; -&amp;gt; &lt;span class="s1"&gt;&amp;#39;/usr/local/libexec/lxcri/lxcri-hook&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;lxcri-hook-builtin&amp;#39;&lt;/span&gt; -&amp;gt; &lt;span class="s1"&gt;&amp;#39;/usr/local/libexec/lxcri/lxcri-hook-builtin&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;et on peut continuer :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ /usr/local/bin/lxcri &lt;span class="nb"&gt;help&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; lxcri - lxcri is a OCI compliant runtime wrapper &lt;span class="k"&gt;for&lt;/span&gt; lxc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;USAGE:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; lxcri &lt;span class="o"&gt;[&lt;/span&gt;global options&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;command&lt;/span&gt; options&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;arguments...&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;VERSION:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;8805687&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;...&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="on-reprend-crio"&gt;On reprend crio
&lt;/h2&gt;&lt;p&gt;Ok, on a buildé lxcri et on a toutes les dépendances pour l&amp;rsquo;utiliser. On peut donc repartir sur la doc officielle de lxcri &amp;ldquo;&lt;a class="link" href="https://github.com/lxc/lxcri/blob/main/doc/setup.md" target="_blank" rel="noopener"
&gt;setup.md&lt;/a&gt;&amp;rdquo; dans l&amp;rsquo;idée de configurer CRI-O, pour qu&amp;rsquo;il n&amp;rsquo;utilise pas runc, &lt;strong&gt;uniquement lxcri&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tee /etc/crio/crio.conf.d/10-crio.conf &amp;gt; /dev/null &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[crio.image]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;signature_policy = &amp;#34;/etc/crio/policy.json&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[crio.runtime]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;default_runtime = &amp;#34;lxcri&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[crio.runtime.runtimes.lxcri]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;runtime_path = &amp;#34;/usr/local/bin/lxcri&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;runtime_type = &amp;#34;oci&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;runtime_root = &amp;#34;/var/lib/lxc&amp;#34; #proxmox lxc folder
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;inherit_default_runtime = false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;runtime_config_path = &amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;container_min_memory = &amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;monitor_path = &amp;#34;/usr/libexec/crio/conmon&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;monitor_cgroup = &amp;#34;system.slice&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;monitor_exec_cgroup = &amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;privileged_without_host_devices = false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A noter, la doc d&amp;rsquo;installation &lt;code&gt;setup.md&lt;/code&gt; nous dit générer une conf propre avec le binaire crio et la commande config, mais ça ne marche pas vraiment et on se retrouve à lancer runc ou crun sans le vouloir. J&amp;rsquo;écrase tout, c&amp;rsquo;est plus simple.&lt;/p&gt;
&lt;p&gt;Et maintenant, on peut lancer crio :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; crio &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo systemctl start crio
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A partir de là, on a un serveur disposant d&amp;rsquo;un CRI &lt;em&gt;a priori&lt;/em&gt; fonctionnel.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl status crio
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;● crio.service - Container Runtime Interface &lt;span class="k"&gt;for&lt;/span&gt; OCI &lt;span class="o"&gt;(&lt;/span&gt;CRI-O&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Loaded: loaded &lt;span class="o"&gt;(&lt;/span&gt;/lib/systemd/system/crio.service&lt;span class="p"&gt;;&lt;/span&gt; enabled&lt;span class="p"&gt;;&lt;/span&gt; vendor preset: enabled&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Active: active &lt;span class="o"&gt;(&lt;/span&gt;running&lt;span class="o"&gt;)&lt;/span&gt; since Mon 2025-11-17 12:02:37 UTC&lt;span class="p"&gt;;&lt;/span&gt; 12s ago
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;journalctl -u crio
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Nov &lt;span class="m"&gt;17&lt;/span&gt; 20:29:43 instance-2025-11-16-15-31-55 systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Starting Container Runtime Interface &lt;span class="k"&gt;for&lt;/span&gt; OCI &lt;span class="o"&gt;(&lt;/span&gt;CRI-O&lt;span class="o"&gt;)&lt;/span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;...&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Nov &lt;span class="m"&gt;17&lt;/span&gt; 20:29:43 instance-2025-11-16-15-31-55 crio&lt;span class="o"&gt;[&lt;/span&gt;11906&lt;span class="o"&gt;]&lt;/span&gt;: &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2025-11-17T20:29:43.61758425Z&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;info &lt;span class="nv"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Using runtime handler lxcri version 8805687&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Yeeees :D&lt;/p&gt;
&lt;p&gt;On peut donc installer kubelet, puis l&amp;rsquo;ajouter à un cluster Kubernetes existant&lt;/p&gt;
&lt;h2 id="fast-forward"&gt;Fast forward
&lt;/h2&gt;&lt;p&gt;J&amp;rsquo;avais la flemme de monter un cluster propre avec &lt;a class="link" href="https://blog.zwindler.fr/2023/12/17/kubeadmcfg-introduction-api-kubeadm/" target="_blank" rel="noopener"
&gt;kubeadm ou autre, et d&amp;rsquo;enrôler ensuite un node à la main avec le token+sha&lt;/a&gt;. J&amp;rsquo;aurais aussi pu rejouer avec mon PoC rigolo des &lt;a class="link" href="https://blog.zwindler.fr/2025/07/20/kubernetes-sur-clever-cloud-linux/" target="_blank" rel="noopener"
&gt;workers &amp;ldquo;linux&amp;rdquo; de Clever Cloud pour créer un control plane&lt;/a&gt; chez Clever, puis enrôler à la main avec le node bootstrap token (j&amp;rsquo;ai fait les choses plutôt bien dans ce PoC).&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai donc rejoué à l&amp;rsquo;arrache avec mon projet &lt;a class="link" href="https://github.com/zwindler/demystifions-kubernetes/tree/main" target="_blank" rel="noopener"
&gt;demystifions-kubernetes&lt;/a&gt;, qui permet de monter un cluster mono node à la main en lançant juste des binaires.&lt;/p&gt;
&lt;p&gt;Une fois le control plane bootstrapé (etcd, api-server, controller-manager, scheduler), on s&amp;rsquo;arrête AVANT la partie containerd (on a déjà configuré CRI-O) et on lance le kubelet à la main :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo bin/kubelet --kubeconfig admin.conf --container-runtime-endpoint --container-runtime-endpoint=unix:///var/run/crio/crio.sock --fail-swap-on=false --cgroup-driver=&amp;#34;systemd&amp;#34;
[...]
I1117 13:41:58.741561 88434 kubelet_node_status.go:78] &amp;#34;Successfully registered node&amp;#34; node=&amp;#34;instance-2025-11-16-15-31-55&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On progresse ! Essayons de voir l&amp;rsquo;état de santé du cluster et de déployer un pod :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;KUBECONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl get nodes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; NAME STATUS ROLES AGE VERSION
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; instance-2025-11-16-15-31-55 Ready &amp;lt;none&amp;gt; 13m v1.34.2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl create deployment web --image&lt;span class="o"&gt;=&lt;/span&gt;zwindler/vhelloworld
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; deployment.apps/web created
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl get pods
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; web-6c8cc48c68-cdbtj 1/1 Running &lt;span class="m"&gt;0&lt;/span&gt; 4m17s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl logs web-6c8cc48c68-cdbtj
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;Vweb&lt;span class="o"&gt;]&lt;/span&gt; Running app on http://localhost:8081/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;Vweb&lt;span class="o"&gt;]&lt;/span&gt; We have &lt;span class="m"&gt;3&lt;/span&gt; workers
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Great success!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;A partir de là, CRI-O partage le moteur LXC de Proxmox VE de manière fonctionnelle.&lt;/p&gt;
&lt;p&gt;Pour s&amp;rsquo;en convaincre, on peut lancer la commande lxc-ls, qui nous affichera un mix de &amp;ldquo;vrais&amp;rdquo; containers LXC (créés avec Proxmox, les 151 et 200) et de containers de pods (les STOPPED sont les init containers de cilium) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ lxc-ls -f
NAME STATE AUTOSTART GROUPS IPV4 IPV6 UNPRIVILEGED
151 STOPPED 0 - - - true
200 STOPPED 0 - - - true
3045d1f3abcc069b1009acc869a27b09cf9531d0701a3f9d5a760213d57c7b20 STOPPED 0 - - - false
78057100e5d0613944c2be859dfd09f790eeba88bceebea0e04970841c9bd950 RUNNING 0 - 10.0.0.90 - false
8e5506beea9a50214c46f31fa7fa6d04397963cb912aa397261359865d40a0cd RUNNING 0 - 10.0.0.167, 10.244.0.1, 203.0.113.42, 192.168.1.10 2001:db8::1 false
abdcd5be0a27417aa9e11cc2b27882bc86a63d94f547f909332ca7470a5e075a STOPPED 0 - - - false
aeaed9c2f56328bb6196ede4a78f06c4bb2d3edf5dca7912cf38407b9bf6610a STOPPED 0 - - - false
ed9aaf5a0fd4b11be121296290472d6d71d9016e4c6bb0d05fb2e4a7f4b7a85d RUNNING 0 - 10.0.0.167, 10.244.0.1, 203.0.113.42, 192.168.1.10 2001:db8::1 false
edb9d42e35a4029cfec5bed5597746bdf67fbe438f21446230252265ed1c849d STOPPED 0 - - - false
$ ps -ef |grep ed9aaf5a0fd4b11be121296290472d6d71d9016e4c6bb0d05fb2e4a7f4b7a85d
root 2674943 1 0 22:32 ? 00:00:00 /usr/libexec/crio/conmon -b /run/containers/storage/overlay-containers/ed9aaf5a0fd4b11be121296290472d6d71d9016e4c6bb0d05fb2e4a7f4b7a85d/userdata -c ed9aaf5a0fd4b11be121296290472d6d71d9016e4c6bb0d05fb2e4a7f4b7a85d --exit-dir /var/run/crio/exits -l /var/log/pods/kube-system_cilium-operator-56d6cd6767-dps78_6082ea2d-331e-4262-b8b3-d3f88eb4e446/cilium-operator/1.log --log-level info -n k8s_cilium-operator_cilium-operator-56d6cd6767-dps78_kube-system_6082ea2d-331e-4262-b8b3-d3f88eb4e446_1 -P /run/containers/storage/overlay-containers/ed9aaf5a0fd4b11be121296290472d6d71d9016e4c6bb0d05fb2e4a7f4b7a85d/userdata/conmon-pidfile -p /run/containers/storage/overlay-containers/ed9aaf5a0fd4b11be121296290472d6d71d9016e4c6bb0d05fb2e4a7f4b7a85d/userdata/pidfile --persist-dir /var/lib/containers/storage/overlay-containers/ed9aaf5a0fd4b11be121296290472d6d71d9016e4c6bb0d05fb2e4a7f4b7a85d/userdata -r /usr/local/bin/lxcri --runtime-arg --root=/var/lib/lxc --socket-dir-path /var/run/crio --syslog -u ed9aaf5a0fd4b11be121296290472d6d71d9016e4c6bb0d05fb2e4a7f4b7a85d -s
root 2674951 2674943 0 22:32 ? 00:00:00 /usr/local/libexec/lxcri/lxcri-start ed9aaf5a0fd4b11be121296290472d6d71d9016e4c6bb0d05fb2e4a7f4b7a85d /var/lib/lxc /var/lib/lxc/ed9aaf5a0fd4b11be121296290472d6d71d9016e4c6bb0d05fb2e4a7f4b7a85d/config
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Rien ne nous empêcherait ensuite de pousser le vice, et de faire un petit script qui récupère toutes les informations des containers, et crée les fichiers &lt;code&gt;/etc/pve/lxc/xxx.conf&lt;/code&gt; associés de manière à les afficher dans l&amp;rsquo;UI, comme je l&amp;rsquo;avais fait dans l&amp;rsquo;article :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2022/11/07/containers-docker-dans-proxmox-avec-lxc/" target="_blank" rel="noopener"
&gt;Lancer des containers Docker avec Proxmox VE (et LXC)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En théorie, si cette étape avait du sens, je pourrais créer les releases moi-même sur mon fork pour faciliter l&amp;rsquo;installation.&lt;/p&gt;
&lt;p&gt;Enfin, je pourrais essayer de contribuer mes modifications pour que tout soit mergé sur le projet principal, à ceci près que &lt;a class="link" href="https://github.com/lxc/lxcri/issues/67#issuecomment-2055724867" target="_blank" rel="noopener"
&gt;les mainteneurs refusent les PRs car le projet n&amp;rsquo;est plus maintenu&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Mais j&amp;rsquo;avoue qu&amp;rsquo;après probablement une quinzaine d&amp;rsquo;heures de debug, de Golang, de compilation C, réparties sur 2 ans, j&amp;rsquo;ai un peu été au bout de ma patience pour cette &amp;ldquo;blague&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;OK, c&amp;rsquo;était débile, maintenant que j&amp;rsquo;ai réussi, dodo X_X.&lt;/p&gt;</description></item><item><title>Lancer des containers Docker avec Proxmox VE (et LXC)</title><link>https://blog.zwindler.fr/2022/11/07/containers-docker-dans-proxmox-avec-lxc/</link><pubDate>Mon, 07 Nov 2022 06:30:00 +0200</pubDate><guid>https://blog.zwindler.fr/2022/11/07/containers-docker-dans-proxmox-avec-lxc/</guid><description>&lt;img src="https://blog.zwindler.fr/2019/10/proxmox.webp" alt="Featured image of post Lancer des containers Docker avec Proxmox VE (et LXC)" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;J&amp;rsquo;ai trouvé plusieurs tutos pour installer Docker (engine) &lt;strong&gt;à l&amp;rsquo;intérieur&lt;/strong&gt; d&amp;rsquo;un container LXC sous Proxmox VE pour ensuite lancer des containers Docker dedans. Le souci c&amp;rsquo;est que vous devez vous logger &lt;strong&gt;dans&lt;/strong&gt; le container LXC avant de pouvoir interagir avec vos containers Docker.&lt;/p&gt;
&lt;p&gt;On peut aussi installer Docker directement sur Proxmox VE mais ce n&amp;rsquo;est pas trop conseillé et on n&amp;rsquo;a pas la facilité d&amp;rsquo;usage de LXC avec la GUI de Proxmox.&lt;/p&gt;
&lt;p&gt;Et en fait, il se trouve qu&amp;rsquo;on peut lancer des images Docker &lt;strong&gt;comme l&amp;rsquo;OS&lt;/strong&gt; d&amp;rsquo;un container LXC et ainsi avoir des Docker pilotés par Proxmox. On aura donc pas un comportement 100% identique à si vous aviez fait un &lt;code&gt;docker run&lt;/code&gt; sur votre machine.&lt;/p&gt;
&lt;p&gt;Cependant, on gagnera un échange un container totalement identique à vos autres containers LXC de votre cluster (avec toutes les fonctions associées) mais lancé avec une image Docker.&lt;/p&gt;
&lt;p&gt;Mais d&amp;rsquo;abord je vous propose de revenir un peu en arrière avant de vous montrer comment&amp;hellip;&lt;/p&gt;
&lt;h2 id="contexte"&gt;Contexte
&lt;/h2&gt;&lt;p&gt;Vous le savez, je fais du Proxmox VE depuis un moment. Proxmox VE est une super distribution clé en main et production ready de virtualisation de serveurs (c&amp;rsquo;est même de l&amp;rsquo;hyperconvergé si on active la partie Ceph).&lt;/p&gt;
&lt;p&gt;Il y a plein de petites choses que j&amp;rsquo;aime avec Proxmox VE, et l&amp;rsquo;une d&amp;rsquo;elle est qu&amp;rsquo;on peut créer des containers Linux avec LXC plutôt que des machines virtuelles QEMU. &lt;a class="link" href="https://blog.zwindler.fr/2022/10/22/proxmox-tips-tricks/" &gt;J&amp;rsquo;avais fait un article pour en parler&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A l&amp;rsquo;usage (sauf paramétrage kernel spécifique) le container LXC se comporte de manière strictement identique à une VM dans Proxmox, mais pour une fraction des ressources ! On a un OS, on installe des applications dessus, comme une VM.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/11/nginx.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Un frontal nginx pour plusieurs applications. Le container LXC complet ne consomme que quelques Mo&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Certes c&amp;rsquo;est beaucoup moins bien isolé qu&amp;rsquo;une vraie VM (car c&amp;rsquo;est un container, on est isolé des autres processus, mais on tourne sur le kernel de l&amp;rsquo;hyperviseur directement).&lt;/p&gt;
&lt;p&gt;Mais avec si peu de besoins en ressources, je peux héberger de nombreuses petites applications dans des contextes différents avec de très petites machines physiques (des Atom 4Go de RAM à 6€ par mois chez OneProviders) ce qui serait impossible avec une vraie VM.&lt;/p&gt;
&lt;h2 id="cest-bien-mais-pas-suffisant"&gt;C&amp;rsquo;est bien, mais pas suffisant
&lt;/h2&gt;&lt;p&gt;Cependant, LXC n&amp;rsquo;est pas la techno de containerisation la plus connue/hype. Depuis des années sur le forum, à chaque fois que des gens demande le support de Docker dans Proxmox VE, on les envoie balader. Pas toujours très gentiment d&amp;rsquo;ailleurs&amp;hellip;&lt;/p&gt;
&lt;p&gt;Pourtant, il y a plusieurs raisons pour avoir envie de lancer des containers Docker sur son infra Proxmox :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;D&amp;rsquo;abord, Docker n&amp;rsquo;est pas autant des workloads stateless et/ou éphémères qu&amp;rsquo;on le croit. Beaucoup d&amp;rsquo;applications containerisées auraient toute leur place sur un cluster de virtualisation.&lt;/li&gt;
&lt;li&gt;Ensuite parce que beaucoup d&amp;rsquo;éditeurs de logiciels sont devenus faignants. Certains ne gèrent plus les processus d&amp;rsquo;installation (ou alors juste sur un OS) et fournissent juste une image Docker qu&amp;rsquo;ils maintiennent mise à jour.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On doit donc se contenter de VMs dans Proxmox pour lancer des containers Docker (cf mon point du début).&lt;/p&gt;
&lt;h2 id="lxc-supporte-les-images-oci"&gt;LXC supporte les images OCI
&lt;/h2&gt;&lt;p&gt;Coup de théâtre. Il y a quelques jours, j&amp;rsquo;ai découvert que LXC, le moteur de containerisation de Proxmox VE, était compatible avec le format OCI.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.buzzwrd.me/index.php/2021/03/10/creating-lxc-containers-from-docker-and-oci-images/" target="_blank" rel="noopener"
&gt;buzzwrd.me - Creating LXC containers from docker and OCI images&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour ceux qui ne connaissent pas OCI, il s&amp;rsquo;agit d&amp;rsquo;une organisation visant à créer un standard pour unifie la façon de stocker les containers.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Open Container Initiative is an open governance structure for the express purpose of creating open industry standards around container formats and runtimes.
&lt;a class="link" href="https://opencontainers.org/" target="_blank" rel="noopener"
&gt;opencontainers.org/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Et Docker respecte ce format : on peut donc théoriquement lancer depuis LXC des containers dont l&amp;rsquo;image de base est une image Docker.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Je suis profondément choqué
(Réf &amp;ldquo;Jean François Coppé&amp;rdquo; pour ceux qui n&amp;rsquo;ont pas le mème)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="bon-quand-est-ce-quon-commence-"&gt;Bon, quand est-ce qu&amp;rsquo;on commence ?
&lt;/h2&gt;&lt;p&gt;Disclaimer: ce qui suit est de la bidouille. Rien n&amp;rsquo;est supporté et je ne le conseille pas en production. Il est probable qu&amp;rsquo;il y ait aussi des limitations (notamment pour ce qui est stockage).&lt;/p&gt;
&lt;p&gt;D&amp;rsquo;abord, il manque quelques dépendances pour que la fonction OCI de LXC soit utilisable sous Proxmox VE :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt install skopeo umoci jq
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ensuite, par défaut, les containers LXC s&amp;rsquo;attachent à un bridge linux qui s&amp;rsquo;appelle &lt;code&gt;lxcbr0&lt;/code&gt;. Cependant ce bridge n&amp;rsquo;existe probablement pas sur votre installation de Proxmox VE (pas installé par défaut).&lt;/p&gt;
&lt;p&gt;En &lt;em&gt;quick and dirty&lt;/em&gt;, on peut juste remplacer le nom par défaut, même si idéalement il faudrait trouver le flag dans la CLI pour changer le bridge. En fonction de comment vous avez configuré le réseau dans votre serveur Proxmox VE, vous allez probablement utiliser &lt;code&gt;vmbr0&lt;/code&gt; ou &lt;code&gt;vmbr1&lt;/code&gt; :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sed -i &amp;#39;s/lxcbr0/vmbr1/g&amp;#39; /etc/lxc/default.conf
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Maintenant qu&amp;rsquo;on a tout, on peut lancer nos containers LXC à partir d&amp;rsquo;images docker. Ici je lance l&amp;rsquo;image officielle &lt;code&gt;alpine:latest&lt;/code&gt;, mais j&amp;rsquo;aurais pu prendre n&amp;rsquo;importe quelle autre :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;lxc-create 500 -t oci -- --url docker://alpine:latest
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;J&amp;rsquo;ai créé un container appelé &amp;ldquo;500&amp;rdquo; (car les VMs et les containers LXC dans proxmox VE sont appelés avec des nombres). L&amp;rsquo;image est téléchargée puis le container créé :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/11/lxc_docker_pull.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On peut maintenant le démarrer (avec &lt;code&gt;lxc-execute&lt;/code&gt; on lance le container et ouvrir un prompt directement dedans, mais on a aussi &lt;code&gt;lxc-start&lt;/code&gt; et &lt;code&gt;lxc-attach&lt;/code&gt;)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;lxc-execute 500
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/11/alpine.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Tel quel, Proxmox VE ne sait pas que notre container existe et il n&amp;rsquo;apparaitra pas dans l&amp;rsquo;UI. Mais ça fonctionne ;-).&lt;/p&gt;
&lt;h2 id="bonus"&gt;Bonus
&lt;/h2&gt;&lt;p&gt;On peut même tricher et faire croire à Proxmox que c&amp;rsquo;est un container LXC qu&amp;rsquo;il a créé lui-même en créant un fichier &lt;code&gt;500.conf&lt;/code&gt;, dans le dossier &lt;code&gt;/etc/pve/lxc/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Les seules lignes obligatoires sont les suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;arch (amd64 sauf si vous êtes sur ARM)&lt;/li&gt;
&lt;li&gt;cores (la limite de CPUs à imposer au container)&lt;/li&gt;
&lt;li&gt;hostname&lt;/li&gt;
&lt;li&gt;memory (la limite de RAM à imposer au container)&lt;/li&gt;
&lt;li&gt;ostype&lt;/li&gt;
&lt;li&gt;rootfs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/11/lxc_config.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Une fois le fichier créé, automatiquement le container apparait dans la liste des VMs de l&amp;rsquo;hôte. On peut le démarrer et ça fonctionne :)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/11/docker_lxc_running.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Le container pourra être démarré, arrêté, etc. Le tout depuis la GUI de Proxmox VE :)&lt;/p&gt;
&lt;p&gt;Have fun!&lt;/p&gt;
&lt;h2 id="source"&gt;Source
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://pve.proxmox.com/wiki/Linux_Container" target="_blank" rel="noopener"
&gt;Proxmox VE - Linux Container&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://thehomelab.wiki/books/promox-ve/page/setup-and-install-docker-in-a-promox-7-lxc-conainer" target="_blank" rel="noopener"
&gt;Setup and Install Docker in a Promox 7 LXC Conainer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.buzzwrd.me/index.php/2021/03/10/creating-lxc-containers-from-docker-and-oci-images/" target="_blank" rel="noopener"
&gt;buzzwrd.me - Creating LXC containers from docker and OCI images&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Migrer une VM de Proxmox VE vers XCP NG</title><link>https://blog.zwindler.fr/2022/07/24/migrer-une-vm-de-proxmoxve-vers-xcp-ng/</link><pubDate>Sun, 24 Jul 2022 12:00:00 +0000</pubDate><guid>https://blog.zwindler.fr/2022/07/24/migrer-une-vm-de-proxmoxve-vers-xcp-ng/</guid><description>&lt;img src="https://blog.zwindler.fr/2022/07/pve-to-xcpng.webp" alt="Featured image of post Migrer une VM de Proxmox VE vers XCP NG" /&gt;&lt;h2 id="retour-de-la-virtualisation"&gt;Retour de la virtualisation
&lt;/h2&gt;&lt;p&gt;Ca fait quelques mois que je n&amp;rsquo;ai pas parlé de virtualisation donc forcément, ça me démange un peu ;).&lt;/p&gt;
&lt;p&gt;Si vous suivez ce blog depuis quelque temps, vous savez &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=proxmox" target="_blank" rel="noopener"
&gt;pourtant que j&amp;rsquo;ai pas mal roulé ma bosse avec Proxmox VE&lt;/a&gt;, un OS clé en main de virtualisation KVM (mais aussi de containerisation LXC, on en parle tellement peu). Sans aller jusqu&amp;rsquo;à dire que j&amp;rsquo;en ai fait le tour (a-t-on jamais fait le tour d&amp;rsquo;une techno ?), je commence à manquer de choses à tester avec mon lab perso.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;an dernier, j&amp;rsquo;ai discuté avec les équipes de &lt;a class="link" href="https://vates.fr/" target="_blank" rel="noopener"
&gt;Vates SAS&lt;/a&gt; à &lt;a class="link" href="https://blog.zwindler.fr/2021/11/10/open-source-experience-2021-recap/" &gt;OSXP 2021&lt;/a&gt;, une boite qui publie une autre distribution open source dédiée à la virtualisation : &lt;a class="link" href="https://xcp-ng.org/" target="_blank" rel="noopener"
&gt;XCP-NG&lt;/a&gt; (mais basée sur XenServer).&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;en avais déjà entendu parler sur Twitter (coucou Cécile) donc j&amp;rsquo;étais un peu curieux. Mais j&amp;rsquo;étais aussi un peu sceptique, &lt;a class="link" href="https://blog.zwindler.fr/2011/02/15/creation-dun-template-centos-5-5-pour-xenserver-5-6/" &gt;ma dernière expérience de XenServer datant de 2011&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/07/ataxya_xcp-ng.avif"
loading="lazy"
alt="Cécile (Ataxya Network) tweetant en 2021 qu’elle testait XCP NG"
&gt;&lt;/p&gt;
&lt;p&gt;Dans cet article, je ne vais pas rentrer dans une comparaison des fonctionnalités ni des avantages et inconvénients de XCP-NG par rapport à Proxmox VE. Je n&amp;rsquo;ai pas encore assez testé pour me faire une idée pertinente (ça viendra).&lt;/p&gt;
&lt;p&gt;En revanche, je peux vous donner un premier avant goût de la solution via un petit tuto pour vous aider à migrer des VMs de l&amp;rsquo;un à l&amp;rsquo;autre, si jamais l&amp;rsquo;envie vous prend de tester.&lt;/p&gt;
&lt;h2 id="prérequis"&gt;Prérequis
&lt;/h2&gt;&lt;p&gt;Dans ce tutoriel, je pars du principe que vous avez :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;d&amp;rsquo;un côté, une machine virtuelle QEMU, hébergée par un Proxmox VE, à copier/migrer&lt;/li&gt;
&lt;li&gt;de l&amp;rsquo;autre, un serveur sous XCP-NG, dans le même LAN, gérée par &lt;a class="link" href="https://xen-orchestra.com/?gclid=Cj0KCQjwuO6WBhDLARIsAIdeyDJ5Bd1q445B3W7jxWuy_culllyw-WqnU5yu7BhAD9KgOeXoykv_o4gaArRqEALw_wcB#!/xo-home" target="_blank" rel="noopener"
&gt;XenOrchestra&lt;/a&gt; (l&amp;rsquo;équivalent du &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=vcenter" target="_blank" rel="noopener"
&gt;vCenter&lt;/a&gt; de VMware, pour ceux à qui ça parle)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note: sauf erreur de ma part, on a pas de solution clé en main pour migrer un container LXC vers XCP-NG (même si XenServer gère les containers Xen, aussi appelé virtualisation PV). Trouver comment migrer ces workloads LXC sera peut-être l&amp;rsquo;objet d&amp;rsquo;un prochain article.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/07/lxc-to-xcpng.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Pour le reste du tutoriel, on va grosso modo suivre &lt;a class="link" href="https://xcp-ng.org/docs/migratetoxcpng.html#from-kvm-libvirt" target="_blank" rel="noopener"
&gt;la documentation officielle disponible ici&lt;/a&gt;, mais avec quelques modifs et surtout un peu plus de détails.&lt;/p&gt;
&lt;h2 id="option-zfs"&gt;Option ZFS
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; J&amp;rsquo;installe mes serveurs Proxmox VE avec ZFS comme stockage. Ca a plein d&amp;rsquo;avantages, notamment celui de me donner la possibilité de faire, à peu de frais, un PRA avec une réplication asynchrone des machines virtuelles de mon cluster. Cela induit par contre une petite difficulté complémentaire (vous allez voir c&amp;rsquo;est léger). &lt;strong&gt;Vous pouvez sauter cette étape si vous n&amp;rsquo;utilisez pas ZFS.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour rappel (je ferai aussi un article dédié à ça), avec ZFS j&amp;rsquo;ai 2 types de disques.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;#&lt;/span&gt; zfs list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;NAME USED AVAIL REFER MOUNTPOINT
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;rpool 213G 15.9G 112K /rpool
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;rpool/ROOT 6.32G 15.9G 96K /rpool/ROOT
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;rpool/ROOT/pve-1 6.32G 15.9G 6.32G /
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;rpool/data 2.84G 15.9G 2.84G /rpool/data
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;rpool/subvol-201-disk-0 3.43G 4.57G 3.43G /rpool/subvol-201-disk-0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;rpool/subvol-301-disk-0 604M 15.9G 604M /rpool/subvol-301-disk-0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;rpool/vm-100-disk-0 3.79G 15.9G 3.79G -
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;rpool/vm-213-disk-0 184G 148G 38.2G -
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Des disques de type &amp;ldquo;Filesystem&amp;rdquo; qui sont directement montés à la racine de mon espace de stockage ZFS (chez moi /rpool, mais on a aussi &lt;code&gt;/tank&lt;/code&gt; comme convention chez les aficionados de ZFS) pour les containers LXC.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;#&lt;/span&gt; zfs get &lt;span class="nb"&gt;type&lt;/span&gt; rpool/subvol-301-disk-0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;NAME PROPERTY VALUE SOURCE
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;rpool/subvol-301-disk-0 type filesystem -
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;#&lt;/span&gt; zfs get mountpoint rpool/subvol-301-disk-0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;NAME PROPERTY VALUE SOURCE
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;rpool/subvol-301-disk-0 mountpoint /rpool/subvol-301-disk-0 default
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour les VMs KVM/QEMU en revanche, je ne peux pas directement trouver un fichier toto.raw ou toto.qcow2 dans l&amp;rsquo;arborescence &lt;code&gt;/rpool&lt;/code&gt;. Côté ZFS, ces volumes sont des volumes de type &amp;ldquo;volume&amp;rdquo; (lol).&lt;/p&gt;
&lt;p&gt;Mais c&amp;rsquo;est un détail, car c&amp;rsquo;est presque encore plus facile puisqu&amp;rsquo;on peut aller directement dans &lt;code&gt;/dev/zvol/rpool&lt;/code&gt; et les retrouver en tant que &amp;ldquo;special file&amp;rdquo; dans /dev.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;ls -l /dev/zvol/rpool/vm-100*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;lrwxrwxrwx 1 root root 10 Jul 23 02:00 /dev/zvol/rpool/vm-100-disk-0 -&amp;gt; ../../zd16
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;lrwxrwxrwx 1 root root 12 Jul 23 02:00 /dev/zvol/rpool/vm-100-disk-0-part1 -&amp;gt; ../../zd16p1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;lrwxrwxrwx 1 root root 12 Jul 23 02:00 /dev/zvol/rpool/vm-100-disk-0-part2 -&amp;gt; ../../zd16p2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;lrwxrwxrwx 1 root root 12 Jul 23 02:00 /dev/zvol/rpool/vm-100-disk-0-part5 -&amp;gt; ../../zd16p5
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dans l&amp;rsquo;étape suivante, &lt;code&gt;/dev/zvol/rpool/vm-100-disk-0&lt;/code&gt; remplacera donc notre image disque &amp;ldquo;input&amp;rdquo; (&lt;em&gt;toto.img&lt;/em&gt;).&lt;/p&gt;
&lt;h2 id="générer-un-vhd"&gt;Générer un VHD
&lt;/h2&gt;&lt;p&gt;Souvent sous Proxmox, vous allez avoir des disques au format RAW ou au format QCOW2.&lt;/p&gt;
&lt;p&gt;Dans les deux cas, XCP-NG n&amp;rsquo;accepte pas ces formats. Heureusement, l&amp;rsquo;utilitaire &lt;code&gt;qemu-img&lt;/code&gt;, inclus dans notre distribution de Proxmox VE sait faire les conversions.&lt;/p&gt;
&lt;p&gt;Dans le cas d&amp;rsquo;un disque RAW :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;qemu-img convert -f raw toto.img -O vpc toto.vhd
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dans le cas d&amp;rsquo;un disque QCOW2 :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;qemu-img convert -f qcow2 toto.qcow2 -O vpc toto.vhd
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="avant-dimporter-le-vhd-dans-xcp-ng"&gt;Avant d&amp;rsquo;importer le VHD dans XCP-NG
&lt;/h2&gt;&lt;p&gt;La partie un peu moins &amp;ldquo;fun&amp;rdquo; de la procédure est qu&amp;rsquo;on doit faire une partie des actions en GUI (si on suit la doc, mais je &lt;em&gt;teaserai&lt;/em&gt; qu&amp;rsquo;on peut faire mieux en fin d&amp;rsquo;article).&lt;/p&gt;
&lt;p&gt;La première chose qu&amp;rsquo;on va devoir faire, c&amp;rsquo;est aller dans la WebUI Xen Orchestra pour retrouver notre espace de stockage et créer manuellement un disque.&lt;/p&gt;
&lt;p&gt;Il faut aller retrouver la liste de nos espaces de stockages (le plus simple, c&amp;rsquo;est de passer par &amp;ldquo;home&amp;rdquo;), puis, dans cet espace, créer un nouveau disque. Prenez garde à le créer de la bonne taille, en faisant attention à la différence Go/Gio. La documentation officielle conseille d&amp;rsquo;ajouter 1 Go de marge pour éviter ce genre de problématiques, mais je n&amp;rsquo;en ai pas eu besoin lors de mes tests.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/07/xo_storage.avif"
loading="lazy"
&gt;
&lt;img src="https://blog.zwindler.fr/2022/07/xoa_create_disk.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Note: chaque disque et chaque &amp;ldquo;datastore&amp;rdquo; a son propre UUID. Ici, j&amp;rsquo;ai souligné en rouge celui du datastore &amp;ldquo;Local&amp;rdquo;, il nous servira plus tard (quand on passe la souris dessus, XOA nous propose de le copier dans le presse-papier).&lt;/p&gt;
&lt;p&gt;Une fois le disque créé à la bonne taille, on récupère son UUID aussi.&lt;/p&gt;
&lt;h2 id="vhd-vers-xcp-ng"&gt;VHD vers XCP-NG
&lt;/h2&gt;&lt;p&gt;Maintenant qu&amp;rsquo;on a d&amp;rsquo;un côté un VHD valide, et de l&amp;rsquo;autre un disque dur virtuel vide prêt à accueillir les données, on peut se lancer !&lt;/p&gt;
&lt;p&gt;On envoie le VHD sur le serveur XCP-NG (via &lt;code&gt;scp&lt;/code&gt; ou un montage NFS, par exemple) et on se connecte dessus en SSH.&lt;/p&gt;
&lt;p&gt;Si on est pas confiant, on peut tester que le VHD est valide sur XCP-NG grâce à l&amp;rsquo;utilitaire suivant :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;#&lt;/span&gt; vhd-util check -n /nfs/toto.vhd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; /nfs/toto.vhd is valid
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ensuite, on utilise le binaire &lt;code&gt;xe&lt;/code&gt; qui permet d&amp;rsquo;interagir en CLI avec XCP-NG pour lancer l&amp;rsquo;import :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gp"&gt;#&lt;/span&gt; xe vdi-import &lt;span class="nv"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/nfs/toto.vhd &lt;span class="nv"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;vhd --progress &lt;span class="nv"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; [|] ######################################################&amp;gt; (100% ETA 00:00:00)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On aura évidemment remplacé le paramètre &lt;em&gt;uuid=aaaa&lt;/em&gt; par l&amp;rsquo;UUID du disque virtuel, que je vous ai demandé de récupérer plus tôt !&lt;/p&gt;
&lt;h2 id="créer-la-vm"&gt;Créer la VM
&lt;/h2&gt;&lt;p&gt;Normalement, à l&amp;rsquo;issue de l&amp;rsquo;opération, on a un disque tout beau tout propre. La dernière étape est de créer une VM et à lui attacher ce disque.&lt;/p&gt;
&lt;p&gt;Là encore, on peut repartir de &amp;ldquo;Home&amp;rdquo; puis aller dans le menu VM.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/07/xoa_create_vm1.avif"
loading="lazy"
&gt;
&lt;img src="https://blog.zwindler.fr/2022/07/xoa_create_vm2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Note: pour passer le menu de création de VM, il faut impérativement choisir soit ISO/DVD ou PXE dans &lt;strong&gt;Install settings&lt;/strong&gt;, sinon CREATE est grisé. J&amp;rsquo;ai également supprimé le disque par défaut proposé par le wizard (puisqu&amp;rsquo;on va lui en attacher un) et dans &lt;strong&gt;Advanced&lt;/strong&gt;, j&amp;rsquo;ai décoché &lt;strong&gt;Boot VM after creation&lt;/strong&gt; puisque de toute façon je dois lui attacher le disque avant de booter.&lt;/p&gt;
&lt;p&gt;Une fois créé, on clique sur la VM pour lui attacher le disque qu&amp;rsquo;on a importé.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/07/xoa_attach_disk.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On peut maintenant booter la VM !&lt;/p&gt;
&lt;p&gt;Lors du redémarrage, la seule chose que j&amp;rsquo;ai eu à changer était la configuration réseau, un peu différente entre mon cluster Proxmox VE et mon lab XCP-NG, ainsi que le nom d&amp;rsquo;interface qui était différent suite au passage à Xen (ens18 =&amp;gt; eth0).&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai également ajouté le &amp;ldquo;Management agent&amp;rdquo; pour bénéficier d&amp;rsquo;infos dans l&amp;rsquo;UI (et probablement d&amp;rsquo;autres trucs chouettes que je n&amp;rsquo;ai pas encore exploré).&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Voilà pour ces premiers pas avec XCP-NG. Comme vous avez pu le constater, l&amp;rsquo;opération nécessite plusieurs étapes, dont certaines peuvent être améliorées (notamment l&amp;rsquo;automatisation de certaines tâches côté XCP-NG grâce à l&amp;rsquo;API, on en reparlera, car j&amp;rsquo;ai déjà quelques résultats).&lt;/p&gt;
&lt;p&gt;Cependant, ça permet déjà de se faire une première impression et de se familiariser avec les menus.&lt;/p&gt;
&lt;p&gt;Dans les semaines qui viennent, je vais continuer de jouer avec, histoire de me faire une opinion un peu plus construite de XCP-NG (notamment par rapport à ce que je fais avec Proxmox). S&amp;rsquo;il y a des points que vous voulez que je creuse en particulier, n&amp;rsquo;hésitez pas à me &amp;ldquo;ping&amp;rdquo; sur les divers réseaux sociaux pour m&amp;rsquo;en parler.&lt;/p&gt;
&lt;p&gt;D&amp;rsquo;ici là, have fun :)&lt;/p&gt;</description></item><item><title>QNAP débranche LXC sur les NAS ARM : comment contourner ?</title><link>https://blog.zwindler.fr/2022/06/13/qnap-debranche-lxc-workaround/</link><pubDate>Mon, 13 Jun 2022 08:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2022/06/13/qnap-debranche-lxc-workaround/</guid><description>&lt;img src="https://blog.zwindler.fr/2018/01/qnap22.webp" alt="Featured image of post QNAP débranche LXC sur les NAS ARM : comment contourner ?" /&gt;&lt;p&gt;Si vous le suivez sur Twitter ou Masto, vous m&amp;rsquo;avez très probablement lu râler contre la sortie &lt;del&gt;de QTS 5&lt;/del&gt; Container Station v2.4.0.2316, l&amp;rsquo;été dernier.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://preview.redd.it/6bouewrhnze71.png?width=1283&amp;amp;format=png&amp;amp;auto=webp&amp;amp;s=11aacee53bf931b47d1534cc1478b47aa7239701"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Ou plus particulièrement, contre une décision prise lors de ce passage : enlever LXC pour l&amp;rsquo;administration des containers, au profit de LXD. LXD étant juste une couche d&amp;rsquo;administration, LXC est toujours présent et fonctionnel, juste caché.&lt;/p&gt;
&lt;p&gt;Pourquoi je râle ?&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai un &lt;a class="link" href="https://blog.zwindler.fr/2018/01/23/stockage-pour-un-admin-geek-qnap-ts431p2-ou-synology-ds418j" &gt;NAS QNAP TS431P2 depuis 2018 dont je suis pleinement satisfait&lt;/a&gt;, et qui m&amp;rsquo;a permis de passer moins de temps à administrer et ajouter des fonctionnalités à mon NAS ZFS maison, monté initialement en 2011 (merci &lt;em&gt;Dworak_of_sky&lt;/em&gt; pour les souvenirs).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2011/06/29/nasmediacenter-do-it-yourself-or-not/" &gt;NAS/MediaCenter : Do It (the hardware part) Yourself!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2011/08/04/nasmediacenter-do-it-the-software-part-yourself/" &gt;NAS/MediaCenter : Do It (the software part) Yourself!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Sauf&lt;/strong&gt; que mon QNAP est un NAS milieu de gamme, fonctionnant avec &lt;em&gt;un processeur ARM&lt;/em&gt; et pas x86 ! Et ces charmantes personnes (grrrr) de chez QNAP &lt;strong&gt;n&amp;rsquo;ont pas porté LXD sur les NAS ARM&lt;/strong&gt; (segmentation artificielle de l&amp;rsquo;offre ? Flemme ?).&lt;/p&gt;
&lt;p&gt;Nous, propriétaires de NAS QNAP ARM, nous retrouvons donc sans solution puisque LXC est désactivé et LXD pas disponible.&lt;/p&gt;
&lt;p&gt;Une fonction hyper pratique pour héberger de petits services à bas coût (autant en performance qu&amp;rsquo;en prix) disparaît. C&amp;rsquo;était un réel différenciant pour ce modèle et je me sens vraiment trahi (ou alors c&amp;rsquo;est ma faute, car je n&amp;rsquo;aurais pas dû leur faire confiance ?).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/06/trahison.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Je ne suis pas près de recommander QNAP comme j&amp;rsquo;ai pu le faire par le passé. #PasContent&lt;/p&gt;
&lt;h2 id="nuance"&gt;Nuance
&lt;/h2&gt;&lt;p&gt;HEUREUSEMENT, les containers LXC ne se sont pas mis à ne plus marcher du jour au lendemain.&lt;/p&gt;
&lt;p&gt;Enfin, encore heureux ! Je n&amp;rsquo;ose imaginer les dégâts en prod !&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est d&amp;rsquo;autant plus vicelard que le message d&amp;rsquo;information pour expliquer qu&amp;rsquo;il n&amp;rsquo;y a plus LXC indique que c&amp;rsquo;est pas grave puisque vous avez LXD à la place. Aucune mention du fait qu&amp;rsquo;en fait, sous ARM, non&amp;hellip;&lt;/p&gt;
&lt;p&gt;Il est toujours possible (&lt;strong&gt;pour l&amp;rsquo;instant&lt;/strong&gt;) de démarrer, arrêter, utiliser et supprimer les containers existants. Mais il n&amp;rsquo;est plus possible d&amp;rsquo;en créer de nouveaux.&lt;/p&gt;
&lt;p&gt;Ça veut donc dire que tout est encore présent pour faire fonctionner la fonctionnalité, ce n&amp;rsquo;est &amp;ldquo;juste&amp;rdquo; plus disponible en UI.&lt;/p&gt;
&lt;h2 id="en-avoir-le-coeur-net"&gt;En avoir le coeur net
&lt;/h2&gt;&lt;p&gt;En farfouillant, je me suis aussi rendu compte qu&amp;rsquo;il était toujours possible d&amp;rsquo;&lt;strong&gt;exporter&lt;/strong&gt; des containers existants et d&amp;rsquo;&lt;strong&gt;importer&lt;/strong&gt; les exports.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/06/qnap_export.avif"
loading="lazy"
&gt;
&lt;img src="https://blog.zwindler.fr/2022/06/qnap_import.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On peut donc contourner la limitation arbitraire de QNAP via des export / import. J&amp;rsquo;ai l&amp;rsquo;habitude de ce genre de bidouilles, &lt;a class="link" href="https://blog.zwindler.fr/2011/03/20/copier-une-vm-windows-xp-sous-esxi-sans-vcenter/" target="_blank" rel="noopener"
&gt;puisque je faisais déjà ça il y a plus de 10 ans avec les hyperviseurs VMware en licence gratuite&lt;/a&gt;&amp;hellip;&lt;/p&gt;
&lt;p&gt;A l&amp;rsquo;usage, ça fonctionne mais c&amp;rsquo;est pas satisfaisant. D&amp;rsquo;abord parce que si on a pas, ou plus, de containers sur le NAS, on ne peut pas le faire trivialement.&lt;/p&gt;
&lt;p&gt;Ensuite, parce que le processus et long (l&amp;rsquo;export et l&amp;rsquo;import) et pénible (plusieurs étapes).&lt;/p&gt;
&lt;p&gt;Enfin, parce que les images LXC mises à disposition par QNAP étaient antédiluviennes !&lt;/p&gt;
&lt;p&gt;Ubuntu 14.04 !!! Sauf si vous avez pris le temps de faire le processus d&amp;rsquo;upgrade complet de 14.04 à 20.04 ou 22.04 (et vous devriez), il est probable que vous n&amp;rsquo;ayez pas envie de repartir de ces vieux machins.&lt;/p&gt;
&lt;h2 id="faites-mieux"&gt;&amp;ldquo;Faites mieux&amp;rdquo;
&lt;/h2&gt;&lt;p&gt;Si vous êtes admin, vous avez probablement déjà activé SSH pour vous connecter directement à l&amp;rsquo;OS de votre NAS. (&lt;a class="link" href="https://www.qnap.com/fr-fr/how-to/knowledge-base/article/how-to-access-qnap-nas-by-ssh" target="_blank" rel="noopener"
&gt;Et sinon vous pouvez aller ici pour l&amp;rsquo;activer&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Une fois connecté, on peut sortir du menu TUI et bidouiller l&amp;rsquo;OS comme on en a envie.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/06/qnap_ssh_admin.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[~] # id
uid=0(admin) gid=0(administrators)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Je n&amp;rsquo;ai pas fait beaucoup d&amp;rsquo;administration LXC/LXD directement, car j&amp;rsquo;avais toujours une interface à ma disposition pour me &amp;ldquo;cacher&amp;rdquo; la façon dont ça fonctionne vraiment, que ce soit dans le cas de QNAP ou de &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=lxc" target="_blank" rel="noopener"
&gt;Proxmox VE (que j&amp;rsquo;utilise beaucoup pour ça)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En lisant rapidement &lt;a class="link" href="https://doc.ubuntu-fr.org/lxc" target="_blank" rel="noopener"
&gt;la doc sur ubuntu-fr&lt;/a&gt;, j&amp;rsquo;ai compris qu&amp;rsquo;il existait en fait chez Canonical un genre de dépôt d&amp;rsquo;images officielles de pleins d&amp;rsquo;OS, notamment compatible &lt;strong&gt;armhf&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://images.lxd.canonical.com/" target="_blank" rel="noopener"
&gt;images.lxd.canonical.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://images.linuxcontainers.org//meta/1.0/index-system" target="_blank" rel="noopener"
&gt;images.linuxcontainers.org//meta/1.0/index-system&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Avec LXC, on peut accéder directement à ces images en ligne de commande avec &lt;code&gt;lxc-download&lt;/code&gt;. Pas de bol, la commande n&amp;rsquo;est pas dispo sur QTS :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;[~] # lxc-download
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;-sh: lxc-download: command not found
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(En fait elle n&amp;rsquo;est juste pas dans le PATH, mais je ne le savais pas à ce moment-là)&lt;/p&gt;
&lt;p&gt;Sauf qu&amp;rsquo;on peut aussi appeler directement la commande pour créer des containers &lt;code&gt;lxc-create&lt;/code&gt; avec un flag &amp;ldquo;download&amp;rdquo;. Et ça tombe bien parce que &lt;code&gt;lxc-create&lt;/code&gt; est disponible. Mais la joie sera de courte durée&amp;hellip;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;lxc-create -t download -n container_jammy -- -d ubuntu -r jammy -a armhf
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;/usr/local/container-station/lxc/share/lxc/templates/lxc-download: line 237: getopt: command not found
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="hack"&gt;Hack&amp;hellip;
&lt;/h2&gt;&lt;p&gt;Note : si vous trouviez que ce qu&amp;rsquo;on était en train de faire n&amp;rsquo;était déjà pas très propre, je tiens à vous prévenir, la suite est vraiment immonde&amp;hellip; Pas merci QNAP de me forcer à faire ça !&lt;/p&gt;
&lt;p&gt;Le script &lt;code&gt;/usr/local/container-station/lxc/share/lxc/templates/lxc-download&lt;/code&gt; est moisi. Il manque la moitié des binaires dans la busybox.&lt;/p&gt;
&lt;p&gt;Pire encore, la procédure que je donne ici semble être écrasée à chaque mise à jour de l&amp;rsquo;application &lt;strong&gt;Container Station&lt;/strong&gt;. Mais, ça fonctionne&amp;hellip;&lt;/p&gt;
&lt;p&gt;La première chose qu&amp;rsquo;on va faire, c&amp;rsquo;est faire une sauvegarde du script &lt;code&gt;lxc-download&lt;/code&gt; par sécurité.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;cp /usr/local/container-station/lxc/share/lxc/templates/lxc-download{,.old}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le premier message d&amp;rsquo;erreur qu&amp;rsquo;on a &lt;code&gt;getopt: command not found&lt;/code&gt; indique juste que de nombreux binaires &amp;ldquo;classiques&amp;rdquo; ne sont pas disponibles directement dans le shell de QTS.&lt;/p&gt;
&lt;p&gt;Sauf qu&amp;rsquo;en fait, ils sont là, ces binaires. Pas besoin de les télécharger ou de les compiler. Ils ne sont juste &amp;ldquo;pas visibles&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;QTS tourne, comme beaucoup de serveurs Linux minimalistes, avec &lt;a class="link" href="https://fr.wikipedia.org/wiki/BusyBox" target="_blank" rel="noopener"
&gt;l&amp;rsquo;aide de Busybox&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On peut donc &amp;ldquo;magiquement activer&amp;rdquo; les binaires qui nous manquent simplement avec des liens symboliques.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;for binary in getopt xz seq; do
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; ln -s /share/CACHEDEV1_DATA/.qpkg/container-station/bin/busybox /share/CACHEDEV1_DATA/.qpkg/container-station/bin/${binary}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;done
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;getopt
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;getopt: missing optstring argument
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="-and-slash"&gt;&amp;hellip; and slash!
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;C&amp;rsquo;est bon, mais pas suffisant.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La version du binaire &lt;code&gt;mktemp&lt;/code&gt; de busybox n&amp;rsquo;est malheureusement PAS compatible avec le script &lt;code&gt;lxc-download&lt;/code&gt;. On va devoir le modifier à la main&amp;hellip;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Usage: mktemp [-dq] TEMPLATE
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le passage problématique se situe autour des lignes 320-325&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;320&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; ! &lt;span class="nb"&gt;command&lt;/span&gt; -V mktemp &amp;gt;/dev/null 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;321&lt;/span&gt; &lt;span class="nv"&gt;DOWNLOAD_TEMP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DOWNLOAD_TEMP&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/tmp/lxc-download.&lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;322&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;323&lt;/span&gt; &lt;span class="nv"&gt;DOWNLOAD_TEMP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DOWNLOAD_TEMP&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;mktemp -d&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;324&lt;/span&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En vrai, &lt;code&gt;mktemp&lt;/code&gt; s&amp;rsquo;attend à avoir le path complet, accompagné d&amp;rsquo;un pattern à base de XXXXXX. &lt;code&gt;mktemp&lt;/code&gt; remplace ensuite les caractères XXXXXX par un nombre aléatoire en s&amp;rsquo;assurant que le dossier n&amp;rsquo;existe pas déjà, puis le créé. Par exemple&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mktemp /tmp/mydirXXXXX
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mode bourrin, j&amp;rsquo;ai remplacé la ligne par :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;323&lt;/span&gt; &lt;span class="nv"&gt;DOWNLOAD_TEMP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DOWNLOAD_TEMP&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/tmpdir&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; mkdir -p &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DOWNLOAD_TEMP&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;De toute façon, il est supprimé à la fin de l&amp;rsquo;exécution du script, ce dossier (fonction cleanup dans le shell).&lt;/p&gt;
&lt;h2 id="gpg"&gt;GPG
&lt;/h2&gt;&lt;p&gt;On progresse !&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;[~] # lxc-create -t download -n container_jammy -- -d ubuntu -r jammy -a armhf
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Setting up the GPG keyring
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;chmod: /var/lib/lxc/container_jammy/tmpdir/gpg: No such file or directory
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Error creating container container_jammy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En creusant un peu, la vraie erreur est que je n&amp;rsquo;ai pas le binaire &lt;code&gt;gpgkeys_curl&lt;/code&gt; à l&amp;rsquo;endroit attendu :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;gpg: unable to execute program `/opt/cross-project/arm/linaro/arm-linux-gnueabihf/libc/libexec/gnupg/gpgkeys_curl&amp;#39;: No such file or directory
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Voilà un autre point que je n&amp;rsquo;ai pas réussi à corriger correctement.&lt;/p&gt;
&lt;p&gt;Le plus simple est de simplement ignorer la validation avec &lt;code&gt;--no-validate&lt;/code&gt; mais si vous avez une piste, je suis preneur.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;lxc-create -t download -n container_jammy -- -d ubuntu -r jammy -a armhf --no-validate
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="des-dossiers-qui-disparaissent-tout-seul-"&gt;Des dossiers qui disparaissent tout seul ???
&lt;/h2&gt;&lt;p&gt;Dernier mystère&amp;hellip;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Downloading the image index
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;ERROR: Failed to download http://images.linuxcontainers.org//meta/1.0/index-system
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;L&amp;rsquo;erreur n&amp;rsquo;est pas du tout un problème d&amp;rsquo;accès à l&amp;rsquo;URL pour télécharger l&amp;rsquo;index des systèmes disponibles sur &lt;code&gt;images.linuxcontainers.org&lt;/code&gt; (code 302, page redirigée sur &lt;code&gt;uk.lxd.images.canonical.com&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;En réalité, si active les messages d&amp;rsquo;erreurs lors du &lt;code&gt;wget&lt;/code&gt; dans le script, l&amp;rsquo;erreur est que le dossier &lt;code&gt;/var/lib/lxc/container_jammy/tmpdir/&lt;/code&gt; n&amp;rsquo;existe pas !&lt;/p&gt;
&lt;p&gt;Pourtant, ça devrait être corrigé, suite à la modif qu&amp;rsquo;on a faite ligne 323 (voir plus haut)&amp;hellip; trop bizarre :/&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;en ai eu un peu marre de creuser et au bout d&amp;rsquo;un moment, j&amp;rsquo;ai juste fait :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;export CONTAINER_NAME=jammy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;mkdir -p /var/lib/lxc/${CONTAINER_NAME}/tmpdir/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;mkdir -p /var/lib/lxc/${CONTAINER_NAME}/rootfs/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;lxc-create -t download -n ${CONTAINER_NAME} -- -d ubuntu -r jammy -a armhf --no-validate
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et croyez-le ou non, mais ça marche ! Le container existe (il n&amp;rsquo;est juste pas visible dans la console pour l&amp;rsquo;instant)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;[...]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;You just created an Ubuntu jammy armhf (20220611_07:42) container.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On a plus qu&amp;rsquo;à redémarrer Container Station, il apparaît&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/06/qnap_lxc_jammy.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Si jamais quelqu&amp;rsquo;un de chez QNAP lit ce blogpost&amp;hellip; Arrêtez de vous fiche de nous et :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mettez nous LXD dans nos NAS ARM&lt;/li&gt;
&lt;li&gt;OU si c&amp;rsquo;est trop de boulot (je peux l&amp;rsquo;entendre), remettre LXC en attendant.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce genre de hack est indigne et j&amp;rsquo;ai perdu plusieurs heures pour corriger votre m***e. J&amp;rsquo;ai payé pour un NAS compatible LXC, ce n&amp;rsquo;est pas pour que vous retiriez la fonctionnalité 1 an après.&lt;/p&gt;
&lt;p&gt;Ce genre de pratiques est vraiment dégueulasse et je n&amp;rsquo;hésiterais pas à dire tout le mal que je pense de cette décision.&lt;/p&gt;
&lt;h2 id="sources"&gt;Sources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://forum.qnap.com/viewtopic.php?t=159613" target="_blank" rel="noopener"
&gt;Un post sur le Forum QNAP qui m&amp;rsquo;a un peu guidé vers la solution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.reddit.com/r/qnap/comments/owkr63/qnap_container_station_loss_of_functionality/" target="_blank" rel="noopener"
&gt;Un fil de discussion Reddit qui en parle&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Ajouter une clé USB à un container LXC</title><link>https://blog.zwindler.fr/2021/10/25/ajouter-une-cle-usb-a-un-container-lxc/</link><pubDate>Mon, 25 Oct 2021 06:25:00 +0000</pubDate><guid>https://blog.zwindler.fr/2021/10/25/ajouter-une-cle-usb-a-un-container-lxc/</guid><description>&lt;img src="https://blog.zwindler.fr/2016/02/233_800.webp" alt="Featured image of post Ajouter une clé USB à un container LXC" /&gt;&lt;p&gt;Il arrive souvent, quand on fait de la virtualisation, qu’on ait besoin de « passer » un device physique, notamment des clés USB, à une VM et essayer de lui faire croire qu’on lui a branché physiquement (alors que c’est l’hôte qui l’a).&lt;/p&gt;
&lt;p&gt;Quand il s’agit de virtualisation complète, c’est, paradoxalement, relativement simple. Comme l’OS invité est totalement isolé de l’OS hôte, il est nécessaire d’ajouter un programme pour faire passer dans un tunnel les commandes envoyées/reçus par le device et d’ajouter une couche d’émulation dans la VM pour lui faire croire qu’elle a le device connecté.&lt;/p&gt;
&lt;p&gt;Il est souvent très facile de faire ce genre d’opération dans les hyperviseurs du marché depuis très longtemps. J’avais par exemple fait &lt;a class="link" href="https://blog.zwindler.fr/2016/03/26/modem-gsm-rs232-convertisseur-usb-vm-vmware/" &gt;une série d’articles en 2016 (!!!) sur la façon de le faire dans VMware&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Cependant, dans le cas de container LXC sur mon Proxmox (mais la logique sera la même pour LXD ou même un LXC nu), c’est bizarrement plus compliqué. Je vais vous montrer comment faire dans cet article.&lt;/p&gt;
&lt;h2 id="récupérer-les-informations"&gt;Récupérer les informations
&lt;/h2&gt;&lt;p&gt;Sur l’hôte, utiliser l’utilitaire &lt;strong&gt;lsusb&lt;/strong&gt; pour lister les devices connectés. Récupérer les nombres Bus et Device (ici 001 et 003) pour en déduire le chemin vers le fichier spécial du device.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;root@host01:~# lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Récupérer le major number et le minor number du fichier spécial &lt;strong&gt;/dev/bus/usb/{{Bus}}/{{Device}}&lt;/strong&gt; (ici 189 pour le major et 2 pour le minor)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ls -al /dev/bus/usb/001/003
crw-rw-r-- 1 root root 189, 2 Jul 24 09:46 /dev/bus/usb/001/003
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="configurer-le-container-lxc"&gt;Configurer le container LXC
&lt;/h2&gt;&lt;p&gt;Maintenant qu’on a les 4 nombres, éditer le fichier de configuration du container 101. Le major+minor sert pour autoriser le container à manipuler le device et le chemin vers le fichier spécial doit être monté exactement au même endroit dans le container LXC&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi /etc/pve/nodes/host01/lxc/101.conf
lxc.cgroup.devices.allow: c 189:2 rwm
lxc.mount.entry: /dev/bus/usb/001/003 dev/bus/usb/001/003 none bind,optional,create=file
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Rebooter le container. Normalement le device USB est bien présent.&lt;/p&gt;
&lt;p&gt;Pour vérifier, on peut installer &lt;strong&gt;usbutils&lt;/strong&gt; dans le container pour vérifier que la clé est bien disponible avec &lt;strong&gt;lsusb&lt;/strong&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;apt install usbutils
lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Jeedom dans un container LXC</title><link>https://blog.zwindler.fr/2021/10/04/jeedom-dans-un-container-lxc/</link><pubDate>Mon, 04 Oct 2021 06:15:00 +0000</pubDate><guid>https://blog.zwindler.fr/2021/10/04/jeedom-dans-un-container-lxc/</guid><description>&lt;img src="https://blog.zwindler.fr/2021/08/mijia.webp" alt="Featured image of post Jeedom dans un container LXC" /&gt;&lt;h2 id="jeedom--bluetooth-pour-de-la-domotique-accessible"&gt;Jeedom + bluetooth pour de la domotique accessible
&lt;/h2&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;Note : je vous spoil tout de suite la fin&lt;/strong&gt; : il n’est pas possible de faire fonctionner une clé USB bluetooth dans un container LXC. Du coup ma plateforme Jeedom ne peut pas fonctionner avec mon dongle bluetooth et j’ai du tout réinstaller dans une VM. Le tutoriel reste globalement applicable, si vous n’avez pas de dongle bluetooth ou si vous installez une VM&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Il y a quelques mois, j’ai décidé de tenter de domotiser un peu ma maison. Comme j’aime bien grapher tout ce qui me passe sous la main, j’ai commencé par acheter un pack de 4 capteurs de température + hygrométrie Xiaomi dans les chambres et le salon.&lt;/p&gt;
&lt;p&gt;L’avantage principal de ces petits thermomètres connectés est qu’ils sont très peu chers, majoritairement parce qu’il s’agit de thermomètres bluetooth, beaucoup plus répandu (et donc moins coûteux) que les équivalents zigbee, z-wave, etc.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/08/mijia.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On peut donc aussi très facilement les appairer à un smartphone (Xiaomi fourni une application pour faciliter la tâche un peu plus) et aussi les intégrer à une plateforme domotique (Xiaomi propose une passerelle Bluetooth) quelconque. Mais l’application smartphone est très limitée et nécessite d’être à très courte portée (of course).&lt;/p&gt;
&lt;p&gt;Depuis des années, je sais également que beaucoup de hobbyists de la domotique utilisent Jeedom comme solution de domotique gratuite&amp;hellip; D’autant que les solutions d’installations proposées par Jeedom sont nombreuses ! Installation baremetal, sur raspberry pi (ARM), dans une VM, dans un container Docker, etc&amp;hellip;&lt;/p&gt;
&lt;p&gt;Mais je n’avais rien pour l’installer&amp;hellip;&lt;/p&gt;
&lt;h2 id="choix-de-linstallation"&gt;Choix de l’installation
&lt;/h2&gt;&lt;p&gt;Heureusement, après quelques années en full hébergé, j’ai finalement repris un serveur auto-hébergé dans mon DC-buanderie ™. L’occasion de pouvoir disposer d’un peu plus de puissance en local (aka chez moi) et aussi de relancer mes velléités de domotique auto-hébergée !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/08/dc_buanderie.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;J’aurai pu installer Jeedom sur une VM de mon Proxmox, comme tout le monde. Mais comme je suis un original, j’ai préféré l’installer à la mimine sur un container LXC de mon hyperviseur.&lt;/p&gt;
&lt;p&gt;(La vraie raison c’est que j’aime bien éviter l’overhead CPU et RAM des VMs en faisant plutôt des containers LXC&amp;hellip;)&lt;/p&gt;
&lt;h2 id="récupérer-los"&gt;Récupérer l’OS
&lt;/h2&gt;&lt;p&gt;Le guide d’installation Jeedom pour une VM n’est ni plus ni moins que l’&lt;a class="link" href="https://doc.jeedom.com/fr_FR/installation/vm" target="_blank" rel="noopener"
&gt;installation d’une VM Debian 9 (mais 10 ou 11 ça serait pareil)&lt;/a&gt;. On peut donc le reprendre tel quel, mais avec Proxmox et LXC.&lt;/p&gt;
&lt;p&gt;Télécharger une image de container Debian 10 sur un des datastore du Proxmox&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pveam update &amp;amp;&amp;amp; pveam available --section system | grep debian
system debian-10-standard_10.7-1_amd64.tar.gz
system debian-11-standard_11.0-1_amd64.tar.gz
system debian-9.0-standard_9.7-1_amd64.tar.gz
pveam download rpool-data debian-10-standard_10.7-1_amd64.tar.gz
downloading http://download.proxmox.com/images/system/debian-10-standard_10.7-1_amd64.tar.gz to /rpool/data/template/cache/debian-10-standard_10.7-1_amd64.tar.gz
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/08/download_lxc_debian10.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Ou si vous voulez frimer parce que vous êtes en Proxmox 7, vous pouvez le DL depuis l’interface graphique&lt;/p&gt;
&lt;p&gt;A partir de là, on crée un container LXC (bouton CT) comme d’habitude. Niveau spécification du container, je n’ai pas mis grand-chose et ça a l’air bien suffisant. De toute façon, ça tourne sur des raspberry pi donc c’est peu gourmand.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 vCPU&lt;/li&gt;
&lt;li&gt;1024 Mo de RAM&lt;/li&gt;
&lt;li&gt;10 Go de disque&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Une fois le CT booté, on se connecte, on le met à jour&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt update
sudo apt dist-upgrade
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Puis on récupère le script d’installation de la mort de Jeedom et on l’exécute les yeux fermés 🙈 (ne faites pas ça en prod). J’ai un peu de mal à croire que des gens sérieux osent proposer encore ce genre de méthode d’installation mais bon&amp;hellip;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;wget https://raw.githubusercontent.com/jeedom/core/master/install/install.sh
chmod +x install.sh
./install.sh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/08/install_jeedom_1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;A partir de là, un gros script devrait finir par installer Jeedom et si tout s’est bien passé, celui-ci va lancer un serveur web Apache en écoute sur le port 80&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;root@jeedom:~# lsof -i &amp;#34;:80&amp;#34;
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
apache2 39845 root 4u IPv6 36590854 0t0 TCP *:http (LISTEN)
apache2 39849 www-data 4u IPv6 36590854 0t0 TCP *:http (LISTEN)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;So far, so good&lt;/p&gt;
&lt;h2 id="reverse-mon-beau-reverse"&gt;Reverse, mon beau reverse
&lt;/h2&gt;&lt;p&gt;Moi, le HTTP plain sur le port 80, ça me gave. Pas envie d’ouvrir ça aux 4 vents. J’ai donc un reverse proxy qui me permet de gérer de manière centralisée mes services web (ça a tout un tas d’avantages, notamment celui de n’ouvrir qu’un port, de faire de la rupture protocolaire, de gérer de manière centralisée et unifiée les certificats TLS, &amp;hellip;).&lt;/p&gt;
&lt;p&gt;Parfois, il faut feinter un peu la conf ou réécrire certaines URL, mais dans le cas de Jeedom, une redirection basique semble fonctionner.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;location / {
proxy_pass http://192.168.5.6;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;J’ajoute ensuite un enregistrement pour jeedom dans mon DNS et hop, j’ai une plateforme de domotique accessible de manière sécurisée depuis partout !&lt;/p&gt;
&lt;h2 id="configuration-de-jeedom"&gt;Configuration de Jeedom
&lt;/h2&gt;&lt;p&gt;On peut donc maintenant passer à la doc « &lt;a class="link" href="https://doc.jeedom.com/fr_FR/premiers-pas/index" target="_blank" rel="noopener"
&gt;Premiers pas&lt;/a&gt; » de chez Jeedom !&lt;/p&gt;
&lt;p&gt;Je ne vais pas paraphraser leur guide de démarrage, mais ce qu’il faut savoir c’est qu’il faut absolument s’enregistrer sur le « Market » pour pouvoir activer l’extension Bluetooth BLEA qui nous intéresse dans ce tuto. Et comme le compte est demandé lors de la première connexion, autant créer le compte d’abord.&lt;/p&gt;
&lt;p&gt;Une fois que c’est fait, on peut se connecter sur notre Jeedom, avec un agréable login/mdp admin/admin qu’il faudra heureusement obligatoirement changer à la première connexion ;)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/08/jeedom_login-1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;WOW ! C’est hyper moche, j’étais pas prêt !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="ajouter-une-clé-usb-sur-un-container-lxc"&gt;Ajouter une clé USB sur un container LXC
&lt;/h2&gt;&lt;p&gt;Paradoxalement, permettre à un container LXC d’accéder à un device USB sur un container (donc on est dans le même OS, même kernel) est bien moins facile à faire que de faire de l’USB passthrough pour une VM (2 clics clics dans l’interface).&lt;/p&gt;
&lt;p&gt;Pourtant, il y a probablement toute sortes d’interfaces et d’émulations pour faire croire à la VM qu’elle a un port USB physique&amp;hellip; La magie de l’automatisation ;-).&lt;/p&gt;
&lt;p&gt;Je me suis globalement basé sur ces deux guides pour y arriver, et je ferai un article plus détaillé en français une autre fois :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://medium.com/@konpat/usb-passthrough-to-an-lxc-proxmox-15482674f11d" target="_blank" rel="noopener"
&gt;medium.com/@konpat/usb-passthrough-to-an-lxc-proxmox-15482674f11d&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;gist.github.com/Yub0/518097e1a9d179dba19a787b462f7dd2 (lien mort)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Long story short, il y a plusieurs paramètres à récupérer et un fichier de conf à modifier et à la fin ça donne ça :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="ajouter-le-plugin-bluetooth-blea"&gt;Ajouter le plugin Bluetooth BLEA
&lt;/h2&gt;&lt;p&gt;Normalement si vous avez une clé USB bluetooth correctement visible dans l’OS où est installé votre Jeedom, vous avez « juste » à activer le plugin &lt;strong&gt;Bluetooth Advertisement&lt;/strong&gt; disponible sur le Market officiel Jeedom.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/08/plugin_bluetooth_advertisment.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Une fois le plugin installé, on peut aller le configurer (menu Plugins / Gestion des plugins). Il faut aussi l’activer (Action « Activer »).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/08/config_bluetooth_advertisment_01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Et du coup, comme je vous l’avez spoilé : et là c’est le drame.&lt;/p&gt;
&lt;p&gt;Dans la liste « dropdown » permettant de choisir le device Bluetooth USB, le dongle n’apparaît pas&amp;hellip;&lt;/p&gt;
&lt;p&gt;Cependant, en lisant les logs j’ai assez rapidement trouvé l’erreur et je suis tombé sur ce post sur le forum de Proxmox.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Doing a « hciconfig » on the GUEST system returns:
Can’t open HCI socket.: Address family not supported by protocol&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Et effectivement, j’ai la même erreur. A partir de là, j’ai pu &lt;a class="link" href="https://forum.proxmox.com/threads/assign-a-bluetooth-dongle-to-a-ct.67577/#post-303313" target="_blank" rel="noopener"
&gt;retrouver ce post&lt;/a&gt; qui indique clairement qu’à cause d’une limitation dans les namespaces linux, le bluetooth ne peut pas fonctionner dans un container LXC&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This was extensively discussed in our german forum (&lt;a class="link" href="https://forum.proxmox.com/threads/bt-passthrough-lxc-access-denied.61344/#post-289538" target="_blank" rel="noopener"
&gt;link&lt;/a&gt;), here’s the gist of it:Bluetooth devices register themselves as a network interface, so passing through the USB /dev node is useless. Sadly, the BT network adapter is not namespaceable, meaning it can’t be assigned to a container the way regular network interfaces can.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;J’en reviens donc à ma note du début d’article : si vous n’avez pas de périphérique bluetooth dans votre domotique, vous êtes maintenant probablement l’heureux propriétaire d’un jeedom fonctionnel dans un container LXC, plus léger qu’une VM.&lt;/p&gt;
&lt;p&gt;Dans le cas contraire (comme moi) vous n’avez plus qu’à recommencer le processus, cette fois ci dans une VM, puisque là, le passthrough USB de qemu permet de bypasser la limitation du namespacing linux&amp;hellip;&lt;/p&gt;
&lt;p&gt;Bref, have fun ;-p&lt;/p&gt;
&lt;h2 id="sources-additionnelles"&gt;Sources additionnelles
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Jeedom Premiers pas - &lt;a class="link" href="https://doc.jeedom.com/fr_FR/premiers-pas/index" target="_blank" rel="noopener"
&gt;doc.jeedom.com/fr_FR/premiers-pas/index&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Jeedomiser - &lt;a class="link" href="https://jeedomiser.fr/article/dongle-usb-bluetooth-compatible-avec-jeedom/" target="_blank" rel="noopener"
&gt;jeedomiser.fr/article/dongle-usb-bluetooth-compatible-avec-jeedom/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Forum Proxmox - Bluetooth in LXC container : &lt;a class="link" href="https://forum.proxmox.com/threads/bluetooth-inside-lxc-container.33688/" target="_blank" rel="noopener"
&gt;forum.proxmox.com/threads/bluetooth-inside-lxc-container.33688/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;LXD Github issue - github.com/lxc/lxd/issues/3265 (lien mort)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Les soucis que j’ai rencontrés en upgradant Proxmox VE 7</title><link>https://blog.zwindler.fr/2021/07/19/les-soucis-que-jai-rencontre-en-upgradant-proxmox-ve-7/</link><pubDate>Mon, 19 Jul 2021 06:55:00 +0000</pubDate><guid>https://blog.zwindler.fr/2021/07/19/les-soucis-que-jai-rencontre-en-upgradant-proxmox-ve-7/</guid><description>&lt;img src="https://blog.zwindler.fr/2021/07/pve7-1.webp" alt="Featured image of post Les soucis que j’ai rencontrés en upgradant Proxmox VE 7" /&gt;&lt;h2 id="tldr---lisez-encore-plus-attentivement-que-dhabitude-la-release-note-de-proxmox-ve-7"&gt;TL;DR - Lisez encore plus attentivement que d’habitude la release note de Proxmox VE 7
&lt;/h2&gt;&lt;p&gt;La version 7 de mon hyperviseur préférée vient de sortir ! Comme je n’ai rien d’important qui tourne dessus, je me suis dis que c’était une bonne idée de tester la mise à jour day 1 sans préparation.&lt;/p&gt;
&lt;p&gt;Ça n’est évidemment pas une bonne idée ;-p.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/07/pve7.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Au delà de la valse d’upgrades habituelle ainsi quelques features très sympas (SSO surtout), une modification importante est le &lt;strong&gt;passage à Debian 11&lt;/strong&gt;, Bullseye, qui n’est d’ailleurs pas totalement officiellement sortie (même si on est depuis le 17 en Full freeze&amp;hellip;), mais aussi les cgroups v2 et leur configuration, ainsi que OpenZFS.&lt;/p&gt;
&lt;p&gt;Lisez donc bien :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://pve.proxmox.com/wiki/Roadmap#Proxmox_VE_7.0" target="_blank" rel="noopener"
&gt;La release note&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://pve.proxmox.com/wiki/Upgrade_from_6.x_to_7.0" target="_blank" rel="noopener"
&gt;La documentation d’upgrade&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="pve6to7-ok"&gt;pve6to7 OK
&lt;/h2&gt;&lt;p&gt;Si vous avez déjà fait quelques upgrade de Proxmox VE, vous savez qu’à la dernière mineure de chaque version, un binaire pveXtoY est mis à disposition pour vérifier que la machine (ou éventuellement le cluster) est prêt à être mis à jour.&lt;/p&gt;
&lt;p&gt;Dans mon cas, pas de soucis, à part un warning sur le fait que mes VMs actives devraient être migrées (mais comme je n’ai pas de stockage partagé, j’accepte ce downtime).&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://blog.zwindler.fr/2021/07/pve6to7.avif" &gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="boot-plein"&gt;/boot plein
&lt;/h2&gt;&lt;p&gt;Cette « erreur » ne m’est pas arrivée mais c’est un grand classique de Proxmox VE. Il n’est pas rare que les /boot soient taillés un peu juste lors de l’installation, et que les kernel (ceux de debian + ceux de proxmox qui a le sien, plus récent) prennent toute la place dans le /boot.&lt;/p&gt;
&lt;p&gt;Avant de lancer l’upgrade, vérifiez bien que vous avez de la place pour un kernel dans /boot et nettoyez ce qui dépasse&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt autoremove
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be REMOVED:
pve-kernel-5.4.101-1-pve pve-kernel-5.4.106-1-pve pve-kernel-5.4.73-1-pve pve-kernel-5.4.78-2-pve
0 upgraded, 0 newly installed, 4 to remove and 0 not upgraded.
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="dépôts-bullseye-pas-présents-chez-votre-provider"&gt;Dépôts bullseye pas présents chez votre provider
&lt;/h2&gt;&lt;p&gt;Une partie de mes machines sont hébergées par Online. Je ne sais pas si c’est toujours le cas, mais au moment où j’ai fais l’upgrade, les miroirs n’existaient pas chez eux.&lt;/p&gt;
&lt;p&gt;La commande permettant de mettre à jour les fichiers de configuration d’apt n’est donc pas utilisable en l’état si c’est toujours le cas.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/07/apt_configuration_pve7.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Dans mon cas, j’ai donc du aller modifier les dépôts ciblés pour aller chercher un autre miroir FR&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat /etc/apt/sources.list
# deb http://mirrors.online.net/debian bullseye main
#deb http://mirrors.online.net/debian bullseye main non-free contrib
#deb-src http://mirrors.online.net/debian bullseye main non-free contrib
deb http://ftp2.fr.debian.org/debian/ bullseye main contrib non-free
deb-src http://ftp2.fr.debian.org/debian/ bullseye main contrib non-free
deb http://security.debian.org/debian-security bullseye-security main contrib non-free
deb-src http://security.debian.org/debian-security bullseye-security main contrib non-free
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="hwaddress-pour-les-bridges"&gt;&lt;strong&gt;hwaddress&lt;/strong&gt; pour les bridges
&lt;/h2&gt;&lt;p&gt;Ça c’est LE « piège à c%% » de cette version de Proxmox. C’était d’ailleurs écrit (mais pas hyper clairement) dans la section &lt;a class="link" href="https://pve.proxmox.com/wiki/Upgrade_from_6.x_to_7.0#Known_upgrade_issues" target="_blank" rel="noopener"
&gt;Known upgrade issues du guide d’Upgrade&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Mais comme ce n’était pas clair ils ont rajouté un gros pavé qui explique un peu mieux le problème :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/07/known_issue_1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Jusqu’à présent, il n’était pas nécessaire de donner une adresse MAC à un bridge et ma config réseau n’en avait pas du coup. En lisant, ce message, j’ai (bêtement) pensé « peu importe si Debian en donner une autre après l’upgrade ».&lt;/p&gt;
&lt;p&gt;Grave erreur. Comme pas mal de monde, je me suis coupé la chique après reboot. Comme je suis loin d’être le seul, les équipes de Proxmox ont rajouté a posteriori un paragraphe pour expliquer POURQUOI c’est un souci et pourquoi il faut setter soit même la MAC.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/07/image.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;TL;DR, récupérez la MAC de vos interfaces réseau branchées sur un bridge avec &lt;strong&gt;ip -c link&lt;/strong&gt; et ajouter la mac address dans votre bridge avant upgrade.&lt;/p&gt;
&lt;h2 id="old-systemd--v232-detected-container-wont-run-in-a-pure-cgroupv2-environment"&gt;old systemd (&amp;lt; v232) detected, container won’t run in a pure cgroupv2 environment
&lt;/h2&gt;&lt;p&gt;Là encore, petite surprise due à une mauvaise lecture de ma part. Proxmox VE 6 utilisait déjà les cgroups v2 pour les containers LXC, mais avec une configuration hybride. J’ai donc pensé qu’il n’y avait pas de changement de ce côté.&lt;/p&gt;
&lt;p&gt;Grave erreur. Après upgrade, 2 de mes containers LXC en CentOS ont arrêté de fonctionner. Les machines étaient vue « UP » dans l’interface mais impossible de s’y connecter ni de lancer la console. Pas de message d’erreur particulier.&lt;/p&gt;
&lt;p&gt;Heureusement, quand on relance les containers, j’ai réussi à voir dans la console l’erreur suivante :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;WARN: old systemd (&amp;lt; v232) detected, container won’t run in a pure cgroupv2 environment! Please see documentation -&amp;gt; container -&amp;gt; cgroup version.TASK WARNINGS: 1&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Un retour rapide sur les &lt;strong&gt;&lt;a class="link" href="https://pve.proxmox.com/wiki/Upgrade_from_6.x_to_7.0#Known_upgrade_issues" target="_blank" rel="noopener"
&gt;Known upgrade issues&lt;/a&gt;&lt;/strong&gt; permet de trouver le problème assez vite&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/07/image-1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Grosso modo, Proxmox VE 7 ne supporte plus les CentOS 7 en mode container LXC (sauf à &lt;a class="link" href="https://pve.proxmox.com/pve-docs/chapter-pct.html#pct_cgroup_compat" target="_blank" rel="noopener"
&gt;bidouiller des paramètres&lt;/a&gt; pour revenir dans l’ancien mode, ce que je n’ai pas fait). Et là, c’était pas fun du tout&amp;hellip;&lt;/p&gt;
&lt;h2 id="replication-zfs-hs-pendant-lupgrade"&gt;Replication ZFS HS pendant l’upgrade
&lt;/h2&gt;&lt;p&gt;Petit point d’attention, j’ai eu mes réplications asynchrones de mes VMs via ZFS qui étaient HS entre les nodes de différentes versions (6 vers 6 ok, 7 vers 7 ok, 6 vers 7 KO).&lt;/p&gt;
&lt;p&gt;Je n’ai malheureusement pas copié le message d’erreur mais il s’agit d’un bête changement d’arguments dans la ligne de commande entre OpenZFS dans la version de PVE 6 et OpenZFS 2 (PVE 7).&lt;/p&gt;
&lt;p&gt;Là, il n’y a pas grand chose à part ne pas trop trainer pour mettre à jour tous vos nodes (ou faire les synchro à la main, peut être ?).&lt;/p&gt;
&lt;h2 id="ovs-qui-ne-sinstancie-pas-ovs-vsctl-show-naffiche-rien"&gt;ovs qui ne s’instancie pas, ovs-vsctl show n’affiche rien
&lt;/h2&gt;&lt;p&gt;Je n’ai pas dig particulièrement, mais j’ai eu un souci assez pénible avec mes bridges OpenvSwitch, qui étaient correctement déclarés dans le fichier &lt;strong&gt;/etc/network/interfaces&lt;/strong&gt; mais qui n’apparaissaient jamais.&lt;/p&gt;
&lt;p&gt;Un restart du service n’y faisait rien, pas plus qu’essayer d’ajouter un nouveau bridge en ligne de commandes.&lt;/p&gt;
&lt;p&gt;Finalement, ça a fini par « tomber en marche » en ajoutant un bridge OVS depuis la console (et pas en ligne de commandes comme j’avais testé initialement).&lt;/p&gt;
&lt;p&gt;Weird. Peut être un coup de « pas de chance ».&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Si vous voulez mettre à jour vos Proxmox VE pour bénéficier des nouvelles fonctionnalités (le SSO OpenIDConnect me fait rêver), faites donc &lt;em&gt;bien bien&lt;/em&gt; attention de ne pas avoir de containers LXC trop anciens et de bien setter vos mac address dans le fichier &lt;strong&gt;/etc/network/interfaces&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Au delà de ça, ça devrait aller maintenant.&lt;/p&gt;</description></item></channel></rss>