Aller au contenu

Univers Linux

AffûtOS

Distribution personnelle dérivée de CachyOS, édition handheld — 96 paquets installés d'office, 7 retirés, tous les réglages appliqués sans intervention.

0question posée
165 Mosur la clé USB
7étapes automatisées

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 paquets.txt et les scripts d'installation, puis datés — elle est écrite à la main et peut donc dériver entre deux relectures. Dernière vérification : 18 août 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.

L'installation ne pose aucune question

L'installateur graphique est préréglé avant même son lancement : partitionnement, système de fichiers, chargeur d'amorçage, fuseau horaire, sélection de paquets. Pendant qu'il travaille, la post-installation s'enchaîne — non plus depuis un script qui attend en arrière-plan, mais appelée par l'installateur lui-même, comme n'importe quelle autre étape : restauration du profil, paquets, configuration du système et de la session de jeu.

Le principe directeur est qu'une panne ne doit jamais laisser un système cassé. Chaque étape se dégrade proprement : si quelque chose manque, on avertit et on continue, au lieu de s'arrêter au milieu du gué.

Une clé USB de 165 Mo qui installe tout

La clé ne contient que le noyau et l'amorceur. Au démarrage, elle se connecte au Wi-Fi depuis l'initramfs — avant même que le système n'existe — puis télécharge les 2,8 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 le début du téléchargement. Les mises à jour du système ne demandent plus jamais de refaire la clé.

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é.

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.

bashArchDeckyémulation
1script, pas dix
92paquets restaurés
~2 hmachine à 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, quelques commandes

  • capture — sauvegarde le profil et régénère la liste des paquets réellement ajoutés depuis l'installation.
  • install — réinstalle entièrement une machine autour de l'installateur graphique, sans surveillance.
  • restore — remet un profil et ses configurations en place.
  • usb — fabrique la clé de démarrage par le réseau.

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

Chaque panne rencontrée devient une protection dans le script. 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 : 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é sur le bureau du live par un lanceur d'installation AffûtOS.
  • cachyos-wallpapersFonds d'écran CachyOS.
  • cachyos-vaporThème embarquant des logos Steam Deck.
  • plymouthAnimation de démarrage. Retirée des HOOKS de l'initramfs et neutralisée par plymouth.enable=0 — le démarrage est plus rapide et les messages du noyau redeviennent lisibles.
  • cachyos-plymouth-bootanimationAnimation Plymouth aux couleurs de CachyOS.
  • cachyos-plymouth-themeThème Plymouth de CachyOS.
  • cachy-updateNotificateur de mises à jour. Retiré de la liste netinstall de Calamares.

Deux groupes de l'installateur sont également décochés par défaut :

  • CachyOS shell configurationfish et zsh préconfigurés — bash convient.
  • Firefox and language packageFirefox standard, remplacé par l'édition développeur et son pack français.

Les 96 paquets, par catégorie

Jeu et émulation 16

  • beammp-launcher-gitMultiplayer Launcher/Client for BeamMP, providing multiplayer for BeamNG.drive
  • steam-boilr-guiSynchronize games from other platforms into your Steam library (jaquettes SteamGridDB en masse)
  • discordAll-in-one voice and text chat for gamers
  • discover-overlayYet another Discord overlay for Linux written in Python using GTK3
  • jre21-openjdkOpenJDK Java 21 full runtime environment (pour MultiMC/Minecraft)
  • lib32-gamemodeA daemon/lib combo that allows games to request a set of optimisations be temporarily applied to the host OS
  • libva-utilsIntel VA-API Media Applications and Scripts for libva
  • lsfg-vkLossless Scaling Frame Generation on Linux
  • multimc-binFree, open source launcher and instance manager for Minecraft.
  • proton-cachyos-nativeA compatibility tool for Steam Play based on Wine and additional components, experimental branch with extra CachyOS flavour (native build)
  • proton-cachyos-slrA compatibility tool for Steam Play based on Wine and additional components, experimental branch with extra CachyOS flavour (Steam Linux Runtime build)
  • protonup-qtInstall and manage GE-Proton, Luxtorpeda & more for Steam, Lutris and Heroic
  • spicetify-marketplace-binSpicetify app that integrates a marketplace for extensions, themes and snippets
  • spirv-headersSPIR-V header files and registry
  • vulkan-validation-layersVulkan Validation Layers
  • wine-geckoWine's built-in replacement for Microsoft's Internet Explorer

