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:
- Artefacto máxico (alguén o puxo e esqueceu)
- Configuración do paquete
- 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
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
- dpkg e debconf son os principais métodos para atopar provedores de ficheiros.
- buscar en /var/lib/dpkg/info permítelle ver operacións nos ficheiros durante a fase de instalación.
- 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