<?xml version="1.0" encoding="utf-8"?>
<!-- generator="FeedCreator 1.8" -->
<?xml-stylesheet href="https://wiki.parinux.org/lib/exe/css.php?s=feed" type="text/css"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Wiki de Parinux si:infra</title>
    <subtitle></subtitle>
    <link rel="alternate" type="text/html" href="https://wiki.parinux.org/"/>
    <id>https://wiki.parinux.org/</id>
    <updated>2026-05-17T14:50:54+00:00</updated>
    <generator>FeedCreator 1.8 (info@mypapit.net)</generator>
    <link rel="self" type="application/atom+xml" href="https://wiki.parinux.org/feed.php" />
    <entry>
        <title>si:infra:acme-dns</title>
        <link rel="alternate" type="text/html" href="https://wiki.parinux.org/si/infra/acme-dns?rev=1745530457&amp;do=diff"/>
        <published>2025-04-24T21:34:17+00:00</published>
        <updated>2025-04-24T21:34:17+00:00</updated>
        <id>https://wiki.parinux.org/si/infra/acme-dns?rev=1745530457&amp;do=diff</id>
        <author>
            <name>Anonymous</name>
            <email>anonymous@undisclosed.example.com</email>
        </author>
        <category  term="si:infra" />
        <content>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;certificats_letsencrypt_via_dns&quot;&gt;Certificats Letsencrypt via DNS&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
La création de certificats Letsencrypt se fait traditionnellement par authentification HTTP en utilisant le client &lt;a href=&quot;https://certbot.eff.org/&quot; class=&quot;urlextern&quot; title=&quot;https://certbot.eff.org/&quot; rel=&quot;ugc nofollow&quot;&gt;certbot&lt;/a&gt; de l&amp;#039;EFF et ça permet de couvrir la plupart des besoins.
Mais il est également possible de créer des certificats Letsencrypt par authentification &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt; pour des cas d&amp;#039;usages moins simples et surtout c&amp;#039;est le seul moyen actuellement d&amp;#039;obtenir des certificats Wildcard.
&lt;/p&gt;

&lt;p&gt;
Pour les besoins du service XMPP c&amp;#039;est un certificat Wildcard qui a été créé en utilisant le client &lt;a href=&quot;https://dehydrated.io/&quot; class=&quot;urlextern&quot; title=&quot;https://dehydrated.io/&quot; rel=&quot;ugc nofollow&quot;&gt;dehydrated&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Ici j&amp;#039;explique ce qui a été fait pour mettre cela en place la première fois afin de pouvoir reproduire la démarche ailleurs. Les fichiers de configuration et autres scripts présentés ici ne correspondent plus forcément à la réalité au moment où vous lisez ces lignes, et c&amp;#039;est pas grave hein.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Certificats Letsencrypt via DNS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;certificats_letsencrypt_via_dns&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-919&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;principe_de_fonctionnement&quot;&gt;Principe de fonctionnement&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Le principe du fonctionnement de la validation est similaire que l’on passe par validation &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-01 ou validation HTTP-01 :
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; votre client ACME (certbot, dehydrated, autre) contacte le serveur CA ACME&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; le serveur ACME lui retourne une chaine de caractères générée pour l’occasion&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; le client ACME rend alors cette chaine de caractères publique :&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; soit à une &lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt; &lt;a href=&quot;http://ledomaine.net/.well-known/acme-challenge&quot; class=&quot;urlextern&quot; title=&quot;http://ledomaine.net/.well-known/acme-challenge&quot; rel=&quot;ugc nofollow&quot;&gt;http://ledomaine.net/.well-known/acme-challenge&lt;/a&gt; dans le cas d’une validation HTTP-01&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; soit dans un enregistrement &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt; de type TXT *_acme-challenge.ledomaine.net* dans le cas d’une validation par &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-01&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; le client ACME prévient le serveur ACME que ça a été publié&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; le serveur ACME est désormais sûr qu’il avait affaire à quelqu’un de légitime valide alors le requête, génère le certificat demandé initialement et le transmet au client ACME&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Il faut donc pouvoir publier un enregistrement &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt; de type TXT sur nos serveurs Bind (en fait sur un seul ça suffit).
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Principe de fonctionnement&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;principe_de_fonctionnement&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;920-1934&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;configurer_bind_pour_les_mises_a_jour_dynamiques&quot;&gt;Configurer Bind pour les mises à jour dynamiques&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Techniquement il est possible de configurer directement la zone parinux.org pour accepter les changements dynamiques, avec la commande &lt;em&gt;nsupdate&lt;/em&gt; par exemple. Mais quand on active cette option alors Bind réorganise complètement le fichier zone à sa façon illisible. Et ça c&amp;#039;est pénible pour les adminsys. Et puis en plus ce fichier zone ne doit plus être édité manuellement comme l&amp;#039;indique la page &lt;em&gt;man nsupdate&lt;/em&gt; :
&lt;/p&gt;
&lt;blockquote&gt;&lt;div class=&quot;no&quot;&gt;
 Zones that are under dynamic control via nsupdate or a DHCP server should not be edited by hand. Manual edits could conflict with dynamic updates and cause data to be lost.&lt;/div&gt;&lt;/blockquote&gt;

&lt;p&gt;
Donc le plus simple c&amp;#039;est créer une délégation &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt; uniquement pour &lt;em&gt;_acme-challenge.parinux.org&lt;/em&gt;. C&amp;#039;est ce qui est suggéré dans la &lt;a href=&quot;https://github.com/lukas2511/dehydrated/wiki/example-dns-01-nsupdate-script&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/lukas2511/dehydrated/wiki/example-dns-01-nsupdate-script&quot; rel=&quot;ugc nofollow&quot;&gt;doc de dehydrated&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Donc pour cela dans le fichier de zone de &lt;em&gt;parinux.org&lt;/em&gt; ajouter l&amp;#039;enregistrement suivant (et penser à modifier le serial dans le foulée) :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;_acme-challenge NS ns1.parinux.org.&lt;/pre&gt;

&lt;p&gt;
Créer une clef secrète qui ne sera partagée qu&amp;#039;entre le serveur Bind et les machines ayant besoin de publier des enregistrements &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt; dynamiquement.
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;cd /tmp
dnssec-keygen -r /dev/urandom -a hmac-sha512 -b 128 -n HOST rndc-acme&lt;/pre&gt;

&lt;p&gt;
La clef secrète se trouve dans un fichier nommé &lt;em&gt;/tmp/Krndc-acme.xxxx&lt;/em&gt; et ressemble à quelque chose comme ça : &lt;em&gt;cZh3zV8Uf7aIOxjv8ZA8iA==&lt;/em&gt;.
Ensuite, créer un fichier &lt;em&gt;/etc/bind/rndc-acme.key&lt;/em&gt; :
&lt;/p&gt;
&lt;pre class=&quot;code file etcbindrndc-acmekey&quot;&gt;key &amp;quot;rndc-acme&amp;quot; {
        algorithm hmac-sha512;
        secret &amp;quot;cZh3zV8Uf7aIOxjv8ZA8iA==&amp;quot;;
};&lt;/pre&gt;

