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

El objetivo de esta publicación es mostrar la técnica de depuración en debian/ubuntu relacionada con la «búsqueda de la fuente» en el archivo de configuración del sistema.

Ejemplo de prueba: después de muchas manipulaciones con una copia tar.gz del sistema operativo instalado y tras su restauración e instalación de actualizaciones, recibimos el mensaje:

update-initramfs: Generando /boot/initrd.img-4.15.0-54-generic
W: la configuración de initramfs-tools establece RESUME=/dev/mapper/U1563304817I0-swap
W: pero no hay un dispositivo de intercambio coincidente disponible.
I: El initramfs intentará reanudar desde /dev/dm-1
I: (/dev/mapper/foobar-swap)
I: Establezca la variable RESUME para anular esto.

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

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

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

Buscamos de manera recursiva (-r) las menciones de esta variable en el directorio /etc (donde se encuentran la mayoría de las configuraciones). Encontramos un fragmento en conf.d, que es claramente utilizado por el paquete initramfs-tools.

¿De dónde proviene este fragmento?

Hay tres opciones:

  1. Un artefacto mágico (alguien lo dejó y se olvidó de él)
  2. Configuración del paquete
  3. Configuración generada por algún script de los paquetes del sistema

Verificamos la opción número 2 (como la más simple):

 dpkg -S initramfs-tools/conf.d/resume
dpkg-query: no se encontró ninguna ruta que coincida con el patrón *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. Aquí hay un ejemplo de búsqueda exitosa:

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

Volvemos a nuestra tarea: el archivo initramfs-tools/conf.d/resume no se instala en el sistema a través del paquete. ¿Podría generarse en el script postinst/preinst del paquete? Verificamos 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 directorio /var/lib/dpkg/info/ hay versiones descomprimidas de todos los «metafiles» de los paquetes (scripts de instalación/desinstalación, descripciones de paquetes, etc.). Sorprendentemente, este archivo se elimina en el postrm (al desinstalar) del paquete initramfs-tools-core. Vamos a ver el contenido de su postinst… Nada relacionado con el directorio conf.d.

Vamos a ver los archivos que componen el paquete initramfs-tools-core.

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

Comando dpkg -L nos permite ver todos los archivos que hay en el sistema del paquete especificado. He destacado un archivo interesante para estudiar. El estudio del archivo muestra cómo se utiliza esta variable, pero no responde de dónde proviene.

debconf

Parece que es un artefacto de alguien. ¿De quién? Antes de sumergirnos en el instalador, veamos otra infraestructura importante de Debian: las respuestas a las preguntas. Cada vez que un paquete hace una pregunta, y en muchos casos, cuando no la hace pero usa una opción por defecto, tanto la pregunta como la respuesta se registran en una base especial en Debian llamada debconf. Podemos ver la base de respuestas (incluso exponerlas antes de instalar el paquete mismo — debconf-set-selections), para ello necesitaremos la utilidad debconf-get-selections del paquete debconf-utils. Desafortunadamente, no se encontró nada interesante: (debconf-get-selections | grep -i resume devolvió vacío).

debian-installer

El instalador tiene su propia base de respuestas a preguntas: /var/log/installer/cdebconf/questions.dat. Desafortunadamente, allí tampoco hay palabra alguna sobre nuestro resume.
Sin embargo, hay registros cercanos, incluida syslog, donde se escribe todo el registro de instalación. Allí se menciona el paquete base-installer, y en su página podemos ver un enlace a las fuentes.

Dentro de ellas encontramos 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 una función clara, y la función que nos interesa es get_resume_partition, que lee /proc/swaps y elige el más grande. El swap proviene de partman.

La respuesta a nuestra tarea de prueba: el archivo es creado por el instalador en /target en el momento de la instalación, es decir, estamos hablando de un artefacto bien conocido. En los paquetes existentes en el sistema no hay nadie y nada que cambie este archivo.

Resumiendo

  1. dpkg y debconf son los métodos principales para buscar los proveedores de archivos.
  2. la búsqueda en /var/lib/dpkg/info permite ver las operaciones sobre los archivos en la fase de instalación.
  3. El instalador puede crear archivos-artefactos que nunca serán cambiados por nadie (excepto por el usuario), y esto se puede ver en el código del instalador.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster