Cilj ovog posta je pokazati tehniku debagiranja u debian/ubuntu, vezanu uz 'potragu za izvorom' u sistemskoj konfiguracijskoj datoteci.
Testni primjer: nakon dugih iskušenja s tar.gz kopijom instalirane OS i nakon njenog vraćanja i instalacije ažuriranja primamo poruku:
update-initramfs: Generating /boot/initrd.img-4.15.0-54-generic
W: initramfs-tools konfiguracija postavlja RESUME=/dev/mapper/U1563304817I0-swap
W: ali ne postoji odgovarajući swap uređaj.
I: Initramfs će pokušati da nastavi s /dev/dm-1
I: (/dev/mapper/foobar-swap)
I: Postavite RESUME varijablu da biste premostili ovo.Cilj: razumjeti odakle je ova vrijednost (U1563304817I0) došla i kako je pravilno promijeniti. Ovo je prvi slučaj, nije naročito zanimljiv sam po sebi, ali zgodan za pokazivanje 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-swapRekurzivno (-r) tražimo spominjanje ove varijable u direktoriju /etc (tamo gdje se nalazi većina konfiguracija). Pronalazimo conf.d isječak koji se očito koristi od strane paketa initramfs-tools.
Odakle dolazi ovaj isječak?
Postoje tri mogućnosti:
- Magični artefakt (neko ga je stavio i zaboravio)
- Konfiguracija iz paketa
- Konfiguracija generirana nekim skriptom iz sistemskih paketa
Provjeravamo br. 2 (kao najjednostavnije):
dpkg -S initramfs-tools/conf.d/resume
dpkg-query: nije pronađen nijedan put koji odgovara obrascu *initramfs-tools/conf.d/resume*dpkg -S omogućava nam da pretražimo bazu instaliranih datoteka i saznamo kojem paketu datoteka pripada. Evo primjera uspješnog pretraživanja:
dpkg -S resolv.conf
manpages: /usr/share/man/man5/resolv.conf.5.gz
systemd: /lib/systemd/resolv.confVraćamo se na naš zadatak: datoteka initramfs-tools/conf.d/resume se ne instalira u sistem iz paketa. Možda se generira u postinst/preinst skriptu paketa? Provjeravamo 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/resumeU direktoriju /var/lib/dpkg/info/ se nalaze raspakirane verzije svih 'metadatoteka' paketa (skripte za instalaciju/uklanjanje, opisi paketa itd.). Čudno, ali ova datoteka se briše u postrm (prilikom uklanjanja) paketa initramfs-tools-core. Pogledajmo sadržaj njegovog postinst… Nema ništa vezano za conf.d direktorij.
Pogledajmo datoteke unutar paketa initramfs-tools-core.
# dpkg -L initramfs-tools-core
...
/usr/share/initramfs-tools/hooks/resume
...Komanda dpkg -L omogućava da pogledamo sve datoteke koje postoje u sistemu iz naznačenog paketa. Istaknuo sam zanimljivu datoteku za proučavanje. Proučavanje datoteke pokazuje kako se ova varijabla koristi, ali ne odgovara odakle ona dolazi.
debconf
Izgleda da je ovo nečiji artefakt. Čiji? Prije nego što uronimo u instalater, pogledajmo još jednu važnu infrastrukturu Debiana — odgovore na pitanja. Svaki put kada paket postavi pitanje, i u mnogim slučajevima, kada ne postavi pitanje, ali koristi opciju po zadanim postavkama, i pitanje i odgovor se bilježe u posebnoj bazi podataka u Debiánu, koja se zove debconf. Možemo pogledati bazu odgovora (i čak ih izložiti prije instalacije samog paketa — debconf-set-selections), za to će nam biti potrebna alatka debconf-get-selections iz skupa debconf-utils. Nažalost, ništa zanimljivo nije pronađeno: (debconf-get-selections |grep -i resume vratio prazan rezultat).
debian-installer
Instalater ima svoju bazu odgovora na pitanja: /var/log/installer/cdebconf/questions.dat. Nažalost, tu takođe nema ni riječi o našem resume.
Međutim, pored se nalaze logovi, uključujući syslog, gdje se bilježi cijeli log instalacije. Spominje se paket base-installer, i na njegovom možemo vidjeti link na izvorne kodove.
Unutra njih lako pronalazimo odgovor na naše pitanje:
resume="$(mapdevfs "$resume_devfs")"; onda
...
ako [ "$do_initrd" = yes ]; onda
...
resumeconf=$IT_CONFDIR/resume
....
echo "RESUME=$resume" >> $resumeconfmapdevfs — to je alatka s jasnom namjenom, a zanimljiva funkcija za nas je get_resume_partition, koja čita /proc/swaps i bira najveći. Swap nam dolazi od partmana.
Odgovor na naš testni zadatak: datoteka se stvara od strane instalatera u /targetu u trenutku instalacije, tj. govorimo o well-known, ali artefaktu. U postojećim paketima u sistemu nema ničega što bi promijenilo ovu datoteku.
Zaključno
- dpkg i debconf — osnovne metode za pronalaženje dobavljača datoteka.
- pretraga u /var/lib/dpkg/info omogućava uvid u operacije nad datotekama tokom instalacijskog procesa.
- Instalater može stvarati artefakt datoteke koje se nikada ne mijenjaju (osim od strane korisnika), a to se može vidjeti u kodu instalatera.
Izvor: habr.com
