Odakle dolazi ova konfiguracija? [Debian/Ubuntu]

Svrha ovog posta je pokazati tehniku ​​otklanjanja pogrešaka u debian/ubuntu koja se odnosi na "pronalaženje izvora" u konfiguracijskoj datoteci sustava.

Testni primjer: nakon mnogo ismijavanja tar.gz kopije instaliranog OS-a i nakon vraćanja istog i instaliranja ažuriranja, dobivamo poruku:

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: shvatiti odakle dolazi ova vrijednost (U1563304817I0) i kako je ispravno promijeniti. Ovo je prvi primjer na koji sam naišao, nije posebno zanimljiv sam po sebi, ali zgodan za prikaz praktičnih metoda rada s Linuxom.

Korak broj 1: Odakle je došao REZUME?

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

Mi rekurzivno (-r) potražite spominjanje ove varijable u /etc direktoriju (gdje je većina konfiguracija). Pronalazimo isječak conf.d, koji jasno koristi paket initramfs-tools.

Odakle je ovaj isječak?

Postoje tri mogućnosti:

  1. Magični artefakt (netko ga je stavio i zaboravio)
  2. Konfiguracija iz paketa
  3. Konfiguraciju generira neka skripta iz sistemskih paketa

Provjerimo br. 2 (kao najjednostavniji):

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

dpkg -S omogućuje nam pretraživanje baze instaliranih datoteka i pronalaženje kojem paketu datoteka pripada. Evo primjera uspješne pretrage:

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

Vratimo se našem zadatku: datoteka initramfs-tools/conf.d/resume nije instaliran na sustav iz paketa. Možda se generira u postinst/preinst skripti paketa? Provjerimo verziju broj 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

U katalogu /var/lib/dpkg/info/ postoje neraspakirane verzije svih “metadatoteka” paketa (skripte za instalaciju/uklanjanje, opisi paketa itd.). Iznenađujuće, ova je datoteka uklonjena u postrm (nakon deinstalacije) paketa initramfs-tools-core. Pogledajmo sadržaj njegovog postinst-a... Ništa vezano uz direktorij conf.d.

Pogledajmo datoteke uključene u paket initramfs-tools-core.

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

Momčad dpkg -L omogućuje pregled svih datoteka koje se nalaze na sustavu iz navedenog paketa. Označio sam datoteku koja je zanimljiva za proučavanje. Ispitivanje datoteke pokazuje kako se ova varijabla koristi, ali ne otkriva odakle dolazi.

debconf

Ispostavilo se da je to nečiji artefakt. Čiji? Prije nego što se upustimo u instalacijski program, pogledajmo još jednu važnu Debian infrastrukturu - odgovore na pitanja. Svaki put kada paket postavi pitanje, au mnogim slučajevima kada ne postavi pitanje nego koristi zadanu opciju, i pitanje i odgovor se bilježe u posebnoj bazi podataka u Debianu koja se zove debconf. Možemo pogledati bazu odgovora (i čak ih postaviti prije instaliranja samog paketa - debconf-set-selections), za ovo nam je potreban pomoćni program debconf-get-selections iz sastava debconf-utils. Nažalost, ništa zanimljivo nije pronađeno :(debconf-get-selections |grep -i resume vratio prazan).

debian-instalacijski program

Instalater ima vlastitu bazu odgovora na pitanja: /var/log/installer/cdebconf/questions.dat. Nažalost, nema ni riječi o našem životopisu.
Ali u blizini su trupci, uklj. syslog, gdje je zapisan cijeli dnevnik instalacije. Osnovni instalacijski paket je spomenut tamo i na njemu stranica možemo vidjeti vezu na raws.

U njima lako možemo pronaći odgovor na naše pitanje:

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

mapdevfs je uslužni program s jasnom svrhom, a funkcija koja nas zanima je get_resume_partition, koji čita /proc/swaps i tamo odabire najveći. Zamjena dolazi od partmana.

Odgovor na naš testni zadatak: datoteku kreira instalacijski program u /target u vrijeme instalacije, tj. govorimo o poznatom, ali artefaktu. Ne postoji nitko ili ništa u postojećim paketima u sustavu što može promijeniti ovu datoteku.

Sažimanje

  1. dpkg i debconf su glavne metode za pronalaženje pružatelja datoteka.
  2. pretraživanje u /var/lib/dpkg/info omogućuje vam da vidite operacije na datotekama tijekom faze instalacije.
  3. Instalacijski program može stvoriti datoteke artefakta koje tada nitko (osim korisnika) nikada ne mijenja, a to se može vidjeti u kodu instalacijskog programa.

Izvor: www.habr.com

Dodajte komentar