Qëllimi i kësaj poste është: të tregojë teknikën e debug-imit në Debian/Ubuntu, e lidhur me "kërkimin e burimit" në skedarin e konfigurimit të sistemit.
Shembulli i testit: pas shumë pëndërrijave me kopjen tar.gz të sistemit të instaluar dhe pas rikthimit dhe instalimit të përditësimeve, ne marrim mesazhin:
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.Qëllimi: të kuptojmë se nga erdhi kjo vlerë (U1563304817I0) dhe si ta ndryshojmë atë siç duhet. Ky është një shembull i parë, nuk është shumë interesant vetë, por është i përshtatshëm për të treguar metodat praktike të punës me Linux..
Hapi numër 1: Nga erdhi RESUME?
# cd /etc
# grep -r RESUME
initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swapNe kërkojmë në mënyrë rekursive (-r) për përmendjen e kësaj variabël në katalogun /etc (aty ku ndodhen shumica e konfiguratave). Ne gjejmë një snippet conf.d, i cili përdoret qartë nga paketa initramfs-tools.
Nga erdhi ky snippet?
Ka tre mundësi:
- Një artefakt magjik (për dikë që e ka vendosur dhe harruar)
- KonFig nga paketa
- KonFig, e gjeneruar nga ndonjë skript nga paketat e sistemit
Kontrollojmë nr. 2 (si më e thjeshtë):
dpkg -S initramfs-tools/conf.d/resume
dpkg-query: no path found matching pattern *initramfs-tools/conf.d/resume*dpkg -S na lejon të kërkoni në bazën e të dhënave të skedarëve të instaluar dhe të gjejmë se për cilën paketë i përket skedari. Ja një shembull i një kërkese të suksesshme:
dpkg -S resolv.conf
manpages: /usr/share/man/man5/resolv.conf.5.gz
systemd: /lib/systemd/resolv.confKthehemi në detyrën tonë: skedari initramfs-tools/conf.d/resume nuk instalohet në sistem nga paketa. Ndoshta ai gjenerohet në skriptin postinst/preinst të paketës? Kontrollojmë versionin numër 3.
# cd /var/lib/dpkg/info/
# grep -r initramfs-tools/conf.d/resume *
initramfs-tools-core.postrm: rm -f /etc/initramfs-tools/conf.d/resumeNë katalog /var/lib/dpkg/info/ janë të vendosura versionet e paketuara të të gjithë "metafajlave" të paketave (skriptet e instalimit/hiqjes, përshkrimet e paketave etj.). Befas, ky skedar hiqet në postrm (kur hiqet) nga paketa initramfs-tools-core. Le të shohim përmbajtjen e postinst të saj ... Asgjë që lidhet me direktorinë conf.d.
Le të shohim skedarët nga paketa initramfs-tools-core.
# dpkg -L initramfs-tools-core
...
/usr/share/initramfs-tools/hooks/resume
...Ekipa dpkg -L na lejon të shohim të gjithë skedarët, që janë në sistem nga paketa e caktuar. Kam выделил një skedar të interesant për studim. Studimi i skedarit tregon se si përdoret kjo variabël, por nuk përgjigjet se nga lind ajo.
debconf
Duket se është artifact i dikujt. I kujt? Para se të shpërthejmë në instalues, le të shohim një infrastrukturë tjetër të rëndësishme të Debianit — përgjigjet në pyetje. Çdo herë që një paketë bën një pyetje, dhe në shumë raste, kur ajo nuk bën pyetje, por përdor opsionin e paracaktuar, si pyetja ashtu edhe përgjigja regjistrohen në një bazë të veçantë në Debian, e cila quhet debconf. Ne mund të shikojmë në bazën e përgjigjeve (dhe madje t'i paraqesim ato para se të instalojmë vetë paketën — debconf-set-selections), për këtë na nevojitet një mjet debconf-get-selections nga grupe debconf-utils. Fatkeqësisht, nuk u gjet asgjë interesante: (debconf-get-selections |grep -i resume kthyen bosh).
debian-installer
Instaluesi ka bazën e tij të përgjigjeve për pyetje: /var/log/installer/cdebconf/questions.dat. Fatkeqësisht, aty gjithashtu nuk ka asnjë fjalë për rezumimin tonë.
Megjithatë, afër aty janë regjistrat, përfshirë syslog, ku shkruhen të gjitha regjistrat e instalimit. Atje përmendet paketa base-installer, dhe në të mund të shohim një lidhje për burimet.
Brenda tyre ne lehtësisht gjejmë përgjigjen për pyetjen tonë:
resume="$(mapdevfs "$resume_devfs")"; pastaj
...
nëse [ "$do_initrd" = yes ]; atëherë
...
resumeconf=$IT_CONFDIR/resume
....
echo "RESUME=$resume" >> $resumeconfmapdevfs është një mjet me një emër të qartë, dhe funksioni interesant për ne është get_resume_partition, i cili lexon /proc/swaps dhe zgjedh aty atë më të madhen. Swap na vjen nga partman.
Përgjigjja për detyrën tonë të provës: skedari krijohet nga instaluesi në /target në momentin e instalimit, domethënë, po flasim për një artifact të njohur, por të njohur. Në paketat ekzistuese në sistem nuk ka askush dhe asgjë që e ndryshon këtë skedar.
Në përfundim
- dpkg dhe debconf — metodat kryesore për të gjetur ofruesit e skedarëve.
- kërkimi në /var/lib/dpkg/info lejon të shikohet operacionet mbi skedarët në fazën e instalimit.
- Instaluesi mund të krijojë skedarë-artifakte që më pas nuk ndryshohen kurrë nga askush (përveç përdoruesit), dhe kjo mund të shihet në kodin e instaluesit.
Burimi: habr.com
