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

O objetivo deste post é mostrar uma técnica de depuração no debian/ubuntu relacionada a "encontrar a fonte" no arquivo de configuração do sistema.

Exemplo de teste: depois de muita zombaria da cópia tar.gz do SO instalado e após 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 veio esse valor (U1563304817I0) e como alterá-lo corretamente. Este é o primeiro exemplo que encontrei, não particularmente interessante por si só, mas conveniente para mostrar métodos práticos de trabalhar com Linux.

Passo número 1: De onde veio o RESUME?

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

Nós recursivamente (-r) procure uma menção a esta variável no diretório /etc (onde está a maioria das configurações). Encontramos o snippet conf.d, que é claramente usado pelo pacote initramfs-tools.

De onde é esse trecho?

Existem três opções:

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

Vamos verificar 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 o 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

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

No catálogo /var/lib/dpkg/info/ existem versões descompactadas de todos os “metarquivos” de pacotes (scripts de instalação/remoção, descrições de pacotes, etc.). Surpreendentemente, este arquivo é removido no postrm (na desinstalação) do pacote initramfs-tools-core. Vejamos o conteúdo do seu postinst... Nada relacionado ao diretório conf.d.

Vejamos os arquivos incluídos no pacote initramfs-tools-core.

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

Equipe dpkg -L permite que você visualize todos os arquivos que estão no sistema do pacote especificado. Destaquei um arquivo que é interessante para estudo. O exame do arquivo mostra como essa variável é usada, mas não informa de onde ela vem.

debconf

Acontece que este é o artefato de alguém. Cujo? Antes de mergulharmos no instalador, vamos dar uma olhada em outra infraestrutura importante do Debian – respostas a perguntas. Cada vez que um pacote faz uma pergunta, e em muitos casos quando ele não faz uma pergunta, mas usa a opção padrão, tanto a pergunta quanto a resposta são registradas em um banco de dados especial no Debian chamado debconf. Podemos consultar o banco de dados de respostas (e até mesmo configurá-las antes de instalar o pacote em si - debconf-set-selections), para isso precisamos de um utilitário debconf-get-selections da composição debconf-utils. Infelizmente, nada de interessante foi encontrado :(debconf-get-selections |grep -i resume retornado vazio).

instalador debian

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 nosso currículo.
Mas há registros próximos, incl. syslog, onde todo o log de instalação é gravado. O pacote base-installer é mencionado lá, e nele página podemos ver o link para os raws.

Dentro deles podemos encontrar facilmente a resposta à nossa pergunta:

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

mapdevfs é um utilitário com um propósito claro, e a função na qual estamos interessados ​​é get_resume_partition, que lê /proc/swaps e seleciona o maior deles. A troca vem do partman.

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

Resumindo

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

Fonte: habr.com

Adicionar um comentário