<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Pve on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/pve/</link><description>Recent content in Pve on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Sat, 28 Sep 2024 12:45:00 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/pve/index.xml" rel="self" type="application/rss+xml"/><item><title>Proxmox 8.2.5 : bad scheduler ! Bad !</title><link>https://blog.zwindler.fr/2024/09/28/proxmox-bad-scheduler/</link><pubDate>Sat, 28 Sep 2024 12:45:00 +0000</pubDate><guid>https://blog.zwindler.fr/2024/09/28/proxmox-bad-scheduler/</guid><description>&lt;img src="https://blog.zwindler.fr/2024/09/bad_scheduler.webp" alt="Featured image of post Proxmox 8.2.5 : bad scheduler ! Bad !" /&gt;&lt;blockquote&gt;
&lt;p&gt;Note : cet article n’est pas écrit par moi (zwindler) mais par mon ami et ancien collègue Fabio, que j’héberge avec grand plaisir sur le blog, comme je le fais parfois pour les copain·es qui n&amp;rsquo;ont pas de blog :-)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;Note &lt;/u&gt;&lt;/strong&gt;: TL;DR à la fin de la page, mais attention, vous allez faire pleurer un bébé dauphin. Vous êtes prévenus.&lt;/p&gt;
&lt;p&gt;On est dimanche, l&amp;rsquo;odeur du café et des croissants plane encore dans le séjour, c&amp;rsquo;est donc un moment parfait pour &amp;hellip;&lt;/p&gt;
&lt;img title="" src="https://blog.zwindler.fr/2024/09//2024-09-28-10-32-54-image.png" alt="" width="369" data-align="center"&gt;
&lt;p&gt;(comment ça, &amp;ldquo;ah bon&amp;rdquo; ?)&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;en profite pour mettre à jour mon instance Proxmox en PVE 8.2.5.&lt;/p&gt;
&lt;p&gt;La semaine passe, je reçois mes mails de backup des VM et je ne vois pas d&amp;rsquo;erreurs.&lt;/p&gt;
&lt;p&gt;Au bout d&amp;rsquo;un moment, quelque chose me met la puce à l&amp;rsquo;oreille : je n&amp;rsquo;en reçois qu&amp;rsquo;un sur les 3 jobs (celui de 4h00) :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/09/2024-09-28-12-38-30-image.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="début-de-lenquête"&gt;Début de l&amp;rsquo;enquête
&lt;/h2&gt;&lt;p&gt;En me connectant sur mon instance, j&amp;rsquo;observe le journal des tâches qui va m&amp;rsquo;aider beaucoup :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/09/2024-09-28-12-40-09-image.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;img title="" src="https://blog.zwindler.fr/2024/09//2024-09-28-10-53-59-image.png" alt="" width="243" data-align="center"&gt;
&lt;p&gt;Je vois donc que les jobs ne se lancent même pas. Tentons donc d&amp;rsquo;en lancer un à la main avec le bouton &amp;ldquo;Run now&amp;rdquo; :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/09/2024-09-28-12-40-27-image.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;NOM DE ZEUS, le job fonctionne. J&amp;rsquo;ai bien la notification par mail, tout s&amp;rsquo;est bien passé.&lt;/p&gt;
&lt;p&gt;Le stockage de backup est un peu ric-rac, 93% d&amp;rsquo;utilisation, mais si le backup passe manuellement, y&amp;rsquo;a pas de raisons que ce soit ça (enfin, ça pourrait, mais je n&amp;rsquo;ai rien qui tourne la nuit en même temps que ces opérations).&lt;/p&gt;
&lt;p&gt;Ce n&amp;rsquo;est pas non plus la notification par mail du backup, j&amp;rsquo;aurais des erreurs dans &lt;code&gt;/var/log/mail.log&lt;/code&gt; et il y&amp;rsquo;aurait une ligne dans le journal des tâches en erreur.&lt;/p&gt;
&lt;p&gt;Donc : le job se lance manuellement, mais n&amp;rsquo;est pas lancé de manière périodique.&lt;/p&gt;
&lt;h2 id="fin-du-mystère"&gt;Fin du mystère
&lt;/h2&gt;&lt;p&gt;Je commence à m&amp;rsquo;intéresser au pve-scheduler. En regardant ses logs (&lt;code&gt;journalctl -eu pve-scheduler.service&lt;/code&gt; au besoin), j&amp;rsquo;observe quelque chose d&amp;rsquo;intéressant :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;400 Parameter verification failed.
job-id: invalid format - invalid configuration ID &amp;#39;1e66440f10abf0aeae5d19f5d0905235c69d811d:1&amp;#39;
&amp;#39;, but neither allow_blessed, convert_blessed nor allow_tags settings are enabled (or TO_JSON/FREEZE method missing) at /usr/share/perl5/PVE/Jobs.pm line 228.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Je vois que la nomenclature des jobs problématiques est effectivement de type &lt;code&gt;1e66440f10abf0aeae5d19f5d0905235c69d811d:1&lt;/code&gt; alors que le job de backup encore fonctionnel est &lt;code&gt;backup-684086d5-2e43&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;DING DING, WE GOT A WINNER ! Je tombe sur Google sur le thread du forum communautaire Proxmox parlant de ce problème : &lt;a class="link" href="https://forum.proxmox.com/threads/scheduled-backups-didnt-run-after-8-2-5-upgrade.154686/" target="_blank" rel="noopener"
&gt;https://forum.proxmox.com/threads/scheduled-backups-didnt-run-after-8-2-5-upgrade.154686/&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;pve-manager (8.2.6) bookworm; urgency=medium
* fix #5731: vzdump jobs: fix execution of converted jobs
-- Proxmox Support Team &amp;lt;support@proxmox.com&amp;gt; Fri, 20 Sep 2024 17:47:17 +0200
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et effectivement, une upgrade est disponible :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt; --&amp;gt; apt list --upgradable
En train de lister... Fait
libpve-common-perl/stable 8.2.3 all [pouvant être mis à jour depuis : 8.2.2]
libpve-http-server-perl/stable 5.1.1 all [pouvant être mis à jour depuis : 5.1.0]
libpve-storage-perl/stable 8.2.5 all [pouvant être mis à jour depuis : 8.2.4]
pve-manager/stable 8.2.7 amd64 [pouvant être mis à jour depuis : 8.2.5]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Un coup d&amp;rsquo;apt upgrade plus tard, mes backups programmés refonctionnent \o/&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;TL;DR &lt;/u&gt;&lt;/strong&gt;: Si vos jobs de backup ne se lancent pas après une mise à jour en 8.2.5 de votre instance Proxmox&amp;hellip; Remettez à jour vos paquets, un fix est disponible :)&lt;/p&gt;</description></item><item><title>Mieux migrer ses VM de Proxmox VE vers XCP NG (part 2)</title><link>https://blog.zwindler.fr/2022/08/08/migrer-une-vm-de-proxmoxve-vers-xcp-ng/</link><pubDate>Mon, 08 Aug 2022 06:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2022/08/08/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 Mieux migrer ses VM de Proxmox VE vers XCP NG (part 2)" /&gt;&lt;h2 id="résumé-des-épisodes-précédents"&gt;Résumé des épisodes précédents
&lt;/h2&gt;&lt;p&gt;Dans l&amp;rsquo;article d&amp;rsquo;il y a 2 semaines (&lt;a class="link" href="https://blog.zwindler.fr/2022/07/24/migrer-une-vm-de-proxmoxve-vers-xcp-ng" &gt;Migrer une VM de Proxmox VE vers XCP NG&lt;/a&gt;), j&amp;rsquo;ai introduit très brièvement de XCP-NG (un OS clé en main pour faire de la virtualisation, sur une base de Xen / XenServer) et déroulé un tuto pour récupérer une VM sur Proxmox VE et l&amp;rsquo;importer dans XCP-NG.&lt;/p&gt;
&lt;p&gt;Pour faire court, les étapes étaient les suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Récupération du disque virtuel sur Proxmox VE&lt;/li&gt;
&lt;li&gt;Transformer le disque virtuel en VHD&lt;/li&gt;
&lt;li&gt;Le transférer sur le serveur XCP-NG&lt;/li&gt;
&lt;li&gt;Créer un disque dans XenOrchestra (l&amp;rsquo;UI de XCP-NG, pour faire simple)&lt;/li&gt;
&lt;li&gt;Importer le contenu du VHD dans le disque vide qu&amp;rsquo;on a créé dans l&amp;rsquo;UI&lt;/li&gt;
&lt;li&gt;Créer une VM dans l&amp;rsquo;UI et lui affecter le disque&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="faire-mieux"&gt;Faire mieux
&lt;/h2&gt;&lt;p&gt;Dans le cadre d&amp;rsquo;un PoC avec une poignée de VMs, ça me parait totalement acceptable comme méthodologie (même si c&amp;rsquo;est un peu fastidieux) mais dans le cadre d&amp;rsquo;une migration, c&amp;rsquo;est difficilement scalable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note :&lt;/strong&gt; Vates (l&amp;rsquo;entreprise qui édite XCP-NG) accompagne ses clients pro dans cette étape. A ma connaissance, ils travaillent également sur de l&amp;rsquo;outillage pour faciliter les transferts, mais Proxmox VE ne sera probablement pas la première &amp;ldquo;plateforme source&amp;rdquo; qui sera supportés par ce genre d&amp;rsquo;outils.&lt;/p&gt;
&lt;p&gt;Dans cet article, je vais donc vous parler d&amp;rsquo;une méthode alternative qui m&amp;rsquo;a été conseillée par les gens de chez Vates pour faciliter cette migration, et plus particulièrement les étapes suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le transférer sur le serveur XCP-NG&lt;/li&gt;
&lt;li&gt;Créer un disque dans XenOrchestra (l&amp;rsquo;UI de XCP-NG, pour faire simple)&lt;/li&gt;
&lt;li&gt;Importer le contenu du VHD dans le disque vide qu&amp;rsquo;on a créé dans l&amp;rsquo;UI&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="because-im-api-"&gt;Because I&amp;rsquo;m API 🎶
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Clap along if you feel like that&amp;rsquo;s what you wanna do&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Vous l&amp;rsquo;avez deviné, on va passer par l&amp;rsquo;API de Xen Orchestra pour se faciliter la tâche. En effet, on va pouvoir rassembler les 3 actions ci dessus en seul appel via cURL !&lt;/p&gt;
&lt;p&gt;Même s&amp;rsquo;il y a un petit prérequis (à faire une fois), ça sera quand même beaucoup plus scalable pour bouger plusieurs VMs.&lt;/p&gt;
&lt;h2 id="you-token-to-me"&gt;You token to me?
&lt;/h2&gt;&lt;p&gt;[EDIT] Depuis la version 5.72 de Xen Orchestra, il est possible de récupérer un token directement dans la Web UI (cf &lt;a class="link" href="https://xen-orchestra.com/blog/xen-orchestra-5-72/#%F0%9F%93%A1-rest-api-token-generation" target="_blank" rel="noopener"
&gt;ce post&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;En lisant &lt;a class="link" href="https://xen-orchestra.com/docs/restapi.html#authentication" target="_blank" rel="noopener"
&gt;la documentation de la REST API (paragraphe authentication)&lt;/a&gt;, on apprend, sans surprise, que la première chose à faire est de récupérer un token permettant d&amp;rsquo;authentifier nos futures requêtes.&lt;/p&gt;
&lt;p&gt;On comprend ensuite que pour faire ça, on va avoir besoin d&amp;rsquo;un tool qui s&amp;rsquo;appelle &lt;a class="link" href="https://xen-orchestra.com/blog/xen-orchestra-from-the-cli/" target="_blank" rel="noopener"
&gt;xo-cli&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Si on suit la doc, il &amp;ldquo;suffit&amp;rdquo; d&amp;rsquo;installer ce module via &lt;code&gt;npm&lt;/code&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;npm install xo-cli
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Bon&amp;hellip; moi j&amp;rsquo;ai pas envie d&amp;rsquo;installer &lt;code&gt;npm&lt;/code&gt; sur mon poste donc j&amp;rsquo;ai fais une image Docker cracra pour ça ;-).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Dockerfile" data-lang="Dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node&lt;/span&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="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&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="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; npm install --global xo-cli&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="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;xo-cli&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le &lt;a class="link" href="https://github.com/zwindler/docker-xo-cli" target="_blank" rel="noopener"
&gt;Dockerfile est disponible ici&lt;/a&gt; et l&amp;rsquo;&lt;a class="link" href="https://hub.docker.com/repository/docker/zwindler/xo-cli" target="_blank" rel="noopener"
&gt;image docker buildée est disponible là&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Depuis son poste (en remplaçant évidemment @IP.Xen.Orchestra par l&amp;rsquo;IP de votre serveur XenOrchestra, &lt;a class="link" href="mailto:admin@admin.net" &gt;admin@admin.net&lt;/a&gt; par votre login)&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;docker run -it xo-cli --createToken --allowUnauthorized @IP.Xen.Orchestra admin@admin.net Password: ************
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Successfully logged with admin@admin.net
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Authentication token created xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si tout s&amp;rsquo;est bien passé, on récupère un token qu&amp;rsquo;on garde précieusement pour nos futures requêtes.&lt;/p&gt;
&lt;h2 id="champion-de-curling"&gt;champion de cURLing
&lt;/h2&gt;&lt;p&gt;De retour sur &lt;a class="link" href="https://xen-orchestra.com/docs/restapi.html#vdi-import" target="_blank" rel="noopener"
&gt;la documentation de l&amp;rsquo;API REST (paragraphe VDI import)&lt;/a&gt;, on trouve tout ce qu&amp;rsquo;il nous faut pour &amp;ldquo;crafter&amp;rdquo; notre requête cURL.&lt;/p&gt;
&lt;p&gt;A minima, on va avoir besoin de UUID de notre storage. Pour rappel, vous pouvez trouver ça dans l&amp;rsquo;UI.&lt;/p&gt;
&lt;p&gt;Si vous avez la flemme, vous pouvez aussi utilisez l&amp;rsquo;API REST pour récupérer les IDs des storages avec la requête suivante :&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;curl \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; -k -b authenticationToken=xxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxx \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; https://@IP.Xen.Orchestra/rest/v0/srs\?fields=name_label
&lt;/span&gt;&lt;/span&gt;&lt;/span&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; ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&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; &amp;#34;name_label&amp;#34;: &amp;#34;Local storage&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; &amp;#34;href&amp;#34;: &amp;#34;/rest/v0/srs/bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&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;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Depuis votre machine Proxmox VE (ou tout autre machine ayant directement accès au disque à exporter/importer), vous pouvez donc maintenant directement lancer la commande suivante :&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;~# curl -X POST -k -b authenticationToken=xxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -T toto.vhd &amp;#39;https://@IP.Xen.Orchestra/rest/v0/srs/bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb/vdis?name_label=testexport.vhd&amp;#39; | cat
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A l&amp;rsquo;issue de l&amp;rsquo;opération, vous allez récupérer l&amp;rsquo;UUID du disque sur XCP-NG, déjà disponible pour la construction de la VM côté Xen Orchestra.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Avec cette méthode, une fois qu&amp;rsquo;on a un token, l&amp;rsquo;opération d&amp;rsquo;export/import Proxmox VE =&amp;gt; XCP-NG devient donc suivante :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Récupération du disque virtuel sur Proxmox VE (en gros retrouver le disque)&lt;/li&gt;
&lt;li&gt;Transformer le disque virtuel en VHD&lt;/li&gt;
&lt;li&gt;Importer et créer le disque dans XCP-NG via un cURL&lt;/li&gt;
&lt;li&gt;Créer une VM dans l&amp;rsquo;UI et lui affecter le disque&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C&amp;rsquo;est déjà beaucoup plus sympa si vous avez plusieurs VMs à bouger. L&amp;rsquo;axe d&amp;rsquo;amélioration suivant est, à mon avis, de créer directement la VM avec le bon disque.&lt;/p&gt;
&lt;p&gt;A date, ce n&amp;rsquo;est pas possible avec l&amp;rsquo;API REST (vu avec Vates), mais ça serait possible avec l&amp;rsquo;API JSON-RPC (sur laquelle se base l&amp;rsquo;UI de XenOrchestra et xo-cli). Ca sera donc mes prochaines investigations ;).&lt;/p&gt;
&lt;p&gt;D&amp;rsquo;ici là, have fun :)&lt;/p&gt;
&lt;h2 id="bonus---importer-des-raw-directement"&gt;Bonus - Importer des RAW directement
&lt;/h2&gt;&lt;p&gt;Depuis la toute dernière version de Xen Orchestra, il est aussi possible d&amp;rsquo;importer directement des disques au format RAW (en rajouter le paramètre &amp;ldquo;raw&amp;rdquo; dans l&amp;rsquo;appel à l&amp;rsquo;API).&lt;/p&gt;
&lt;p&gt;Dans mon cas, c&amp;rsquo;est mon format de disques puisque tout est stocké en RAW sur mon storage ZFS Proxmox VE, donc en théorie on peut sauter une étape de plus, à savoir :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Transformer le disque virtuel en VHD&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Avec la requête suivante :&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;curl -X POST -k -b authenticationToken=xxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -T toto.img &amp;#39;https://@IP.Xen.Orchestra/rest/v0/srs/bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb/vdis?raw&amp;amp;name_label=testexport.raw&amp;#39; | cat
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Attention aux limitations, cependant :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Après le soucis du raw c&amp;rsquo;est que tu vas pas pouvoir profiter du copy on write, donc exit les snapshots (en l&amp;rsquo;état actuelle de la stack de storage, smapiv1)&lt;/p&gt;
&lt;/blockquote&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>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><item><title>Créer un VPN distribué avec Tinc</title><link>https://blog.zwindler.fr/2020/02/17/creer-un-vpn-distribue-avec-tinc/</link><pubDate>Mon, 17 Feb 2020 07:30:00 +0000</pubDate><guid>https://blog.zwindler.fr/2020/02/17/creer-un-vpn-distribue-avec-tinc/</guid><description>&lt;img src="https://blog.zwindler.fr/2020/03/airwolf03.webp" alt="Featured image of post Créer un VPN distribué avec Tinc" /&gt;&lt;h2 id="faire-un-vpn-tinc-fullmesh-sans-monter-un-gros-réseau-ipsec"&gt;Faire un VPN Tinc fullmesh sans monter un gros réseau IPSec
&lt;/h2&gt;&lt;p&gt;Un des gros problèmes que j’ai rapidement eu à régler lorsque j’ai voulu monter des clusters de serveurs Proxmox VE chez des providers de serveurs physiques, c’est la façon dont est gérée le clustering dans PVE.&lt;/p&gt;
&lt;p&gt;Les concepteurs de PVE ne veulent pas que l’on monte des clusters sur Internet et mettent volontairement le plus de bâtons dans les roues pour vous empêcher de le faire. J’exagère à peine.&lt;/p&gt;
&lt;p&gt;En version 5.x, PVE se basait sur la version 2 de corosync par multicast (bloqué par tous les providers) et qu’en v6.x, on nous bride en demandant explicitement un sous réseau LAN dédié, autant dire qu’on est pas aidé.&lt;/p&gt;
&lt;h2 id="openvpn-vs-tinc"&gt;OpenVPN vs Tinc
&lt;/h2&gt;&lt;p&gt;Une solution que j’ai expérimenté est de monter un serveur OpenVPN sur un des serveurs et de connecter les autres dessus. J’ai d’ailleurs &lt;a class="link" href="https://blog.zwindler.fr/2017/08/29/faire-un-petit-cluster-proxmox-avec-2-machines-kimsufi/" &gt;fait un tuto là dessus pour PVE&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Cette approche n’est pas optimale : si on a 2 machines, c’est bon, mais si on en a 3 ou plus, on se retrouve soit avec un SPOF, soit à devoir monter un maillage complexe de couples serveur-client. Au delà de 3, c’est pratiquement ingérable.&lt;/p&gt;
&lt;p&gt;Au contraire, &lt;a class="link" href="https://www.tinc-vpn.org/" target="_blank" rel="noopener"
&gt;Tinc&lt;/a&gt; est un logiciel libre (GPLv2) permettant de monter des VPNs multipoints (full mesh routing) entre des machines sur Internet. Tinc est &lt;em&gt;prévu&lt;/em&gt; pour notre cas d’usage !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2020/02/tinclogo.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;le vrai logo de Tinc (la photo en haut du blog c’est Supercopter, of course)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="on-sécurise"&gt;On sécurise
&lt;/h2&gt;&lt;p&gt;Comme tout service &amp;ldquo;ouvert&amp;rdquo; sur Internet, il est évidemment nécessaire de faire du firewalling pour bloquer le trafic malveillant. Pour information, Tinc utilise le port 655 en TCP et UDP, que vous devrez donc ouvrir dans les deux sens entre l’ensemble de vos serveurs, mais bloquer pour le reste d’Internet.&lt;/p&gt;
&lt;p&gt;A noter, ce n’est pas confirmé mais &lt;a class="link" href="https://tinc-vpn.org/" target="_blank" rel="noopener"
&gt;la page principale de Tinc&lt;/a&gt; indique qu’il est possible que ce logiciel (tout comme OpenVPN, Wireguard et IPSec) soit vulnérable à la &lt;a class="link" href="https://seclists.org/oss-sec/2019/q4/122" target="_blank" rel="noopener"
&gt;CVE-2019-14899&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="on-linstalle-et-on-le-configure"&gt;On l’installe et on le configure
&lt;/h2&gt;&lt;p&gt;On va devoir installer le package/binaire sur toutes les machines du VPN. Pas trop de soucis de ce côté, tinc est &lt;a class="link" href="https://www.tinc-vpn.org/download/" target="_blank" rel="noopener"
&gt;multiplateforme (Windows aussi) et est packagé dans de nombreuses distrib Linux&lt;/a&gt;. Sur les dépôts Debian, tinc est présent sans souci et j’imagine que ça sera le cas pour d’autres distribs aussi.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;apt install tinc
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Une fois installé, on peut créer notre VPN. Pour déclarer un VPN, il faut ajouter le nom de celui ci dans un fichier de configuration global :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;echo &amp;#34;vpnzwindler&amp;#34; &amp;gt;&amp;gt; /etc/tinc/nets.boot
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On créé ensuite un répertoire du même nom, contenant lui même un dossier &lt;em&gt;hosts&lt;/em&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir -p /etc/tinc/vpnzwindler/hosts
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans ces dossiers, on va créer fichier de configuration, /etc/tinc/vpnzwindler/tinc.conf. Ce fichier va nous permettre de décrire le node courant et qui doit se connecter à qui.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Name = node01
AddressFamily = ipv4
Address = 1.1.1.1
Device = /dev/net/tun
Mode = switch
ConnectTo = node02
ConnectTo = node03
ConnectTo = node04
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans les informations importantes, &lt;strong&gt;Name&lt;/strong&gt; va être le nom (arbitraire) du node pour tout le VPN, &lt;strong&gt;Address&lt;/strong&gt; représente l’adresse IP publique de votre node, et &lt;strong&gt;ConnectTo&lt;/strong&gt;, la liste des autres &lt;strong&gt;Names&lt;/strong&gt; des autres nodes.&lt;/p&gt;
&lt;p&gt;A partir de là, on peut demander à tinc de nous générer des couples clé publique/clé privée pour tous nos serveurs. Sur tous les nodes du VPN, lancer :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;echo -e &amp;#39;\n\n&amp;#39; | tincd -n vpnzwindler -K4096
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si tout se passe bien et que tous les fichiers de conf et dossiers ont été créés correctement, &lt;em&gt;tinc&lt;/em&gt; devrait créer un couple clé privée/clé publique, puis créer un fichier /etc/tinc/vpnzwindler/hosts/node01 (sur celui dont le Name est node01).&lt;/p&gt;
&lt;p&gt;Envoyez (par scp par exemple) l’ensemble des fichiers dans le dossier hosts sur tous les serveurs. Maintenant, tous les VPNs sauront quelle IP publique contacter et avec quel clé authentifier le trafic.&lt;/p&gt;
&lt;h2 id="autre-méthode--tinc-invite--tinc-join"&gt;Autre méthode : tinc invite / tinc join
&lt;/h2&gt;&lt;p&gt;Une feature sympa de &lt;em&gt;tinc&lt;/em&gt;, mais seulement en 1.1 (la dernière version), est la possibilité d’ajouter des nodes à un VPN existants via une simple commande tinc invite (&lt;a class="link" href="https://www.tinc-vpn.org/documentation-1.1/How-invitations-work.html#How-invitations-work" target="_blank" rel="noopener"
&gt;voir la doc&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Je ne l’ai pas testée mais a priori tinc créé une URL qui permet d’inviter n’importe qui et de configurer son node avec un tinc join.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The whole URL is around 80 characters long and looks like this: server.example.org:12345/cW1NhLHS-1WPFlcFio8ztYHvewTTKYZp8BjEKg3vbMtDz7w4&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="configuration-du-réseau-de-los"&gt;Configuration du réseau de l’OS
&lt;/h2&gt;&lt;p&gt;Maintenant qu’on a tous les prérequis, on peut configurer l’aspect réseau de notre VPN. Ça dépend de votre distribution bien sûr (où dans le cas de PVE, si vous utilisez OpenVSwitch ou pas par exemple). Dans le cas d’une Debian récente, on va gérer tout ça avec ip.&lt;/p&gt;
&lt;p&gt;Pour gérer cette partie, Tinc va vous demander de créer 2 scripts. Un tinc-up.sh et un tinc-down.sh, respectivement pour le démarrage et l’extinction de l’interface VPN.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat /etc/tinc/vpnzwindler/tinc-up
#!/bin/bash
/sbin/ip link set vpnzwindler up
/sbin/ip addr add 10.0.0.1/24 dev vpnzwindler
/sbin/ip route add 10.0.0.0/24 dev vpnzwindler
cat /etc/tinc/vpnzwindler/tinc-down
#!/bin/bash
/sbin/ip link set vpnzwindler down
chmod +x tinc-*
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Rien de bien compliqué ici, on demande au binaire ip de créer une interface vpnzwindler. Puis on lui affecte l’IP virtuelle 10.0.0.1 (notre node01). Enfin d’ajouter une route pour que tout le trafic du VPN passe par cette interface.&lt;/p&gt;
&lt;h2 id="on-le-démarre"&gt;On le démarre
&lt;/h2&gt;&lt;p&gt;Dernière étape, on va demander à systemd de nous démarrer le vpn qu’on vient de créer dès le démarrage de la machine.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;systemctl daemon-reload
systemctl enable tinc@vpnzwindler
systemctl start tinc@vpnzwindler
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et voilà !!! Vous avez maintenant un VPN multipoint simple et efficace !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;root@node01 ~ # ping node02
PING node02 (10.0.0.2) 56(84) bytes of data.
64 bytes from node02 (10.0.0.2): icmp_seq=1 ttl=64 time=17.1 ms
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Un cluster Proxmox VE avec seulement 2 machines !</title><link>https://blog.zwindler.fr/2019/10/11/un-cluster-proxmox-ve-avec-seulement-2-machines/</link><pubDate>Fri, 11 Oct 2019 06:40:55 +0000</pubDate><guid>https://blog.zwindler.fr/2019/10/11/un-cluster-proxmox-ve-avec-seulement-2-machines/</guid><description>&lt;img src="https://blog.zwindler.fr/2019/10/proxmox.webp" alt="Featured image of post Un cluster Proxmox VE avec seulement 2 machines !" /&gt;&lt;p&gt;Depuis le temps que je vous parle de clusters et de Proxmox (en gros, &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=proxmox" &gt;depuis 2015&lt;/a&gt;), ou même de clusters tout court, j’ai pu vous en mettre des tartines sur le fait qu’il ne faut pas faire des clusters avec un nombre pair de machines (ou tout autre cas défavorable dans lequel deux moitiés d’un cluster peuvent se retrouver isolées l’une de l’autre). Le split brain, c’est pas bon pour votre Karma, croyez moi sur parole (ou &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=split" &gt;allez voir vous même&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Ça me rappelle la fois où un &amp;ldquo;&amp;ldquo;&amp;ldquo;architecte&amp;rdquo;&amp;rdquo;&amp;rdquo; de chez Datacore était venu nous expliquer que sa solution de stockage à 2 pattes ne POUVAIT PAS avoir de split brain (alors que si, les ingés du support ont du repasser par derrière pour nous dire que &amp;ldquo;oui désolé vous avez évidemment raison c’est un cas possible&amp;rdquo; #LOL).&lt;/p&gt;
&lt;p&gt;Bref, et donc à force d’en parler, il fallait bien quand même que je donne un jour la solution pour le faire quand même, mais proprement. Sans trop de surprise, Corosync, la librairie qui gère les clusters Linux depuis qu’on a arrêté de faire des horreurs avec heartbeat (ou pire : &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=redhat&amp;#43;cluster&amp;#43;suite" &gt;cman+rgmanager, achevez moi&lt;/a&gt;), gère évidemment les deux possibilités :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gérer soit même le membre prioritaire en cas de split brain avec un poids (ça on va pas en parler mais sachez que c’est possible)&lt;/li&gt;
&lt;li&gt;Ajouter un vote externe pour obtenir un quorum (comme tous les vrais logiciels qui font du clustering un peu sérieux quoi)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="limitations-du-corosync-external-vote-dans-pve"&gt;Limitations du &amp;ldquo;Corosync External Vote&amp;rdquo; dans PVE
&lt;/h2&gt;&lt;p&gt;La petite déception du jour viendra surtout du fait que, si la documentation de Proxmox VE indique clairement que l’option est supportée, en réalité, le support se limite aux fonctions natives de corosync, et encore pas toutes.&lt;/p&gt;
&lt;p&gt;Pas moyen de voir notre vote externe dans l’interface de Proxmox VE par exemple. A priori, le support des quorum disk n’est plus assuré non plus depuis la version 4 de PVE.&lt;/p&gt;
&lt;p&gt;Ensuite, il faut aussi savoir que pour l’instant, seul l’utilisation d’une IP pour renseigner le quorum serveur est possible. On ne peut pas utiliser un FQDN, ce qui me parait dingue comme limitation en 2019, mais bon&amp;hellip;&lt;/p&gt;
&lt;p&gt;Ces deux points mis de côté, vous allez voir, ce n’est pas sorcier. La procédure est en bonne partie détaillée &lt;a class="link" href="https://pve.proxmox.com/wiki/Cluster_Manager#_corosync_external_vote_support" target="_blank" rel="noopener"
&gt;dans la documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="prérequis"&gt;Prérequis
&lt;/h2&gt;&lt;p&gt;Pour ce tutoriel, vous allez donc avoir besoin de 2 machines (a minima), déjà en cluster. Si vous ne les avez pas déjà, je vous invite à regarder &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=proxmox" &gt;les moults tutoriels précédents&lt;/a&gt;, en particulier celui sur &lt;a class="link" href="https://blog.zwindler.fr/2019/08/20/cluster-proxmox-ve-v6-cette-fois-ci/" &gt;la mise en place d’un cluster Proxmox VE 6&lt;/a&gt; (le plus récent).&lt;/p&gt;
&lt;p&gt;Vous allez aussi avoir besoin d’un serveur tiers (un bout de VM ou de container quelque part, en dehors de vos 2 (ou tout autres quantité de machines étant localisées dans 2 endroits distincts dont il existe un risque qu’ils puissent subitement &amp;ldquo;ne plus se voir&amp;rdquo;, d’un point de vue réseau, induisant le fameux split brain tant redouté).&lt;/p&gt;
&lt;p&gt;Fun fact, il y a &lt;a class="link" href="https://pve.proxmox.com/wiki/Raspberry_Pi_as_third_node" target="_blank" rel="noopener"
&gt;une page de wiki pour faire la même chose à la main avec un RPi&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ce serveur tiers n’a pas besoin de faire fonctionner Proxmox (c’est même plutôt mieux d’ailleurs car PVE n’a aucune plus-value ici). Ça doit juste être une distrib linux capable d’installer un démon corosync qnetd. Ce serveur, nous l’appellerons &amp;ldquo;quorum&amp;rdquo;, par abus de langage grossier ;-).&lt;/p&gt;
&lt;h2 id="configuration"&gt;Configuration
&lt;/h2&gt;&lt;p&gt;Sur le serveur quorum, installer corosync qnetd. Sur une Debian like, vous avez de la chance, il existe un package présent dans les dépôts par défaut, et il faut simplement faire un :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt install corosync-qnetd
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ensuite, sur tous les serveurs Proxmox VE de notre cluster, on va installer le package corosync-qdevice, qui va leur permettre d’interroger le quorum.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt install corosync-qdevice
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sur le serveur quorum de nouveau, ajouter la clé SSH d’un des serveurs PVE (un seul suffit). Une fois que c’est fait, connecter le cluster au quorum.&lt;/p&gt;
&lt;p&gt;Cela va sans dire, mais faire la commande depuis le serveur dont on vient d’ajouter la clé, pas l’autre hein ;-p. Et remplacez &lt;QDEVICE-IP&gt; par l’IP du serveur quorum !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pvecm qdevice setup &amp;lt;QDEVICE-IP&amp;gt;
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: &amp;#34;/root/.ssh/id_rsa.pub&amp;#34;
The authenticity of host &amp;#39;x.x.x.x&amp;#39; can&amp;#39;t be established.
ECDSA key fingerprint is SHA256:LPaaaaaaaaaaaaaaaaaPZjaIg.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.
(if you think this is a mistake, you may want to use -f option)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Je met volontairement une grosse partie de la trace car comme ça on peut parler de ce que fait la commande &lt;em&gt;pvecm qdevice setup x.x.x.x&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Comme vous pouvez le constater, cette commande semble assez similaire à celle pour créer manuellement le cluster. A savoir, elle commence déjà par copier les clés SSH sur le serveur distant, histoire que tout le monde puisse discuter ensemble en SSH.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;INFO: initializing qnetd server
Certificate database (/etc/corosync/qnetd/nssdb) already exists. Delete it to initialize new db
INFO: copying CA cert and initializing on all nodes
node &amp;#39;pve01&amp;#39;: Creating /etc/corosync/qdevice/net/nssdb
password file contains no data
node &amp;#39;pve01&amp;#39;: Creating new key and cert db
node &amp;#39;pve01&amp;#39;: Creating new noise file /etc/corosync/qdevice/net/nssdb/noise.txt
node &amp;#39;pve01&amp;#39;: Importing CA
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ensuite, on initialise, sur tous les nodes du cluster, le qdevice, qui va permet au node de communiquer avec le quorum. Là j’élude un peu car ça parle beaucoup de certificats et de clés qui sont échangées.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;INFO: copy and import pk12 cert to all nodes&amp;lt;br&amp;gt;INFO: add QDevice to cluster configuration
INFO: start and enable corosync qdevice daemon on node &amp;#39;pve01&amp;#39;...
Synchronizing state of corosync-qdevice.service with SysV service script with /lib/systemd/systemd-sysv-install.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Normalement, si tout se passe bien, vous devriez en arriver là, une fois que tout le monde s’est bien échangé ses certificats, clés et autres joyeusetés crytographiques.&lt;/p&gt;
&lt;p&gt;Une petite commande pour vérifier l’état du bazar :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ pvecm status
Quorum information
------------------
Date: Mon Aug 26 14:49:14 2019
Quorum provider: corosync_votequorum
Nodes: 2
Node ID: 0x00000002
Ring ID: 1/1271796
Quorate: Yes
Votequorum information
----------------------
Expected votes: 3
Highest expected: 3
Total votes: 3
Quorum: 2
Flags: Quorate Qdevice
Membership information
----------------------
Nodeid Votes Qdevice Name
0x00000001 1 A,V,NMW 10.0.0.1
0x00000002 1 A,V,NMW 10.0.0.2 (local)
0x00000000 1 Qdevice
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ça, c’est le genre de choses que j’attends d’un logiciel de clustering digne de ce nom. D’une simple commande, on peut avoir&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le nombre de nodes&lt;/li&gt;
&lt;li&gt;l’ID du node courant&lt;/li&gt;
&lt;li&gt;le nombre de votes actuels, attendus, et minimum pour que le cluster soit &amp;ldquo;QUORATE&amp;rdquo;&lt;/li&gt;
&lt;li&gt;et enfin l’état de tout le cluster.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ici, avec 2 nodes + le quorum, on a bien 3 votes. Tant qu’on a 2 votes, on a le quorum, CQFD.&lt;/p&gt;
&lt;p&gt;Dans ce cas de figure, si on perd un nœud OU le quorum, on a toujours 2 votes et le cluster doit continuer à fonctionner &amp;ldquo;normalement&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Et c’est ce qu’on va vérifier !&lt;/p&gt;
&lt;h2 id="on-casse-un-nœud-pour-voir"&gt;On casse un nœud, pour voir
&lt;/h2&gt;&lt;p&gt;Normalement, si on a pas le serveur quorum, tout devrait être brisé (comme dirait Medieval Ops).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/tweet_medieval.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;En gros les VMs doivent continuer à tourner, mais toute opération (démarrage de VM, modification quelconque) doit être bloquée (pour éviter de démarrer la même VM à 2 endroits et pleurer pour recoller les morceaux).&lt;/p&gt;
&lt;p&gt;Or ici dès que l’hôte n’est plus joignable, le nœud survivant le détecte, et comme le quorum ne voit plus lui non plus qu’un seul nœud, indique au dernier qu’il peut continuer sa vie comme si de rien n’était (c’est glauque&amp;hellip;).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ pvecm status
Quorum information
------------------
Date: Thu Aug 29 11:10:31 2019
Quorum provider: corosync_votequorum
Nodes: 2
Node ID: 0x00000002
Ring ID: 1/1271820
Quorate: Yes
Votequorum information
----------------------
Expected votes: 3
Highest expected: 3
Total votes: 2
Quorum: 2
Flags: Quorate Qdevice
Membership information
----------------------
Nodeid Votes Qdevice Name
0x00000002 1 A,V,NMW 10.0.0.2 (local)
0x00000000 1 Qdevice
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le nombre de vote passe bien à 2 (mais comme on est toujours égal à quorum c’est bon) et le node 1 a bien disparu :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/08/pve_down_quorate.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Et la petite déception, pas de visualisation en console du vote du quorum, malgré la mention &amp;ldquo;Quorate&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Mais bon, c’est quand même cool que ça marche, et en vrai c’est bien l’essentiel ;)&lt;/p&gt;
&lt;h2 id="bonus--erreur-insserv-fatal-service-corosync-has-to-be-enabled"&gt;Bonus : Erreur insserv: FATAL: service corosync has to be enabled
&lt;/h2&gt;&lt;p&gt;Si vous rencontrez l’erreur suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;insserv: FATAL: service corosync has to be enabled to use service corosync-qdevice
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Allez supprimer le fichier d’init SysV corosync sur tous les hôtes&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;rm /etc/init.d/corosync-qdevice
systemctl enable corosync-qdevice
systemctl start corosync-qdevice
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Source : &lt;a class="link" href="https://forum.proxmox.com/threads/setting-up-qdevice-fails.56061/" target="_blank" rel="noopener"
&gt;https://forum.proxmox.com/threads/setting-up-qdevice-fails.56061/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>[Tutoriel] Faire un petit cluster Proxmox chez Kimsufi avec OpenVPN</title><link>https://blog.zwindler.fr/2017/08/29/faire-un-petit-cluster-proxmox-avec-2-machines-kimsufi/</link><pubDate>Tue, 29 Aug 2017 11:40:23 +0000</pubDate><guid>https://blog.zwindler.fr/2017/08/29/faire-un-petit-cluster-proxmox-avec-2-machines-kimsufi/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/08/proxmox_logo.webp" alt="Featured image of post [Tutoriel] Faire un petit cluster Proxmox chez Kimsufi avec OpenVPN" /&gt;&lt;h2 id="cest-la-rentrée-vous-reprendrez-bien-un-petit-article-sur-proxmox-"&gt;C’est la rentrée, vous reprendrez bien un petit article sur Proxmox !
&lt;/h2&gt;&lt;p&gt;Ou plutôt, c’est bientôt la rentrée et il est grand temps que je solde les articles qui trainent dans mes tiroirs car je moi pars bientôt en vacances.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;« Et tout le monde s’en fout »&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;J’ai donc rédigé un tutoriel pas à pas pour vous montrer qu’on peut créer rapidement un petit cluster sous Proxmox avec deux petites machines chez un hébergeur pas cher type Kimsufi (j’avais justement deux machines car j’ai profité d’une promo chez eux), sans que les machines soient dans le même sous réseau IP.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/08/kimsufi01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Si vous ne connaissez pas Proxmox, je vous renvoie vers &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=Proxmox" &gt;les articles que M4vr0x ou moi avons écris sur le sujet&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="pourquoi-un-tutoriel-pour-les-clusters-proxmox-"&gt;Pourquoi un tutoriel pour les clusters Proxmox ?
&lt;/h2&gt;&lt;p&gt;Vous allez me dire, pourquoi un énième article sur le sujet ? &lt;a class="link" href="https://pve.proxmox.com/wiki/Proxmox_VE_4.x_Cluster" target="_blank" rel="noopener"
&gt;La documentation officielle, même si elle est en anglais&lt;/a&gt;, est assez claire et il existe plusieurs tutoriels en Français pour le faire.&lt;/p&gt;
&lt;p&gt;Ah ah oui&amp;hellip; mais la distinction c’est « faire un cluster de machines Proxmox, &lt;strong&gt;sans que les machines soient dans le même sous réseau IP&lt;/strong&gt; » !&lt;/p&gt;
&lt;p&gt;Et à moins que vous ayez une chance de ouf’, il est peu probable que vos deux Kimsufi le soient.&lt;/p&gt;
&lt;h2 id="petit-rappel-des-prérequis-pour-faire-un-cluster-proxmox"&gt;Petit rappel des prérequis pour faire un cluster Proxmox
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Deux serveurs physiques (au minimum)&lt;/li&gt;
&lt;li&gt;Port 22 accessible au moins dans un premier temps pour configurer le cluster&lt;/li&gt;
&lt;li&gt;Que la latence d’un serveur à l’autre soit inférieure à 2ms&lt;/li&gt;
&lt;li&gt;Que les deux serveurs soient capables de communiquer en multicast&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Et là, c’est le drame !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jusqu’à ce qu’on arrive à la dernière ligne, nous étions sereins.&lt;/p&gt;
&lt;p&gt;Si jamais vous avez deux serveurs chez Kimsufi (ou autre) et que vous essayez de les faire communiquer en multicast, vous allez vite vous rendre compte que le multicast est bloqué !&lt;/p&gt;
&lt;p&gt;Impossible donc de faire fonctionner correctement votre cluster Proxmox (basé sur &lt;strong&gt;corosync&lt;/strong&gt;) sans cela. Vous pouvez mettre tous les autres tutos à la poubelle ;-).&lt;/p&gt;
&lt;h2 id="bidouille--compagnie-et-les-risques-encourus"&gt;Bidouille &amp;amp; compagnie, et les risques encourus
&lt;/h2&gt;&lt;p&gt;Si vous vous sentez la curiosité de monter quand même un cluster sur votre Kimsufi, on va contourner le problème en montant un VPN entre les deux machines. &lt;a class="link" href="https://blog.zwindler.fr/2017/07/25/deploiement-de-proxmox-ve-5-sur-un-serveur-dedie-part-3/" &gt;M4vr0x a déjà détaillé l’utilisation d’OpenVPN avec pfSense sur Proxmox&lt;/a&gt;, mais on n’était pas dans le même contexte.&lt;/p&gt;
&lt;p&gt;On ne peut pas se baser là dessus dans le cas présent car Proxmox a la fâcheuse manie de &lt;strong&gt;réinitialiser toute la configuration lorsqu’on démarre le mode « cluster »&lt;/strong&gt; .&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ATTENTION !!!&lt;/strong&gt;&lt;br&gt;
Oui, ça veut bien dire que vous ne verrez plus ni vos VMs existantes, ni le stockage que vous avez précédemment configuré&amp;hellip;&lt;br&gt;
Les VMs continuent d’exister et sont accessibles tant que vous ne rebootez pas. Le stockage aussi. Ce n’est juste plus visible.&lt;/p&gt;
&lt;p&gt;Vous l’avez deviné, c’est du vécu : j’ai flingué ma configuration existante lorsque j’ai initialisé le cluster.&lt;/p&gt;
&lt;h2 id="mise-en-réseau"&gt;Mise en réseau
&lt;/h2&gt;&lt;p&gt;Maintenant que vous savez ce que vous risquez, on va donc configurer tout ça à la main, directement en SSH sur les machines Proxmox :&lt;/p&gt;
&lt;h3 id="sur-le-serveur-1"&gt;Sur le serveur 1
&lt;/h3&gt;&lt;p&gt;La première chose à faire est simplement d’installer &lt;strong&gt;openvpn&lt;/strong&gt;, ainsi qu’un utilitaire qui s’appelle &lt;strong&gt;easy-rsa&lt;/strong&gt; qui va nous faciliter la tâche de configuration.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;apt-get update
apt-get upgrade
apt-get install openvpn easy-rsa
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Une fois que c’est fait, on copie les templates de config et les scripts de easy-rsa et on modifie les valeurs par défaut par nos propres valeurs.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cp -ai /usr/share/easy-rsa/ /etc/openvpn/easy-rsa/
cd /etc/openvpn/easy-rsa/
vi vars
[...]
# These are the default values for fields
# which will be placed in the certificate.
# Don&amp;#39;t leave any of these fields blank.
export KEY_COUNTRY=&amp;#34;FR&amp;#34;
export KEY_PROVINCE=&amp;#34;Aquitaine&amp;#34;
export KEY_CITY=&amp;#34;Bordeaux&amp;#34;
export KEY_ORG=&amp;#34;mondomaine.tld&amp;#34;
export KEY_EMAIL=&amp;#34;key@mondomaine.tld&amp;#34;
export KEY_OU=&amp;#34;key&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sourcez le fichier nouvellement rempli :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;. ./vars
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Nettoyez les clés provenant d’anciennes itérations de l’outil (pas nécessaire si c’est la première fois mais si vous n’en êtes pas au premier coup, ça peut éviter des erreurs bêtes) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;./clean-all
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et enfin, on génère l’ensemble des clés dont vous aurez besoin (les CA, les clés serveurs, les clés clientes et la diffie helmann) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;./build-ca
./build-key-server serveur1.mondomaine.tld
./build-key serveur2.mondomaine.tld
./build-dh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Normalement tout devrait se passer sans encombre et vous devriez avoir plusieurs certificats nouvellement créés. On va copier les certificats du serveur OpenVPN dans le dossier /etc/openvpn, puis envoyer les certificats du client par SCP :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cp keys/ca.* keys/serveur1.mondomaine.tld.* keys/dh2048.pem /etc/openvpn/
scp keys/ca.crt keys/serveur2.mondomaine.tld.crt keys/serveur2.mondomaine.tld.key serveur2.mondomaine.tld:/etc/openvpn/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Maintenant qu’on a tout, on peut créer le fichier de configuration. Ici rien de bien compliqué à comprendre :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On créé un fichier server.conf qui va monter un VPN sur le port 1194 en UDP via un device de type TAP (j’y reviendrai) et on force le réseau en 10.9.0.0/24&lt;/li&gt;
&lt;li&gt;On donne le chemin vers tous les certificats qu’on vient de créer&lt;/li&gt;
&lt;li&gt;On ajoute un script « up » et un script « down », avec l’option script-security à « 2 » sinon ça ne fonctionnera pas&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat &amp;gt; /etc/openvpn/server.conf &amp;lt;&amp;lt; EOF
# [server.conf]
port 1194
proto udp
#dev tun
dev tap
ca /etc/openvpn/ca.crt
cert /etc/openvpn/serveur1.mondomaine.tld.crt
key /etc/openvpn/serveur1.mondomaine.tld.key
dh /etc/openvpn/dh2048.pem
server 10.9.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
script-security 2
up /etc/openvpn/add_multicast_route
down /etc/openvpn/add_multicast_route
EOF
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Bon et qu’est ce qu’il contient ce fameux script ? Et bien pour l’instant il se contente simplement d’ajouter et de supprimer une route sur les serveurs qui va router « à la main » tout le traffic multicast non par vers la gateway, mais vers le VPN ! Et c’est comme ça qu’on va contourner le blocage des flux multicast entre nos deux Kimsufi !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi /etc/openvpn/add_multicast_route
#!/bin/bash
#
# Add a route to force multicast through VPN
[ &amp;#34;$script_type&amp;#34; ] || exit 0
case &amp;#34;$script_type&amp;#34; in
up)
route add -net 224.0.0.0 netmask 240.0.0.0 dev $1
;;
down)
route del -net 224.0.0.0 netmask 240.0.0.0 dev $1
;;
esac
chmod +x /etc/openvpn/add_multicast_route
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On termine par démarrer (et activer au démarrage) le serveur OpenVPN :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;systemctl enable openvpn
systemctl start openvpn
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans ce cas là, comme on est pas en réel mode client serveur ou l’ensemble du traffic client est routé sur le serveur on a pas besoin de modifier le paramètre kernel « ip_forward » :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="aparté-tun-vs-tap"&gt;Aparté tun vs tap
&lt;/h3&gt;&lt;p&gt;Les plus aguerris d’entre vous auront remarqués que j’ai volontairement choisi de ne pas utiliser une interface virtuelle de type &lt;strong&gt;tun&lt;/strong&gt; (par défaut dans OpenVPN) mais une interface de type &lt;strong&gt;tap&lt;/strong&gt;.&lt;br&gt;
Historiquement, ce type d’interface est connu pour ne pas fonctionner correctement en multicast, ce qui est ici notre but principal.&lt;/p&gt;
&lt;p&gt;A priori c’est censé être résolu depuis longtemps, mais chez moi ça n’a pas marché alors que dès que j’ai switché sur &lt;strong&gt;tap&lt;/strong&gt; ça a fonctionné directement. Je vous engage à regarder si ça vous intéresse. J’ai mis un lien vers une discussion à ce sujet sur le forum d’OpenVPN en fin d’article.&lt;/p&gt;
&lt;h3 id="sur-le-serveur-2"&gt;Sur le serveur 2
&lt;/h3&gt;&lt;p&gt;Maintenant que le serveur est configuré, au tour du client. Même topo, à ceci près qu’on ne va pas générer de certificats (c’est déjà fait).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;apt-get update
apt-get upgrade
apt-get install openvpn
cat &amp;gt; /etc/openvpn/client.conf &amp;lt;&amp;lt; EOF
# [client.conf]
client
#dev tun
dev tap
proto udp
remote @IP_publique_du_serveur1 1194
resolv-retry infinite
nobind
persist-key
persist-tun
mute-replay-warnings
ca /etc/openvpn/ca.crt
cert /etc/openvpn/serveur2.mondomaine.tld.crt
key /etc/openvpn/serveur2.mondomaine.tld.key
ns-cert-type server
comp-lzo
verb 3
script-security 2
up /etc/openvpn/add_multicast_route
down /etc/openvpn/add_multicast_route
EOF
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;vi /etc/openvpn/add_multicast_route
#!/bin/bash
#
# Add a route to force multicast through VPN
[ &amp;#34;$script_type&amp;#34; ] || exit 0
case &amp;#34;$script_type&amp;#34; in
up)
route add -net 224.0.0.0 netmask 240.0.0.0 dev $1
;;
down)
route del -net 224.0.0.0 netmask 240.0.0.0 dev $1
;;
esac
chmod +x /etc/openvpn/add_multicast_route
systemctl enable openvpn
systemctl start openvpn
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Facile, hein ?&lt;/p&gt;
&lt;h3 id="sur-tous-les-nœuds"&gt;Sur tous les nœuds
&lt;/h3&gt;&lt;p&gt;Pour s&amp;rsquo;assurer que tout fonctionne comme ça devrait (ou pour déboguer), vous pouvez autoriser temporairement la réponse à l&amp;rsquo;ICMP sur multicast. Un simple ping permettra de s&amp;rsquo;assurer que les deux serveurs se voient bien :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sysctl net.ipv4.icmp_echo_ignore_broadcasts=0
root@serveur1:/etc/pve# ping 224.0.0.1
PING 224.0.0.1 (224.0.0.1) 56(84) bytes of data.
64 bytes from 10.9.0.1: icmp_seq=1 ttl=64 time=0.019 ms
64 bytes from 10.9.0.2: icmp_seq=1 ttl=64 time=1.07 ms (DUP!)
64 bytes from 10.9.0.1: icmp_seq=2 ttl=64 time=0.020 ms
64 bytes from 10.9.0.2: icmp_seq=2 ttl=64 time=0.672 ms (DUP!)
64 bytes from 10.9.0.1: icmp_seq=3 ttl=64 time=0.020 ms
64 bytes from 10.9.0.2: icmp_seq=3 ttl=64 time=0.619 ms (DUP!)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Les deux serveurs répondent aux pings depuis l&amp;rsquo;interface du VPN, on est bons ! Du coup vous pouvez re-désactiver la réponse aux broadcasts avec la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sysctl net.ipv4.icmp_echo_ignore_broadcasts=1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour faciliter la résolution de noms dans le cluster, vous pouvez ajouter les IPs VPN des serveurs dans le fichier /etc/hosts.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi /etc/hosts
[...]
10.9.0.1 serveur1-vpn
10.9.0.2 serveur2-vpn
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="création-du-cluster"&gt;Création du cluster
&lt;/h2&gt;&lt;h3 id="sur-le-nœud-1"&gt;Sur le nœud 1
&lt;/h3&gt;&lt;p&gt;En théorie, si on lit la documentation il suffit simplement de faire &amp;ldquo;pvecm create mycluster&amp;rdquo; et le tour est joué.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;STOOOOP !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Si vous le faite, ça ne fonctionnera pas (et vous pourrez &lt;a class="link" href="https://blog.zwindler.fr/2017/09/19/tutoriel-demonter-proprement-cluster-proxmox-ve/" &gt;vous en sortir avec cet article&lt;/a&gt;). Pourtant tout est correct au niveau des prérequis : les nœuds fonctionnent bien et que le multicast est correctement routé via le VPN. Un coup d’œil au fichier de configuration de corosync nous en apprendra plus :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat /etc/pve/corosync.conf
logging {
debug: off
to_syslog: yes
}
nodelist {
node {
name: serveur2
nodeid: 2
quorum_votes: 1
ring0_addr: serveur2
}
node {
name: serveur1
nodeid: 1
quorum_votes: 1
ring0_addr: serveur1
}
}
quorum {
provider: corosync_votequorum
}
totem {
cluster_name: mycluster
config_version: 4
ip_version: ipv4
secauth: on
version: 2
interface {
bindnetaddr: @IP_publique_du_serveur1
ringnumber: 0
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;En fait le problème ici, c&amp;rsquo;est que l&amp;rsquo;adresse bindée &lt;strong&gt;bindnetaddr:&lt;/strong&gt; n&amp;rsquo;est pas bonne. Si vous n&amp;rsquo;avez pas lu mon gros &amp;ldquo;STOOOOP&amp;rdquo;, il faut tout réinitialiser car il est assez compliqué de modifier un cluster existant sous Proxmox (a priori pas possible proprement mais je vous donnerai la tips dans un prochain article).&lt;/p&gt;
&lt;p&gt;Voilà la bonne commande à taper :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pvecm create mycluster -bindnet0_addr 10.9.0.1 -ring0_addr serveur1-vpn
Corosync Cluster Engine Authentication key generator.
Gathering 1024 bits for key from /dev/urandom.
Writing corosync key to /etc/corosync/authkey.
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="sur-le-noeud-2"&gt;Sur le noeud 2
&lt;/h3&gt;&lt;p&gt;En théorie, là aussi c&amp;rsquo;est très facile. Il suffit de faire &amp;ldquo;pvecm add serveur2-vpn&amp;rdquo; pour que l&amp;rsquo;hôte serveur2.mondomaine.tld rejoigne le cluster créé sur le noeud serveur1.mondomaine.tld.&lt;/p&gt;
&lt;p&gt;Voilà ce qui va se passer si vous le faites :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pvecm add serveur1-vpn
The authenticity of host &amp;#39;serveur1-vpn (10.9.0.1)&amp;#39; can&amp;#39;t be established.
ECDSA key fingerprint is SHA256:VOIH2X7kTzWLUEzRPCl4431hlYnc3HCsDmzXYEs3V+g.
Are you sure you want to continue connecting (yes/no)? yes
root@serveur1-vpn&amp;#39;s password:
copy corosync auth key
stopping pve-cluster service
backup old database
Job for corosync.service failed because the control process exited with error code.
See &amp;#34;systemctl status corosync.service&amp;#34; and &amp;#34;journalctl -xe&amp;#34; for details.
waiting for quorum...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Même principe ici. Si l&amp;rsquo;adresse &lt;strong&gt;ring0_addr&lt;/strong&gt; n&amp;rsquo;est pas spécifiée explicitement, corosync va tenter de s&amp;rsquo;abonner sur une IP multicast sur l&amp;rsquo;IP de l&amp;rsquo;interface Ethernet principale. Elle ne passera donc pas pas notre VPN et le cluster ne communiquera pas en multicast !&lt;/p&gt;
&lt;p&gt;Vous pouvez &lt;a class="link" href="https://pve.proxmox.com/wiki/Separate_Cluster_Network#quorum.expected_votes_must_be_configured" target="_blank" rel="noopener"
&gt;en lire plus là dessus sur ce lien&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sur le noeud serveur2, on ajoute donc l&amp;rsquo;adresse IP (et donc l&amp;rsquo;interface) que corosync devra emprunter pour communiquer avec serveur1-vpn (via le VPN donc).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pvecm add serveur1-vpn -ring0_addr 10.9.0.2
The authenticity of host &amp;#39;serveur1-vpn (10.9.0.1)&amp;#39; can&amp;#39;t be established.
ECDSA key fingerprint is SHA256:oKkuOYY1pbEa1RrM0y9fWVJfnQabhUvG7la+6fZUnQ4.
Are you sure you want to continue connecting (yes/no)? yes
root@serveur2-vpn&amp;#39;s password:
copy corosync auth key
stopping pve-cluster service
backup old database
waiting for quorum...OK
generating node certificates
merge known_hosts file
restart services
successfully added node &amp;#39;serveur2&amp;#39; to cluster.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, tout devrait marcher. Vous devriez avoir sur la même interface vos deux serveurs, et avoir perdu toutes vos VMs si vous n&amp;rsquo;avez pas bien lu mon avertissement ;-)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/08/pve_cluster_1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;A noter : chose qui n&amp;rsquo;était pas possible entre la version 3 et la version 4 (car les deux composants n&amp;rsquo;utilisaient pas le même logiciel pour le clustering), il est possible de faire un cluster ProxMox mixant version 4 et version 5 comme le montre cette capture d&amp;rsquo;écran :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/08/pve_cluster_2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="aller-plus-loin--les-limites-dopenvpn"&gt;Aller plus loin : les limites d&amp;rsquo;OpenVPN
&lt;/h2&gt;&lt;p&gt;On a maintenant un cluster de 2 machines Proxmox. Pour autant, ce n&amp;rsquo;est pas idéal et ça ne suffira pas pour passer en production, notamment en cas de coupure réseau entre les deux machines (split brain). On va vite vouloir en rajouter au moins une, sinon plus.&lt;/p&gt;
&lt;p&gt;Cependant, on sera bloqués. Les limites de cette méthode est que la configuration d&amp;rsquo;OpenVPN est en mode client-serveur. Si vous avez plus de 2 machines, vous vous rendrez vite compte que vous pouvez communiquer entre les clients et le serveurs, mais pas entre clients.&lt;/p&gt;
&lt;p&gt;Et en gros ça ne marche pas, le 3ème noeud ne rejoindra pas le cluster car il ne peut pas joindre l&amp;rsquo;ensemble des membres et il se mettra en defaut.&lt;/p&gt;
&lt;p&gt;Pour bien faire en conservant ce mécanisme, il va falloir monter un service VPN externe aux serveurs Proxmox, qui seront tous clients de ce service, ou alors se créer un réseau de type full mesh, par exemple avec de l&amp;rsquo;IPSec si vous êtes un maitre en Réseau/Telco.&lt;/p&gt;
&lt;p&gt;Autant dire qu&amp;rsquo;il vaut mieux passer par un hébergeur qui permet le multicast ou qui fourni un service VPN. Ca ira plus vite&amp;hellip;&lt;/p&gt;
&lt;h2 id="sources-et-sujets-connexes"&gt;Sources et sujets connexes
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://developers-club.com/posts/251541/" target="_blank" rel="noopener"
&gt;Un autre tuto qui ne me semble pas 100% exact, notamment la partie création et &amp;ldquo;join&amp;rdquo; du cluster&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://forums.openvpn.net/viewtopic.php?t=8036" target="_blank" rel="noopener"
&gt;Sending multicast over a openvpn tunnel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://pve.proxmox.com/wiki/Separate_Cluster_Network" target="_blank" rel="noopener"
&gt;La documentation officielle pour les clusters sur des sous réseaux distincts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://www.linuxquestions.org/questions/linux-networking-3/openvpn-full-mesh-ubuntu-4175588844/" target="_blank" rel="noopener"
&gt;Un topic intéressant sur les limites d&amp;rsquo;OpenVPN et les réseaux full mesh&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>