Odkiaľ pochádza táto konfigurácia? [Debian/Ubuntu]

Úč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:

  1. Magický artefakt (niekto ho položil a zabudol)
  2. Konfigurácia z balíka
  3. 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 strana môžeme vidieť odkaz na raws.

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

  1. dpkg a debconf sú hlavné metódy na nájdenie poskytovateľov súborov.
  2. 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.
  3. 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

Pridať komentár