QEMU -no-reboot
+ CLI del kernel kernel.panic=-1
qemu-system-X -no-reboot
Opzione QEMU CLI:fa uscire QEMU quando il guest prova a riavviarsikernel.panic=-1
parametro di avvio del kernel:fa in modo che Linux tenti di riavviarsi immediatamente dopo un errore:https://github.com/torvalds/linux/blob/v4.17/Documentation/admin-guide/kernel-parameters.txt#L2931
Restituisce anche 0
come pvpanic
, ma presenta i seguenti vantaggi:
- non è necessario ricompilare nulla, solo un parametro di avvio
- funziona su arm e aarch64
-M virt
così come x86, mentre pvpanic sembra specifico per x86 poiché è sottoarch/x86
Testato con questa configurazione.
Traccia l'panic
simbolo con GDB
Un altro modo per farlo potrebbe essere quello di rilevare quando l'indirizzo del panic
viene raggiunta la funzione, quindi provare a far uscire QEMU.
Puoi sicuramente rompere GDB su panic
come spiegato su:https://stackoverflow.com/questions/11408041/how-to-debug-the-linux-kernel-with-gdb-and-qemu/33203642#33203642
Ma poi TODO:come far uscire QEMU con stato 1? Usando monitor quit
, dall'interno di GDB, che inoltra quit
al monitor QEMU da GDB, si avvicina molto, ma non del tutto poiché non esce con lo stato 0
.
gem5 esegue questo monitoraggio per impostazione predefinita in modo nativo, il che è davvero fantastico.
Questo accade su:https://github.com/gem5/gem5/blob/1da285dfcc31b904afc27e440544d006aae25b38/src/arch/arm/linux/system.cc#L73
Forse gli sviluppatori di QEMU possono trarre ispirazione da questa tecnica e implementare qualcosa di simile.
Ho qualcosa che funziona:
- Configura (e compila) il kernel con
CONFIG_PVPANIC=y
; questo produce un kernel con supporto compilato perpvpanic
dispositivo. - Richiama
qemu-system-x86_64
con il-device pvpanic
opzione; questo indica a Qemu di catturare (e uscire) da un kernel panic.
Un kernel panic causa qemu-system-x86_64
per uscire correttamente (restituire lo stato 0
), ma almeno non si blocca più.
Mille grazie a @dsstorefile1 per avermi indicato la giusta direzione.
Riferimenti:
- https://cateee.net/lkddb/web-lkddb/PVPANIC.html
- https://github.com/qemu/qemu/blob/master/docs/specs/pvpanic.txt