Woher stammt diese Konfiguration? [Debian/Ubuntu]

Ziel dieses Beitrags: Die Debugging-Technik in Debian/Ubuntu zu zeigen, die mit dem „Quellensuchen“ in der Systemkonfigurationsdatei zusammenhängt.

Testbeispiel: Nach intensiven Experimenten mit einer tar.gz-Kopie des installierten Betriebssystems und nach deren Wiederherstellung und Installation von Updates erhalten wir die Meldung:

update-initramfs: Generiere /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 erstes willkürliches Beispiel, das an sich nicht besonders interessant ist, aber nützlich, um praktische Methoden im Umgang mit Linux zu zeigen..

Schritt eins: Woher kommt RESUME?

# cd /etc
# grep -r RESUME
initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swap

Wir suchen rekursiv (-r) nach einer Erwähnung dieser Variablen im Verzeichnis /etc (dort, wo die meisten Konfigurationen liegen). Wir finden einen conf.d-Schnipsel, der eindeutig vom Paket initramfs-tools verwendet wird.

Woher stammt dieser Schnipsel?

Es gibt drei Möglichkeiten:

  1. Magischer Artefakt (jemand hat es hingelegt und vergessen)
  2. Konfiguration aus dem Paket
  3. Konfiguration, die von einem Skript aus den Systempaketen generiert wurde

Überprüfen Nr. 2 (als einfachstes):

 dpkg -S initramfs-tools/conf.d/resume
dpkg-query: kein 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 ist ein Beispiel für eine erfolgreiche Suche:

dpkg -S resolv.conf
manpages: /usr/share/man/man5/resolv.conf.5.gz
systemd: /lib/systemd/resolv.conf

Kehren wir zu unserer Aufgabe zurück: die Datei initramfs-tools/conf.d/resume wird nicht durch das Paket im System installiert. Möglicherweise wird sie im postinst/preinst-Skript des Pakets generiert? Überprüfen wir die 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/resume

Im Verzeichnis /var/lib/dpkg/info/ liegen die entpackten Versionen aller "Metadateien" der Pakete (Installations-/Entfernungs-Skripte, Paketbeschreibungen usw.). Überraschenderweise wird diese Datei im postrm (bei der Entfernung) des Pakets initramfs-tools-core gelöscht. Schauen wir uns den Inhalt seines postinst an… Nichts, was die conf.d-Direktorie betrifft.

Schauen wir uns die Dateien des Pakets initramfs-tools-core.

# dpkg -L initramfs-tools-core
...
/usr/share/initramfs-tools/hooks/resume
...

Der Befehl dpkg -L ermöglicht es, alle Dateien anzuzeigen, die im System vom angegebenen Paket vorhanden sind. Ich habe eine interessante Datei hervorgehoben, die für die Untersuchung nützlich ist. Die Untersuchung der Datei zeigt, wie diese Variable verwendet wird, beantwortet jedoch nicht, woher sie stammt.

debconf

Es scheint, dass dies ein Artefakt von jemandem ist. Von wem? Bevor wir in den Installer eintauchen, schauen wir uns noch eine 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 aufgezeichnet, die debconf heißt. Wir können die Antwortdatenbank einsehen (und sogar die Antworten vor der Installation des Pakets festlegen — debconf-set-selections), dafür benötigen wir das Tool debconf-get-selections aus dem Paket debconf-utils. Leider wurde nichts Interessantes gefunden: (debconf-get-selections |grep -i resume gab leer zurück).

debian-installer

Der Installer hat seine eigene Datenbank für die Antworten auf Fragen: /var/log/installer/cdebconf/questions.dat. Leider steht dort auch kein Wort über unser resume.
Dafür gibt es Protokolle, unter anderem syslog, in dem das gesamte Installationsprotokoll festgehalten wird. Dort wird das Paket base-installer erwähnt, und zu dessen wurde können wir einen Verweis auf die Quellcodes sehen.

Innerhalb dieser finden wir leicht die Antwort auf unsere Frage:

  resume="$(mapdevfs "$resume_devfs")"; dann
...
    wenn [ "$do_initrd" = ja ]; dann
     ...
            resumeconf=$IT_CONFDIR/resume
....
                echo "RESUME=$resume" >> $resumeconf

mapdevfs ist ein Tool mit einer klaren Funktion, und die für uns interessante Funktion ist get_resume_partition, die /proc/swaps liest und dort die größte auswählt. Der Swap kommt von partman.

Die Antwort auf unsere Testaufgabe: Die Datei wird vom Installer im /target während der Installation erstellt, d.h. wir sprechen von einem wohlbekannten, aber artefaktiven Zustand. In den bestehenden Paketen im System gibt es nichts, was diese Datei verändert.

Zusammenfassend

  1. dpkg und debconf sind die wichtigsten Methoden zur Suche nach Lieferanten von Dateien.
  2. Die Suche in /var/lib/dpkg/info ermöglicht es, die Operationen an Dateien während des Installationsprozesses zu sehen.
  3. Der Installer kann Artefaktdateien erstellen, die dann nie von jemandem geändert werden (außer durch den Benutzer), und das kann im Installer-Code gesehen werden.

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster