Odkud je tento konfig? [Debian/Ubuntu]

Cílem tohoto příspěvku je ukázat techniku ladění v debianu/ubuntu spojenou s „hledáním zdroje“ v systémovém konfiguračním souboru.

Testovací příklad: po dlouhých mučeních s kopie tar.gz nainstalovaného OS a po jejím obnovení a instalaci aktualizací dostáváme zprávu:

update-initramfs: Generování /boot/initrd.img-4.15.0-54-generic
W: konfigurace initramfs-tools nastavuje RESUME=/dev/mapper/U1563304817I0-swap
W: ale žádné odpovídající swap zařízení není dostupné.
I: initramfs se pokusí obnovit z /dev/dm-1
I: (/dev/mapper/foobar-swap)
I: Nastavte proměnnou RESUME pro její přepsání.

Cíl: pochopit, odkud tato hodnota (U1563304817I0) přišla a jak ji správně změnit. Toto je první příklad, který se naskytl, není moc zajímavý sám o sobě, ale vhodný k předvedení praktických metod práce s Linuxem..

Krok číslo 1: Odkud přišlo RESUME?

# cd /etc
# grep -r RESUME
initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swap

Rekurzivně (-r) hledáme zmínku této proměnné v adresáři /etc (kde se nachází většina konfiguračních souborů). Nacházíme snippetu conf.d, který je jasně používán balíčkem initramfs-tools.

Odkud je tento snippeta?

Existují tři možnosti:

  1. Magický artefakt (někdo ho uložil a zapomněl)
  2. Konfigurace z balíčku
  3. Konfigurace generovaná nějakým skriptem ze systémových balíčků

Kontrolujeme číslo 2 (nejjednodušší):

 dpkg -S initramfs-tools/conf.d/resume
dpkg-query: žádná cesta nenalezena odpovídajícímu vzoru *initramfs-tools/conf.d/resume*

dpkg -S nám umožňuje hledat v databázi nainstalovaných souborů a zjistit, k jakému balíčku soubor patří. Zde je příklad úspěšného vyhledávání:

dpkg -S resolv.conf
manpages: /usr/share/man/man5/resolv.conf.5.gz
systemd: /lib/systemd/resolv.conf

Vracíme se k naší úloze: soubor initramfs-tools/conf.d/resume není do systému instalován z balíčku. Mohlo by to být generováno v postinst/preinst skriptu balíčku? Kontrolujeme verzi čí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 adresáři /var/lib/dpkg/info/ se nacházejí rozbalené verze všech „metafilů“ balíčků (instalační/odstranění skripty, popisy balíčků atd.). Je úžasné, ale tento soubor je odstraněn v postrm (při odstraňování) balíčku initramfs-tools-core. Podíváme se na obsah jeho postinst… Nic, co by se týkalo adresáře conf.d.

Podívejme se na soubory z balíčku initramfs-tools-core.

# dpkg -L initramfs-tools-core
...
/usr/share/initramfs-tools/hooks/resume
...

Tým dpkg -L nám umožňuje vidět všechny soubory, které jsou v systému od určitého balíčku. Vybral jsem zajímavý soubor k prozkoumání. Zkoumání souboru ukazuje, jak se tato proměnná používá, ale neodpovídá na otázku, odkud se objevuje.

debconf

Zřejmě se jedná o něčí artefakt. Čí? Než se ponoříme do instalátoru, podíváme se ještě na jednu důležitou infrastrukturu Debianu — odpovědi na otázky. Každýkrát, když balíček klade otázku, a v mnoha případech, kdy otázku neklade, ale používá výchozí variantu, jsou jak otázka, tak odpověď zaznamenány ve speciální databázi v Debianu, která se nazývá debconf. Můžeme se podívat na databázi odpovědí (a dokonce je nastavit před instalací samotného balíčku — debconf-set-selections), k tomu budeme potřebovat nástroj debconf-get-selections z balíčku debconf-utils. Bohužel, nenašli jsme nic zajímavého: (debconf-get-selections |grep -i resume vrátilo prázdno).

debian-installer

Instalátor má vlastní databázi odpovědí na otázky: /var/log/installer/cdebconf/questions.dat. Bohužel, ani tam není ani slovo o našem resume.
Naštěstí jsou poblíž logy, včetně syslogu, kam se zapisuje celý instalační záznam. Zmiňuje se o balíčku base-installer a na jeho stránce můžeme vidět odkaz na zdrojové kódy.

V nich s lehkostí nacházíme odpověď na naši 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 určením, a zajímavá funkce, kterou hledáme, je get_resume_partition, která čte /proc/swaps a vybírá tam největší. Swap totiž pochází od partmana.

Odpověď na náš testovací úkol: soubor je vytvářen instalátorem v /targetě během instalace, tedy mluvíme o well-known, ale artefaktu. V existujících systémech balíčcích není nikdo a nic, co by tento soubor měnilo.

Shrnutí

  1. dpkg a debconf jsou hlavními metodami pro hledání dodavatelů souborů.
  2. hledání v /var/lib/dpkg/info umožňuje vidět operace nad soubory během instalace.
  3. Instalátor může vytvářet soubory-artefakty, které pak nikdy nikdo nezmění (kromě uživatele), a to můžeme vidět v kódu instalátoru.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster