Não é possível remover ou reinserir o módulo do kernel após erro ao inseri-lo sem reinicializar

5

Estou aprendendo a criar módulos do kernel e estava tudo funcionando bem: eu compilei, inseri as mensagens .ko with sudo insmod cheat.ko e printk dentro da função init (definida por module_init ) apareceu corretamente em código%. Em seguida, fiz alterações no módulo, removi-o com /etc/log/syslog , reinseri e sudo rmmod cheat.ko mensagens foram boas novamente.

Então, quando eu tentei um novo recurso, a tela se tornou como um tty, mensagens de erro em todo, eu fiz ctrl-alt-f2 ctrl-alt-f7 (eu estou no Ubuntu), e eu voltei para o X servidor.

Eu desfiz as modificações mais recentes no arquivo de origem, recompilou, mas o problema agora é que não consigo reinserir o módulo para testar as coisas novamente, a menos que eu reinicie, o que é muito irritante para testes.

Como posso reinserir o módulo modificado sem reiniciar?

O que eu tentei e recebi info:

  • printk : a única informação relevante para mim foi:

    BUG: unable to handle kernel NULL pointer dereference at 00000003
    

    então parece que foi a causa do problema, e então eu tive um oops:

    Oops: 0002 [#1] SMP
    

    Informações de depuração horríveis seguem isso, mas nada que me ajude a reinserir o módulo.

  • cat /etc/log/syslog : o comando apenas trava, não gera nada, e a única maneira de usar o emulador de terminal é eliminá-lo com sudo insmod cheat.ko

  • c-c :

    Error: Module cheat is not currently loaded
    
  • sudo rmmod cheat

    FATAL: Module cheat.ko not found.
    
  • sudo modprobe -r cheat.ko :

    cheat                  19009  -2
    

    que tem uma contagem de uso lsmod | grep cheat muito suspeita ...

  • -2

    cheat 19009 1 - Loading 0x00000000 (OF+)
    

    interessante, então o módulo ainda está carregando ...

Editar

Como outros já disseram, use uma VM. E eu recomendo strongmente que você use o Vagrant para gerenciá-lo.

Editar 2

Nah, o Vagrant é para newbs, use o QEMU + Buildroot: link

    

1 resposta

3

O kernel do Linux só está disposto a descarregar módulos se a função module_exit retornar com sucesso. Se alguma função do módulo falhar, o kernel poderá recuperar, mas o módulo ficará bloqueado na memória. Pode ser possível vasculhar as estruturas de dados do kernel e forçar a marcação do módulo como descarregável (tente corrigir a função module_exit para não fazer nada), mas isso é arriscado. Sua melhor aposta é reiniciar.

A maneira normal de testar um módulo do kernel é em uma máquina virtual. Não teste o módulo em sua máquina de desenvolvimento. Uma VM tem a vantagem sobre uma máquina física de salvar o estado da VM em uma configuração pronta para teste e restaurá-la quantas vezes quiser, o que economiza o tempo de inicialização entre os testes.

    
por 11.06.2013 / 02:11