De kie venas ĉi tiu agordo? [Debian/Ubuntu]

La celo de ĉi tiu afiŝo estas montri sencimigan teknikon en debian/ubuntu rilate al "trovi la fonton" en la sistema agorda dosiero.

Testekzemplo: post multe da mokado de la kopio tar.gz de la instalita OS kaj post restarigi ĝin kaj instali ĝisdatigojn, ni ricevas la mesaĝon:

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.

Celo: kompreni de kie ĉi tiu valoro (U1563304817I0) venis kaj kiel ŝanĝi ĝin ĝuste. Ĉi tiu estas la unua ekzemplo kiu trovis, ne aparte interesa en si mem, sed oportuna por montri praktikajn metodojn por labori kun Linukso..

Paŝo numero 1: De kie venis RESUMO?

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

Ni rekursie (-r) serĉu mencion de ĉi tiu variablo en la dosierujo /etc (kie troviĝas la plej multaj el la agordoj). Ni trovas la conf.d fragmenton, kiu estas klare uzata de la pako initramfs-tools.

De kie estas ĉi tiu fragmento?

Estas tri ebloj:

  1. Magia artefakto (iu metis ĝin kaj forgesis)
  2. Agordo de la pakaĵo
  3. Agordo generita de iu skripto de sistemaj pakoj

Ni kontrolu n-ron 2 (kiel la plej simplan):

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

dpkg -S permesas al ni serĉi la datumbazon de instalitaj dosieroj kaj trovi al kiu pako apartenas la dosiero. Jen ekzemplo de sukcesa serĉo:

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

Ni revenu al nia tasko: dosiero initramfs-tools/conf.d/resume ne estas instalita en la sistemo de la pako. Eble ĝi estas generita en la postinst/preinst-skripto de la pakaĵo? Ni kontrolu la version 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

En katalogo /var/lib/dpkg/info/ estas malpakitaj versioj de ĉiuj "metadosieroj" de pakaĵoj (instalaj/forigskriptoj, pakaĵpriskriboj, ktp.). Surprize, ĉi tiu dosiero estas forigita en la postrm (ĉe malinstalo) de la pakaĵo initramfs-tools-core. Ni rigardu la enhavon de ĝia postinst... Nenio rilata al la dosierujo conf.d.

Ni rigardu la dosierojn inkluzivitajn en la pakaĵo initramfs-tools-core.

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

teamo dpkg -L permesas al vi vidi ĉiujn dosierojn kiuj estas en la sistemo de la specifita pako. Mi reliefigis dosieron, kiu estas interesa por studo. Ekzamenante la dosieron montras kiel ĉi tiu variablo estas uzata, sed ne diras de kie ĝi venas.

debconf

Montriĝas, ke ĉi tio estas ies artefakto. Kies? Antaŭ ol plonĝi en la instalilon, ni rigardu alian gravan Debianan infrastrukturon - respondojn al demandoj. Ĉiufoje kiam pako faras demandon, kaj en multaj kazoj kiam ĝi ne faras demandon sed uzas la defaŭltan opcion, kaj la demando kaj la respondo estas registritaj en speciala datumbazo en Debian nomita debconf. Ni povas rigardi la datumbazon de respondoj (kaj eĉ agordi ilin antaŭ ol instali la pakaĵon mem - debconf-set-selections), por tio ni bezonas ilon debconf-get-selections el la komponado debconf-utils. Bedaŭrinde nenio interesa estis trovita :(debconf-get-selections |grep -i resume revenis malplena).

debian-instalilo

La instalilo havas sian propran datumbazon de respondoj al demandoj: /var/log/installer/cdebconf/questions.dat. Bedaŭrinde, ankaŭ ne estas vorto pri nia vivresumo.
Sed estas ŝtipoj proksime, inkl. syslog, kie la tuta instalprotokolo estas skribita. La baza instalilo estas menciita tie, kaj sur ĝi paĝo ni povas vidi la ligon al la krudaĵoj.

Ene de ili ni povas facile trovi la respondon al nia demando:

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

mapdevfs estas ilo kun klara celo, kaj la funkcio, pri kiu ni interesiĝas get_resume_partition, kiu legas /proc/swaps kaj elektas la plej grandan tie. Interŝanĝo venas de partman.

La respondo al nia testa tasko: la dosiero estas kreita de la instalilo en /celo en la momento de la instalado, t.e. ni parolas pri konata, sed artefakto. Estas neniu aŭ io en la ekzistantaj pakoj en la sistemo, kiu povas ŝanĝi ĉi tiun dosieron.

Resumi

  1. dpkg kaj debconf estas la ĉefaj metodoj por trovi dosierprovizantoj.
  2. serĉi en /var/lib/dpkg/info ebligas al vi vidi operaciojn pri dosieroj dum la instala fazo.
  3. La instalilo povas krei artefaktajn dosierojn kiuj tiam neniam estas ŝanĝitaj de iu ajn (krom la uzanto), kaj tio povas esti vidita en la instalilo-kodo.

fonto: www.habr.com

Aldoni komenton