Приключения с USB Ethernet

2019-02-22

Заметка про “настройку почтовых уведомлений” появилась не просто так. Дело в том, что в данный момент я “работаю над новым кластером” (если что, то старый тут), ну и попутно пытаюсь фиксировать то, что вылупляется в процессе длительной настройки и/или разработки. Так что тут будут появляться путевые заметки, которые так или иначе связаны с текущими проектами, и да, они скорее для себя, хотя если кому-то пригодится — буду только рад.

В этот раз заметка про ну очень странный USB Ethernet адаптер, который пришлось довольно долго и мучительно приручать.
Всё началось с покупки, я повёлся на цену в 120 российских рублей на Aliexpress. USB Ethernet вообще вещь полезная в хозяйстве, особенно во времена сверхтонких ноутбуков, планшетов и прочей античеловечной хуйни.
“Жаба” — вещь полезная, поэтому адаптеров было заказано целых два. Как выяснилось позднее — не зря. Оба адаптера имели одинаковый MAC-адрес.

Для тех, кто вдруг не в курсе. MAC-адрес — это уникальный идентификатор, который присваевается сетевому устройству. В теории, двух одинаковых MAC-адресов быть не может. И да, два устройства в одной сети с одинаковым MAC работать не будут. Однако, китайским детям, работающим в подвале за миску риса, видимо похуй.

Вторая неприятность — заявленные 100 мегабит превратились в 6. То есть устройство не могло прокачать через себя больше, чем 6 мегабит.
Эта проблема меня волнует не особо сильно, так как:

  • Этой скорости точно хватит для подключения и работы в консоли.
  • Адаптер, несмотря на рисовое происхождение, работает на удивление стабильно — доказано двенадцатичасовым тестом через iperf с непрерывной нагрузкой.

Кстати, второе утверждение справедливо только для свежайших ядер Linux. Там оно правильно определяется и работает с помощью модуля dm9601. И как там оно в Windows — мне неведомо. Хотя продавец засунул в посылку и диск с драйверами. Не знаю, что там :).

Короче, надо бороться с дуплицированным адресом, остальное — мелочи.
Бороться будем через механизм udev путём написания правил.

Сразу стоит сделать одну важную оговорку — я стараюсь отключить “фичу” predicatable interface names. Она появилась (вроде в systemd ?), и в целом весьма полезная, однако вымораживает в некоторых случаях. Для её отключения нужно передать параметр ядру — net.ifnames=0. Возможно, нужно будет передать ещё и biosdevname=0, но это скорее всего не для одноплатников, а для “полноценных компьютеров”, где этот самый BIOS есть.

Итак, пусть у нас есть некий желаемый MAC-адрес и predictable interface names благополучно отключен.
Создаем новое правило udev:

1
2
$ cat /etc/udev/rules.d/11-usb-dm9601.rules
SUBSYSTEM=="net",KERNEL=="eth*",ATTRS{product}=="USB 2.0 10/100M Ethernet Adaptor",ATTRS{idProduct}=="9700",ATTRS{idVendor}=="0fe6", NAME="usbnet0", RUN+="/bin/ip link set dev usbnet0 address xx:yy:zz:aa:bb:cc"

В этом правиле мы присваиваем имя usbnet0 нашему адаптеру и принудительно меняем ему MAC на xx:yy:zz:aa:bb:cc.

В случае если pin не отключен, правило должно иметь такой вид:

1
SUBSYSTEM=="net",KERNEL=="eth*",ATTRS{product}=="USB 2.0 10/100M Ethernet Adaptor",ATTRS{idProduct}=="9700",ATTRS{idVendor}=="0fe6", RUN+="/bin/ip link set dev %k address xx:yy:zz:aa:bb:cc"

Это у меня лично вроде срабатывало, однако в зависимости от фаз луны адаптер либо получал имя enXXYYZZAABBCC, что таки соответствует “предсказуемым интерфейсам”, либо имел вид enСТАРЫЙМАКАДРЕС. Для определенности я отключил pin к хуям и именовал интерфейсы вручную, что в моем случае было вполне допустимо.

Итак, хреновина к покупке рекомендуется. Несмотря на все недостатки — она довольно стабильна, хоть и не быстра, стоит дёшево и может спасти ситуацию в довольно неожиданный момент.


В массы

В трубу