Het doel van deze post: het tonen van de foutopsporingstechniek in Debian/Ubuntu, gerelateerd aan het 'vinden van de bron' in het systeemconfiguratiebestand.
Voorbeeld: na langdurige problemen met de tar.gz-kopie van het geĆÆnstalleerde besturingssysteem en na het herstellen en bijwerken ontvangen we de melding:
update-initramfs: Generating /boot/initrd.img-4.15.0-54-generic
W: initramfs-tools configuratie stelt RESUME=/dev/mapper/U1563304817I0-swap in
W: maar er is geen bijpassend swap-apparaat beschikbaar.
I: De initramfs zal proberen te hervatten vanuit /dev/dm-1
I: (/dev/mapper/foobar-swap)
I: Stel de RESUME-variabele in om dit te overschrijven.Doel: begrijpen waar deze waarde (U1563304817I0) vandaan komt en hoe deze correct kan worden gewijzigd. Dit is het eerste voorbeeld dat we tegenkomen, niet per se interessant op zich, maar handig om praktische methoden voor Linux te tonen..
Stap nummer 1: Waar komt RESUME vandaan?
# cd /etc
# grep -r RESUME
initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swapWe zoeken recursief (-r) naar vermeldingen van deze variabele in de map /etc (daar waar de meeste configuraties zich bevinden). We vinden een conf.d-snip die duidelijk wordt gebruikt door het pakket initramfs-tools.
Waar komt deze snip vandaan?
Er zijn drie opties:
- Een magisch artifact (iemand heeft het neergelegd en vergeten)
- Configuratie van het pakket
- Configuratie die door een script uit systeempakketten is gegenereerd
We controleren nummer 2 (als de eenvoudigste):
dpkg -S initramfs-tools/conf.d/resume
dpkg-query: geen pad gevonden dat overeenkomt met patroon *initramfs-tools/conf.d/resume*dpkg -S stelt ons in staat om te zoeken in de database van geĆÆnstalleerde bestanden en te ontdekken bij welk pakket het bestand hoort. Hier is een voorbeeld van een succesvolle zoekopdracht:
dpkg -S resolv.conf
manpages: /usr/share/man/man5/resolv.conf.5.gz
systemd: /lib/systemd/resolv.confLaten we terugkeren naar onze taak: het bestand initramfs-tools/conf.d/resume wordt niet door het pakket in het systeem geĆÆnstalleerd. Misschien wordt het gegenereerd in het postinst/preinst-script van het pakket? Laten we versie nummer 3 controleren.
# cd /var/lib/dpkg/info/
# grep -r initramfs-tools/conf.d/resume *
initramfs-tools-core.postrm: rm -f /etc/initramfs-tools/conf.d/resumeIn de map /var/lib/dpkg/info/ bevatten uitgepakte versies van alle 'metabestanden' van pakketten (installatie-/verwijderingsscripts, pakketbeschrijvingen, enz.). Vreemd genoeg wordt dit bestand verwijderd in postrm (bij verwijdering) van het initramfs-tools-core pakket. Laten we de inhoud van zijn postinst bekijken... Niets met betrekking tot de conf.d-directory.
Laten we kijken naar de bestanden van het pakket initramfs-tools-core.
# dpkg -L initramfs-tools-core
...
/usr/share/initramfs-tools/hooks/resume
...Opdracht dpkg -L laat ons alle bestanden zien die aanwezig zijn in het systeem van het opgegeven pakket. Ik heb een interessant bestand geselecteerd dat bestudeerd kan worden. Bestudering van het bestand toont aan hoe deze variabele wordt gebruikt, maar geeft geen antwoord op waar deze vandaan komt.
debconf
Het lijkt erop dat dit iemands artefact is. Van wie? Voordat we de installer induiken, laten we nog een belangrijke infrastructuur van Debian bekijken ā antwoorden op vragen. Elke keer dat een pakket een vraag stelt, en in veel gevallen wanneer het geen vraag stelt maar de standaardoptie gebruikt, worden zowel de vraag als het antwoord vastgelegd in een speciale database in Debian, die debconf wordt genoemd. We kunnen de antwoorddatabase bekijken (en zelfs deze instellen voordat we het pakket zelf installeren ā debconf-set-selections), hiervoor hebben we de tool nodig debconf-get-selections uit de samenstelling debconf-utils. Helaas hebben we niets interessants gevonden: (debconf-get-selections |grep -i resume geefde leeg).
debian-installer
De installer heeft zijn eigen antwoorddatabase op vragen: /var/log/installer/cdebconf/questions.dat. Helaas staat er daar ook geen woord over onze resume.
Er staan echter wel logboeken in de buurt, waaronder syslog, waar het hele installatielogboek wordt geschreven. Daar wordt het pakket base-installer genoemd, en op zijn kunnen we een link naar de bronnen zien.
Binnenin vinden we gemakkelijk het antwoord op onze vraag:
resume="$(mapdevfs "$resume_devfs")"; then
...
if [ "$do_initrd" = yes ]; then
...
resumeconf=$IT_CONFDIR/resume
....
echo "RESUME=$resume" >> $resumeconfmapdevfs is een tool met een duidelijke functie, en de interessante functie voor ons is get_resume_partition, die /proc/swaps leest en daar de grootste selecteert. Swap komt bij ons van partman.
Antwoord op onze testopdracht: het bestand wordt door de installer aangemaakt in /target op het moment van installatie, dat wil zeggen dat we het over een well-known, maar artefact hebben. In de bestaande pakketten in het systeem is er niemand en niets dat dit bestand verandert.
Samenvattend
- dpkg en debconf zijn de belangrijkste methoden voor het zoeken naar bestandsleveranciers.
- zoeken in /var/lib/dpkg/info laat de operaties op de bestanden op het moment van installatie zien.
- De installer kan bestanden-artefacten maken die nooit door iemand worden gewijzigd (behalve door de gebruiker), en dat is in de code van de installer te zien.
Bron: habr.com
