Вопрос или проблема
Мне сложно автоматизировать загрузку модуля гаджета и включение устройства usb0 как сетевого интерфейса eth. Интерфейс, о котором идет речь, это g_ether для встроенного устройства Linux и подключения к ПК.
Я предполагаю, что существует способ увидеть событие от плагина и выполнить скрипт с помощью udev. Когда я подключаю свое устройство к ПК, я не вижу никаких событий. Я пробовал различные варианты udevadm monitor, и я не уверен, как определить, что я могу использовать в качестве правила udev для загрузки модуля гаджета через modprobe.
Частично я пытаюсь загрузить модуль otg, потому что мы в основном используем g_ether. Я хочу использовать avahi-autoipd, но он получает IP-адрес до того, как устройство подключено. Если я использую allow-hotplug в сетевом интерфейсе, он никогда автоматически не поднимает интерфейс при подключении. Так теоретически я хочу подключить устройство к ПК, запустить avahi-autoipd на новом сетевом интерфейсе, чтобы получить IP, и dhcpd, чтобы выдать его хосту.
Поскольку кто-то еще начал помогать мне на StackOverflow (перепост здесь), я получил больше информации.
/sys/bus/usb/devices$ ls
1-0:1.0 2-0:1.0 3-0:1.0 3-1 3-1:1.0 usb1 usb2 usb3
[ 4297.515400] g_ether gadget: high speed config #2: RNDIS
[ 4300.379021] g_ether gadget: high speed config #1: CDC Ethernet (ECM)
sys/bus/usb/devices$ ls
1-0:1.0 2-0:1.0 3-0:1.0 3-1 3-1:1.0 usb1 usb2 usb3
Я попробовал запустить
udevadm monitor --environment
udevadm monitor --environment --udev
udevadm monitor
udevadm monitor --kernel
udevadm monitor --kernel --udev
отключение и подключение устройства не показывает ничего. В manpage сказано, что он “слушает ядровые uevents и события, отправленные правилом udev”, и у меня нет правил на моем устройстве. Так что я предполагаю, это, вероятно, причина, почему ничего никогда не выводится, даже если я пытаюсь что-то сделать с другим оборудованием?
Я запускаю встроенную дистрибуцию Linux. Я предполагаю, что у меня может не быть всего того, что есть на настольном компьютере?
Мне стало известно, что может быть проблема с моим модулем g_ether? Эти выводы никогда не меняются.
cat /sys/class/net/usb0/carrier
cat: ошибка чтения: Неверный аргумент
cat /sys/class/net/usb0/operstate
down
Специфические для USB переменные для uevent установлены в функции ядра usb_uevent
. Вы можете отслеживать вызывается эта функция или нет.
Ответ или решение
Вопрос о создании udev-правил для автоматической загрузки модуля gadget и поднятия интерфейса usb0 в качестве сетевого интерфейса является интересной задачей в контексте встроенных систем на базе Linux. Давайте подробно рассмотрим, как это можно реализовать, учитывая все нюансы и потенциальные трудности.
Теоретические основы
Во-первых, стоит понять, как работает udev в Linux. Udev — это система управляющая устройствами для ядра Linux, которая создает и удаляет устройства в директории /dev
. Она отвечает за запуск определенных действий при появлении или исчезновении устройств, основываясь на uevent (событиях ядра) и правилах, определенных в системных конфигурациях.
Когда устройство подключается к системе, ядро генерирует uevent, который обычно обнаруживается udev. На основе этого uevent можно настроить правило, которое будет выполнять необходимые действия, такие как загрузка модуля ядра с помощью modprobe
.
Пример и реализация
В вашем случае, задача состоит в том, чтобы определить, когда устройство с интерфейсом g_ether подключается, и установить его как сетевой интерфейс. Чтобы добиться этого, выполните следующие шаги:
-
Определение uevent-события:
Включите мониторинг событий ядра с помощью
udevadm monitor
для изучения того, какие uevent генерируются при подключении вашего устройства:udevadm monitor --kernel --udev --property
Выполните подключение и отключение вашего USB-устройства и наблюдайте за выводом. Вы должны увидеть uevent-события, которые связаны с вашим устройством USB. Если вы не видите события, возможно, проблема кроется в конфигурации вашей встроенной системы или в отсутствии поддержки данного USB-модуля в ядре.
-
Создание udev-правила:
Чтобы автоматизировать загрузку модуля, создайте файл в
/etc/udev/rules.d/
. Например,99-usb-gadget.rules
со следующим содержимым. Обратите внимание, что вам нужно заменитьATTRS{idVendor}
иATTRS{idProduct}
на реальные значения вашего устройства. Их можно найти в выводе предыдущего шага:ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="xxxx", ATTR{idProduct}=="yyyy", RUN+="/sbin/modprobe g_ether"
В этом правиле мы указываем, что должна происходить загрузка модуля
g_ether
при добавлении устройства с заданными идентификаторами производителей и продуктов. -
Загрузка модуля ядра и поднятие интерфейса:
После срабатывания правила и загрузки модуля
g_ether
, система должна автоматически определить usb0 как сетевой интерфейс. Вы можете добавить дополнительные правила для автоматической настройки интерфейса, например, используяifconfig
илиip
для присвоения IP-адреса. -
Настройка службы:
Для автоматизации процесса получения IP-адреса и его предоставления используйте демон Avahi и dhcpd. Убедитесь, что Avahi установлен и правильно настроен для работы с интерфесом usb0.
-
Проверка и отладка:
Проверьте содержимое
/sys/class/net/usb0/
для диагностики проблем. Командыcat /sys/class/net/usb0/carrier
иcat /sys/class/net/usb0/operstate
могут помочь выявить, активен ли интерфейс.
Применение
Эти шаги помогут вам добиться автоматизации загрузки и конфигурации USB-гаджета на встроенном устройстве Linux. Важно провести тщательное тестирование в вашем конкретном окружении, так как встроенные системы могут иметь ограничения в зависимости от ядра и аппаратного обеспечения.
Если отладка все еще не помогает выявить проблему, проверьте наличие необходимых модулей ядра и поддержку USB на уровне аппаратного обеспечения вашего устройства. Возможна ситуация, когда конкретная аппаратная платформа не имеет полной поддержки необходимых функций в текущем ядре.
Эти подходы и примеры должны предоставить достаточно информации для успешной реализации автоматизации загрузки модуля гаджета и настройки сети, однако, они могут потребовать адаптации под специфические условия вашей системы.