Тестовая среда
Я использую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
.