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

O objetivo deste post é mostrar a técnica de depuração em debian/ubuntu relacionada à ‘busca pela origem’ em arquivos de configuração do sistema.

Exemplo de teste: após longas tentativas com uma cópia tar.gz do sistema operacional instalado e depois de sua recuperação e instalação de atualizações, recebemos a mensagem:

update-initramfs: Gerando /boot/initrd.img-4.15.0-54-generic
W: a configuração do initramfs-tools define RESUME=/dev/mapper/U1563304817I0-swap
W: mas nenhum dispositivo de swap correspondente está disponível.
I: O initramfs tentará retomar de /dev/dm-1
I: (/dev/mapper/foobar-swap)
I: Defina a variável RESUME para sobrescrever isso.

Objetivo: entender de onde esse valor (U1563304817I0) veio e como alterá-lo corretamente. Este é o primeiro exemplo que encontramos, não muito interessante em si, mas conveniente para mostrar métodos práticos de trabalho 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

Estamos buscando recursivamente (-r) menções a essa variável no diretório /etc (onde estão a maioria dos arquivos de configuração). Encontramos um snippet conf.d que é claramente usado pelo pacote initramfs-tools.

De onde veio esse snippet?

Há três opções:

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

Verificamos a opção nº 2 (como a mais simples):

 dpkg -S initramfs-tools/conf.d/resume
dpkg-query: nenhum caminho encontrado combinando o padrão *initramfs-tools/conf.d/resume*

dpkg -S nos permite procurar no banco de arquivos instalados e descobrir a que pacote o arquivo pertence. Aqui está um exemplo de busca 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 é instalado no sistema pelo pacote. Pode ser que ele 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 diretório /var/lib/dpkg/info/ contém as versões descompactadas de todos os ‘metarquivos’ dos pacotes (scripts de instalação/remover, descrições de pacotes etc.). É surpreendente, mas este arquivo é removido no postrm (ao remover) do pacote initramfs-tools-core. Vamos olhar o conteúdo do seu postinst… Nada relacionado ao diretório conf.d.

Vamos examinar os arquivos que fazem parte do pacote initramfs-tools-core.

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

Time dpkg -L nos permite ver todos os arquivos que estão no sistema do pacote indicado. Eu destaquei um arquivo interessante para estudo. O exame do arquivo mostra como essa variável é usada, mas não responde de onde ela aparece.

debconf

Então, isso é um artefato de alguém. De quem? Antes de mergulharmos no instalador, vamos dar uma olhada em uma infraestrutura importante do Debian — as respostas às perguntas. Sempre que um pacote faz uma pergunta, e em muitos casos, mesmo quando não faz, mas usa a opção padrão, tanto a pergunta quanto a resposta são registradas em uma base especial no Debian, chamada debconf. Podemos examinar a base de respostas (e até definir essas respostas antes da instalação do próprio pacote — debconf-set-selections), para isso precisaremos da utilidade debconf-get-selections do pacote debconf-utils. Infelizmente, não encontramos nada interessante: (debconf-get-selections |grep -i resume retornou vazio).

debian-installer

O instalador tem sua própria base de respostas para perguntas: /var/log/installer/cdebconf/questions.dat. Infelizmente, lá também não há uma palavra sobre nosso resume.
No entanto, há logs próximos, incluindo o syslog, onde todo o log de instalação é gravado. Há menção ao pacote base-installer, e em seu página podemos ver um link para as fontes.

Dentro delas, encontramos facilmente a resposta para nossa pergunta:

  resume="$(mapdevfs "$resume_devfs")"; então
...
    se [ "$do_initrd" = yes ]; então
     ...
            resumeconf=$IT_CONFDIR/resume
....
                echo "RESUME=$resume" >> $resumeconf

mapdevfs é uma utilidade com uma função clara, e a função interessante para nós é get_resume_partition, que lê /proc/swaps e seleciona a maior. Porém, o swap 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. Nos pacotes existentes no sistema, não há nada que modifique esse arquivo.

Resumindo

  1. dpkg e debconf — são os principais métodos para procurar fornecedores de arquivos.
  2. a busca em /var/lib/dpkg/info permite ver operações sobre arquivos no estágio de instalação.
  3. O instalador pode criar arquivos-artefatos, que nunca são alterados por ninguém (exceto o usuário), e isso pode ser visto no código do instalador.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster