Bon, il existe déjà des centaines de tutoriels sur ce sujet, donc je vais faire vite.
Soit une machine virtuelle qui IOwait à mort puis qui remonte automatiquement / en lecture seule. Il est impossible de le remonter en écriture avec les commandes usuelles. Je décide de reboot la machine virtuelle proprement depuis le système d'exploitation. Le shell distant m'est retiré, des démons sont arrêtés, mais ça reste bloqué à ce stade, pendant plus de 10 minutes. Je force un reboot côté hyperviseur. Au reboot, je tombe dans l'initramfs puisque le système de fichiers de la racine est en vrac… Je lance un fsck -y
, je reboot… Reboot OK. Quelque temps après, j'essaye d'installer un logiciel et…
# apt-get install ncdu
Lecture des listes de paquets... Erreur !
E: Splitting of file /var/lib/apt/lists/security.debian.org_dists_stretch_updates_InRelease failed as it doesn't contain all expected parts 0 1 0
E: Les listes de paquets ou le fichier « status » ne peuvent être analysés ou lus.
Si je lance un apt-get update, j'obtiens l'erreur suivante :
Impossible d'ouvrir le fichier /var/lib/apt/lists/partial/security.debian.org_dists_stretch_updates_main_binary-amd64_Packages.xz - open (13: Permission non accordée) [IP : 2a04:4e42:1d::204 80]
Solution :
# rm -f /var/lib/apt/lists/* /var/lib/apt/lists/partial/*
Retentons :
# apt-get update
[…]
Lecture des listes de paquets... Erreur !
E: Problem parsing dependency 47
E: Erreur apparue lors du traitement de mount (NewVersion2)
E: Problem with MergeList /var/lib/dpkg/status
E: Les listes de paquets ou le fichier « status » ne peuvent être analysés ou lus.
De même, dpkg ne semble pas être en forme :
dpkg --get-selections
dpkg: erreur: analyse du fichier '/var/lib/dpkg/status' vers la ligne 6135 paquet 'mount' :
champ « Pre-Depends », référence à « libc6 » : version contenant « »
En effet, si l'on ouvre /var/lib/dpkg/status
avec un éditeur de texte, on constate qu'il est corrompu : y'a du n'importe quoi en plein milieu du fichier, après le paquet « mount ». La fin du fichier est également tronqué (il se termine en plein milieu d'une description d'un paquet).
Le fichier /var/lib/dpkg/status-old
permet de gérer ce genre de cas… Sauf qu'il est corrompu lui aussi (il commence en plein milieu d'une description d'un paquet). Pas aux mêmes endroits, mais corrompu tout de même. Les deux fichiers ne permettent pas d'avoir une vue d'ensemble correcte des paquets installés…
On peut tenter de reconstruire le fichier status
avec un script, à partir des infos contenues dans /var/lib/dpkg/info
, mais je n'ai aucune idée de la fiabilité et de la viabilité de cette méthode.
J'ai une sauvegarde du fichier status
en date du 10 décembre 2017. Je décide de l'utiliser. Mais, si je tente d'installer un paquet, je reçois des milliers de lignes de la forme :
Use of uninitialized value $value in substitution (s///) at /usr/share/perl5/Debconf/Format/822.pm line 65, <__ANONIO__> line 1.
Use of uninitialized value $item in hash element at /usr/share/perl5/Debconf/DbDriver/File.pm line 85, <__ANONIO__> chunk 10.
Use of uninitialized value $value in substitution (s///) at /usr/share/perl5/Debconf/Format/822.pm line 65, <__ANONIO__> line 589.
Use of uninitialized value $value in substitution (s///) at /usr/share/perl5/Debconf/Format/822.pm line 65, <__ANONIO__> line 18841.
Use of uninitialized value $value in substitution (s///) at /usr/share/perl5/Debconf/Format/822.pm line 65, <__ANONIO__> line 18842.
Use of uninitialized value $value in substitution (s///) at /usr/share/perl5/Debconf/Format/822.pm line 65, <__ANONIO__> line 18843.
Use of uninitialized value $value in substitution (s///) at /usr/share/perl5/Debconf/Format/822.pm line 65, <__ANONIO__> line 18844.
Je dispose d'une sauvegarde complète de cette machine en date du 10 décembre 2017. Je pourrais tout restaurer d'un coup pour en finir… D'autant que rien a changé sur la machine depuis cette date… Mais d'un côté, c'est "amusant" d'essayer de s'en sortir. D'autant que cette machine sert environ à rien, donc ce n'est pas grave si elle devient instable dans quelques mois à cause de ma tentative de réparation…
Je décide de mettre à jour les paquets, afin que la version indiquée dans le fichier status
corresponde à ce qui est réellement installé. Ben, oui, la version mineure de Stretch, 9.4, est sortie entre ma sauvegarde du fichier status
et aujourd'hui.
# apt-get upgrade
# apt-get dist-upgrade
Évidemment, je ne me focalise pas sur la palanquée d'erreurs qui est affichée et je refuse toutes les demandes de remplacement de fichiers de conf'.
Maintenant, je vais m'occuper des erreurs suivantes :
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « libapache2-mod-php5 » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php-auth » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « softhsm » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « mysql-client-5.5 » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5-mysql » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « libsofthsm » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « libclamav7 » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5-pspell » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « softhsm-common » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5-json » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5 » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5-readline » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5-intl » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « libiperf0 » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « mysql-server-core-5.5 » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5-mcrypt » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « libperl5.20 » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « apache2-mpm-prefork » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5-imap » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5-cli » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5-gd » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « linux-image-3.16.0-4-amd64 » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5-common » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
dpkg: avertissement: le fichier contenant la liste des fichiers du paquet « php5-sqlite » étant manquant, il est considéré qu'aucun fichier du paquet n'est actuellement installé
Nous pouvons déjà faire semblant de désinstaller les paquets qui n'existent plus dans Stretch (il est possible que certains paquets aient déjà été supprimés lors de l'upgrade/dist-upgrade précédent, auquel cas il faut les retirer de la liste au compte-gouttes) :
# apt-get remove libapache2-mod-php5 php5-mysql php5-pspell php5-json php5 php5-cli php5-readline php5-intl php5-mcrypt php5-imap php5-gd php5-common php5-sqlite libsofthsm linux-image-3.16.0-4-amd64 apache2-mpm-prefork php-auth mysql-client-5.5 mysql-server-core-5.5
Continuons avec les logiciels que je n'utilise plus dans cette version :
# apt-get remove softhsm softhsm-common
Terminons en réinstallant les paquets encore utilisés, mais qui sont en erreur :
# apt-get install --reinstall libclamav7 libiperf0
Attaquons-nous maintenant aux avertissements suivants (extrait) :
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/uucp/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/games/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/mail/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/www-data/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/list/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/proxy/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/gnats/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/news/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/bin/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/sys/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/backup/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/daemon/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/nobody/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/irc/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/man/shell/_bin_sh/_usr_sbin_nologin.
debconf: Attention : corruption possible de la base de données. Tentative de réparation en rajoutant la question manquante base-passwd/system/user/lp/shell/_bin_sh/_usr_sbin_nologin.
Pour réparer, utilisons la commande suivante :
# /usr/share/debconf/fix_db.pl
Et voilà, nous avons enfin terminé ! \o/