Kust see konfiguratsioon pärit on? [Debian/Ubuntu]

Selle postituse eesmärk on näidata debian/ubuntu silumistehnikat, mis on seotud "allika leidmisega" süsteemi konfiguratsioonifailis.

Testi näide: pärast installitud OS-i koopia tar.gz pikka pilkamist ning pärast selle taastamist ja värskenduste installimist saame teate:

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.

Eesmärk: mõista, kust see väärtus (U1563304817I0) tuli ja kuidas seda õigesti muuta. See on esimene näide, mis ette tuli, iseenesest mitte eriti huvitav, kuid mugav näidata praktilisi meetodeid Linuxiga töötamiseks.

Samm number 1: Kust tuli RESUME?

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

Me rekursiivselt (-r) otsige selle muutuja mainimist kataloogist /etc (kus on enamik seadistusi). Leiame koodilõigu conf.d, mida pakett initramfs-tools selgelt kasutab.

Kust see jupp pärit on?

On kolm võimalust:

  1. Maagiline artefakt (keegi pani selle ja unustas)
  2. Seadistamine pakendist
  3. Süsteemipakettidest mõne skripti poolt loodud konfiguratsioon

Kontrollime nr 2 (kõige lihtsamalt):

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

dpkg -S võimaldab meil otsida installitud failide andmebaasist ja leida, millisesse paketti fail kuulub. Siin on näide edukast otsingust:

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

Pöördume tagasi oma ülesande juurde: fail initramfs-tools/conf.d/resume pole süsteemi installitud paketist. Võib-olla genereeritakse see paketi postinst/preinst skriptis? Kontrollime versiooni number 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

Kataloogis /var/lib/dpkg/info/ kõikidest pakettide "metafailidest" (installimis-/eemaldusskriptid, pakettide kirjeldused jne) on pakkimata versioonid. Üllataval kombel eemaldatakse see fail initramfs-tools-core paketi postrm-is (desinstallimisel). Vaatame selle postiinsti sisu... Pole midagi conf.d kataloogiga seotud.

Vaatame paketis sisalduvaid faile initramfs-tools-core.

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

Meeskond dpkg -L võimaldab vaadata kõiki määratud paketist süsteemis olevaid faile. Tõstsin esile faili, mis on õppimiseks huvitav. Faili uurimine näitab, kuidas seda muutujat kasutatakse, kuid ei ütle, kust see tuleb.

debconf

Selgub, et see on kellegi artefakt. Kelle oma? Enne installerisse sukeldumist vaatame veel ühte olulist Debiani infrastruktuuri – vastuseid küsimustele. Iga kord, kui pakett esitab küsimuse ja paljudel juhtudel, kui ta ei esita küsimust, vaid kasutab vaikevalikut, salvestatakse nii küsimus kui ka vastus Debiani spetsiaalsesse andmebaasi nimega debconf. Saame vaadata vastuste andmebaasi (ja isegi määrata need enne paketi enda installimist - debconf-set-selections), selleks vajame utiliiti debconf-get-selections kompositsioonist debconf-utils. Kahjuks midagi huvitavat ei leidnud :(debconf-get-selections |grep -i resume tühjalt tagasi).

debian-installer

Paigaldajal on oma andmebaas küsimustele vastuste kohta: /var/log/installer/cdebconf/questions.dat. Kahjuks pole ka meie CV-st sõnagi.
Aga läheduses on palgid, sh. syslog, kuhu kirjutatakse kogu installilogi. Seal on mainitud baasinstalleri paketti ja sellel lehekülg näeme linki rawsi juurde.

Nende seest leiame hõlpsalt vastuse oma küsimusele:

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

mapdevfs on selge eesmärgiga utiliit ja meid huvitab funktsioon get_resume_partition, mis loeb /proc/swaps ja valib sealt suurima. Vahetus pärineb partmanilt.

Vastus meie testülesandele: faili loob installija installimise ajal kausta /target, st. me räägime tuntud, kuid artefaktist. Süsteemi olemasolevates pakettides pole kedagi ega midagi, mis saaks seda faili muuta.

Kokkuvõtteks

  1. dpkg ja debconf on peamised meetodid failipakkujate leidmiseks.
  2. Otsimine kaustast /var/lib/dpkg/info võimaldab näha failidega toiminguid installifaasis.
  3. Installer saab luua artefaktifaile, mida keegi (välja arvatud kasutaja) ei muuda ja seda on näha installikoodis.

Allikas: www.habr.com

Lisa kommentaar