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:
- Čarobni artefakt (nekdo ga je postavil in pozabil)
- Konfiguracija iz paketa
- 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
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:
- dpkg in debconf sta glavni metodi za iskanje ponudnikov datotek.
- iskanje v /var/lib/dpkg/info vam omogoča ogled operacij na datotekah med fazo namestitve.
- 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