Formålet med dette indlæg er at vise fejlfindingsteknikker i Debian/Ubuntu, relateret til "finde kildepunktet" i systemkonfigurationsfilen.
Testeksempel: efter lang tids prøvelse med en tar.gz kopi af det installerede operativsystem og efter dens gendannelse og installation af opdateringer får vi besked:
update-initramfs: Genererer /boot/initrd.img-4.15.0-54-generic
W: initramfs-tools konfiguration sætter RESUME=/dev/mapper/U1563304817I0-swap
W: men ingen matchende swap-enhed er tilgængelig.
I: Initramfs vil forsøge at genoptage fra /dev/dm-1
I: (/dev/mapper/foobar-swap)
I: Sæt RESUME-variablen for at overskrive dette.Formålet er at forstå, hvor denne værdi (U1563304817I0) kommer fra, og hvordan man korrekt ændrer den. Dette er det første eksempel, ikke særlig interessant i sig selv, men praktisk til at vise metoder til arbejde med Linux..
Trin nummer 1: Hvor kom RESUME fra?
# cd /etc
# grep -r RESUME
initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swapVi søger rekursivt (-r) efter omtale af denne variabel i mappen /etc (hvor de fleste konfigurationsfiler er). Vi finder et conf.d snippet, der tydeligt bruges af pakken initramfs-tools.
Hvor kommer dette snippet fra?
Der er tre muligheder:
- Et magisk artefakt (nogen har lagt det der og glemt det)
- Konfiguration fra pakken
- Konfiguration genereret af et eller andet script fra systempakkerne
Lad os tjekke nummer 2 (da det er det nemmeste):
dpkg -S initramfs-tools/conf.d/resume
dpkg-query: ingen sti fundet, der matcher mønsteret *initramfs-tools/conf.d/resume*dpkg -S giver os mulighed for at søge i databasen med installerede filer og finde ud af, hvilken pakke filen tilhører. Her er et eksempel på en succesfuld søgning:
dpkg -S resolv.conf
manpages: /usr/share/man/man5/resolv.conf.5.gz
systemd: /lib/systemd/resolv.confLad os vende tilbage til vores opgave: filen initramfs-tools/conf.d/resume bliver ikke installeret i systemet fra pakken. Måske genereres den i postinst/preinst scriptet for pakken? Lad os tjekke version nummer 3.
# cd /var/lib/dpkg/info/
# grep -r initramfs-tools/conf.d/resume *
initramfs-tools-core.postrm: rm -f /etc/initramfs-tools/conf.d/resumeI mappen /var/lib/dpkg/info/ indeholder udpakkede versioner af alle "metafiler" af pakker (installations-/fjernelsesscripts, pakkebeskrivelser osv.). Overraskende nok slettes denne fil i postrm (ved fjernelse) af pakken initramfs-tools-core. Lad os se indholdet af dens postinst… Intet relateret til conf.d-mappen.
Lad os kigge på filerne fra pakken initramfs-tools-core.
# dpkg -L initramfs-tools-core
...
/usr/share/initramfs-tools/hooks/resume
...Kommandoen dpkg -L giver os mulighed for at se alle filer, der er i systemet fra den angivne pakke. Jeg har fremhævet en interessant fil til undersøgelse. Undersøgelse af filen viser, hvordan denne variabel anvendes, men svarer ikke på, hvor den kommer fra.
debconf
Det ser ud til, at dette er en slags artefakt. Hvis ja? Før vi går ind i installeren, lad os se nærmere på en vigtig infrastruktur i Debian - svarene på spørgsmål. Hver gang en pakke stiller et spørgsmål, og i mange tilfælde, når den ikke stiller spørgsmål, men bruger standardindstillingen, registreres både spørgsmålet og svaret i en speciel database i Debian, der kaldes debconf. Vi kan tage et kig på svardatabasen (og endda ændre dem, før vi installerer selve pakken - debconf-set-selections), til dette skal vi bruge værktøjet debconf-get-selections fra pakken debconf-utils. Desværre fandt vi ikke noget interessant: (debconf-get-selections |grep -i resume returnerede tomt).
debian-installer
Installereren har sin egen database til spørgsmål: /var/log/installer/cdebconf/questions.dat. Desværre er der heller ikke noget nævnt om vores resume.
Men der er logs i nærheden, herunder syslog, hvor hele installationsloggen skrives. Der nævnes pakken base-installer, og i dens kan vi se et link til kildekoderne.
Indeni finder vi let svaret på vores spørgsmål:
resume="$(mapdevfs "$resume_devfs")"; så
...
hvis [ "$do_initrd" = yes ]; så
...
resumeconf=$IT_CONFDIR/resume
....
echo "RESUME=$resume" >> $resumeconfmapdevfs er et værktøj med en klar funktion, og den interessante funktion for os er get_resume_partition, der læser /proc/swaps og vælger den største. Swap kommer fra partman.
Svaret på vores testopgave: filen oprettes af installeren i /target under installationen, det vil sige, vi taler om en velkendt, men artefakt. Der findes ikke nogen pakker i systemet, der ændrer denne fil.
Sammenfattende
- dpkg og debconf er de primære metoder til at finde filforsynere.
- søgning i /var/lib/dpkg/info giver mulighed for at se operationer på filerne under installationen.
- Installereren kan oprette artefaktfiler, som aldrig ændres af nogen (bortset fra brugeren), og dette kan ses i installerens kode.
Kilde: habr.com
