Aller au contenu

Mettre à jour Debian 12 vers Debian 13 (trixie)

Christophe TREMBLAY-GUILLOUX
Christophe TREMBLAY-GUILLOUXIngénieur système Linux

Mettre à jour Debian 12 vers debian 13 n'est généralement pas compliquée si vous avez déjà une installation de debian 12 propre et entièrement maîtrisée. Dans ce mémo (que je consulte moi-même), nous allons voir les principales étapes de migration.

Si vous souhaitez maximiser la stabilité un peu plus, je vous conseille d'attendre la version 13.1 qui sortira peu de temps après la version 13.0, un samedi.

Toutes les commandes sont lancées en tant que root au travers de la console KVM du serveur ou à travers l'accès SSH. Ne faites pas de sudo ridicule, passez root.

Pourquoi migrer vers Debian 13 (sans précipitation) ?

Section intitulée « Pourquoi migrer vers Debian 13 (sans précipitation) ? »

Vous utilisez un serveur Debian pour héberger WordPress par exemple.

Celui-ci nécessite PHP mais est conçu pour la version de PHP la plus utilisée du moment. Vous devez donc suivre les versions pour ne pas être bloqué dans les mises à jour, un jour ou l'autre.

Debian apporte une amélioration de performances (nouveau scheduler, http/3,…)

Vous verrez de plus en plus de documentations en ligne faisant référence à Debian 13 et de moins en moins à Debian 12. Donc pour pouvoir s'y fier et être en phase, vous devez suivre. Je dirais aussi la même chose pour ceux qui tentent de résister à utiliser systemd à la place de initrd.

Abracadabra !

  • Disparation des commandes last, lastb et lastlog ! (Si vous les utilisiez dans un script par exemple).

  • Arrêt critique de votre serveur MariaDB et redémarrage impossible : vérifier que votre serveur MariaDB démarre correctement sans erreur avant de mettre à jour Debian car la réparation est impossible si la version de MariaDB change !

  • Si vous avez des dépôts externes (non officiels), sachez qu'ils seront probablement désactivés et vos paquets spécifiques peuvent être downgradés ou désinstallés.

Une mise à jour peut mal se passer, détruire des données, rendre le serveur non bootable.

Je sauvegarde les serveurs via BackupPC, RCLONE et snapshot (oui, les 3 systèmes). Les bases de données doivent sauvegardées par export en SQL avant toute sauvegarde de fichier.

Vérifiez que votre système est bien sauvegardé.

Que les sauvegardes sont distantes.

Faites un snapshot en plus si c'est une machine virtuelle.

Prévoyez du temps en cas de problème pour réparer.

Soyez capable de faire un redémarrage en mode rescue.

Normalement, votre serveur est déjà à jour car vous êtes consciencieux sinon il faut absolument être à jour avant :

bash
apt update
apt upgrade
reboot # si nécessaire

Si vous utilisez Puppet, stoppez-le. Il faudra vérifier les recettes pour la nouvelle version du système.

bash
systemctl stop puppet

