Cilj ovog posta je pokazati tehniku debagovanja u debian/ubuntu, vezanu za „pronalaženje izvora“ u sistemskoj konfiguracionoj datoteci.
Test primer: nakon dugog mučenja sa tar.gz kopijom instalirane OS-a i nakon njenog vraćanja i instalacije 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: shvatiti odakle je ova vrednost (U1563304817I0) došla i kako je ispravno promeniti. Ovo je prvi primer koji se našao, ne previše zanimljiv sam po sebi, ali zgodan za pokazivanje praktičnih metoda rada sa Linux-om..
Korak broj 1: Odakle je došao RESUME?
# cd /etc
# grep -r RESUME
initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swapRekurzivno (-r) tražimo pominjanje ove promenljive u direktorijumu /etc (gde je većina konfiguracija). Nalazimo conf.d isječak, koji se očigledno koristi od strane paketa initramfs-tools.
Odakle je ovaj isječak?
Postoje tri mogućnosti:
- Magični artefakt (neko ga je stavio i zaboravio)
- Konfiguracija iz paketa
- Konfiguracija generisana nekim skriptom iz sistemskih paketa
Proveravamo broj 2 (kao najjednostavnije):
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 instaliranih datoteka i saznamo kojem paketu datoteka pripada. Evo primera uspešnog pretraživanja:
dpkg -S resolv.conf
manpages: /usr/share/man/man5/resolv.conf.5.gz
systemd: /lib/systemd/resolv.confVraćamo se našoj zadatku: datoteka initramfs-tools/conf.d/resume se ne instalira u sistem iz paketa. Možda se generiše u postinst/preinst skriptu paketa? Proveravamo 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/resumeV imeniku /var/lib/dpkg/info/ se nalaze raspakovane verzije svih „metafajlova“ 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… Ništa što se tiče conf.d direktorije.
Pogledajmo datoteke iz 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 postoji u sistemu od navedenog paketa. Istakao sam datoteku zanimljivu za proučavanje. Proučavanje datoteke pokazuje kako se ova promenljiva koristi, ali ne odgovara odakle dolazi.
debconf
Zdi se, da gre za artefakt nekoga. Koga? Preden se potopimo v namestitveni program, si bomo ogledali še eno pomembno infrastrukturo Debian – odgovore na vprašanja. Vsakič, ko paket postavi vprašanje, in v mnogih primerih, ko ne postavi vprašanja, a uporablja privzeto možnost, се vprašanje in odgovor zabeležita v posebni bazi v Debiana, imenovani debconf. Lahko si ogledamo bazo odgovorov (in celo nastavimo pred namestitvijo samega paketa - debconf-set-selections), za kar bomo potrebovali orodje debconf-get-selections iz sklopa debconf-utils. Na žalost nismo našli nič zanimivega: (debconf-get-selections |grep -i resume je vrnil prazno).
debian-installer
Namestitveni program ima svojo bazo odgovorov na vprašanja: /var/log/installer/cdebconf/questions.dat. Na žalost tam prav tako ni niti besede o našem resume.
Kljub temu pa so tam dnevniški zapisi, vključno s syslogom, kamor se piše celoten dnevnik namestitve. Omenjen je paket base-installer, in na njegovem lahko vidimo povezavo na izvorne kode.
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" >> $resumeconfmapdevfs je orodje s povsem jasnim namenom, naš zanimiv funkcija pa je get_resume_partition, ki bere /proc/swaps in izbere največjega. Swap pa prihaja od partman’a.
Odgovor na našo testno nalogo: datoteko ustvari namestitveni program v /targetu ob namestitvi, tj. govorimo o well-known, a artefaktu. V obstoječih paketih v sistemu ni nikogar in ničesar, kar bi spremenilo to datoteko.
Na koncu
- dpkg in debconf sta glavna metoda za iskanje dobaviteljev datotek.
- iskanje v /var/lib/dpkg/info omogoča ogled operacij nad datotekami v fazi namestitve.
- Namestitveni program lahko ustvari datoteke-artefakte, ki jih potem nikoli ne spremeni nihče (razen uporabnika), kar je mogoče videti v kodi namestitvenega programa.
Izvor: habr.com
