udev 規則不區分
我有一個 Neato XV-* 雷射雷達單元,與 Sparkfun FTDI 晶片和 Arduino Uno 連接。它們顯示為
/dev/ttyUSB0
和/dev/ttyUSB1
,不可預知地未賦值。所以,我寫道
/etc/udev/rules.d/80-arduinouno.rules
:SUBSYSTEM=="tty", ATTRS{idProduct}=="7523", ATTRS{idVendor}=="1a86", MODE="0666", OWNER="pi", GROUP="pi", SYMLINK+="arduinouno"
…和
/etc/udev/rules.d/90-neatolidar.rules
:SUBSYSTEM=="tty", ENV(ID_SERIAL_SHORT)=="AL01OTZS", ATTRS{idProduct}=="6001", ATTRS{idVendor}=="0403", ATTRS{serial}=="AL01OTZS", MODE="0666", OWNER="pi", GROUP="pi", SYMLINK+="neatolidar"
idProduct
並idVendor
取自第一行udevadm info --attribute-walk --name=/dev/ttyUSB1 | grep idProduct
和
udevadm info --attribute-walk --name=/dev/ttyUSB1 | grep idVendor
分別與 的輸出交叉引用
lsusb
。IS_SERIAL_SHORT
取自輸出udevadm info -q all -n /dev/ttyUSB0 | grep ID_SERIAL
或者
udevadm info --attribute-walk --name=/dev/ttyUSB0 | grep {serial}
但是,雖然此命令適用於 FTDI/雷射雷達,但它只為 Arduino提供了一個
ID_SERIAL
,而不是一個。ID_SERIAL_SHORT
當我做 a
sudo service udev restart
,然後嘗試在監視時插入和拔出設備時watch 'ls -lah /dev | grep ">"'
,我看到符號連結出現在兩者 以及arduinouno
最後插入的那個。也就是說,目前,我同時看到和。但是如果我拔掉並重新插入,兩者都會切換到那個。neatolidar``ttyUSB*``arduinouno -> ttyUSB1``neatolidar -> ttyUSB1``ttyUSB0
如何讓我的 udev 規則區分這兩個設備,並且僅在檢測到正確設備時觸發?
如果重要的話,這是在執行 Raspbian Jessie 的 Raspberry Pi 3 上。Arduino 直接連接到 RPi,而FTDI連接到便宜的黃色EagleTec 4 埠 USB 集線器。
執行
sudo udevadm control --log-priority=info
,然後觀察 的輸出tail -f /var/log/syslog
,我注意到一些錯誤。
Jan 23 21:22:05 raspberrypi systemd-udevd[1587]: invalid key/value pair in file /etc/udev/rules.d/80-arduinouno.rules on line 1,starting at character 17 ('\n') Jan 23 21:22:05 raspberrypi systemd-udevd[1587]: invalid key/value pair in file /etc/udev/rules.d/80-arduinouno.rules on line 2,starting at character 50 ('\n') Jan 23 21:22:05 raspberrypi systemd-udevd[1587]: invalid key/value pair in file /etc/udev/rules.d/80-arduinouno.rules on line 3,starting at character 12 ('\n') Jan 23 21:22:05 raspberrypi systemd-udevd[1587]: invalid key/value pair in file /etc/udev/rules.d/80-arduinouno.rules on line 4,starting at character 23 ('\n')
和
`Jan 23 21:23:01 raspberrypi systemd-udevd[1646]: unknown key ‘ENV(ID_SERIAL_SHORT)’ in /etc/udev/rules.d/90-neatolidar.rules:1
Jan 23 21:23:01 raspberrypi systemd-udevd[1646]: invalid rule ‘/etc/udev/rules.d/90-neatolidar.rules:1’
Jan 23 21:23:01 raspberrypi systemd-udevd[1646]: invalid key/value pair in file /etc/udev/rules.d/90-neatolidar.rules on line 2,starting at character 77 (’\n’) Jan 23 21:23:01 raspberrypi systemd-udevd[1646]: invalid key/value pair in file /etc/udev/rules.d/90-neatolidar.rules on line 3,starting at character 36 (’\n’)`
由此推斷(1)我的
ENV(ID_SERIAL_SHORT)
規則不起作用,(2)我不應該有換行符。因此,我更改為以下單行 .rules 文件:
/etc/udev/rules.d/80-arduinouno.rules
:
SUBSYSTEM=="tty", ATTRS{idProduct}=="7523", ATTRS{idVendor}=="1a86", MODE="0666", OWNER="pi", GROUP="pi", SYMLINK+="arduinouno"
和
/etc/udev/rules.d/90-neatolidar.rules
:
SUBSYSTEM=="tty", ATTRS{idProduct}=="6001", ATTRS{idVendor}=="0403", ATTRS{serial}=="AL01OTZS", MODE="0666", OWNER="pi", GROUP="pi", SYMLINK+="neatolidar"
重新啟動後(或者可能只是
sudo service udev restart
和/或sudo udevadm control --reload
),這似乎有效。
我的聲譽似乎不夠高,無法發表評論。
另外:我使用以下 bash 腳本重新載入我的 udev 規則並重新觸發,因此我什至不需要拔下並重新插入設備:
#!/bin/bash sudo udevadm control --reload-rules sudo udevadm trigger