Почему правило udev для USB-модема работает на устройстве OnePlus5, но не на устройстве Samsung?

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

$ cat /etc/udev/rules.d/99-persistent-net.rules
# OnePlus5 (это работает)
SUBSYSTEM=="net", ACTION=="add", ATTRS{serial}=="d221c91d", NAME="hp"

# Samsung S24 через USB (это не работает)
SUBSYSTEM=="net", ACTION=="add", ATTR{serial}=="RZCX410K81V", NAME="usbS24"

Обновление

Вывод из udevadm monitor --property при включении USB-модема

$ udevadm monitor --property
monitor будет выводить полученные события для:
UDEV - событие, которое udev отправляет после обработки правила
KERNEL - событие ядра

KERNEL[687757.205614] remove   /devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1/1-2.1:1.0 (usb)
ACTION=remove
DEVPATH=/devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1/1-2.1:1.0
SUBSYSTEM=usb
DEVTYPE=usb_interface
PRODUCT=4e8/6860/504
TYPE=0/0/0
INTERFACE=6/1/1
MODALIAS=usb:v04E8p6860d0504dc00dsc00dp00ic06isc01ip01in00
SEQNUM=3453

KERNEL[687757.205870] remove   /devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1/1-2.1:1.1/tty/ttyACM0 (tty)
ACTION=remove
DEVPATH=/devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1/1-2.1:1.1/tty/ttyACM0
SUBSYSTEM=tty
DEVNAME=/dev/ttyACM0
SEQNUM=3454
MAJOR=166
MINOR=0

KERNEL[687757.205895] unbind   /devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1/1-2.1:1.2 (usb)
ACTION=unbind
DEVPATH=/devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1/1-2.1:1.2
SUBSYSTEM=usb
DEVTYPE=usb_interface
PRODUCT=4e8/6860/504
TYPE=0/0/0
INTERFACE=10/0/0
SEQNUM=3455

KERNEL[687757.205916] unbind   /devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1/1-2.1:1.1 (usb)
ACTION=unbind
DEVPATH=/devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1/1-2.1:1.1
SUBSYSTEM=usb
DEVTYPE=usb_interface
PRODUCT=4e8/6860/504
TYPE=0/0/0
INTERFACE=2/2/1
SEQNUM=3456

KERNEL[687757.205938] remove   /devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1/1-2.1:1.1 (usb)
ACTION=remove
DEVPATH=/devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1/1-2.1:1.1
SUBSYSTEM=usb
DEVTYPE=usb_interface
PRODUCT=4e8/6860/504
TYPE=0/0/0
INTERFACE=2/2/1
MODALIAS=usb:v04E8p6860d0504dc00dsc00dp00ic02isc02ip01in01
SEQNUM=3457

KERNEL[687757.205960] remove   /devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1/1-2.1:1.2 (usb)
ACTION=remove
DEVPATH=/devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1/1-2.1:1.2
SUBSYSTEM=usb
DEVTYPE=usb_interface
PRODUCT=4e8/6860/504
TYPE=0/0/0
INTERFACE=10/0/0
MODALIAS=usb:v04E8p6860d0504dc00dsc00dp00ic0Aisc00ip00in02
SEQNUM=3458

KERNEL[687757.205983] remove   /devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1/1-2.1:1.3 (usb)
ACTION=remove
DEVPATH=/devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1/1-2.1:1.3
SUBSYSTEM=usb
DEVTYPE=usb_interface
PRODUCT=4e8/6860/504
TYPE=0/0/0
INTERFACE=255/64/2
MODALIAS=usb:v04E8p6860d0504dc00dsc00dp00icFFisc40ip02in03
SEQNUM=3459

KERNEL[687757.237599] unbind   /devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1 (usb)
ACTION=unbind
DEVPATH=/devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1
SUBSYSTEM=usb
DEVNAME=/dev/bus/usb/001/016
DEVTYPE=usb_device
PRODUCT=4e8/6860/504
TYPE=0/0/0
BUSNUM=001
DEVNUM=016
SEQNUM=3460
MAJOR=189
MINOR=15