Bureau et vie quotidienne 21

  • baobabA graphical directory tree analyzer
  • easyeffectsAudio Effects for Pipewire applications
  • filelightView disk usage information
  • filezillaFast and reliable FTP, FTPS and SFTP client
  • firefox-developer-editionFast, Private & Safe Web Browser (Developer Edition)
  • firefox-developer-edition-i18n-frFrench language pack for Firefox Developer Edition
  • flatpakLinux application sandboxing and distribution framework (formerly xdg-app)
  • freedownloadmanagerFDM is a powerful modern download accelerator and organizer.
  • google-chromeThe popular web browser by Google (Stable Channel)
  • gtk-layer-shellLibrary to create Wayland desktop components using the Layer Shell protocol
  • kcalcScientific Calculator
  • kclockClock app for Plasma Mobile
  • kolourpaintPaint Program
  • libappindicatorAllow applications to extend a menu via Ayatana indicators in Unity, KDE or Systray
  • libreoffice-fresh-frFrench language pack for LibreOffice Fresh
  • mypaintFast and easy painting application for digital painters, with brush dynamics
  • obs-studioFree, open source software for live streaming and recording
  • powerline-fontsPatched fonts for powerline
  • smplayer-skinsSkins for SMPlayer
  • smplayer-themesThemes for SMPlayer
  • woff2-font-awesomeIconic font designed for Bootstrap - woff2 format

Développement 15

  • claude-codeAn agentic coding tool that lives in your terminal
  • claude-desktopOfficial Claude AI desktop app from Anthropic
  • ex-vi-compatThe ex and vi commands based on vim's compatibility modes
  • lldLinker from the LLVM project
  • moldA Modern Linker
  • neovimFork of Vim aiming to improve user experience, plugins, and GUIs
  • nodejsEvented I/O for V8 javascript ("Current" release)
  • npmJavaScript package manager
  • opencodeThe open source coding agent
  • opencode-desktop-binOpenCode desktop client
  • progressShows running coreutils basic commands and displays stats
  • rustSystems programming language focused on safety, speed and concurrency
  • treeA directory listing program displaying a depth indented list of files
  • uvAn extremely fast Python package installer and resolver written in Rust
  • vscodiumFree/Libre Open Source Software Binaries of VSCode (git build from latest release).

Matériel, disques et impression 23

  • 7zipFile archiver for extremely high compression
  • anydesk-binThe Fast Remote Desktop Application
  • arch-auditA utility like pkg-audit based on Arch Security Team data
  • cupsOpenPrinting CUPS - daemon package
  • cups-filtersOpenPrinting CUPS Filters
  • deskflowShare one mouse and keyboard between multiple computers
  • fwupdSimple daemon to allow session software to update firmware
  • gpartedA Partition Magic clone, frontend to GNU Parted
  • gsmartcontrolA graphical user interface for the smartctl hard disk drive health inspection tool.
  • gvfsVirtual filesystem implementation for GIO
  • gvfs-mtpVirtual filesystem implementation for GIO - MTP backend (Android, media player)
  • hddtempGives you the temperature of your hard drive by reading S.M.A.R.T. information
  • lactLinux GPU Configuration Tool
  • lib32-mesaOpen-source OpenGL drivers - 32-bit — socle épinglé, jamais mesa-git
  • lshwA small tool to provide detailed information on the hardware configuration of the machine.
  • mesaOpen-source OpenGL drivers — socle épinglé, jamais mesa-git
  • mtpfsA FUSE filesystem that supports reading and writing from any MTP device
  • ollama-rocmCreate, run and share large language models (LLMs) with ROCm
  • radeontopView GPU utilization for total activity percent and individual blocks
  • rocm-smi-libROCm System Management Interface Library
  • rog-control-centerApp to control asusctl
  • scrcpyDisplay and control your Android device
  • system-config-printerA CUPS printer configuration tool and status applet

