Účelom tohto príspevku je ukázať techniku ladenia v debian/ubuntu týkajúcu sa „hľadania zdroja“ v konfiguračnom súbore systému.
Testovací príklad: po mnohých výsmech kópii tar.gz nainštalovaného OS a po jej obnovení a inštalácii aktualizácií dostaneme správu:
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.
Cieľ: pochopiť, odkiaľ pochádza táto hodnota (U1563304817I0) a ako ju správne zmeniť. Toto je prvý príklad, ktorý sa objavil, sám o sebe nie je príliš zaujímavý, ale vhodný na zobrazenie praktických metód práce s Linuxom.
Krok číslo 1: Odkiaľ pochádza RESUME?
# cd /etc
# grep -r RESUME
initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swap
My rekurzívne (-r
) hľadajte zmienku o tejto premennej v adresári /etc (kde je väčšina konfigurácií). Nájdeme fragment conf.d, ktorý jednoznačne používa balík initramfs-tools.
Odkiaľ je tento úryvok?
Existujú tri možnosti:
- Magický artefakt (niekto ho položil a zabudol)
- Konfigurácia z balíka
- Konfigurácia vygenerovaná nejakým skriptom zo systémových balíkov
Pozrime sa na č. 2 (ako najjednoduchšie):
dpkg -S initramfs-tools/conf.d/resume
dpkg-query: no path found matching pattern *initramfs-tools/conf.d/resume*
dpkg -S
nám umožňuje prehľadávať databázu nainštalovaných súborov a nájsť, do ktorého balíka daný súbor patrí. Tu je príklad úspešného vyhľadávania:
dpkg -S resolv.conf
manpages: /usr/share/man/man5/resolv.conf.5.gz
systemd: /lib/systemd/resolv.conf
Vráťme sa k našej úlohe: súbor initramfs-tools/conf.d/resume
nie je nainštalovaný v systéme z balíka. Možno je vygenerovaný v skripte postinst/preinst balíka? Pozrime sa na verziu číslo 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 katalógu /var/lib/dpkg/info/
existujú rozbalené verzie všetkých „metasúborov“ balíkov (inštalačné/odstraňovacie skripty, popisy balíkov atď.). Prekvapivo je tento súbor odstránený v postrm (pri odinštalovaní) balíka initramfs-tools-core. Pozrime sa na obsah jeho postinst... Nič súvisiace s adresárom conf.d.
Pozrime sa na súbory, ktoré sú súčasťou balenia initramfs-tools-core
.
# dpkg -L initramfs-tools-core
...
/usr/share/initramfs-tools/hooks/resume
...
Tím dpkg -L
umožňuje zobraziť všetky súbory, ktoré sú v systéme zo zadaného balíka. Zvýraznil som súbor, ktorý je zaujímavý na štúdium. Preskúmanie súboru ukazuje, ako sa táto premenná používa, ale nehovorí, odkiaľ pochádza.
debconf
Ukáže sa, že ide o niečí artefakt. koho? Skôr než sa pustíme do inštalačného programu, pozrime sa na ďalšiu dôležitú infraštruktúru Debianu – odpovede na otázky. Zakaždým, keď balík položí otázku a v mnohých prípadoch, keď nepoloží otázku, ale použije predvolenú možnosť, sa otázka aj odpoveď zaznamenajú do špeciálnej databázy v Debiane s názvom debconf. Môžeme sa pozrieť na databázu odpovedí (a dokonca ich nastaviť pred inštaláciou samotného balíka - debconf-set-selections
), na to potrebujeme utilitu debconf-get-selections
zo zloženia debconf-utils
. Žiaľ, nič zaujímavé sa nenašlo :(debconf-get-selections |grep -i resume
vrátené prázdne).
debian-installer
Inštalátor má vlastnú databázu odpovedí na otázky: /var/log/installer/cdebconf/questions.dat
. Žiaľ, nie je tam ani slovo o našom životopise.
Ale v blízkosti sú guľatiny vr. syslog, kde je zapísaný celý inštalačný protokol. Balíček base-installer je spomenutý tam a na ňom
V nich ľahko nájdeme odpoveď na našu otázku:
resume="$(mapdevfs "$resume_devfs")"; then
...
if [ "$do_initrd" = yes ]; then
...
resumeconf=$IT_CONFDIR/resume
....
echo "RESUME=$resume" >> $resumeconf
mapdevfs je nástroj s jasným účelom a funkcia, ktorá nás zaujíma, je get_resume_partition
, ktorý načíta /proc/swaps a vyberie tam najväčší. Výmena pochádza od partmana.
Odpoveď na našu testovaciu úlohu: súbor vytvorí inštalátor v /target v čase inštalácie, t.j. hovoríme o známom, no artefakte. V existujúcich balíkoch v systéme nie je nikto alebo nič, čo by mohlo zmeniť tento súbor.
Sčítanie
- dpkg a debconf sú hlavné metódy na nájdenie poskytovateľov súborov.
- vyhľadávanie v /var/lib/dpkg/info vám umožňuje vidieť operácie so súbormi počas fázy inštalácie.
- Inštalátor môže vytvárať súbory artefaktov, ktoré potom nikto (okrem používateľa) nikdy nezmení, a to je možné vidieť v kóde inštalačného programu.
Zdroj: hab.com