Вообщем после сегфолта модуля, при его загрузки через insmod MODULE,
он застревает в системе, что то его юзает, и вытащить его не получается даже через
rmmod -f MODULE
вот что ещё есть:
# rmmod -f netfw
ERROR: Removing 'netfw': Device or resource busy
# rmmod netfw
ERROR: Module netfw is in use
# lsmod | grep netfw
netfw 5632 1
Что можно сделать в таком случае, т.е. есть ли какие то средства ядра,
проверка всех параметров не катит, так как всё не предусмотриш, а
после такого застревания приходиться ребутить тачку что не есть гуд -
оч. долго.
Заранее спасибо!!!
Те или иные компоненты ядра при использовании модуля повышают ему reference count, когда перестают использовать - уменьшают. Это и показывает lsmod. Выгрузить модуль до обнуления refcount нельзя(еще в некоторых случаях нельзя).
В 2.6, что сейчас под рукой, это делается с try_module_get и module_put.
Я сейчас просмотрел ядреный код. Как я понял, чтобы вытянуть модуль с refcount>0 нужно сделать rmmod -f, при этом ядро должно быть собрано с поддержкой CONFIG_MODULE_FORCE_UNLOAD.
Там, в общем то, 3 момента:
1) refcount
2) зависимости по другим модулям(если другие модули зависят от него)
3) unsafe флаг модуля (модуль себе может такое установить)
По пункту 2 никогда нельзя вытаскивать.
С пунктом 3 можно вытащить _только_ через -f.
При refcount=0 вытаскивается обычно, при >0 вытаскивается только если -f.
-f работает только если ядро собрано с CONFIG_MODULE_FORCE_UNLOAD.