De unde vine această configurație? [Debian/Ubuntu]

Scopul acestei postări este de a arăta o tehnică de depanare în debian/ubuntu legată de „găsirea sursei” în fișierul de configurare a sistemului.

Exemplu de testare: după multă batjocură la adresa copiei tar.gz a sistemului de operare instalat și după restaurarea acesteia și instalarea actualizărilor, primim mesajul:

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.

Scop: înțelegeți de unde provine această valoare (U1563304817I0) și cum să o modificați corect. Acesta este primul exemplu care a apărut, nu deosebit de interesant în sine, dar convenabil pentru a arăta metode practice de lucru cu Linux.

Pasul numărul 1: De unde a apărut CV-ul?

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

Noi recursiv (-r) căutați o mențiune a acestei variabile în directorul /etc (unde sunt majoritatea configurațiilor). Găsim fragmentul conf.d, care este folosit în mod clar de pachetul initramfs-tools.

De unde este acest fragment?

Există trei opțiuni:

  1. Artefact magic (cineva l-a pus și a uitat)
  2. Configurare din pachet
  3. Configurație generată de unele scripturi din pachetele de sistem

Să verificăm numărul 2 (ca cel mai simplu):

 dpkg -S initramfs-tools/conf.d/resume
dpkg-query: no path found matching pattern *initramfs-tools/conf.d/resume*

dpkg -S ne permite să căutăm în baza de date a fișierelor instalate și să găsim pachetului căruia îi aparține fișierul. Iată un exemplu de căutare reușită:

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

Să revenim la sarcina noastră: fișier initramfs-tools/conf.d/resume nu este instalat pe sistem din pachet. Poate este generat în scriptul postinst/preinst al pachetului? Să verificăm versiunea numărul 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

În catalog /var/lib/dpkg/info/ există versiuni dezambalate ale tuturor „metafișierelor” de pachete (scripturi de instalare/eliminare, descrieri de pachete etc.). În mod surprinzător, acest fișier este eliminat în postrm (la dezinstalare) al pachetului initramfs-tools-core. Să ne uităm la conținutul postinst-ului său... Nimic legat de directorul conf.d.

Să ne uităm la fișierele incluse în pachet initramfs-tools-core.

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

Echipă dpkg -L vă permite să vizualizați toate fișierele care se află pe sistem din pachetul specificat. Am evidențiat un fișier care este interesant de studiu. Examinarea fișierului arată cum este utilizată această variabilă, dar nu spune de unde provine.

debconf

Se pare că acesta este artefactul cuiva. A caror? Înainte de a trece în programul de instalare, să aruncăm o privire la o altă infrastructură Debian importantă - răspunsurile la întrebări. De fiecare dată când un pachet pune o întrebare și, în multe cazuri, când nu pune o întrebare, dar folosește opțiunea implicită, atât întrebarea, cât și răspunsul sunt înregistrate într-o bază de date specială în Debian numită debconf. Putem să ne uităm la baza de date de răspunsuri (și chiar să le setăm înainte de a instala pachetul în sine - debconf-set-selections), pentru asta avem nevoie de un utilitar debconf-get-selections din compozitie debconf-utils. Din pacate nu s-a gasit nimic interesant :(debconf-get-selections |grep -i resume returnat gol).

debian-installer

Programul de instalare are propria sa bază de date cu răspunsuri la întrebări: /var/log/installer/cdebconf/questions.dat. Din păcate, nu există nici un cuvânt despre CV-ul nostru.
Dar sunt bușteni în apropiere, inclusiv. syslog, unde este scris întregul jurnal de instalare. Pachetul de instalare de bază este menționat acolo și pe el pagină putem vedea linkul către raw-uri.

În interiorul lor putem găsi cu ușurință răspunsul la întrebarea noastră:

  resume="$(mapdevfs "$resume_devfs")"; then
...
    if [ "$do_initrd" = yes ]; then
     ...
            resumeconf=$IT_CONFDIR/resume
....
                echo "RESUME=$resume" >> $resumeconf

mapdevfs este un utilitar cu un scop clar, iar funcția care ne interesează este get_resume_partition, care citește /proc/swaps și îl selectează pe cel mai mare de acolo. Schimbul vine de la partman.

Răspunsul la sarcina noastră de testare: fișierul este creat de instalator în /target în momentul instalării, de exemplu. vorbim despre cunoscut, dar un artefact. Nu există nimeni sau nimic în pachetele existente în sistem care poate schimba acest fișier.

Rezumând

  1. dpkg și debconf sunt principalele metode de găsire a furnizorilor de fișiere.
  2. căutarea în /var/lib/dpkg/info vă permite să vedeți operațiunile pe fișiere în timpul fazei de instalare.
  3. Programul de instalare poate crea fișiere artefacte care nu sunt apoi modificate niciodată de nimeni (cu excepția utilizatorului), iar acest lucru poate fi văzut în codul de instalare.

Sursa: www.habr.com

Adauga un comentariu