From Fedora Project Wiki

Fedora Silverblue tente d'établir un système fonctionnel conciliant Fedora Workstation, la version bureautique de la distribution éponyme, et le projet Atomic. Cette déclinaison de Fedora commence à monter en puissance en terme de développements depuis quelques temps et nous réalisons que pour beaucoup de personnes extérieures ce projet reste très flou tant dans ses objectifs mais aussi sur les implications techniques.

L'objet de cet article est de retracer l'histoire rapidement de Atomic et Fedora Silverblue avant d'évoquer les détails de fonctionnement de celui-ci.

Avant Fedora Silverblue, émergea Fedora.next

Les fondements de Fedora Silverblue prennent racine dans la réflexion menée dans le cadre de Fedora.next, projet censé inscrire Fedora dans la durée après avoir fêté ses dix années. En effet, en 2013-2014, le projet Fedora s'est mis en pause technique pour réfléchir quant à son avenir, dans ce qu'elle souhaitait délivrer à ses utilisateurs tout en tirant un bilan de la situation actuelle. C'est pourquoi il y a eu près d'un an entre Fedora 20 et Fedora 21, au lieu des six mois habituels, pour dégager du temps et prendre du recul au sein du projet tout entier.

Le bilan

Le bilan dressé du développement d'une distribution est particulièrement critique. Il est particulièrement mis en exergue par le manque d'attrait des utilisateurs pour leur distribution, même en dehors de Fedora, et aussi certains défauts structurels quant à l'approche traditionnelle d'aborder la réalisation d'une distribution Linux.

Une distribution Linux classique génère et propose des paquets pour ses utilisateurs, afin qu'ils puissent installer les applications concernées en résolvant les dépendances nécessaires et à priori avec une intégration entre elles pour fournir une expérience utilisateur acceptable. Ensuite il y a deux modèles qui s'ajoutent à ce tableau. Le premier, plus répandu et employé par Fedora, Debian, Ubuntu ou Mageia est de proposer à une fréquence fixe une nouvelle version de leur système. Et très souvent, pour une version donnée de ces systèmes, les logiciels fournis sont comme figés. Les mises à jour concernent surtout les problèmes de sécurité ou la correction de bogues, plus rarement des versions qui apportent de nouvelles fonctionnalités. Pour obtenir des logiciels plus récents, il faut donc changer de version du système via une mise à niveau. Le second modèle, porté par ArchLinux et Gentoo par exemple, ne propose pas réellement de versions de leur système. Les logiciels sont continuellement mis à jour vers la dernière version.

Ce modèle a rarement été remis en cause. Il apporte en effet des avantages certains. Installer un paquet depuis les dépôts officiels est très simple et efficient pour l'utilisateur. La mise à jour est centralisée ce qui limite le temps de maintenance nécessaire à cette activité. Et au niveau de la sécurité et de l'économie de ressources cela est également le bienvenu car les logiciels peuvent partager des ressources en commun sans difficulté et il est inutile de maintenir plusieurs fois la même bibliothèque commune par exemple.

Mais ce modèle a également un revers pour l'utilisateur et la mise au point des distributions. Tout d'abord l'utilisateur est comme piégé par sa distribution. Il est très difficile d'installer en parallèle deux applications identiques de versions différentes. Et si on souhaite une version différente d'un logiciel que celle proposée par sa distribution, comme la dernière version de GNOME, ou la version précédente de Python, la distribution ne fournit rien pour répondre à ce besoin. L'utilisateur doit se débrouiller pour cette tâche ce qui est particulièrement peu flexible. Et au niveau de la fiabilité ou de la maintenance, cela est également plutôt complexe si on cherche à atteindre une certaine qualité. Les applications dans ce modèle ont accès à tout dans le système, et les opérations d'installation ou de mise à jour peuvent corrompre le système si une coupure de courant intervient au mauvais moment par exemple. Enfin, mettre à jour ou installer un paquet n'est pas anodin, il y a souvent exécution de scripts pour convertir des fichiers de configuration pour être compatible avec la nouvelle version, ou pour rendre ce dernier exploitable comme créer un utilisateur qui va exécuter le service nouvellement installé. Sauf que, chaque installation de Fedora est différente, les utilisateurs n'installent pas les mêmes logiciels et ne les utilisent pas de la même manière. Il faut donc que le mainteneur anticipe de nombreux problèmes potentiels liés à ces contextes très différents pour s'assurer que son paquet sera exploitable pour tous sans accrocs.

Or ces défauts sont très problématiques. En particulier à un moment où les logiciels disponibles pour Linux se multiplient et se développent un peu partout en étant pas fournis via la distribution mais par Github par exemple. D'autant plus que l'utilisateur est habitué des systèmes d'exploitation macOS et Windows où installer une nouvelle application est assez indépendante de la version du système qui l'exécute. En plus d'être capable d'installer plusieurs versions en simultané s'il le souhaite. Et force est de constater qu'aucun système Linux populaire, en dehors d'Android, n'a réellement mis les moyens de changer ce modèle en profondeur.

Enfin, récemment il y a eu l'émergence d'autres systèmes de gestionnaires de paquets qui forment des écosystèmes indépendants des distributions. On peut évoquer en premier lieu les langages de programmation qui proposent des modules facilement téléchargeables pour les développeurs comme Python avec pip, Ruby avec gem, Go, Rust ou PHP. De plus, certaines applications ont leur propre écosystème d'extensions comme Firefox ou GNOME Shell et les paquets peuvent être redondants avec cette infrastructure.

L'architecture envisagée

Pour résoudre ce problème, en découplant la base du système des applications, Fedora.next a exploré l'idée de transformer Fedora en un système avec trois couches de logiciels.

La première couche est une base qui se veut très minimale et comporte à peine ce qui est nécessaire pour avoir un système fonctionnel. Cela concerne la gestion du matériel via le chargeur de démarrage et du noyau, les bibliothèques essentielles comme la bibliothèque C, de quoi gérer des paquets et de démarrer des services comme systemd. Guère plus.

La seconde couche concerne plutôt les piles technologiques qui sont également assez essentielles au fonctionnement du système et de la plupart des applications. C'est là qu'on retrouvera la plupart des bibliothèques très importantes, mais surtout les langages de programmation et leur écosystème comme Python, Ruby, PHP, Perl, etc.

Enfin, la dernière contient les applications elles-mêmes avec éventuellement une séparation entre les environnements de bureaux comme GNOME, KDE / Plasma ou Xfce des autres applications.

Brouillon d'architecture pour Fedora.next

La mise en œuvre

Le projet Fedora développa plusieurs solutions dans ce cadre. La première est la création immédiate des produits, à savoir Fedora Workstation, Server et Cloud à l'époque. Le but était de fournir une expérience par défaut qui corresponde au mieux à ces différents cas d'usage, que ce soit par les paquets fournis par défaut, les options ou configurations natives. Mais aussi, cela permettait à Cloud d'expérimenter une architecture plus agressive et différente des deux autres : le projet Atomic que l'on abordera un peu plus loin.

Ensuite, le projet Fedora travailla sur le concept des modules. L'objectif est qu'une version de Fedora puisse installer plus facilement la version d'un composant de la seconde couche (les fameuses piles mentionnées plus haut) fournies par une autre version de Fedora. Cela permet donc d'utiliser par exemple la dernière version de Python même si on ne bénéficie pas de la dernière version de Fedora si on le souhaite. Le tout en passant par les dépôts de manière assez classique.

Malheureusement l'architecture envisagée permet difficilement l'installation simultanée de deux piles complètes en parallèle. À part le cas Python 2 et Python 3 qui a demandé un investissement important sur la durée pour l'autoriser, les dépôts traditionnels et les modules n'offrent que la possibilité d'installer une version de référence différente de celle proposée par défaut.

Le projet Atomic

Genèse

En 2014, le projet Atomic est lancé. Son but est d'essayer de simplifier l'usage des systèmes RHEL, CentOS ou Fedora au sein des conteneurs tels que Docker. Donc nous sommes plutôt dans un contexte cloud où les images sont minimales et gèrent peu de services à la fois. Pour monter en charge, il suffirait d'en instancier plus ce qui est intéressant si le système est fiable et minimal.