KERNEL[687757.238015] remove   /devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1 (usb)
ACTION=remove
DEVPATH=/devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1
SUBSYSTEM=usb
DEVNAME=/dev/bus/usb/001/016
DEVTYPE=usb_device
PRODUCT=4e8/6860/504
TYPE=0/0/0
BUSNUM=001
DEVNUM=016
SEQNUM=3461
MAJOR=189
MINOR=15

UDEV  [687757.238109] unbind   /devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1/1-2.1:1.2 (usb)
ACTION=unbind
DEVPATH=/devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1/1-2.1:1.2
SUBSYSTEM=usb
DEVTYPE=usb_interface
PRODUCT=4e8/6860/504
TYPE=0/0/0
INTERFACE=10/0/0
SEQNUM=3455
USEC_INITIALIZED=687690235155
ID_PATH=platform-xhci-hcd.0-usb-0:2.1:1.2
ID_PATH_TAG=platform-xhci-hcd_0-usb-0_2_1_1_2

UDEV  [687757.238351] remove   /devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1/1-2.1:1.1/tty/ttyACM0 (tty)
ACTION=remove
DEVPATH=/devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1/1-2.1:1.1/tty/ttyACM0
SUBSYSTEM=tty
DEVNAME=/dev/ttyACM0
SEQNUM=3454
USEC_INITIALIZED=687690237347
ID_BUS=usb
ID_MODEL=SAMSUNG_Android
ID_MODEL_ENC=SAMSUNG_Android
ID_MODEL_ID=6860
ID_SERIAL=SAMSUNG_SAMSUNG_Android_RZCX410K81V
ID_SERIAL_SHORT=RZCX410K81V
ID_VENDOR=SAMSUNG
ID_VENDOR_ENC=SAMSUNG
ID_VENDOR_ID=04e8
ID_REVISION=0504
ID_TYPE=generic
ID_USB_MODEL=SAMSUNG_Android
ID_USB_MODEL_ENC=SAMSUNG_Android
ID_USB_MODEL_ID=6860
ID_USB_SERIAL=SAMSUNG_SAMSUNG_Android_RZCX410K81V
ID_USB_SERIAL_SHORT=RZCX410K81V
ID_USB_VENDOR=SAMSUNG
ID_USB_VENDOR_ENC=SAMSUNG
ID_USB_VENDOR_ID=04e8
ID_USB_REVISION=0504
ID_USB_TYPE=generic
ID_USB_INTERFACES=:060101:020201:0a0000:ff4002:
ID_USB_INTERFACE_NUM=01
ID_USB_DRIVER=cdc_acm
ID_VENDOR_FROM_DATABASE=Samsung Electronics Co., Ltd
ID_MEDIA_PLAYER=1
ID_MODEL_FROM_DATABASE=Galaxy series, misc. (MTP mode)
ID_MTP_DEVICE=1
ID_PATH=platform-xhci-hcd.0-usb-0:2.1:1.1
ID_PATH_TAG=platform-xhci-hcd_0-usb-0_2_1_1_1
ID_MM_CANDIDATE=1
MAJOR=166
MINOR=0
DEVLINKS=/dev/serial/by-path/platform-xhci-hcd.0-usb-0:2.1:1.1 /dev/serial/by-id/usb-SAMSUNG_SAMSUNG_Android_RZCX410K81V-if01
TAGS=:systemd:
CURRENT_TAGS=:systemd:

UDEV  [687757.239024] remove   /devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1/1-2.1:1.2 (usb)
ACTION=remove
DEVPATH=/devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1/1-2.1:1.2
SUBSYSTEM=usb
DEVTYPE=usb_interface
PRODUCT=4e8/6860/504
TYPE=0/0/0
INTERFACE=10/0/0
MODALIAS=usb:v04E8p6860d0504dc00dsc00dp00ic0Aisc00ip00in02
SEQNUM=3458
USEC_INITIALIZED=687690235155
ID_PATH=platform-xhci-hcd.0-usb-0:2.1:1.2
ID_PATH_TAG=platform-xhci-hcd_0-usb-0_2_1_1_2

