Comment résoudre les erreurs de mise à jour et de mise à niveau d’Ubuntu : un guide de dépannage complet
Le système de gestion de paquets APT d’Ubuntu est l’un des plus fiables de l’écosystème Linux, mais il n’est pas à l’abri des pannes. Lorsque `apt-get upgrade`, `apt-get dist-upgrade` ou `do-release-upgrade` génère une erreur, la cause principale appartient presque toujours à l’une des cinq catégories suivantes : un index de paquets obsolète ou corrompu, des chaînes de dépendances non résolues, un fichier de verrouillage obsolète laissé par un processus planté, un espace disque insuffisant sur la partition racine, ou un paquet partiellement configuré laissé dans un état défaillant par une transaction précédente interrompue.
Ce guide fournit un flux de travail de diagnostic systématique, au niveau ingénieur, pour identifier et résoudre définitivement chaque catégorie majeure d’erreurs de mise à jour et de mise à niveau Ubuntu — y compris les cas particuliers que les tutoriels génériques manquent régulièrement.
Comprendre ce qui se passe réellement lors d’une mise à niveau Ubuntu
Avant d’exécuter des commandes aveuglément, il est utile de comprendre les mécanismes internes. Lorsque vous invoquez `sudo apt-get upgrade`, APT effectue une passe de résolution des dépendances sur le cache de paquets local situé dans `/var/lib/apt/lists/`. Si ce cache est obsolète, malformé ou désynchronisé avec les dépôts configurés dans `/etc/apt/sources.list` et `/etc/apt/sources.list.d/`, le résolveur échoue complètement ou propose un ensemble de paquets incohérent.
La couche dpkg sous-jacente à APT maintient sa propre base de données d’état dans `/var/lib/dpkg/`. Si une installation ou une mise à niveau précédente a été interrompue — par une coupure de courant, une déconnexion de session SSH ou un `Ctrl+C` manuel — dpkg peut laisser un ou plusieurs paquets dans un état `half-installed` ou `triggers-awaiting`. APT ne peut pas continuer tant que l’état de dpkg n’est pas propre.
Les cinq causes principales en un coup d’œil
| Cause principale | Symptôme | Correction principale |
|---|
| — | — | — |
|---|
| Index de paquets obsolète | « 404 Not Found » pour les URL de paquets | `apt-get update` |
|---|
| Dépendances défaillantes/non satisfaites | « Unmet dependencies » ou « held broken packages » | `apt-get install -f` |
|---|
| Fichier de verrouillage obsolète | « Could not get lock /var/lib/dpkg/lock » | Supprimer les fichiers de verrouillage manuellement |
|---|
| Espace disque insuffisant | « No space left on device » | Libérer de l’espace sur la partition `/` |
|---|
| Paquet partiellement configuré | « dpkg was interrupted » | `dpkg –configure -a` |
|---|
Solution 1 : Actualiser l’index des paquets et effectuer une mise à niveau complète
C’est la première étape correcte dans tout flux de travail de diagnostic. Exécutez toujours `update` avant `upgrade` — ils ne sont pas interchangeables.
“`bash
sudo apt-get update
sudo apt-get upgrade
“`
Ce que fait réellement chaque commande :
- `apt-get update` — Télécharge les métadonnées de paquets actualisées depuis chaque dépôt défini dans votre `sources.list`. Cela n’installe rien. Cela réécrit les fichiers d’index dans `/var/lib/apt/lists/`.
- `apt-get upgrade` — Résout et installe les versions plus récentes de tous les paquets actuellement installés. Il ne supprimera jamais un paquet installé ni n’en installera un nouveau pour satisfaire une dépendance — c’est une contrainte de sécurité délibérée.
Si `apt-get upgrade` est bloqué par des paquets nécessitant de nouvelles dépendances ou la suppression de paquets conflictuels, passez à :
“`bash
sudo apt-get dist-upgrade
“`
`dist-upgrade` utilise un résolveur plus agressif autorisé à installer de nouveaux paquets et à supprimer les obsolètes pour satisfaire le graphe de dépendances. C’est l’outil approprié pour les mises à niveau de versions mineures au sein de la même version Ubuntu (par ex., de 22.04.1 à 22.04.4).
Nuance importante : Sur les serveurs de production, examinez toujours le plan `dist-upgrade` avant de confirmer. Exécutez d’abord `apt-get dist-upgrade –dry-run` pour voir exactement ce qui sera installé, mis à niveau ou supprimé sans toucher au système.
Solution 2 : Corriger les dépendances défaillantes et non satisfaites
Un état de dépendance défaillant est l’une des raisons les plus courantes pour lesquelles les mises à niveau échouent en cours de processus. La correction canonique est :
“`bash
sudo apt-get install -f
“`
L’indicateur `-f` (`–fix-broken`) demande à APT de tenter de corriger un graphe de dépendances défaillant en téléchargeant et installant les dépendances manquantes, ou en supprimant les paquets qui ne peuvent pas être satisfaits. Une fois cette opération terminée, relancez la mise à niveau.
Quand `-f` ne suffit pas : Si vous avez installé manuellement des paquets `.deb` provenant de dépôts non officiels (pratique courante lors de l’installation de logiciels tiers), ces paquets peuvent épingler des dépendances à des versions spécifiques qui entrent en conflit avec les versions des dépôts. Identifiez-les avec :
“`bash
apt-cache policy <package_name>
dpkg -l | grep "^ii" | grep -v "^ii lib"
“`
Vérifiez les versions « Installed » et « Candidate ». Un paquet épinglé affichera un candidat inférieur à ce que propose le dépôt, ou aucun candidat du tout. Vous devrez peut-être supprimer le paquet conflictuel, terminer la mise à niveau, puis réinstaller une version compatible.
Solution 3 : Reconfigurer les paquets partiellement installés avec dpkg
Si une mise à niveau précédente a été interrompue, la base de données d’état de dpkg contiendra des paquets marqués comme `half-configured` ou `half-installed`. APT refuse de continuer jusqu’à ce que ceux-ci soient résolus.
“`bash
sudo dpkg –configure -a
“`
L’indicateur `-a` signifie « tous » — dpkg tentera d’exécuter les scripts de configuration post-installation (`postinst`) pour chaque paquet laissé dans un état incomplet. Cela résout souvent des erreurs telles que :
“`
dpkg was interrupted, you must manually run 'sudo dpkg –configure -a' to correct the problem.
“`
Faites immédiatement suivre cela d’une actualisation de l’index et d’une nouvelle tentative de mise à niveau :
“`bash
sudo apt-get update && sudo apt-get upgrade
“`
Cas particulier — base de données dpkg corrompue : Dans de rares scénarios, la base de données dpkg elle-même devient corrompue (le plus souvent après une défaillance du disque ou une erreur du système de fichiers). Les symptômes incluent `dpkg: error: parsing file '/var/lib/dpkg/status'`. La procédure de récupération implique la restauration à partir de la sauvegarde que dpkg maintient automatiquement dans `/var/backups/dpkg.status*`. Copiez la sauvegarde la plus récente sur le fichier d’état corrompu :
“`bash
sudo cp /var/backups/dpkg.status.0 /var/lib/dpkg/status
sudo dpkg –configure -a
“`
Solution 4 : Supprimer les fichiers de verrouillage obsolètes
APT et dpkg utilisent des fichiers de verrouillage pour empêcher des opérations de paquets simultanées de corrompre la base de données. Lorsqu’un processus détenant un verrou plante ou est tué, le fichier de verrouillage reste sur le disque. Toute invocation APT ultérieure échouera avec :
“`
E: Could not get lock /var/lib/dpkg/lock-frontend – open (11: Resource temporarily unavailable)
“`
Avant de supprimer les fichiers de verrouillage, vérifiez toujours qu’aucun processus légitime ne les détient :
“`bash
sudo lsof /var/lib/dpkg/lock-frontend
sudo lsof /var/lib/dpkg/lock
sudo lsof /var/cache/apt/archives/lock
“`
Si `lsof` ne retourne aucun résultat, le verrou est obsolète et peut être supprimé en toute sécurité :
“`bash
sudo rm /var/lib/dpkg/lock-frontend
sudo rm /var/lib/dpkg/lock
sudo rm /var/cache/apt/archives/lock
sudo dpkg –configure -a
sudo apt-get update
“`
Avertissement : Ne supprimez jamais les fichiers de verrouillage pendant qu’un processus `apt`, `apt-get`, `dpkg` ou `unattended-upgrades` est en cours d’exécution. Le faire sur un processus actif corrompra la base de données des paquets. Si `lsof` affiche un PID actif, attendez que ce processus se termine ou examinez pourquoi il est bloqué avant d’agir.
Solution 5 : Libérer de l’espace disque sur la partition racine
Les mises à niveau Ubuntu — en particulier les mises à niveau de versions majeures — nécessitent un espace libre substantiel sur la partition racine. Un point de défaillance courant est `/boot` qui se remplit d’anciennes images du noyau, bloquant entièrement l’installation d’un nouveau noyau.
Vérifiez l’utilisation actuelle du disque :
“`bash
df -h
“`
Vérifiez spécifiquement ce qui consomme de l’espace dans `/boot` :
“`bash
du -sh /boot/*
ls /boot/vmlinuz-*
“`
Procédure systématique de récupération d’espace :
“`bash
Remove packages installed as dependencies that are no longer needed
sudo apt-get autoremove –purge
Remove cached .deb files from the local package archive
sudo apt-get clean
Remove old kernel images (keeps the two most recent)
sudo apt-get autoremove –purge
“`
Si `/boot` est toujours plein après `autoremove`, identifiez et supprimez manuellement les anciens noyaux. Commencez par trouver le noyau en cours d’exécution pour ne pas le supprimer :
“`bash
uname -r
“`
Ensuite, listez les noyaux installés et supprimez explicitement les anciens :
“`bash
dpkg -l 'linux-image-*' | grep '^ii'
sudo apt-get purge linux-image-X.X.X-XX-generic
“`
Remplacez la chaîne de version par une version de noyau plus ancienne — jamais celle retournée par `uname -r`.
Si vous utilisez un environnement VPS Hosting avec une taille de partition racine fixe, ce scénario est particulièrement courant. Provisionner votre VPS avec une allocation de disque adéquate dès le départ — ou utiliser une partition `/boot` séparée — prévient entièrement cette catégorie de défaillance.
Solution 6 : Nettoyer les paquets redondants et le cache APT
L’accumulation du cache de paquets et des paquets orphelins dégrade à la fois les performances du système et la fiabilité des mises à niveau.
“`bash
sudo apt-get autoremove
sudo apt-get autoclean
sudo apt-get clean
“`
La distinction entre `autoclean` et `clean` :
- `autoclean` supprime les fichiers `.deb` mis en cache uniquement pour les paquets qui ne peuvent plus être téléchargés depuis les dépôts configurés (c’est-à-dire qu’ils sont obsolètes). Il conserve les fichiers mis en cache pour les paquets actuellement disponibles.
- `clean` supprime tous les fichiers `.deb` mis en cache sans condition, qu’ils soient encore disponibles ou non. Utilisez-le lorsque vous avez besoin de récupérer le maximum d’espace disque.
Sur les serveurs où l’espace disque est une ressource gérée — comme les Serveurs Dédiés exécutant plusieurs services — automatiser le nettoyage périodique du cache via une tâche cron ou un timer systemd est une bonne pratique opérationnelle.
Solution 7 : Résoudre manuellement les conflits de paquets spécifiques
Lorsque `apt-get upgrade` signale des conflits de paquets spécifiques plutôt qu’un échec général de dépendance, une intervention ciblée est nécessaire.
“`bash
sudo apt-get upgrade –fix-missing
“`
Cet indicateur demande à APT d’ignorer les paquets qui ne peuvent pas être récupérés (par ex., en raison d’un miroir temporairement indisponible) et de tout mettre à niveau. Il est utile lorsqu’un seul paquet indisponible bloque l’ensemble de la mise à niveau.
Pour supprimer et réinstaller un paquet conflictuel spécifique :
“`bash
sudo apt-get remove –purge <package_name>
sudo apt-get install <package_name>
“`
Utiliser `–purge` avec `remove` supprime à la fois les binaires du paquet et ses fichiers de configuration, ce qui est important lorsqu’un fichier de configuration corrompu est la source réelle du conflit.
Identifier la source exacte du conflit : Lorsqu’APT signale un conflit, le message d’erreur nomme généralement les paquets impliqués. Pour une analyse plus approfondie :
“`bash
apt-cache show <package_name>
apt-cache depends <package_name>
apt-cache rdepends <package_name>
“`
`rdepends` (dépendances inverses) vous montre quels autres paquets installés dépendent du paquet en question — information essentielle avant de supprimer quoi que ce soit.
Solution 8 : Effectuer une mise à niveau de version majeure avec do-release-upgrade
La mise à niveau entre les versions LTS d’Ubuntu (par ex., de 20.04 Focal à 22.04 Jammy, ou de 22.04 à 24.04 Noble) nécessite un outil dédié. Utiliser `apt-get dist-upgrade` seul pour une mise à niveau de version majeure n’est pas pris en charge et produira un système incohérent.
La procédure correcte :
“`bash
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get autoremove
sudo do-release-upgrade
“`
Pourquoi le `dist-upgrade` préalable à la mise à niveau est important : `do-release-upgrade` vérifie que votre système actuel est entièrement à jour avant d’initier la transition de version. Si vous avez des paquets bloqués ou des dépendances non résolues, il refusera de continuer. Exécuter `dist-upgrade` au préalable garantit une base propre.
Considérations spécifiques aux serveurs pour `do-release-upgrade` :
- Sur les serveurs sans interface graphique accessibles via SSH, exécutez toujours `do-release-upgrade` dans une session `tmux` ou `screen`. Si votre connexion SSH se déconnecte en cours de mise à niveau, le processus continue en arrière-plan plutôt que d’être tué, ce qui laisserait le système dans un état intermédiaire défaillant.
- Utilisez l’indicateur `-d` uniquement lors de la mise à niveau vers une version de développement (pas encore stable LTS). Pour les systèmes de production, n’utilisez jamais `-d`.
- L’outil vous invitera à examiner les modifications apportées aux fichiers de configuration modifiés par rapport à leurs valeurs par défaut. Lisez attentivement ces invites — accepter aveuglément la version du mainteneur peut écraser des configurations de serveur personnalisées.
“`bash
Start a persistent session before upgrading
tmux new -s upgrade
sudo do-release-upgrade
“`
Si vous gérez plusieurs serveurs Ubuntu — par exemple, une flotte d’instances VPS avec cPanel — testez d’abord le chemin de mise à niveau sur un nœud hors production. cPanel et les panneaux de contrôle similaires ont souvent des fenêtres de support de version Ubuntu spécifiques qui sont en retard par rapport au cycle de publication officiel.
Solution 9 : Résoudre les problèmes de dépôts tiers
Une cause fréquemment négligée des erreurs de mise à jour est un PPA (Personal Package Archive) ou un dépôt tiers défaillant ou incompatible. Lorsqu’un PPA est ajouté pour une version Ubuntu et que vous effectuez une mise à niveau vers la suivante, le PPA peut ne pas avoir de paquets pour le nouveau nom de code de version, ce qui provoque des erreurs de `apt-get update` telles que :
“`
E: The repository 'http://ppa.launchpad.net/…' does not have a Release file.
“`
Listez tous les dépôts configurés :
“`bash
ls /etc/apt/sources.list.d/
cat /etc/apt/sources.list
“`
Désactivez temporairement les PPAs problématiques en commentant ou en supprimant leurs fichiers `.list` dans `/etc/apt/sources.list.d/`, terminez la mise à niveau du système, puis réactivez-les ou remplacez-les par des versions compatibles avec la nouvelle version.
“`bash
sudo add-apt-repository –remove ppa:<ppa_name>/<ppa_name>
“`
Solution 10 : Redémarrer pour éliminer les interférences au niveau des processus
Certains échecs de mise à jour sont causés par un état en mémoire plutôt que par des problèmes au niveau du disque — par exemple, un service en cours d’exécution qui détient un descripteur de fichier sur une bibliothèque qu’APT doit remplacer, ou un module du noyau qui entre en conflit avec une version nouvellement installée.
“`bash
sudo reboot
“`
Après le redémarrage, exécutez la séquence de mise à jour complète depuis un état propre :
“`bash
sudo apt-get update && sudo apt-get upgrade
“`
Sur les serveurs distants où un redémarrage présente un risque opérationnel, utilisez `needrestart` pour identifier les services nécessitant un redémarrage sans redémarrage complet du système :
“`bash
sudo apt-get install needrestart
sudo needrestart
“`
`needrestart` inspecte les processus en cours d’exécution et identifie ceux utilisant des bibliothèques partagées obsolètes, vous permettant de redémarrer uniquement les services affectés plutôt que l’ensemble du système.
Prévenir les erreurs de mise à jour Ubuntu : bonnes pratiques opérationnelles
Le dépannage réactif est nécessaire, mais une bonne hygiène système proactive élimine la plupart de ces défaillances avant qu’elles ne surviennent.
Liste de contrôle de maintenance pour les serveurs Ubuntu :
- Exécutez `sudo apt-get update && sudo apt-get upgrade` selon un calendrier régulier — au minimum hebdomadaire pour les systèmes de production.
- Surveillez l’espace disque sur `/`, `/boot` et `/var` avec des seuils d’alerte (85 % d’utilisation est un déclencheur raisonnable).
- Auditez les PPAs tiers avant chaque cycle de mise à niveau majeure.
- Exécutez toujours les mises à niveau majeures dans `tmux` ou `screen` sur les systèmes distants.
- Conservez un instantané ou une sauvegarde avant toute opération `do-release-upgrade`. Sur un Serveur Dédié ou VPS, cela signifie prendre une image disque complète ou un instantané du système de fichiers avant d’initier la mise à niveau.
- Testez les procédures de mise à niveau dans un environnement de préproduction avant de les appliquer en production.
- Utilisez `unattended-upgrades` uniquement pour les correctifs de sécurité, pas pour les mises à niveau complètes de paquets, afin d’éviter des changements de dépendances inattendus sur les systèmes de production.
Pour les équipes gérant une infrastructure web — y compris les environnements d’Hébergement Web Mutualisé ou les serveurs d’applications multi-locataires — établir un guide de mise à niveau documenté incluant des étapes de vérification préalables, des procédures de retour arrière et des tests de validation post-mise à niveau est une pratique opérationnelle essentielle.
Matrice de décision : quelle correction appliquer en premier
| Message d’erreur | Première action | Deuxième action |
|---|
| — | — | — |
|---|
| « Could not get lock » | Vérifier `lsof`, supprimer les fichiers de verrouillage obsolètes | `dpkg –configure -a` |
|---|
| « Unmet dependencies » | `apt-get install -f` | `dpkg –configure -a` |
|---|
| « No space left on device » | `apt-get autoremove –purge && apt-get clean` | Supprimer manuellement les anciens noyaux |
|---|
| « dpkg was interrupted » | `dpkg –configure -a` | `apt-get update && apt-get upgrade` |
|---|
| « 404 Not Found » pour les paquets | `apt-get update` (vérifier la disponibilité du miroir) | Désactiver les PPAs défaillants |
|---|
| « held broken packages » | `apt-get dist-upgrade –dry-run` | Supprimer/réinstaller le paquet conflictuel |
|---|
| Déconnexion SSH pendant la mise à niveau | Se reconnecter et s’attacher à la session `tmux`/`screen` | `dpkg –configure -a` si la session a été perdue |
|---|
FAQ
Pourquoi `apt-get upgrade` laisse-t-il certains paquets comme « held back » ?
Les paquets sont bloqués lorsque leur mise à niveau nécessiterait l’installation de nouveaux paquets ou la suppression de paquets existants — des actions que `apt-get upgrade` n’est pas autorisé à effectuer par conception. Utilisez `apt-get dist-upgrade` pour résoudre les paquets bloqués, mais examinez toujours les modifications proposées avec `–dry-run` au préalable sur les systèmes de production.
Est-il sûr de supprimer les fichiers de verrouillage de `/var/lib/dpkg/` ?
Uniquement si aucun processus APT ou dpkg n’est en cours d’exécution. Vérifiez avec `sudo lsof /var/lib/dpkg/lock-frontend` avant de supprimer. Si un processus actif détient le verrou et que vous supprimez le fichier, vous corromprez la base de données des paquets, ce qui nécessite une récupération manuelle à partir de la sauvegarde de l’état dpkg.
Quelle est la différence entre `apt-get upgrade` et `apt-get dist-upgrade` ?
`apt-get upgrade` ne supprime jamais les paquets installés ni n’en installe de nouveaux pour résoudre les dépendances — il met uniquement à niveau les paquets qui peuvent être satisfaits sans changements structurels. `apt-get dist-upgrade` utilise un résolveur plus intelligent capable d’installer de nouveaux paquets et de supprimer les obsolètes. Pour les mises à jour de versions mineures et les mises à niveau de versions majeures, `dist-upgrade` est l’outil approprié.
Pourquoi `do-release-upgrade` échoue-t-il immédiatement après son exécution ?
La raison la plus courante est que le système actuel présente des dépendances non résolues ou des paquets bloqués. Exécutez `sudo apt-get dist-upgrade` et `sudo apt-get autoremove` pour amener le système à un état entièrement cohérent avant d’invoquer `do-release-upgrade`. Vérifiez également que tous les PPAs tiers sont soit désactivés, soit compatibles avec la version cible.
Combien d’espace disque libre est nécessaire pour une mise à niveau majeure de version Ubuntu ?
En minimum pratique, vous avez besoin d’au moins 2–3 GB libres sur la partition racine et d’au moins 200–300 MB libres sur `/boot`. L’exigence réelle varie en fonction du nombre de paquets installés. Exécutez `sudo do-release-upgrade` avec le système à ces seuils ou au-dessus ; si l’espace est limité, exécutez `sudo apt-get autoremove –purge && sudo apt-get clean` immédiatement avant d’initier la mise à niveau.
