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

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


Ejemplo de prueba: después de la intimidación prolongada de una copia tar.gz del sistema operativo instalado y después de restaurarlo 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. 

Propósito: comprender de dónde proviene este valor (U1563304817I0) y cómo cambiarlo correctamente. Este es el primer ejemplo que aparece, no particularmente interesante en 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 

Recursivamente ( -r ) buscamos la mención de esta variable en el directorio / etc (donde se encuentran la mayoría de las configuraciones). Encontramos conf.d un fragmento que es explícitamente utilizado por el paquete initramfs-tools.


¿De dónde viene este fragmento?


Hay tres opciones:


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

Marque No. 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. 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 está instalado en el sistema desde el paquete. ¿Tal vez se genera en el script postinst / preinst del paquete? Verifique 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 

El directorio /var/lib/dpkg/info/ contiene las versiones desempaquetadas de todos los "metarchivos" del paquete (instalar / desinstalar scripts, descripciones de paquetes, etc.). Sorprendentemente, este archivo se elimina en la postrm (tras la eliminación) del paquete initramfs-tools-core. Veamos el contenido de su postinst ... Nada sobre el directorio conf.d.


Veamos los archivos del paquete initramfs-tools-core .


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

El comando dpkg -L permite ver todos los archivos que están en el sistema desde el paquete especificado. Destaqué un archivo interesante para estudiar. El examen del archivo muestra cómo se usa esta variable, pero no responde de dónde proviene.


debconf


Resulta que este es el artefacto de alguien. De quien? Antes de sumergirse en el instalador, veamos otra infraestructura importante de Debian: respuestas a 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 arreglan en una base de datos especial en Debian llamada debconf. Podemos mirar la base de datos de respuestas (e incluso configurarlas antes de instalar el paquete en sí mismo - debconf-set-selections ), para esto necesitamos la utilidad debconf-get-selections de 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 . Desafortunadamente, tampoco hay una palabra sobre nuestro currículum allí.
Pero hay registros cercanos, incluidos syslog, donde se escribe todo el registro de instalación. El paquete base-instalador se menciona allí, y en su página podemos ver un enlace a los raws.


Dentro de ellos, 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 un propósito claro, y la función que nos interesa es get_resume_partition , que lee / proc / swaps y selecciona la más grande allí. El intercambio proviene de partman.


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


Para resumir


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

Source: https://habr.com/ru/post/461033/


All Articles