重新啟動後,「kernel.core_pattern」在我的 Ubuntu 18.04 VM 上無效

重新啟動後,「kernel.core_pattern」在我的 Ubuntu 18.04 VM 上無效

測試環境

我正在使用ubuntu/bionic64流浪盒作為我的測試環境。

前提條件

建立VM後,我只ansible 2.9.23按以下方式安裝官方文件中的說明

我還安裝了ansible.posixcollection( 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啟動板頁面,我找到了它的下載連結: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:~$

這意味著正確讀取我的insystemd-sysctl.service設置,但該設置會立即被 覆蓋。kernel.core_pattern/etc/sysctl.confapport.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.

相關內容