有没有办法确定哪个进程正在重新启动服务器?

cat*_*nts 6 linux kvm qemu reboot libvirt

我有一个 kvm 虚拟机,它似乎会随机重新启动。我在 syslog 中没有看到任何有关重新启动、关闭、错误、核心转储、恐慌等的信息。主机上的 libvirtd 日志中也没有错误,qemu 日志中也没有错误,主机上也没有任何错误。

似乎某个随机进程可能正在调用虚拟机内的重新启动系统调用?我能想到的就只有这些了...

我如何确定是什么原因造成的?操作系统是Debian。

LSe*_*rni 3

如果您不介意接触 C 代码,那么您可以编写一个简单的内核模块来拦截重新启动/关闭调用并通过printk().

这个答案可能是一个好的开始。要了解谁在调用您修改后的处理程序,请查看这个

测试代码

我尝试开发上面的提示,并提出了以下代码。

在我自己的家庭系统(Ubuntu 22.04-LTS)上,它确实进行了编译并安装了内核模块,并且似乎可以使用一些符号:例如__do_sys_swapon

Dec 15 22:38:51 mintaka kernel: [82534.879652] __do_sys_swapon called by PID 5381 (swapon)
Run Code Online (Sandbox Code Playgroud)

但是 中似乎有几个类似重新启动的调用/proc/kallsyms,所以恐怕您需要几个 kprobe,或者需要相当多的试验和错误。如果我从提示符中__do_sys_reboot调用,似乎不会被记录。reboot

Dec 15 22:38:51 mintaka kernel: [82534.879652] __do_sys_swapon called by PID 5381 (swapon)
Run Code Online (Sandbox Code Playgroud)

生成文件

# vim: tabstop=4 sw=4 noexpandtab
obj-m += mymodule.o
PWD := $(CURDIR)

all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Run Code Online (Sandbox Code Playgroud)

要编译,只需运行“ make”。