Woher kommt diese Konfiguration? [Debian / Ubuntu]

Der Zweck dieses Beitrags ist es, die Debian / Ubuntu-Debugging-Technik im Zusammenhang mit der "Quellensuche" in der Systemkonfigurationsdatei zu zeigen.


Testbeispiel: Nach langem Mobbing einer tar.gz-Kopie des installierten Betriebssystems und nach dem Wiederherstellen und Installieren von Updates erhalten wir die folgende Meldung:


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. 

Zweck: um zu verstehen, woher dieser Wert (U1563304817I0) stammt und wie man ihn richtig ändert. Dies ist das erste Beispiel, das an sich nicht besonders interessant ist, aber praktisch ist, um praktische Methoden für die Arbeit mit Linux zu zeigen .


Schritt Nummer 1: Woher kam RESUME?


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

Wir suchen rekursiv ( -r ) nach der Erwähnung dieser Variablen im Verzeichnis / etc (wo sich die meisten Konfigurationen befinden). Wir finden conf.d ein Snippet, das vom Paket initramfs-tools explizit verwendet wird.


Woher kommt dieses Snippet?


Es gibt drei Möglichkeiten:


  1. Magisches Artefakt (jemand gesetzt und vergessen)
  2. Konfiguration aus dem Paket
  3. Eine Konfiguration, die von einem Skript aus Systempaketen generiert wird

Überprüfen Sie Nr. 2 (als einfachste):


  dpkg -S initramfs-tools/conf.d/resume dpkg-query: no path found matching pattern *initramfs-tools/conf.d/resume* 

dpkg -S können wir die Datenbank der installierten Dateien durchsuchen und herausfinden, 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 

Wir kehren zu unserer Aufgabe zurück: Die Datei initramfs-tools/conf.d/resume wird nicht aus dem Paket auf dem System installiert. Vielleicht wird es im Postinst / Preinst-Skript des Pakets generiert? Überprüfen Sie die Versionsnummer 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 

Das Verzeichnis /var/lib/dpkg/info/ enthält die entpackten Versionen aller Paket-Metadateien (Installations- / Deinstallationsskripte, Paketbeschreibungen usw.). Überraschenderweise wird diese Datei im Postrm (beim Löschen) des initramfs-tools-core-Pakets gelöscht. Lassen Sie uns den Inhalt seines Postinst sehen ... Nichts in Bezug auf das Verzeichnis conf.d.


Schauen wir uns die Dateien aus dem Paket initramfs-tools-core an.


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

Mit dem Befehl dpkg -L können Sie alle auf dem System befindlichen Dateien aus dem angegebenen Paket anzeigen. Ich habe eine interessante Datei zum Studieren hervorgehoben. Das Untersuchen der Datei zeigt, wie diese Variable verwendet wird, antwortet jedoch nicht, woher sie kommt.


debconf


Es stellt sich heraus, dass dies jemandes Artefakt ist. Wem? Bevor wir uns mit dem Installationsprogramm befassen, schauen wir uns eine andere wichtige Debian-Infrastruktur an - Antworten auf Fragen. Jedes Mal, wenn ein Paket eine Frage stellt und in vielen Fällen keine Frage stellt, sondern die Standardoption verwendet, werden sowohl die Frage als auch die Antwort in einer speziellen Datenbank in Debian namens debconf festgelegt. Wir können uns die Antwortdatenbank ansehen (und sie sogar vor der Installation des Pakets selbst debconf-set-selections - debconf-set-selections ). Dazu benötigen wir das Dienstprogramm debconf-get-selections von debconf-utils . Leider wurde nichts Interessantes gefunden: ( debconf-get-selections |grep -i resume leer zurückgegeben).


Debian-Installer


Das Installationsprogramm verfügt über eine eigene Datenbank mit Antworten auf Fragen: /var/log/installer/cdebconf/questions.dat . Leider gibt es dort auch kein Wort über unseren Lebenslauf.
Aber es gibt Protokolle in der Nähe, einschließlich Syslog, in das das gesamte Installationsprotokoll geschrieben wird. Das Basisinstallationspaket wird dort erwähnt, und auf seiner Seite sehen wir einen Link zu den Rohdaten.


In ihnen finden wir leicht die Antwort auf unsere Frage:


  resume="$(mapdevfs "$resume_devfs")"; then ... if [ "$do_initrd" = yes ]; then ... resumeconf=$IT_CONFDIR/resume .... echo "RESUME=$resume" >> $resumeconf 

mapdevfs ist ein Dienstprogramm mit einem klaren Zweck, und die Funktion, an der wir interessiert sind, ist get_resume_partition , die / proc / swaps liest und die größte dort auswählt. Swap kommt von Partman.


Die Antwort auf unsere Testaufgabe: Die Datei wird vom Installationsprogramm in / target zum Zeitpunkt der Installation erstellt, d. H. Wir sprechen von einem bekannten, aber einem Artefakt. In den vorhandenen Paketen im System befindet sich niemand und nichts, um diese Datei zu ändern.


Zusammenfassend


  1. dpkg und debconf sind die Hauptmethoden zum Finden von Dateianbietern.
  2. Eine Suche in / var / lib / dpkg / info ermöglicht es Ihnen, Dateivorgänge während der Installationsphase anzuzeigen.
  3. Das Installationsprogramm kann Artefaktdateien erstellen, die von niemandem (außer dem Benutzer) geändert werden. Dies wird im Installationscode angezeigt.

Source: https://habr.com/ru/post/de461033/


All Articles