Šī ieraksta mērķis ir demonstrēt atkļūdošanas tehniku debian/ubuntu, saistībā ar " sākotnējā avota meklēšanu" konfigurācijas failā.
Testa piemērs: pēc ilgiem pārdzīvojumiem ar tar.gz kopiju instalētās operētājsistēmas un pēc tās atjaunošanas un atjauninājumu instalēšanas mēs saņemam ziņojumu:
update-initramfs: Generating /boot/initrd.img-4.15.0-54-generic
W: initramfs-tools konfigurācija iestata RESUME=/dev/mapper/U1563304817I0-swap
W: bet atbilstošs apmaiņas ierīce nav pieejama.
I: Initramfs mēģinās atsākt no /dev/dm-1
I: (/dev/mapper/foobar-swap)
I: Iestatiet RESUME mainīgo, lai to pārsniegtu.Mērķis: saprast, no kurienes šī vērtība (U1563304817I0) nāk un kā to pareizi mainīt. Tas ir pirmais gadījuma piemērs, ne īpaši interesants pats par sevi, bet ērts, lai parādītu praktiskas metodes darbā ar Linux..
Solis numurs 1: No kurienes nāk RESUME?
# cd /etc
# grep -r RESUME
initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swapMēs rekursīvi (-r) meklējam šīs mainīgās atsauces direktorijā /etc (tur, kur atrodas lielākā daļa konfigurāciju). Mēs atrodam conf.d fragmentu, kas skaidri tiek izmantots pakotnē initramfs-tools.
No kurienes nāk šis fragments?
Ir trīs iespējas:
- Maģiskais artefakts (kāds to novietojis un aizmirsis)
- Konfigurācija no pakotnes
- Konfigurācija, ko ģenerē kāds skripts no sistēmas pakotnēm
Pārbaudām №2 (kā visvienkāršāko):
dpkg -S initramfs-tools/conf.d/resume
dpkg-query: nav ceļa, kas atbilstu modelim *initramfs-tools/conf.d/resume*dpkg -S ļauj mums meklēt instalēto failu datubāzē un atrast, pie kuras pakotnes fails attiecas. Šeit ir veiksmīga meklēšanas piemērs:
dpkg -S resolv.conf
manpages: /usr/share/man/man5/resolv.conf.5.gz
systemd: /lib/systemd/resolv.confAtgriežamies pie mūsu uzdevuma: fails initramfs-tools/conf.d/resume netiek instalēts sistēmā no pakotnes. Varbūt tas tiek ģenerēts postinst/preinst skriptā pakotnē? Pārbaudām 3. versiju.
# cd /var/lib/dpkg/info/
# grep -r initramfs-tools/conf.d/resume *
initramfs-tools-core.postrm: rm -f /etc/initramfs-tools/conf.d/resumeSarakstā /var/lib/dpkg/info/ ir izsaiņotu versiju metafailu no visām pakotnēm (instalācijas/izņemšanas skripti, pakotņu apraksti utt.). Pārsteidzoši, bet šis fails tiek izdzēsts postrm (izņemot) pakotnes initramfs-tools-core laikā. Apskatīsim tā postinst saturu… Neko, kas saistīts ar conf.d direktoriju.
Apskatīsim failus no pakotnes initramfs-tools-core.
# dpkg -L initramfs-tools-core
...
/usr/share/initramfs-tools/hooks/resume
...Komanda dpkg -L ļauj redzēt visus failus, kas ir sistēmā no norādītās pakotnes. Es izcēlu interesējošu failu izpētei. Faila izpēte parāda, kā šis mainīgais tiek izmantots, bet neatbild uz jautājumu, no kurienes tas nāk.
debconf
Izskatās, ka tas ir kāda artefakts. Kura? Pirms iegrimšanas instalatorā, aplūkosim vēl vienu svarīgu Debian infrastruktūru — atbildes uz jautājumiem. Katra reize, kad pakete uzdod jautājumu, un daudzos gadījumos, kad tā neuzdod jautājumu, bet izmanto noklusējuma variantu, gan jautājums, gan atbilde tiek fiksēti speciālā datu bāzē Debian, kas saucās debconf. Mēs varam aplūkot atbilžu datu bāzi (un pat izvirzīt tās pirms paša paketes instalēšanas — debconf-set-selections), tam mums būs nepieciešama utilīta debconf-get-selections no komplekta debconf-utils. Diemžēl nekas interesants netika atrasts: (debconf-get-selections | grep -i resume atgrieza tukšu rezultātu).
debian-installer
Instalatoram ir sava atbilžu datu bāze uz jautājumiem: /var/log/installer/cdebconf/questions.dat. Diemžēl tur arī nav ne vārda par mūsu resume.
Tomēr blakus ir žurnāli, tajā skaitā syslog, kurā tiek ierakstīts viss instalācijas žurnāls. Tur tiek pieminēta pakete base-installer, un uz tās mēs varam redzēt linku uz avotiem.
To iekšienē mēs viegli atrodam atbildi uz mūsu jautājumu:
resume="$(mapdevfs "$resume_devfs")"; tad
...
ja [ "$do_initrd" = jā ]; tad
...
resumeconf=$IT_CONFDIR/resume
....
echo "RESUME=$resume" >> $resumeconfmapdevfs — ir utilīta ar saprotamu uzdevumu, un interesantā mums funkcija ir get_resume_partition, kas lasa /proc/swaps un izvēlas tur vislielāko. Swap mums nāk no partman.
Atbilde uz mūsu testa uzdevumu: fails tiek izveidots instalatorā /target laikā instalēšanas brīdī, t.i., mēs runājam par labi zināmu, bet artefaktu. Esošajās sistēmā pakotnēs nav neviena un nekā, kas mainītu šo failu.
Kopsavilkums
- dpkg un debconf — galvenās metodes failu piegādātāju meklēšanai.
- meklēšana /var/lib/dpkg/info ļauj redzēt operācijas ar failiem instalēšanas posmā.
- Instalators var izveidot failu artefaktus, kurus nekad neviens nemaina (izņemot lietotāju), un to var redzēt instalatora kodā.
Avots: habr.com