Si vous avez installé des paquets non officiels, il faut les enlever. Vous les remettrez plus tard (s'ils fonctionnent encore).

Pour trouver ces paquets, utilisez ces commandes :

bash
apt-get -s purge '?and(?installed,?not(?any-version(?origin(Debian))),?not(?name(puppet-agent)))'

Si la liste des paquets à purger semble correcte alors on l'applique :

bash
apt-get purge -y '?and(?installed,?not(?any-version(?origin(Debian))),?not(?name(puppet-agent)))'

On efface le paquet puppet sans purger :

bash
apt remove puppet-agent

Un paquet obsolète est encore installé mais n'existe plus dans les dépôts. Debian arrête son suivi de sécurité environ un an après la sortie de trixie.

On regarde d'abord la liste :

bash
apt list '?obsolete'

Relisez-la avant de purger : un paquet que vous avez installé vous-même depuis une source externe apparaît ici aussi.

bash
apt purge '?obsolete'

6. Supprimez les résidus de fichiers de configuration

Section intitulée « 6. Supprimez les résidus de fichiers de configuration »

On vérifie quels fichiers d'exemple de configuration à supprimer.

bash
find /etc -name '*.dpkg-*' -o -name '*.ucf-*' -o -name '*.merge-error'

Puis on efface réellement si tout est bon :

bash
find /etc \( -name '*.dpkg-*' -o -name '*.ucf-*' -o -name '*.merge-error' \) -type f -delete

Vérifiez le fichier ou le répertoire /etc/apt/preferences ou /etc/apt/preferences.d

Ils servent à épingler des versions paquets. Vérifiez ce qui doit être fait mais il probable qu'il faille désactiver ces fichiers.

On ne doit avoir aucun paquet dans un état d'installation non terminé ou autre :

bash
dpkg --audit

Un paquet gelé (hold) est maintenu à sa version actuelle et refuse de monter. La liste doit être vide avant la migration, sinon la mise à jour s'arrête sur un conflit de dépendances difficile à lire.

bash
apt-mark showhold

Levez le gel de ce qui remonte, sauf si vous avez une raison précise de le garder :

bash
apt-mark unhold <paquet>

Dans les fichiers /etc/apt/sources.list ou /etc/apt/sources.list.d/*, remplacez bookworm par trixie et normalement vous obtenez :

deb http://deb.debian.org/debian trixie main contrib non-free non-free-firmware
deb http://deb.debian.org/debian trixie-updates main contrib non-free non-free-firmware
deb http://security.debian.org trixie-security main contrib non-free non-free-firmware

IMPORTANT : le nom à mettre est deb.debian.org qui est un nom qui va pointer automatiquement vers le dépôt le plus proche.

Ou se placer dans le répertoire et remplacer bookworm par trixie en une seule commande :

bash
sed -i 's/bookworm/trixie/g' *.list

Debian 13 attend ses sources dans /etc/apt/sources.list.d/debian.sources, au format deb822 : une strophe par dépôt, un champ par ligne. Le format historique sur une ligne continue de fonctionner, mais un fichier .sources n'a pas d'extension .list, donc la commande sed ci-dessus ne le touche pas. Vérifiez que le répertoire n'en contient pas avant de conclure que vos sources sont à jour.

Les mêmes dépôts que ci-dessus, en deb822 :

/etc/apt/sources.list.d/debian.sources :

Types: deb
URIs: https://deb.debian.org/debian
Suites: trixie trixie-updates
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Types: deb
URIs: https://security.debian.org/debian-security
Suites: trixie-security
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

Un même dépôt ne doit être déclaré qu'une fois. Si vous créez ce fichier, videz ou supprimez l'ancien /etc/apt/sources.list.

11. Mise à jour de la liste des paquets disponibles

Section intitulée « 11. Mise à jour de la liste des paquets disponibles »
bash
apt update

12. Contrôle de l'espace disque avant mise à jour

Section intitulée « 12. Contrôle de l'espace disque avant mise à jour »
bash
apt -o APT::Get::Trivial-Only=true full-upgrade
[ ... ]
XXX upgraded, XXX newly installed, XXX to remove and XXX not upgraded.
Need to get xx.xMB of archives.
After this operation, AAAMB of additional disk space will be used.

S'il n'y a pas assez de place, il va s'afficher ce message :

E: You don't have enough free space in /var/cache/apt/archives/.
bash
apt clean
apt --purge autoremove

Le métapaquet du noyau (linux-image-amd64 sur un serveur 64 bits classique) suit automatiquement les versions du noyau. Sans lui, la mise à jour laisse l'ancien noyau en place et le serveur redémarre dessus.

bash
dpkg -l 'linux-image*' | grep ^ii | grep -i meta

Si la commande ne renvoie rien, installez le métapaquet correspondant à votre architecture avant la mise à jour :

bash
apt install linux-image-amd64

Les deux commandes qui suivent durent longtemps. Lancées directement dans une session SSH, une coupure réseau les interrompt en plein travail et laisse le système à moitié migré. Une session screen ou tmux continue de tourner sur le serveur même si votre connexion tombe.

bash
apt install tmux
tmux new -s upgrade

Après une coupure, reconnectez-vous en SSH et reprenez la main :

bash
tmux attach -t upgrade

Depuis la console KVM, ce n'est pas nécessaire.

Ce processus permet de mettre à jour les paquets du système qui n'ajoutent pas de nouvelles dépendances sur de nouveaux paquets ou qui n'en enlèvent pas :

bash
DEBIAN_FRONTEND=noninteractive UCF_FORCE_CONFFOLD=1 NEEDRESTART_MODE=a apt -o Apt::Get::Assume-Yes=true -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" upgrade --without-new-pkgs
bash
DEBIAN_FRONTEND=noninteractive UCF_FORCE_CONFFOLD=1 NEEDRESTART_MODE=a apt -o Apt::Get::Assume-Yes=true -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" full-upgrade
apt --purge autoremove

Si tout s'est bien passé, il faut redémarrer le système.

En cas de problème, analysez la situation avant de faire un reboot.