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:
- Mágikus műtárgy (valaki feltette és elfelejtette)
- Konfiguráció a csomagból
- 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
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
- A dpkg és a debconf a fő módszer a fájlszolgáltatók megtalálására.
- 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.
- 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