Aller au contenu

Univers Linux

AffûtOS

Distribution personnelle dérivée de CachyOS, édition handheld — installée entièrement depuis un installateur préréglé : 97 paquets choisis, mes réglages et mon profil restaurés avant le premier démarrage.

97paquets choisis
177 Mosur la clé USB
1,3 à 2,5 sgagnées au démarrage par booster

Le projet

AffûtOS est ma distribution personnelle, dérivée de CachyOS édition handheld. Elle installe ce que j'utilise, retire ce que je n'utilise pas, et applique mes réglages avant le premier démarrage — de sorte qu'une réinstallation ne coûte plus une soirée de reconfiguration.

Les chiffres de cette page sont relevés dans la configuration de l'installateur, paquets.txt et les mesures, puis datés — elle est écrite à la main et peut donc dériver entre deux relectures. Dernière vérification : 8 octobre 2026.

AffûtOS est taillée pour le jeu en mobilité, avec une seule exigence : pouvoir réinstaller entièrement une machine sans avoir à me souvenir de quoi que ce soit. Tout ce que je configure une fois est écrit quelque part, et se rejoue tout seul.

Tout se passe dans l'installateur

L'installateur graphique s'ouvre déjà rempli : langue, clavier, chargeur d'amorçage, partitionnement, bureau, thèmes de paquets. Il ne reste qu'à créer le compte et à choisir une sauvegarde sur la page Restauration, qui liste les archives de profil trouvées sur les disques branchés. Ni fenêtre de terminal, ni script qui attend le premier login : restauration du profil, Decky Loader, client Steam et entrée d'amorçage se font avant le redémarrage, comme des étapes de l'installateur parmi d'autres.

Pendant qu'il travaille, le diaporama laisse la place à la liste des étapes : celle en cours, la durée de chacune et le temps restant — estimé sur les médianes des installations réelles, un quart d'heure environ. La page de fin coche déjà « Redémarrer maintenant », et le journal de l'installateur est conservé dans le système installé, même après un échec.

Le principe directeur est qu'une panne ne doit jamais laisser un système cassé. Les étapes propres à AffûtOS — restauration, post-installation — se dégradent proprement : si quelque chose manque, elles avertissent et continuent, au lieu de s'arrêter au milieu du gué. Une restauration qui échoue laisse une note sur le bureau ; le système, lui, est complet.

Depuis le 7 octobre, mes réglages vivent dans des paquets : sept paquets affutos-* portent les réglages du système, de l'amorçage, du GPU AMD, de KDE, de Firefox, de Steam et de Decky. Les installer ajoute la fonction, les retirer l'enlève, et leurs mises à jour corrigent aussi les machines déjà installées — sauf ce qui est recopié dans un compte, qui garde sa copie. L'installateur ne s'occupe plus que de ce qui se joue une fois, à l'installation : les choix faits à l'écran, la sauvegarde restaurée, la configuration de pacman, l'entrée d'amorçage du firmware et le client Steam déposé d'avance.

Une clé USB de 177 Mo qui installe tout

La clé ne contient que l'amorceur, le noyau et son initramfs. Son menu propose trois façons de rejoindre le réseau : le Wi-Fi interactif — recherche, choix du réseau, mot de passe tapé au démarrage, depuis l'initramfs, avant même que le système n'existe —, un Wi-Fi enregistré sur la clé, ou l'Ethernet. Elle télécharge ensuite les 2,5 Go du système en mémoire vive depuis mon serveur, avec vérification d'intégrité. La clé peut être retirée dès que le noyau est chargé, et reste valable d'une version à l'autre tant que le noyau ne change pas.

Ce que j'y ai appris

  • Un hook d'initramfs non exécutable est ignoré en silence — trois heures pour le comprendre.
  • La console d'initramfs ne sait pas afficher les accents : mes messages de diagnostic étaient illisibles.
  • Steam range certains réglages dans un bloc précis d'un fichier qui en contient deux identiques ; se tromper de bloc, c'est écrire dans le vide.
  • Un serveur sans mémoire ECC peut retourner un bit au milieu d'une image de 2,8 Go. C'est arrivé. La vérification d'intégrité l'a attrapé.
  • Un menu de démarrage d'une seconde coûtait 1,2 seconde à chaque démarrage ; l'« optimisation » d'initramfs la plus prometteuse sur le papier n'a rien fait gagner du tout.
  • Depuis pacman 7.1, les crochets des paquets (hooks) tournent par défaut sans réseau. C'était la vraie cause des téléchargements ratés pendant l'installation : je les avais d'abord mis sur le compte du DNS.
  • Une explication qui tient debout n'est qu'une hypothèse tant qu'on ne l'a pas comparée à l'original : l'une des miennes tournait en production depuis des semaines.

Chacune de ces leçons est racontée en détail dans le journal technique, plus bas sur cette page.

Linux au quotidien : un seul script

La méthode qui rend AffûtOS possible — et la machine réinstallable sans y penser.

bashArchCalamaresrsync
1script, pas dix
4commandes
~15 minmachine à neuf