&lt;p&gt;
Dans le fichier &lt;em&gt;/etc/bind/named.conf.local&lt;/em&gt; déclarer cette nouvelle zone et inclure le fichier de la clef secrète :
&lt;/p&gt;
&lt;pre class=&quot;code file etcbindnamedconflocalsample&quot;&gt;include &amp;quot;/etc/bind/rndc-acme.key&amp;quot;;
zone &amp;quot;_acme-challenge.parinux.org&amp;quot; {
  file &amp;quot;/var/cache/bind/_acme-challenge.parinux.org.zone&amp;quot;;
  type master;
  masterfile-format text;
  allow-update { key &amp;quot;rndc-acme&amp;quot;; };
};&lt;/pre&gt;

&lt;p&gt;
Il faut maintenant peupler un minimum cette zone dynamique (un SOA et un NS). Créer le fichier &lt;em&gt;/var/cache/bind/_acme-challenge.parinux.org.zone&lt;/em&gt; comme ceci :
&lt;/p&gt;
&lt;pre class=&quot;code file varcachebind_acme-challengeparinuxorgzone&quot;&gt;_acme-challenge.parinux.org. IN SOA troll4.parinux.org. admin.parinux.org. (
       2018112200
       86400
       300
       1814400
       86400
)
  NS   troll4.parinux.org.&lt;/pre&gt;

&lt;p&gt;
Permettre à Bind de modifier ce fichier :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo chown bind: /var/cache/bind/_acme-challenge.parinux.org.zone&lt;/pre&gt;

&lt;p&gt;
Puis &lt;code&gt;sudo systemctl restart bind9&lt;/code&gt;.
&lt;/p&gt;

&lt;p&gt;
Maintenant on peut tester la publication dynamique. On peut déjà vérifier qu&amp;#039;on peut manuellement ajouter/modifier/supprimer l&amp;#039;enregistrement &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt; depuis troll4 elle-même (par la suite il faudra pouvoir faire le même chose depuis un autre machine ayant la clef secrète).
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo nsupdate -k /etc/bind/rndc.key &amp;lt;&amp;lt;EOF
server 127.0.0.1
update delete _acme-challenge.parinux.org
update add _acme-challenge.parinux.org 8000 IN TXT &amp;quot;coucou tout va bieng ?&amp;quot;
send
EOF&lt;/pre&gt;

&lt;p&gt;
Puis
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;dig +short _acme-challenge.parinux.org&lt;/pre&gt;

&lt;p&gt;
Voilà. Ça, c&amp;#039;est fait.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Configurer Bind pour les mises \u00e0 jour dynamiques&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;configurer_bind_pour_les_mises_a_jour_dynamiques&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1935-5145&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;certificat_wildcard_avec_dehydrated&quot;&gt;Certificat Wildcard avec dehydrated&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Sur la machine ayant besoin d&amp;#039;un certificat Wildcard (ici la machine xmpp-1 hébergeant ejabberd) créer le fichier &lt;em&gt;/etc/parinux/rndc-acme.key&lt;/em&gt; contenant la même clef secrète que sur le serveur Bind :
&lt;/p&gt;
&lt;pre class=&quot;code file etcparinuxrndc-acmekey&quot;&gt;key &amp;quot;rndc-acme&amp;quot; {
        algorithm hmac-sha512;
        secret &amp;quot;cZh3zV8Uf7aIOxjv8ZA8iA==&amp;quot;;
};&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;sudo apt install dehydrated dnsutils ntp&lt;/pre&gt;

&lt;p&gt;
Temporairement, le temps de tester la configuration on va utiliser le serveur ACME de staging.
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;echo &amp;#039;CA=&amp;quot;https://acme-staging-v02.api.letsencrypt.org/directory&amp;quot;&amp;#039; | sudo tee /etc/dehydrated/conf.d/staging.sh&lt;/pre&gt;

&lt;p&gt;
On configure dehydrated pour faire de la validation &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-01 dans le fichier &lt;em&gt;/etc/dehydrated/conf.d/auth-dns.sh&lt;/em&gt; :
&lt;/p&gt;
&lt;pre class=&quot;code file etcdehydratedconfdauth-dnssh&quot;&gt;CHALLENGETYPE=&amp;quot;dns-01&amp;quot;
HOOK=/etc/dehydrated/hook-custom.sh&lt;/pre&gt;

&lt;p&gt;
On créé le script hook &lt;em&gt;/etc/dehydrated/hook-custom.sh&lt;/em&gt; :
&lt;/p&gt;
&lt;pre class=&quot;file&quot;&gt;#!/usr/bin/env bash

set 
set -u
set -o pipefail

NSUPDATE=&amp;quot;nsupdate -k /etc/parinux/rndc-acme.key&amp;quot;
DNSSERVER=&amp;quot;192.168.2.55&amp;quot;  # l&amp;#039;IP de troll4, le serveur DNS master
TTL=300

case &amp;quot;$1&amp;quot; in
    &amp;quot;deploy_challenge&amp;quot;)
        printf &amp;quot;server %s\nupdate add _acme-challenge.%s. %d in TXT \&amp;quot;%s\&amp;quot;\nsend\n&amp;quot; &amp;quot;${DNSSERVER}&amp;quot; &amp;quot;${2}&amp;quot; &amp;quot;${TTL}&amp;quot; &amp;quot;${4}&amp;quot; | $NSUPDATE
        ;;
    &amp;quot;clean_challenge&amp;quot;)
        printf &amp;quot;server %s\nupdate delete _acme-challenge.%s. %d in TXT \&amp;quot;%s\&amp;quot;\nsend\n&amp;quot; &amp;quot;${DNSSERVER}&amp;quot; &amp;quot;${2}&amp;quot; &amp;quot;${TTL}&amp;quot; &amp;quot;${4}&amp;quot; | $NSUPDATE
        ;;
    &amp;quot;deploy_cert&amp;quot;)
        # on concatène le certificat et la clef pour ejabberd. C&amp;#039;est pas obligatoire mais c&amp;#039;est plus simple.
        cat /var/lib/dehydrated/certs/parinux.org/fullchain.pem /var/lib/dehydrated/certs/parinux.org/privkey.pem &amp;gt; /etc/ejabberd/parinux.org.ejabberd.pem
        sudo -u ejabberd ejabberdctl reload_config

        ;;
    &amp;quot;unchanged_cert&amp;quot;)
        # do nothing for now
        ;;
    &amp;quot;startup_hook&amp;quot;)
        # do nothing for now
        ;;
    &amp;quot;exit_hook&amp;quot;)
        # do nothing for now
        ;;
esac

exit 0&lt;/pre&gt;

&lt;p&gt;
Il faut rendre ce script exécutable :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo chmod +x /etc/dehydrated/hook-custom.sh&lt;/pre&gt;

&lt;p&gt;
On indique le ou les domaines qu’on souhaite dans &lt;em&gt;/etc/dehydrated/domains.txt&lt;/em&gt; :
&lt;/p&gt;
&lt;pre class=&quot;code file etcdehydrateddomainstxt&quot;&gt;parinux.org *.parinux.org&lt;/pre&gt;

&lt;p&gt;
La première fois :
&lt;/p&gt;
&lt;pre class=&quot;code bash&quot;&gt;dehydrated &lt;span class=&quot;re5&quot;&gt;--register&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;--accept-terms&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
Puis on génère ou régénère les certificats :
&lt;/p&gt;
&lt;pre class=&quot;code bash&quot;&gt;dehydrated &lt;span class=&quot;re5&quot;&gt;-c&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
Si tout s&amp;#039;est bien passé, alors pour peut générer un vrai certificat cette fois en supprimant le fichier &lt;em&gt;/etc/dehydrated/conf.d/staging.sh&lt;/em&gt; :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;rm /etc/dehydrated/conf.d/staging.sh
dehydrated --register --accept-terms
dehydrated -c --force # --force pour écraser le précédent certificat staging&lt;/pre&gt;

&lt;p&gt;
Il faut maintenant créer une tâche cron pour renouveler le certificat automatiquement.
On créé le fichier &lt;em&gt;/etc/cron.weekly/acme-renew&lt;/em&gt; suivant :
&lt;/p&gt;
&lt;pre class=&quot;code file etccronweeklyacme-renew&quot;&gt;#! /bin/bash
/usr/bin/dehydrated -c &lt;/pre&gt;

&lt;p&gt;
Et on le rend exécutable :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;chmod +x /etc/cron.weekly/acme-renew&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Certificat Wildcard avec dehydrated&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;certificat_wildcard_avec_dehydrated&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:8,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;5146-8238&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit5&quot; id=&quot;creer_le_certificat_avec_certbot&quot;&gt;Créer le certificat avec Certbot&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Cette méthode nécessite le plugin &lt;a href=&quot;https://certbot-dns-rfc2136.readthedocs.io/en/stable/&quot; class=&quot;urlextern&quot; title=&quot;https://certbot-dns-rfc2136.readthedocs.io/en/stable/&quot; rel=&quot;ugc nofollow&quot;&gt;certbot-dns-rfc2136&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Installer les paquets nécessaires :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo apt install certbot python3-certbot-dns-rfc2136&lt;/pre&gt;

&lt;p&gt;
Définir les variables qui seront utilisées par la suite :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;export DOMAIN=mondomaine.net
export DNSSERVER=x.x.x.x&lt;/pre&gt;

&lt;p&gt;
Créer le fichier &lt;em&gt;/etc/letsencrypt/nsupdate-credentials-${DOMAIN}.ini&lt;/em&gt; :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;cat &amp;lt;&amp;lt; EOF | sudo tee /etc/letsencrypt/nsupdate-credentials-${DOMAIN}.ini
dns_rfc2136_server = ${DNSSERVER}
dns_rfc2136_port = 53
dns_rfc2136_name = rndc-acme-challenge.${DOMAIN}-key
dns_rfc2136_secret = xxxxxxxxxxxxxxxx
dns_rfc2136_algorithm = HMAC-SHA256
EOF&lt;/pre&gt;

&lt;p&gt;
Avec des permissions restreintes :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo chmod 600 /etc/letsencrypt/nsupdate-credentials-${DOMAIN}.ini&lt;/pre&gt;

&lt;p&gt;
Créer le script hook a exécuter après chaque renouvellement de certificat :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;cat &amp;lt;&amp;lt; EOF | sudo tee /etc/letsencrypt/renewal-hooks/post/reload-services.sh
#! /bin/sh
systemctl reload nginx
EOF&lt;/pre&gt;

&lt;p&gt;
Et le rendre exécutable :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo chmod u+x /etc/letsencrypt/renewal-hooks/post/reload-services.sh&lt;/pre&gt;

&lt;p&gt;
Puis lancer certbot certonly :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;certbot certonly \
 --expand --non-interactive --agree-tos --email root@${DOMAIN} \
 --dns-rfc2136 \
 --dns-rfc2136-propagation-seconds 3 \
 --dns-rfc2136-credentials /etc/letsencrypt/nsupdate-credentials-${DOMAIN}.ini \
 -d &amp;quot;*.${DOMAIN}&amp;quot; -d ${DOMAIN} \
 --post-hook /etc/letsencrypt/renewal-hooks/post/reload-services.sh&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Cr\u00e9er le certificat avec Certbot&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;creer_le_certificat_avec_certbot&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:20,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;8239-&amp;quot;} --&gt;</content>
        <summary>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;certificats_letsencrypt_via_dns&quot;&gt;Certificats Letsencrypt via DNS&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
La création de certificats Letsencrypt se fait traditionnellement par authentification HTTP en utilisant le client &lt;a href=&quot;https://certbot.eff.org/&quot; class=&quot;urlextern&quot; title=&quot;https://certbot.eff.org/&quot; rel=&quot;ugc nofollow&quot;&gt;certbot&lt;/a&gt; de l&amp;#039;EFF et ça permet de couvrir la plupart des besoins.
Mais il est également possible de créer des certificats Letsencrypt par authentification &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt; pour des cas d&amp;#039;usages moins simples et surtout c&amp;#039;est le seul moyen actuellement d&amp;#039;obtenir des certificats Wildcard.
&lt;/p&gt;

&lt;p&gt;
Pour les besoins du service XMPP c&amp;#039;est un certificat Wildcard qui a été créé en utilisant le client &lt;a href=&quot;https://dehydrated.io/&quot; class=&quot;urlextern&quot; title=&quot;https://dehydrated.io/&quot; rel=&quot;ugc nofollow&quot;&gt;dehydrated&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Ici j&amp;#039;explique ce qui a été fait pour mettre cela en place la première fois afin de pouvoir reproduire la démarche ailleurs. Les fichiers de configuration et autres scripts présentés ici ne correspondent plus forcément à la réalité au moment où vous lisez ces lignes, et c&amp;#039;est pas grave hein.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Certificats Letsencrypt via DNS&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;certificats_letsencrypt_via_dns&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-919&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;principe_de_fonctionnement&quot;&gt;Principe de fonctionnement&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Le principe du fonctionnement de la validation est similaire que l’on passe par validation &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-01 ou validation HTTP-01 :
&lt;/p&gt;
&lt;ul&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; votre client ACME (certbot, dehydrated, autre) contacte le serveur CA ACME&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; le serveur ACME lui retourne une chaine de caractères générée pour l’occasion&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1 node&quot;&gt;&lt;div class=&quot;li&quot;&gt; le client ACME rend alors cette chaine de caractères publique :&lt;/div&gt;
&lt;ul&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; soit à une &lt;abbr title=&quot;Uniform Resource Locator&quot;&gt;URL&lt;/abbr&gt; &lt;a href=&quot;http://ledomaine.net/.well-known/acme-challenge&quot; class=&quot;urlextern&quot; title=&quot;http://ledomaine.net/.well-known/acme-challenge&quot; rel=&quot;ugc nofollow&quot;&gt;http://ledomaine.net/.well-known/acme-challenge&lt;/a&gt; dans le cas d’une validation HTTP-01&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level2&quot;&gt;&lt;div class=&quot;li&quot;&gt; soit dans un enregistrement &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt; de type TXT *_acme-challenge.ledomaine.net* dans le cas d’une validation par &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-01&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; le client ACME prévient le serveur ACME que ça a été publié&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; le serveur ACME est désormais sûr qu’il avait affaire à quelqu’un de légitime valide alors le requête, génère le certificat demandé initialement et le transmet au client ACME&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Il faut donc pouvoir publier un enregistrement &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt; de type TXT sur nos serveurs Bind (en fait sur un seul ça suffit).
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Principe de fonctionnement&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;principe_de_fonctionnement&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;920-1934&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;configurer_bind_pour_les_mises_a_jour_dynamiques&quot;&gt;Configurer Bind pour les mises à jour dynamiques&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Techniquement il est possible de configurer directement la zone parinux.org pour accepter les changements dynamiques, avec la commande &lt;em&gt;nsupdate&lt;/em&gt; par exemple. Mais quand on active cette option alors Bind réorganise complètement le fichier zone à sa façon illisible. Et ça c&amp;#039;est pénible pour les adminsys. Et puis en plus ce fichier zone ne doit plus être édité manuellement comme l&amp;#039;indique la page &lt;em&gt;man nsupdate&lt;/em&gt; :
&lt;/p&gt;
&lt;blockquote&gt;&lt;div class=&quot;no&quot;&gt;
 Zones that are under dynamic control via nsupdate or a DHCP server should not be edited by hand. Manual edits could conflict with dynamic updates and cause data to be lost.&lt;/div&gt;&lt;/blockquote&gt;

&lt;p&gt;
Donc le plus simple c&amp;#039;est créer une délégation &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt; uniquement pour &lt;em&gt;_acme-challenge.parinux.org&lt;/em&gt;. C&amp;#039;est ce qui est suggéré dans la &lt;a href=&quot;https://github.com/lukas2511/dehydrated/wiki/example-dns-01-nsupdate-script&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/lukas2511/dehydrated/wiki/example-dns-01-nsupdate-script&quot; rel=&quot;ugc nofollow&quot;&gt;doc de dehydrated&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Donc pour cela dans le fichier de zone de &lt;em&gt;parinux.org&lt;/em&gt; ajouter l&amp;#039;enregistrement suivant (et penser à modifier le serial dans le foulée) :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;_acme-challenge NS ns1.parinux.org.&lt;/pre&gt;

&lt;p&gt;
Créer une clef secrète qui ne sera partagée qu&amp;#039;entre le serveur Bind et les machines ayant besoin de publier des enregistrements &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt; dynamiquement.
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;cd /tmp
dnssec-keygen -r /dev/urandom -a hmac-sha512 -b 128 -n HOST rndc-acme&lt;/pre&gt;

&lt;p&gt;
La clef secrète se trouve dans un fichier nommé &lt;em&gt;/tmp/Krndc-acme.xxxx&lt;/em&gt; et ressemble à quelque chose comme ça : &lt;em&gt;cZh3zV8Uf7aIOxjv8ZA8iA==&lt;/em&gt;.
Ensuite, créer un fichier &lt;em&gt;/etc/bind/rndc-acme.key&lt;/em&gt; :
&lt;/p&gt;
&lt;pre class=&quot;code file etcbindrndc-acmekey&quot;&gt;key &amp;quot;rndc-acme&amp;quot; {
        algorithm hmac-sha512;
        secret &amp;quot;cZh3zV8Uf7aIOxjv8ZA8iA==&amp;quot;;
};&lt;/pre&gt;

&lt;p&gt;
Dans le fichier &lt;em&gt;/etc/bind/named.conf.local&lt;/em&gt; déclarer cette nouvelle zone et inclure le fichier de la clef secrète :
&lt;/p&gt;
&lt;pre class=&quot;code file etcbindnamedconflocalsample&quot;&gt;include &amp;quot;/etc/bind/rndc-acme.key&amp;quot;;
zone &amp;quot;_acme-challenge.parinux.org&amp;quot; {
  file &amp;quot;/var/cache/bind/_acme-challenge.parinux.org.zone&amp;quot;;
  type master;
  masterfile-format text;
  allow-update { key &amp;quot;rndc-acme&amp;quot;; };
};&lt;/pre&gt;

&lt;p&gt;
Il faut maintenant peupler un minimum cette zone dynamique (un SOA et un NS). Créer le fichier &lt;em&gt;/var/cache/bind/_acme-challenge.parinux.org.zone&lt;/em&gt; comme ceci :
&lt;/p&gt;
&lt;pre class=&quot;code file varcachebind_acme-challengeparinuxorgzone&quot;&gt;_acme-challenge.parinux.org. IN SOA troll4.parinux.org. admin.parinux.org. (
       2018112200
       86400
       300
       1814400
       86400
)
  NS   troll4.parinux.org.&lt;/pre&gt;

&lt;p&gt;
Permettre à Bind de modifier ce fichier :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo chown bind: /var/cache/bind/_acme-challenge.parinux.org.zone&lt;/pre&gt;

&lt;p&gt;
Puis &lt;code&gt;sudo systemctl restart bind9&lt;/code&gt;.
&lt;/p&gt;

&lt;p&gt;
Maintenant on peut tester la publication dynamique. On peut déjà vérifier qu&amp;#039;on peut manuellement ajouter/modifier/supprimer l&amp;#039;enregistrement &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt; depuis troll4 elle-même (par la suite il faudra pouvoir faire le même chose depuis un autre machine ayant la clef secrète).
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo nsupdate -k /etc/bind/rndc.key &amp;lt;&amp;lt;EOF
server 127.0.0.1
update delete _acme-challenge.parinux.org
update add _acme-challenge.parinux.org 8000 IN TXT &amp;quot;coucou tout va bieng ?&amp;quot;
send
EOF&lt;/pre&gt;

&lt;p&gt;
Puis
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;dig +short _acme-challenge.parinux.org&lt;/pre&gt;

&lt;p&gt;
Voilà. Ça, c&amp;#039;est fait.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Configurer Bind pour les mises \u00e0 jour dynamiques&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;configurer_bind_pour_les_mises_a_jour_dynamiques&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1935-5145&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;certificat_wildcard_avec_dehydrated&quot;&gt;Certificat Wildcard avec dehydrated&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Sur la machine ayant besoin d&amp;#039;un certificat Wildcard (ici la machine xmpp-1 hébergeant ejabberd) créer le fichier &lt;em&gt;/etc/parinux/rndc-acme.key&lt;/em&gt; contenant la même clef secrète que sur le serveur Bind :
&lt;/p&gt;
&lt;pre class=&quot;code file etcparinuxrndc-acmekey&quot;&gt;key &amp;quot;rndc-acme&amp;quot; {
        algorithm hmac-sha512;
        secret &amp;quot;cZh3zV8Uf7aIOxjv8ZA8iA==&amp;quot;;
};&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;sudo apt install dehydrated dnsutils ntp&lt;/pre&gt;

&lt;p&gt;
Temporairement, le temps de tester la configuration on va utiliser le serveur ACME de staging.
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;echo &amp;#039;CA=&amp;quot;https://acme-staging-v02.api.letsencrypt.org/directory&amp;quot;&amp;#039; | sudo tee /etc/dehydrated/conf.d/staging.sh&lt;/pre&gt;

&lt;p&gt;
On configure dehydrated pour faire de la validation &lt;abbr title=&quot;Domain Name System&quot;&gt;DNS&lt;/abbr&gt;-01 dans le fichier &lt;em&gt;/etc/dehydrated/conf.d/auth-dns.sh&lt;/em&gt; :
&lt;/p&gt;
&lt;pre class=&quot;code file etcdehydratedconfdauth-dnssh&quot;&gt;CHALLENGETYPE=&amp;quot;dns-01&amp;quot;
HOOK=/etc/dehydrated/hook-custom.sh&lt;/pre&gt;

&lt;p&gt;
On créé le script hook &lt;em&gt;/etc/dehydrated/hook-custom.sh&lt;/em&gt; :
&lt;/p&gt;
&lt;pre class=&quot;file&quot;&gt;#!/usr/bin/env bash

set 
set -u
set -o pipefail

NSUPDATE=&amp;quot;nsupdate -k /etc/parinux/rndc-acme.key&amp;quot;
DNSSERVER=&amp;quot;192.168.2.55&amp;quot;  # l&amp;#039;IP de troll4, le serveur DNS master
TTL=300

case &amp;quot;$1&amp;quot; in
    &amp;quot;deploy_challenge&amp;quot;)
        printf &amp;quot;server %s\nupdate add _acme-challenge.%s. %d in TXT \&amp;quot;%s\&amp;quot;\nsend\n&amp;quot; &amp;quot;${DNSSERVER}&amp;quot; &amp;quot;${2}&amp;quot; &amp;quot;${TTL}&amp;quot; &amp;quot;${4}&amp;quot; | $NSUPDATE
        ;;
    &amp;quot;clean_challenge&amp;quot;)
        printf &amp;quot;server %s\nupdate delete _acme-challenge.%s. %d in TXT \&amp;quot;%s\&amp;quot;\nsend\n&amp;quot; &amp;quot;${DNSSERVER}&amp;quot; &amp;quot;${2}&amp;quot; &amp;quot;${TTL}&amp;quot; &amp;quot;${4}&amp;quot; | $NSUPDATE
        ;;
    &amp;quot;deploy_cert&amp;quot;)
        # on concatène le certificat et la clef pour ejabberd. C&amp;#039;est pas obligatoire mais c&amp;#039;est plus simple.
        cat /var/lib/dehydrated/certs/parinux.org/fullchain.pem /var/lib/dehydrated/certs/parinux.org/privkey.pem &amp;gt; /etc/ejabberd/parinux.org.ejabberd.pem
        sudo -u ejabberd ejabberdctl reload_config

        ;;
    &amp;quot;unchanged_cert&amp;quot;)
        # do nothing for now
        ;;
    &amp;quot;startup_hook&amp;quot;)
        # do nothing for now
        ;;
    &amp;quot;exit_hook&amp;quot;)
        # do nothing for now
        ;;
esac

exit 0&lt;/pre&gt;

&lt;p&gt;
Il faut rendre ce script exécutable :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo chmod +x /etc/dehydrated/hook-custom.sh&lt;/pre&gt;

&lt;p&gt;
On indique le ou les domaines qu’on souhaite dans &lt;em&gt;/etc/dehydrated/domains.txt&lt;/em&gt; :
&lt;/p&gt;
&lt;pre class=&quot;code file etcdehydrateddomainstxt&quot;&gt;parinux.org *.parinux.org&lt;/pre&gt;

&lt;p&gt;
La première fois :
&lt;/p&gt;
&lt;pre class=&quot;code bash&quot;&gt;dehydrated &lt;span class=&quot;re5&quot;&gt;--register&lt;/span&gt; &lt;span class=&quot;re5&quot;&gt;--accept-terms&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
Puis on génère ou régénère les certificats :
&lt;/p&gt;
&lt;pre class=&quot;code bash&quot;&gt;dehydrated &lt;span class=&quot;re5&quot;&gt;-c&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
Si tout s&amp;#039;est bien passé, alors pour peut générer un vrai certificat cette fois en supprimant le fichier &lt;em&gt;/etc/dehydrated/conf.d/staging.sh&lt;/em&gt; :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;rm /etc/dehydrated/conf.d/staging.sh
dehydrated --register --accept-terms
dehydrated -c --force # --force pour écraser le précédent certificat staging&lt;/pre&gt;

&lt;p&gt;
Il faut maintenant créer une tâche cron pour renouveler le certificat automatiquement.
On créé le fichier &lt;em&gt;/etc/cron.weekly/acme-renew&lt;/em&gt; suivant :
&lt;/p&gt;
&lt;pre class=&quot;code file etccronweeklyacme-renew&quot;&gt;#! /bin/bash
/usr/bin/dehydrated -c &lt;/pre&gt;

&lt;p&gt;
Et on le rend exécutable :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;chmod +x /etc/cron.weekly/acme-renew&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Certificat Wildcard avec dehydrated&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;certificat_wildcard_avec_dehydrated&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:8,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;5146-8238&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit5&quot; id=&quot;creer_le_certificat_avec_certbot&quot;&gt;Créer le certificat avec Certbot&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
Cette méthode nécessite le plugin &lt;a href=&quot;https://certbot-dns-rfc2136.readthedocs.io/en/stable/&quot; class=&quot;urlextern&quot; title=&quot;https://certbot-dns-rfc2136.readthedocs.io/en/stable/&quot; rel=&quot;ugc nofollow&quot;&gt;certbot-dns-rfc2136&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Installer les paquets nécessaires :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo apt install certbot python3-certbot-dns-rfc2136&lt;/pre&gt;

&lt;p&gt;
Définir les variables qui seront utilisées par la suite :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;export DOMAIN=mondomaine.net
export DNSSERVER=x.x.x.x&lt;/pre&gt;

&lt;p&gt;
Créer le fichier &lt;em&gt;/etc/letsencrypt/nsupdate-credentials-${DOMAIN}.ini&lt;/em&gt; :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;cat &amp;lt;&amp;lt; EOF | sudo tee /etc/letsencrypt/nsupdate-credentials-${DOMAIN}.ini
dns_rfc2136_server = ${DNSSERVER}
dns_rfc2136_port = 53
dns_rfc2136_name = rndc-acme-challenge.${DOMAIN}-key
dns_rfc2136_secret = xxxxxxxxxxxxxxxx
dns_rfc2136_algorithm = HMAC-SHA256
EOF&lt;/pre&gt;

&lt;p&gt;
Avec des permissions restreintes :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo chmod 600 /etc/letsencrypt/nsupdate-credentials-${DOMAIN}.ini&lt;/pre&gt;

&lt;p&gt;
Créer le script hook a exécuter après chaque renouvellement de certificat :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;cat &amp;lt;&amp;lt; EOF | sudo tee /etc/letsencrypt/renewal-hooks/post/reload-services.sh
#! /bin/sh
systemctl reload nginx
EOF&lt;/pre&gt;

&lt;p&gt;
Et le rendre exécutable :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;sudo chmod u+x /etc/letsencrypt/renewal-hooks/post/reload-services.sh&lt;/pre&gt;

&lt;p&gt;
Puis lancer certbot certonly :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;certbot certonly \
 --expand --non-interactive --agree-tos --email root@${DOMAIN} \
 --dns-rfc2136 \
 --dns-rfc2136-propagation-seconds 3 \
 --dns-rfc2136-credentials /etc/letsencrypt/nsupdate-credentials-${DOMAIN}.ini \
 -d &amp;quot;*.${DOMAIN}&amp;quot; -d ${DOMAIN} \
 --post-hook /etc/letsencrypt/renewal-hooks/post/reload-services.sh&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Cr\u00e9er le certificat avec Certbot&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;creer_le_certificat_avec_certbot&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:20,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;8239-&amp;quot;} --&gt;</summary>
    </entry>
    <entry>
        <title>si:infra:glusterfs</title>
        <link rel="alternate" type="text/html" href="https://wiki.parinux.org/si/infra/glusterfs?rev=1745530869&amp;do=diff"/>
        <published>2025-04-24T21:41:09+00:00</published>
        <updated>2025-04-24T21:41:09+00:00</updated>
        <id>https://wiki.parinux.org/si/infra/glusterfs?rev=1745530869&amp;do=diff</id>
        <author>
            <name>Anonymous</name>
            <email>anonymous@undisclosed.example.com</email>
        </author>
        <category  term="si:infra" />
        <content>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;glusterfs&quot;&gt;Glusterfs&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Sur troll3 et troll4, nous utilisons du &lt;a href=&quot;https://www.gluster.org/&quot; class=&quot;urlextern&quot; title=&quot;https://www.gluster.org/&quot; rel=&quot;ugc nofollow&quot;&gt;glusterfs&lt;/a&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Glusterfs&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;glusterfs&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-107&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit2&quot; id=&quot;pre-requis&quot;&gt;Pré-requis&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Il faut une partition pour mettre le stockage et une connectivité reseau.
