Qëllimi i këtij postimi është të tregojë një teknikë korrigjimi në debian/ubuntu lidhur me "gjetjen e burimit" në skedarin e konfigurimit të sistemit.
Shembull testimi: pas shumë talljeve me kopjen tar.gz të sistemit operativ të instaluar dhe pas rivendosjes së tij dhe instalimit të përditësimeve, 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.
Objektivi: kuptoni se nga erdhi kjo vlerë (U1563304817I0) dhe si ta ndryshoni atë saktë. Ky është shembulli i parë që hasi, jo veçanërisht interesant në vetvete, por i përshtatshëm për të treguar metoda praktike të punës me Linux.
Hapi numër 1: Nga erdhi RINISIM?
# cd /etc
# grep -r RESUME
initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swap
Ne në mënyrë rekursive (-r
) kërkoni një përmendje të kësaj ndryshore në drejtorinë /etc (ku janë shumica e konfigurimeve). Gjejmë fragmentin conf.d, i cili përdoret qartë nga paketa initramfs-tools.
Nga është ky fragment?
Ekzistojnë tre mundësi:
- Artifakt magjik (dikush e vendosi dhe harroi)
- Konfigurimi nga paketa
- Konfigurimi i krijuar nga disa skripta nga paketat e sistemit
Le të kontrollojmë nr. 2 (si më i thjeshti):
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ërkojmë bazën e të dhënave të skedarëve të instaluar dhe të gjejmë se cilës paketë i përket skedari. Këtu është një shembull i një kërkimi të suksesshëm:
dpkg -S resolv.conf
manpages: /usr/share/man/man5/resolv.conf.5.gz
systemd: /lib/systemd/resolv.conf
Le të kthehemi në detyrën tonë: skedar initramfs-tools/conf.d/resume
nuk është i instaluar në sistem nga paketa. Ndoshta është krijuar në skriptin postinst/preinst të paketës? Le të 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/resume
Në katalog /var/lib/dpkg/info/
ka versione të papaketuara të të gjithë “metafileve” të paketave (skriptet e instalimit/heqjes, përshkrimet e paketave, etj.). Çuditërisht, ky skedar hiqet në postrm (në çinstalim) të paketës initramfs-tools-core. Le të shohim përmbajtjen e postinst-it të tij... Asgjë që lidhet me direktorinë conf.d.
Le të shohim skedarët e përfshirë në paketë initramfs-tools-core
.
# dpkg -L initramfs-tools-core
...
/usr/share/initramfs-tools/hooks/resume
...
Ekip dpkg -L
ju lejon të shikoni të gjithë skedarët që janë në sistem nga paketa e specifikuar. Kam vënë në pah një dosje interesante për studim. Ekzaminimi i skedarit tregon se si përdoret kjo ndryshore, por nuk tregon se nga vjen.
debkonf
Rezulton se ky është objekt i dikujt. E kujt? Përpara se të zhytemi në instaluesin, le të hedhim një vështrim në një infrastrukturë tjetër të rëndësishme Debian - përgjigjet e pyetjeve. Sa herë që një paketë bën një pyetje, dhe në shumë raste kur nuk bën një pyetje, por përdor opsionin e paracaktuar, si pyetja ashtu edhe përgjigjja regjistrohen në një bazë të dhënash të veçantë në Debian të quajtur debconf. Ne mund të shikojmë bazën e të dhënave të përgjigjeve (dhe madje t'i vendosim ato përpara se të instalojmë vetë paketën - debconf-set-selections
), për këtë na duhet një shërbim debconf-get-selections
nga përbërja debconf-utils
. Fatkeqësisht, asgjë interesante nuk u gjet :(debconf-get-selections |grep -i resume
u kthye bosh).
instalues i debianit
Instaluesi ka bazën e tij të të dhënave të përgjigjeve të pyetjeve: /var/log/installer/cdebconf/questions.dat
. Fatkeqësisht, gjithashtu nuk ka asnjë fjalë për CV tonë.
Por ka trungje aty pranë, përfshirë. syslog, ku shkruhet i gjithë regjistri i instalimit. Paketa e instaluesit bazë përmendet atje dhe në të
Brenda tyre mund të gjejmë lehtësisht përgjigjen e pyetjes sonë:
resume="$(mapdevfs "$resume_devfs")"; then
...
if [ "$do_initrd" = yes ]; then
...
resumeconf=$IT_CONFDIR/resume
....
echo "RESUME=$resume" >> $resumeconf
mapdevfs është një mjet me një qëllim të qartë, dhe funksioni për të cilin ne jemi të interesuar është get_resume_partition
, i cili lexon /proc/swaps dhe zgjedh më të madhin atje. Shkëmbimi vjen nga partman.
Përgjigja për detyrën tonë të testimit: skedari krijohet nga instaluesi në /target në momentin e instalimit, d.m.th. po flasim për një artefakt të njohur, por. Nuk ka asnjë ose asgjë në paketat ekzistuese në sistem që mund ta ndryshojë këtë skedar.
Duke përmbledhur
- dpkg dhe debconf janë metodat kryesore për gjetjen e ofruesve të skedarëve.
- kërkimi në /var/lib/dpkg/info ju lejon të shihni operacionet në skedarë gjatë fazës së 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: www.habr.com