Tout est parti d'un agacement : réinstaller une machine, c'est deux jours à retrouver ses réglages, et à en oublier la moitié. J'ai transformé ce savoir-faire en code. Rien n'est fait à la main, donc rien ne se perd — et ce qui casse une fois est corrigé pour toujours.

Un seul script, quatre commandes

  • capture — met à jour la liste des paquets, puis archive les données du profil, pas sa configuration : la configuration, c'est le travail de l'installateur. Les dossiers personnels sont rangés sous leur rôle et non sous leur nom, et retombent dans les bons dossiers du nouveau compte.
  • envoi — met la capture à l'abri hors de la machine, en delta contre la précédente. Un envoi coupé reprend où il s'était arrêté, et la mise en veille est bloquée pendant ce temps.
  • diff-paquets — tient à jour la liste de référence. Elle est cumulative : une capture ne peut que l'enrichir, et tout retrait est affiché nommément et exige de taper OUI.
  • usb — fabrique la clé de démarrage par le réseau.

Installer et restaurer ne sont plus des commandes : ils sont passés dans l'installateur, qui fait les deux d'une traite.

Le principe : ce qui casse une fois est corrigé pour toujours

Chaque panne rencontrée devient une protection dans le code. Une liste de paquets périmée qui écrasait la nouvelle, des fichiers restaurés appartenant au mauvais utilisateur, un réglage écrit au mauvais endroit d'un fichier de configuration, un dossier personnel laissé lisible par tous : autant de pièges rencontrés une fois, puis fermés définitivement.

La conséquence agréable, c'est qu'une réinstallation n'est plus un événement. C'est devenu une opération banale, que je lance sans y penser.

Ce qui est retiré de CachyOS

  • cachyos-helloÉcran d'accueil de CachyOS. Remplacé dans le menu du live par un lanceur « Installer AffûtOS ».
  • cachy-updateNotificateur de mises à jour.
  • plymouthAnimation de démarrage, avec plymouth-kcm, que le groupe KDE tirait : rien à charger ni à dessiner avant le bureau.
  • kwallet-pamOuverture du portefeuille à la connexion ; le portefeuille KDE est désactivé.
  • realtime-privilegesGroupe de privilèges temps réel, inutile ici.
  • zfs-utilsZFS, son noyau et ses outils : ni proposés par l'installateur, ni présents sur le live.
  • nvidia-utilsNoyau, pilotes et entrées de démarrage NVIDIA du live : ce sont des machines AMD.

Groupes que l'installateur ne propose plus :

  • Éditions bureau de CachyOS19 groupes destinés aux PC de bureau, et 3 groupes cachés.
  • Configuration du shell CachyOSfish et zsh préconfigurés — bash convient.
  • FirefoxFirefox standard, remplacé par Firefox Pure et le pack de langue du système.

Et ce qui est remplacé :

  • btrfs → ext4Système de fichiers par défaut, en tête de la liste de l'installateur.
  • Limine → systemd-bootEn UEFI seulement, menu caché : une touche maintenue l'affiche.
  • mkinitcpio → boosterUn initramfs propre à la machine, 1,3 à 2,5 secondes de gagnées au démarrage.

Les 97 paquets, par thème de l'installateur

L'installateur les propose en thèmes à cocher, tous cochés sauf l'accessibilité ; les autres sont installés d'office, sans case.

Jeux 10

Proton CachyOS natif, hors Steam (1,4 Go)

  • proton-cachyos-nativeA compatibility tool for Steam Play based on Wine and additional components, experimental branch with extra CachyOS flavour (native build)

Wine et son moteur web Gecko (800 Mo)

  • wine-geckoWine's built-in replacement for Microsoft's Internet Explorer

Outils Steam (110 Mo)

  • protonup-qtInstall and manage GE-Proton, Luxtorpeda & more for Steam, Lutris and Heroic
  • lsfg-vkLossless Scaling Frame Generation on Linux
  • affutos-deckyDecky Loader prêt pour les extensions du mode jeu : dossier dans Documents, relancé à chaque mise à jour

Émulateurs Switch et PS2 (125 Mo)

  • eden-*Émulateur Nintendo Switch — nightly officielle compilée avec PGO, variante choisie selon le processeur
  • pcsx2-gitPlayStation 2 emulator

Java 21 pour Minecraft (150 Mo)

  • jre21-openjdkOpenJDK Java 21 full runtime environment — pour MultiMC et Minecraft

Minecraft (MultiMC) et BeamMP (89 Mo)

  • multimc-binFree, open source launcher and instance manager for Minecraft.
  • beammp-launcher-gitMultiplayer Launcher/Client for BeamMP, providing multiplayer for BeamNG.drive

Internet et communication 13

Google Chrome (440 Mo)

  • google-chromeThe popular web browser by Google (Stable Channel)

Firefox Pure (290 Mo)

  • firefox-pureFast, Private & Safe Web Browser
  • cachyos-firefox-settingsCachyOS settings for Firefox browser
  • xdg-desktop-portal-kdeA backend implementation for xdg-desktop-portal using Qt/KF5
  • profile-sync-daemonSymlinks and syncs browser profile dirs to RAM
  • affutos-firefoxRéglages de Firefox Pure : pack de langue du système reposé à chaque mise à jour, navigateur par défaut, profil en mémoire vive

Discord et son overlay en jeu (23 Mo)

  • discordAll-in-one voice and text chat for gamers
  • discover-overlayYet another Discord overlay for Linux written in Python using GTK3
  • gtk-layer-shellLibrary to create Wayland desktop components using the Layer Shell protocol

Bureau à distance et transferts (270 Mo)

  • anydesk-binThe Fast Remote Desktop Application
  • deskflowShare one mouse and keyboard between multiple computers
  • filezillaFast and reliable FTP, FTPS and SFTP client
  • freedownloadmanagerFDM is a powerful modern download accelerator and organizer.

Son, image et vidéo 12

EasyEffects et greffons audio (130 Mo)

  • calfLV2 plug-in suite
  • lsp-plugins-lv2Collection of open-source plugins - LV2
  • mda.lv2A port of the MDA VST plugins to LV2
  • x42-plugins-lv2Professional audio processing units available as LV2-plugin and JACK-application - LV2 plugins
  • zam-plugins-lv2Collection of audio plugins for high-quality processing - LV2 plugins
  • easyeffectsAudio Effects for Pipewire applications

OBS, dessin, SMPlayer et Spotify (290 Mo)

  • obs-studioFree, open source software for live streaming and recording
  • kolourpaintPaint Program
  • mypaintFast and easy painting application for digital painters, with brush dynamics
  • smplayer-skinsSkins for SMPlayer
  • smplayer-themesThemes for SMPlayer
  • spicetify-marketplace-binSpicetify app that integrates a marketplace for extensions, themes and snippets

Bureautique et impression 5

LibreOffice en français et horloge (600 Mo)

  • libreoffice-fresh-frFrench language pack for LibreOffice Fresh
  • kclockClock app for Plasma Mobile

Impression (27 Mo)

  • cupsOpenPrinting CUPS - daemon package
  • cups-filtersOpenPrinting CUPS Filters
  • system-config-printerA CUPS printer configuration tool and status applet

Développement et assistants IA 14

VSCodium (1,0 Go)

  • vscodiumFree/Libre Open Source Software Binaries of VSCode (git build from latest release).

Claude Desktop (660 Mo)

  • claude-desktopOfficial Claude AI desktop app from Anthropic

Claude Code et OpenCode (1,0 Go)

  • claude-codeAn agentic coding tool that lives in your terminal
  • opencodeThe open source coding agent
  • opencode-desktop-binOpenCode desktop client

Rust, mold et lld (390 Mo)

  • rustSystems programming language focused on safety, speed and concurrency
  • lldLinker from the LLVM project
  • moldA Modern Linker

Node.js, npm et uv (130 Mo)

  • nodejsEvented I/O for V8 javascript ("Current" release)
  • npmJavaScript package manager
  • uvAn extremely fast Python package installer and resolver written in Rust

Neovim et polices Powerline (35 Mo)

  • neovimFork of Vim aiming to improve user experience, plugins, and GUIs
  • ex-vi-compatThe ex and vi commands based on vim's compatibility modes
  • powerline-fontsPatched fonts for powerline

Matériel : GPU AMD, ASUS ROG, disques 17

GPU AMD : LACT, surveillance, Vulkan (86 Mo)

  • lactLinux GPU Configuration Tool
  • affutos-amdgpuContrôle complet du GPU AMD pour LACT (ppfeaturemask), service lactd activé
  • radeontopView GPU utilization for total activity percent and individual blocks
  • rocm-smi-libROCm System Management Interface Library
  • libva-utilsIntel VA-API Media Applications and Scripts for libva
  • vulkan-validation-layersVulkan Validation Layers
  • spirv-headersSPIR-V header files and registry

ASUS ROG Control Center (42 Mo)

  • rog-control-centerGraphical user interface for asusctl

Disques et téléphones (53 Mo)

  • gpartedA Partition Magic clone, frontend to GNU Parted
  • gsmartcontrolA graphical user interface for the smartctl hard disk drive health inspection tool.
  • hddtempGives you the temperature of your hard drive by reading S.M.A.R.T. information
  • baobabA graphical directory tree analyzer
  • gvfsVirtual filesystem implementation for GIO
  • gvfs-mtpVirtual filesystem implementation for GIO - MTP backend (Android, media player)
  • mtpfsA FUSE filesystem that supports reading and writing from any MTP device
  • scrcpyDisplay and control your Android device
  • lshwA small tool to provide detailed information on the hardware configuration of the machine.

Diagnostic réseau en console (33 Mo) 6

  • nmapUtility for network discovery and security auditing
  • net-toolsConfiguration tools for Linux networking
  • openbsd-netcatTCP/IP swiss army knife. OpenBSD variant.
  • sshpassFool ssh into accepting an interactive password non-interactively
  • dhcpcdDHCP/ IPv4LL/ IPv6RA/ DHCPv6 client
  • arch-auditA utility like pkg-audit based on Arch Security Team data

Accessibilité : lecteur d'écran (110 Mo) — décoché 3

  • espeak-ngMulti-lingual software speech synthesizer
  • mousetweaksMouse accessibility enhancements
  • orcaScreen reader for individuals who are blind or visually impaired

Installés d'office, sans case 17

  • xbindkeysLaunch shell commands with your keyboard or your mouse under X — requis par le service de raccourcis du mode jeu
  • flatpakLinux application sandboxing and distribution framework (formerly xdg-app)
  • libappindicatorAllow applications to extend a menu via Ayatana indicators in Unity, KDE or Systray
  • woff2-font-awesomeIconic font designed for Bootstrap - woff2 format
  • 7zipFile archiver for extremely high compression
  • treeA directory listing program displaying a depth indented list of files
  • progressShows running coreutils basic commands and displays stats
  • affutos-keyringClé publique du dépôt AffûtOS : ses paquets sont signés
  • affutos-scriptsLe script affutos : capture, envoi, diff-paquets, usb
  • affutos-systemeRéglages système : identité AffûtOS, ordonnanceurs d'entrées-sorties, verrouillage de compte désactivé, correctif des GPU Navi 14, dépôt Flathub
  • affutos-boosterEntrées systemd-boot sur l'initramfs de booster, microcode en tête
  • affutos-steamSteam et mode jeu : réglages dès l'installation, dernier mode repris au démarrage, services absents du mode jeu sautés au lieu d'échouer
  • mesaOpen-source OpenGL drivers — socle épinglé, jamais mesa-git
  • lib32-mesaOpen-source OpenGL drivers - 32-bit — socle épinglé, jamais mesa-git
  • vulkan-radeonOpen-source Vulkan driver for AMD GPUs — socle épinglé, jamais mesa-git
  • lib32-vulkan-radeonOpen-source Vulkan driver for AMD GPUs - 32-bit — socle épinglé, jamais mesa-git
  • proton-cachyos-slrA compatibility tool for Steam Play based on Wine and additional components, experimental branch with extra CachyOS flavour (Steam Linux Runtime build) — installé d'office, utilisé pour tous les jeux Steam

Tous les réglages appliqués

Sur le système installé, la plupart viennent des paquets affutos-* : retirer un paquet enlève ses réglages du système, mais un compte garde ce qui y a été recopié.

Installation (Calamares, préréglé)

  • Partitionnement : effacement du disque présélectionné, ext4 par défaut ; ni ZFS ni chiffrement proposés
  • Disques USB et de moins de 16 Go passés en lecture seule : l'installateur ne les propose pas
  • Amorçage : systemd-boot en UEFI, menu caché (délai 0) ; initramfs par booster
  • Dépôts Chaotic-AUR et AffûtOS ajoutés après les dépôts officiels ; les paquets AffûtOS sont signés
  • Page Restauration : sauvegardes des disques branchés, empreinte vérifiée avant l'extraction
  • Liste des étapes avec durées et temps restant ; journal recopié dans le système installé, même après un échec
  • « Redémarrer maintenant » coché sur la page de fin

Système live

  • En français : langue, clavier console et bureau, fuseau Europe/Paris
  • Paquets communs préchargés en mémoire vive dès le démarrage, pour que l'installation ne les retélécharge pas (abandonné sous 3 Go de mémoire libre)
  • Wi-Fi associé depuis l'initramfs pour le démarrage réseau ; veille bloquée pendant l'installation

Système

  • amdgpu.ppfeaturemask=0xffffffff — contrôle complet du GPU AMD (nécessaire à LACT) ; amdgpu.runpm=0 seulement si un GPU Navi 14 est présent
  • Identité AffûtOS (/etc/os-release) rejouée après toute mise à jour qui l'écraserait
  • Une seule entrée d'amorçage UEFI « AffutOS » pour le disque, créée sans doublon
  • Firefox Pure : pack de langue du système à la version exacte, contrôlé par les empreintes de Mozilla et reposé à chaque mise à jour ; profil tenu en mémoire vive
  • Ordonnanceurs d'entrées-sorties : BFQ pour SATA et cartes SD, aucun pour NVMe
  • Deux téléchargements pacman en parallèle au lieu de dix ; cache des paquets vidé après l'installation, puis élagué automatiquement

Bureau KDE

  • Le bureau est le dossier personnel : les raccourcis y arrivent directement
  • Session vierge à l'ouverture — aucune fenêtre restaurée
  • Jamais de veille automatique ; écran éteint après 10 minutes, sur batterie seulement
  • Portefeuille KDE désactivé
  • Fréquence variable réglée sur « Toujours » pour les écrans de mes machines
  • Dolphin : barre de menus, panneaux, fichiers cachés affichés, vue Détails
  • Moniteurs processeur, mémoire et disque dans la barre des tâches, juste après la liste des tâches
  • Un lanceur « Redémarrer Plasma » ; le démarrage reprend le dernier mode utilisé, jeu ou bureau

