Scopul acestui post este de a arăta tehnica de depanare în Debian/Ubuntu legată de „căutarea sursei” în fișierul de configurare al sistemului.
Exemplul de test: după multe încercări cu copia tar.gz a sistemului de operare instalat și după restaurarea și actualizarea acesteia, primim mesajul:
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.Scopul: a înțelege de unde provine această valoare (U1563304817I0) și cum să o schimbăm corect. Acesta este un exemplu aleator, nu foarte interesant în sine, dar convenabil pentru a arăta metodele practice de lucru cu Linux..
Pasul numărul 1: De unde a venit RESUME?
# cd /etc
# grep -r RESUME
initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swapCăutăm recursiv (-r) mențiunea acestei variabile în directorul /etc (acolo unde se află majoritatea configurațiilor). Găsim un snippet conf.d care este utilizat evident de pachetul initramfs-tools.
De unde acest snippet?
Există trei variante:
- Artifact magic (cineva l-a pus și a uitat)
- Config din pachet
- Config generat de un script din pachetele de sistem
Verificăm nr. 2 (ca cea mai simplă):
dpkg -S initramfs-tools/conf.d/resume
dpkg-query: no path found matching pattern *initramfs-tools/conf.d/resume*dpkg -S ne permite să căutăm în baza de date a fișierelor instalate și să găsim la ce pachet aparține fișierul. Iată un exemplu de căutare reușită:
dpkg -S resolv.conf
manpages: /usr/share/man/man5/resolv.conf.5.gz
systemd: /lib/systemd/resolv.confNe întoarcem la sarcina noastră: fișierul initramfs-tools/conf.d/resume nu se instalează în sistem din pachet. Poate că este generat în scriptul postinst/preinst al pachetului? Verificăm varianta nr. 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În directorul /var/lib/dpkg/info/ există versiuni dezarhivate ale tuturor „metafililor” pachetelor (scripturi de instalare/ștergere, descrieri de pachete etc.). Este surprinzător, dar acest fișier este șters în postrm (la ștergerea) pachetului initramfs-tools-core. Să vedem conținutul postinst-ului său... Niciun indiciu legat de directorul conf.d.
Să ne uităm la fișierele din pachetul initramfs-tools-core.
# dpkg -L initramfs-tools-core
...
/usr/share/initramfs-tools/hooks/resume
...Comanda dpkg -L ne permite să vedem toate fișierele care există în sistem de la pachetul specificat. Am evidențiat un fișier interesant de studiat. Studiul acestui fișier arată cum este folosită această variabilă, dar nu răspunde de unde apare.
debconf
Se pare că acesta este un artefact al cuiva. Al cui? Înainte de a ne arunca în installer, haideți să aruncăm o privire asupra unei infrastructuri importante din Debian — răspunsurile la întrebări. De fiecare dată când un pachet pune o întrebare, și în multe cazuri când nu pune o întrebare, dar folosește varianta implicită, atât întrebarea, cât și răspunsul sunt fixate într-o bază specială în Debian, care se numește debconf. Putem să ne uităm la baza de răspunsuri (și chiar să le setăm înainte de instalarea pachetului în sine — debconf-set-selections), pentru asta avem nevoie de utilitarul debconf-get-selections din pachetul debconf-utils. Din păcate, nu s-a găsit nimic interesant: (debconf-get-selections |grep -i resume a returnat gol).
debian-installer
Installer-ul are propria bază de răspunsuri la întrebări: /var/log/installer/cdebconf/questions.dat. Din păcate, nici acolo nu există niciun cuvânt despre resume-ul nostru.
În schimb, există loguri, inclusiv syslog, unde se scrie întreaga înregistrare a instalării. Acolo este menționat pachetul base-installer, iar pe putem vedea un link către surse.
Între acestea, găsim cu ușurință răspunsul la întrebarea noastră:
resume="$(mapdevfs "$resume_devfs")"; then
...
if [ "$do_initrd" = yes ]; then
...
resumeconf=$IT_CONFDIR/resume
....
echo "RESUME=$resume" >> $resumeconfmapdevfs este un utilitar cu o funcție clară, iar funcția care ne interesează este get_resume_partition, care citește /proc/swaps și selectează cea mai mare. Swap-ul este obținut de la partman.
Răspunsul la sarcina noastră de testare: fișierul este creat de installer în /target în momentul instalării, adică vorbim despre un artefact bine-cunoscut. În pachetele existente în sistem nu există nimeni și nimic care să schimbe acest fișier.
În concluzie
- dpkg și debconf sunt metodele principale pentru a căuta furnizorii de fișiere.
- căutarea în /var/lib/dpkg/info permite vizualizarea operațiunilor asupra fișierelor în etapa de instalare.
- Installer-ul poate crea fișiere artefacte, care nu sunt niciodată modificate de nimeni (cu excepția utilizatorului), iar asta poate fi observat în codul installer-ului.
Sursa: habr.com
