`kernel.core_pattern` не работает на моей виртуальной машине Ubuntu 18.04 после перезагрузки

`kernel.core_pattern` не работает на моей виртуальной машине Ubuntu 18.04 после перезагрузки

Тестовая среда

Я используюubuntu/bionic64Бродячая коробкав качестве моей тестовой среды.

Предварительные условия

После создания виртуальной машины я выполнил установку только ansible 2.9.23следующим образом:инструкции в официальном документе.

Я также установил ansible.posixколлекцию ( ansible-galaxy collection install ansible.posix), потому что я хочу использовать модуль ansible.posix.sysctl.

Убедитесь, что текущий шаблон ядра не соответствует моим ожиданиям:

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

Также /etc/sysctl.confне было основного шаблона:

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

Мое намерение

Я хочу изменить основной шаблон на /var/tmp/core.%h.%e.%t.

Что я сделал

Я выполнил следующую ansibleкоманду:

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

и это удалось с результатом:

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"
        }
    }
}

Я также проверил текущую конфигурацию:

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

Я также подтвердил, что core_patternбыло написано в /etc/sysctl.conf:

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

Затем я перезагрузил свою виртуальную машину. После перезагрузки текущий эффективный core_patternоткатился:

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

Мои мысли и то, что я пробовал

Этот вопросне кажется мне применимым, потому что, во-первых, вопрос был задан около 10 лет назад, а во-вторых, Ubuntu Server 18.04, похоже, upstartбольше не используется.

Я думал, что какие-то другие .confфайлы могут быть прочитаны позже, /etc/sysctl.confпоэтому настройки где-то были переопределены. Ноsysctl(8)страница руководстваперечисляет порядок файлов .confдля чтения, и, похоже, /etc/sysctl.confон должен быть последним, который переопределяет все остальные.

sysctl.conf(5)страница руководствапредоставляет список того же порядка, что и sysctl(8).

Я ничего не нашел вsysctl.d(5), либо. Фактически, его раздел «КАТАЛОГИ КОНФИГУРАЦИИ И ПРИОРИТЕТ» подтверждает мое понимание:

Файлы в /etc/ переопределяют файлы с тем же именем в /run/ и /lib/. Файлы в /run/ переопределяют файлы с тем же именем в /lib/.

Я обнаружил, kernel.core_patternчто будет установлено, как и ожидалось, как только я запустил sudo sysctl --systemвручную. Это может означать, что по умолчанию эти системные настройки не считываются.

решение1

После дальнейшего расследования я обнаружил, kernel.core_patternчто был перезаписанупаковкаapportпри загрузке системы.

Мне следовало подумать о проверке, apportкогда я увидел строку "/usr/share/apport/apport". Я не был уверен, apportдействительно ли она перезаписывает kernel.core_pattern, поэтому я решил взглянуть на ее исходный код.

Запустив apt-cache policy apport, я обнаружил, что используемая мной версия была 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:~$

Затем на apport'sСтраница LaunchPad, я нашел ссылку на скачивание:apport_2.20.9-0ubuntu7.tar.gz.

Поискав в исходном коде, я обнаружил, что файл debian/apport.initимеет следующее содержимое:

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

Поэтому я запустил dpkg -L apportсвою виртуальную машину, чтобы проверить, есть ли там этот файл:

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

Файла с точно таким же именем не было, но я решил взглянуть /etc/init.d/apportи обнаружил, что это тот файл, который я искал:

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

Я знал, что это /etc/sysctl.confчитается службой systemd-sysctl, поэтому следующим делом я хотел определить, systemd-sysctlбыл ли запущен ранее apport.

Я поискал, есть ли какая-либо apportсвязанная с этим услуга, и нашел одну:

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

Затем я проверил их взаимозависимость и обнаружил, apport.serviceчто запускается после systemd-sysctl.service:

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

Это означает, systemd-sysctl.serviceчто правильно считывает мою настройку kernel.core_patternв , /etc/sysctl.confно затем настройка немедленно перезаписывается apport.service.

Чтобы проверить это, я добавил две строки /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
}

Затем я перезагрузил ВМ. Когда ВМ снова заработала, я обнаружил, что файл /home/vagrant/sysctl.kernel.core_pattern.txtимел следующее содержимое:

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:~$

Итак, действительно, мои настройки были правильно считаны, но затем перезаписаны apport.

Связанный контент