Steam et mode jeu

  • Luminosité au maximum, jamais d'assombrissement ni de veille, sur secteur comme sur batterie
  • Proton CachyOS pour tous les jeux ; fréquence variable active en mode jeu
  • Assistant de premier lancement sauté, interface en français, branche stable du Steam Deck
  • Client Steam téléchargé pendant l'installation : plus rien à rapatrier au premier lancement
  • Steam ne démarre plus avec la session Plasma
  • Mode jeu : les services de notification et de saisie que lance la session sont sautés tant que leur programme manque, au lieu d'échouer

Avant le premier démarrage, sans intervention

  • Profil choisi restauré, liste de paquets de référence remise à sa place
  • Decky Loader installé et activé ; les extensions de la sauvegarde réinstallées depuis le store Decky, à jour
  • Eden (émulateur Switch) : la nightly officielle compilée avec PGO, republiée chaque nuit, dans la variante optimisée pour le processeur détecté

Autour d'AffûtOS, au quotidien

Système

  • AffûtOS, ma distribution dérivée de CachyOS
  • KDE Plasma en bureau, gamescope en mode jeu
  • Decky Loader pour les extensions du mode jeu
  • Tout se réinstalle depuis l'installateur, profil compris

Outils du quotidien

  • Konsole et bash — l'essentiel du travail
  • Dolphin, barre de menu visible et fichiers cachés affichés
  • Firefox Pure, profil en mémoire vive
  • Claude Code pour l'automatisation et le débogage

Jeu et émulation

  • Steam en mode jeu, réglages appliqués dès l'installation
  • Proton CachyOS pour les jeux Windows
  • Eden (Switch), Cemu (Wii U), PCSX2 (PS2)
  • lsfg-vk pour la génération d'images

Journal technique

Des pannes qui m'ont appris quelque chose — et le chemin pour les comprendre. Flux RSS

8 octobre 2026

Chaque réglage dans un paquet

Jusqu'ici, l'installateur recopiait lui-même mes réglages dans le système : configuration du bureau, modèle des nouveaux comptes, règles du système. Ça marchait le jour de l'installation, et plus jamais ensuite : un réglage corrigé n'atteignait pas les machines déjà installées, et aucun ne pouvait être retiré.

Sept paquets, trois règles

Les réglages appartiennent désormais à des paquets affutos-* du dépôt AffûtOS : système, amorçage, GPU AMD, KDE, Firefox, Steam, Decky. Installer un paquet pose ses réglages, le retirer les enlève, le mettre à jour les corrige sur toutes les machines — à une exception près, qu'impose la deuxième règle. La construction de l'image refuse tout réglage copié hors d'un paquet ; l'installateur ne garde que ce qui se joue une fois, comme la sauvegarde restaurée ou l'entrée d'amorçage du firmware.

  • Un réglage que KDE lit comme défaut global va dans /etc/xdg : changé pour tous à la mise à jour, toujours surchargeable par le compte ;
  • un réglage propre au compte — Steam, Firefox, fichiers que Plasma réécrit — va dans le modèle des nouveaux comptes, /etc/skel, sous forme de fichier possédé par le paquet. Revers de la méthode : un compte existant garde sa copie, que ni mise à jour ni retrait ne touche ;
  • un service s'active par un lien livré dans le paquet, pas par une commande : retirer le paquet suffit à le désactiver. Seule exception, Decky : son service porte le nom du compte, que le paquet ne peut pas connaître d'avance ; il l'active pour le premier compte et le désactive à son retrait.

Les moniteurs processeur, mémoire et disque de la barre des tâches passent, eux, par un script de mise à jour de Plasma, joué une fois par compte à l'ouverture de session : ils se placent juste après la liste des tâches, comme sur ma machine principale.

Le coupable était pacman

Le paquet affutos-firefox pose le pack de langue du système à son installation, puis le repose à chaque mise à jour du navigateur. Sur une machine déjà installée, au réseau impeccable, sa réinstallation a échoué au téléchargement : curl: (7) Failed to connect to archive.mozilla.org:443 after 1 ms. Une milliseconde, ce n'est pas un DNS lent : la connexion n'a jamais quitté la machine.

La réponse était dans le manuel de pacman.conf : depuis pacman 7.1, crochets et scripts d'installation des paquets tournent par défaut dans un espace de noms réseau neuf, sans autre interface que la boucle locale. Aucun téléchargement n'y aboutit. C'était la cause des erreurs « impossible de résoudre l'hôte » vues pendant l'installation depuis fin septembre — que j'avais d'abord mises sur le compte du lien DNS mort soupçonné mi-août, puis classées « cause inconnue » le 4 octobre.

