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-swapEstamos 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:
- Um artefato mágico (alguém colocou e esqueceu)
- Configuração do pacote
- 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.confVoltamos à 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/resumeNo 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 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" >> $resumeconfmapdevfs é 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
- dpkg e debconf — são os principais métodos para procurar fornecedores de arquivos.
- a busca em /var/lib/dpkg/info permite ver operações sobre arquivos no estágio de instalação.
- 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