&lt;/p&gt;

&lt;p&gt;
On va donc creer un volume lvm exprès de chaque côté :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll4:~# lvcreate -L1024G -n glusterfs troll4-vg
root@troll4:~# mkfs.ext4 /dev/mapper/troll4--vg-glusterfs
root@troll4:~# mkdir /glusterfs 
root@troll4:~# echo &amp;quot;/dev/troll4-vg/glusterfs /glusterfs	ext4	defaults 0 2&amp;quot; &amp;gt;&amp;gt; /etc/fstab
root@troll4:~# mount /glusterfs&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll3:~# lvcreate -L1024G -n glusterfs troll3-vg
root@troll3:~# mkfs.ext4 /dev/mapper/troll3--vg-glusterfs
root@troll3:~# mkdir /glusterfs 
root@troll3:~# echo &amp;quot;/dev/troll3-vg/glusterfs /glusterfs	ext4	defaults 0 2&amp;quot; &amp;gt;&amp;gt; /etc/fstab
root@troll3:~# mount /glusterfs&lt;/pre&gt;

&lt;p&gt;
Mettre la conf reseau qui va bien :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll4:~# ifconfig eth1 192.168.0.1/24&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll3:~# ifconfig eth1 192.168.0.2/24&lt;/pre&gt;

&lt;p&gt;
Et faire en sorte d&amp;#039;avoir une mini resolution dns :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll4:~# echo &amp;quot;192.168.0.1     troll4.lan.parinux.org&amp;quot;&amp;gt;&amp;gt; /etc/hosts
root@troll4:~# echo &amp;quot;192.168.0.2     troll3.lan.parinux.org&amp;quot;&amp;gt;&amp;gt; /etc/hosts&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll3:~# echo &amp;quot;192.168.0.1     troll4.lan.parinux.org&amp;quot;&amp;gt;&amp;gt; /etc/hosts
root@troll3:~# echo &amp;quot;192.168.0.2     troll3.lan.parinux.org&amp;quot;&amp;gt;&amp;gt; /etc/hosts&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Pr\u00e9-requis&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;pre-requis&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;108-1367&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit3&quot; id=&quot;setup&quot;&gt;Setup&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll4:~# gluster peer probe troll3.lan.parinux.org&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Setup&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;setup&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:6,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1368-1457&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit4&quot; id=&quot;creation_d_un_volume&quot;&gt;Creation d&amp;#039;un volume&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll4:~# gluster volume create lxc_www1 replica 2 transport tcp troll4.lan.parinux.org:/glusterfs/lxc_www1 troll3.lan.parinux.org:/glusterfs/lxc_www1 force&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Creation d&amp;#039;un volume&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;creation_d_un_volume&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:7,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;1458-1667&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit5&quot; id=&quot;mise_en_place_des_options_qui_vont_bien&quot;&gt;Mise en place des options qui vont bien&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll4:~# gluster volume set ${curVol} cluster.readdir-optimize on
root@troll4:~# gluster volume set ${curVol} performance.parallel-readdir on
root@troll4:~# gluster volume set ${curVol} nfs.disable on
root@troll4:~# gluster volume set ${curVol} performance.client-io-threads on
# quand on est pas riche en ram et qu&amp;#039;on monte un truc en local .. 
root@troll4:~# gluster volume set ${curVol} performance.io-cache off&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Mise en place des options qui vont bien&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;mise_en_place_des_options_qui_vont_bien&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:8,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;1668-2159&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit6&quot; id=&quot;activation_d_un_quota&quot;&gt;Activation d&amp;#039;un quota&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Attention, c&amp;#039;est pas toujours une bonne idee, ni une bonne option ..
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll4:~# gluster volume quota lxc_www1 enable
root@troll4:~# gluster volume quota lxc_www1 limit-usage / 10GB&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Activation d&amp;#039;un quota&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;activation_d_un_quota&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:9,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;2160-2393&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit7&quot; id=&quot;demarrage_d_un_volume&quot;&gt;Demarrage d&amp;#039;un volume&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll4:~# gluster volume start lxc_www1&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Demarrage d&amp;#039;un volume&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;demarrage_d_un_volume&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:10,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;2394-2487&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit8&quot; id=&quot;utilisation_d_un_volume&quot;&gt;Utilisation d&amp;#039;un volume&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll4:~# echo &amp;quot;troll4.lan.parinux.org:/lxc_www1 /var/lib/lxc/www glusterfs defaults,noatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=131072 0 0&amp;quot;  &amp;gt;&amp;gt; /etc/fstab
root@troll4:~# mount /var/lib/lxc/www&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll3:~# echo &amp;quot;troll3.lan.parinux.org:/lxc_www1 /var/lib/lxc/www glusterfs defaults,noatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=131072 0 0&amp;quot;  &amp;gt;&amp;gt; /etc/fstab
root@troll3:~# mount /var/lib/lxc/www&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Utilisation d&amp;#039;un volume&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;utilisation_d_un_volume&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:11,&amp;quot;secid&amp;quot;:8,&amp;quot;range&amp;quot;:&amp;quot;2488-&amp;quot;} --&gt;</content>
        <summary>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;glusterfs&quot;&gt;Glusterfs&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
Sur troll3 et troll4, nous utilisons du &lt;a href=&quot;https://www.gluster.org/&quot; class=&quot;urlextern&quot; title=&quot;https://www.gluster.org/&quot; rel=&quot;ugc nofollow&quot;&gt;glusterfs&lt;/a&gt;.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Glusterfs&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;glusterfs&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-107&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit2&quot; id=&quot;pre-requis&quot;&gt;Pré-requis&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Il faut une partition pour mettre le stockage et une connectivité reseau.
&lt;/p&gt;

&lt;p&gt;
On va donc creer un volume lvm exprès de chaque côté :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll4:~# lvcreate -L1024G -n glusterfs troll4-vg
root@troll4:~# mkfs.ext4 /dev/mapper/troll4--vg-glusterfs
root@troll4:~# mkdir /glusterfs 
root@troll4:~# echo &amp;quot;/dev/troll4-vg/glusterfs /glusterfs	ext4	defaults 0 2&amp;quot; &amp;gt;&amp;gt; /etc/fstab
root@troll4:~# mount /glusterfs&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll3:~# lvcreate -L1024G -n glusterfs troll3-vg
root@troll3:~# mkfs.ext4 /dev/mapper/troll3--vg-glusterfs
root@troll3:~# mkdir /glusterfs 
root@troll3:~# echo &amp;quot;/dev/troll3-vg/glusterfs /glusterfs	ext4	defaults 0 2&amp;quot; &amp;gt;&amp;gt; /etc/fstab
root@troll3:~# mount /glusterfs&lt;/pre&gt;

&lt;p&gt;
Mettre la conf reseau qui va bien :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll4:~# ifconfig eth1 192.168.0.1/24&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll3:~# ifconfig eth1 192.168.0.2/24&lt;/pre&gt;

