`kernel.core_pattern` não é eficaz na minha VM Ubuntu 18.04 após a reinicialização

`kernel.core_pattern` não é eficaz na minha VM Ubuntu 18.04 após a reinicialização

Ambiente de teste

estou usando oubuntu/bionic64Caixa vagabundacomo meu ambiente de teste.

Pré-condições

Depois de criar a VM, só instalei ansible 2.9.23seguindoas instruções no documento oficial.

Também instalei a ansible.posixcoleção( ansible-galaxy collection install ansible.posix) porque vou querer usar o módulo ansible.posix.sysctl.

Verifique se o padrão principal atual não era o que eu queria:

vagrant@ubuntu-bionic:~$ sysctl kernel.core_pattern
kernel.core_pattern = |/usr/share/apport/apport %p %s %c %d %P %E

Além disso, /etc/sysctl.confnão tinha o padrão principal:

vagrant@ubuntu-bionic:~$ grep "core_pattern" /etc/sysctl.conf
vagrant@ubuntu-bionic:~$

Minha intenção

Quero mudar o padrão principal para /var/tmp/core.%h.%e.%t.

O que eu fiz

Executei o seguinte ansiblecomando:

ansible -bKvvv -m "sysctl" -a "name=kernel.core_pattern state=present value='/var/tmp/core.%h.%e.%t' reload=yes" localhost

e teve sucesso com a saída:

localhost | CHANGED => {
    "changed": true, 
    "invocation": {
        "module_args": {
            "ignoreerrors": false, 
            "name": "kernel.core_pattern", 
            "reload": true, 
            "state": "present", 
            "sysctl_file": "/etc/sysctl.conf", 
            "sysctl_set": false, 
            "value": "/var/tmp/core.%h.%e.%t"
        }
    }
}

Também verifiquei a configuração atual:

vagrant@ubuntu-bionic:/etc$ sysctl kernel.core_pattern
kernel.core_pattern = /var/tmp/core.%h.%e.%t

Também confirmei que core_patternfoi escrito em /etc/sysctl.conf:

vagrant@ubuntu-bionic:~$ grep "core_pattern" /etc/sysctl.conf 
kernel.core_pattern=/var/tmp/core.%h.%e.%t

Então reiniciei minha VM. Após a reinicialização, o atualmente em vigor core_patternfoi revertido:

vagrant@ubuntu-bionic:~$ sysctl kernel.core_pattern
kernel.core_pattern = |/usr/share/apport/apport %p %s %c %d %P %E

Meus pensamentos e o que tentei

Essa questãonão parece ser aplicável para mim porque, em primeiro lugar, foi solicitado há cerca de 10 anos e, em segundo lugar, o Ubuntu Server 18.04 parece não ser upstartmais utilizado.

Achei que alguns outros .confarquivos poderiam ser lidos mais tarde, /etc/sysctl.confentão as configurações foram substituídas em algum lugar. Massysctl(8)página de manuallista a ordem dos .confarquivos a serem lidos e parece que /etc/sysctl.confdeve ser o último que substitui todo o resto.

sysctl.conf(5)página de manualfornece a lista da mesma ordem que sysctl(8).

não encontrei nada emsysctl.d(5), qualquer. Na verdade, sua seção "DIRETÓRIOS DE CONFIGURAÇÃO E PRECEDÊNCIA" confirma meu entendimento:

Arquivos em /etc/ substituem arquivos com o mesmo nome em /run/ e /lib/. Arquivos em /run/ substituem arquivos com o mesmo nome em /lib/.

Descobri kernel.core_patternque seria definido conforme o esperado depois de executado sudo sysctl --systemmanualmente. Isso pode significar que, por padrão, essas configurações do sistema não são lidas.

Responder1

Após uma investigação mais aprofundada, descobri que kernel.core_patternfoi substituído pelopacoteapportna inicialização do sistema.

