Le but de cet article est de montrer la technique de débogage debian / ubuntu liée à la "recherche source" dans le fichier de configuration du système.
Exemple de test: après une longue intimidation d'une copie tar.gz du système d'exploitation installé et après sa restauration et l'installation des mises à jour, nous obtenons le message:
update-initramfs: Generating /boot/initrd.img-4.15.0-54-generic W: initramfs-tools configuration sets RESUME=/dev/mapper/U1563304817I0-swap W: but no matching swap device is available. I: The initramfs will attempt to resume from /dev/dm-1 I: (/dev/mapper/foobar-swap) I: Set the RESUME variable to override this.
Objectif: comprendre d'où vient cette valeur (U1563304817I0) et comment la modifier correctement. C'est le premier exemple qui se présente, pas particulièrement intéressant en soi, mais pratique pour montrer des méthodes pratiques de travail avec Linux .
Étape numéro 1: D'où est venu RESUME?
# cd /etc # grep -r RESUME initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swap
Nous recherchons récursivement ( -r
) la mention de cette variable dans le répertoire / etc (où se trouvent la plupart des configurations). Nous trouvons conf.d un extrait qui est explicitement utilisé par le package initramfs-tools.
D'où vient cet extrait?
Il y a trois options:
- Artefact magique (quelqu'un a mis et oublié)
- Configuration du package
- Une configuration générée par un script à partir de packages système
Chèque n ° 2 (le plus simple):
dpkg -S initramfs-tools/conf.d/resume dpkg-query: no path found matching pattern *initramfs-tools/conf.d/resume*
dpkg -S
nous permet de rechercher dans la base de données des fichiers installés et de trouver à quel package le fichier appartient. Voici un exemple de recherche réussie:
dpkg -S resolv.conf manpages: /usr/share/man/man5/resolv.conf.5.gz systemd: /lib/systemd/resolv.conf
Nous revenons à notre tâche: le fichier initramfs-tools/conf.d/resume
n'est pas installé dans le système à partir du package. Peut-être qu'il est généré dans le script postinst / preinst du package? Vérifiez le numéro de version 3.
# cd /var/lib/dpkg/info/ # grep -r initramfs-tools/conf.d/resume * initramfs-tools-core.postrm: rm -f /etc/initramfs-tools/conf.d/resume
Le répertoire /var/lib/dpkg/info/
contient les versions décompressées de tous les «métafichiers» du package (scripts d'installation / désinstallation, descriptions de package, etc.). Étonnamment, ce fichier est supprimé dans le postrm (lors de la suppression) du package initramfs-tools-core. Voyons le contenu de son postinst ... Rien concernant le répertoire conf.d.
Regardons les fichiers du paquet initramfs-tools-core
.
# dpkg -L initramfs-tools-core ... /usr/share/initramfs-tools/hooks/resume ...
La commande dpkg -L
vous permet de voir tous les fichiers qui se trouvent sur le système à partir du package spécifié. J'ai mis en évidence un dossier intéressant à étudier. L'examen du fichier montre comment cette variable est utilisée, mais ne répond pas d'où elle vient.
debconf
Il s'avère que c'est l'artefact de quelqu'un. À qui? Avant de plonger dans l'installateur, regardons une autre infrastructure Debian importante - les réponses aux questions. Chaque fois qu'un paquet pose une question, et dans de nombreux cas lorsqu'il ne pose pas de question, mais utilise l'option par défaut, la question et la réponse sont fixées dans une base de données spéciale dans Debian appelée debconf. Nous pouvons regarder la base de données de réponses (et même les définir avant d'installer le paquet lui-même - debconf-set-selections
), pour cela nous avons besoin de l'utilitaire debconf-get-selections
de debconf-utils
. Malheureusement, rien d'intéressant n'a été trouvé: ( debconf-get-selections |grep -i resume
retourné vide).
installateur debian
Le programme d'installation possède sa propre base de données de réponses aux questions: /var/log/installer/cdebconf/questions.dat
. Malheureusement, il n'y a pas un mot sur notre CV là non plus.
Mais il y a des journaux à proximité, y compris syslog, où tout le journal d'installation est écrit. Le package de base-installer y est mentionné, et sur sa page nous pouvons voir un lien vers les raws.
A l'intérieur d'eux, on trouve facilement la réponse à notre question:
resume="$(mapdevfs "$resume_devfs")"; then ... if [ "$do_initrd" = yes ]; then ... resumeconf=$IT_CONFDIR/resume .... echo "RESUME=$resume" >> $resumeconf
mapdevfs est un utilitaire avec un objectif clair, et la fonction qui nous intéresse est get_resume_partition
, qui lit / proc / swaps et sélectionne le plus grand là-bas. Le swap vient de partman.
La réponse à notre tâche de test: le fichier est créé par l'installateur dans / target au moment de l'installation, c'est-à-dire nous parlons d'un bien connu, mais un artefact. Il n'y a personne et rien dans les packages existants du système pour modifier ce fichier.
Pour résumer
- dpkg et debconf sont les principales méthodes de recherche de fournisseurs de fichiers.
- une recherche dans / var / lib / dpkg / info vous permet de voir les opérations sur les fichiers pendant la phase d'installation.
- Le programme d'installation peut créer des fichiers d'artefact qui ne sont jamais modifiés par quiconque (à l'exception de l'utilisateur), et cela peut être vu dans le code du programme d'installation.