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:
- Maagiline artefakt (keegi pani selle ja unustas)
- Seadistamine pakendist
- 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
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
- dpkg ja debconf on peamised meetodid failipakkujate leidmiseks.
- Otsimine kaustast /var/lib/dpkg/info võimaldab näha failidega toiminguid installifaasis.
- Installer saab luua artefaktifaile, mida keegi (välja arvatud kasutaja) ei muuda ja seda on näha installikoodis.
Allikas: www.habr.com