2011-10-05 13 views
16

Questa situazione sempre mi dà fastidio:Come rimuovere un modulo del kernel fallito

ho scritto un modulo del kernel, e qualche volta ha un bug (dereference un puntatore NULL). Dopo aver insmod hello.ko, mostra alcuni errori del kernel. Quindi cambio il codice e provo a rimuovere il modulo e installarlo di nuovo. La domanda è: non so come rimuovere il modulo del kernel.

$ rmmod hello

ERROR: module hello in use

$ rmmod -f hello

ERROR: removing hello: device or resource busy

Riavvio sempre la macchina per rimuovere il modulo, che richiede troppo tempo. Qualcuno ha una soluzione migliore per questo? Grazie per qualsiasi input.

risposta

10

Utilizzare una macchina virtuale.

Una volta effettuato un dereferimento NULL o un altro errore simile, il kernel è stato messo in uno stato sconosciuto. Anche se si è riusciti a rimuovere il modulo (il che è improbabile che sia possibile: un OOPS del kernel uccide il thread chiamante, quindi non avrà mai la possibilità di ridurre il conteggio dei riferimenti - il modulo non sarà mai rimovibile) potrebbe esserci ancora la corruzione è rimasta indietro e il tuo nuovo modulo "fisso" ha le stesse probabilità di essere nei guai.

Molto meglio usare semplicemente una macchina virtuale di riavvio rapido, magari con un'istantanea, per rendere il ripristino ancora più veloce.

2

Come ha sottolineato Bdonlan, sarebbe meglio con una macchina virtuale.

Tuttavia, se si davvero vuole fare a modo tuo, devi:

  1. controllo che il vostro configurazione del kernel ha CONFIG_MODULE_FORCE_UNLOAD abilitato
  2. scrivere un altro modulo che imposta il refcount del modulo rotto a zero. Controlla la chiamata di sistema delete_modulekernel/module.c
Problemi correlati