Cela passe par une refonte de la manière de concevoir ces systèmes. Jusqu'ici toute distribution Linux peut être résumée par l'architecture tout est paquets. Chaque logiciel ou composant est fourni à travers un paquet. La cohérence et le fonctionnement de l'ensemble repose donc sur le gestionnaire de paquets et les liens de dépendances définis au sein de chacun.

Atomic repousse ce modèle traditionnel, du point de vue utilisateur du moins, avec le composant rpm-ostree et le système qui est considéré comme un tout unifié avec la possibilité de réaliser des mises à jour atomiques. Il faut voir rpm-ostree comme un gestionnaire de versions (un outil similaire à git par exemple) pour des binaires. Ce système de fichiers de base du système sera versionné comme un code sous git. Chaque mise à jour de ce dernier sera vu comme un commit.

En cela il s'inspire du projet NixOS pour refaire les fondations d'une distribution. Mais NixOS a une approche différente, tandis que Atomic privilégie l'approche commit / déploiement, NixOS repose sur des sommes de contrôles et des chemins dans la définition des paquets. L'inconvénient est qu'une modification dans une dépendance majeure du système, comme glibc, implique de régénérer l'ensemble des paquets qui en dépendent alors que la compatibilité n'a pas été changée au niveau de l'ABI. L'approche d'Atomic permet d'éviter cet écueil. Atomic peut également être utilisé par n'importe quel outil capable de générer un système de fichiers alors que NixOS requiert des outils et un langage spécifique.

Différences avec une distribution traditionnelle

La conséquence évidente c'est que la notion de paquets disparaît pour l'utilisateur, le système de base est un tout indivisible et chaque composant est lié aux autres. Une mise à jour d'un élément dans ce système de base entraîne une mise à jour de l'ensemble. Heureusement grâce aux delta entre chaque version seulement ce qui a différé est réellement téléchargé et appliqué en cas de mise à jour. Sur une distribution plus classique, chaque paquet est mis à jour de manière indépendante les uns des autres. Cela est fait à travers la commande rpm-ostree upgrade qui regarde dans le dépôt où est versionné l'image pour récupérer la dernière version publiée.

Un avantage immédiat est que l'ensemble est standardisé. Chaque poste qui disposera de la version X de l'image Atomic considérée sera identique aux autres du point de vue du système de base. Avec la méthode plus traditionnelle de faire, pour différentes raisons, cela n'est pas forcément le cas. Certains ne mettent pas tous les paquets à jour ou à la même fréquence. Les mises à jour n'ont pas lieu forcément dans le même ordre ou certains peuvent sauter des transitions intermédiaires dans le processus. Ce nouveau procédé améliore la reproductibilité et aussi la fiabilité car les tests d'assurance qualité reproduisent de fait le comportement de toutes les images en production.

L'autre intérêt est également le versionnage même du système. Si la mise à jour pose problème, revenir en arrière est simple et immédiat car il suffit de sélectionner la révision antérieure dans l'outil de gestion (comme la commande rpm-ostree rollback voire le chargeur de démarrage lui même). Avec un système de paquets c'est souvent une étape bien plus complexe à réaliser et coûteuse à base de clichés du système. Et en cas de coupure de courant au mauvais moment, le système Atomic sera toujours opérant comme avant alors que l'état d'un système plus traditionnel sera plus aléatoire voire non fonctionnel.

Changer par ailleurs de version est relativement immédiat et complet. Le démarrage sélectionne la version désirée, la déploie et l'ensemble des paquets sont à jour ensemble. Cela évite les possibilités d'incohérence que l'on peut avoir habituellement, si on redémarre une application en cours de mise à jour par exemple alors que potentiellement d'autres composants ne le sont pas encore.

Enfin, cela permet d'envisager d'aller plus loin. Comme le système de base est réalisé en bloc, il est possible de rendre ce système de base en lecture seule. Cela signifie isoler les dossiers qui ne peuvent être changés que par rpm-ostree lors d'une mise à jour. Ces dossiers là seront en lecture seule pour limiter la possibilité d'écriture qu'à certains dossiers précis pour la configuration, les données ou ajouter des logiciels supplémentaires. Ainsi cette partie là du système est plus robuste car moins sensible aux accidents ou aux actes malveillants.

