Как удалить отказавший модуль ядра

#linux-kernel

#linux-ядро

Вопрос:

Эта ситуация всегда меня беспокоит:

Я написал модуль ядра, и иногда в нем есть ошибка (разыменование нулевого указателя). После того, как я изменил hello.ko, он показывает некоторые ошибки ядра. Затем я изменяю код и пытаюсь удалить модуль и установить его снова. Вопрос в том, что я не знаю, как удалить модуль ядра.

$ rmmod привет

ОШИБКА: используется модуль hello

$ rmmod -f привет

ОШИБКА: удаление привет: устройство или ресурс заняты

Я всегда перезагружаю компьютер, чтобы удалить модуль, что занимает слишком много времени. У кого-нибудь есть лучшее решение для этого? Спасибо за любые входные данные.

Ответ №1:

Используйте виртуальную машину.

Как только вы совершаете разыменование NULL или другую подобную ошибку, вы переводите ядро в неизвестное состояние. Даже если вам удалось удалить модуль (что вряд ли возможно; сбой ядра убивает вызывающий поток, поэтому у него никогда не будет возможности уменьшить количество ссылок — модуль никогда не будет удален), все равно может остаться повреждение, и ваш новый, «исправленный»модуль с такой же вероятностью может быть в беде.

Гораздо лучше просто использовать виртуальную машину с быстрой перезагрузкой — возможно, с моментальным снимком, чтобы сделать восстановление еще быстрее.

Ответ №2:

Как указал bdonlan, вам было бы лучше с виртуальной машиной.

Однако, если вы действительно хотите сделать это по-своему, вы должны:

  1. убедитесь, что в вашей конфигурации ядра включена функция CONFIG_MODULE_FORCE_UNLOAD
  2. напишите другой модуль, который устанавливает refcount поврежденного модуля равным нулю. Проверьте delete_module системный вызов в kernel/module.c

Ответ №3:

Количество ссылок или значение в столбце Used by (см. lsmod ) для моего случая было равно -1. Это значение также можно найти по адресу /sys/module/<kernel_module>/refcnt .

Вот ответ, который я нашел, который сработал для меня здесь: https://askubuntu.com/a/521231

echo -e "blacklist kernel_modulen" | sudo tee -a /etc/modprobe.d/blacklist.conf

Затем вам нужно перезагрузить компьютер. Повторно скомпилируйте чистую стабильную версию вашего модуля. Затем введите следующую команду, чтобы перезагрузить и перезаписать сбойный модуль.

insmod kernel_module.ko

Сначала,

rmmod kernel_module