Da dove proviene questa configurazione? [Debian/Ubuntu]

L'obiettivo di questo post è mostrare una tecnica di debug in debian/ubuntu relativa alla «ricerca della fonte» nel file di configurazione del sistema.

Esempio di test: dopo aver fatto parecchi esperimenti con una copia tar.gz del sistema operativo installato e averla ripristinata e aggiornato, riceviamo il messaggio:

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.

Obiettivo: capire 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 proviene RESUME?

# cd /etc
# grep -r RESUME
initramfs-tools/conf.d/resume:RESUME=/dev/mapper/U1563304817I0-swap

Cerchiamo ricorsivamente (-r) di trovare un riferimento a questa variabile nella directory /etc (dove si trovano la maggior parte dei file di configurazione). Troviamo uno snippet di conf.d che è chiaramente utilizzato dal pacchetto initramfs-tools.

Da dove proviene questo snippet?

Ci sono tre possibilità:

  1. Artefatto magico (qualcuno l'ha messo e dimenticato)
  2. Configurazione dal pacchetto
  3. 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 permette di cercare nel database dei file installati e scoprire a quale pacchetto appartiene un file. Ecco un esempio di ricerca riuscita:

dpkg -S resolv.conf
manpages: /usr/share/man/man5/resolv.conf.5.gz
systemd: /lib/systemd/resolv.conf

Torniamo al nostro compito: il file initramfs-tools/conf.d/resume non è installato nel sistema dal pacchetto. Potrebbe essere generato nello script postinst/preinst del pacchetto? Controlliamo 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/resume

Nella directory /var/lib/dpkg/info/ si trovano le versioni decompresse di tutti i "metafile" dei pacchetti (script di installazione/rimozione, descrizioni dei pacchetti, ecc.). Sorprendentemente, questo file viene rimosso in postrm (durante la rimozione) del pacchetto initramfs-tools-core. Diamo un'occhiata al contenuto del suo postinst… Niente riguardo alla directory conf.d.

Diamo un'occhiata ai file contenuti nel pacchetto initramfs-tools-core.

# dpkg -L initramfs-tools-core
...
/usr/share/initramfs-tools/hooks/resume
...

Team dpkg -L consente di visualizzare tutti i file presenti nel sistema per il pacchetto specificato. Ho evidenziato un file interessante da studiare. L'analisi del file mostra come questa variabile venga utilizzata, ma non spiega da dove provenga.

debconf

Sembra che questo sia un artefatto di qualcuno. Di chi? Prima di immergerci nell'installer, diamo un'occhiata a un'altra importante infrastruttura di Debian — le risposte alle domande. Ogni volta che un pacchetto pone una domanda, e in molti casi quando non pone domande ma utilizza l'impostazione predefinita, sia la domanda che la risposta vengono registrate in un database speciale in Debian, chiamato debconf. Possiamo dare un'occhiata al database delle risposte (e anche esporle prima dell'installazione del pacchetto stesso — debconf-set-selections), per questo avremo bisogno dell'utilità debconf-get-selections compresa nel debconf-utils. Purtroppo, 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, anche lì non c'è alcuna menzione del nostro resume.
Tuttavia, ci sono dei log, incluso syslog, dove viene registrato l'intero log di installazione. Qui si menziona il pacchetto base-installer, e su di esso pagina possiamo vedere un link 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/resume
....
                echo "RESUME=$resume" >> $resumeconf

mapdevfs è un'utilità con uno scopo chiaro, e la funzione interessante per noi è get_resume_partition, che legge /proc/swaps e seleziona il più grande. Lo swap ci arriva da partman.

La risposta al nostro compito di test: il file è creato dall'installatore in /target al momento dell'installazione, cioè stiamo parlando di un artefatto ben noto. Nei pacchetti esistenti nel sistema non c'è nulla che possa modificare questo file.

In sintesi

  1. dpkg e debconf sono i metodi principali per cercare fornitori di file.
  2. La ricerca in /var/lib/dpkg/info permette di vedere le operazioni sui file durante la fase di installazione.
  3. L'installatore può creare file artefatti, che poi non vengono mai modificati (tranne che dall'utente), e questo può essere visto nel codice dell'installatore.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster