De onde vén esta configuración? [Debian/Ubuntu]

O propósito desta publicación é mostrar unha técnica de depuración en debian/ubuntu relacionada con "buscar a fonte" no ficheiro de configuración do sistema.

Exemplo de proba: despois de burlarse moito da copia tar.gz do SO instalado e despois de restauralo e instalar actualizacións, recibimos a mensaxe:

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.

Obxectivo: comprender de onde veu este valor (U1563304817I0) e como cambialo correctamente. Este é o primeiro exemplo que se atopou, non especialmente interesante en si mesmo, pero conveniente para mostrar métodos prácticos de traballo con Linux.

Paso número 1: De onde veu o currículo?

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

Nós recursivamente (-r) busque unha mención desta variable no directorio /etc (onde están a maioría das configuracións). Atopamos o fragmento conf.d, que é claramente usado polo paquete initramfs-tools.

De onde é este fragmento?

Existen tres opcións:

  1. Artefacto máxico (alguén o puxo e esqueceu)
  2. Configuración do paquete
  3. Configuración xerada por algún script dos paquetes do sistema

Comprobamos o número 2 (como o máis sinxelo):

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

dpkg -S permítenos buscar na base de datos de ficheiros instalados e atopar a que paquete pertence o ficheiro. Aquí tes un exemplo dunha busca exitosa:

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

Volvamos á nosa tarefa: arquivo initramfs-tools/conf.d/resume non está instalado no sistema desde o paquete. Quizais se xere no script postinst/preinst do paquete? Comprobamos a versión número 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 catálogo /var/lib/dpkg/info/ hai versións desempaquetadas de todos os "metarquivos" dos paquetes (scripts de instalación/eliminación, descricións de paquetes, etc.). Sorprendentemente, este ficheiro elimínase no postrm (ao desinstalar) do paquete initramfs-tools-core. Vexamos o contido do seu postinst... Nada relacionado co directorio conf.d.

Vexamos os ficheiros incluídos no paquete initramfs-tools-core.

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

Equipo dpkg -L permítelle ver todos os ficheiros que hai no sistema desde o paquete especificado. Destaquei un arquivo que é interesante para o estudo. Ao examinar o ficheiro móstrase como se usa esta variable, pero non indica de onde procede.

debconf

Resulta que este é un artefacto de alguén. De quen? Antes de mergullarse no instalador, vexamos outra infraestrutura importante de Debian: as respostas ás preguntas. Cada vez que un paquete fai unha pregunta, e en moitos casos cando non fai unha pregunta pero usa a opción predeterminada, tanto a pregunta como a resposta gárdanse nunha base de datos especial en Debian chamada debconf. Podemos mirar a base de datos de respostas (e incluso configuralas antes de instalar o propio paquete - debconf-set-selections), para iso necesitamos unha utilidade debconf-get-selections da composición debconf-utils. Desafortunadamente, non se atopou nada interesante :(debconf-get-selections |grep -i resume volveu baleiro).

debian-installer

O instalador ten a súa propia base de datos de respostas ás preguntas: /var/log/installer/cdebconf/questions.dat. Desafortunadamente, tampouco hai unha palabra sobre o noso currículo.
Pero hai rexistros preto, incl. syslog, onde se escribe todo o rexistro de instalación. O paquete de instalación base menciónase alí, e nel páxina podemos ver o enlace aos raws.

Dentro deles podemos atopar facilmente a resposta á nosa pregunta:

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

mapdevfs é unha utilidade cun propósito claro, e a función que nos interesa é get_resume_partition, que le /proc/swaps e selecciona o máis grande alí. O intercambio vén de partman.

A resposta á nosa tarefa de proba: o ficheiro é creado polo instalador en /target no momento da instalación, é dicir. estamos a falar de coñecido, pero un artefacto. Non hai ninguén nin nada nos paquetes existentes no sistema que poida cambiar este ficheiro.

Resumo

  1. dpkg e debconf son os principais métodos para atopar provedores de ficheiros.
  2. buscar en /var/lib/dpkg/info permítelle ver operacións nos ficheiros durante a fase de instalación.
  3. O instalador pode crear ficheiros de artefactos que ninguén modifica (agás o usuario), e isto pódese ver no código do instalador.

Fonte: www.habr.com

Engadir un comentario