site web forum documentation

CLUB1.FR

🇬🇧

Migration de Ubuntu à Debian (Phase 1)

Premier récit d'une migration épique

Cet article est le premier d'une série de trois. Il raconte la première phase d'une migration de la distribution Linux utilisé sur le serveur CLUB1, ainsi que les raisons qui ont motivé cette opération.

Un peu de contexte

Pour rappel, l'infrastructure de CLUB1 est basée sur un serveur unique, auto-hébergé à Pantin (enfin en ce moment à Romainville). Dans une optique de simplicité et de retour au sources, aucune virtualisation n'est mise en œuvre. Il n'y a donc pas d'hyperviseur, de machines virtuelles, ni même de conteneurs. Le système d'exploitation est ainsi directement installé sur la machine physique et les programmes au niveau du système, à l'aide du gestionnaire de paquets intégré.

Cette simplicité a, entre autres, l'avantage de mieux transmettre la sensation d'ordinateur partagé que l'on met en avant, car les ressources de la machine sont réellement mises en commun entre tous les membres et services, au lieu de segmenter et séparer les utilisateurs dans des boites qui ne peuvent pas influer l'une sur l'autre comme le font les techniques de virtualisation. On se rapproche en se sens de l'esprit du tildeverse, comme on peut le lire sur tilde.club (le serveur à l'origine de ce courant) :

tilde.club is not a social network it is one tiny totally standard unix computer that people respectfully use together in their shared quest to build awesome web pages


tilde.club n'est pas un réseau social c'est un petit ordinateur unix totalement standard que les gens utilisent respectueusement ensemble dans leur quête commune de farication de superbes pages web

L'une des conséquences de ce mode de fonctionnement est que l'administration du système devient plus fortement dépendante du système d'exploitation utilisé et plus particulièrement de la distribution Linux.

Une distribution Linux [...] est un ensemble cohérent de logiciels, la plupart étant des logiciels libres, assemblés autour du noyau Linux, et formant un système d'exploitation pleinement opérationnel.

Liste des distributions Linux Une distribution apporte de nombreux avantages. Elle fournit notamment des logiciels compatibles entre eux, c'est-à-dire qu'en mettant à jour le système, on ne risque pas de se retrouver avec des versions incompatibles. Cela permet également de mettre en commun les dépendances de tous ces logiciels. En plus de ça, les mainteneurs d'une distribution se chargent d'appliquer les correctifs de sécurité au plus vite. La charge de maintenance des administrateurs système s'en trouve ainsi nettement réduite.

Bien que souvent proches, les différentes distributions Linux existantes ne sont pas compatibles entre elles. La pile logicielle utilisée est souvent légèrement différente, les fichiers de configuration ne se trouvent pas forcément exactement au même endroit, etc. Passer de l'une à l'autre demande donc toujours d'adapter plus ou moins la configuration du système en fonction de leur éloignement.

Le graphe ci-contre (cliquer pour voir en taille réelle) représente l'ensemble des distributions Linux et leurs liens de parenté. Un arbre (ou plutôt une forêt) phylogénique pourraient dire les biologistes. Plus les branches divergent, plus il risque d'y avoir des différences entre elles.

Pourquoi faire cette migration ?

La distribution utilisée jusqu'à maintenant chez CLUB1 est Ubuntu. Elle est souvent recommandée pour les débutants car simple à installer et très répandue, ce qui permet de facilement trouver des infos en cas de pépin. Elle est directement issue de Debian, l'une des trois premières distributions Linux, elles ont donc un grand nombre de points communs. Une différence notable entre Ubuntu et Debian est que la première est dirigée par une entreprise, tandis que la seconde est entièrement communautaire, il s'agit donc d'un projet qui résonne mieux avec notre démarche.

Connaissant bien Debian du fait qu'il l'utilise tout les jours sur son PC, Nicolas, administrateur système de CLUB1, a pu petit à petit noter les différences avec Ubuntu. Hors, ses goût allaient en général pour les parti-pris de Debian, ce qui lui donne envie de les retrouver sur le serveur. Voici les avantages qu'il y trouve :

  • Le gros du travail est réalisé en amont par la communauté de Debian. C'est donc là qu'on peut suivre le travail des nombreux mainteneurs.
  • Toutes les informations et prises de décision sont publiques et les différents outils Web sont plus détaillés et plus agréables à utiliser que leurs équivalents sur Ubuntu (tracker, manpages, security-tracker, etc.).
  • Il n'y a pas besoin de "compte Debian" pour intéragir avec les différents mainteneurs (report de bugs, questions, etc.), une simple adresse email suffit.
  • Ubuntu pousse de plus en plus son propre gestionnaire de paquets Snap qui va à l'encontre des principes d'empaquetage Debian.
  • La séparation entre les dépôts libres et non-libres est plus claire.

Étapes de la migration

Cette migration a été découpée en trois grandes étapes afin de la rendre plus appréhendable :

  1. Merge du dossier de configuration (/etc/) :

    Ubuntu et Debian sont deux distributions Linux très proches, mais simplement copier l'ancien dossier de configuration de l'une a l'autre ne produirait pas le résultat attendu, car l'idée en faisant cette migration est de se rapprocher le plus possible d'une Debian pure, pas de se retrouver avec un genre de FrankenDebian. Le plan est donc de fusionner les deux dossiers de configuration, en ne gardant de l'ancien que les configurations spécifiques à CLUB1 et en se débarrassant des modifications d'Ubuntu. Pour cela nous allons tirer parti de Git car ce dossier est déjà versionné à l'aide de etckeeper.

  2. Tests de restauration de sauvegarde :

    Une fois le dossier de configuration proprement fusionné, la suite du plan consiste à restaurer le reste des sauvegardes directement sur le nouveau système. Afin de s'assurer que tout se passera bien au moment de réaliser cette opération en production, nous ferons des tests de restauration en amont. Ce sera d'ailleurs l'occasion de vérifier que l'on est bien capable de restaurer les sauvegardes automatiquement sur un nouveau système car ce test n'a pas encore été réalisé.

  3. Migration en production :

    Normalement, une fois que les deux premières étapes sont passées, il ne reste plus grand chose à faire, si ce n'est la véritable migration. Comme le terrain aura été bien préparé il ne devrait pas y avoir trop d'imprévus, mais on ne sait jamais ... il se peut donc que ça soit plus compliqué que prévu. Il y aura de toute façon une interruption de service dont nous communiquerons la date en avance (dans l'article de la phase 2).

L'avancée globale peut être suivie sur le fil #9 du forum.

Récit de la première étape

Le dossier /etc/ contient l'ensemble des configurations du système. On peut séparer les fichiers de configuration en deux grandes catégories :

  • Ceux qui sont gérés par le gestionnaire de paquet (apt dans notre cas) et qui sont installés en même temps que les logiciels. Il est tout de même possible de les éditer, mais cela risque de créer des conflits lors des mises-à-jour.
  • Les autres, ceux que les administrateurs système ajoutent eux-même. Les distributions prévoient en général un dossier ***.d pour chaque logiciel dans lequel il est possible d'ajouter ses propres fichiers de configuration. Ces fichiers ne risquent pas de générer de conflit.

Entre Ubuntu et Debian, c'est parmi la première catégorie de fichiers de configuration qu'il peut y avoir des différences. Le but de ce merge est dans un premier temps d'identifier et d'annuler ces différence-ci, pour ne garder que les configurations vraiment propres à CLUB1.

L'idée pour ce faire, est d'utiliser la fonctionnalité de merge de Git avec l'option --allow-unrelated-histories qui permet de fusionner deux dossier similaires tout en identifiant les conflits. En installant tous les logiciels utilisés par CLUB1 sur une installation fraîche de Debian, on obtient dans le dossier /etc/ les configurations d'origine de la distribution. C'est ce dossier qui va servir de base pour la fusion. La dernière piece manquante est la liste des paquets installés. Celle-ci ne fait (pour le moment) pas partie des sauvegardes, car elle ne se trouve pas dans le dossier de configuration. Il est prévu de l'ajouter dans les sauvegardes qui suivront la migration.

Récupérer la liste des paquets installés

Sur Debian et ses dérivées, les paquets installés peuvent se diviser en deux catérogies (encore ! 😅) :

  • Ceux qui sont installés manuellement, parce qu'explicitement demandés par les administrateurs système.
  • Ceux qui le sont automatiquement, parce qu'ils sont requis par des paquets installés manuellement. Ce sont les dépendances.

Les seuls qui nous intéressent sont ceux qui sont installés manuellement. Les dépendances seront de toute façon installées automatiquement et il est aussi possible qu'elles changent entre les différentes versions. Pour récupérer cette liste des paquets installés manuellement on utilise la commande suivante.

apt-mark showmanual > packages.txt

Et pour les installer sur le nouveau système :

sudo apt update
cat packages.txt \
| xargs sudo DEBIAN_FRONTEND=noninteractive apt install --no-install-recommends -y

Mais cette liste est encore incorrecte. Elle contient notamment certains paquets propres à Ubuntu, qui ne sont pas présents dans Debian. Certains paquets ont également changé de nom. On reçoit donc plusieurs erreurs de ce style :

E: Unable to locate package apport-symptoms
E: Package 'busybox-initramfs' has no installation candidate
Note, selecting 'libcom-err2' instead of 'libcomerr2'
Note, selecting 'libgcc-s1' instead of 'libgcc1'
...

Une fois la liste nettoyée de ces paquets incorrects, on obtient une liste réellement installable, mais elle peut encore être améliorée. En effet lors de l'installation on obtient ce genre de messages :

...
openssh-server is already the newest version (1:8.4p1-5+deb11u1).
openssh-server set to manually installed.
openssh-sftp-server is already the newest version (1:8.4p1-5+deb11u1).
openssh-sftp-server set to manually installed.
...

On remarque que certains paquets ont été installés en mode manuel alors qu'ils n'auraient pas dû. C'est une erreur qui a été faite à cause d'un manque d'expérience lors d'une mise-à-jour du système. Pour nous en débarrasser, une passe de filtrage supplémentaire est réalisée à partir de ces messages d'erreur et de quelques commandes awk et grep.

Finalement la liste est réduite à son stricte nécessaire. Et on peut l'installer, toujours avec la même commande, pour obtenir un dossier /etc/ contenant toutes les configurations d'origines de Debian de l'ensembles des paquets utilisés chez CLUB1.

La fusion

Vient enfin le moment du merge tant attendu. Comme dit précedemment, celui-ci se fait à l'aide de Git. Voilà ci-dessous un script commenté présentant les différentes étapes de cette fusion.

git remote add ubuntu nicolas@club1.fr:etc.git
git remote update
git merge --allow-unrelated-histories ubuntu/master
git mergtool                                  # résolution des confilts
git clean -i                                  # suppression des fichiers *.orig créés par nvimdiff
git reset                                     # unstage tout
git rev-parse ubuntu/master > .git/MERGE_HEAD # restauration de l’info de merge après le reset
git add -u .                                  # ajout des fichiers modifiés uniquement
git add -N .                                  # indique à git qu’on compte ajouter le reste des
                                              # fichiers à l’index, pour pouvoir add en interactive
git add -p .                                  # add interactif
git merge --continue                          # finalisation du merge
git reset --hard                              # suppression des modifications non voulues
etckeeper init                                # mise à jour des fichiers de etckeeper

Bien que le nombre de fichiers en conflit fût très élevé (581), l'utilisation combinée de Git en mode intéractif et vim en tant que mergetool ont rendu cette tâche relativement agréable. Le fait de pouvoir le faire tranquilement en amont a aussi permis de bien prendre le temps de résoudre tous ces conflits.

merge conflit
L'étape de merge avec Neovim en tant que mergetool. La plupart du temps les conflits sont assez simples à résoudre, puisqu'on veut généralement la configuration de Debian. Ils sont donc souvent expédiés à grand coups de :diffget LO pour utiliser le contenu du fichier local.
merge symlink
Avec git mergetool, lorsqu'il y a un conflit avec un lien symbolique, il faut simplement choisir la destination que l'on préfère, ici celle de Debian, on utilise alors l pour "local".
merge ajout
Une fois les conflit résolus, vient alors le tour de git add en mode interactif. De cette manière, Git affiche les patchs avant de nous demander ce que l'on veut en faire. Ici il s'agit du fichier d'entête de CLUB1 pour le MOTD. On veut évidemment le garder donc y pour "yes".

Après avoir vérifié 581 fichiers en conflits et pas loin de 900 fichiers ajoutés, On se retrouve finalement avec 275 nouveaux fichers à conserver, 82 fichiers modifiés et 622 fichiers supprimés. Ça fait un bon petit nettoyage des anciennes configurations du serveur. Reste encore à vérifier que ça fonctionne. 🤓 Mais l'un des énormes avantages de cette technique de fusion est justement que tous les fichiers sont conservés dans l'historique de Git, ainsi que l'ensemble des modifications précédentes (824 commits). Si on se rend compte plus tard que l'un d'entre eux était en fait nécessaire il nous suffira de retourner l'y chercher.

merge résumé
Le gratifiant résumé de la fusion, obtenu grâce à git log --graph, qui nous montre les deux historiques séparés (lignes verte et rouge) se rejoignant en un commit de merge.

Nous voilà enfin avec un dossier de configuration /etc/ contenant les configurations spécifiques à CLUB1 tout en restant le plus proche possible d'une Debian pure et en conservant l'historique des modifications effectuées précédemment. Nous sommes fins prêts pour la suite de l'aventure : les tests de restauration de sauvegardes.

Félicitation pour avoir lu ce (trop ?) long article jusqu'au bout et à bientôt pour le résumé de la phase 2 ! 😎


Tous les articles de cette migration

Cet article à été consulté 1653 fois