Hvor kommer denne konfigurasjonen fra? [Debian/Ubuntu]

Hensikten med dette innlegget er å vise en feilsøkingsteknikk i debian/ubuntu relatert til "finne kilden" i systemkonfigurasjonsfilen.

Testeksempel: etter mye hån mot tar.gz-kopien av det installerte operativsystemet og etter å ha gjenopprettet det og installert oppdateringer, får vi meldingen:

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: forstå hvor denne verdien (U1563304817I0) kom fra og hvordan du endrer den riktig. Dette er det første eksemplet som kom over, ikke spesielt interessant i seg selv, men praktisk for å vise praktiske metoder for å jobbe med Linux.

Trinn nummer 1: Hvor kom RESUME fra?

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

vi rekursivt (-r) se etter en omtale av denne variabelen i /etc-katalogen (hvor de fleste konfigurasjonene er). Vi finner conf.d-kodebiten, som tydelig brukes av initramfs-tools-pakken.

Hvor er dette utdraget fra?

Det er tre alternativer:

  1. Magisk artefakt (noen satte det og glemte det)
  2. Konfigurer fra pakken
  3. Konfigurasjon generert av et skript fra systempakker

La oss sjekke nr. 2 (som den enkleste):

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

dpkg -S lar oss søke i databasen med installerte filer og finne hvilken pakke filen tilhører. Her er et eksempel på et vellykket søk:

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

La oss gå tilbake til oppgaven vår: fil initramfs-tools/conf.d/resume er ikke installert på systemet fra pakken. Kanskje det er generert i postinst/preinst-skriptet til pakken? La oss sjekke versjon 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 er utpakkede versjoner av alle "metafiler" av pakker (installasjons-/fjerningsskript, pakkebeskrivelser, etc.). Overraskende nok fjernes denne filen i postrm (ved avinstallering) av initramfs-tools-core-pakken. La oss se på innholdet i postinst... Ingenting relatert til conf.d-katalogen.

La oss se på filene som er inkludert i pakken initramfs-tools-core.

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

Lag dpkg -L lar deg se alle filene som er på systemet fra den angitte pakken. Jeg har fremhevet en fil som er interessant for studier. Undersøkelse av filen viser hvordan denne variabelen brukes, men forteller ikke hvor den kommer fra.

debconf

Det viser seg at dette er noens gjenstand. Hvem sin? Før vi dykker inn i installasjonsprogrammet, la oss ta en titt på en annen viktig Debian-infrastruktur – svar på spørsmål. Hver gang en pakke stiller et spørsmål, og i mange tilfeller når den ikke stiller et spørsmål, men bruker standardalternativet, blir både spørsmålet og svaret registrert i en spesiell database i Debian kalt debconf. Vi kan se på databasen med svar (og til og med sette dem før vi installerer selve pakken - debconf-set-selections), for dette trenger vi et verktøy debconf-get-selections fra komposisjonen debconf-utils. Dessverre ble det ikke funnet noe interessant :(debconf-get-selections |grep -i resume returnert tom).

debian-installatør

Installatøren har sin egen database med svar på spørsmål: /var/log/installer/cdebconf/questions.dat. Dessverre er det heller ikke et ord om vår CV.
Men det er stokker i nærheten, inkl. syslog, hvor hele installasjonsloggen er skrevet. Base-installer-pakken er nevnt der, og på den side vi kan se lenken til raws.

Inne i dem kan vi enkelt finne svaret på spørsmålet vårt:

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

mapdevfs er et verktøy med et klart formål, og funksjonen vi er interessert i er get_resume_partition, som leser /proc/swaps og velger den største der. Swap kommer fra partman.

Svaret på vår testoppgave: filen opprettes av installasjonsprogrammet i /target på tidspunktet for installasjonen, dvs. vi snakker om velkjente, men en artefakt. Det er ingen eller noe i de eksisterende pakkene i systemet som kan endre denne filen.

Oppsummering

  1. dpkg og debconf er hovedmetodene for å finne filleverandører.
  2. ved å søke i /var/lib/dpkg/info kan du se operasjoner på filer under installasjonsfasen.
  3. Installasjonsprogrammet kan lage artefaktfiler som da aldri endres av noen (unntatt brukeren), og dette kan sees i installasjonskoden.

Kilde: www.habr.com

Legg til en kommentar