重启后,`kernel.core_pattern` 在我的 Ubuntu 18.04 VM 上无效

重启后,`kernel.core_pattern` 在我的 Ubuntu 18.04 VM 上无效

测试环境

我正在使用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在系统启动时。

当我看到字符串“/usr/share/apport/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:~$

然后apportLaunchPad 页面,我找到了它的下载链接: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

相关内容