Un crochet peut réclamer le réseau (NetworkAccess = allowed), pas un script d'installation de paquet — or le pack se pose aussi quand le paquet s'installe. Le crochet comme le script demandent donc à systemd de lancer un service, qui télécharge en dehors de l'espace isolé : les sockets de systemd sont des fichiers, joignables même sans réseau. Pendant l'installation, où systemd ne tourne pas encore dans le système cible, une étape de post-installation rejoue le téléchargement.

Trois erreurs de moins au journal système

Trois erreurs encombraient le journal système. Deux venaient de la session du mode jeu, qui lance un démon de notifications Steam et une méthode de saisie dont les programmes ne sont pas installés : leurs services sont maintenant sautés tant que leur programme manque. La troisième venait du service qui tient le profil Firefox en mémoire vive : il démarrait aussi pour root, qui n'a pas de profil, et ne tourne plus que pour les comptes ordinaires.

Vérifié dans les deux sens

Sur une machine de test, chaque paquet a été retiré puis réinstallé : ses fichiers et services système disparaissent et reviennent à l'identique. Ensuite, deux installations complètes en machine virtuelle, avec les nouvelles images : aucune des trois erreurs au journal système, et Decky actif dès le premier démarrage.

Un piège au passage : sur une installation neuve, Decky refusait de démarrer, faute d'un dossier que mon compte de test avait déjà. Un service vérifié sur un compte existant ne prouve rien pour un compte neuf : depuis, chaque service se teste aussi sur un compte créé pour l'occasion.

La leçon : tant que la panne ne se produisait que dans l'installateur, je cherchais dans l'installateur. Il a fallu la voir sur une machine ordinaire pour regarder enfin du côté de pacman.

4 octobre 2026

Se comparer à l'original

Depuis deux mois, AffûtOS s'éloigne de CachyOS un correctif après l'autre, chacun avec sa raison écrite en commentaire. Ce que je n'avais jamais fait : installer les deux côte à côte et regarder la différence, fichier par fichier.

Le banc

Deux machines virtuelles sur le même ordinateur, chacune sur son disque, nourries par le même cache de paquets local : CachyOS handheld avec ses réglages par défaut — sauf le système de fichiers et le chargeur, mis en ext4 et systemd-boot comme les miens — et ma version de travail d'AffûtOS. Puis un relevé hors ligne des deux systèmes installés — paquets, fichiers qu'aucun paquet ne possède, services activés — et leurs temps de démarrage.

  • Démarrage : 4,56 s contre 6,78 s, alors que ma version de travail lance quelques services de plus — la phase d'initramfs prend 0,07 s avec booster contre 1,65 s ;
  • et cinq secondes de menu d'amorçage en plus pour CachyOS, contre aucune pour AffûtOS.

Une explication fausse, en production depuis des semaines

Mi-août, j'avais accusé une étape de l'installateur qui, croyais-je, remplaçait la configuration DNS par un lien mort, et ajouté une étape pour la réparer. En septembre, un pack de langue de Firefox qui refusait de se télécharger pendant l'installation — « impossible de résoudre l'hôte » — avait semblé me donner raison. La comparaison a coulé l'histoire : le live n'a plus ce lien depuis 2022, l'étape recopie un fichier ordinaire identique à celui déjà en place — et CachyOS, sans aucune réparation, finit avec exactement le même fichier.

L'étape de réparation est partie. Le symptôme de Firefox, lui, est réel, et sa cause reste inconnue ; ce qui n'en dépend plus, c'est que les téléchargements hors pacman — pack de langue, Decky, client Steam — se font déjà dans les étapes de post-installation, où le réseau fonctionne.

Mise à jour du 8 octobre : la cause est trouvée — depuis pacman 7.1, les crochets des paquets n'ont, par défaut, pas de réseau. Voir « Chaque réglage dans un paquet ».

Un ménage vérifiable

Chaque différence a ensuite dû se justifier face à l'original. Résultat : 1 224 lignes retirées et 391 ajoutées, en dix commits — des entrées de démarrage réseau que personne n'utilisait, jusqu'à trois minutes d'attente avant l'ouverture de l'installateur pour un classement de miroirs qu'il ne lit qu'au moment d'installer, une copie de mon script que plus rien ne lisait, des estimations de durée dépassées à presque chaque installation. Réinstallée après le ménage, AffûtOS avait les mêmes paquets, les mêmes services, et seulement les écarts de fichiers voulus : même comportement, moins de code.

Au passage, un correctif publié par CachyOS sur sa branche principale — un minuteur de classement des miroirs à neutraliser sur le live — a été repris lui aussi.

La leçon rejoint celle d'août : relire son propre code convainc, le poser à côté de l'original ne ment pas.

30 septembre 2026

Démarrer plus vite : ce qui a compté, et ce qui n'a rien donné