Eu deveria ter pensado em verificar apportquando vi a string "/usr/share/apport/apport". Eu não tinha certeza se apportera realmente aquele que sobrescreve kernel.core_pattern, então decidi dar uma olhada em seu código-fonte.

Ao executar apt-cache policy apport, descobri que a versão que estava usando era 2.20.9-0ubuntu7.24:

vagrant@ubuntu-bionic:~$ apt-cache policy apport
apport:
  Installed: 2.20.9-0ubuntu7.24
  Candidate: 2.20.9-0ubuntu7.24
  Version table:
 *** 2.20.9-0ubuntu7.24 500
        500 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages
        500 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages
        100 /var/lib/dpkg/status
     2.20.9-0ubuntu7 500
        500 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages
vagrant@ubuntu-bionic:~$

Então apportemPágina do LaunchPad, encontrei o link para download:apport_2.20.9-0ubuntu7.tar.gz.

Pesquisando no código fonte, encontrei o arquivo debian/apport.initcom o seguinte conteúdo:

do_start()
{
    ...
    ...
    echo "|$AGENT %p %s %c %d %P" > /proc/sys/kernel/core_pattern
    echo 2 > /proc/sys/fs/suid_dumpable
}

Então corri dpkg -L apportna minha VM para ver se havia esse arquivo:

vagrant@ubuntu-bionic:~$ dpkg -L apport | grep init
/etc/init.d
/etc/init.d/apport

Não havia nenhum arquivo com o nome exatamente correspondente, mas decidi dar uma olhada /etc/init.d/apporte descobri que este era o arquivo que estava procurando:

do_start()
{
        ...
        ...
        echo "|$AGENT %p %s %c %d %P %E" > /proc/sys/kernel/core_pattern
        echo 2 > /proc/sys/fs/suid_dumpable
}

Eu sabia que isso /etc/sysctl.confera lido pelo serviço systemd-sysctl, então a próxima coisa que queria determinar era se ele systemd-sysctlfoi iniciado antes apport.

Procurei se havia algum apportserviço relacionado e encontrei um:

vagrant@ubuntu-bionic:~$ systemctl list-units | grep apport
apport.service                                                                      loaded active exited    LSB: automatic crash report generation

Em seguida, verifiquei sua interdependência e descobri apport.serviceque foi iniciado depois systemd-sysctl.service:

vagrant@ubuntu-bionic:~$ systemctl list-dependencies apport.service
apport.service
● ├─system.slice
● └─sysinit.target
...
●   ├─systemd-sysctl.service
...
...
vagrant@ubuntu-bionic:~$

Isso significa que systemd-sysctl.servicelê corretamente minha configuração, kernel.core_patternin /etc/sysctl.confmas a configuração é imediatamente substituída por apport.service.

Para verificar isso, adicionei duas linhas em /etc/init.d/apport:

do_start()
{
        ...
        ...
        # NOTE(ywen): Write the current value to a file.
        sysctl kernel.core_pattern > /home/vagrant/sysctl.kernel.core_pattern.txt

        echo "|$AGENT %p %s %c %d %P %E" > /proc/sys/kernel/core_pattern
        echo 2 > /proc/sys/fs/suid_dumpable

        # NOTE(ywen): Append the current value to the file.
        sysctl kernel.core_pattern >> /home/vagrant/sysctl.kernel.core_pattern.txt
}

Então reiniciei a VM. Quando a VM foi ativada novamente, descobri que o arquivo /home/vagrant/sysctl.kernel.core_pattern.txttinha o seguinte conteúdo:

vagrant@ubuntu-bionic:~$ cat sysctl.kernel.core_pattern.txt 
kernel.core_pattern = /var/tmp/core.%h.%e.%t
kernel.core_pattern = |/usr/share/apport/apport %p %s %c %d %P %E
vagrant@ubuntu-bionic:~$

Então, de fato, minha configuração foi lida corretamente, mas substituída por apport.

informação relacionada