¿De dónde viene esta configuración? [Debian/Ubuntu]

El propósito de esta publicación es mostrar una técnica de depuración en Debian/ubuntu relacionada con "encontrar la fuente" en el archivo de configuración del sistema.

Ejemplo de prueba: después de muchas burlas de la copia tar.gz del sistema operativo instalado y después de restaurarla e instalar actualizaciones, recibimos el mensaje:

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.

Objetivo: entender de dónde viene este valor (U1563304817I0) y cómo cambiarlo correctamente. Este es el primer ejemplo que encontré, no particularmente interesante en sí mismo, pero sí conveniente para mostrar métodos prácticos de trabajo con Linux..

Paso número 1: ¿De dónde surgió RESUME?

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

Nosotros recursivamente (-r) busque una mención de esta variable en el directorio /etc (donde están la mayoría de las configuraciones). Encontramos el fragmento conf.d, que claramente utiliza el paquete initramfs-tools.

¿De dónde es este fragmento?

Hay tres opciones:

  1. Artefacto mágico (alguien lo puso y lo olvidó)
  2. Configuración desde el paquete
  3. Configuración generada por algún script de paquetes del sistema

Revisemos el número 2 (como el más simple):

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

dpkg -S nos permite buscar en la base de datos de archivos instalados y encontrar a qué paquete pertenece el archivo. A continuación se muestra un ejemplo de una búsqueda exitosa:

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

Volvamos a nuestra tarea: archivo initramfs-tools/conf.d/resume no está instalado en el sistema desde el paquete. ¿Quizás se genera en el script postinst/preinst del paquete? Comprobemos la 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 el catálogo /var/lib/dpkg/info/ Hay versiones descomprimidas de todos los "metarchivos" de los paquetes (scripts de instalación/eliminación, descripciones de paquetes, etc.). Sorprendentemente, este archivo se elimina en el postrm (al desinstalar) del paquete initramfs-tools-core. Veamos el contenido de su postinst... Nada relacionado con el directorio conf.d.

Veamos los archivos incluidos en el paquete. initramfs-tools-core.

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

Equipo dpkg -L le permite ver todos los archivos que están en el sistema desde el paquete especificado. He resaltado un archivo que es interesante para estudiar. Examinar el archivo muestra cómo se usa esta variable, pero no dice de dónde viene.

debconf

Resulta que este es el artefacto de alguien. ¿Cuyo? Antes de profundizar en el instalador, echemos un vistazo a otra infraestructura importante de Debian: las respuestas a las preguntas. Cada vez que un paquete hace una pregunta, y en muchos casos cuando no hace una pregunta pero usa la opción predeterminada, tanto la pregunta como la respuesta se registran en una base de datos especial en Debian llamada debconf. Podemos consultar la base de datos de respuestas (e incluso configurarlas antes de instalar el paquete). debconf-set-selections), para esto necesitamos una utilidad debconf-get-selections de la composición debconf-utils. Desafortunadamente, no se encontró nada interesante :(debconf-get-selections |grep -i resume devuelto vacío).

instalador de debian

El instalador tiene su propia base de datos de respuestas a preguntas: /var/log/installer/cdebconf/questions.dat. Lamentablemente tampoco hay ni una palabra sobre nuestro currículum.
Pero hay troncos cerca, incl. syslog, donde se escribe todo el registro de instalación. El paquete de instalación base se menciona allí y en él página podemos ver el enlace a los raws.

Dentro de ellos podemos encontrar fácilmente la respuesta a nuestra pregunta:

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

mapdevfs es una utilidad con un propósito claro, y la función que nos interesa es get_resume_partition, que lee /proc/swaps y selecciona el más grande allí. El intercambio viene de partman.

La respuesta a nuestra tarea de prueba: el archivo lo crea el instalador en /target en el momento de la instalación, es decir. Estamos hablando de algo conocido, pero un artefacto. No hay nada ni nadie en los paquetes existentes en el sistema que pueda cambiar este archivo.

En resumen

  1. dpkg y debconf son los métodos principales para encontrar proveedores de archivos.
  2. buscar en /var/lib/dpkg/info le permite ver las operaciones en los archivos durante la fase de instalación.
  3. El instalador puede crear archivos de artefactos que nadie (excepto el usuario) puede cambiar nunca, y esto se puede ver en el código del instalador.

Fuente: habr.com

Añadir un comentario