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:
- Artefato mágico (alguém colocou e esqueceu)
- Configuração do pacote
- 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
- O dpkg e o debconf são os principais métodos para encontrar provedores de arquivos.
- uma pesquisa em / var / lib / dpkg / info permite que você veja as operações do arquivo durante a fase de instalação.
- 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.