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

Вопрос или проблема

У меня есть драйвер для моего ELM 327, и он использует модуль pl2303, который зависит от usbserial, а это, в свою очередь, зависит от модуля pl2303.

Что я пробовал:

sudo modprobe -r usbserial pl2303
sudo modprobe -r pl2303 usbserial
sudo modprobe -rf usbserial
sudo modprobe -rf pl2303
sudo rmmod --force pl2303
sudo rmmod --force usbserial

результат rmmod:

rmmod: ERROR: ../libkmod/libkmod-module.c:799 kmod_module_remove_module() не удалось удалить 'usbserial': Ресурс временно недоступен
rmmod: ERROR: не удалось удалить модуль usbserial: Ресурс временно недоступен

результат modprobe:

modprobe: FATAL: Модуль usbserial используется.

Также я пробовал это при загруженных и выгруженных драйверах.

ссылки модулей ядра друг на друга[1]

ОС: Ubuntu 20.04

Можно занести модули ядра в черный список.

Посмотрите этот пост о Как занести модули ядра в черный список?

Когда вы смотрите в dmesg, вы видите строку, в которой устройство было обнаружено, когда оно было подключено? Ubuntu должен поддерживать FTDI из коробки. Обычно вы просто обращаетесь к нему, набрав screen /dev/ttyUSB# 38400.

Ответ или решение

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

Если вы столкнулись с проблемой выгрузки модуля ядра в Linux, который находится в использовании и имеет рекурсивные зависимости, как в вашем случае с модулями pl2303 и usbserial, необходимо следовать определённым шагам, чтобы корректно решить проблему.

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

Вы упомянули, что драйвер для вашего ELM 327 использует модуль pl2303, который зависит от usbserial, а usbserial в свою очередь зависит от pl2303. Эта циклическая зависимость делает невозможным простую выгрузку модулей с помощью стандартных средств, так как ядро не может определить, кто из модулей «владеет» ресурсами.

Шаги для решения

Ниже приведены шаги, которые помогут вам корректно выгрузить модули, даже если они взаимозависимы:

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

    lsmod | grep pl2303
    lsmod | grep usbserial
    lsof /dev/ttyUSB*
  2. Завершите работающие процессы:
    Если какие-то процессы используют модули, завершите их. Например, вы можете завершить их с помощью команды kill или pkill. Убедитесь, что вы завершили терминальные сессии, которые могут использовать ваше устройство.

  3. Пробуйте поэтапную выгрузку модулей:

    • Используйте команду modprobe для выгрузки зависимых модулей по отдельности, начиная с самого нижнего уровня:
      sudo modprobe -r pl2303
      sudo modprobe -r usbserial

      Если эти команды вызывают ошибки из-за зависимостей, переходите к следующему шагу.

  4. Используйте rmmod с флагом --force:
    Если вышеприведённые команды не сработали, попробуйте принудительно выгрузить модули, но будьте осторожны, так как это может повредить другие аспекты системы:

    sudo rmmod --force pl2303
    sudo rmmod --force usbserial
  5. Перезагрузите систему:
    Если все вышеперечисленные шаги не сработали, самым простым решением может быть перезагрузка системы. Это освободит все ресурсы, и модули будут выгружены при загрузке.

Дополнительные рекомендации

  1. Проверка загрузки модулей при старте: Если проблема продолжает возникать, рассмотрите возможность временного исключения модулей из автоматической загрузки. Это можно сделать, добавив их в файл /etc/modprobe.d/blacklist.conf, добавив строки вроде:

    blacklist pl2303
    blacklist usbserial
  2. Использование dmesg: Чтобы получить более подробную информацию о загрузке и выгрузке модулей, просмотрите вывод команды dmesg:

    dmesg | grep pl2303
    dmesg | grep usbserial

    Это может предоставить вам подсказки о том, из-за каких именно процессов или ошибок модули не могут быть выгружены.

  3. Обновление системы: Убедитесь, что ваша система и ядро имеют последние обновления. Возможно, в более новой версии имеется исправление для проблемы с зависимостями.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...