Odakle dolazi ova konfiguracija? [Debian/Ubuntu]

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

Testni primjer: nakon mnogo ismijavanja tar.gz kopije instaliranog OS-a i nakon njegovog vraćanja u prethodno stanje i instaliranja ažuriranja, dobijamo 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: razumjeti odakle dolazi ova vrijednost (U1563304817I0) i kako je ispravno promijeniti. Ovo je prvi primjer koji je naišao, nije posebno zanimljiv sam po sebi, ali zgodan za prikaz praktičnih metoda rada s Linuxom.

Korak broj 1: Odakle dolazi RESUME?

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

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

Odakle je ovaj isječak?

Postoje tri opcije:

  1. Magični artefakt (neko ga je stavio i zaboravio)
  2. Konfiguracija iz paketa
  3. Konfiguracija koju generiše 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ćava nam da pretražimo bazu podataka instaliranih datoteka i pronađemo 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: fajlu initramfs-tools/conf.d/resume nije instaliran na sistemu iz paketa. Možda se generiše 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 raspakovane verzije svih “metafajlova” paketa (skripte za instalaciju/uklanjanje, opisi paketa, itd.). Iznenađujuće, ova datoteka je uklonjena u postrm (prilikom deinstalacije) paketa initramfs-tools-core. Pogledajmo sadržaj njegovog postinst... Ništa u vezi sa direktorijumom conf.d.

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

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

tim dpkg -L omogućava vam da vidite sve datoteke koje se nalaze na sistemu iz navedenog paketa. Istaknuo sam fajl koji je zanimljiv za proučavanje. Ispitivanje datoteke pokazuje kako se ova varijabla koristi, ali ne govori odakle dolazi.

debconf

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

debian-instalater

Instalater ima svoju bazu podataka odgovora na pitanja: /var/log/installer/cdebconf/questions.dat. Nažalost, nema ni riječi o našoj biografiji.
Ali u blizini ima trupaca, uklj. syslog, gdje je upisan cijeli dnevnik instalacije. Paket osnovnog instalacijskog programa se spominje tamo i na njemu stranica možemo vidjeti vezu do sirovina.

Unutar njih 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 sa jasnom svrhom, a funkcija koja nas zanima jeste get_resume_partition, koji čita /proc/swaps i tamo bira najveći. Swap dolazi od partmana.

Odgovor na naš testni zadatak: datoteku kreira instalater u /target u trenutku instalacije, tj. govorimo o dobro poznatom, ali artefaktu. Ne postoji niko ili ništa u postojećim paketima u sistemu što može promijeniti ovu datoteku.

Sumirati

  1. dpkg i debconf su glavne metode za pronalaženje dobavljača datoteka.
  2. pretraživanje u /var/lib/dpkg/info omogućava vam da vidite operacije na datotekama tokom faze instalacije.
  3. Instalater može kreirati datoteke artefakata koje tada niko ne mijenja (osim korisnika), a to se može vidjeti u kodu instalatera.

izvor: www.habr.com

Dodajte komentar