UDEV  [687757.239059] remove   /devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1/1-2.1:1.3 (usb)
ACTION=remove
DEVPATH=/devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-2/1-2.1/1-2.1:1.3
SUBSYSTEM=usb
DEVTYPE=usb_interface
PRODUCT=4e8/6860/504
TYPE=0/0/0
INTERFACE=255/64/2
MODALIAS=usb:v04E8p6860d0504dc00dsc00dp00icFFisc40ip02in03
SEQNUM=3459
USEC_INITIALIZED=687690235479
ID_VENDOR_FROM_DATABASE=Samsung Electronics Co., Ltd
ID_MEDIA_PLAYER=1
ID_MODEL_FROM_DATABASE=Galaxy series, misc. (MTP mode)
ID_MTP_DEVICE=1
ID_PATH=platform-xhci-hcd.0-usb-0:2.1:1.3
ID_PATH_TAG=platform-xhci-hcd_0-usb-0_2_1_1_3

UDEV  [687757.239096] remove   /devices/platform/axi/1000120000...

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

У данной проблемы есть несколько моментов, которые необходимо рассмотреть, чтобы понять, почему правила udev для USB-тетеринга работают с устройством OnePlus5, но не работают с устройством Samsung.

Теория (Theory):
Udev — это подсистема Linux, ответственная за создание и управление устройствами, представленными в системной файловой системе. Она реагирует на аппаратные изменения в системе, такие как подключение USB-устройств, и создает соответствующие файловые дескрипторы. Правила udev используются для конкретизации обработчиков событий, таких как назначение имен или установка остальных свойств устройств.

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

В приведенном примере, правило для устройства OnePlus5 выглядит следующим образом:

SUBSYSTEM=="net", ACTION=="add", ATTRS{serial}=="d221c91d", NAME="hp"

Это правило прекрасно работает. Но для Samsung:

SUBSYSTEM=="net", ACTION=="add", ATTR{serial}=="RZCX410K81V", NAME="usbS24"

не срабатывает, так как оно использует ATTR вместо ATTRS.

Пример (Example):
Чтобы понять проблему, рассмотрим результат выполнения команды udevadm monitor --property, которая показывает изменения в устройстве при подключении и активации тетеринга. В выводе основное внимание следует обратить на использование ATTRS и ATTR.

В правилах udev ATTRS используется для обращения к атрибутам родительского устройства, тогда как ATTR — для текущего. В примере для устройства OnePlus5 используется ATTRS, что и позволяет получить доступ к серийному номеру родительского устройства, которое является интерфейсом USB. Именно это правило срабатывает корректно. Для устройства Samsung было выбрано неверное свойство, так как использовано ATTR.

Применение (Application):
Для исправления ситуации с устройством Samsung следует использовать ATTRS вместо ATTR, чтобы получить серийный номер, как показано ниже:

SUBSYSTEM=="net", ACTION=="add", ATTRS{serial}=="RZCX410K81V", NAME="usbS24"

Это изменение гарантирует, что правило будет успешно применено к сетевому интерфейсу Samsung, используя атрибуты родительского устройства. Более того, если цель состоит в достижении консистентности именования сетевых интерфейсов, можно использовать иные подходы, например, через systemd network link files. Файл /etc/systemd/network/10-samsung-s24.link создается следующим образом:

[Match]
Property=ID_SERIAL_SHORT=RZCX410K81V

[Link]                                                                                                                                                                                                                                                                          
Name=usbS24

Этот подход предоставляет более гибкие и надежные средства управления настройками устройства.

Таким образом, понимание различий в использовании ATTRS и ATTR, а также выбор подходящего метода реализуют надежные правила для разных устройств. Учащиеся и администраторы систем должны уделять внимание этим нюансам, чтобы избегать подобных проблем в будущем.

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

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