Objectif : gagner des secondes entre le bouton d'allumage et le bureau, sur ma machine principale. La première question est venue avant tout changement : comment mesurer. systemd ne voit que ce qui suit le firmware ; pour comparer un chargeur classique et un noyau lancé directement par le firmware, il faut l'horloge du firmware lui-même — une table ACPI note l'instant où il passe la main. Chaque configuration a été démarrée trois à six fois.

  • Point de départ, mkinitcpio : 12,83 s de l'allumage au bureau.
  • Un mkinitcpio « optimisé » — moins de hooks, modules décompressés, compression maximale : 12,81 s. Rien.
  • booster, qui n'embarque que ce dont la machine a besoin (moins de 10 Mo au lieu de 16,7) : 11,52 s, 1,3 s de gagnée. Sur mon autre portable, 2,5 s.
  • Une image noyau unifiée lancée par le firmware, sans chargeur du tout : 11,47 s contre 11,45 s. Rien non plus : les 0,3 s du chargeur sont surtout la lecture du noyau sur le disque par le firmware, qu'il doit faire de toute façon.

La seconde qu'on ne voit pas

Le menu de démarrage, réglé à une seconde pour pouvoir encore choisir une entrée, coûtait en fait 1,2 seconde par démarrage ; sur l'autre portable, le chargeur à lui seul prenait jusqu'à 1,8 seconde. Le délai est désormais à zéro, et une touche maintenue fait revenir le menu.

Deux pièges

  • L'option strip de booster, qui allège les modules, leur retire aussi leur signature : le noyau se déclare alors souillé. Elle reste désactivée — l'écart de taille est sous le mégaoctet.
  • Créer ou supprimer une entrée d'amorçage UEFI fait refaire au firmware de ma machine une initialisation complète au démarrage suivant : 7,3 s au lieu de 4,4. Toute mesure prise juste après avoir touché aux entrées est fausse ; il faut d'abord un démarrage de chauffe.

Où ne plus chercher

L'échantillonnage du reste du démarrage a montré que l'écran de connexion, à 6,8 s, est retenu par deux pilotes : celui du GPU AMD, qui ne commence sa détection qu'à 5,75 s, et celui du Wi-Fi, qui applique sa réglementation radio. Ce qui reste du côté de systemd vaut 0,2 s environ. Les mesures disent où arrêter de creuser autant qu'où creuser.

18 août 2026

La bonne piste n'était pas celle que je croyais

Une analyse du code avait désigné un coupable idéal : les paquets préchargés au démarrage n'atterrissaient pas là où l'installateur les cherchait, et seraient donc retéléchargés. Deux minutes à récupérer, sur le papier.

Le correctif était une régression

Il l'était doublement. Le programme d'installation n'appelle pas pacman --root mais pacman --sysroot — et cette option fait lire la configuration et le cache dans le système en cours d'installation, pas sur le live. Le code d'origine visait donc déjà le bon endroit. Ma « correction » détournait 746 Mo vers un cache que personne ne lit, sous des noms de fichiers que l'installateur ne cherche jamais.

Douze paquets tirés au hasard parmi les préchargés : douze retéléchargés. Le cache du live n'avait pas grossi d'un octet pendant toute l'installation. Seule l'exécution réelle l'a montré — la lecture du code, elle, avait convaincu deux analyses successives.

Le vrai gain était ailleurs, et il est énorme

Un cache de paquets sur le réseau local, lui, change tout. Mesuré sur la machine de salon, installation complète :

  • 5 minutes au lieu de 12, pour 1271 paquets installés ;
  • 341 Mo tirés d'Internet au lieu de 4,2 Go ;
  • 3347 fichiers servis par le cache local contre 177 allés chercher dehors, soit 95 % des requêtes.

La leçon tient en une ligne : une hypothèse sur un cache se vérifie à la date des fichiers après coup, jamais à la lecture des options.

18 août 2026

Sortir la configuration du script, et la mettre dans l'image

Jusqu'ici, préparer l'installateur voulait dire le retoucher à chaud : plus de mille lignes de substitutions appliquées à son fichier de configuration, à chaque démarrage du live. Ça marchait, et c'était intenable — impossible de dire ce qui différait de l'amont sans dérouler le script à la main.

La configuration vit désormais dans l'image, en clair, sous forme d'une surcouche que l'installateur lit avant la sienne. Elle se relit, se compare, se versionne. Le lanceur contrôle dans le journal quelle configuration a réellement été ouverte et s'arrête si ce n'est pas la bonne : un repli silencieux installerait la distribution d'origine sans prévenir.

Dans la foulée, la post-installation a quitté son script en arrière-plan pour devenir une étape appelée par l'installateur. Et une relecture complète a fait tomber 925 lignes : des groupes de paquets qu'une édition console ne peut pas afficher, un chargeur d'amorçage que rien ne savait configurer, des fichiers de démarrage que rien ne lisait.

Un détail mesuré au passage : sans réglage explicite, l'outil de noyau reconstruisait un initramfs et une entrée de démarrage déjà produits par l'étape précédente — 64 Mo abandonnés sur une partition d'amorçage de 196 Mo.

10 août 2026

Un seul bit retourné dans une image de 2,8 Go

Le démarrage réseau d'AffûtOS s'est mis à refuser l'image système : checksum error. Réflexe habituel : régénérer la somme de contrôle. Ç'aurait été la pire décision possible.

