two/main/exploitation/services.html
2026-10-05 19:15:15 +00:00

616 lines
No EOL
30 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="fr" data-content_root="../" >
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Services systemd &#8212; Documentation two 0.1.0</title>
<script data-cfasync="false">
document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
document.documentElement.dataset.theme = localStorage.getItem("theme") || "";
</script>
<!--
this give us a css class that will be invisible only if js is disabled
-->
<noscript>
<style>
.pst-js-only { display: none !important; }
</style>
</noscript>
<!-- Loaded before other Sphinx assets -->
<link href="../_static/styles/theme.css?digest=8878045cc6db502f8baf" rel="stylesheet" />
<link href="../_static/styles/pydata-sphinx-theme.css?digest=8878045cc6db502f8baf" rel="stylesheet" />
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=8f2a1f02" />
<link rel="stylesheet" type="text/css" href="../_static/styles/sphinx-book-theme.css?v=3c74b3bc" />
<!-- So that users can add custom icons -->
<script src="../_static/scripts/fontawesome.js?digest=8878045cc6db502f8baf"></script>
<!-- Pre-loaded scripts that we'll load fully later -->
<link rel="preload" as="script" href="../_static/scripts/bootstrap.js?digest=8878045cc6db502f8baf" />
<link rel="preload" as="script" href="../_static/scripts/pydata-sphinx-theme.js?digest=8878045cc6db502f8baf" />
<script src="../_static/documentation_options.js?v=57395fb6"></script>
<script src="../_static/doctools.js?v=fd6eb6e6"></script>
<script src="../_static/sphinx_highlight.js?v=6ffebe34"></script>
<script src="../_static/scripts/sphinx-book-theme.js?v=fab101a9"></script>
<script src="../_static/translations.js?v=e6b791cb"></script>
<script>DOCUMENTATION_OPTIONS.pagename = 'exploitation/services';</script>
<script>
DOCUMENTATION_OPTIONS.theme_version = '0.16.1';
DOCUMENTATION_OPTIONS.theme_switcher_json_url = '../switcher.json';
DOCUMENTATION_OPTIONS.theme_switcher_version_match = 'main';
DOCUMENTATION_OPTIONS.show_version_warning_banner =
false;
</script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Recherche" href="../search.html" />
<link rel="next" title="API de l’agent" href="api-agent/index.html" />
<link rel="prev" title="Configuration" href="configuration.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="fr"/>
<meta name="docsearch:version" content="0.1" />
</head>
<body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
<div id="pst-skip-link" class="skip-link d-print-none"><a href="#main-content">Passer au contenu principal</a></div>
<div id="pst-scroll-pixel-helper"></div>
<button type="button" class="btn rounded-pill" id="pst-back-to-top">
<i class="fa-solid fa-arrow-up"></i>Haut de page</button>
<dialog id="pst-search-dialog">
<form class="bd-search d-flex align-items-center"
action="../search.html"
method="get">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="search"
class="form-control"
name="q"
placeholder="Search..."
aria-label="Search..."
autocomplete="off"
autocorrect="off"
autocapitalize="off"
spellcheck="false"/>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
</form>
</dialog>
<div class="pst-async-banner-revealer d-none">
<aside id="bd-header-version-warning" class="d-none d-print-none" aria-label="Alerte de version"></aside>
</div>
<header class="bd-header navbar navbar-expand-lg bd-navbar d-print-none">
</header>
<div class="bd-container">
<div class="bd-container__inner bd-page-width">
<dialog id="pst-primary-sidebar-modal"></dialog>
<div id="pst-primary-sidebar" class="bd-sidebar-primary bd-sidebar">
<div class="sidebar-header-items sidebar-primary__section">
</div>
<div class="sidebar-primary-items__start sidebar-primary__section">
<div class="sidebar-primary-item">
<a class="navbar-brand logo" href="../index.html">
<p class="title logo__title">Documentation two 0.1.0</p>
</a></div>
<div class="sidebar-primary-item"><ul class="navbar-icon-links"
aria-label="Icon Links">
<li class="nav-item">
<a href="https://git.g3e.fr/syonad/two" title="Dépôt" class="nav-link pst-navbar-icon" rel="noopener" target="_blank" data-bs-toggle="tooltip" data-bs-placement="bottom"><i class="fa-solid fa-code-branch fa-lg" aria-hidden="true"></i>
<span class="sr-only">Dépôt</span></a>
</li>
</ul></div>
<div class="sidebar-primary-item">
<div class="version-switcher__container dropdown pst-js-only">
<button id="pst-version-switcher-button-2"
type="button"
class="version-switcher__button btn btn-sm dropdown-toggle"
data-bs-toggle="dropdown"
aria-haspopup="listbox"
aria-controls="pst-version-switcher-list-2"
aria-label="Version switcher list"
>
Choose version <!-- this text may get changed later by javascript -->
<span class="caret"></span>
</button>
<div id="pst-version-switcher-list-2"
class="version-switcher__menu dropdown-menu list-group-flush py-0"
role="listbox" aria-labelledby="pst-version-switcher-button-2">
<!-- dropdown will be populated by javascript on page load -->
</div>
</div></div>
<div class="sidebar-primary-item">
<button class="btn search-button-field search-button__button pst-js-only" title="Recherche" aria-label="Recherche" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass"></i>
<span class="search-button__default-text">Recherche</span>
<span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
</button></div>
<div class="sidebar-primary-item"><nav class="bd-links bd-docs-nav" aria-label="Main">
<div class="bd-toc-item navbar-nav active">
<ul class="nav bd-sidenav bd-sidenav__home-link">
<li class="toctree-l1">
<a class="reference internal" href="../index.html">
two
</a>
</li>
</ul>
<p aria-level="2" class="caption" role="heading"><span class="caption-text">Mise en œuvre</span></p>
<ul class="nav bd-sidenav">
<li class="toctree-l1 has-children"><a class="reference internal" href="../demarrage/index.html">Démarrage</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
<li class="toctree-l2"><a class="reference internal" href="../demarrage/installation.html">Installation d’un hyperviseur</a></li>
<li class="toctree-l2"><a class="reference internal" href="../demarrage/premier-vpc.html">Premier VPC, premier subnet, première VM</a></li>
</ul>
</details></li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../deploiement/index.html">Déploiement d’un cluster</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
<li class="toctree-l2"><a class="reference internal" href="../deploiement/architecture-cluster.html">Architecture du cluster</a></li>
<li class="toctree-l2"><a class="reference internal" href="../deploiement/image-qcow2.html">Construction de l’image qcow2</a></li>
<li class="toctree-l2"><a class="reference internal" href="../deploiement/routeurs.html">Routeurs</a></li>
<li class="toctree-l2"><a class="reference internal" href="../deploiement/premier-hyperviseur.html">Premier hyperviseur</a></li>
<li class="toctree-l2"><a class="reference internal" href="../deploiement/route-reflector.html">VM route reflector</a></li>
</ul>
</details></li>
</ul>
<p aria-level="2" class="caption" role="heading"><span class="caption-text">Exploitation</span></p>
<ul class="current nav bd-sidenav">
<li class="toctree-l1 current active has-children"><a class="reference internal" href="index.html">Exploitation</a><details open="open"><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="configuration.html">Configuration</a></li>
<li class="toctree-l2 current active"><a class="current reference internal" href="#">Services systemd</a></li>
<li class="toctree-l2 has-children"><a class="reference internal" href="api-agent/index.html">API de l’agent</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
<li class="toctree-l3"><a class="reference internal" href="api-agent/asynchronisme.html">Modèle asynchrone et codes de retour</a></li>
<li class="toctree-l3"><a class="reference internal" href="api-agent/reference.html">Référence</a></li>
</ul>
</details></li>
<li class="toctree-l2"><a class="reference internal" href="observabilite.html">Observabilité</a></li>
<li class="toctree-l2"><a class="reference internal" href="diagnostic.html">Diagnostic</a></li>
</ul>
</details></li>
</ul>
<p aria-level="2" class="caption" role="heading"><span class="caption-text">Développement</span></p>
<ul class="nav bd-sidenav">
<li class="toctree-l1 has-children"><a class="reference internal" href="../developpement/index.html">Développement</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
<li class="toctree-l2"><a class="reference internal" href="../developpement/lab.html">Lab de test multi-nœud</a></li>
</ul>
</details></li>
</ul>
<p aria-level="2" class="caption" role="heading"><span class="caption-text">Interne</span></p>
<ul class="nav bd-sidenav">
<li class="toctree-l1 has-children"><a class="reference internal" href="../concepts/index.html">Concepts</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
<li class="toctree-l2"><a class="reference internal" href="../concepts/vpc-subnet-vm.html">VPC, subnet et VM</a></li>
<li class="toctree-l2"><a class="reference internal" href="../concepts/modes-reseau.html">Modes réseau</a></li>
<li class="toctree-l2"><a class="reference internal" href="../concepts/cycle-de-vie.html">Cycle de vie des ressources</a></li>
<li class="toctree-l2"><a class="reference internal" href="../concepts/metadata-cloud-init.html">Metadata et cloud-init</a></li>
</ul>
</details></li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../architecture/index.html">Architecture</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
<li class="toctree-l2"><a class="reference internal" href="../architecture/vue-densemble.html">Vue d’ensemble</a></li>
<li class="toctree-l2"><a class="reference internal" href="../architecture/stockage.html">Schéma des clés</a></li>
<li class="toctree-l2"><a class="reference internal" href="../architecture/contraintes.html">Invariants et pièges</a></li>
</ul>
</details></li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../versions/index.html">Versions</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
<li class="toctree-l2"><a class="reference internal" href="../versions/0.2.0.html">Bael</a></li>
<li class="toctree-l2"><a class="reference internal" href="../versions/0.1.0.html">Michael</a></li>
</ul>
</details></li>
</ul>
</div>
</nav></div>
</div>
<div class="sidebar-primary-items__end sidebar-primary__section">
<div class="sidebar-primary-item">
<div id="ethical-ad-placement"
class="flat"
data-ea-publisher="readthedocs"
data-ea-type="readthedocs-sidebar"
data-ea-manual="true">
</div></div>
</div>
</div>
<main id="main-content" class="bd-main" role="main">
<div class="sbt-scroll-pixel-helper"></div>
<div class="bd-content">
<div class="bd-article-container">
<div class="bd-header-article d-print-none">
<div class="header-article-items header-article__inner">
<div class="header-article-items__start">
<div class="header-article-item"><button class="sidebar-toggle primary-toggle btn btn-sm" title="Toggle primary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="fa-solid fa-bars"></span>
</button></div>
</div>
<div class="header-article-items__end">
<div class="header-article-item">
<div class="article-header-buttons">
<button onclick="toggleFullScreen()"
class="btn btn-sm btn-fullscreen-button pst-navbar-icon"
title="Mode plein écran"
data-bs-placement="bottom" data-bs-toggle="tooltip"
>
<span class="btn__icon-container">
<i class="fas fa-expand"></i>
</span>
</button>
<button class="btn btn-sm nav-link pst-navbar-icon theme-switch-button pst-js-only" aria-label="Thème" data-bs-title="Thème" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="theme-switch fa-solid fa-sun fa-lg" data-mode="light" title="Clair"></i>
<i class="theme-switch fa-solid fa-moon fa-lg" data-mode="dark" title="Sombre"></i>
<i class="theme-switch fa-solid fa-circle-half-stroke fa-lg" data-mode="auto" title="Paramètres système"></i>
</button>
<button class="btn btn-sm pst-navbar-icon search-button search-button__button pst-js-only" title="Recherche" aria-label="Recherche" data-bs-placement="bottom" data-bs-toggle="tooltip">
<i class="fa-solid fa-magnifying-glass fa-lg"></i>
</button>
<button class="sidebar-toggle secondary-toggle btn btn-sm pst-navbar-icon" title="Toggle secondary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
<span class="fa-solid fa-list"></span>
</button>
</div></div>
</div>
</div>
</div>
<div id="jb-print-docs-body" class="onlyprint">
<h1>Services systemd</h1>
<!-- Table of contents -->
<div id="print-main-content">
<div id="jb-print-toc">
<div>
<h2> Contenu </h2>
</div>
<nav aria-label="Page">
<ul class="visible nav section-nav flex-column">
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#dnsmasq">dnsmasq</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#serveur-dhcp-integre">Serveur DHCP intégré</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#qemu-n-est-pas-une-unit">QEMU n’est pas une unit</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#sockets-par-vm">Sockets par VM</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arret-de-l-agent">Arrêt de l’agent</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#mise-a-jour">Mise à jour</a></li>
</ul>
</nav>
</div>
</div>
</div>
<div id="searchbox"></div>
<article class="bd-article">
<section id="services-systemd">
<h1>Services systemd<a class="headerlink" href="#services-systemd" title="Lien vers cette rubrique">#</a></h1>
<p>Quatre units, installées sous <code class="docutils literal notranslate"><span class="pre">/opt/two/bin</span></code> par <code class="docutils literal notranslate"><span class="pre">deploy.sh</span></code>. Les deux units DHCP
s’excluent : celle qui tourne dépend de <code class="docutils literal notranslate"><span class="pre">dhcp.backend</span></code> (voir <a class="reference internal" href="configuration.html"><span class="doc">Configuration</span></a>).</p>
<div class="pst-scrollable-table-container"><table class="table">
<colgroup>
<col style="width: 28.0%" />
<col style="width: 32.0%" />
<col style="width: 40.0%" />
</colgroup>
<thead>
<tr class="row-odd"><th class="head"><p>Unit</p></th>
<th class="head"><p>Instance <code class="docutils literal notranslate"><span class="pre">%i</span></code></p></th>
<th class="head"><p>Rôle</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">agent.service</span></code></p></td>
<td><p>—</p></td>
<td><p>processus principal : API, dispatcher, exécution, watchdog</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">dnsmasq&#64;.service</span></code></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">&lt;netns&gt;_&lt;bridge&gt;</span></code></p></td>
<td><p>dnsmasq lancé dans le netns du VPC, un par subnet — backend <code class="docutils literal notranslate"><span class="pre">dnsmasq</span></code></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">dhcp&#64;.service</span></code></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">&lt;netns&gt;_&lt;bridge&gt;</span></code></p></td>
<td><p>serveur DHCP intégré, un par subnet — backend <code class="docutils literal notranslate"><span class="pre">two</span></code></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">metadata&#64;.service</span></code></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">&lt;nom</span> <span class="pre">de</span> <span class="pre">la</span> <span class="pre">VM&gt;</span></code></p></td>
<td><p>serveur de metadata cloud-init, un par VM</p></td>
</tr>
</tbody>
</table>
</div>
<p>Les instances sont créées et pilotées par l’agent au fil des créations de subnets et de VM : il
n’y a pas à les démarrer à la main en fonctionnement normal.</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>systemctl<span class="w"> </span>status<span class="w"> </span>agent
systemctl<span class="w"> </span>status<span class="w"> </span><span class="s1">'dnsmasq@vp-admin_br-sn000001'</span><span class="w"> </span><span class="c1"># backend dnsmasq</span>
systemctl<span class="w"> </span>status<span class="w"> </span><span class="s1">'dhcp@vp-admin_br-sn000001'</span><span class="w"> </span><span class="c1"># backend two</span>
systemctl<span class="w"> </span>status<span class="w"> </span><span class="s1">'metadata@i-web'</span>
</pre></div>
</div>
<section id="dnsmasq">
<h2>dnsmasq<a class="headerlink" href="#dnsmasq" title="Lien vers cette rubrique">#</a></h2>
<p>Backend historique. Le script <code class="docutils literal notranslate"><span class="pre">run-dnsmasq-in-netns.sh</span></code> entre dans le netns puis exécute dnsmasq
avec un fichier de configuration par subnet, généré par l’agent :</p>
<div class="pst-scrollable-table-container"><table class="table">
<colgroup>
<col style="width: 40.0%" />
<col style="width: 60.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td><p>Configuration</p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">/etc/dnsmasq.d/&lt;netns&gt;_&lt;bridge&gt;.conf</span></code></p></td>
</tr>
<tr class="row-even"><td><p>Baux</p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">/run/dnsmasq-&lt;netns&gt;_&lt;bridge&gt;.leases</span></code></p></td>
</tr>
<tr class="row-odd"><td><p>Journal</p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">/var/log/dnsmasq-&lt;netns&gt;_&lt;bridge&gt;.log</span></code></p></td>
</tr>
<tr class="row-even"><td><p>PID</p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">/run/dnsmasq-&lt;netns&gt;_&lt;bridge&gt;.pid</span></code></p></td>
</tr>
</tbody>
</table>
</div>
<p>Le fichier de baux et le journal sont les deux premiers endroits à regarder quand une VM n’obtient
pas d’adresse.</p>
</section>
<section id="serveur-dhcp-integre">
<h2>Serveur DHCP intégré<a class="headerlink" href="#serveur-dhcp-integre" title="Lien vers cette rubrique">#</a></h2>
<p>Backend <code class="docutils literal notranslate"><span class="pre">two</span></code>. Le script <code class="docutils literal notranslate"><span class="pre">run-dhcp-in-netns.sh</span></code> entre dans le netns puis exécute le binaire
<code class="docutils literal notranslate"><span class="pre">dhcp</span></code>, à qui il passe le bridge à servir et ses deux chemins de fichiers — il ne déduit rien et
ignore le netns dans lequel il tourne :</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>/opt/two/bin/dhcp<span class="w"> </span>-conf<span class="w"> </span>/etc/two/agent.yml<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>-interface<span class="w"> </span>br-sn000001<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>-state<span class="w"> </span>/run/two/dhcp/vp-admin_br-sn000001.state<span class="w"> </span><span class="se">\</span>
<span class="w"> </span>-socket<span class="w"> </span>/run/two/dhcp/vp-admin_br-sn000001.sock
</pre></div>
</div>
<div class="pst-scrollable-table-container"><table class="table">
<colgroup>
<col style="width: 40.0%" />
<col style="width: 60.0%" />
</colgroup>
<tbody>
<tr class="row-odd"><td><p>Socket de contrôle</p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">/run/two/dhcp/&lt;netns&gt;_&lt;bridge&gt;.sock</span></code></p></td>
</tr>
<tr class="row-even"><td><p>État</p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">/run/two/dhcp/&lt;netns&gt;_&lt;bridge&gt;.state</span></code></p></td>
</tr>
<tr class="row-odd"><td><p>Journal</p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">journalctl</span> <span class="pre">-u</span> <span class="pre">'dhcp&#64;&lt;netns&gt;_&lt;bridge&gt;'</span></code></p></td>
</tr>
</tbody>
</table>
</div>
<p>Il n’y a <strong>ni fichier de configuration ni fichier de baux</strong>. L’agent pousse l’état désiré sur la
socket de contrôle : la configuration du subnet à sa création, une réservation par interface à
chaque création ou suppression de VM. Les réservations sont statiques — une MAC inconnue n’obtient
rien, et le serveur reste silencieux plutôt que de répondre par un refus.</p>
<p>Le fichier d’état <strong>appartient au processus</strong>, qui l’écrit et le relit à son démarrage. L’agent ne
l’écrit jamais ; il le supprime seulement, à la création du subnet pour écarter un résidu et à sa
suppression après avoir arrêté l’unit. Il vit dans <code class="docutils literal notranslate"><span class="pre">/run</span></code> parce qu’il n’a aucun sens sans le
netns, qui ne survit pas au redémarrage de l’host.</p>
<p>Diagnostic : voir <a class="reference internal" href="diagnostic.html"><span class="doc">Diagnostic</span></a>, qui montre comment interroger la socket.</p>
</section>
<section id="qemu-n-est-pas-une-unit">
<h2>QEMU n’est pas une unit<a class="headerlink" href="#qemu-n-est-pas-une-unit" title="Lien vers cette rubrique">#</a></h2>
<p>Les processus QEMU sont lancés par <code class="docutils literal notranslate"><span class="pre">systemd-run</span> <span class="pre">--scope</span></code>, <strong>jamais</strong> en unit transitoire. Un
scope est exécuté par le processus appelant et hérite donc du network namespace posé par
l’agent ; une unit transitoire, forkée par PID 1, démarrerait dans le netns racine et ne verrait
pas le tap de la VM.</p>
<p>Conséquence pratique : les VM n’apparaissent pas dans <code class="docutils literal notranslate"><span class="pre">systemctl</span> <span class="pre">list-units</span></code> mais dans
<code class="docutils literal notranslate"><span class="pre">systemd-cgls</span></code>, et elles ne survivent pas à un <code class="docutils literal notranslate"><span class="pre">systemctl</span> <span class="pre">stop</span> <span class="pre">agent</span></code> suivi d’un
redémarrage — l’agent ne réattache pas les VM existantes.</p>
</section>
<section id="sockets-par-vm">
<h2>Sockets par VM<a class="headerlink" href="#sockets-par-vm" title="Lien vers cette rubrique">#</a></h2>
<div class="highlight-text notranslate"><div class="highlight"><pre><span></span>/run/two/vms/serial/&lt;vm&gt;.sock console série
/run/two/vms/monitor/&lt;vm&gt;.sock monitor QEMU
/run/two/vms/qmp/&lt;vm&gt;.sock QMP (utilisé par l'agent)
</pre></div>
</div>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>socat<span class="w"> </span>-,raw,echo<span class="o">=</span><span class="m">0</span><span class="w"> </span>UNIX-CONNECT:/run/two/vms/serial/i-web.sock
</pre></div>
</div>
</section>
<section id="arret-de-l-agent">
<h2>Arrêt de l’agent<a class="headerlink" href="#arret-de-l-agent" title="Lien vers cette rubrique">#</a></h2>
<p>L’ordre d’arrêt est imposé : serveurs HTTP, puis drainage des workers, puis fermeture de la base.
Si le budget d’arrêt est dépassé, la base <strong>n’est pas fermée</strong> — fermer Badger sous un écrivain
concurrent est pire qu’un rejeu du journal au démarrage suivant. Un message à ce sujet dans le
journal au moment d’un <code class="docutils literal notranslate"><span class="pre">stop</span></code> n’est donc pas une anomalie.</p>
</section>
<section id="mise-a-jour">
<h2>Mise à jour<a class="headerlink" href="#mise-a-jour" title="Lien vers cette rubrique">#</a></h2>
<p><code class="docutils literal notranslate"><span class="pre">deploy.sh</span></code> relève les instances <code class="docutils literal notranslate"><span class="pre">dnsmasq&#64;</span></code>, <code class="docutils literal notranslate"><span class="pre">dhcp&#64;</span></code> et <code class="docutils literal notranslate"><span class="pre">metadata&#64;</span></code> actives <strong>avant</strong> d’arrêter les
services, et les redémarre ensuite : c’est la seule façon de savoir lesquelles relancer. Arrêter
les services à la main avant de lancer le script fait perdre cette liste.</p>
</section>
</section>
</article>
<footer class="prev-next-footer d-print-none">
<div class="prev-next-area">
<a class="left-prev"
href="configuration.html"
title="page précédente">
<i class="fa-solid fa-angle-left"></i>
<div class="prev-next-info">
<p class="prev-next-subtitle">précédent</p>
<p class="prev-next-title">Configuration</p>
</div>
</a>
<a class="right-next"
href="api-agent/index.html"
title="page suivante">
<div class="prev-next-info">
<p class="prev-next-subtitle">suivant</p>
<p class="prev-next-title">API de l’agent</p>
</div>
<i class="fa-solid fa-angle-right"></i>
</a>
</div>
</footer>
</div>
<dialog id="pst-secondary-sidebar-modal"></dialog>
<div id="pst-secondary-sidebar" class="bd-sidebar-secondary bd-toc"><div class="sidebar-secondary-items sidebar-secondary__inner">
<div class="sidebar-secondary-item"><div
id="pst-page-navigation-heading-2"
class="page-toc tocsection onthispage">
<i class="fa-solid fa-list"></i> Contenu
</div>
<nav id="pst-page-toc-nav" class="page-toc" aria-labelledby="pst-page-navigation-heading-2">
<ul class="visible nav section-nav flex-column">
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#dnsmasq">dnsmasq</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#serveur-dhcp-integre">Serveur DHCP intégré</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#qemu-n-est-pas-une-unit">QEMU n’est pas une unit</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#sockets-par-vm">Sockets par VM</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#arret-de-l-agent">Arrêt de l’agent</a></li>
<li class="toc-h2 nav-item toc-entry"><a class="reference internal nav-link" href="#mise-a-jour">Mise à jour</a></li>
</ul>
</nav></div>
</div></div>
</div>
<footer class="bd-footer-content">
<div class="bd-footer-content__inner container">
<div class="footer-item">
<p class="component-author">
Par Nicolas Boufidjeline
</p>
</div>
<div class="footer-item">
<p class="copyright">
© Copyright 2026, Nicolas Boufidjeline.
<br/>
</p>
</div>
<div class="footer-item">
</div>
<div class="footer-item">
</div>
</div>
</footer>
</main>
</div>
</div>
<!-- Scripts loaded after <body> so the DOM is not blocked -->
<script defer src="../_static/scripts/bootstrap.js?digest=8878045cc6db502f8baf"></script>
<script defer src="../_static/scripts/pydata-sphinx-theme.js?digest=8878045cc6db502f8baf"></script>
<footer class="bd-footer">
</footer>
</body>
</html>