Var kommer denna konfiguration ifrån? [Debian/Ubuntu]

Syftet med detta inlägg är att visa en felsökningsteknik i debian/ubuntu relaterad till "att hitta källan" i systemkonfigurationsfilen.

Testexempel: efter mycket hån mot tar.gz-kopian av det installerade operativsystemet och efter att ha återställt det och installerat uppdateringar får vi meddelandet:

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.

Mål: förstå var detta värde (U1563304817I0) kom ifrån och hur man ändrar det korrekt. Detta är det första exemplet som kom över, inte särskilt intressant i sig, men bekvämt för att visa praktiska metoder för att arbeta med Linux.

Steg nummer 1: Var kom RESUME ifrån?

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

vi rekursivt (-r) leta efter ett omnämnande av denna variabel i katalogen /etc (där de flesta konfigurationerna finns). Vi hittar kodavsnittet conf.d, som tydligt används av paketet initramfs-tools.

Var är det här klippet ifrån?

Det finns tre alternativ:

  1. Magisk artefakt (någon satte den och glömde)
  2. Konfigurera från paketet
  3. Konfiguration genererad av något skript från systempaket

Låt oss kontrollera nr 2 (som den enklaste):

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

dpkg -S låter oss söka i databasen med installerade filer och hitta vilket paket filen tillhör. Här är ett exempel på en lyckad sökning:

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

Låt oss återgå till vår uppgift: fil initramfs-tools/conf.d/resume är inte installerat på systemet från paketet. Kanske genereras det i postinst/preinst-skriptet för paketet? Låt oss kolla 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

I katalogen /var/lib/dpkg/info/ det finns uppackade versioner av alla "metafiler" av paket (installations-/borttagningsskript, paketbeskrivningar, etc.). Överraskande nog tas den här filen bort i postrm (vid avinstallation) av paketet initramfs-tools-core. Låt oss titta på innehållet i dess postinst... Inget relaterat till conf.d-katalogen.

Låt oss titta på filerna som ingår i paketet initramfs-tools-core.

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

Team dpkg -L låter dig se alla filer som finns på systemet från det angivna paketet. Jag har lyft fram en fil som är intressant att studera. Att granska filen visar hur denna variabel används, men berättar inte var den kommer ifrån.

debconf

Det visar sig att detta är någons artefakt. Vars? Innan vi dyker in i installationsprogrammet, låt oss ta en titt på en annan viktig Debianinfrastruktur - svar på frågor. Varje gång ett paket ställer en fråga, och i många fall när det inte ställer en fråga utan använder standardalternativet, registreras både frågan och svaret i en speciell databas i Debian som heter debconf. Vi kan titta på databasen med svar (och till och med ställa in dem innan vi installerar själva paketet - debconf-set-selections), för detta behöver vi ett verktyg debconf-get-selections från kompositionen debconf-utils. Tyvärr hittades inget intressant :(debconf-get-selections |grep -i resume returneras tom).

debian-installer

Installatören har sin egen databas med svar på frågor: /var/log/installer/cdebconf/questions.dat. Tyvärr finns det inte heller ett ord om vårt CV.
Men det finns stockar i närheten, inkl. syslog, där hela installationsloggen skrivs. Basinstallationspaketet nämns där och på det странице vi kan se länken till råvarorna.

Inuti dem kan vi enkelt hitta svaret på vår fråga:

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

mapdevfs är ett verktyg med ett tydligt syfte, och funktionen vi är intresserade av är get_resume_partition, som läser /proc/swaps och väljer den största där. Swap kommer från partman.

Svaret på vår testuppgift: filen skapas av installationsprogrammet i /target vid installationstillfället, dvs. vi pratar om välkända, men en artefakt. Det finns ingen eller något i de befintliga paketen i systemet som kan ändra denna fil.

Sammanfattningsvis

  1. dpkg och debconf är de viktigaste metoderna för att hitta filleverantörer.
  2. genom att söka i /var/lib/dpkg/info kan du se operationer på filer under installationsfasen.
  3. Installationsprogrammet kan skapa artefaktfiler som sedan aldrig ändras av någon (förutom användaren), och detta kan ses i installationskoden.

Källa: will.com

Lägg en kommentar