Od kod prihaja ta konfiguracija? [Debian/Ubuntu]

Namen te objave je prikazati tehniko odpravljanja napak v debian/ubuntu, povezano z "iskanje vira" v sistemski konfiguracijski datoteki.

Testni primer: po dolgem norčevanju iz kopije nameščenega OS tar.gz in po obnovi in ​​namestitvi posodobitev prejmemo sporočilo:

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.

Cilj: razumeti, od kod ta vrednost (U1563304817I0) in kako jo pravilno spremeniti. To je prvi primer, na katerega se je naletel, sam po sebi ni posebej zanimiv, a primeren za prikaz praktičnih metod dela z Linuxom.

Korak številka 1: Od kod RESUME?

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

Mi rekurzivno (-r) poiščite omembo te spremenljivke v imeniku /etc (kjer je večina konfiguracij). Najdemo delček conf.d, ki ga očitno uporablja paket initramfs-tools.

Od kod je ta delček?

Obstajajo tri možnosti:

  1. Čarobni artefakt (nekdo ga je postavil in pozabil)
  2. Konfiguracija iz paketa
  3. Konfiguracija, ustvarjena s skriptom iz sistemskih paketov

Preverimo št. 2 (kot najenostavnejši):

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

dpkg -S omogoča iskanje po bazi nameščenih datotek in iskanje kateremu paketu datoteka pripada. Tukaj je primer uspešnega iskanja:

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

Vrnimo se k naši nalogi: datoteka initramfs-tools/conf.d/resume ni nameščen v sistemu iz paketa. Mogoče je ustvarjen v skriptu postinst/preinst paketa? Preverimo različico številka 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

V katalogu /var/lib/dpkg/info/ obstajajo nepakirane različice vseh »metadatotek« paketov (namestitveni/odstranitveni skripti, opisi paketov itd.). Presenetljivo je, da je ta datoteka odstranjena v postrm (ob odstranitvi) paketa initramfs-tools-core. Poglejmo vsebino njegove objave ... Nič v zvezi z imenikom conf.d.

Poglejmo si datoteke, vključene v paket initramfs-tools-core.

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

Ekipa dpkg -L vam omogoča ogled vseh datotek, ki so v sistemu iz navedenega paketa. Označil sem datoteko, ki je zanimiva za študij. Pregled datoteke pokaže, kako se ta spremenljivka uporablja, vendar ne pove, od kod prihaja.

debconf

Izkazalo se je, da je to artefakt nekoga. Čigav? Preden se poglobimo v namestitveni program, si oglejmo še eno pomembno infrastrukturo Debian - odgovore na vprašanja. Vsakič, ko paket zastavi vprašanje in v mnogih primerih, ko ne zastavi vprašanja, ampak uporabi privzeto možnost, sta tako vprašanje kot odgovor zabeležena v posebni bazi podatkov v Debianu, imenovani debconf. Lahko pogledamo bazo odgovorov (in jih celo nastavimo pred namestitvijo samega paketa - debconf-set-selections), za to potrebujemo pripomoček debconf-get-selections iz kompozicije debconf-utils. Na žalost ni bilo najdenega nič zanimivega :(debconf-get-selections |grep -i resume vrnjeno prazno).

namestitveni program debian

Namestitveni program ima svojo bazo odgovorov na vprašanja: /var/log/installer/cdebconf/questions.dat. Na žalost tudi o našem življenjepisu ni niti besede.
Toda v bližini so hlodi, vklj. syslog, kjer je zapisan celoten dnevnik namestitve. Paket osnovnega namestitvenega programa je omenjen tam in na njem Stran lahko vidimo povezavo do raws.

Znotraj njih zlahka najdemo odgovor na naše vprašanje:

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

mapdevfs je pripomoček z jasnim namenom, funkcija, ki nas zanima, pa je get_resume_partition, ki prebere /proc/swaps in tam izbere največjega. Zamenjava prihaja od partmana.

Odgovor na našo testno nalogo: datoteko ustvari namestitveni program v /target v času namestitve, tj. govorimo o znanem, a artefaktu. V obstoječih paketih v sistemu ni nikogar ali ničesar, kar bi lahko spremenilo to datoteko.

Če povzamemo:

  1. dpkg in debconf sta glavni metodi za iskanje ponudnikov datotek.
  2. iskanje v /var/lib/dpkg/info vam omogoča ogled operacij na datotekah med fazo namestitve.
  3. Namestitveni program lahko ustvari datoteke artefaktov, ki jih nato nihče nikoli ne spremeni (razen uporabnik), kar je razvidno iz kode namestitvenega programa.

Vir: www.habr.com

Dodaj komentar