Honnan származik ez a konfig? [Debian/Ubuntu]

Ennek a bejegyzésnek az a célja, hogy bemutasson egy hibakeresési technikát a debian/ubuntuban, amely a rendszer konfigurációs fájljában található "forrás megtalálásához" kapcsolódik.

Tesztpélda: a telepített operációs rendszer tar.gz példányának sok gúnyolódása után, visszaállítása és frissítések telepítése után a következő üzenetet kapjuk:

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.

Cél: megérteni, honnan származik ez az érték (U1563304817I0), és hogyan kell helyesen módosítani. Ez az első példa, amivel találkoztunk, önmagában nem különösebben érdekes, de kényelmesen bemutatja a Linux-szal való munkavégzés gyakorlati módszereit.

1. lépés: Honnan jött a RESUME?

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

Mi rekurzívan (-r) keresse meg a változó említését az /etc könyvtárban (ahol a legtöbb konfiguráció található). Megtaláljuk a conf.d kódrészletet, amelyet egyértelműen az initramfs-tools csomag használ.

Honnan van ez a részlet?

Három lehetőség van:

  1. Mágikus műtárgy (valaki feltette és elfelejtette)
  2. Konfiguráció a csomagból
  3. A rendszercsomagokból származó szkriptek által generált konfiguráció

Ellenőrizzük a 2-es számút (mint a legegyszerűbb):

 dpkg -S initramfs-tools/conf.d/resume
dpkg-query: no path found matching pattern *initramfs-tools/conf.d/resume*

dpkg -S lehetővé teszi számunkra, hogy keressük a telepített fájlok adatbázisát, és megtudjuk, melyik csomaghoz tartozik a fájl. Íme egy példa a sikeres keresésre:

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

Térjünk vissza a feladatunkhoz: fájl initramfs-tools/conf.d/resume nincs telepítve a rendszerre a csomagból. Lehet, hogy a csomag postinst/preinst scriptjében van előállítva? Nézzük a 3-as verziószámot.

# cd /var/lib/dpkg/info/
# grep -r initramfs-tools/conf.d/resume *
initramfs-tools-core.postrm:    rm -f /etc/initramfs-tools/conf.d/resume

A katalógusban /var/lib/dpkg/info/ a csomagok összes „metafájljának” van kicsomagolt verziója (telepítési/eltávolító szkriptek, csomagleírások stb.). Meglepő módon ez a fájl eltávolításra kerül az initramfs-tools-core csomag postrm fájljában (eltávolításkor). Nézzük meg a postinst tartalmát... Semmi, ami a conf.d könyvtárhoz kapcsolódik.

Nézzük meg a csomagban található fájlokat initramfs-tools-core.

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

Csapat dpkg -L lehetővé teszi a rendszeren lévő összes fájl megtekintését a megadott csomagból. Kiemeltem egy fájlt, amely érdekes a tanulmányozáshoz. A fájl vizsgálata megmutatja, hogyan használják ezt a változót, de nem derül ki, hogy honnan származik.

debconf

Kiderül, hogy ez valakinek a műtárgya. Akinek? Mielőtt belemerülnénk a telepítőbe, vessünk egy pillantást egy másik fontos Debian infrastruktúrára – a kérdésekre adott válaszokra. Minden alkalommal, amikor egy csomag feltesz egy kérdést, és sok esetben, amikor nem tesz fel kérdést, hanem az alapértelmezett beállítást használja, a kérdés és a válasz is rögzítésre kerül egy speciális, debconf nevű adatbázisban a Debianban. Megnézhetjük a válaszok adatbázisát (és még a csomag telepítése előtt is beállíthatjuk őket - debconf-set-selections), ehhez szükségünk van egy segédprogramra debconf-get-selections a kompozícióból debconf-utils. Sajnos semmi érdekeset nem találtam :(debconf-get-selections |grep -i resume üresen tért vissza).

debian-installer

A telepítő saját adatbázissal rendelkezik a kérdésekre adott válaszokból: /var/log/installer/cdebconf/questions.dat. Sajnos az önéletrajzunkról sem esik szó.
De vannak a közelben rönkök, pl. syslog, ahol a teljes telepítési napló van írva. A base-installer csomag szerepel ott és rajta oldal láthatjuk a nyersanyagok linkjét.

Bentük könnyen megtaláljuk a választ kérdésünkre:

  resume="$(mapdevfs "$resume_devfs")"; then
...
    if [ "$do_initrd" = yes ]; then
     ...
            resumeconf=$IT_CONFDIR/resume
....
                echo "RESUME=$resume" >> $resumeconf

A mapdevfs egy olyan segédprogram, amelynek világos célja van, és a minket érdeklő funkció az get_resume_partition, amely beolvassa a /proc/swaps elemet, és ott kiválasztja a legnagyobbat. A csere a partmantől származik.

Tesztfeladatunkra a válasz: a fájlt a telepítő hozza létre a /targetben a telepítéskor, azaz. jól ismert, de műtárgyról beszélünk. A rendszer meglévő csomagjaiban nincs senki vagy semmi, ami módosítani tudná ezt a fájlt.

Összefoglalva

  1. A dpkg és a debconf a fő módszer a fájlszolgáltatók megtalálására.
  2. A /var/lib/dpkg/info könyvtárban történő keresés lehetővé teszi a fájlokon végzett műveletek megtekintését a telepítési szakaszban.
  3. A telepítő létrehozhat műtermék fájlokat, amelyeket ezután soha senki nem módosít (kivéve a felhasználót), és ez látható a telepítő kódjában.

Forrás: will.com

Hozzászólás