测试环境
我使用ubuntu/bionic64
Vagrant box作为我的测试环境。
前置条件
创建VM后,我只是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
这可能意味着默认情况下不会读取这些系统设置。
经过进一步调查,我发现在系统启动时
kernel.core_pattern
被包覆盖。apport
apport
当我看到字符串“/usr/share/apport/apport”时,我应该考虑检查一下。我不确定是否apport
真的会覆盖kernel.core_pattern
,所以我决定看看它的源代码。通过运行
apt-cache policy apport
,我发现我使用的版本是2.20.9-0ubuntu7.24
:然后在
apport
LaunchPad页面上,我找到了它的下载链接:apport_2.20.9-0ubuntu7.tar.gz。在源代码中搜索,我发现该文件
debian/apport.init
有以下内容:所以我
dpkg -L apport
在我的虚拟机上运行,看看是否有这个文件:没有任何文件具有完全匹配的文件名,但我决定查看
/etc/init.d/apport
并发现这是我要查找的文件:我知道它
/etc/sysctl.conf
是由服务读取的systemd-sysctl
,所以接下来我要确定的是之前是否systemd-sysctl
启动过apport
。我搜索了是否有任何
apport
相关服务并找到了一个:然后我检查了它们的相互依赖关系,发现
apport.service
是在以下之后开始的systemd-sysctl.service
:这意味着
systemd-sysctl.service
正确读取我的 in 设置,kernel.core_pattern
但/etc/sysctl.conf
该设置随后立即被apport.service
.为了验证这一点,我在中添加了两行
/etc/init.d/apport
:然后我重新启动了虚拟机。当VM再次启动时,我发现该文件
/home/vagrant/sysctl.kernel.core_pattern.txt
具有以下内容:因此,确实,我的设置被正确读取,但随后被
apport
.