L'objectif de ce post : montrer une technique de débogage dans debian/ubuntu liée à la « recherche de la source » dans le fichier de configuration système.
Exemple de test : après de longues manipulations sur la copie tar.gz du système d'exploitation installé et après sa restauration et l'installation des mises à jour, nous recevons le message :
update-initramfs : Génération de /boot/initrd.img-4.15.0-54-generic
W : la configuration d'initramfs-tools définit RESUME=/dev/mapper/U1563304817I0-swap
W : mais aucun appareil d'échange correspondant n'est disponible.
I : L'initramfs tentera de reprendre à partir de /dev/dm-1
I : (/dev/mapper/foobar-swap)
I : Définissez la variable RESUME pour la remplacer.Objectif : comprendre d'où provient cette valeur (U1563304817I0) et comment la modifier correctement. C'est le premier exemple trouvé, pas particulièrement intéressant en soi, mais pratique pour montrer des méthodes de travail avec Linux..
Étape numéro 1 : D'où vient RESUME ?
# cd /etc
# grep -r RESUME
initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swapNous recherchons récursivement (-r) cette variable dans le répertoire /etc (où se trouvent la plupart des configurations). Nous trouvons un extrait dans conf.d qui est manifestement utilisé par le paquet initramfs-tools.
D'où vient cet extrait ?
Il y a trois options :
- Artefact magique (quelqu'un l'a placé et a oublié)
- Configuration du paquet
- Configuration générée par un script à partir de paquets système
Vérifions n°2 (le plus simple) :
dpkg -S initramfs-tools/conf.d/resume
dpkg-query : aucun chemin trouvé correspondant au motif *initramfs-tools/conf.d/resume*dpkg -S nous permet de rechercher dans la base des fichiers installés et de trouver à quel paquet appartient un fichier. Voici un exemple de recherche réussie :
dpkg -S resolv.conf
manpages : /usr/share/man/man5/resolv.conf.5.gz
systemd : /lib/systemd/resolv.confRevenons à notre tâche : le fichier initramfs-tools/conf.d/resume n'est pas installé dans le système à partir du paquet. Peut-être est-il généré dans le script postinst/preinst du paquet ? Vérifions la version numéro 3.
# cd /var/lib/dpkg/info/
# grep -r initramfs-tools/conf.d/resume *
initramfs-tools-core.postrm: rm -f /etc/initramfs-tools/conf.d/resumeDans le répertoire /var/lib/dpkg/info/ il existe des versions décompressées de tous les « métafichiers » des paquets (scripts d'installation/de suppression, descriptions de paquets, etc.). Étonnamment, ce fichier est supprimé dans le postrm (lors de la suppression) du paquet initramfs-tools-core. Regardons le contenu de son postinst… Rien en rapport avec le répertoire conf.d.
Regardons les fichiers du paquet initramfs-tools-core.
# dpkg -L initramfs-tools-core
...
/usr/share/initramfs-tools/hooks/resume
...Commande dpkg -L nous permet de voir tous les fichiers présents dans le système à partir du paquet indiqué. J'ai mis en évidence un fichier intéressant à étudier. L'examen de ce fichier montre comment cette variable est utilisée, mais ne répond pas à la question d'où elle provient.
debconf
Il s'agit donc d'un artefact de quelqu'un. De qui ? Avant de plonger dans l'installateur, examinons une autre infrastructure importante de Debian : les réponses aux questions. Chaque fois qu'un paquet pose une question, et dans de nombreux cas, lorsqu'il n'en pose pas mais utilise une option par défaut, tant la question que la réponse sont enregistrées dans une base spéciale dans Debian, appelée debconf. Nous pouvons jeter un œil à la base des réponses (et même les définir avant l'installation du paquet lui-même — debconf-set-selections), pour cela, nous aurons besoin de l'outil debconf-get-selections de la suite debconf-utils. Malheureusement, rien d'intéressant n'a été trouvé : (debconf-get-selections |grep -i resume a renvoyé vide).
debian-installer
L'installateur a sa propre base de réponses aux questions : /var/log/installer/cdebconf/questions.dat. Malheureusement, il n'y a aussi pas un mot sur notre resume.
Cependant, il y a des logs à proximité, y compris syslog, où est enregistré tout le log d'installation. Il mentionne le paquet base-installer, et sur celui-ci nous pouvons voir un lien vers les sources.
À l'intérieur, nous trouvons facilement la réponse à notre question :
resume="$(mapdevfs "$resume_devfs")"; then
...
if [ "$do_initrd" = yes ]; then
...
resumeconf=$IT_CONFDIR/resume
....
echo "RESUME=$resume" >> $resumeconfmapdevfs est un utilitaire au but évident, et la fonction qui nous intéresse est get_resume_partition, qui lit /proc/swaps et y sélectionne le plus grand. Cependant, notre swap provient de partman.
La réponse à notre test : le fichier est créé par l'installateur dans /target au moment de l'installation, c'est-à-dire que nous parlons d'un artefact bien connu. Dans les paquets existants sur le système, il n'y a personne et rien qui puisse modifier ce fichier.
En résumé
- dpkg et debconf sont les principales méthodes de recherche des fournisseurs de fichiers.
- la recherche dans /var/lib/dpkg/info permet de voir les opérations sur les fichiers au moment de l'installation.
- L'installateur peut créer des fichiers-artefacts qui ne sont jamais modifiés (excepté par l'utilisateur), et cela peut être vu dans le code de l'installateur.
Source : habr.com
