Я писал простой драйвер символьного устройства. Была проблема в функции очистки, cdev_del вызывалась до device_destroy. Это значит, что я удалил структуру cdev перед удалением класса.
После удаления модуля с помощью rmmod я попытался вставить его снова, но получил следующую ошибку:
sysfs: cannot create duplicate filename ‘/devices/virtual/pcd_class
Я не могу вставить модуль из-за вышеуказанной ошибки, и я не могу выполнить rmmod модуля, потому что rmmod: ERROR: Module pcd_n is not currently loaded. Таким образом, класс pcd завис, и я не могу ни вставить модуль, ни удалить класс.
Я пытался удалить папку pcd_class с привилегиями пользователя и root:
операция не разрешена
Несмотря на то, что root является владельцем каталога pcd_class.
Я знаю, что могу перезагрузить, но как я могу исправить это, не перезагружая компьютер?
Ответ или решение
Для решения вашей проблемы, связанной с ошибкой при удалении класса устройств после неудачного выполнения модуля ядра, важно учитывать, как Linux управляет устройствами и модулями ядра посредством файловой системы sysfs. Знакомство с важными аспектами sysfs и управлением модулями через командную строку позволит разобраться в текущей ситуации и исправить ее без перезагрузки системы. Далее мы рассмотрим эту проблему с теоретической и практической стороны, подкрепим примерами и обратим внимание на применение в вашем случае.
Теоретический аспект
- Sysfs и файловая структура устройств:
Sysfs — это виртуальная файловая система в Linux, которая предоставляет информацию о различных подсистемах, устройствам и драйверам. Устройства, как ваш pcd_class, представлены в этом файловом пространстве как каталоги. Конфликты имен и невозможность удалить объект могут возникнуть, если объекты не были корректно очищены в коде драйвера. - Модули ядра и управление ими:
Модули ядра могут быть загружены и выгружены при помощи команд insmod и rmmod. Ошибка в функции очистки, где cdev_del вызывается до device_destroy, приводит к ситуации, когда ресурс остается «заблокированным» в системе даже после удаления модуля, что и вызывает ошибку создания дублирующего имени при повторной попытке вставки.
Пример и разбор
При неправильной последовательности вызовов функций освобождения ресурсов, как в вашем случае, система может подумать, что ресурс все еще используется, оставляя «следы» в sysfs. Ошибка sysfs: cannot create duplicate filename ‘/devices/virtual/pcd_class указывает на то, что каталог или объект с таким именем уже присутствуют в /sys/devices/virtual и не были корректно удалены.
Применение и решение проблемы
Чтобы решить эту проблему, следуйте следующему алгоритму:
- Проверка загруженных модулей:
Убедитесь, что модуль действительно не загружен, используя команду lsmod. Если по каким-то причинам модуль все еще отображается, попробуйте его выгрузить.lsmod | grep pcd_n
- Очистка устройства через sysfs:
Найдите ID процесса или ресурс, связанный с неочищенным объектом, при помощи fuser или lsof:lsof | grep /sys/devices/virtual/pcd_class
Это может указать на процессы, которые удерживают ресурс активным.
- Использование udevadm для пересоздания udev-правил:
udevadm можно использовать для управления событиями ядра, проверьте, не осталось ли задействованных правил. Если необходимо, пересоздайте правила:sudo udevadm control —reload-rules
- Очистка sysfs вручную:
Если процессы были завершены или вы не обнаружили их, можно попробовать удалить следы вручную, подходя к этому с большой осторожностью. - Использование rmmod с зависимыми модулями:
Попробуйте принудительно выгрузить все связанные модули, если они используют данный ресурс.sudo rmmod -f pcd_n
- Перезапуск служб Udev/systemd:
В некоторых случаях, если проблема связана больше с системными службами, перезапуск udev или даже служб, работающих с модулями, может помочь в освобождении ресурсов:sudo systemctl restart udev.service
- Отключение блокировок sysfs:
Если вышеописанные методы не помогли, и остается блокировка, попробуйте создать и установить аналогичный модуль с исправленной функцией очистки, который подключится и поможет устранить проблему.
Постарайтесь по возможности использовать подход перехвата ошибок внутри вашего модуля, чтобы предотвратить такую ситуацию в будущем. Всегда проверяйте последовательность вызовов функций освобождения и переподключения ресурсов, чтобы минимизировать риски ошибок в файловой системе sysfs.