De manière plus concrète, les dossiers /etc et /var sont les seuls dossiers accessibles en lecture et écriture. Ils sont préservés en cas de mise à jour. En cas de modification de la configuration d'un logiciel dans /etc, ostree applique le 3-way merge pour fusionner vos modifications avec ceux fournis par la mise à jour. /var peut être utilisé pour reproduire une hiérarchie FHS traditionnelle si nécessaire exploitable via chroot ou similaire.

Personnaliser le système

Se pose la question de la personnalisation du système. Comment faire dans ce cas pour ajouter un nouveau service dans une image ?

La première solution est de générer cette image personnalisée soi même. rpm-ostree n'a pas de notion de paquets mais on peut générer une image OSTree avec des paquets, donc à partir d'une image classique de Fedora par exemple.

Ensuite, c'est d'installer un nouveau composant sous forme d'une surcouche au système de base. Par exemple exécuter la commande rpm-ostree install toolbox va récupérer l'image produit par le paquet toolbox et le déployer par dessus celui du système de base. Il suffit de générer le système de fichiers voulu avec les logiciels souhaités avant de déployer l'ensemble et de maintenir les mises à jour soi même.

Sinon la philosophie de cette architecture est de recourir à des conteneurs pour isoler au mieux les applications personnelles et faciliter la maintenance et le déploiement.

Mise en œuvre dans Fedora

Dès 2014, Fedora va travailler pour proposer une image de sa version cloud minimale reposant sur le projet Atomic. Très rapidement cette implémentation va devenir celle par défaut car elle correspond bien au but même de produit.

Fedora Silverblue

Naissance du projet

Devant les promesses du projet Atomic, les réflexions de Fedora.next et la transition réussie pour Fedora Cloud, l'idée émerge de réaliser Fedora Workstation avec le projet Atomic en marge du projet Fedora dans un premier temps. En revenant dans le giron de Fedora, l'équipe a décidé de renommer le projet en Fedora Silverblue en 2018 pour donner plus de visibilité à ce projet de long terme tout en le distinguant de Fedora Atomic qui est associé à Fedora Cloud.

L'objectif est évidemment de fournir les avantages cités lors du traitement du projet Atomic mais pour l'image phare de Fedora. Les avantages étant les mêmes, nous n'allons pas les énumérer à nouveau pour plutôt évoquer les difficultés et le travail qui reste à fournir. Et l'avenir éventuel de ce projet.

Il est évident que la conception du projet Atomic colle parfaitement avec les exigences d'une image minimale telle que Fedora Cloud. Pour Workstation cela est plus complexe. Un utilisateur installe et configure beaucoup de logiciels différents. Cette combinaison est presque unique. Il est impensable d'avoir une image universelle qui contiendrait l'ensemble des logiciels pour chaque utilisateur avec une telle architecture. Et il est assez irréaliste d'exiger à un utilisateur commun de manipuler un outil tel que Docker pour parvenir à ses fins. Installer de nouveaux outils se fera par deux voies différentes.

Flatpak

La première repose sur Flatpak. Flatpak est un projet pour fournir un système de paquets dit universel dans un système isolé de bac à sable. Flatpak dispose de nombreux atouts dans ce contexte.

Pour commencer, il autorise l'installation de logiciels par des utilisateurs normaux simplement, sans droits super-utilisateur contrairement à un paquet d'une distribution traditionnelle. Car le logiciel s'installe dans le répertoire de cet utilisateur par défaut.

Ensuite, à cause de l'isolation du logiciel et de l'universalité de la solution, il doit embarquer ses propres dépendances. Cela alourdi le paquet et complexifie la maintenance des bibliothèques très communes, mais un paquet Flatpak peut fonctionner sur n'importe quelle distribution et il est possible d'installer plusieurs versions d'un même logiciel en même temps ce qui donne plus de liberté à l'utilisateur.

