`kernel.core_pattern` ist auf meiner Ubuntu 18.04 VM nach dem Neustart nicht wirksam

`kernel.core_pattern` ist auf meiner Ubuntu 18.04 VM nach dem Neustart nicht wirksam

Test Umgebung

Ich verwende dieubuntu/bionic64Vagrant-Boxals meine Testumgebung.

Voraussetzungen

Nach dem Erstellen der VM habe ich nur ansible 2.9.23Folgendes installiert:die Anweisungen im offiziellen Dokument.

Ich habe auch die ansible.posixSammlung ( ansible-galaxy collection install ansible.posix) installiert, da ich das Modul verwenden möchte ansible.posix.sysctl.

Überprüfen Sie, ob das aktuelle Kernmuster nicht meinen Wünschen entsprach:

vagrant@ubuntu-bionic:~$ sysctl kernel.core_pattern
kernel.core_pattern = |/usr/share/apport/apport %p %s %c %d %P %E

Außerdem /etc/sysctl.conffehlte das Kernmuster:

vagrant@ubuntu-bionic:~$ grep "core_pattern" /etc/sysctl.conf
vagrant@ubuntu-bionic:~$

Meine Absicht

Ich möchte das Kernmuster in ändern /var/tmp/core.%h.%e.%t.

Was ich getan habe

Ich habe den folgenden ansibleBefehl ausgeführt:

ansible -bKvvv -m "sysctl" -a "name=kernel.core_pattern state=present value='/var/tmp/core.%h.%e.%t' reload=yes" localhost

und es war erfolgreich mit der Ausgabe:

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"
        }
    }
}

Ich habe auch die aktuelle Konfiguration überprüft:

vagrant@ubuntu-bionic:/etc$ sysctl kernel.core_pattern
kernel.core_pattern = /var/tmp/core.%h.%e.%t

Ich habe auch bestätigt, dass Folgendes core_patterngeschrieben wurde /etc/sysctl.conf:

vagrant@ubuntu-bionic:~$ grep "core_pattern" /etc/sysctl.conf 
kernel.core_pattern=/var/tmp/core.%h.%e.%t

Dann habe ich meine VM neugestartet. Nach dem Neustart wurde der aktuell gültige Zustand core_patternwiederhergestellt:

vagrant@ubuntu-bionic:~$ sysctl kernel.core_pattern
kernel.core_pattern = |/usr/share/apport/apport %p %s %c %d %P %E

Meine Gedanken und was ich versucht habe

Diese Fragescheint für mich nicht anwendbar zu sein, da die Frage erstens schon vor ca. 10 Jahren gestellt wurde und zweitens Ubuntu Server 18.04 offenbar nicht upstartmehr verwendet wird.

.confIch dachte , dass später andere Dateien gelesen werden könnten /etc/sysctl.conf, sodass die Einstellungen irgendwo überschrieben wurden. Abersysctl(8)manpagelistet die Reihenfolge der .confzu lesenden Dateien auf und es sieht so aus, als /etc/sysctl.confob die letzte Datei alles andere überschreiben sollte.

sysctl.conf(5)manpagestellt die Liste in derselben Reihenfolge bereit wie sysctl(8).

Ich habe nichts gefunden insysctl.d(5), auch nicht. Tatsächlich bestätigt der Abschnitt „KONFIGURATIONSVERZEICHNISSE UND RANGORDNUNG“ mein Verständnis:

Dateien in /etc/ überschreiben Dateien mit demselben Namen in /run/ und /lib/. Dateien in /run/ überschreiben Dateien mit demselben Namen in /lib/.

Ich habe festgestellt, kernel.core_patterndass es wie erwartet eingestellt wird, wenn ich es sudo sysctl --systemmanuell ausführe. Das kann bedeuten, dass diese Systemeinstellungen standardmäßig nicht gelesen werden.

Antwort1

Nach weiterer Untersuchung stellte ich fest, dass kernel.core_patternes überschrieben wurde durchPaketapportbeim Systemstart.

Ich hätte daran denken sollen, zu prüfen, apportals ich die Zeichenfolge „/usr/share/apport/apport“ sah. Ich war mir nicht sicher, ob dies apporttatsächlich diejenige war, die überschreibt kernel.core_pattern, also beschloss ich, einen Blick auf den Quellcode zu werfen.

Durch Ausführen apt-cache policy apporthabe ich herausgefunden, dass die von mir verwendete Version folgende war 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:~$

Dann auf apport'sLaunchPad-Seite, ich habe den Download-Link gefunden:apport_2.20.9-0ubuntu7.tar.gz.

Bei der Suche im Quellcode habe ich festgestellt, dass die Datei debian/apport.initden folgenden Inhalt hat:

do_start()
{
    ...
    ...
    echo "|$AGENT %p %s %c %d %P" > /proc/sys/kernel/core_pattern
    echo 2 > /proc/sys/fs/suid_dumpable
}

Also habe ich es dpkg -L apportauf meiner VM ausgeführt, um zu sehen, ob diese Datei vorhanden ist:

vagrant@ubuntu-bionic:~$ dpkg -L apport | grep init
/etc/init.d
/etc/init.d/apport

Es gab keine Datei mit dem genau passenden Dateinamen, aber ich beschloss, einen Blick darauf zu werfen /etc/init.d/apportund fand, dass dies die Datei war, nach der ich suchte:

do_start()
{
        ...
        ...
        echo "|$AGENT %p %s %c %d %P %E" > /proc/sys/kernel/core_pattern
        echo 2 > /proc/sys/fs/suid_dumpable
}

Ich wusste, dass es /etc/sysctl.confvom Dienst gelesen wird systemd-sysctl, daher wollte ich als Nächstes feststellen, ob es systemd-sysctlschon einmal gestartet wurde apport.

Ich habe gesucht, ob es einen entsprechenden Dienst gibt, apportund einen gefunden:

vagrant@ubuntu-bionic:~$ systemctl list-units | grep apport
apport.service                                                                      loaded active exited    LSB: automatic crash report generation

Ich habe dann ihre gegenseitige Abhängigkeit überprüft und festgestellt, dass apport.servicesie nach folgendem gestartet wird systemd-sysctl.service:

vagrant@ubuntu-bionic:~$ systemctl list-dependencies apport.service
apport.service
● ├─system.slice
● └─sysinit.target
...
●   ├─systemd-sysctl.service
...
...
vagrant@ubuntu-bionic:~$

Das heißt systemd-sysctl.servicemeine Einstellung von wird zwar korrekt eingelesen kernel.core_patternaber /etc/sysctl.confdie Einstellung wird dann sofort durch überschrieben apport.service.

Um dies zu überprüfen, habe ich zwei Zeilen hinzugefügt /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
}

Dann habe ich die VM neugestartet. Als die VM wieder hochgefahren war, stellte ich fest, dass die Datei /home/vagrant/sysctl.kernel.core_pattern.txtden folgenden Inhalt hatte:

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:~$

Meine Einstellung wurde also tatsächlich korrekt gelesen, dann aber überschrieben durch apport.

verwandte Informationen