我遇到了一些意外的自动重启并且没有剩余的 vmcore。
因此我想捕捉内核重启的发生时间以及调用此命令的人。
正如我之前所想的,当我输入一个reboot
命令时,SYSCALL_DEFINE4(reboot)
就会被调用,然后内核进入该函数kernel_restart
。
但事实是,当我使用 kprobe 来跟踪kernel_restart
并输入时reboot
,什么都没有捕获到 ---- 我已经在其他一些内核函数上进行了测试,例如do_sys_open
和ksys_umount
,它们都工作正常,所以至少我对 kprobe 的使用没有错。
现在我想知道内核中是否还有其他方法可以调用重启?
很好,我想我找到答案了。
似乎当我输入 a 时
reboot
,它会发送信号首先杀死所有其他进程,甚至是 rsyslogd 和 systemd-journald,所以这就是为什么我无法在 journalctl 消息中找到任何记录。我使用 kprobe 来跟踪
__do_sys_open
(应该是重启的系统调用)并在调用时添加一个 panic,现在我可以看到在 下的 vmcore-dmesg 中调用了一个 rebbot/var/crash
。不幸的是,即使我使用 shell 脚本调用 reboot,vmcore-dmesg 中的进程始终存在
reboot
,并且在 vmcore 中找不到其他线程。但至少现在我知道这
__do_sys_reboot
是内核执行重启的方式。