Ziel dieses Beitrags: die Debugging-Technik in Debian/Ubuntu zu demonstrieren, die mit dem „Suchen der Quelle“ in der Systemkonfigurationsdatei zusammenhängt.
Testbeispiel: Nach langem Herumärgern mit der tar.gz-Kopie des installierten Betriebssystems und nach deren Wiederherstellung und Installation von Updates erhalten wir die Meldung:
update-initramfs: Generating /boot/initrd.img-4.15.0-54-generic
W: initramfs-tools-Konfiguration setzt RESUME=/dev/mapper/U1563304817I0-swap
W: aber kein passendes Swap-Gerät ist verfügbar.
I: Das initramfs wird versuchen, von /dev/dm-1 fortzufahren
I: (/dev/mapper/foobar-swap)
I: Setzen Sie die RESUME-Variable, um dies zu überschreiben.Ziel: Verstehen, woher dieser Wert (U1563304817I0) stammt und wie man ihn richtig ändert. Dies ist ein zufälliges Beispiel, nicht besonders interessant an sich, aber praktisch, um Methoden zur Arbeit mit Linux zu demonstrieren..
Schritt Nummer 1: Woher kommt RESUME?
# cd /etc
# grep -r RESUME
initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swapWir suchen rekursiv (-r) nach einer Erwähnung dieser Variable im Verzeichnis /etc (da ist die Mehrheit der Konfigurationen). Wir finden einen conf.d-Schnipsel, der offensichtlich vom Paket initramfs-tools verwendet wird.
Woher stammt dieser Schnipsel?
Es gibt drei Möglichkeiten:
- Ein magisches Artefakt (jemand hat es vergessen)
- Konfiguration aus dem Paket
- Konfiguration, die durch ein Skript aus den Systempaketen generiert wurde
Überprüfen wir Nummer 2 (als die einfachste):
dpkg -S initramfs-tools/conf.d/resume
dpkg-query: kein passender Pfad gefunden, der dem Muster *initramfs-tools/conf.d/resume* entspricht.dpkg -S ermöglicht es uns, in der Datenbank der installierten Dateien zu suchen und herauszufinden, zu welchem Paket die Datei gehört. Hier ein Beispiel für eine erfolgreiche Suche:
dpkg -S resolv.conf
manpages: /usr/share/man/man5/resolv.conf.5.gz
systemd: /lib/systemd/resolv.confKehren wir zu unserer Aufgabe zurück: die Datei initramfs-tools/conf.d/resume wird nicht durch das Paket im System installiert. Vielleicht wird sie im postinst/preinst-Skript des Pakets generiert? Überprüfen wir Version Nummer 3.
# cd /var/lib/dpkg/info/
# grep -r initramfs-tools/conf.d/resume *
initramfs-tools-core.postrm: rm -f /etc/initramfs-tools/conf.d/resumeIm Verzeichnis /var/lib/dpkg/info/ enthalten die entpackten Versionen aller „Metadateien“ von Paketen (Installations-/Entfernungsskripte, Paketbeschreibungen usw.). Erstaunlich, aber diese Datei wird im postrm (beim Entfernen) des Pakets initramfs-tools-core gelöscht. Lassen Sie uns den Inhalt seines postinst ansehen… Nichts, was die conf.d-Direktive betrifft.
Lassen Sie uns die Dateien aus dem Paket anschauen initramfs-tools-core.
# dpkg -L initramfs-tools-core
...
/usr/share/initramfs-tools/hooks/resume
...Team dpkg -L erlaubt es, alle Dateien anzuzeigen, die im System von dem angegebenen Paket existieren. Ich habe eine interessante Datei zur Untersuchung ausgewählt. Die Untersuchung der Datei zeigt, wie diese Variable verwendet wird, stellt aber nicht klar, woher sie kommt.
debconf
Es scheint, dass es sich um ein Artefakt von jemandem handelt. Von wem? Bevor wir in den Installer eintauchen, schauen wir uns eine weitere wichtige Infrastruktur von Debian an – die Antworten auf Fragen. Jedes Mal, wenn ein Paket eine Frage stellt, und in vielen Fällen, wenn es keine Frage stellt, aber die Standardoption verwendet, werden sowohl die Frage als auch die Antwort in einer speziellen Datenbank in Debian gespeichert, die debconf genannt wird. Wir können die Antwortdatenbank ansehen (und sogar die Antworten noch vor der Installation des eigentlichen Pakets festlegen – debconf-set-selections), dafür benötigen wir das Dienstprogramm debconf-get-selections aus dem Paket debconf-utils. Leider gibt es nichts Interessantes: (debconf-get-selections |grep -i resume gab nichts zurück).
debian-installer
Der Installer hat seine eigene Datenbank für die Fragen: /var/log/installer/cdebconf/questions.dat. Leider steht dort auch kein Wort über unser Resume.
Dafür gibt es in der Nähe Protokolle, einschließlich syslog, in denen das gesamte Installationsprotokoll verfasst wird. Dort wird das Paket base-installer erwähnt, und in dessen sehen wir einen Link zu den Quellcodes.
Darin finden wir mühelos die Antwort auf unsere Frage:
resume="$(mapdevfs "$resume_devfs")"; dann
...
wenn [ "$do_initrd" = yes ]; dann
...
resumeconf=$IT_CONFDIR/resume
....
echo "RESUME=$resume" >> $resumeconfmapdevfs ist ein Dienstprogramm mit klarer Funktionalität, und die interessante Funktion für uns ist get_resume_partition, die /proc/swaps liest und das Größte auswählt. Der Swap stammt von partman.
Die Antwort auf unsere Testaufgabe: Die Datei wird vom Installer im /target beim Installationszeitpunkt erstellt, d.h. wir sprechen über ein bekanntes, aber dennoch Artefakt. In den bestehenden Paketen im System gibt es nichts, was diese Datei ändern würde.
Zusammenfassend
- dpkg und debconf sind die Hauptmethoden zur Suche nach den Dateiherstellern.
- Die Suche in /var/lib/dpkg/info ermöglicht es, die Operationen an den Dateien während der Installation zu sehen.
- Der Installer kann Artefakt-Dateien erstellen, die danach von niemandem jemals geändert werden (außer vom Benutzer), und das kann im Code des Installers gesehen werden.
Quelle: habr.com