&lt;p&gt;
Et faire en sorte d&amp;#039;avoir une mini resolution dns :
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll4:~# echo &amp;quot;192.168.0.1     troll4.lan.parinux.org&amp;quot;&amp;gt;&amp;gt; /etc/hosts
root@troll4:~# echo &amp;quot;192.168.0.2     troll3.lan.parinux.org&amp;quot;&amp;gt;&amp;gt; /etc/hosts&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll3:~# echo &amp;quot;192.168.0.1     troll4.lan.parinux.org&amp;quot;&amp;gt;&amp;gt; /etc/hosts
root@troll3:~# echo &amp;quot;192.168.0.2     troll3.lan.parinux.org&amp;quot;&amp;gt;&amp;gt; /etc/hosts&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Pr\u00e9-requis&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;pre-requis&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;108-1367&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit3&quot; id=&quot;setup&quot;&gt;Setup&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll4:~# gluster peer probe troll3.lan.parinux.org&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Setup&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;setup&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:6,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1368-1457&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit4&quot; id=&quot;creation_d_un_volume&quot;&gt;Creation d&amp;#039;un volume&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll4:~# gluster volume create lxc_www1 replica 2 transport tcp troll4.lan.parinux.org:/glusterfs/lxc_www1 troll3.lan.parinux.org:/glusterfs/lxc_www1 force&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Creation d&amp;#039;un volume&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;creation_d_un_volume&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:7,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;1458-1667&amp;quot;} --&gt;
&lt;h1 class=&quot;sectionedit5&quot; id=&quot;mise_en_place_des_options_qui_vont_bien&quot;&gt;Mise en place des options qui vont bien&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll4:~# gluster volume set ${curVol} cluster.readdir-optimize on
root@troll4:~# gluster volume set ${curVol} performance.parallel-readdir on
root@troll4:~# gluster volume set ${curVol} nfs.disable on
root@troll4:~# gluster volume set ${curVol} performance.client-io-threads on
# quand on est pas riche en ram et qu&amp;#039;on monte un truc en local .. 
root@troll4:~# gluster volume set ${curVol} performance.io-cache off&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Mise en place des options qui vont bien&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;mise_en_place_des_options_qui_vont_bien&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:8,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;1668-2159&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit6&quot; id=&quot;activation_d_un_quota&quot;&gt;Activation d&amp;#039;un quota&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;

&lt;p&gt;
Attention, c&amp;#039;est pas toujours une bonne idee, ni une bonne option ..
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll4:~# gluster volume quota lxc_www1 enable
root@troll4:~# gluster volume quota lxc_www1 limit-usage / 10GB&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Activation d&amp;#039;un quota&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;activation_d_un_quota&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:9,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;2160-2393&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit7&quot; id=&quot;demarrage_d_un_volume&quot;&gt;Demarrage d&amp;#039;un volume&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll4:~# gluster volume start lxc_www1&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Demarrage d&amp;#039;un volume&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;demarrage_d_un_volume&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:10,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;2394-2487&amp;quot;} --&gt;
&lt;h3 class=&quot;sectionedit8&quot; id=&quot;utilisation_d_un_volume&quot;&gt;Utilisation d&amp;#039;un volume&lt;/h3&gt;
&lt;div class=&quot;level3&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll4:~# echo &amp;quot;troll4.lan.parinux.org:/lxc_www1 /var/lib/lxc/www glusterfs defaults,noatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=131072 0 0&amp;quot;  &amp;gt;&amp;gt; /etc/fstab
root@troll4:~# mount /var/lib/lxc/www&lt;/pre&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll3:~# echo &amp;quot;troll3.lan.parinux.org:/lxc_www1 /var/lib/lxc/www glusterfs defaults,noatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=131072 0 0&amp;quot;  &amp;gt;&amp;gt; /etc/fstab
root@troll3:~# mount /var/lib/lxc/www&lt;/pre&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Utilisation d&amp;#039;un volume&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;utilisation_d_un_volume&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:11,&amp;quot;secid&amp;quot;:8,&amp;quot;range&amp;quot;:&amp;quot;2488-&amp;quot;} --&gt;</summary>
    </entry>
    <entry>
        <title>si:infra:lvm</title>
        <link rel="alternate" type="text/html" href="https://wiki.parinux.org/si/infra/lvm?rev=1745530509&amp;do=diff"/>
        <published>2025-04-24T21:35:09+00:00</published>
        <updated>2025-04-24T21:35:09+00:00</updated>
        <id>https://wiki.parinux.org/si/infra/lvm?rev=1745530509&amp;do=diff</id>
        <author>
            <name>Anonymous</name>
            <email>anonymous@undisclosed.example.com</email>
        </author>
        <category  term="si:infra" />
        <content>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;lvm&quot;&gt;LVM&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;

&lt;h4 id=&quot;init_pv&quot;&gt;init pv&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;pvcreate /dev/sdb1&lt;/pre&gt;

&lt;/div&gt;

&lt;h4 id=&quot;init_vg&quot;&gt;init vg&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;vgcreate trollX-vg /dev/sdb1&lt;/pre&gt;

&lt;/div&gt;

&lt;h4 id=&quot;create_volume_10g&quot;&gt;create volume 10G&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;lvcreate -L 10G -n lxc_NOM trollX-vg&lt;/pre&gt;

&lt;/div&gt;

&lt;h4 id=&quot;status&quot;&gt;Status&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll4:~# lvdisplay | egrep &amp;quot;LV (Path|Name|Size)&amp;quot;
  LV Path                /dev/troll4-vg/root
  LV Name                root
  LV Size                8,38 GiB
  LV Path                /dev/troll4-vg/var
  LV Name                var
  LV Size                7,79 GiB
  LV Path                /dev/troll4-vg/swap_1
  LV Name                swap_1
  LV Size                15,99 GiB
  LV Path                /dev/troll4-vg/tmp
  LV Name                tmp
  LV Size                4,00 GiB
  LV Path                /dev/troll4-vg/home
  LV Name                home
  LV Size                2,00 GiB
  LV Path                /dev/troll4-vg/lxc_dns
  LV Name                lxc_dns
  LV Size                5,00 GiB
  LV Path                /dev/troll4-vg/lxc_www
  LV Name                lxc_www
  LV Size                50,00 GiB
  LV Path                /dev/troll4-vg/lxc_mail
  LV Name                lxc_mail
  LV Size                5,00 GiB
  LV Path                /dev/troll4-vg/lxc_ldap
  LV Name                lxc_ldap
  LV Size                5,00 GiB
  LV Path                /dev/troll4-vg/lxc_mysql
  LV Name                lxc_mysql
  LV Size                50,00 GiB
  LV Path                /dev/troll4-vg/lxc_bugzilla
  LV Name                lxc_bugzilla
  LV Size                2,00 GiB
  LV Path                /dev/troll4-vg/lxc_lists
  LV Name                lxc_lists
  LV Size                2,00 GiB
  LV Path                /dev/troll4-vg/backup
  LV Name                backup
  LV Size                200,00 GiB
  LV Path                /dev/troll4-vg/glusterfs
  LV Name                glusterfs
  LV Size                1,00 TiB
  LV Path                /dev/troll4-vg/lxc_drupal_dev
  LV Name                lxc_drupal_dev
  LV Size                10,00 GiB
  LV Path                /dev/troll4-vg/lxc_spip_dev
  LV Name                lxc_spip_dev
  LV Size                5,00 GiB
  LV Path                /dev/troll4-vg/lxc_adherents
  LV Name                lxc_adherents
  LV Size                10,00 GiB
  LV Path                /dev/troll4-vg/lxc_xmpp2
  LV Name                lxc_xmpp2
  LV Size                5,00 GiB&lt;/pre&gt;

