Я разрабатываю систему на основе Debian 8 (Jessie) для встраиваемого решения, используя multiistrap для создания rootfs. Система является автономной, и к ней можно получить доступ через последовательную консоль, предназначенную для отладки, и через SSH.
У меня проблема с ModemManager в этой системе. Он устанавливается без проблем, но как только я его включил и он действительно запустился, он обычно (не всегда, но обычно) начинает заливать консоль отладки. Обычно на выходе получается бессмысленный поток символов, но иногда встречаются и различные AT-команды. Я знаю, что это наводнение вызвано ModemManager, потому что оно может прекратиться после удаления ModemManager.
Я мог бы жить с каким-то случайным лавинным потоком, но проблема в том, что это наводнение почти всегда каким-то образом делает консоль невосприимчивой и таким образом мешает мне войти в систему.Иногда, хотя и очень редко, мне удавалось войти в систему, несмотря на это наводнение, проверить IP-адрес устройства, а затем войти через SSH. Однако обычно этот вариант решения проблемы недоступен, так как я даже не могу узнать IP-адрес, присвоенный устройству DHCP-сервером.
Я обнаружил, что эта проблема связана с тем, что ModemManager сканирует модем в этом последовательном порту. Я также узнал, что есть способ решить проблему с помощью правила udev. Правило, которое должно работать, выглядит следующим образом:
ATTRS{idVendor}=="0ca6" ATTRS{idProduct}=="a050", ENV{ID_MM_DEVICE_IGNORE}="1"
Мой случай немного отличается, потому что последовательный порт является периферийным устройством ЦП, т.е. не является последовательным портом USB, поэтому я изменил правило на эту форму:
KERNEL=="ttyS0", ENV{ID_MM_DEVICE_IGNORE}="1"
udevadm теперь сообщает мне, что линия распознается и этот атрибут (или как он там называется) добавляется к атрибутам устройства.
Однако проблема еще не решена. По какой-то причине ModemManager по-прежнему переполняет консоль и делает невозможным вход в систему.
Удаление ModemManager невозможно, потому что это необходимо моему приложению.
Отвечая на свой вопрос ...
Я проверил код ModemManager и обнаружил, что ModemManager просто не проверяет правило udev, когда устройство принадлежит к подсистеме tty. Мне кажется, что единственный способ обойти эту проблему - исправить ModemManager, но это уже другая тема.
Если у вас есть файл /lib/udev/rules.d/77-mm-platform-serial-whitelist.rules
, удалите его из системы и перезагрузите (или перезагрузите + запустите правила udev ). Это уже исправлено в исходниках ModemManager.