Ubuntu 18.04 VM を再起動した後、`kernel.core_pattern` が効かなくなる

Ubuntu 18.04 VM を再起動した後、`kernel.core_pattern` が効かなくなる

テスト環境

私はubuntu/bionic64浮浪者ボックステスト環境として。

前提条件

VMを作成した後、ansible 2.9.23次の手順に従ってインストールしました公式文書の指示

モジュール を使用したいので、ansible.posixコレクション ( )もインストールしました。ansible-galaxy collection install ansible.posixansible.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

次に、VM を再起動しました。再起動後、現在有効なものが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かどうかわからなかったので、ソースコードを確認することにしました。apportkernel.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'sLaunchPadページダウンロードリンクを見つけました: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そこで、 VM 上で実行して、次のファイルがあるかどうかを確認しました。

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.confapport.service

これを検証するために、次の 2 行を追加しました/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
}

次に、VM を再起動しました。VM が再び起動すると、ファイルの/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

関連情報