![udev 规则创建的 /dev/ttyACM0 符号链接的权限不正确](https://linux22.com/image/118829/udev%20%E8%A7%84%E5%88%99%E5%88%9B%E5%BB%BA%E7%9A%84%20%2Fdev%2FttyACM0%20%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5%E7%9A%84%E6%9D%83%E9%99%90%E4%B8%8D%E6%AD%A3%E7%A1%AE.png)
我正在尝试在 ESXi 6 下运行的 Ubuntu 17.04 VM 上的家庭自动化服务器上为某些 USB 设备设置一致的设备名称。到目前为止,我在 /etc/udev/rules.d/99-usb 中有以下规则-serial.rules:
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idproduct}=="6001", ATTRS{serial}=="A19DVOA", SYMLINK+="USBrfxcom", MODE="0660", GROUP="dialout"
KERNEL=="ttyACM[0-9]*", SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK+="USBzwave2", MODE="0660", GROUP="dialout"
KERNEL=="ttyACM[0-9]*", SUBSYSTEM=="tty", ATTRS{idVendor}=="0658", ATTRS{idProduct}=="0200", SYMLINK+="USBzwave5", MODE="0660", GROUP="dialout"
KERNEL=="ttyACM[0-9]*", SUBSYSTEM=="tty", ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="204b", SYMLINK+="USBcul", MODE="0660", GROUP="dialout"
第一条包含vendorid 0403和productid 6001的规则目前并不是什么大问题,因为它是唯一出现在/dev/ttyUSB*范围内的设备,即它始终是/dev/ttyUSB0,尽管将来可能会改变当我添加更多设备时。规则 2-4 是有问题的规则,它们都会针对我在 /dev/ttyACM* 范围内的三个设备触发。重新启动后,每个 USB 设备都可以显示为 /dev/ttyACM0 /dev/ttyACM1 或 /dev/ttyACM2 中的任何一个,我希望它们显示为 /dev/USBzwave2、/dev/USBzwave5 和 /dev/USBcul。
的输出sudo udevadm 测试 -a -p $(udevadm 信息 -q 路径 -n /dev/ttyACM1)给我:
Reading rules file: /etc/udev/rules.d/99-usb-serial.rules
Reading rules file: /lib/udev/rules.d/99-vmware-scsi-udev.rules
rules contain 49152 bytes tokens (4096 * 12 bytes), 14768 bytes strings
2093 strings (26721 bytes), 1358 de-duplicated (12689 bytes), 736 trie nodes used
value '[dmi/id]sys_vendor' is 'VMware, Inc.'
value '[dmi/id]sys_vendor' is 'VMware, Inc.'
IMPORT builtin 'hwdb' /lib/udev/rules.d/60-serial.rules:7
IMPORT builtin 'usb_id' /lib/udev/rules.d/60-serial.rules:8
/sys/devices/pci0000:00/0000:00:17.0/0000:13:00.0/usb1/1-3/1-3.2/1-3.2:1.0: if_class 2 protocol 0
IMPORT builtin 'hwdb' /lib/udev/rules.d/60-serial.rules:8
IMPORT builtin 'path_id' /lib/udev/rules.d/60-serial.rules:15
LINK 'serial/by-path/pci-0000:13:00.0-usb-0:3.2:1.0' /lib/udev/rules.d/60-serial.rules:16
IMPORT builtin skip 'usb_id' /lib/udev/rules.d/60-serial.rules:19
LINK 'serial/by-id/usb-busware.de_CUL868-if00' /lib/udev/rules.d/60-serial.rules:23
GROUP 20 /etc/udev/rules.d/99-usb-serial.rules:4
MODE 0660 /etc/udev/rules.d/99-usb-serial.rules:4
LINK 'USBcul' /etc/udev/rules.d/99-usb-serial.rules:4
handling device node '/dev/ttyACM1', devnum=c166:1, mode=0660, uid=0, gid=20
preserve permissions /dev/ttyACM1, 020660, uid=0, gid=20
preserve already existing symlink '/dev/char/166:1' to '../ttyACM1'
found 'c166:1' claiming '/run/udev/links/\x2fUSBcul'
creating link '/dev/USBcul' to '/dev/ttyACM1'
preserve already existing symlink '/dev/USBcul' to 'ttyACM1'
found 'c166:1' claiming '/run/udev/links/\x2fserial\x2fby-id\x2fusb-busware.de_CUL868-if00'
creating link '/dev/serial/by-id/usb-busware.de_CUL868-if00' to '/dev/ttyACM1'
preserve already existing symlink '/dev/serial/by-id/usb-busware.de_CUL868-if00' to '../../ttyACM1'
found 'c166:1' claiming '/run/udev/links/\x2fserial\x2fby-path\x2fpci-0000:13:00.0-usb-0:3.2:1.0'
creating link '/dev/serial/by-path/pci-0000:13:00.0-usb-0:3.2:1.0' to '/dev/ttyACM1'
preserve already existing symlink '/dev/serial/by-path/pci-0000:13:00.0-usb-0:3.2:1.0' to '../../ttyACM1'
created db file '/run/udev/data/c166:1' for '/devices/pci0000:00/0000:00:17.0/0000:13:00.0/usb1/1-3/1-3.2/1-3.2:1.0/tty/ttyACM1'
ACTION=-p
DEVLINKS=/dev/serial/by-id/usb-busware.de_CUL868-if00 /dev/USBcul /dev/serial/by-path/pci-0000:13:00.0-usb-0:3.2:1.0
DEVNAME=/dev/ttyACM1
DEVPATH=/devices/pci0000:00/0000:00:17.0/0000:13:00.0/usb1/1-3/1-3.2/1-3.2:1.0/tty/ttyACM1
ID_BUS=usb
ID_MODEL=CUL868
ID_MODEL_ENC=CUL868
ID_MODEL_FROM_DATABASE=LUFA USB to Serial Adapter Project
ID_MODEL_ID=204b
ID_PATH=pci-0000:13:00.0-usb-0:3.2:1.0
ID_PATH_TAG=pci-0000_13_00_0-usb-0_3_2_1_0
ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
ID_PCI_INTERFACE_FROM_DATABASE=XHCI
ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
ID_REVISION=0000
ID_SERIAL=busware.de_CUL868
ID_TYPE=generic
ID_USB_CLASS_FROM_DATABASE=Communications
ID_USB_DRIVER=cdc_acm
ID_USB_INTERFACES=:020201:0a0000:
ID_USB_INTERFACE_NUM=00
ID_VENDOR=busware.de
ID_VENDOR_ENC=busware.de
ID_VENDOR_FROM_DATABASE=Atmel Corp.
ID_VENDOR_ID=03eb
MAJOR=166
MINOR=1
SUBSYSTEM=tty
TAGS=:systemd:
USEC_INITIALIZED=5912804
Unload module index
Unloaded link configuration context.
这似乎是解决方案的 99%,但是,如果我正确读取输出,规则似乎会创建两个符号链接:
creating link '/dev/USBcul' to '/dev/ttyACM1'
preserve already existing symlink '/dev/USBcul' to 'ttyACM1'
第一行看起来不错,第二行看起来错误。
ls -l /dev/USB*给出:
lrwxrwxrwx 1 root root 7 Oct 1 14:46 /dev/USBcul -> ttyACM1
我认为应该改为:
lrwxrwxrwx 1 root root 7 Oct 1 14:46 /dev/USBcul -> /dev/ttyACM1
另外,规则中指定的组似乎被忽略,它应该设置为 dialout 而不是 root,而且权限也是错误的,它们是 777 而不是 660。我认为这些权限问题是由不正确的符号链接引起的。
那么,我错过了什么?感觉就像它在盯着我的脸,但我就是看不到它。
答案1
您的示例中的两个符号链接都指向同一件事。第二个 ( /dev/USBcul -> ttyACM
) 是相对符号链接。相对符号链接指向符号链接所在同一目录中的文件,在本例中为/dev
。
不使用符号链接的权限:对目标文件的访问由目标文件的权限和所有权决定。符号链接从创建该链接的进程的 uid 和 gid 中获取其用户和组所有权。在您的示例中,链接是由 root 创建的。再次强调,链接的所有权没有什么意义:对指向的文件的访问由目标文件的所有权决定。链接所有权很重要的一种情况是当它包含在设置了粘性位的目录中时;那么只有链接的所有者才能删除它。
你又遇到什么问题了?