Как удалить сбойный модуль ядра
Эта ситуация меня всегда беспокоит:
Я написал модуль ядра, и иногда он имеет ошибку (разыменовывает указатель NULL). После того, как я включил hello.ko, он показывает некоторые ошибки ядра.
Затем я меняю код и пытаюсь удалить модуль и снова установить его.
Вопрос в том, что я не знаю, как удалить модуль ядра.
$rmmod hello
ОШИБКА: используется модуль hello
$rmmod -f hello
ОШИБКА: удаление приветствия: занятость устройства или ресурса
Я всегда перезагружаю машину, чтобы удалить модуль, который занимает слишком много времени. У кого-нибудь есть лучшее решение для этого? Спасибо за любые входы.
Ответы
Ответ 1
Используйте виртуальную машину.
Как только вы сделаете NULL разыменование или другую такую ошибку, вы поместили ядро в неизвестное состояние. Даже если вам удастся удалить модуль (что вряд ли возможно, ядро OOPS убивает вызывающий поток, поэтому у него никогда не будет возможности уменьшить счетчик ссылок - модуль никогда не будет съемным), все равно может быть коррупция осталась позади, и ваш новый, "фиксированный" модуль так же вероятно будет в беде.
Гораздо лучше просто использовать виртуальную машину с быстрой перезагрузкой - возможно, с моментальным снимком, чтобы сделать восстановление еще быстрее.
Ответ 2
Как отметил bdonlan, вам будет лучше с виртуальной машиной.
Однако, если вы действительно хотите сделать это по-своему, вам нужно:
- убедитесь, что в конфигурации вашего ядра включен CONFIG_MODULE_FORCE_UNLOAD
- напишите еще один модуль, который устанавливает refcount сломанного модуля в ноль. Проверьте системный вызов
delete_module
в kernel/module.c