&lt;/div&gt;
</content>
        <summary>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;lvm&quot;&gt;LVM&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;/div&gt;

&lt;h4 id=&quot;init_pv&quot;&gt;init pv&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;pvcreate /dev/sdb1&lt;/pre&gt;

&lt;/div&gt;

&lt;h4 id=&quot;init_vg&quot;&gt;init vg&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;vgcreate trollX-vg /dev/sdb1&lt;/pre&gt;

&lt;/div&gt;

&lt;h4 id=&quot;create_volume_10g&quot;&gt;create volume 10G&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;lvcreate -L 10G -n lxc_NOM trollX-vg&lt;/pre&gt;

&lt;/div&gt;

&lt;h4 id=&quot;status&quot;&gt;Status&lt;/h4&gt;
&lt;div class=&quot;level4&quot;&gt;
&lt;pre class=&quot;code&quot;&gt;root@troll4:~# lvdisplay | egrep &amp;quot;LV (Path|Name|Size)&amp;quot;
  LV Path                /dev/troll4-vg/root
  LV Name                root
  LV Size                8,38 GiB
  LV Path                /dev/troll4-vg/var
  LV Name                var
  LV Size                7,79 GiB
  LV Path                /dev/troll4-vg/swap_1
  LV Name                swap_1
  LV Size                15,99 GiB
  LV Path                /dev/troll4-vg/tmp
  LV Name                tmp
  LV Size                4,00 GiB
  LV Path                /dev/troll4-vg/home
  LV Name                home
  LV Size                2,00 GiB
  LV Path                /dev/troll4-vg/lxc_dns
  LV Name                lxc_dns
  LV Size                5,00 GiB
  LV Path                /dev/troll4-vg/lxc_www
  LV Name                lxc_www
  LV Size                50,00 GiB
  LV Path                /dev/troll4-vg/lxc_mail
  LV Name                lxc_mail
  LV Size                5,00 GiB
  LV Path                /dev/troll4-vg/lxc_ldap
  LV Name                lxc_ldap
  LV Size                5,00 GiB
  LV Path                /dev/troll4-vg/lxc_mysql
  LV Name                lxc_mysql
  LV Size                50,00 GiB
  LV Path                /dev/troll4-vg/lxc_bugzilla
  LV Name                lxc_bugzilla
  LV Size                2,00 GiB
  LV Path                /dev/troll4-vg/lxc_lists
  LV Name                lxc_lists
  LV Size                2,00 GiB
  LV Path                /dev/troll4-vg/backup
  LV Name                backup
  LV Size                200,00 GiB
  LV Path                /dev/troll4-vg/glusterfs
  LV Name                glusterfs
  LV Size                1,00 TiB
  LV Path                /dev/troll4-vg/lxc_drupal_dev
  LV Name                lxc_drupal_dev
  LV Size                10,00 GiB
  LV Path                /dev/troll4-vg/lxc_spip_dev
  LV Name                lxc_spip_dev
  LV Size                5,00 GiB
  LV Path                /dev/troll4-vg/lxc_adherents
  LV Name                lxc_adherents
  LV Size                10,00 GiB
  LV Path                /dev/troll4-vg/lxc_xmpp2
  LV Name                lxc_xmpp2
  LV Size                5,00 GiB&lt;/pre&gt;

&lt;/div&gt;
</summary>
    </entry>
    <entry>
        <title>si:infra:lxc</title>
        <link rel="alternate" type="text/html" href="https://wiki.parinux.org/si/infra/lxc?rev=1745530477&amp;do=diff"/>
        <published>2025-04-24T21:34:37+00:00</published>
        <updated>2025-04-24T21:34:37+00:00</updated>
        <id>https://wiki.parinux.org/si/infra/lxc?rev=1745530477&amp;do=diff</id>
        <author>
            <name>Anonymous</name>
            <email>anonymous@undisclosed.example.com</email>
        </author>
        <category  term="si:infra" />
        <content>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;creation_d_un_container_lxc&quot;&gt;Creation d&amp;#039;un container LXC&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Initialisation du container&lt;pre class=&quot;code&quot;&gt;sudo lxc-create -n NOM -t debian -B lvm --vgname=troll3-vg --lvname=lxc_NOM --fstype=ext4 --fssize 10G -- --release=jessie /dev/troll3-vg/lxc_NOM&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Bien noté le pass root affiché dans le /root/README&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Ajoutter quelque chose du genre &lt;strong&gt;EN ADAPTANT&lt;/strong&gt; dans le /var/lib/lxc/NOM/config&lt;pre class=&quot;code&quot;&gt;lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.hwaddr = 00:ZZ:C0:ZZ:01:60
lxc.network.ipv4 = 192.168.1.4242/24
lxc.network.ipv4.gateway = 192.168.1.1

lxc.start.order = 42
lxc.start.auto = 1&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Pour se faciliter la vie, on va rendre le rootfs accessible depuis le host&lt;pre class=&quot;code&quot;&gt;echo &amp;quot;/​dev/​trollX-vg/​lxc_NOM /​var/​lib/​lxc/​NOM/rootfs ext3 defaults 0 2&amp;quot; &amp;gt;&amp;gt; /etc/fstab
mount /​var/​lib/​lxc/​NOM/rootfs&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Pour supprimer un container, ca devrait etre un truc genre&lt;pre class=&quot;code&quot;&gt;sudo lxc-destroy -n NOM -B lvm --vgname=troll3-vg --lvname=lxc_NOM&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Pour se connecter à l&amp;#039;intérieur d&amp;#039;un LXC : &lt;pre class=&quot;code&quot;&gt;lxc_attach -n NOM&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;/div&gt;
</content>
        <summary>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;creation_d_un_container_lxc&quot;&gt;Creation d&amp;#039;un container LXC&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;
&lt;ol&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Initialisation du container&lt;pre class=&quot;code&quot;&gt;sudo lxc-create -n NOM -t debian -B lvm --vgname=troll3-vg --lvname=lxc_NOM --fstype=ext4 --fssize 10G -- --release=jessie /dev/troll3-vg/lxc_NOM&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Bien noté le pass root affiché dans le /root/README&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Ajoutter quelque chose du genre &lt;strong&gt;EN ADAPTANT&lt;/strong&gt; dans le /var/lib/lxc/NOM/config&lt;pre class=&quot;code&quot;&gt;lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.hwaddr = 00:ZZ:C0:ZZ:01:60
lxc.network.ipv4 = 192.168.1.4242/24
lxc.network.ipv4.gateway = 192.168.1.1

lxc.start.order = 42
lxc.start.auto = 1&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Pour se faciliter la vie, on va rendre le rootfs accessible depuis le host&lt;pre class=&quot;code&quot;&gt;echo &amp;quot;/​dev/​trollX-vg/​lxc_NOM /​var/​lib/​lxc/​NOM/rootfs ext3 defaults 0 2&amp;quot; &amp;gt;&amp;gt; /etc/fstab
mount /​var/​lib/​lxc/​NOM/rootfs&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Pour supprimer un container, ca devrait etre un truc genre&lt;pre class=&quot;code&quot;&gt;sudo lxc-destroy -n NOM -B lvm --vgname=troll3-vg --lvname=lxc_NOM&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li class=&quot;level1&quot;&gt;&lt;div class=&quot;li&quot;&gt; Pour se connecter à l&amp;#039;intérieur d&amp;#039;un LXC : &lt;pre class=&quot;code&quot;&gt;lxc_attach -n NOM&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;/div&gt;
</summary>
    </entry>
</feed>
