Как удалить неисправный класс устройств через командную строку

Я писал простой драйвер символьного устройства. Была проблема в функции очистки, 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 и управлением модулями через командную строку позволит разобраться в текущей ситуации и исправить ее без перезагрузки системы. Далее мы рассмотрим эту проблему с теоретической и практической стороны, подкрепим примерами и обратим внимание на применение в вашем случае.

Теоретический аспект

  1. Sysfs и файловая структура устройств:
    Sysfs — это виртуальная файловая система в Linux, которая предоставляет информацию о различных подсистемах, устройствам и драйверам. Устройства, как ваш pcd_class, представлены в этом файловом пространстве как каталоги. Конфликты имен и невозможность удалить объект могут возникнуть, если объекты не были корректно очищены в коде драйвера.
  2. Модули ядра и управление ими:
    Модули ядра могут быть загружены и выгружены при помощи команд insmod и rmmod. Ошибка в функции очистки, где cdev_del вызывается до device_destroy, приводит к ситуации, когда ресурс остается «заблокированным» в системе даже после удаления модуля, что и вызывает ошибку создания дублирующего имени при повторной попытке вставки.

Пример и разбор

При неправильной последовательности вызовов функций освобождения ресурсов, как в вашем случае, система может подумать, что ресурс все еще используется, оставляя «следы» в sysfs. Ошибка sysfs: cannot create duplicate filename ‘/devices/virtual/pcd_class указывает на то, что каталог или объект с таким именем уже присутствуют в /sys/devices/virtual и не были корректно удалены.

Применение и решение проблемы

Чтобы решить эту проблему, следуйте следующему алгоритму:

  1. Проверка загруженных модулей:
    Убедитесь, что модуль действительно не загружен, используя команду lsmod. Если по каким-то причинам модуль все еще отображается, попробуйте его выгрузить.

    lsmod | grep pcd_n

  2. Очистка устройства через sysfs:
    Найдите ID процесса или ресурс, связанный с неочищенным объектом, при помощи fuser или lsof:

    lsof | grep /sys/devices/virtual/pcd_class

    Это может указать на процессы, которые удерживают ресурс активным.

  3. Использование udevadm для пересоздания udev-правил:
    udevadm можно использовать для управления событиями ядра, проверьте, не осталось ли задействованных правил. Если необходимо, пересоздайте правила:

    sudo udevadm control —reload-rules

  4. Очистка sysfs вручную:
    Если процессы были завершены или вы не обнаружили их, можно попробовать удалить следы вручную, подходя к этому с большой осторожностью.
  5. Использование rmmod с зависимыми модулями:
    Попробуйте принудительно выгрузить все связанные модули, если они используют данный ресурс.

    sudo rmmod -f pcd_n

  6. Перезапуск служб Udev/systemd:
    В некоторых случаях, если проблема связана больше с системными службами, перезапуск udev или даже служб, работающих с модулями, может помочь в освобождении ресурсов:

    sudo systemctl restart udev.service

  7. Отключение блокировок sysfs:
    Если вышеописанные методы не помогли, и остается блокировка, попробуйте создать и установить аналогичный модуль с исправленной функцией очистки, который подключится и поможет устранить проблему.

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

Друзья помогите этому контенту стать доступнее в социальных сетях.

Не проходи мимо жмакни по кнопке возможно кому то еще он будет полезен!