我被要求为我购买的新 USB 设备添加 udev 规则。对于为什么这样做是必要的或有价值的,似乎没有一个非常简单的解释。始终将设备映射到同一路径?例如,始终将设备安装为/dev/ttyUSB1
或/dev/sda4
?
在/etc/udev/rules.d/99-totalphase.rules
:
# This file causes the mode of all Total Phase usb devices to be made
# writable for any user.
# Aardvark I2C/SPI Host Adapter
ACTION=="add", SUBSYSTEM=="usb_device", SYSFS{idVendor}=="0403", SYSFS{idProduct}=="e0d0", MODE="0666"
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0403", ATTR{idProduct}=="e0d0", MODE="0666"
# Beagle Protocol Analyzers
ACTION=="add", SUBSYSTEM=="usb_device", SYSFS{idVendor}=="1679", SYSFS{idProduct}=="2001", MODE="0666"
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1679", ATTR{idProduct}=="2001", MODE="0666"
答案1
事实上,始终将给定设备映射到同一位置是 udev 的常见用途之一。设备甚至可以有多个位置,例如,磁盘分区可以通过自动编号(例如/dev/sda1
)进行访问,还可以通过其文件系统上的标签 ( /dev/disk/by-label/*
)、通过其文件系统上的 UUID ( /dev/disk/by-uuid/*
) 以及磁盘设备的序列号进行访问( /dev/disk/by-id/*
)。如果您想访问特定设备,而不必关心它何时插入或在哪个端口上,最清晰的方法是添加与该特定硬件设备匹配的 udev 规则,并/dev
使用有意义的名称创建一个条目,例如
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1679", ATTR{idProduct}=="2001", \
SERIAL=="123456", MODE="0666", SYMLINK+="analyzer-foo"
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1679", ATTR{idProduct}=="2001", \
SERIAL=="123789", MODE="0666", SYMLINK+="analyzer-bar"
udev 规则的另一个常见目的是控制设备节点上的权限,通常是允许特定的守护进程访问它。这就是OWNER
、GROUP
和指令MODE
的SECLABEL
用途。
第三类原因是在设备插入时触发某些操作。例如,您可能需要将固件上传到设备,或者选择设备的使用模式,或者通知系统的某些部分新的网络连接或打印机可用等。