{"id":8126,"date":"2026-11-10T06:00:00","date_gmt":"2026-11-10T05:00:00","guid":{"rendered":"https:\/\/www.blaess.fr\/christophe\/?p=8126"},"modified":"2026-11-08T01:54:27","modified_gmt":"2026-11-08T00:54:27","slug":"les-mises-a-jour-du-systeme-eris-linux","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2026\/11\/10\/les-mises-a-jour-du-systeme-eris-linux\/","title":{"rendered":"Les mises \u00e0 jour du syst\u00e8me Eris Linux"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"alignright size-full is-resized\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/thumbnail-08-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"736\" height=\"405\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/thumbnail-08-1.png\" alt=\"\" class=\"wp-image-8187\" style=\"width:350px;height:auto\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/thumbnail-08-1.png 736w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/thumbnail-08-1-300x165.png 300w\" sizes=\"auto, (max-width: 736px) 100vw, 736px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>Eris Linux<\/strong> offre un socle logiciel maintenu et ma\u00eetris\u00e9 sur lequel les applications m\u00e9tiers peuvent \u00eatre ex\u00e9cut\u00e9es en toute s\u00e9curit\u00e9 dans des containers. <strong>La mise \u00e0 jour<\/strong> r\u00e9guli\u00e8re du socle syst\u00e8me est r\u00e9alis\u00e9e par nos soins, au gr\u00e9 des correctifs int\u00e9gr\u00e9s dans les recettes de <em>Yocto Project<\/em> et des n\u00e9cessit\u00e9s li\u00e9es \u00e0 la d\u00e9couverte de vuln\u00e9rabilit\u00e9s comme nous l&rsquo;avons \u00e9voqu\u00e9 dans les pr\u00e9c\u00e9dents articles.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nous allons <strong>mettre \u00e0 l&rsquo;\u00e9preuve<\/strong> le syst\u00e8me de mise de jour d&rsquo;Eris Linux, en v\u00e9rifiant sa robustesse dans des circonstances difficiles volontairement provoqu\u00e9es.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h1 class=\"wp-block-heading\">Installation initiale<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Je commence par installer Eris Linux sur un Raspberry Pi 4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour cela, je me rends sur <code>www.eris-linux.net<\/code>, je me connecte, et dans l&rsquo;onglet <em>My devices<\/em> je clique sur le bouton <em>New device<\/em>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-01.png\"><img loading=\"lazy\" decoding=\"async\" width=\"639\" height=\"533\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-01.png\" alt=\"\" class=\"wp-image-8134\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-01.png 639w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-01-300x250.png 300w\" sizes=\"auto, (max-width: 639px) 100vw, 639px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 1 &#8211; Choix d&rsquo;une image \u00e0 installer<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Dans la liste qui appara\u00eet, je choisis une image <em>Graphical<\/em> pour Raspberry Pi 4. Je pr\u00e9cise que la carte pourra acc\u00e9der \u00e0 Internet par son port Ethernet avec une adresse fournie par DHCP. Au bout de quelques minutes, je re\u00e7ois un mail m&rsquo;indiquant que l&rsquo;image est pr\u00eate.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-02.png\"><img loading=\"lazy\" decoding=\"async\" width=\"671\" height=\"472\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-02.png\" alt=\"\" class=\"wp-image-8135\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-02.png 671w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-02-300x211.png 300w\" sizes=\"auto, (max-width: 671px) 100vw, 671px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 2 &#8211; Image pr\u00eate \u00e0 installer.<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Je r\u00e9cup\u00e8re le fichier au format <code>.img.bz2<\/code> , je le d\u00e9compresse, et je l&rsquo;installe sur la <strong>carte SD<\/strong> branch\u00e9e sur mon PC. Personnellement j&rsquo;utilise <code>cp<\/code> pour cela mais on peut tr\u00e8s bien pr\u00e9f\u00e9rer <code>dd<\/code> ou un utilitaire comme <em>Etcher<\/em> par exemple.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>bunzip2  eris-linux_Raspberry-Pi-4_1.1.0-dev-*.img.bz2<\/strong>\n$ <strong>lsblk<\/strong>\n  &#91;...]\nsdc          8:32   1  14.4G  0 disk\n$ <strong>sudo  umount  \/dev\/sdc?<\/strong>\n$ <strong>sudo  cp  eris-linux_Raspberry-Pi-4_1.1.0-dev-*.img  \/dev\/sdc<\/strong><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">(Remplacez <code>sdc<\/code> par le nom de p\u00e9riph\u00e9rique correspondant \u00e0 votre carte SD tel qu&rsquo;indiqu\u00e9 par <code>lsblk<\/code>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je branche mon Raspberry Pi, et au bout de quelques minutes (le temps de formater et chiffrer la partition de donn\u00e9es) je le vois appara\u00eetre sur le <em>Device Manager<\/em>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-03.png\"><img loading=\"lazy\" decoding=\"async\" width=\"341\" height=\"195\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-03.png\" alt=\"\" class=\"wp-image-8136\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-03.png 341w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-03-300x172.png 300w\" sizes=\"auto, (max-width: 341px) 100vw, 341px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 3 &#8211; Premi\u00e8re apparition du <em>device<\/em><\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Je renomme la carte <em><strong>Update-Test<\/strong><\/em>. Dans cette nouvelle version, elle contacte le serveur toutes les minutes, les mises \u00e0 jour du socle syst\u00e8me sont automatiques et le red\u00e9marrage apr\u00e8s mise \u00e0 jour a \u00e9galement lieu automatiquement. Bien entendu ces param\u00e8tres sont configurables en fonction de vos besoins fonctionnels.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">J&rsquo;ai install\u00e9 un <strong>container de d\u00e9monstration<\/strong> dans le premier emplacement, ce qui me permet de v\u00e9rifier sur l&rsquo;\u00e9cran HDMI connect\u00e9 \u00e0 la carte si le d\u00e9marrage des containers est correct. Comme on le voit sur la figure 4, la version du socle logiciel install\u00e9 est <code><strong>1.1.0-dev-0<\/strong><\/code> (les versions suffix\u00e9es <code>-dev-x<\/code> sont produites par une branche de d\u00e9veloppement utilis\u00e9e en interne uniquement).<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-04-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"686\" height=\"106\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-04-1.png\" alt=\"\" class=\"wp-image-8148\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-04-1.png 686w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-04-1-300x46.png 300w\" sizes=\"auto, (max-width: 686px) 100vw, 686px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 4 &#8211; Version 1.1.0-dev-0<\/figcaption><\/figure>\n<\/div>\n\n\n<h1 class=\"wp-block-heading\">Premi\u00e8res mises \u00e0 jour<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Je pr\u00e9pare sur le serveur Eris-Linux une mise \u00e0 jour <code><strong>1.1.0-dev-1<\/strong><\/code> identique \u00e0 la version pr\u00e9c\u00e9dente. Au bout de quelques instants le Raspberry Pi se met \u00e0 jour. Sur le tableau de bord du <em>Device Manager<\/em>, le champ \u00ab\u00a0<em>System status<\/em>\u00a0\u00bb passe par \u00ab\u00a0<em>Update in progress<\/em>\u00a0\u00bb , \u00ab\u00a0<em>Update Ok<\/em>\u00a0\u00bb puis \u00ab\u00a0<em>Restarting<\/em>\u00a0\u00bb et enfin \u00ab\u00a0<em>System Ok<\/em>\u00a0\u00bb avec le nouveau num\u00e9ro de version.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-05-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"676\" height=\"106\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-05-1.png\" alt=\"\" class=\"wp-image-8151\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-05-1.png 676w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-05-1-300x47.png 300w\" sizes=\"auto, (max-width: 676px) 100vw, 676px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 5 &#8211; Version 1.1.0-dev-1<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Nous utilisons un syst\u00e8me de mise \u00e0 jour de type <strong>A\/B am\u00e9lior\u00e9<\/strong> (s&rsquo;appuyant sur deux partitions en alternance et un <em>initramfs<\/em> de secours). Une nouvelle version n\u2019\u00e9crase donc jamais directement le syst\u00e8me actuellement valid\u00e9. Elle est install\u00e9e sur la partition inactive puis essay\u00e9e au red\u00e9marrage. Elle ne devient la version confirm\u00e9e que lorsque le d\u00e9marrage a \u00e9t\u00e9 valid\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je r\u00e9it\u00e8re donc l&rsquo;op\u00e9ration <strong>deux fois<\/strong> pour \u00eatre s\u00fbr de passer par toutes les transitions de partition en fonctionnement nominal, en m&rsquo;affranchissant de l&rsquo;image initialement install\u00e9e.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-06-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"676\" height=\"106\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-06-1.png\" alt=\"\" class=\"wp-image-8153\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-06-1.png 676w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-06-1-300x47.png 300w\" sizes=\"auto, (max-width: 676px) 100vw, 676px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 6 &#8211; Version 1.1.0-dev-2<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-07-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"676\" height=\"106\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-07-1.png\" alt=\"\" class=\"wp-image-8155\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-07-1.png 676w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-07-1-300x47.png 300w\" sizes=\"auto, (max-width: 676px) 100vw, 676px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 7 &#8211; Version 1.1.0-dev-3<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Nous voyons que <strong>le syst\u00e8me de mise \u00e0 jour fonctionne bien<\/strong> lorsqu&rsquo;aucun grain de sable ne vient gripper ses rouages. Nous allons pourtant lui jeter quelques poign\u00e9es de sable dans les op\u00e9rations \u00e0 venir&nbsp;!<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u00c9chec de mise \u00e0 jour et <em>rollback<\/em><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Pour l&rsquo;\u00e9tape suivante je veux <strong>forcer l&rsquo;\u00e9chec de d\u00e9marrage<\/strong> d&rsquo;une image suite \u00e0 une mise \u00e0 jour. Ce cas peut malheureusement arriver en situation r\u00e9elle. Imaginons par exemple que l&rsquo;on a envoy\u00e9 par erreur une mise \u00e0 jour consid\u00e9rant que l&rsquo;\u00e9quipement doit obligatoirement avoir un contr\u00f4leur d&rsquo;\u00e9cran HDMI en oubliant que certaines cartes plus anciennes n&rsquo;ont qu&rsquo;un contr\u00f4leur graphique LVDS.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je vais simuler cette erreur en for\u00e7ant l&rsquo;\u00e9chec du programme qui est appel\u00e9 en fin de d\u00e9marrage normal pour v\u00e9rifier que tout le socle logiciel s&rsquo;est initialis\u00e9 correctement (ind\u00e9pendamment des <em>containers<\/em> qui peuvent \u00e9chouer pour des raisons applicatives).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">J&rsquo;ai ajout\u00e9 temporairement une boucle infinie vide dans le programme de v\u00e9rification du d\u00e9marrage correct. La version <code><strong>1.1.0-dev-4<\/strong><\/code> ne pourra donc pas d\u00e9marrer compl\u00e8tement.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je vois passer l&rsquo;installation de la nouvelle version&nbsp;:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-08.png\"><img loading=\"lazy\" decoding=\"async\" width=\"676\" height=\"106\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-08.png\" alt=\"\" class=\"wp-image-8157\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-08.png 676w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-08-300x47.png 300w\" sizes=\"auto, (max-width: 676px) 100vw, 676px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 8 &#8211; Installation de la version 1.1.0-dev-4<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Puis le red\u00e9marrage de la carte&nbsp;:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-09.png\"><img loading=\"lazy\" decoding=\"async\" width=\"676\" height=\"106\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-09.png\" alt=\"\" class=\"wp-image-8159\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-09.png 676w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-09-300x47.png 300w\" sizes=\"auto, (max-width: 676px) 100vw, 676px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 9 &#8211; D\u00e9marrage de la version 1.1.0-dev-4<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Sur l&rsquo;\u00e9cran HDMI du Raspberry Pi, je vois bien que <strong>le boot d\u00e9marre<\/strong> sur la version <code>1.1.0-dev-4<\/code>, mais au bout de quelques minutes le syst\u00e8me, <strong>incapable de terminer son initialisation correctement, red\u00e9marre<\/strong>. La photo de l&rsquo;\u00e9cran est de pi\u00e8tre qualit\u00e9.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-10.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"580\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-10.jpg\" alt=\"\" class=\"wp-image-8163\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-10.jpg 1024w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-10-300x170.jpg 300w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-10-768x435.jpg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 10 &#8211; \u00c9cran de d\u00e9marrage de la version 1.1.0-dev-4<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Au bout de trois tentatives, le syst\u00e8me de mise \u00e0 jour <strong>abandonne et revient sur la version pr\u00e9c\u00e9dente<\/strong>. C&rsquo;est ce qu&rsquo;on appelle un <em><strong>rollback<\/strong><\/em>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-11.png\"><img loading=\"lazy\" decoding=\"async\" width=\"676\" height=\"106\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-11.png\" alt=\"\" class=\"wp-image-8161\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-11.png 676w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-11-300x47.png 300w\" sizes=\"auto, (max-width: 676px) 100vw, 676px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 11 &#8211; Retour sur la version 1.1.0-dev-3<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">On notera le message \u00ab\u00a0<em>Update rejected<\/em>\u00a0\u00bb dans le champ \u00ab\u00a0<em>System Status<\/em>\u00a0\u00bb . En effet, le <em>device<\/em> n&rsquo;acceptera plus la version <code>1.1.0-dev-4<\/code> m\u00eame si le <em>Device Manager<\/em> lui propose \u00e0 nouveau. C&rsquo;est uniquement cette version qui est bloqu\u00e9e, les suivantes seront accept\u00e9es et install\u00e9es.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">J&rsquo;envoie \u00e0 pr\u00e9sent une nouvelle version <code><strong>1.1.0-dev-5<\/strong><\/code> correcte. La mise \u00e0 jour et le red\u00e9marrage se font normalement.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-12.png\"><img loading=\"lazy\" decoding=\"async\" width=\"676\" height=\"106\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-12.png\" alt=\"\" class=\"wp-image-8164\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-12.png 676w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-12-300x47.png 300w\" sizes=\"auto, (max-width: 676px) 100vw, 676px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 12 &#8211; Version 1.1.0-dev-5<\/figcaption><\/figure>\n<\/div>\n\n\n<h1 class=\"wp-block-heading\">Partition de donn\u00e9es d\u00e9grad\u00e9e et restaur\u00e9e<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Le syst\u00e8me ayant besoin de stocker des donn\u00e9es applicatives de des param\u00e8tres de configuration, une partition est accessible en \u00e9criture. Dans le cas o\u00f9 une <strong>coupure d&rsquo;alimentation \u00e9lectrique<\/strong> se produit au mauvais moment, on peut imaginer que cette partition souffre d&rsquo;incoh\u00e9rences au re-d\u00e9marrage.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le choix qui est fait dans Eris Linux est de <strong>privil\u00e9gier le fonctionnement applicatif<\/strong>, et de pouvoir red\u00e9marrer le syst\u00e8me quitte \u00e0 perdre des donn\u00e9es pr\u00e9c\u00e9demment enregistr\u00e9es. Si le besoin s&rsquo;en fait sentir, n&rsquo;h\u00e9sitez pas \u00e0 nous contacter pour obtenir le fonctionnement inverse&nbsp;: privil\u00e9gier la sauvegarde des donn\u00e9es (syst\u00e8me d&rsquo;enregistrement \u00e0 la mani\u00e8re des bo\u00eetes noires par exemple) m\u00eame si la fonctionnalit\u00e9 applicative est interrompue.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je ne vais pas essayer de reproduire une corruption al\u00e9atoire provoqu\u00e9e par une coupure \u00e9lectrique inopin\u00e9e, mais je vais \u00eatre nettement plus brutal en <strong>d\u00e9truisant volontairement les 256 premiers Mo de la partition<\/strong> de donn\u00e9es. Je vais prendre la carte SD du Raspberry Pi, l&rsquo;ins\u00e9rer sur un PC et <strong>\u00e9craser le d\u00e9but de cette partition<\/strong> avec des z\u00e9ros.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>lsblk<\/strong>\n  &#91;...]\nsdc           8:32   1  14.4G  0 disk \n\u251c\u2500sdc1        8:33   1 166.4M  0 part \/run\/media\/cpb\/boot\n\u251c\u2500sdc2        8:34   1 738.9M  0 part \n\u251c\u2500sdc3        8:35   1 739.4M  0 part \n\u2514\u2500sdc4        8:36   1  12.8G  0 part \n  &#91;...]\n$<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La partition de donn\u00e9es est la quatri\u00e8me, elle a \u00e9t\u00e9 \u00e9tendue pour remplir tout l&rsquo;espace disponible sur la m\u00e9moire <em>flash<\/em>. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Attention&nbsp;:<\/strong> les commandes <code>dd<\/code> qui suivent d\u00e9truisent volontairement des donn\u00e9es. Ne les reproduisez que sur un support de test dont vous avez v\u00e9rifi\u00e9 le nom de p\u00e9riph\u00e9rique. Une erreur sur <code>\/dev\/sdX<\/code> peut d\u00e9truire imm\u00e9diatement les donn\u00e9es d\u2019un autre disque.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>sudo  dd  if=\/dev\/zero  of=\/dev\/sdc4  bs=1M  count=256<\/strong>\n256+0 records in\n256+0 records out\n268435456 bytes (268 MB, 256 MiB) copied, 0.368766 s, 729 MB\/s\n$<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nous venons d&rsquo;\u00e9craser les 256 premiers Mo de la partition de donn\u00e9es.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je red\u00e9marre le syst\u00e8me. Au bout de quelques minutes, le <em>Device Manager<\/em> m&rsquo;indique qu&rsquo;il a bien retrouv\u00e9 notre \u00e9quipement. Le temps de red\u00e9marrage est comparable au premier <em>boot<\/em> du syst\u00e8me, il faut le temps de formater et chiffrer la partition de donn\u00e9es.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-13.png\"><img loading=\"lazy\" decoding=\"async\" width=\"676\" height=\"106\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-13.png\" alt=\"\" class=\"wp-image-8168\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-13.png 676w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-13-300x47.png 300w\" sizes=\"auto, (max-width: 676px) 100vw, 676px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 13 &#8211; Version 1.1.0-dev-5 r\u00e9par\u00e9e<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Soyons clair, cette r\u00e9cup\u00e9ration a n\u00e9cessit\u00e9 de r\u00e9initialiser enti\u00e8rement la partition en <strong>perdant les donn\u00e9es pr\u00e9c\u00e9demment \u00e9crites<\/strong> tout en restaurant les donn\u00e9es de fonctionnement permettant l&rsquo;identification de l&rsquo;\u00e9quipement par le <em>Device Manager<\/em>. Ceci \u00e9vite d&rsquo;avoir un <em>device<\/em> \u00ab\u00a0briqu\u00e9\u00a0\u00bb (incapable de red\u00e9marrer du point de vue de l&rsquo;utilisateur) n\u00e9cessitant un retour en r\u00e9paration.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Comme je l&rsquo;ai dit plus t\u00f4t, nous pouvons vous proposer sur demande des versions alternatives, o\u00f9 les donn\u00e9es restantes sont conserv\u00e9es et l&rsquo;\u00e9quipement se met en d\u00e9faut, impliquant un retour en maintenance pour le restaurer en r\u00e9cup\u00e9rant, au moins partiellement, les donn\u00e9es restantes.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Environnement de U-boot<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Nous utilisons le <em>bootloader<\/em> <strong>U-boot<\/strong> pour charger le noyau Linux. La configuration de U-boot s&rsquo;appuie sur des variables d&rsquo;environnement dans lesquelles nous venons enregistrer des donn\u00e9es (num\u00e9ro de partition en cours d&rsquo;utilisation, partition candidate pour l&rsquo;installation d&rsquo;une nouvelle image, version bloqu\u00e9e par une mise \u00e0 jour \u00e9chou\u00e9e, etc.)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nous devons donc pouvoir r\u00e9-\u00e9crire l&rsquo;<strong>environnement de U-boot.<\/strong> Il s&rsquo;agit de deux zones redondantes se trouvant la m\u00e9moire <em>flash<\/em> de la carte, hors des partitions utilis\u00e9es par le syst\u00e8me. Lorsqu&rsquo;on extrait la carte SD pour l&rsquo;analyser sur un PC, on peut voir les deux copies de l&rsquo;environnement aux offsets <code>0x100000<\/code> et <code>0x200000<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>sudo hexdump -C -s 0x100000 -n 0x4000 \/dev\/sdc<\/strong>\n00100000  5e fd f7 7d 03 5f 62 6f  6f 74 5f 6f 6e 3d 30 00  |^..}._boot_on=0.|\n00100010  5f 69 6e 69 74 72 61 6d  66 73 3d 30 00 5f 69 6e  |_initramfs=0._in|\n00100020  69 74 72 61 6d 66 73 5f  73 69 7a 65 3d 30 00 5f  |itramfs_size=0._|\n00100030  76 61 6c 75 65 3d 30 00  61 72 63 68 3d 61 72 6d  |value=0.arch=arm|\n00100040  00 62 61 75 64 72 61 74  65 3d 31 31 35 32 30 30  |.baudrate=115200|\n00100050  00 62 6f 61 72 64 3d 72  70 69 00 62 6f 61 72 64  |.board=rpi.board|\n00100060  5f 6e 61 6d 65 3d 34 20  4d 6f 64 65 6c 20 42 00  |_name=4 Model B.|\n  &#91;...]\n\n$ <strong>sudo hexdump -C -s 0x200000 -n 0x4000 \/dev\/sdc<\/strong>\n00200000  0b 24 78 3d 04 5f 62 6f  6f 74 5f 6f 6e 3d 30 00  |.$x=._boot_on=0.|\n00200010  5f 69 6e 69 74 72 61 6d  66 73 3d 30 00 5f 69 6e  |_initramfs=0._in|\n00200020  69 74 72 61 6d 66 73 5f  73 69 7a 65 3d 30 00 5f  |itramfs_size=0._|\n00200030  76 61 6c 75 65 3d 30 00  61 72 63 68 3d 61 72 6d  |value=0.arch=arm|\n00200040  00 62 61 75 64 72 61 74  65 3d 31 31 35 32 30 30  |.baudrate=115200|\n00200050  00 62 6f 61 72 64 3d 72  70 69 00 62 6f 61 72 64  |.board=rpi.board|\n00200060  5f 6e 61 6d 65 3d 34 20  4d 6f 64 65 6c 20 42 00  |_name=4 Model B.|\n  &#91;...]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Avec une pointe de cruaut\u00e9, j&rsquo;\u00e9crase les 4 premiers kilo-octets du premier environnement (ce qui suffit \u00e0 d\u00e9truire son en-t\u00eate et sa somme de contr\u00f4le), le rendant inutilisable. Je v\u00e9rifie que la zone soit bien remplie de z\u00e9ros.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>sudo dd if=\/dev\/zero of=\/dev\/sdc bs=4k seek=$((0x100)) count=1<\/strong>\n\n$ <strong>sudo hexdump -C -s 0x100000 -n 0x4000 \/dev\/sdc<\/strong>\n00100000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|\n*\n00104000<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Apr\u00e8s r\u00e9insertion de la carte SD, je peux v\u00e9rifier que U-boot a bien d\u00e9tect\u00e9 que cet environnement est invalide et a choisi d&rsquo;utiliser la copie au second <em>offset<\/em>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-14.png\"><img loading=\"lazy\" decoding=\"async\" width=\"676\" height=\"106\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-14.png\" alt=\"\" class=\"wp-image-8170\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-14.png 676w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-14-300x47.png 300w\" sizes=\"auto, (max-width: 676px) 100vw, 676px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 14 &#8211; Version 1.1.0-dev-5 avec environnement U-boot restaur\u00e9<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Nous pouvons prolonger l&rsquo;exp\u00e9rience en refaisant la m\u00eame op\u00e9ration, sur le <strong>second emplacement<\/strong> contenant l&rsquo;environnement. Ceci permettra de s&rsquo;assurer que la premi\u00e8re copie de l&rsquo;environnement a \u00e9t\u00e9 restaur\u00e9e lors du dernier <em>boot<\/em>.<br><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bien entendu, je n&rsquo;\u00e9crase pas les deux copies simultan\u00e9ment, sinon je n&rsquo;ai aucune chance de voir le syst\u00e8me<br>se r\u00e9parer.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>sudo dd if=\/dev\/zero of=\/dev\/sdc bs=4k seek=$((0x200)) count=1<\/strong>\n1+0 records in\n1+0 records out\n4096 bytes (4.1 kB, 4.0 KiB) copied, 0.000504819 s, 4.1 MB\/s\n\n$ <strong>sudo hexdump -C -s 0x200000 -n 0x4000 \/dev\/sdc<\/strong>\n00200000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|\n*\n00204000<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Et le syst\u00e8me <strong>red\u00e9marre bien<\/strong> apr\u00e8s r\u00e9cup\u00e9ration de l&rsquo;environnement U-boot.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-15.png\"><img loading=\"lazy\" decoding=\"async\" width=\"676\" height=\"106\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-15.png\" alt=\"\" class=\"wp-image-8171\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-15.png 676w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/11\/fig-15-300x47.png 300w\" sizes=\"auto, (max-width: 676px) 100vw, 676px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 15 &#8211; Version 1.1.0-dev-5 second environnement restaur\u00e9<\/figcaption><\/figure>\n<\/div>\n\n\n<h1 class=\"wp-block-heading\">Conclusion<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Nous avons volontairement soumis le m\u00e9canisme de mise \u00e0 jour d\u2019Eris Linux \u00e0 plusieurs situations anormales&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>une nouvelle version <strong>incapable de terminer<\/strong> son d\u00e9marrage,<\/li>\n\n\n\n<li>la <strong>destruction<\/strong> de la partition de donn\u00e9es,<\/li>\n\n\n\n<li>la <strong>corruption<\/strong> successive des deux copies de l\u2019environnement U-Boot.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Dans chacun de ces cas, le syst\u00e8me a pu retrouver automatiquement un \u00e9tat permettant son <strong>red\u00e9marrage<\/strong>, sans intervention sur l\u2019\u00e9quipement d\u00e9ploy\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">C\u2019est pr\u00e9cis\u00e9ment l\u2019objectif du m\u00e9canisme de mise \u00e0 jour d\u2019Eris Linux&nbsp;: une mise \u00e0 jour distante ne doit pas transformer un \u00e9quipement fonctionnel en syst\u00e8me inutilisable sans intervention physique.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>","protected":false},"excerpt":{"rendered":"<p>Eris Linux offre un socle logiciel maintenu et ma&icirc;tris&eacute; sur lequel les applications m&eacute;tiers peuvent &ecirc;tre ex&eacute;cut&eacute;es en toute s&eacute;curit&eacute; dans des containers. La mise &agrave; jour r&eacute;guli&egrave;re du socle syst&egrave;me est r&eacute;alis&eacute;e par nos soins, au gr&eacute; des correctifs int&eacute;gr&eacute;s dans les recettes de Yocto Project et des n&eacute;cessit&eacute;s li&eacute;es &agrave; la d&eacute;couverte de [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-8126","post","type-post","status-publish","format-standard","hentry","category-linux-2"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/8126","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/comments?post=8126"}],"version-history":[{"count":25,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/8126\/revisions"}],"predecessor-version":[{"id":8190,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/8126\/revisions\/8190"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=8126"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=8126"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=8126"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}