如果您不介意接触 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”。