A poszt célja: bemutatni a Debian/Ubuntu hibakeresési technikáját, amely a rendszerszintű konfigurációs fájlban a „forrás keresésére” vonatkozik.
Teszt példa: hosszú szenvedés után egy tar.gz másolatú telepített operációs rendszerről, és annak helyreállítása és frissítések telepítése után az alábbi üzenetet kapjuk:
update-initramfs: Generating /boot/initrd.img-4.15.0-54-generic
W: initramfs-tools konfigurációs beállítás RESUME=/dev/mapper/U1563304817I0-swap
W: de nincs megfelelő swap eszköz elérhető.
I: Az initramfs megpróbál visszatérni a /dev/dm-1-re
I: (/dev/mapper/foobar-swap)
I: Állítsa be a RESUME változót, hogy felülbírálja ezt.Cél: megérteni, honnan származik ez az érték (U1563304817I0), és hogyan lehet azt helyesen megváltoztatni. Ez az első előforduló példa, nem különösebben izgalmas önállóan, de kényelmes, hogy bemutassuk a Linux használatának gyakorlati módszereit..
Első lépés: Honnan származik a RESUME?
# cd /etc
# grep -r RESUME
initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swapRekurzívan (-r) keressük ezt a változót az /etc könyvtárban (ahol a legtöbb konfiguráció található). Találunk egy conf.d részletet, amelyet egyértelműen az initramfs-tools csomag használ.
Honnan származik ez a részlet?
Három lehetőség van:
- Mágikus relikvia (valaki letette és elfelejtette)
- Csomagból származó konfiguráció
- Konfiguráció, amelyet valamilyen szkript generált a rendszer csomagjaiból
Ellenőrizzük a №2-t (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 a telepített fájlok adatbázisában keressünk, és megtudjuk, melyik csomaghoz tartozik a fájl. Íme egy sikeres keresés példája:
dpkg -S resolv.conf
manpages: /usr/share/man/man5/resolv.conf.5.gz
systemd: /lib/systemd/resolv.confVisszatérünk a feladatunkhoz: a fájl initramfs-tools/conf.d/resume nem kerül telepítésre a rendszerbe a csomagból. Lehet, hogy a postinst/preinst szkript generálja a csomagban? Ellenőrizzük a 3. verziót.
# cd /var/lib/dpkg/info/
# grep -r initramfs-tools/conf.d/resume *
initramfs-tools-core.postrm: rm -f /etc/initramfs-tools/conf.d/resumeA mappa /var/lib/dpkg/info/ a csomagok összes „metafájlja” (telepítési/eltávolítási szkriptek, csomagleírások stb.) kibővített változatai. Meglepetés, de ez a fájl eltávolításra kerül a postrm során (a initramfs-tools-core csomag eltávolításakor). Nézzük meg a postinst tartalmát... Semmi az conf.d könyvtárral kapcsolatban.
Nézzük meg az initramfs-tools-core csomag fájljait dpkg -L.
# dpkg -L initramfs-tools-core
...
/usr/share/initramfs-tools/hooks/resume
...A parancs lehetővé teszi, hogy megtekintsük az összes fájlt, amely a megadott csomagból a rendszerben létezik. Kiemeltem egy érdekes fájlt a tanulmányozáshoz. A fájl tanulmányozása megmutatja, hogyan használják ezt a változót, de nem válaszol arra, hogy honnan származik. debconf
debconf
Ez tehát valakinek az artefaktuma. Kié? Mielőtt belemennénk az installátorba, nézzük meg egy másik fontos Debian infrastruktúrát — a kérdésekre adott válaszokat. Minden alkalommal, amikor egy csomag kérdést tesz fel, és sok esetben, amikor nem kérdez, de az alapértelmezett verziót használja, a kérdés és a válasz rögzítésre kerül egy speciális adatbázisban a Debianban, amit debconf-nak hívnak. Megnézhetjük a válaszok adatbázisát (sőt előre be is állíthatjuk őket a csomag telepítése előtt — debconf-set-selections), ehhez szükségünk lesz egy segédprogramra debconf-get-selections a debconf-utilscsomagból. Sajnos, nem találtunk semmi érdekeset: (debconf-get-selections |grep -i resume üresen tért vissza).
debian-installer
A telepítőnek van egy saját válaszadatbázisa a kérdésekre: /var/log/installer/cdebconf/questions.dat. Sajnos, ott sem található egy szó sem a resume-ról.
Viszont van egy közeli napló, többek között a syslog, ahova a telepítés összes naplója íródik. Ott említést nyer a base-installer csomag, és annak láthatunk egy hivatkozást a forrásokra.
Ezekben könnyedén megtaláljuk a kérdésünkre adott választ:
resume="$(mapdevfs "$resume_devfs")"; then
...
if [ "$do_initrd" = yes ]; then
...
resumeconf=$IT_CONFDIR/resume
....
echo "RESUME=$resume" >> $resumeconfA mapdevfs egy jól meghatározott feladatú segédprogram, a számunkra érdekes funkció pedig a get_resume_partition, amely a /proc/swaps-t olvassa és a legnagyobbat választja. A swap pedig tőlünk érkezik a partman-ból.
A tesztfeladatunkra adott válasz: a fájl a telepítő által jön létre a /target-ben a telepítés pillanatában, vagyis egy well-known, de artefaktumról beszélünk. A rendszerben meglévő csomagok között nincs olyan, ami ezt a fájlt megváltoztatná.
Összefoglalva
- A dpkg és a debconf a fájlok szállítóinak keresésének alapvető módszerei.
- A /var/lib/dpkg/info-ban végzett keresés lehetővé teszi a fájlokkal kapcsolatos műveletek megtekintését a telepítés során.
- A telepítő képes artefakt fájlokat létrehozni, amelyeket soha senki nem változtat meg (kivéve a felhasználót), és ezt láthatjuk a telepítő kódjában.
Forrás: habr.com
