<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Bash on slash-root.fr</title><link>https://beta.slash-root.fr/categories/bash/</link><description>Recent content in Bash on slash-root.fr</description><generator>Hugo -- gohugo.io</generator><language>fr-fr</language><lastBuildDate>Sun, 15 Mar 2026 22:13:13 +0100</lastBuildDate><atom:link href="https://beta.slash-root.fr/categories/bash/index.xml" rel="self" type="application/rss+xml"/><item><title>Aptly : mirroiter Debian proprement</title><link>https://beta.slash-root.fr/aptly-mirroiter-debian-proprement/</link><pubDate>Fri, 13 Mar 2026 19:05:06 +0100</pubDate><guid>https://beta.slash-root.fr/aptly-mirroiter-debian-proprement/</guid><description>&lt;img src="https://beta.slash-root.fr/aptly-mirroiter-debian-proprement/cover.jpg" alt="Featured image of post Aptly : mirroiter Debian proprement" /&gt;&lt;p&gt;Quand on gère une flotte de serveurs Debian, on finit toujours par se poser la même question : comment maîtriser ce que mes machines vont installer ? Comment être sûr qu'un &lt;code&gt;apt update&lt;/code&gt; ne va pas me ramener une version de paquet qui casse tout ? Et surtout, comment faire pour que mes serveurs de prod ne dépendent pas d'un miroir externe qui peut tomber au pire moment ?&lt;/p&gt;
&lt;p&gt;La réponse classique, c'est de monter un miroir local. Sauf que mirrorer Debian avec les outils standards (&lt;code&gt;debmirror&lt;/code&gt;, &lt;code&gt;apt-mirror&lt;/code&gt;...), c'est lourd, c'est rigide, et ça ne répond qu'à la moitié du problème. On a une copie locale, d'accord, mais on n'a toujours aucun contrôle sur ce qui change d'un jour à l'autre.&lt;/p&gt;
&lt;p&gt;C'est là qu'aptly entre en jeu.&lt;/p&gt;
&lt;h2 id="ce-quaptly-fait-vraiment"&gt;&lt;a href="#ce-quaptly-fait-vraiment" class="header-anchor"&gt;&lt;/a&gt;Ce qu&amp;rsquo;aptly fait vraiment
&lt;/h2&gt;&lt;p&gt;aptly, c'est un gestionnaire de dépôts Debian écrit en Go. Il sait faire trois choses fondamentales :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;mirrorer un dépôt distant&lt;/strong&gt; -- comme &lt;code&gt;apt-mirror&lt;/code&gt;, mais en mieux&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Figer l'état d'un miroir dans un snapshot immuable&lt;/strong&gt; -- ça, c'est la vraie valeur ajoutée&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Publier ce snapshot&lt;/strong&gt; pour que vos machines puissent l'utiliser&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Le workflow de base, c'est ça :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mirror create → mirror update → snapshot create → publish snapshot
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et quand il faut mettre à jour :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mirror update → snapshot create → publish switch
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le &lt;code&gt;publish switch&lt;/code&gt; bascule la publication d'un snapshot à un autre. Vos machines continuent de pointer sur la même URL, mais le contenu change de manière contrôlée. Si ça foire, vous rebasculez sur l'ancien snapshot. Pas de panique, pas de retélécharger quoi que ce soit.&lt;/p&gt;
&lt;h2 id="installation"&gt;&lt;a href="#installation" class="header-anchor"&gt;&lt;/a&gt;Installation
&lt;/h2&gt;&lt;h3 id="via-les-paquets-debian"&gt;&lt;a href="#via-les-paquets-debian" class="header-anchor"&gt;&lt;/a&gt;Via les paquets Debian
&lt;/h3&gt;&lt;p&gt;C'est la méthode standard, celle qu'on va utiliser ici :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install aptly
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sur Debian Trixie, ça installe la version 1.5.0. C'est pas la toute dernière (la 1.6.2 existe), mais c'est largement suffisant pour ce qu'on va faire.&lt;/p&gt;
&lt;p&gt;Vérification :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ aptly version
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly version: 1.5.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="lupstream-optionnel"&gt;&lt;a href="#lupstream-optionnel" class="header-anchor"&gt;&lt;/a&gt;L&amp;rsquo;upstream (optionnel)
&lt;/h3&gt;&lt;p&gt;Si vous voulez absolument la dernière version upstream, vous pouvez ajouter le dépôt officiel d'aptly. Mais franchement, pour un usage classique, la version Debian fait le job. Je mentionne juste l'option pour ceux qui en ont besoin :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mkdir -p /etc/apt/keyrings
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget -O /etc/apt/keyrings/aptly.asc https://www.aptly.info/pubkey.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;deb [signed-by=/etc/apt/keyrings/aptly.asc] http://repo.aptly.info/release trixie main&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | sudo tee /etc/apt/sources.list.d/aptly.list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install aptly
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mais encore une fois, c'est optionnel. On va continuer avec la version des dépôts Debian.&lt;/p&gt;
&lt;h2 id="configuration-de-base"&gt;&lt;a href="#configuration-de-base" class="header-anchor"&gt;&lt;/a&gt;Configuration de base
&lt;/h2&gt;&lt;p&gt;aptly stocke tout dans &lt;code&gt;~/.aptly&lt;/code&gt; par défaut. En prod, on va plutôt utiliser &lt;code&gt;/var/aptly&lt;/code&gt;. On crée le répertoire et on configure aptly pour l'utiliser :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo mkdir -p /var/aptly
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo chown $USER:$USER /var/aptly
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le fichier de config, c'est &lt;code&gt;~/.aptly.conf&lt;/code&gt; (ou &lt;code&gt;/etc/aptly.conf&lt;/code&gt; pour une config globale). On va en créer un minimal :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat &amp;gt; ~/.aptly.conf &lt;span style="color:#e6db74"&gt;&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;rootDir&amp;#34;: &amp;#34;/var/aptly&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;architectures&amp;#34;: [&amp;#34;amd64&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On restreint à &lt;code&gt;amd64&lt;/code&gt; parce que c'est ce qu'on utilise. Pas la peine de télécharger du &lt;code&gt;i386&lt;/code&gt;, du &lt;code&gt;arm64&lt;/code&gt; ou du &lt;code&gt;armhf&lt;/code&gt; si on n'en a pas besoin.&lt;/p&gt;
&lt;p&gt;Le &lt;code&gt;rootDir&lt;/code&gt;, c'est la racine de tout. Dedans, aptly va créer :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;db/&lt;/code&gt; -- sa base de données interne&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pool/&lt;/code&gt; -- les fichiers &lt;code&gt;.deb&lt;/code&gt; téléchargés&lt;/li&gt;
&lt;li&gt;&lt;code&gt;public/&lt;/code&gt; -- les dépôts publiés, ceux qu'on va exposer&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="importer-les-clés-gpg"&gt;&lt;a href="#importer-les-cl%c3%a9s-gpg" class="header-anchor"&gt;&lt;/a&gt;Importer les clés GPG
&lt;/h2&gt;&lt;p&gt;Avant de créer un miroir, aptly a besoin des clés GPG pour vérifier les signatures des dépôts distants. Sur Debian, les clés d'archive sont déjà présentes dans &lt;code&gt;/usr/share/keyrings/&lt;/code&gt;. Il suffit de les importer dans le trousseau d'aptly :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gpg --no-default-keyring &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --keyring /usr/share/keyrings/debian-archive-keyring.gpg &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --export | &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; gpg --no-default-keyring &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --keyring trustedkeys.gpg &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --import
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ça importe les clés dans &lt;code&gt;~/.gnupg/trustedkeys.gpg&lt;/code&gt;, le trousseau qu'aptly utilise par défaut.&lt;/p&gt;
&lt;h2 id="créer-un-miroir-de-debian-trixie"&gt;&lt;a href="#cr%c3%a9er-un-miroir-de-debian-trixie" class="header-anchor"&gt;&lt;/a&gt;Créer un miroir de Debian Trixie
&lt;/h2&gt;&lt;p&gt;On va mirrorer le dépôt officiel français (&lt;code&gt;ftp.fr.debian.org&lt;/code&gt;), avec les sections &lt;code&gt;main&lt;/code&gt; et &lt;code&gt;non-free-firmware&lt;/code&gt;. Pourquoi &lt;code&gt;non-free-firmware&lt;/code&gt; ? Parce que depuis Debian 12, les firmwares non-libres (wifi, GPU...) sont dans cette section, et on en a souvent besoin.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly mirror create &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -architectures&lt;span style="color:#f92672"&gt;=&lt;/span&gt;amd64 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; debian-trixie &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; http://ftp.fr.debian.org/debian/ &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; trixie main non-free-firmware
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Quelques remarques :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le flag &lt;code&gt;-architectures=amd64&lt;/code&gt; se place &lt;strong&gt;avant&lt;/strong&gt; la sous-commande &lt;code&gt;mirror&lt;/code&gt;. C'est un flag global. Si vous le mettez après, aptly va râler.&lt;/li&gt;
&lt;li&gt;Le nom du miroir (&lt;code&gt;debian-trixie&lt;/code&gt;), c'est vous qui le choisissez. Prenez un nom explicite.&lt;/li&gt;
&lt;li&gt;L'URL doit finir par un &lt;code&gt;/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;On spécifie la distribution (&lt;code&gt;trixie&lt;/code&gt;) et les composants (&lt;code&gt;main non-free-firmware&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La commande crée la définition du miroir, mais ne télécharge rien encore. Pour ça, il faut lancer un &lt;code&gt;mirror update&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="remplir-le-miroir"&gt;&lt;a href="#remplir-le-miroir" class="header-anchor"&gt;&lt;/a&gt;Remplir le miroir
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly mirror update debian-trixie
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Là, ça télécharge. Et ça prend du temps. Un miroir complet de Debian main + non-free-firmware en amd64, c'est plusieurs dizaines de Go. Prévoyez du café.&lt;/p&gt;
&lt;p&gt;Vous pouvez suivre la progression dans le terminal. aptly affiche les paquets au fur et à mesure qu'il les télécharge.&lt;/p&gt;
&lt;p&gt;Une fois terminé, vous pouvez voir ce que contient le miroir :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly mirror show debian-trixie
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ça vous donne le nombre de paquets, la taille totale, la date de dernière mise à jour, etc.&lt;/p&gt;
&lt;h2 id="créer-un-snapshot"&gt;&lt;a href="#cr%c3%a9er-un-snapshot" class="header-anchor"&gt;&lt;/a&gt;Créer un snapshot
&lt;/h2&gt;&lt;p&gt;Le miroir est à jour. Maintenant, on va en faire un snapshot. Un snapshot, c'est une copie figée et immuable de l'état du miroir à un instant T. Une fois créé, il ne bouge plus, quoi qu'il arrive au miroir source.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly snapshot create trixie-&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; from mirror debian-trixie
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;J'utilise la date dans le nom du snapshot. C'est une bonne pratique : ça permet de savoir immédiatement à quoi correspond chaque snapshot.&lt;/p&gt;
&lt;p&gt;Vous pouvez lister vos snapshots :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly snapshot list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et voir le détail d'un snapshot :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly snapshot show trixie-20260313
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="publier-le-snapshot"&gt;&lt;a href="#publier-le-snapshot" class="header-anchor"&gt;&lt;/a&gt;Publier le snapshot
&lt;/h2&gt;&lt;p&gt;Un snapshot qui n'est pas publié, ça ne sert à rien. La publication génère l'arborescence standard Debian (&lt;code&gt;dists/&lt;/code&gt;, &lt;code&gt;pool/&lt;/code&gt;, fichiers &lt;code&gt;Release&lt;/code&gt; signés...) dans &lt;code&gt;/var/aptly/public/&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly publish snapshot -distribution&lt;span style="color:#f92672"&gt;=&lt;/span&gt;trixie trixie-20260313
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le flag &lt;code&gt;-distribution=trixie&lt;/code&gt; indique quelle distribution utiliser dans les métadonnées du dépôt publié. C'est ce que vos machines verront dans leur &lt;code&gt;sources.list&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;aptly va vous demander la passphrase de votre clé GPG pour signer le fichier &lt;code&gt;Release&lt;/code&gt;. Si vous n'avez pas encore de clé GPG, créez-en une :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gpg --full-generate-key
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Choisissez RSA 4096 bits, et renseignez un nom et un email.&lt;/p&gt;
&lt;p&gt;Une fois la publication terminée, vous avez un dépôt Debian complet dans &lt;code&gt;/var/aptly/public/&lt;/code&gt;. Il ne reste plus qu'à l'exposer via un serveur web.&lt;/p&gt;
&lt;h2 id="limpact-des-hard-links"&gt;&lt;a href="#limpact-des-hard-links" class="header-anchor"&gt;&lt;/a&gt;L&amp;rsquo;impact des hard links
&lt;/h2&gt;&lt;p&gt;Un détail important : quand aptly publie un snapshot, il ne copie pas les fichiers &lt;code&gt;.deb&lt;/code&gt;. Il crée des &lt;strong&gt;hard links&lt;/strong&gt; depuis le pool vers le répertoire &lt;code&gt;public/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ça veut dire quoi concrètement ?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Pas de duplication&lt;/strong&gt; -- un paquet présent dans plusieurs snapshots n'occupe qu'une seule fois la place sur le disque&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Publication instantanée&lt;/strong&gt; -- créer un hard link, c'est quasi gratuit en temps et en espace&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plusieurs snapshots publiés en même temps&lt;/strong&gt; -- vous pouvez avoir &lt;code&gt;trixie-20260313&lt;/code&gt; et &lt;code&gt;trixie-20260310&lt;/code&gt; publiés simultanément, ils partagent les fichiers communs&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;C'est pour ça que le &lt;code&gt;publish switch&lt;/code&gt; est si rapide. aptly ne déplace rien, il change juste les liens.&lt;/p&gt;
&lt;p&gt;Par contre, attention : si vous supprimez un snapshot publié avec &lt;code&gt;snapshot drop&lt;/code&gt;, aptly refuse tant que la publication existe. Il faut d'abord dépublier (&lt;code&gt;publish drop&lt;/code&gt;) ou basculer vers un autre snapshot (&lt;code&gt;publish switch&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id="mettre-à-jour-le-miroir-et-basculer"&gt;&lt;a href="#mettre-%c3%a0-jour-le-miroir-et-basculer" class="header-anchor"&gt;&lt;/a&gt;Mettre à jour le miroir et basculer
&lt;/h2&gt;&lt;p&gt;Quelques jours passent. Le miroir Debian a évolué. Vous voulez mettre à jour votre dépôt local. Voilà le workflow complet :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 1. Mettre à jour le miroir&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly mirror update debian-trixie
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 2. Créer un nouveau snapshot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly snapshot create trixie-&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt; from mirror debian-trixie
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 3. Basculer la publication vers le nouveau snapshot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly publish switch trixie trixie-20260315
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le &lt;code&gt;publish switch&lt;/code&gt; fait tout le boulot :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Il met à jour les métadonnées (&lt;code&gt;Release&lt;/code&gt;, &lt;code&gt;Packages&lt;/code&gt;, &lt;code&gt;Contents&lt;/code&gt;...)&lt;/li&gt;
&lt;li&gt;Il ajuste les hard links dans &lt;code&gt;public/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Il signe le nouveau &lt;code&gt;Release&lt;/code&gt; avec GPG&lt;/li&gt;
&lt;li&gt;Il nettoie les anciens liens qui ne servent plus&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vos machines qui pointent sur ce dépôt voient le changement au prochain &lt;code&gt;apt update&lt;/code&gt;. Pas de coupure, pas de temps d'arrêt.&lt;/p&gt;
&lt;p&gt;Si le nouveau snapshot pose problème, vous rebasculez sur l'ancien :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly publish switch trixie trixie-20260313
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;C'est aussi rapide dans un sens que dans l'autre.&lt;/p&gt;
&lt;h2 id="les-dépôts-locaux-mention-rapide"&gt;&lt;a href="#les-d%c3%a9p%c3%b4ts-locaux-mention-rapide" class="header-anchor"&gt;&lt;/a&gt;Les dépôts locaux (mention rapide)
&lt;/h2&gt;&lt;p&gt;aptly sait aussi gérer des dépôts locaux, où vous poussez vos propres paquets &lt;code&gt;.deb&lt;/code&gt;. Le workflow est similaire :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Créer un dépôt local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly repo create mon-depot
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Ajouter des paquets&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly repo add mon-depot /chemin/vers/*.deb
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Snapshot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly snapshot create mon-depot-v1 from repo mon-depot
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Publier&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly publish snapshot mon-depot-v1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Je ne développe pas plus ici, parce que le cas d'usage principal d'aptly, c'est quand même le mirroring. Mais sachez que c'est possible.&lt;/p&gt;
&lt;h2 id="exposer-le-dépôt"&gt;&lt;a href="#exposer-le-d%c3%a9p%c3%b4t" class="header-anchor"&gt;&lt;/a&gt;Exposer le dépôt
&lt;/h2&gt;&lt;h3 id="le-serveur-embarqué-test-uniquement"&gt;&lt;a href="#le-serveur-embarqu%c3%a9-test-uniquement" class="header-anchor"&gt;&lt;/a&gt;Le serveur embarqué (test uniquement)
&lt;/h3&gt;&lt;p&gt;aptly a un petit serveur HTTP intégré. C'est pratique pour tester, mais la doc officielle est claire : &lt;strong&gt;not suitable for real production usage&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly serve -listen&lt;span style="color:#f92672"&gt;=&lt;/span&gt;:8080
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vous pouvez alors ajouter le dépôt sur une machine de test :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;deb http://votre-serveur:8080/ trixie main non-free-firmware&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | sudo tee /etc/apt/sources.list.d/aptly-test.list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="nginx-production"&gt;&lt;a href="#nginx-production" class="header-anchor"&gt;&lt;/a&gt;nginx (production)
&lt;/h3&gt;&lt;p&gt;En prod, on utilise nginx. Je ne vais pas détailler ici parce que ça fera l'objet d'un second article si besoin, mais l'idée générale :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;server&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;listen&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;server_name&lt;/span&gt; &lt;span style="color:#e6db74"&gt;repo.example.com&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;root&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/var/aptly/public&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;location&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;autoindex&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;on&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vous activez le vhost, vous rechargez nginx, et c'est bon. Pour HTTPS, ajoutez Let's Encrypt avec &lt;code&gt;certbot&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Côté client, vous ajoutez le dépôt :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;deb http://repo.example.com/ trixie main non-free-firmware&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | sudo tee /etc/apt/sources.list.d/mon-miroir.list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si le dépôt est signé (et il devrait l'être), distribuez votre clé GPG publique aux clients :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gpg --armor --export VOTRE_KEY_ID &amp;gt; /var/aptly/public/repo-key.asc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sur les clients :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget -O /etc/apt/keyrings/mon-repo.asc http://repo.example.com/repo-key.asc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;deb [signed-by=/etc/apt/keyrings/mon-repo.asc] http://repo.example.com/ trixie main non-free-firmware&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; | sudo tee /etc/apt/sources.list.d/mon-miroir.list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="automatiser-avec-cron"&gt;&lt;a href="#automatiser-avec-cron" class="header-anchor"&gt;&lt;/a&gt;Automatiser avec cron
&lt;/h2&gt;&lt;p&gt;Un miroir, ça se met à jour régulièrement. Voici un script cron qui fait le job :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# /etc/cron.daily/aptly-update&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set -euo pipefail
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MIRROR&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;debian-trixie&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DATE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Mise à jour du miroir&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly mirror update &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$MIRROR&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Nouveau snapshot&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly snapshot create &lt;span style="color:#e6db74"&gt;&amp;#34;trixie-&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;DATE&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; from mirror &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$MIRROR&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Basculer la publication&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly publish switch -batch -gpg-key&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;VOTRE_KEY_ID&amp;#34;&lt;/span&gt; trixie &lt;span style="color:#e6db74"&gt;&amp;#34;trixie-&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;DATE&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Nettoyer les vieux snapshots (garder les 7 derniers)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly snapshot list -raw | grep &lt;span style="color:#e6db74"&gt;&amp;#34;^trixie-&amp;#34;&lt;/span&gt; | sort | head -n -7 | &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; read snap; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; aptly snapshot drop &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$snap&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; 2&amp;gt;/dev/null &lt;span style="color:#f92672"&gt;||&lt;/span&gt; true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Nettoyer la base&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly db cleanup
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le flag &lt;code&gt;-batch&lt;/code&gt; est crucial : il permet à GPG de fonctionner sans terminal interactif. Sans ça, le script va bloquer en attendant que vous tapiez la passphrase.&lt;/p&gt;
&lt;p&gt;Pour éviter ça, vous pouvez aussi utiliser &lt;code&gt;gpg-agent&lt;/code&gt; avec un cache de passphrase, ou stocker la passphrase dans un fichier sécurisé et utiliser &lt;code&gt;-passphrase-file&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="nettoyage-et-maintenance"&gt;&lt;a href="#nettoyage-et-maintenance" class="header-anchor"&gt;&lt;/a&gt;Nettoyage et maintenance
&lt;/h2&gt;&lt;p&gt;aptly conserve tous les paquets téléchargés dans son pool, même ceux qui ne sont plus référencés par aucun snapshot. Pour faire le ménage :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly db cleanup
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ça supprime les paquets orphelins. Si vous voulez voir ce qui va être supprimé avant de le faire :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly db cleanup -verbose -dry-run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour sauvegarder votre installation aptly, c'est simple : sauvegardez &lt;code&gt;/var/aptly&lt;/code&gt; en entier. Tout est dedans.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar -czf aptly-backup-&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;.tar.gz /var/aptly
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="quelques-astuces"&gt;&lt;a href="#quelques-astuces" class="header-anchor"&gt;&lt;/a&gt;Quelques astuces
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Filtrer les paquets lors du mirroring.&lt;/strong&gt; Si vous ne voulez mirrorer que certains paquets (par exemple, uniquement nginx et ses dépendances), vous pouvez utiliser des filtres :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly mirror create -filter&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;nginx&amp;#39;&lt;/span&gt; -filter-with-deps &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nginx-only &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; http://ftp.fr.debian.org/debian/ &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; trixie main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le flag &lt;code&gt;-filter-with-deps&lt;/code&gt; est important : sans lui, vous récupérez nginx mais pas ses dépendances, et ça ne servira à rien.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comparer deux snapshots.&lt;/strong&gt; Pour voir ce qui a changé entre deux snapshots :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly snapshot diff trixie-20260313 trixie-20260315
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Fusionner des snapshots.&lt;/strong&gt; Vous pouvez combiner plusieurs snapshots en un seul. Utile si vous avez un miroir Debian et un dépôt local, et que vous voulez les publier ensemble :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aptly snapshot merge trixie-complet trixie-20260315 mon-depot-v1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="conclusion"&gt;&lt;a href="#conclusion" class="header-anchor"&gt;&lt;/a&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;aptly résout un vrai problème : comment garder le contrôle sur ce que vos machines Debian vont installer. Les miroirs classiques vous donnent une copie locale, d'accord, mais ils ne vous donnent pas la maîtrise des changements. Avec aptly et ses snapshots, vous décidez quand et comment vos serveurs voient les mises à jour.&lt;/p&gt;
&lt;p&gt;Le workflow &lt;code&gt;mirror create&lt;/code&gt; → &lt;code&gt;mirror update&lt;/code&gt; → &lt;code&gt;snapshot create&lt;/code&gt; → &lt;code&gt;publish snapshot&lt;/code&gt; → &lt;code&gt;publish switch&lt;/code&gt; devient vite un réflexe. Et le jour où une mise à jour casse quelque chose, vous serez bien content de pouvoir rebascule sur le snapshot d'hier en une commande.&lt;/p&gt;
&lt;p&gt;Les hard links font que tout ça reste léger en espace disque et rapide en exécution. Vous pouvez avoir plusieurs snapshots publiés en parallèle, pour des environnements de test et de prod différents, sans exploser votre stockage.&lt;/p&gt;
&lt;p&gt;Bref, si vous gérez des serveurs Debian sérieusement, aptly mérite sa place dans votre boîte à outils.&lt;/p&gt;</description></item><item><title>Zoxide : Une alternative intelligente à la commande cd</title><link>https://beta.slash-root.fr/zoxide-une-alternative-intelligente-a-la-commande-cd/</link><pubDate>Sun, 21 Sep 2025 00:00:10 +0200</pubDate><guid>https://beta.slash-root.fr/zoxide-une-alternative-intelligente-a-la-commande-cd/</guid><description>&lt;img src="https://beta.slash-root.fr/zoxide-une-alternative-intelligente-a-la-commande-cd/cover.png" alt="Featured image of post Zoxide : Une alternative intelligente à la commande cd" /&gt;&lt;h2 id="introduction"&gt;&lt;a href="#introduction" class="header-anchor"&gt;&lt;/a&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Naviguer dans l'arborescence des fichiers en ligne de commande peut rapidement devenir fastidieux, surtout lorsque vous travaillez avec des projets complexes comportant de nombreux répertoires imbriqués. C'est là qu'intervient &lt;strong&gt;zoxide&lt;/strong&gt;, un outil révolutionnaire qui transforme votre expérience de navigation en shell.&lt;/p&gt;
&lt;p&gt;Zoxide est une alternative moderne et intelligente à la commande &lt;code&gt;cd&lt;/code&gt; traditionnelle. Inspiré par des outils comme &lt;code&gt;z&lt;/code&gt; et &lt;code&gt;autojump&lt;/code&gt;, il mémorise les répertoires que vous visitez le plus fréquemment et vous permet de &amp;quot;sauter&amp;quot; vers eux en quelques frappes seulement.&lt;/p&gt;
&lt;h2 id="quest-ce-que-zoxide-"&gt;&lt;a href="#quest-ce-que-zoxide-" class="header-anchor"&gt;&lt;/a&gt;Qu&amp;rsquo;est-ce que zoxide ?
&lt;/h2&gt;&lt;p&gt;Zoxide est un utilitaire de navigation rapide qui :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apprend de vos habitudes&lt;/strong&gt; : Il enregistre automatiquement les répertoires que vous visitez&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Propose une navigation intelligente&lt;/strong&gt; : Plus vous visitez un répertoire, plus il devient facile d'y accéder&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Supporte tous les shells majeurs&lt;/strong&gt; : Bash, Zsh, Fish, PowerShell, Nushell, et plus encore&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Offre une sélection interactive&lt;/strong&gt; : Avec &lt;code&gt;zi&lt;/code&gt;, vous pouvez choisir parmi plusieurs options via &lt;code&gt;fzf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reste compatible&lt;/strong&gt; : Fonctionne comme un &lt;code&gt;cd&lt;/code&gt; classique quand nécessaire&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation-sur-debianubuntu-et-dérivés"&gt;&lt;a href="#installation-sur-debianubuntu-et-d%c3%a9riv%c3%a9s" class="header-anchor"&gt;&lt;/a&gt;Installation sur Debian/Ubuntu et dérivés
&lt;/h2&gt;&lt;h3 id="installation-via-les-dépôts-officiels"&gt;&lt;a href="#installation-via-les-d%c3%a9p%c3%b4ts-officiels" class="header-anchor"&gt;&lt;/a&gt;Installation via les dépôts officiels
&lt;/h3&gt;&lt;p&gt;La méthode la plus simple pour installer zoxide sur Debian 11+ et Ubuntu est d'utiliser les dépôts officiels :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install zoxide
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="méthodes-alternatives-dinstallation"&gt;&lt;a href="#m%c3%a9thodes-alternatives-dinstallation" class="header-anchor"&gt;&lt;/a&gt;Méthodes alternatives d&amp;rsquo;installation
&lt;/h3&gt;&lt;p&gt;Si vous préférez une version plus récente ou si zoxide n'est pas disponible dans vos dépôts, vous pouvez utiliser :&lt;/p&gt;
&lt;h4 id="via-le-script-dinstallation-officiel"&gt;&lt;a href="#via-le-script-dinstallation-officiel" class="header-anchor"&gt;&lt;/a&gt;Via le script d&amp;rsquo;installation officiel
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -sSfL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Note de sécurité&lt;/strong&gt; : Il est recommandé de lire le contenu du script avant de l'exécuter. Vous pouvez d'abord le télécharger avec &lt;code&gt;curl -sSfL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh&lt;/code&gt; pour l'examiner.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="via-cargo-si-rust-est-installé"&gt;&lt;a href="#via-cargo-si-rust-est-install%c3%a9" class="header-anchor"&gt;&lt;/a&gt;Via Cargo (si Rust est installé)
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cargo install zoxide --locked
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="via-homebrew-sur-linux"&gt;&lt;a href="#via-homebrew-sur-linux" class="header-anchor"&gt;&lt;/a&gt;Via Homebrew sur Linux
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;brew install zoxide
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="prérequis-recommandé--fzf"&gt;&lt;a href="#pr%c3%a9requis-recommand%c3%a9--fzf" class="header-anchor"&gt;&lt;/a&gt;Prérequis recommandé : fzf
&lt;/h3&gt;&lt;p&gt;Pour profiter pleinement de zoxide, notamment de la commande interactive &lt;code&gt;zi&lt;/code&gt;, il est recommandé d'installer &lt;code&gt;fzf&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install fzf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="configuration-avec-zoxide-init"&gt;&lt;a href="#configuration-avec-zoxide-init" class="header-anchor"&gt;&lt;/a&gt;Configuration avec &lt;code&gt;zoxide init&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;Une fois zoxide installé, vous devez l'initialiser dans votre shell. Cette étape est cruciale car elle intègre zoxide à votre environnement shell.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; : La commande &lt;code&gt;zoxide init&lt;/code&gt; génère la configuration à ajouter à votre profil shell.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="configuration-pour-bash"&gt;&lt;a href="#configuration-pour-bash" class="header-anchor"&gt;&lt;/a&gt;Configuration pour Bash
&lt;/h3&gt;&lt;p&gt;Ajoutez cette ligne à la fin de votre fichier &lt;code&gt;~/.bashrc&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eval &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;zoxide init bash&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="configuration-pour-zsh"&gt;&lt;a href="#configuration-pour-zsh" class="header-anchor"&gt;&lt;/a&gt;Configuration pour Zsh
&lt;/h3&gt;&lt;p&gt;Ajoutez cette ligne à la fin de votre fichier &lt;code&gt;~/.zshrc&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eval &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;zoxide init zsh&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="configuration-pour-fish"&gt;&lt;a href="#configuration-pour-fish" class="header-anchor"&gt;&lt;/a&gt;Configuration pour Fish
&lt;/h3&gt;&lt;p&gt;Ajoutez cette ligne à la fin de votre fichier &lt;code&gt;~/.config/fish/config.fish&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zoxide init fish | source
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="rechargement-de-la-configuration"&gt;&lt;a href="#rechargement-de-la-configuration" class="header-anchor"&gt;&lt;/a&gt;Rechargement de la configuration
&lt;/h3&gt;&lt;p&gt;Après avoir modifié votre fichier de configuration, rechargez-le suivant le shell utilisé :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source ~/.zshrc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source ~/.config/fish/config.fish
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="utilisation-de-base"&gt;&lt;a href="#utilisation-de-base" class="header-anchor"&gt;&lt;/a&gt;Utilisation de base
&lt;/h2&gt;&lt;p&gt;Une fois configuré, zoxide vous donne accès à plusieurs commandes puissantes :&lt;/p&gt;
&lt;h3 id="la-commande-z"&gt;&lt;a href="#la-commande-z" class="header-anchor"&gt;&lt;/a&gt;La commande &lt;code&gt;z&lt;/code&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z foo
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z foo bar
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z foo/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z ~/Documents
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z ..
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z -
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="la-commande-zi-navigation-interactive"&gt;&lt;a href="#la-commande-zi-navigation-interactive" class="header-anchor"&gt;&lt;/a&gt;La commande &lt;code&gt;zi&lt;/code&gt; (navigation interactive)
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zi foo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cette commande ouvre une interface interactive où vous pouvez choisir parmi plusieurs répertoires correspondants.&lt;/p&gt;
&lt;h3 id="autocomplétion"&gt;&lt;a href="#autocompl%c3%a9tion" class="header-anchor"&gt;&lt;/a&gt;Autocomplétion
&lt;/h3&gt;&lt;p&gt;Sur les shells compatibles (Bash 4.4+, Fish, Zsh), vous pouvez utiliser l'autocomplétion :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z foo&amp;lt;SPACE&amp;gt;&amp;lt;TAB&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="bonus--alias-cd039z039"&gt;&lt;a href="#bonus--alias-cd039z039" class="header-anchor"&gt;&lt;/a&gt;Bonus : Alias &lt;code&gt;cd='z'&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;Pour une intégration encore plus transparente, vous pouvez créer un alias qui remplace complètement &lt;code&gt;cd&lt;/code&gt; par &lt;code&gt;z&lt;/code&gt; :&lt;/p&gt;
&lt;h3 id="méthode-recommandée--configuration-automatique-via-zoxide-init"&gt;&lt;a href="#m%c3%a9thode-recommand%c3%a9e--configuration-automatique-via-zoxide-init" class="header-anchor"&gt;&lt;/a&gt;Méthode recommandée : Configuration automatique via zoxide init
&lt;/h3&gt;&lt;p&gt;La meilleure approche est d'utiliser l'option &lt;code&gt;--cmd cd&lt;/code&gt; lors de l'initialisation :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eval &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;zoxide init bash --cmd cd&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eval &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;zoxide init zsh --cmd cd&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Avec cette configuration, la commande &lt;code&gt;cd&lt;/code&gt; sera automatiquement remplacée par &lt;code&gt;z&lt;/code&gt;, tout en conservant la compatibilité avec l'utilisation classique de &lt;code&gt;cd&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="alternative--alias-manuel"&gt;&lt;a href="#alternative--alias-manuel" class="header-anchor"&gt;&lt;/a&gt;Alternative : Alias manuel
&lt;/h3&gt;&lt;p&gt;Si vous préférez ne pas modifier votre configuration &lt;code&gt;zoxide init&lt;/code&gt; existante, vous pouvez simplement ajouter un alias :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;alias cd&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;z&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cette méthode produit le même résultat que &lt;code&gt;--cmd cd&lt;/code&gt;, mais la méthode automatique avec &lt;code&gt;--cmd cd&lt;/code&gt; est plus propre et évite les conflits potentiels.&lt;/p&gt;
&lt;h2 id="options-de-configuration-avancées"&gt;&lt;a href="#options-de-configuration-avanc%c3%a9es" class="header-anchor"&gt;&lt;/a&gt;Options de configuration avancées
&lt;/h2&gt;&lt;h3 id="personnalisation-du-préfixe-des-commandes"&gt;&lt;a href="#personnalisation-du-pr%c3%a9fixe-des-commandes" class="header-anchor"&gt;&lt;/a&gt;Personnalisation du préfixe des commandes
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eval &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;zoxide init bash --cmd j&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eval &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;zoxide init bash --cmd cd&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="contrôle-de-la-fréquence-denregistrement"&gt;&lt;a href="#contr%c3%b4le-de-la-fr%c3%a9quence-denregistrement" class="header-anchor"&gt;&lt;/a&gt;Contrôle de la fréquence d&amp;rsquo;enregistrement
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eval &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;zoxide init bash --hook pwd&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eval &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;zoxide init bash --hook prompt&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eval &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;zoxide init bash --hook none&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="exemples-pratiques-dutilisation"&gt;&lt;a href="#exemples-pratiques-dutilisation" class="header-anchor"&gt;&lt;/a&gt;Exemples pratiques d&amp;rsquo;utilisation
&lt;/h2&gt;&lt;h3 id="scénario-1--développement-web"&gt;&lt;a href="#sc%c3%a9nario-1--d%c3%a9veloppement-web" class="header-anchor"&gt;&lt;/a&gt;Scénario 1 : Développement web
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd ~/projets/mon-site-web/src/components/header
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z header
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="scénario-2--administration-système"&gt;&lt;a href="#sc%c3%a9nario-2--administration-syst%c3%a8me" class="header-anchor"&gt;&lt;/a&gt;Scénario 2 : Administration système
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z logs
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="scénario-3--projets-multiples"&gt;&lt;a href="#sc%c3%a9nario-3--projets-multiples" class="header-anchor"&gt;&lt;/a&gt;Scénario 3 : Projets multiples
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z projet1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z projet2 backend
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z projet3 frontend
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="commandes-utiles"&gt;&lt;a href="#commandes-utiles" class="header-anchor"&gt;&lt;/a&gt;Commandes utiles
&lt;/h2&gt;&lt;h3 id="gestion-de-la-base-de-données-zoxide"&gt;&lt;a href="#gestion-de-la-base-de-donn%c3%a9es-zoxide" class="header-anchor"&gt;&lt;/a&gt;Gestion de la base de données zoxide
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zoxide query --list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zoxide add /chemin/vers/repertoire
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zoxide remove /chemin/vers/repertoire
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Nettoyer les répertoires inexistants&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zoxide query --list | &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; read -r line; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; path&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$line&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; | awk &lt;span style="color:#e6db74"&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; ! -d &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$path&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; zoxide remove &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$path&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="avantages-par-rapport-aux-alternatives"&gt;&lt;a href="#avantages-par-rapport-aux-alternatives" class="header-anchor"&gt;&lt;/a&gt;Avantages par rapport aux alternatives
&lt;/h2&gt;&lt;h3 id="comparaison-avec-autojump"&gt;&lt;a href="#comparaison-avec-autojump" class="header-anchor"&gt;&lt;/a&gt;Comparaison avec &lt;code&gt;autojump&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Source&lt;/strong&gt; : &lt;a href="https://github.com/wting/autojump"&gt;https://github.com/wting/autojump&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt; : zoxide est écrit en Rust, plus rapide que autojump (Python)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maintenance&lt;/strong&gt; : Projet activement maintenu&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compatibilité&lt;/strong&gt; : Support natif de plus de shells&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="comparaison-avec-zsh"&gt;&lt;a href="#comparaison-avec-zsh" class="header-anchor"&gt;&lt;/a&gt;Comparaison avec &lt;code&gt;z.sh&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Source&lt;/strong&gt; : &lt;a href="https://github.com/rupa/z"&gt;https://github.com/rupa/z&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Algorithme&lt;/strong&gt; : Meilleur algorithme de classement&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fonctionnalités&lt;/strong&gt; : Mode interactif avec &lt;code&gt;zi&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Robustesse&lt;/strong&gt; : Gestion d'erreurs améliorée&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="intégrations-et-outils-complémentaires"&gt;&lt;a href="#int%c3%a9grations-et-outils-compl%c3%a9mentaires" class="header-anchor"&gt;&lt;/a&gt;Intégrations et outils complémentaires
&lt;/h2&gt;&lt;h3 id="avec-votre-éditeur"&gt;&lt;a href="#avec-votre-%c3%a9diteur" class="header-anchor"&gt;&lt;/a&gt;Avec votre éditeur
&lt;/h3&gt;&lt;p&gt;Vous pouvez créer des fonctions personnalisées pour ouvrir directement des projets :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Fonction pour ouvrir un projet avec Neovim&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; nvim-project&lt;span style="color:#f92672"&gt;()&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; local dir&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;zoxide query &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$1&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; -n &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$dir&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cd &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$dir&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; nvim .
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Projet non trouvé : &lt;/span&gt;$1&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Fonction pour ouvrir un projet avec VS Code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; code-project&lt;span style="color:#f92672"&gt;()&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; local dir&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;zoxide query &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$1&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; -n &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$dir&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; code &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$dir&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Projet non trouvé : &lt;/span&gt;$1&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Libérez votre swap !</title><link>https://beta.slash-root.fr/liberez-votre-swap/</link><pubDate>Sun, 01 Dec 2024 06:09:15 +0100</pubDate><guid>https://beta.slash-root.fr/liberez-votre-swap/</guid><description>&lt;img src="https://beta.slash-root.fr/liberez-votre-swap/cover.png" alt="Featured image of post Libérez votre swap !" /&gt;&lt;h2 id="préambule"&gt;&lt;a href="#pr%c3%a9ambule" class="header-anchor"&gt;&lt;/a&gt;Préambule
&lt;/h2&gt;&lt;p&gt;Envie de libérer Britney ? Ou plutôt... votre swap ? 🎵&lt;/p&gt;
&lt;p&gt;Si vous cherchez à optimiser l'utilisation de votre mémoire virtuelle sur une machine Debian, vous êtes au bon endroit !&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id="le-swappiness-cest-quoi-"&gt;&lt;a href="#le-swappiness-cest-quoi-" class="header-anchor"&gt;&lt;/a&gt;Le &lt;code&gt;swappiness&lt;/code&gt;, c&amp;rsquo;est quoi ?
&lt;/h3&gt;&lt;p&gt;Le &lt;code&gt;swappiness&lt;/code&gt; est un paramètre du kernel Linux qui contrôle la &amp;quot;proportion&amp;quot; du système à utiliser le swap. Une valeur faible favorise l'utilisation de la RAM, tandis qu'une valeur élevée incite à swapper rapidement sur le disque.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="quelques-commandes-essentielles"&gt;&lt;a href="#quelques-commandes-essentielles" class="header-anchor"&gt;&lt;/a&gt;Quelques commandes essentielles
&lt;/h2&gt;&lt;h3 id="1-vérifier-la-valeur-actuelle-du-swappiness"&gt;&lt;a href="#1-v%c3%a9rifier-la-valeur-actuelle-du-swappiness" class="header-anchor"&gt;&lt;/a&gt;1. Vérifier la valeur actuelle du &lt;code&gt;swappiness&lt;/code&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat /proc/sys/vm/swappiness
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-modifier-dynamiquement-le-swappiness"&gt;&lt;a href="#2-modifier-dynamiquement-le-swappiness" class="header-anchor"&gt;&lt;/a&gt;2. Modifier dynamiquement le &lt;code&gt;swappiness&lt;/code&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo sysctl vm.swappiness&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;⚠️ Cette modification n'est pas persistante et sera perdue au redémarrage.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="3-rendre-la-configuration-persistante"&gt;&lt;a href="#3-rendre-la-configuration-persistante" class="header-anchor"&gt;&lt;/a&gt;3. Rendre la configuration persistante
&lt;/h3&gt;&lt;p&gt;Ajoutez ou modifiez la ligne suivante dans &lt;code&gt;/etc/sysctl.conf&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;vm.swappiness&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Appliquez ensuite la configuration :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo sysctl -p
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-comprendre-les-valeurs-du-swappiness"&gt;&lt;a href="#4-comprendre-les-valeurs-du-swappiness" class="header-anchor"&gt;&lt;/a&gt;4. Comprendre les valeurs du &lt;code&gt;swappiness&lt;/code&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;100&lt;/strong&gt; : Le système swap intensément.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;0&lt;/strong&gt; : Swap uniquement en cas de RAM complètement saturée.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Défaut&lt;/strong&gt; : Généralement &lt;strong&gt;60&lt;/strong&gt; sur Debian.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5-désactiver-et-réactiver-le-swap"&gt;&lt;a href="#5-d%c3%a9sactiver-et-r%c3%a9activer-le-swap" class="header-anchor"&gt;&lt;/a&gt;5. Désactiver et réactiver le swap
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo swapoff -a &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo swapon -a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;⚠️ Assurez-vous que la RAM disponible est suffisante pour accueillir les données du swap avant de désactiver ce dernier.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="6-identifier-les-processus-utilisant-le-swap"&gt;&lt;a href="#6-identifier-les-processus-utilisant-le-swap" class="header-anchor"&gt;&lt;/a&gt;6. Identifier les processus utilisant le swap
&lt;/h3&gt;&lt;p&gt;Pour examiner les processus gourmands en swap, utilisez cette commande :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; file in /proc/*/status ; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; awk &lt;span style="color:#e6db74"&gt;&amp;#39;/VmSwap|Name/{printf $2 &amp;#34; &amp;#34; $3}END{ print &amp;#34;&amp;#34;}&amp;#39;&lt;/span&gt; $file; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;done&lt;/span&gt; | &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sort -k &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; -n -r | less
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr /&gt;
&lt;h2 id="automatisation-avec-un-script-bash"&gt;&lt;a href="#automatisation-avec-un-script-bash" class="header-anchor"&gt;&lt;/a&gt;Automatisation avec un script Bash
&lt;/h2&gt;&lt;p&gt;Pour simplifier la gestion du swap, voici un script bash prêt à l'emploi :&lt;/p&gt;
&lt;h3 id="script--free-swapsh"&gt;&lt;a href="#script--free-swapsh" class="header-anchor"&gt;&lt;/a&gt;Script : &lt;code&gt;free-swap.sh&lt;/code&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;check_command&lt;span style="color:#f92672"&gt;()&lt;/span&gt; &lt;span style="color:#f92672"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[[&lt;/span&gt; $? -ne &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;]]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Erreur lors de l&amp;#39;exécution de la commande: &lt;/span&gt;$1&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exit &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;free_data&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;free&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;check_command &lt;span style="color:#e6db74"&gt;&amp;#34;free&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mem_data&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$free_data&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; | grep &lt;span style="color:#e6db74"&gt;&amp;#39;Mem:&amp;#39;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;free_mem&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$mem_data&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; | awk &lt;span style="color:#e6db74"&gt;&amp;#39;{print $4}&amp;#39;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;buffers&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$mem_data&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; | awk &lt;span style="color:#e6db74"&gt;&amp;#39;{print $6}&amp;#39;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cache&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$mem_data&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; | awk &lt;span style="color:#e6db74"&gt;&amp;#39;{print $7}&amp;#39;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;total_free&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$((&lt;/span&gt;free_mem &lt;span style="color:#f92672"&gt;+&lt;/span&gt; buffers &lt;span style="color:#f92672"&gt;+&lt;/span&gt; cache&lt;span style="color:#66d9ef"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$free_data&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; | grep -q &lt;span style="color:#e6db74"&gt;&amp;#39;Échange:&amp;#39;&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; used_swap&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$free_data&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; | grep &lt;span style="color:#e6db74"&gt;&amp;#39;Échange:&amp;#39;&lt;/span&gt; | awk &lt;span style="color:#e6db74"&gt;&amp;#39;{print $3}&amp;#39;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; used_swap&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$free_data&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; | grep &lt;span style="color:#e6db74"&gt;&amp;#39;Swap:&amp;#39;&lt;/span&gt; | awk &lt;span style="color:#e6db74"&gt;&amp;#39;{print $3}&amp;#39;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo -e &lt;span style="color:#e6db74"&gt;&amp;#34;Free memory:\t&lt;/span&gt;$total_free&lt;span style="color:#e6db74"&gt; kB (&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$((&lt;/span&gt;total_free &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1024&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;))&lt;/span&gt;&lt;span style="color:#e6db74"&gt; MB)\nUsed swap:\t&lt;/span&gt;$used_swap&lt;span style="color:#e6db74"&gt; kB (&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$((&lt;/span&gt;used_swap &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1024&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;))&lt;/span&gt;&lt;span style="color:#e6db74"&gt; MB)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[[&lt;/span&gt; $used_swap -eq &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;]]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Félicitations ! Aucun swap n&amp;#39;est utilisé.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;elif&lt;/span&gt; &lt;span style="color:#f92672"&gt;[[&lt;/span&gt; $used_swap -lt $total_free &lt;span style="color:#f92672"&gt;]]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Libération du swap...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sudo swapoff -a
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; check_command &lt;span style="color:#e6db74"&gt;&amp;#34;swapoff&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sudo swapon -a
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; check_command &lt;span style="color:#e6db74"&gt;&amp;#34;swapon&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Pas assez de mémoire libre pour libérer le swap. Arrêt.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exit &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="instructions-"&gt;&lt;a href="#instructions-" class="header-anchor"&gt;&lt;/a&gt;Instructions :
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Enregistrez le script dans un fichier, par exemple : &lt;code&gt;free-swap.sh&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Rendez-le exécutable :&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chmod u+x free-swap.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;Exécutez-le :&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./free-swap.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;⚠️ Ne pas utiliser ce script si &lt;strong&gt;ZRAM&lt;/strong&gt; est activé sur votre système, car cela pourrait entraîner des comportements inattendus.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id="conclusion"&gt;&lt;a href="#conclusion" class="header-anchor"&gt;&lt;/a&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Vous venez de découvrir comment optimiser la gestion du swap sous Debian. Que ce soit via des commandes ou un script Bash, vous êtes désormais armé pour reprendre le contrôle de votre mémoire virtuelle.&lt;/p&gt;
&lt;p&gt;Et surtout, souvenez-vous : le swap, c'est bien... mais la RAM, c'est mieux ! 😉&lt;/p&gt;</description></item><item><title>Scripting bash : Couleurs / Styles texte</title><link>https://beta.slash-root.fr/scripting-bash-couleurs-styles-texte/</link><pubDate>Tue, 06 Dec 2022 18:13:55 +0100</pubDate><guid>https://beta.slash-root.fr/scripting-bash-couleurs-styles-texte/</guid><description>&lt;img src="https://beta.slash-root.fr/scripting-bash-couleurs-styles-texte/cover.jpg" alt="Featured image of post Scripting bash : Couleurs / Styles texte" /&gt;&lt;h2 id="couleurs"&gt;&lt;a href="#couleurs" class="header-anchor"&gt;&lt;/a&gt;Couleurs
&lt;/h2&gt;&lt;h3 id="variables"&gt;&lt;a href="#variables" class="header-anchor"&gt;&lt;/a&gt;Variables
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;neutre&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[0;m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;noir&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[0;30m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gris&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[1;30m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rougefonce&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[0;31m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rose&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[1;31m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vertfonce&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[0;32m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vertclair&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[1;32m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;orange&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[0;33m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;jaune&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[1;33m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bleufonce&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[0;34m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bleuclair&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[1;34m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;violetfonce&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[0;35m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;violetclair&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[1;35m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cyanfonce&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[0;36m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cyanclair&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[1;36m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;grisclair&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[0;37m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;blanc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\e[1;37m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="utilisation"&gt;&lt;a href="#utilisation" class="header-anchor"&gt;&lt;/a&gt;Utilisation
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo -e &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;rougefonce&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;Hello&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;neutre&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;jaune&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;World&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;neutre&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;-e&lt;/strong&gt; : enable interpretation of backslash escapes&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="styles"&gt;&lt;a href="#styles" class="header-anchor"&gt;&lt;/a&gt;Styles
&lt;/h2&gt;&lt;h3 id="variables-1"&gt;&lt;a href="#variables-1" class="header-anchor"&gt;&lt;/a&gt;Variables
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;normal&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\033[0m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gras&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\033[1m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fin&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\033[2m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;italic&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\033[3m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;souligne&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\033[4m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;flash&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\033[5m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;inverse&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\033[7m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;invisible&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;\033[8m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="utilisation-1"&gt;&lt;a href="#utilisation-1" class="header-anchor"&gt;&lt;/a&gt;Utilisation
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo -e &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;gras&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;Hello&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;normal&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;flash&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;World&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;normal&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;-e&lt;/strong&gt; : enable interpretation of backslash escapes&lt;/p&gt;
&lt;/blockquote&gt;</description></item></channel></rss>