Le disque disait vrai, la mémoire mentait

En comparant l'image publiée avec celle du répertoire de travail, un seul octet différait sur 2 823 114 752 — et il ne différait que d'un bit : 0xA2 était devenu 0xAA. Le reste de l'image, noyau et initramfs compris, était identique au bit près.

La chronologie situait l'accident dans une fenêtre d'une seconde et demie, pendant la recopie de l'image vers le fichier ISO. Le fichier source sur le disque, relu plus tard en contournant le cache mémoire, était parfaitement sain.

La preuve, quelques heures plus tard

Le même jour, un paquet du cache s'est mis à échouer sa vérification de signature. Lu normalement — donc depuis la mémoire — sa signature était invalide. Lu directement depuis le disque, elle était parfaite. Et le bit fautif était le même que celui de l'image : le bit 3.

La machine a une mémoire sans correction d'erreurs, quatre barrettes poussées au-delà des fréquences validées par le constructeur. Elle n'a aucun moyen de détecter, et encore moins de corriger, ce genre d'accident.

Ce que j'en ai tiré

  • Une somme de contrôle qui échoue est une bonne nouvelle : elle a fait son travail. La régénérer revient à certifier officiellement une donnée corrompue.
  • Une vérification qui relit un fichier juste après l'avoir écrit ne vérifie que la mémoire. Il faut vider le cache avant de relire, sinon on valide la copie suspecte avec elle-même.
  • Rien n'est publié désormais sans une relecture disque de tous les fichiers, et pas seulement du plus gros.

Le versant serveur de cet incident

9 août 2026

Trois heures perdues sur un bit de permission

Objectif : associer le Wi-Fi depuis l'initramfs, avant que le système n'existe, pour installer une machine sans câble réseau. Le script était écrit, injecté dans l'image, et ne s'exécutait pas. Aucun message. Aucune erreur. Rien.

Tout était correct, sauf une chose

Le fichier était bien présent dans l'image — vérifié. Sa syntaxe était valide — vérifiée avec l'interpréteur exact de l'initramfs. Son chargement définissait bien la fonction attendue — vérifié. Il figurait dans la liste des scripts à exécuter — vérifié. Et pourtant il ne tournait jamais.

La réponse était dans le code du système d'amorçage, une seule ligne :

[ -x "/hooks/$hook" ] || continue

Un script non exécutable est ignoré, sans le moindre message. C'est même le mécanisme officiel de désactivation : la fonction prévue pour désactiver un script se contente de lui retirer son bit d'exécution.

En reconstruisant l'image à la main, j'avais recréé le fichier en 0644 au lieu de 0755. J'avais désactivé mon propre script sans le savoir, à chaque tentative.

Deux leçons de méthode

  • J'ai ajouté un numéro de version affiché à l'écran par le script. Sans lui, impossible de savoir quelle version tournait réellement — j'ai passé une heure à tester des correctifs qui n'étaient pas chargés.
  • La console de l'initramfs n'affiche pas les caractères accentués : tous mes messages de diagnostic en français apparaissaient comme des symboles illisibles. Ils étaient là depuis le début, je ne pouvais simplement pas les lire.

9 août 2026

Chercher un réglage dans du JavaScript minifié

Je voulais que trois réglages du mode jeu soient appliqués dès l'installation, sans intervention : ne jamais réduire la luminosité sur secteur, ne jamais se mettre en veille, et afficher le pourcentage de batterie. Les noms de clés semblaient évidents. Ils ne fonctionnaient pas.

La bonne clé au mauvais endroit

Le fichier de configuration contient deux blocs portant le même nom. Le logiciel n'en lit qu'un : le plus profond. J'écrivais dans l'autre. La clé était juste, la valeur était juste, l'emplacement était faux — donc rien ne se passait, sans le moindre avertissement.

Même piège pour le pourcentage de batterie, quelques heures plus tard : la clé devait vivre dans un sous-bloc précis, aux côtés de trois clés sœurs écrites par le même composant. À la racine, elle restait lettre morte.

La méthode qui a marché

Deux approches complémentaires. D'abord l'empirique : prendre une photo des fichiers, modifier le réglage à la main dans l'interface, comparer. Le fichier avoue alors exactement ce qu'il faut écrire, et où.

Ensuite la lecture des sources. L'interface de Steam n'est plus une bibliothèque compilée mais du JavaScript minifié : une centaine de mégaoctets de code illisible, mais parfaitement consultable. On y retrouve le nom exact de la clé, la fonction qui l'écrit, et celle qui la relit au démarrage — donc la certitude qu'une valeur posée d'avance sera bien reprise.

Un piège à éviter absolument

Une astuce circule pour désactiver l'assistant de premier démarrage : créer un certain fichier de configuration avec une ligne magique. Le lanceur, quand il rencontre cette ligne, exécute un rm -rf sur tout le dossier de l'application — à chaque démarrage. La solution correcte utilise un fichier d'amorçage prévu par l'éditeur, que personne ne semble utiliser.