Un autre aspect intéressant est le concept des portails. Comme les paquets Flatpak sont isolés du système, ils n'ont accès qu'à peu de choses par défaut. Ils ne peuvent lire les données dans vos répertoires personnelles par exemple. Pour que cela soit possible, les Flatpak vont utiliser des portails pour informer l'utilisateur que l'application a besoin de permissions spéciales pour effectuer une action comme prendre une capture globale de l'écran, accéder au réseau, accéder à la webcam, lire un fichier personnel, etc.. L'utilisateur peut librement autoriser ou non cette application à réaliser cette action à la volée. Ce fonctionnement ressemble au mécanisme de permissions des systèmes mobiles comme iOS ou Android. Cette architecture permet d'améliorer la sécurité en minimisant les droits des applications au strict nécessaire, en alertant l'utilisateur et limite les problèmes en cas de bogue de l'application.

Pour atténuer les inconvénients mentionnés précédemment, Flatpak fonctionne aussi avec des dépôts pour centraliser les mises à jour de l'ensemble de ses applications. Il dispose également de contextes d'exécution pour unifier les bibliothèques très communes et éviter que chaque application ne les embarque ou ne les mette à jour eux mêmes. Ces contextes d'exécution pouvant être installés en parallèle, on peut garder une application fonctionnelle même en cas de rupture de compatibilité entre deux versions d'un contexte d'exécution. La mise à jour par delta limite également le besoin en bande passante d'une mise à jour au strict nécessaire.

Cependant Flatpak ne concerne que les applications disposant d'une interface graphique. Or il y a d'autres composants qu'un utilisateur voudrait pouvoir installer sur sa Fedora Silverblue comme des outils de développement.

Fedora toolbox

C'est la deuxième voie pour installer des logiciels supplémentaires dans le système. Fedora toolbox repose sur buildah et podman qui est lui même un clone de Docker pouvant s'exécuter sans droits super-utilisateur.

Ainsi il devient possible d'installer facilement des conteneurs pour un utilisateur donné pour ses développements. On reprend les avantages cités plus haut en terme de sécurité, fiabilité ou encore de possibilité de manipuler des versions différentes d'un même composant. Ce qui est un besoin récurent en développement par ailleurs.

En fait cet utilitaire permet de créer un conteneur basé sur une version de Fedora de votre choix, avec une configuration par défaut pour que le partage avec l'hôte soit simple comme la correspondance des noms utilisateurs et des différents IDs. La base du conteneur peut être partagé entre les instances : deux conteneurs basés sur F31 ne requiert de télécharger qu'une fois cette base.

État du projet et avenir

Fedora Silverblue bénéficie d'un grand investissement et de grands progrès sont réalisés de version en version. Mais le projet est encore trop immature pour envisager de remplacer Fedora Workstation par défaut, car les difficultés à résoudre restent nombreuses.

En effet, le public de Fedora Workstation est très hétérogène et les besoins entre chaque utilisateur sont importants. Il faut s'assurer que l'ensemble des cas d'usages soient couverts malgré leur diversité. Et cela sans que le dit système soit plus complexe.

Pour l'instant l'intégration rpm-ostree, Flatpak et toolbox fonctionne plutôt bien. Pour des usages très simples et peu exotiques c'est un système qui peut être utilisable. Mais les usages plus complexes ou exotiques sont encore mal gérés.

Quelques exemples de problèmes à résoudre actuellement :

  • Le fonctionnement des environnements de développement dans un tel contexte ;
  • L'installation et l'usage de codecs multimédia additionnels ;
  • Certaines applications qui dépendant de pilotes spécifiques comme VirtualBox ;
  • Les extensions systèmes.

Mais ceci n'est qu'un aperçu des problèmes, il y en a bien d'autres dans le détail. Et même s'il y a une volonté de tous les résoudre, personne n'a la réponse de si Fedora Silverblue pourra réellement remplacer Fedora Workstation à terme. Du moins avec le respect complet de son architecture tel qu'il a été envisagé. Sans oublier les adeptes des distributions traditionnelles pour les avantages que cela leur procure.

L'équipe de Fedora Silverblue propose des versions majeures synchronisées avec le reste du projet. Donc si cela vous intéresse de tester la bête en vrai, n'hésitez pas !