Réseau et virtualisation 12

  • bridge-utilsUtilities for configuring the Linux ethernet bridge
  • dhcpcdDHCP/ IPv4LL/ IPv6RA/ DHCPv6 client
  • iptablesLinux kernel packet control tool (using nft interface)
  • net-toolsConfiguration tools for Linux networking
  • nmapUtility for network discovery and security auditing
  • openbsd-netcatTCP/IP swiss army knife. OpenBSD variant.
  • qemu-fullA full QEMU setup
  • qemu-imgQEMU tooling for manipulating disk images
  • qemu-system-x86QEMU system emulator for x86
  • sshpassFool ssh into accepting an interactive password non-interactively
  • virt-managerDesktop user interface for managing virtual machines
  • virt-viewerA lightweight interface for interacting with the graphical display of virtualized guest OS.

Traitement audio (LV2) 5

  • 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

Tous les réglages appliqués

Installation (Calamares, préréglé)

  • Partitionnement : effacement du disque, ext4
  • Amorçage : systemd-boot
  • Bureau : KDE Plasma
  • Fuseau : Europe / Paris
  • Dépôt Chaotic-AUR ajouté avant l'installation des paquets

Fichiers de défaut livrés par l'ISO

  • /etc/mkinitcpio.conf.d/10-affutos.conf — initramfs sans plymouth
  • /etc/sdboot-manage.conf.d/20-affutos.conf — options du noyau
  • /etc/xdg/ksmserverrc et /etc/xdg/dolphinrc — défauts KDE pour tous les comptes
  • /etc/skel/ — dossiers utilisateur, réglages Dolphin, pré-amorçage Steam
  • /usr/share/libalpm/hooks/zz-affutos-branding.hook — l'identité AffûtOS survit aux mises à jour

Système

  • Disposition clavier propagée à Wayland via XKB_DEFAULT_LAYOUT
  • amdgpu.ppfeaturemask=0xffffffff — contrôle complet du GPU AMD (nécessaire à LACT)
  • Entrée d'amorçage UEFI « AffûtOS » créée sans doublon, disque détecté à l'exécution

Bureau KDE

  • Ouverture au double-clic plutôt qu'au simple clic
  • Session vierge à l'ouverture — aucune fenêtre restaurée
  • Dolphin : barre de menu visible, fichiers cachés affichés, vue Détails appliquée à tous les dossiers
  • Raccourcis placés directement dans le dossier personnel, sans sous-dossier Bureau

Steam et mode jeu

  • Pourcentage de batterie affiché en permanence
  • Aucune atténuation de l'écran sur secteur (IdleBacklightDimACSeconds = 0)
  • Aucune mise en veille sur secteur (IdleSuspendACSeconds = 0)
  • Interface en français
  • Assistant de premier démarrage pré-rempli par le fichier prévu par Valve
  • Canal bêta activé

Après l'installation, sans intervention

  • Decky Loader installé et activé avant le premier démarrage
  • Les 96 paquets ci-dessus installés depuis les dépôts et l'AUR
  • Eden (émulateur Switch) : dernière version optimisée pour le processeur détecté
  • Aucun droit temporaire laissé derrière — sudoers, unités et jalons nettoyés

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 est réinstallable par un seul script

Outils du quotidien

  • Konsole et bash — l'essentiel du travail
  • Dolphin, barre de menu visible et fichiers cachés affichés
  • Firefox Developer Edition
  • 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 pour les jeux Windows
  • Eden (Switch), Cemu (Wii U), PCSX2 (PS2)
  • BoilR pour les jaquettes des jeux hors Steam

Journal technique

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

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.