Me deparei com uma reinicialização automática inesperada e não havia mais nenhum vmcore.
Então eu quero saber quando uma reinicialização do kernel acontece e quem chama isso.
Como pensei antes, quando eu insiro um reboot
comando, o SYSCALL_DEFINE4(reboot)
será invocado e então o kernel entra na função kernel_restart
.
Mas o fato é que, quando usei o kprobe para rastrear kernel_restart
e digitei reboot
, nada foi detectado ---- Eu já testei em outras funções do kernel, como do_sys_open
e, ksys_umount
e todas funcionaram bem, então pelo menos meu uso do kprobe não está errado.
Agora eu me pergunto se existe alguma outra maneira no kernel de chamar uma reinicialização?
Tudo bem, acho que encontrei a resposta.
Parece que quando eu entro em um
reboot
, ele envia um sinal para matar todos os outros processos primeiro, até mesmo o rsyslogd e o systemd-journald, e é por isso que não consigo encontrar nenhum registro na mensagem journalctl.Eu uso o kprobe para rastrear
__do_sys_open
(que deve ser a chamada de sistema da reinicialização) e adiciono um pânico na invocação, e agora posso ver que um rebbot é chamado em vmcore-dmesg em/var/crash
.Infelizmente, o processo em vmcore-dmesg é sempre
reboot
igual ao que usei em scripts de shell para chamar a reinicialização, e nenhuma outra thread pode ser encontrada no vmcore.Mas pelo menos agora eu sei que
__do_sys_reboot
é assim que o kernel executa uma reinicialização.