在我的系统(Debian 11)上,在部分中/etc/systemd/system.conf
有一个DumpCore
选项(布尔值)[Manager]
:
$ cat /etc/systemd/system.conf
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See systemd-system.conf(5) for details.
[Manager]
#LogLevel=info
#LogTarget=journal-or-kmsg
#LogColor=yes
#LogLocation=no
#LogTime=no
#DumpCore=yes
...
我在 systemd 手册页中找不到有关此选项的任何文档:
- https://manpages.debian.org/bullseye/systemd/systemd-system.conf.5.en.html
- https://manpages.debian.org/bullseye/systemd-coredump/systemd-coredump.8.en.html
- https://manpages.debian.org/bullseye/systemd-coredump/coredumpctl.1.en.html
这个选项起什么作用?
答案1
此选项控制 systemd 的“崩溃处理程序”的行为,即 SIGSEGV 和相关信号的处理程序,如果由于某种原因崩溃,通常会导致 PID 1(init 进程)的核心转储。
由于 systemd 以 PID 1 运行,因此它希望避免在崩溃的情况下立即退出 - 每当 init 进程退出时,内核都会立即 panic(),这会使进一步的调试变得有点困难。因此,它为所有常见的“崩溃”信号(SIGSEGV、SIGILL、SIGFPE、SIGBUS、SIGQUIT 和 SIGABRT)安装了自定义信号处理程序。
此处理程序位于src/core/main.c:崩溃(),将分叉并手动在牺牲的“子”进程中触发核心转储,而主进程永久暂停操作而不是死亡,以便系统的其余部分保持运行,并且您仍然可以将调试器附加到它。
(相比之下,旧的 Linux ‘sysvinit’做同样的事情。)
此处的选项DumpCore=
仅控制崩溃处理程序是否实际尝试创建核心转储。在某些情况下,可能需要禁用它,例如,如果正在调查的问题也影响 systemd-coredump 子系统,或者如果它是嵌入式系统,而该系统没有任何地方可以存储转储。
因为这是一个 systemd“管理器”选项,它定义是否应该发起,它与 systemd-coredump 处理程序无关,后者只会收到垃圾场。
该选项实际上在systemd-system.conf(5)手册页:
日志颜色=、日志级别=、日志位置=、日志目标=、日志时间=、DumpCore=是, CrashChangeVT=否、CrashShell=否、CrashReboot=否、ShowStatus=是、 DefaultStandardOutput=日志,DefaultStandardError=继承 配置基本管理器操作的各种参数。这些选项 可能会被相应的进程覆盖,并且内核命令行参数。 看systemd(1)了解详情。
链接的手册页记录了它内核命令行部分:
systemd.dump_core 接受布尔参数,或启用选项(如果未指定) 参数。如果启用,systemd 管理器 (PID 1) 在以下情况下会转储核心: 崩溃。否则,不会创建核心转储。默认为启用。