Вопрос или проблема
У меня есть драйвер для моего 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 используется.
Также я пробовал это при загруженных и выгруженных драйверах.
ОС: Ubuntu 20.04
Можно занести модули ядра в черный список.
Посмотрите этот пост о Как занести модули ядра в черный список?
Когда вы смотрите в dmesg, вы видите строку, в которой устройство было обнаружено, когда оно было подключено? Ubuntu должен поддерживать FTDI из коробки. Обычно вы просто обращаетесь к нему, набрав screen /dev/ttyUSB# 38400.
Ответ или решение
Как выгрузить модуль ядра, который используется и имеет рекурсивную зависимость модулей
Если вы столкнулись с проблемой выгрузки модуля ядра в Linux, который находится в использовании и имеет рекурсивные зависимости, как в вашем случае с модулями pl2303
и usbserial
, необходимо следовать определённым шагам, чтобы корректно решить проблему.
Понимание проблемы
Вы упомянули, что драйвер для вашего ELM 327 использует модуль pl2303
, который зависит от usbserial
, а usbserial
в свою очередь зависит от pl2303
. Эта циклическая зависимость делает невозможным простую выгрузку модулей с помощью стандартных средств, так как ядро не может определить, кто из модулей «владеет» ресурсами.
Шаги для решения
Ниже приведены шаги, которые помогут вам корректно выгрузить модули, даже если они взаимозависимы:
-
Проверьте активные процессы:
Сперва убедитесь, что ни один из модулей не используется другими процессами. Используйте коммандуlsmod
для получения списка загруженных модулей иlsof
для проверки процессов, использующих конкретные устройства:lsmod | grep pl2303 lsmod | grep usbserial lsof /dev/ttyUSB*
-
Завершите работающие процессы:
Если какие-то процессы используют модули, завершите их. Например, вы можете завершить их с помощью командыkill
илиpkill
. Убедитесь, что вы завершили терминальные сессии, которые могут использовать ваше устройство. -
Пробуйте поэтапную выгрузку модулей:
- Используйте команду
modprobe
для выгрузки зависимых модулей по отдельности, начиная с самого нижнего уровня:sudo modprobe -r pl2303 sudo modprobe -r usbserial
Если эти команды вызывают ошибки из-за зависимостей, переходите к следующему шагу.
- Используйте команду
-
Используйте
rmmod
с флагом--force
:
Если вышеприведённые команды не сработали, попробуйте принудительно выгрузить модули, но будьте осторожны, так как это может повредить другие аспекты системы:sudo rmmod --force pl2303 sudo rmmod --force usbserial
-
Перезагрузите систему:
Если все вышеперечисленные шаги не сработали, самым простым решением может быть перезагрузка системы. Это освободит все ресурсы, и модули будут выгружены при загрузке.
Дополнительные рекомендации
-
Проверка загрузки модулей при старте: Если проблема продолжает возникать, рассмотрите возможность временного исключения модулей из автоматической загрузки. Это можно сделать, добавив их в файл
/etc/modprobe.d/blacklist.conf
, добавив строки вроде:blacklist pl2303 blacklist usbserial
-
Использование dmesg: Чтобы получить более подробную информацию о загрузке и выгрузке модулей, просмотрите вывод команды
dmesg
:dmesg | grep pl2303 dmesg | grep usbserial
Это может предоставить вам подсказки о том, из-за каких именно процессов или ошибок модули не могут быть выгружены.
-
Обновление системы: Убедитесь, что ваша система и ядро имеют последние обновления. Возможно, в более новой версии имеется исправление для проблемы с зависимостями.
Заключение
Выгрузка модулей с взаимозависимостями может вызвать сложности, но следование указанным шагам должно помочь вам решить проблему. Не забывайте следить за активными процессами, использовать команду dmesg
для диагностики и при необходимости исключать модули из автоматической загрузки.