Vous lancez apt upgrade et Debian répond par ce classique gaiement passif-agressif : « dépendances non satisfaites ». Maintenant rien ne s’installe, la moitié de vos paquets sont « conservés », et votre terminal a l’air de juger vos choix de vie.
Cela se répare. Presque toujours. Et vous pouvez le réparer sans réinstaller Debian, sans « utilisez Docker », et sans fouiller aveuglément dans des pastebins de forums aléatoires. Nous diagnostiquerons ce qui est réellement cassé (sources, pins, holds, état dpkg ou mise à niveau partielle), puis nous le réparerons avec des étapes délibérées que vous pourrez expliquer à un comité de revue des changements.
Ce que « dépendances non satisfaites » signifie réellement (et ce que ce n’est pas)
APT n’est pas « cassé » parce qu’il a affiché une erreur. Il est bloqué parce qu’APT ne parvient pas à trouver un ensemble cohérent de versions de paquets qui satisfassent :
- Ce que vous avez demandé (installer/mettre à jour/supprimer),
- Ce qui est déjà installé,
- Ce que vos dépôts offrent,
- Et ce que votre politique autorise (pins, priorités, paquets « retenus »).
En pratique, « dépendances non satisfaites » se résume généralement à l’un de ces cas :
- Dépôts mélangés : vous avez Debian stable + testing + unstable, ou un dépôt tiers construit pour une autre version de Debian. APT n’est pas un thérapeute ; il ne peut pas concilier des engagements contradictoires.
- Mise à niveau partielle : certains paquets sont passés à des versions plus récentes mais leur chaîne de dépendances ne l’a pas fait, souvent à cause d’une mise à jour interrompue, de paquets retenus, ou d’un changement de disponibilité des dépôts.
- État dpkg incohérent : paquets laissés non configurés, semi-installés, ou divergences de fichiers. APT délègue le dépaquetage/la configuration à dpkg ; si dpkg est bloqué, APT est bloqué.
- Paquets retenus : une librairie centrale est en hold, donc tout ce qui en dépend ne peut pas bouger.
- Pinning (préférences) a forcé votre système à « choisir » une version qui n’existe pas dans les dépôts activés.
- Bizarreries d’architecture et multiarch : mélange non intentionnel i386/amd64, ou paquets d’architecture étrangère obsolètes qui traînent.
Ce que ce n’est pas : une raison de réinstaller, une raison de commencer à supprimer des paquets au hasard, ou une invitation à exécuter frénétiquement apt --fix-broken install jusqu’à ce qu’il vous donne raison. Nous utiliserons cet outil, mais seulement quand nous comprendrons ce qu’il va faire.
Procédure de diagnostic rapide (premier/deuxième/troisième)
Si c’est en production, vous voulez du signal vite. Voici un ordre de triage qui fonctionne parce qu’il sépare « APT ne peut pas calculer une solution » de « dpkg ne peut pas appliquer la solution ».
Premier : confirmer le mode d’échec
- Est-ce qu’APT peut calculer un plan mais dpkg ne parvient pas à l’appliquer ? (verrou dpkg, configuration interrompue, script de mainteneur cassé)
- Ou est-ce qu’APT ne peut tout simplement pas calculer de plan ? (mélange de dépôts, pins, holds, versions manquantes)
Deuxième : valider les dépôts et l’alignement de la release
- Confirmez que vous êtes bien sur Debian 13 et que vos sources ciblent Debian 13 (ou son nom de code), de façon cohérente.
- Recherchez les dépôts tiers pointant vers la mauvaise suite.
- Recherchez testing/unstable activés par accident.
Troisième : identifier ce qui bloque le graphe de dépendances
- Paquets en hold.
- Pinning/préférences (y compris les pins par « origin » venant de dépôts tiers).
- Un paquet « clé de voûte » (souvent libc6, libstdc++, openssl, systemd) coincé à une version incompatible.
Quatrième : réparer l’état de dpkg si nécessaire
- Configurer les paquets dépaquetés.
- Résoudre les scripts de mainteneur cassés.
- Nettoyer les locks avec précaution (rarement nécessaire, mais quand c’est le cas, c’est critique).
Cinquième : appliquer une mise à niveau complète contrôlée
- Une fois que les dépôts et la politique sont sains, effectuez un
full-upgrade(ou l’équivalent moderne) pour permettre à APT d’exécuter les suppressions/installs requis. - Examinez les suppressions comme si vous alliez signer un bon de commande.
Faits & contexte intéressants (ce qui compte à 2 h du matin)
- APT est plus ancien que la plupart des outils cloud. Le projet APT date de la fin des années 1990 ; sa conception supposait des réseaux peu fiables et des miroirs lents, donc il est exigeant sur la cohérence et les métadonnées.
- dpkg a précédé APT. dpkg effectue l’installation/le dépaquetage/la configuration ; APT est le planificateur et le récupérateur. Si dpkg est bloqué, APT ne peut que se plaindre poliment.
- « Depends » n’est pas toute l’histoire. Les paquets Debian utilisent aussi
Pre-Depends, qui force l’ordre d’installation et peut faire paraître le système « coincé » si un paquet central ne peut pas basculer. - « Stable » est une promesse, pas une propriété magique. Debian stable vise la compatibilité, mais si vous mélangez des suites (stable/testing/unstable), vous renoncez à cette promesse.
- Le pinning est à la fois un scalpel et une tronçonneuse. Les préférences APT permettent un mélange contrôlé (comme les backports ou dépôts de sécurité), mais un mauvais pin peut figer la moitié de l’OS.
- Les dépôts tiers ciblent souvent Ubuntu en premier. Beaucoup de fournisseurs publient des paquets Debian, mais leurs hypothèses de dépendances correspondent souvent aux versions Ubuntu, d’où des messages tels que « Depends: libsslX (>= …) mais il n’est pas installable ».
- Les fichiers Release sont une frontière de confiance. APT utilise des métadonnées signées. Quand les signatures échouent (clé expirée, mauvaise suite), APT refusera les mises à jour — ce qui peut indirectement provoquer des dépendances non satisfaites lors d’un upgrade.
- Multiarch n’a pas toujours existé. Le mélange d’architectures est devenu courant plus tard ; des paquets i386 traînant sur un amd64 peuvent créer des contraintes de dépendances qui semblent sans rapport.
- « Conservés » signifie généralement qu’APT est prudent. APT évite par défaut les suppressions ; une mise à jour peut nécessiter des transitions de paquets que seul
full-upgradeacceptera.
Avant de toucher quoi que ce soit : consignes de sécurité
Si c’est un portable, votre « rayon d’impact » est surtout votre après-midi. Si c’est un serveur, vous voulez des actions réversibles.
- Ouvrez un shell root avec journal. Vous voulez une transcription quand vous expliquerez plus tard ce qui a changé.
- Faites un snapshot si possible. Snapshot LVM, snapshot ZFS, ou snapshot VM. Si vous n’en avez pas, sauvegardez au moins
/etc/aptet/var/lib/dpkg. - Ne supprimez pas les paquets critiques à l’aveugle. Si APT propose de supprimer
systemd,ssh,libc6ou votre méta-paquet kernel, arrêtez-vous et comprenez pourquoi.
Une vérité sèche venue des opérations : « les réparations rapides que vous ne pouvez pas expliquer ne sont que des incidents futurs livrés en avance. »
Idée paraphrasée de Richard Cook (ingénierie de la résilience) : « Le succès et l’échec viennent souvent du même travail quotidien ; ce ne sont pas des mondes séparés. »
Tâches pratiques de réparation (commandes, sorties, décisions)
Ci-dessous des tâches concrètes. Chacune inclut : commande, sortie réaliste, ce que cela signifie, et la décision suivante. Faites-les dans l’ordre sauf si vous savez déjà quel mode d’échec vous avez.
Task 1: Confirm the OS release and codename
cr0x@server:~$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
NAME="Debian GNU/Linux"
VERSION_ID="13"
VERSION="13 (trixie)"
VERSION_CODENAME=trixie
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
Signification : Vous êtes sur Debian 13, nom de code trixie. Les dépôts doivent correspondre aux suites Debian 13 (typiquement trixie, trixie-updates, trixie-security).
Décision : Si vos sources référencent un autre nom de code (comme bookworm, sid, ou des noms Ubuntu), corrigez d’abord les sources. N’essayez pas de « forcer » l’installation pour vous en sortir.
Task 2: List APT sources, including deb822 and legacy files
cr0x@server:~$ find /etc/apt/sources.list /etc/apt/sources.list.d -maxdepth 1 -type f -print -exec sed -n '1,160p' {} \;
/etc/apt/sources.list
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/debian-security trixie-security main contrib non-free non-free-firmware
/etc/apt/sources.list.d/vendor.list
deb http://packages.vendor.example/debian bookworm main
Signification : Vous avez un dépôt tiers ciblant bookworm (Debian 12) sur un système Debian 13. C’est une cause fréquente de dépendances non satisfaites ou de rétrogradations.
Décision : Désactivez ou corrigez ce dépôt avant toute autre action. Si le fournisseur ne supporte pas Debian 13, remplacez le logiciel ou acceptez que vous effectuez une chirurgie de dépendances non supportée.
Task 3: Update package lists and read the errors like evidence
cr0x@server:~$ sudo apt update
Hit:1 http://deb.debian.org/debian trixie InRelease
Hit:2 http://deb.debian.org/debian trixie-updates InRelease
Hit:3 http://security.debian.org/debian-security trixie-security InRelease
Get:4 http://packages.vendor.example/debian bookworm InRelease [3,215 B]
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.
Signification : APT a récupéré les métadonnées pour Debian 13 et pour le dépôt fournisseur en Debian 12. « All packages are up to date » signifie seulement que vos métadonnées sont fraîches, pas que votre système est cohérent.
Décision : Poursuivez l’inspection de la politique. N’effectuez pas encore de mise à jour.
Task 4: Check what suites APT thinks it can install from (policy view)
cr0x@server:~$ apt-cache policy | sed -n '1,80p'
Package files:
100 /var/lib/dpkg/status
release a=now
500 http://packages.vendor.example/debian bookworm InRelease
release o=Vendor,a=bookworm,n=bookworm,l=Vendor,c=main,b=amd64
500 http://security.debian.org/debian-security trixie-security InRelease
release o=Debian,a=trixie-security,n=trixie-security,l=Debian,c=main,b=amd64
500 http://deb.debian.org/debian trixie-updates InRelease
release o=Debian,a=trixie-updates,n=trixie-updates,l=Debian,c=main,b=amd64
500 http://deb.debian.org/debian trixie InRelease
release o=Debian,a=trixie,n=trixie,l=Debian,c=main,b=amd64
Signification : Le dépôt fournisseur a la même priorité (500) que Debian. Cela signifie qu’APT peut sélectionner des paquets fournisseur quand les versions semblent « meilleures », entraînant des dépendances qui n’existent pas dans Debian 13.
Décision : Si le dépôt fournisseur est inadapté, désactivez-le maintenant ; s’il est correct mais trop « attractif », réduisez sa priorité ou limitez-le à des paquets spécifiques seulement.
Task 5: Identify the exact dependency conflict
cr0x@server:~$ sudo apt install vendor-agent
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:
The following packages have unmet dependencies:
vendor-agent : Depends: libssl3 (>= 3.0.0) but it is not installable
Depends: libc6 (>= 2.37) but 2.36-9 is to be installed
E: Unable to correct problems, you have held broken packages.
Signification : Le paquet exige une libc6 plus récente que ce qu’APT est prêt à installer, et il considère que libssl3 n’est pas installable dans votre configuration actuelle de dépôts/pins.
Décision : Ne forcez pas une installation brutale. Déterminez quel dépôt fournit quelles versions de libc6 et de libssl3, et si vous êtes bloqué sur une libc plus ancienne à cause de holds/pins ou d’une mise à niveau partielle.
Task 6: Check for held packages (classic foot-gun)
cr0x@server:~$ apt-mark showhold
libc6
linux-image-amd64
Signification : Avoir libc6 en hold est sérieux. Mettre libc6 en hold peut bloquer tout le système car tout dépend de cette libc directement ou indirectement.
Décision : Si le hold était intentionnel pour une fenêtre de maintenance, planifiez-la et enlevez le hold. S’il était accidentel (ou hérité d’une image golden), enlevez le hold maintenant.
Task 7: Unhold packages (only after understanding why they were held)
cr0x@server:~$ sudo apt-mark unhold libc6 linux-image-amd64
Canceled hold on libc6.
Canceled hold on linux-image-amd64.
Signification : APT est maintenant autorisé à mettre à jour ces paquets.
Décision : Relancez le calcul des dépendances. Si c’était le seul blocage, vos « dépendances non satisfaites » peuvent disparaître.
Task 8: Look for pinning and preferences that force odd choices
cr0x@server:~$ grep -R --line-number --no-messages '' /etc/apt/preferences /etc/apt/preferences.d 2>/dev/null
/etc/apt/preferences.d/00-local-pin:1:Package: *
/etc/apt/preferences.d/00-local-pin:2:Pin: release a=bookworm
/etc/apt/preferences.d/00-local-pin:3:Pin-Priority: 990
Signification : Quelqu’un a épinglé tout le système vers bookworm. Sur Debian 13, c’est essentiellement dire à APT de préférer les paquets Debian 12. Voilà comment on obtient un Debian Frankenstein.
Décision : Supprimez ou ajustez le pin. Si vous avez besoin de pinning, épinglez uniquement les paquets spécifiques, pas Package: *.
Blague #1 : Épingler Package: * revient à réparer une porte qui grince en déplaçant toute la maison de deux centimètres vers la gauche.
Task 9: Check candidate versions for the conflicting packages
cr0x@server:~$ apt-cache policy libc6 libssl3 vendor-agent
libc6:
Installed: 2.36-9
Candidate: 2.39-5
Version table:
2.39-5 500
500 http://deb.debian.org/debian trixie/main amd64 Packages
*** 2.36-9 100
100 /var/lib/dpkg/status
libssl3:
Installed: (none)
Candidate: 3.3.1-1
Version table:
3.3.1-1 500
500 http://deb.debian.org/debian trixie/main amd64 Packages
vendor-agent:
Installed: (none)
Candidate: 1.8.2-4
Version table:
1.8.2-4 500
500 http://packages.vendor.example/debian bookworm/main amd64 Packages
Signification : Debian 13 propose des versions plus récentes de libc6 et libssl3. L’agent fournisseur vient d’un dépôt Debian 12, mais ses dépendances pourraient être satisfaites si APT n’est pas épinglé/tenu sur des versions plus anciennes.
Décision : Corrigez d’abord la suite du dépôt fournisseur (ou désactivez-le). Ensuite effectuez une mise à niveau complète contrôlée pour que libc6 bascule proprement.
Task 10: Temporarily disable a mismatched third-party repo
cr0x@server:~$ sudo mv /etc/apt/sources.list.d/vendor.list /etc/apt/sources.list.d/vendor.list.disabled
cr0x@server:~$ sudo apt update
Hit:1 http://deb.debian.org/debian trixie InRelease
Hit:2 http://deb.debian.org/debian trixie-updates InRelease
Hit:3 http://security.debian.org/debian-security trixie-security InRelease
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Signification : Vous avez retiré l’univers de paquets incompatible de la considération. Cela suffit souvent à résoudre les erreurs d’« impossible situation ».
Décision : Alignez maintenant vos paquets installés avec Debian 13 en effectuant une mise à niveau complète. Plus tard, réactivez le dépôt fournisseur uniquement s’il propose une suite Debian 13.
Task 11: Check dpkg for half-configured/half-installed packages
cr0x@server:~$ dpkg -C
The following packages are only half configured, probably due to problems
configuring them the first time. The configuration should be retried using
dpkg --configure <package> or the configure menu option in dselect:
systemd 252.22-1 system and service manager
Signification : dpkg signale un état incohérent. Même si APT peut calculer un plan, il peut échouer tant que dpkg n’a pas terminé la configuration.
Décision : Réparez l’état de dpkg avant d’essayer des mises à jour plus larges.
Task 12: Configure pending packages
cr0x@server:~$ sudo dpkg --configure -a
Setting up systemd (252.22-1) ...
Created symlink /etc/systemd/system/multi-user.target.wants/cron.service → /lib/systemd/system/cron.service.
Processing triggers for dbus (1.14.10-1) ...
Processing triggers for libc-bin (2.36-9) ...
Signification : dpkg a terminé la configuration en attente et a exécuté les triggers. C’est fondamental.
Décision : Relancez l’étape de planification de mise à jour. Si dpkg échoue ici, arrêtez-vous et corrigez cette erreur spécifiquement (souvent un script de mainteneur cassé ou un fichier manquant).
Task 13: Let APT fix missing dependencies (with eyes open)
cr0x@server:~$ sudo apt-get -f install
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Correcting dependencies... Done
The following additional packages will be installed:
libpam-systemd systemd-sysv
The following packages will be upgraded:
libpam-systemd systemd-sysv
2 upgraded, 0 newly installed, 0 to remove and 17 not upgraded.
Need to get 1,214 kB of archives.
After this operation, 0 B of additional disk space will be used.
Do you want to continue? [Y/n] y
...
Signification : APT a trouvé un ensemble minimal de mises à jour pour restaurer la cohérence. Notez qu’il ne propose pas de suppressions. Bon signe.
Décision : Acceptez si les changements sont raisonnables. S’il propose de supprimer des services critiques, arrêtez-vous et revoyez l’alignement de vos dépôts et vos pins.
Task 14: Run a full upgrade to allow transitions
cr0x@server:~$ sudo apt full-upgrade
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
base-files libc6 libc-bin libssl3 openssh-client openssh-server
The following packages will be installed:
linux-image-6.12.0-1-amd64 linux-headers-6.12.0-1-amd64
The following packages will be removed:
linux-image-6.1.0-18-amd64
8 upgraded, 2 newly installed, 1 to remove and 0 not upgraded.
Need to get 76.4 MB of archives.
After this operation, 312 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
...
Signification : C’est une transition normale de kernel : installation d’un nouveau kernel, suppression de l’ancien. Les mises à jour de libc6 et libssl3 sont cohérentes avec Debian 13.
Décision : Poursuivez. Si vous êtes en distant, assurez-vous de ne pas bloquer SSH : maintenez une session active, envisagez une seconde session, et ne coupez pas le réseau pendant la mise à jour.
Task 15: If APT still can’t resolve, ask it to explain why
cr0x@server:~$ apt -o Debug::pkgProblemResolver=yes install vendor-agent
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Starting pkgProblemResolver with broken count: 0
Investigating (0) vendor-agent:amd64 < none -> 1.8.2-4 @un puN Ib >
Broken vendor-agent:amd64 Depends on libc6:amd64 >= 2.37
Considering libc6:amd64 100 as a solution to vendor-agent:amd64 9999
Rejected libc6:amd64 100 because of held packages or policy
E: Unable to correct problems, you have held broken packages.
Signification : La sortie de debug montre un rejet dû à la « politique » (pins/préférences) ou aux holds. Vous savez maintenant où regarder : apt-mark showhold et /etc/apt/preferences*.
Décision : Supprimez la contrainte de politique, puis réessayez. N’installez pas au hasard des versions plus anciennes pour satisfaire le résolveur.
Task 16: Inspect dependency chain for a specific package
cr0x@server:~$ apt-cache depends vendor-agent | sed -n '1,80p'
vendor-agent
Depends: libc6
Depends: libssl3
Depends: systemd
Depends: adduser
Depends: ca-certificates
Signification : Ce n’est pas exotique ; c’est un agent typique reposant sur des libs et systemd.
Décision : Si les libs centrales sont bloquées, corrigez-les d’abord. Ne considérez pas l’agent comme le problème ; voyez-le comme le messager.
Task 17: Clean up stale packages and caches (after recovery)
cr0x@server:~$ sudo apt autoremove --purge
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages will be REMOVED:
linux-image-6.1.0-18-amd64*
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
After this operation, 287 MB disk space will be freed.
Do you want to continue? [Y/n] y
...
Signification : Vous nettoyez d’anciens kernels ou des dépendances orphelines. Cela ne résout pas les problèmes de dépendances ; cela réduit le désordre après les avoir réparés.
Décision : Sûr après avoir confirmé que vous avez un nouveau kernel amorçable. Sur des serveurs, conservez au moins un ancien kernel connu fonctionnel jusqu’au redémarrage réussi.
Task 18: Verify system health after the upgrade
cr0x@server:~$ sudo systemctl is-system-running
running
Signification : Systemd considère le système comme sain. S’il renvoie degraded, vérifiez les unités en échec.
Décision : Si degraded, lancez systemctl --failed, corrigez les services en erreur, puis redémarrez selon votre planning (les mises à jour du kernel/libc/systemd nécessitent souvent un reboot).
Blague #2 : « Dépendances non satisfaites » est la façon qu’a APT de dire : « Je peux tout faire… sauf être d’accord avec votre passé. »
Trois mini-histoires du monde d’entreprise (pourquoi cela arrive en environnement professionnel)
Incident #1: The wrong assumption (“It’s just one repo line”)
Ils avaient une flotte de serveurs Debian construits d’après une image golden qui avait vécu des années. L’image était « principalement stable », ce qui en langage d’entreprise signifie que personne ne voulait être la personne qui la touche. Un nouvel agent d’observabilité était requis pour un audit, et le fournisseur a fourni un extrait de dépôt. Quelqu’un l’a ajouté, a exécuté apt update, puis installé l’agent. Ça a marché. Sur une seule machine.
Deux semaines plus tard, un job automatisé de sécurité a lancé apt upgrade sur la flotte. APT a commencé à tirer une librairie plus récente depuis le dépôt fournisseur sur certains hôtes — seulement ceux qui avaient un paquet optionnel précis installé. Ces machines ont fini avec une mise à niveau partielle : quelques bibliothèques ont avancé, mais les paquets centraux restaient en arrière à cause de holds introduits des années auparavant pour geler les kernels pendant une ère de pilotes problématiques.
Le symptôme était classique : « Depends: libc6 (>= …) but … is to be installed. » SSH fonctionnait encore, mais l’agent d’audit ne s’est pas installé sur la moitié de la flotte, et le rapport de conformité les a signalés comme manquant la télémétrie requise. C’est ainsi que « dépendances non satisfaites » devient un problème métier.
L’erreur d’appréciation : penser qu’une ligne de dépôt fournisseur est « locale » au paquet fournisseur. Elle ne l’était pas. Les dépôts ne sont pas scoped. Au moment où vous ajoutez un dépôt, vous ajoutez tout un univers concurrent de paquets qu’APT peut considérer pour les mises à jour à moins de le pinner précisément.
La correction était ennuyeuse et correcte : désactiver le dépôt fournisseur par défaut, puis ajouter un pin autorisant seulement les paquets de l’agent (et leurs dépendances exactes) à provenir de cette origine. Le reste est resté pur Debian. Ils ont aussi retiré les holds sur libc après une fenêtre de maintenance planifiée. L’incident s’est terminé non par des héros, mais par un fichier de politique et une checklist.
Incident #2: An optimization that backfired (“Let’s cache packages on a local mirror”)
Une autre entreprise a voulu être maligne. Ils ont construit un proxy APT local pour réduire la bande passante externe et accélérer le provisioning. Bonne intention. Puis ils ont « optimisé » davantage en miroirant seulement un sous-ensemble de dépôts : main, pas de security, et seulement amd64. La logique était : « Nous n’installons que depuis main, la sécurité vient après. » La sécurité, justement, ne vient pas après.
Pendant une vague de mises à jour, certaines machines pointaient vers le miroir local, d’autres vers les miroirs Debian publics. Quelques paquets avaient des versions plus récentes dans security et updates, et ces versions nécessitaient des transitions de librairies absentes du miroir tronqué. Le résultat fut un monde de paquets en split-brain : mêmes noms d’hôtes dans différents racks, mais versions candidates différentes. La résolution des dépendances échouait sur les hôtes du miroir local.
L’équipe a tenté de « réparer » en forçant des paquets individuels avec apt install package=version. Ça a fonctionné jusqu’à ce que ça ne fonctionne plus : les versions épinglées ont dérivé, et le cycle d’upgrade suivant a réintroduit des conflits. L’optimisation a créé une nouvelle classe de pannes : le miroir lui-même est devenu une source de vérité instable.
La réparation finale fut : miroiter l’ensemble complet des suites utilisées en production (y compris security), garder les métadonnées cohérentes, et appliquer la configuration des dépôts via la gestion de configuration. Le coût fut de l’espace disque en plus. Le bénéfice : les mises à jour ont cessé d’être un coup de dés.
Incident #3: The boring practice that saved the day (“We snapshot before upgrades”)
Un environnement lourd en stockage (pensez : nœuds de traitement de données) utilisait Debian avec ZFS-on-root. Ils avaient une règle : avant toute mise à jour de l’OS, prendre un snapshot d’environnement de boot. Ce n’était pas glamour. C’était une ligne dans leur runbook et un hook pré-upgrade dans leur automatisation.
Un soir, une mise à niveau partielle est survenue quand même : un flapping réseau pendant les téléchargements de paquets. dpkg s’est retrouvé avec un paquet crucial dépaqueté mais non configuré. Les erreurs APT ont enchaîné. Le nœud était toujours joignable, mais les services étaient coincés en redémarrage, et la personne d’astreinte jonglait avec plusieurs alertes.
Au lieu d’improviser, ils ont suivi la voie ennuyeuse. Ils ont utilisé dpkg pour configurer les paquets en attente, exécuté apt-get -f install, et réessayé la mise à niveau complète. Quand un script de mainteneur a échoué à cause d’une personnalisation locale, ils n’ont pas bidouillé sur place ; ils ont rollbacké au snapshot, corrigé la personnalisation, et relancé la mise à jour.
Ce n’était pas dramatique, ce qui est le but. Le snapshot a transformé « dépendances non satisfaites » de « peut-être reconstruire le nœud » en « réparation reproductible ». Ils ont quand même corrigé le problème sous-jacent, mais sans panique.
Erreurs fréquentes : symptôme → cause racine → correction
1) Symptom: “Depends: X but it is not installable” right after adding a vendor repo
Cause racine : Le dépôt cible une autre release Debian (ou Ubuntu), ou il vous manque des composants requis (comme contrib, non-free-firmware) pour vos besoins.
Correction : Désactivez le dépôt ; confirmez la suite/nom de code correct(e) ; réactivez seulement s’il correspond à Debian 13. Si vous devez le garder, pinnez-le sur des paquets spécifiques, pas sur tout l’univers.
2) Symptom: “You have held broken packages”
Cause racine : Holds explicites via apt-mark hold, ou pins qui maintiennent effectivement une version.
Correction : apt-mark showhold, puis unhold volontaire. Inspectez /etc/apt/preferences* pour des pins trop larges.
3) Symptom: APT suggests removing half your desktop / your SSH server
Cause racine : Suites mélangées (stable + testing + unstable), ou dépôt tiers qui remplace des paquets centraux, ou mélange d’architectures accidentel.
Correction : Rendre les sources cohérentes. Si vous voulez Debian 13 stable, n’utilisez que les suites Debian 13 (plus backports si configurés volontairement). Supprimez les paquets d’architecture étrangère si c’était accidentel.
4) Symptom: “dpkg was interrupted, you must manually run dpkg –configure -a”
Cause racine : Installation/mise à jour interrompue, reboot brusque, processus apt tué, ou script de mainteneur qui bloque.
Correction : Lancez sudo dpkg --configure -a. S’il échoue, lisez l’erreur exacte, corrigez le fichier/service mentionné, puis relancez. Ne réessayez pas sans rien changer.
5) Symptom: “E: Could not get lock /var/lib/dpkg/lock-frontend”
Cause racine : Un autre processus apt/dpkg est en cours (ou un crash en a laissé la trace).
Correction : Identifiez le processus avec ps, attendez s’il est légitime, ou arrêtez-le s’il est bloqué. Ne supprimez pas les fichiers de lock comme premier réflexe ; c’est ainsi qu’on corrompt l’état.
6) Symptom: “Packages have been kept back” for core components
Cause racine : La mise à jour nécessite d’installer de nouveaux paquets/supprimer des anciens ; apt upgrade conservateur ne le fera pas.
Correction : Utilisez apt full-upgrade et examinez le plan. Si le plan est absurde, vos sources/pins sont encore incorrects.
7) Symptom: libc6 or openssl transitions fail
Cause racine : Un dépôt manque (security/updates), ou des paquets tiers exigent des versions d’une autre suite, ou vous avez pinné une ancienne libc/openssl.
Correction : Assurez-vous que les dépôts Debian sont complets et alignés, retirez holds/pins, retirez temporairement le paquet tiers si nécessaire, complétez la transition de l’OS de base, puis réinstallez les paquets tiers.
8) Symptom: “The following signatures were invalid” and then upgrade breaks later
Cause racine : Vous n’avez plus reçu de mises à jour, donc votre système a dérivé. Plus tard vous essayez d’installer quelque chose qui suppose des dépendances plus récentes.
Correction : Réparez d’abord la signature/les clés du dépôt, exécutez apt update, puis faites une mise à niveau complète pour resynchroniser.
Listes de contrôle / plan étape par étape
Checklist A: Make APT consistent again (the safe baseline)
- Confirmez la release :
/etc/os-releasedoit correspondre au nom de code Debian 13. - Inspectez les sources : supprimez/désactivez les suites inadaptées et les dépôts tiers aléatoires.
- Exécutez
apt updateet assurez-vous qu’il se termine sans erreurs de dépôt. - Vérifiez les holds :
apt-mark showhold; enlevez les holds sur les paquets centraux sauf si vous avez une raison écrite. - Vérifiez le pinning : inspectez
/etc/apt/preferences*pour des pins larges ; supprimez-les/limitez-les. - Réparez l’état de dpkg :
dpkg -C, puisdpkg --configure -a. - Exécutez
apt-get -f installpour réparer les ruptures de dépendances. - Exécutez
apt full-upgradepour compléter les transitions. - Redémarrez si kernel/libc/systemd a changé (généralement oui). Puis vérifiez les services.
Checklist B: If you must keep a third-party repo
- Assurez-vous que le dépôt cible la suite Debian 13 (pas Debian 12, pas Ubuntu).
- Privilégiez le périmétrage du dépôt via le pinning :
- Pinnez par origin et nom de paquet, pas globalement.
- Gardez les paquets fournisseur à priorité plus basse sauf s’ils sont explicitement installés.
- Documentez l’exception : quels paquets viennent du fournisseur, pourquoi, et comment revenir en arrière s’ils disparaissent.
- Retestez les mises à jour dans un environnement de staging qui reflète exactement les sources de production.
Checklist C: When you’re already in a partial-upgrade mess
- Arrêtez l’automatisation en arrière-plan (unattended-upgrades, tâches de gestion de config liées aux paquets) jusqu’à réparation.
- Réparez d’abord la configuration dpkg (
dpkg --configure -a). - Puis réparez les dépendances (
apt-get -f install). - Puis effectuez la mise à niveau complète (
apt full-upgrade). - Ce n’est qu’après que l’OS de base est cohérent que vous réactivez les dépôts tiers et réinstallez leurs paquets si nécessaire.
FAQ
1) Do I really need apt full-upgrade? Sounds scary.
Parfois, oui. Si une transition requiert l’installation de nouvelles dépendances ou la suppression de paquets obsolètes, apt upgrade refusera. full-upgrade n’est pas imprudent ; il est honnête. Lisez le plan avant d’accepter.
2) What’s the difference between APT and dpkg in this mess?
APT décide ce qui doit arriver ; dpkg l’exécute. Si APT ne trouve pas de solution valide, c’est un problème de politique/dépôts/versions. Si dpkg ne peut pas configurer les paquets, c’est une installation interrompue ou un script/config cassé.
3) Is it okay to delete dpkg lock files?
Rarement. Confirmez d’abord qu’aucun processus apt/dpkg légitime n’est en cours. Supprimer les locks pendant que dpkg est actif est une excellente façon de corrompre l’état. Si vous y pensez, ralentissez et inspectez les processus.
4) Why does APT say a package “is not installable” when it exists in the repo?
Parce que « installable » signifie « installable sous les contraintes actuelles » : suite, architecture, pins et versions de dépendances. Un paquet peut exister mais être exclu par du pinning, une mauvaise suite ou des composants manquants.
5) Can I fix unmet dependencies by downloading random .deb files?
Vous pouvez aussi colmater une fuite avec du chewing-gum. Ça peut tenir assez longtemps pour gâcher votre week-end. Préférez des dépôts cohérents et laissez APT gérer les versions sauf si vous faites une réparation ponctuelle et strictement contrôlée.
6) How do I know if I have mixed Debian releases?
apt-cache policy montre les lignes de release. Si vous voyez plusieurs suites (comme trixie plus bookworm ou sid) à priorité similaire, vous mixez. Inspectez aussi /etc/apt/sources.list* pour les noms de suites.
7) What if the only way to satisfy dependencies is to remove a key service?
C’est généralement un signe que vos dépôts sont mauvais ou que vous vous êtes mis dans un coin avec des pins. Corrigez d’abord les sources et les pins. Si c’est un paquet tiers qui cause le conflit, supprimez-le temporairement, complétez la mise à niveau de l’OS, puis réinstallez le paquet tiers depuis un dépôt compatible.
8) Should I use aptitude instead?
Il peut proposer des solutions alternatives de façon interactive, utile quand vous comprenez le système. Ce n’est pas un substitut aux dépôts/pins corrects. Si vos sources sont mauvaises, aptitude vous présentera toujours de mauvaises options — juste de manière plus créative.
9) Why does this happen during Debian upgrades more than “normal days”?
Les transitions de release et les mises à jour majeures déclenchent des changements coordonnés : libc, openssl, systemd, kernels. Si vous avez des holds, des pins ou des suites manquantes (comme security), ces transitions échouent bruyamment.
10) When is reinstall actually justified?
Quand vous avez des modifications manuelles non tracées, des dépôts tiers inconnus, et des années de dérive — plus aucune snapshot et pas le temps de raisonner. La réinstallation est une décision opérationnelle, pas une nécessité technique. La plupart du temps, vous pouvez réparer plus vite que reconstruire en sécurité.
Conclusion : prochaines étapes à effectuer réellement
Si APT crie à propos de dépendances non satisfaites sur Debian 13, traitez-le comme un problème de cohérence, pas de volonté.
- Rendez les sources saines. Une seule release Debian, suites complètes (main + updates + security), et pas de dépôts fournisseurs incompatibles.
- Enlevez les pièges de politique. Enlevez les holds sur les paquets centraux, annulez les pins trop larges, et cessez de mélanger les releases sauf si vous le faites volontairement avec des contraintes strictes.
- Réparez l’état de dpkg.
dpkg -Cpuisdpkg --configure -aavant d’essayer de grosses mises à jour. - Laissez APT compléter les transitions. Utilisez
apt-get -f installpour restaurer la cohérence, puisapt full-upgradepour finir le travail. - Après, verrouillez la correction ennuyeuse. Gérez vos fichiers de dépôt avec configuration management, documentez les dépôts tiers, et faites des snapshots avant les mises à jour si possible.
L’objectif n’est pas de « faire disparaître l’erreur ». L’objectif est de restaurer un système où chaque version de paquet a une origine claire et un chemin de mise à jour qui ne requiert pas de prières.