De onde vem essa configuração? [Debian / Ubuntu]

O objetivo deste post é mostrar a técnica de depuração debian / ubuntu relacionada à "pesquisa de código-fonte" no arquivo de configuração do sistema.


Exemplo de teste: após um longo bullying de uma cópia tar.gz do sistema operacional instalado e depois de restaurá-lo e instalar atualizações, recebemos a mensagem:


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 onde esse valor (U1563304817I0) veio e como alterá-lo corretamente. Este é o primeiro exemplo que aparece, não particularmente interessante por si só, mas conveniente para mostrar métodos práticos de trabalho com o Linux .


Etapa número 1: de onde veio RESUME?


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

Recursivamente ( -r ) procuramos a menção dessa variável no diretório / etc (onde está a maioria das configurações). Encontramos conf.d um trecho que é explicitamente usado pelo pacote initramfs-tools.


De onde vem esse trecho?


Existem três opções:


  1. Artefato mágico (alguém colocou e esqueceu)
  2. Configuração do pacote
  3. Uma configuração gerada por algum script a partir de pacotes do sistema

Verifique o número 2 (como o mais simples):


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

dpkg -S nos permite pesquisar no banco de dados de arquivos instalados e descobrir a qual pacote o arquivo pertence. Aqui está um exemplo de uma pesquisa bem-sucedida:


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

Voltamos à nossa tarefa: o arquivo initramfs-tools/conf.d/resume não está instalado no sistema a partir do pacote. Talvez ele seja gerado no script postinst / preinst do pacote? Verifique o número da versão 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 

O diretório /var/lib/dpkg/info/ contém as versões descompactadas de todos os "metarquivos" do pacote (scripts de instalação / desinstalação, descrições de pacotes, etc.). Surpreendentemente, esse arquivo é excluído no postrm (após a exclusão) do pacote initramfs-tools-core. Vamos ver o conteúdo do seu postinst ... Nada sobre o diretório conf.d.


Vejamos os arquivos do pacote initramfs-tools-core .


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

O comando dpkg -L permite ver todos os arquivos que estão no sistema a partir do pacote especificado. Eu destaquei um arquivo interessante para estudar. Examinar o arquivo mostra como essa variável é usada, mas não responde de onde vem.


debconf


Acontece que este é o artefato de alguém. De quem? Antes de mergulhar no instalador, vejamos outra importante infraestrutura Debian - respostas a perguntas. Toda vez que um pacote faz uma pergunta e, em muitos casos, quando não faz uma pergunta, mas usa a opção padrão, tanto a pergunta quanto a resposta são corrigidas em um banco de dados especial no Debian chamado debconf. Podemos examinar o banco de dados de respostas (e até configurá-los antes de instalar o próprio pacote - debconf-set-selections ), para isso precisamos do utilitário debconf-get-selections do debconf-utils . Infelizmente, nada de interessante foi encontrado: ( debconf-get-selections |grep -i resume retornou vazio).


debian-installer


O instalador possui seu próprio banco de dados de respostas às perguntas: /var/log/installer/cdebconf/questions.dat . Infelizmente, também não há uma palavra sobre o nosso currículo.
Mas existem registros por perto, incluindo syslog, onde todo o log de instalação é gravado. O pacote do instalador básico é mencionado lá e, em sua página , podemos ver um link para os dados brutos.


Dentro deles, encontramos facilmente a resposta para nossa pergunta:


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

O mapdevfs é um utilitário com um objetivo claro, e a função na qual estamos interessados ​​é get_resume_partition , que lê / proc / swaps e seleciona o maior existente. Swap vem de partman.


A resposta à nossa tarefa de teste: o arquivo é criado pelo instalador em / target no momento da instalação, ou seja, estamos falando de um conhecido, mas um artefato. Não há ninguém e nada nos pacotes existentes no sistema para alterar este arquivo.


Resumir


  1. O dpkg e o debconf são os principais métodos para encontrar provedores de arquivos.
  2. uma pesquisa em / var / lib / dpkg / info permite que você veja as operações do arquivo durante a fase de instalação.
  3. O instalador pode criar arquivos de artefato que nunca são alterados por ninguém (exceto o usuário), e isso pode ser visto no código do instalador.

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


All Articles