L'obiettivo di questo post è mostrare una tecnica di debug in debian/ubuntu relativa alla 'ricerca della fonte' nel file di configurazione di sistema.
Esempio di test: dopo lunghe torture su una copia tar.gz del sistema operativo installato e dopo il suo recupero e l'installazione degli aggiornamenti, riceviamo il seguente messaggio:
update-initramfs: Generating /boot/initrd.img-4.15.0-54-generic
W: la configurazione di initramfs-tools imposta RESUME=/dev/mapper/U1563304817I0-swap
W: ma non è disponibile alcun dispositivo di swap corrispondente.
I: initramfs tenterà di riprendere da /dev/dm-1
I: (/dev/mapper/foobar-swap)
I: Imposta la variabile RESUME per sovrascrivere questo.Obiettivo: comprendere da dove proviene questo valore (U1563304817I0) e come cambiarlo correttamente. Questo è il primo esempio che capita, non particolarmente interessante di per sé, ma utile per mostrare metodi pratici di lavoro con Linux..
Passo numero 1: Da dove viene RESUME?
# cd /etc
# grep -r RESUME
initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swapCerchiamo ricorsivamente (-r) un riferimento a questa variabile nella directory /etc (dove si trovano la maggior parte dei file di configurazione). Troviamo uno snippet conf.d che è esplicitamente usato dal pacchetto initramfs-tools.
Da dove proviene questo snippet?
Ci sono tre possibilità:
- Un artefatto magico (qualcuno lo ha messo e dimenticato)
- Configurazione dal pacchetto
- Configurazione generata da qualche script dei pacchetti di sistema
Controlliamo il numero 2 (come il più semplice):
dpkg -S initramfs-tools/conf.d/resume
dpkg-query: nessun percorso trovato corrispondente al modello *initramfs-tools/conf.d/resume*dpkg -S ci consente di cercare nel database dei file installati e scoprire a quale pacchetto appartiene il file. Ecco un esempio di ricerca riuscita:
dpkg -S resolv.conf
manpages: /usr/share/man/man5/resolv.conf.5.gz
systemd: /lib/systemd/resolv.confTorniamo al nostro compito: il file initramfs-tools/conf.d/resume non viene installato nel sistema dal pacchetto. Potrebbe essere generato nello script postinst/preinst del pacchetto? Verifichiamo la versione numero 3.
# cd /var/lib/dpkg/info/
# grep -r initramfs-tools/conf.d/resume *
initramfs-tools-core.postrm: rm -f /etc/initramfs-tools/conf.d/resumeNella directory /var/lib/dpkg/info/ ci sono le versioni decompresse di tutti i 'metafiles' dei pacchetti (script di installazione/rimozione, descrizioni dei pacchetti, ecc.). È sorprendente, ma questo file viene eliminato in postrm (alla rimozione) del pacchetto initramfs-tools-core. Controlliamo il contenuto del suo postinst... Niente riguardante la directory conf.d.
Diamo un'occhiata ai file inclusi nel pacchetto initramfs-tools-core.
# dpkg -L initramfs-tools-core
...
/usr/share/initramfs-tools/hooks/resume
...Team dpkg -L ci permette di vedere tutti i file che sono presenti nel sistema da un pacchetto specificato. Ho evidenziato un file interessante da esaminare. L'analisi del file mostra come questa variabile è utilizzata, ma non risponde a dove appare.
debconf
Quindi, questo è un artefatto di qualcuno. Di chi? Prima di immergerci nell'installer, diamo un'occhiata a un'altra infrastruttura importante di Debian: le risposte alle domande. Ogni volta che un pacchetto pone una domanda, e in molti casi, quando non fa domande ma utilizza l'impostazione predefinita, sia la domanda che la risposta vengono registrate in un database speciale in Debian chiamato debconf. Possiamo esaminare il database delle risposte (e addirittura impostarle prima dell'installazione del pacchetto stesso — debconf-set-selections), per questo ci servirà l'utilità debconf-get-selections inclusa in debconf-utils. Sfortunatamente, non è stato trovato nulla di interessante: (debconf-get-selections |grep -i resume ha restituito vuoto).
debian-installer
L'installer ha il proprio database di risposte alle domande: /var/log/installer/cdebconf/questions.dat. Sfortunatamente, non c'è nemmeno una parola sul nostro resume.
Tuttavia, ci sono i log, incluso il syslog, dove viene registrato tutto il log dell'installazione. Qui si menziona il pacchetto base-installer, e nel suo possiamo vedere un collegamento ai sorgenti.
All'interno di essi troviamo facilmente la risposta alla nostra domanda:
resume="$(mapdevfs "$resume_devfs")"; then
...
if [ "$do_initrd" = yes ]; then
...
resumeconf=$IT_CONFDIR/faq
....
echo "RESUME=$resume" >> $resumeconfmapdevfs è un'utilità con uno scopo chiaro, e la nostra funzione interessante è get_resume_partition, che legge /proc/swaps e seleziona il più grande. Lo swap viene da partman.
La risposta al nostro compito di prova: il file viene creato dall'installer in /target al momento dell'installazione, quindi parliamo di un artefatto ben noto. Nei pacchetti esistenti nel sistema non c'è nulla che cambi questo file.
In sintesi
- dpkg e debconf sono i metodi principali per cercare fornitori di file.
- la ricerca in /var/lib/dpkg/info consente di vedere le operazioni sui file durante la fase di installazione.
- L'installer può creare file-artefatti che poi non vengono mai modificati (eccetto dall'utente), e ciò può essere visto nel codice dell'installer.
Fonte: habr.com
