環境:
在USB-HUB上插上16個usb2serial,每次重啓後,
每個usb2serial獲得的ttyUSB*設備號都不一樣,而且有時也會自動隨機變化。
解決:
通過uevent機制來解決。在/sys上保留當前設備的信息。
uevent獲取設備熱插拔信息後,通過/sys下的具體設備信息生成設備號。
uevent通過讀取/etc/udev/rules.d/50-usb-serial.rules文件。來處理對當前熱插拔設備的操作。
test@TEST:/etc/udev/rules.d$ cat 50-usb-serial.rules
KERNEL=="ttyUSB*", ACTION=="add", RUN+="/usr/local/test/add_ttyUSB.sh %k %p"
KERNEL=="ttyUSB*", ACTION=="remove", RUN+="/usr/local/test/remove_ttyUSB.sh %k %p"
test@TEST:/etc/udev/rules.d$
%k:ttyUSB*
%p:/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2.1/2-1.2.1.2/2-1.2.1.2:1.0/ttyUSB*/tty/ttyUSB*
add_ttyUSB.sh:獲取ttyUSB設備插入時的操作。
remove_ttyUSB.sh:移除ttyUSB設備時的操作。
參考:add_ttyUSB.sh內容:
#!/bin/bash
DEVICE_NAME=$1
NUM1=$(echo $2 | cut -d '/' -f 7)
NUM2=$(echo $2 | cut -d '/' -f 8)
NUM3=$(echo $2 | cut -d '/' -f 9)
HUB_INDEX=$(echo $NUM1 | cut -d '.' -f 2)
NUM_J=$(echo $NUM2 | cut -d '.' -f 3)
NUM_K=$(echo $NUM3 | cut -d '.' -f 4)
let "PORT=($NUM_J-1)*4+$NUM_K"
LINK_NAME=USBHUB${HUB_INDEX}-${PORT}
ln -sf /dev/$DEVICE_NAME /dev/$LINK_NAME
參考:remove_ttyUSB.sh內容:
#!/bin/bash
DEVICE_NAME=$1
NUM1=$(echo $2 | cut -d '/' -f 7)
NUM2=$(echo $2 | cut -d '/' -f 8)
NUM3=$(echo $2 | cut -d '/' -f 9)
HUB_INDEX=$(echo $NUM1 | cut -d '.' -f 2)
NUM_J=$(echo $NUM2 | cut -d '.' -f 3)
NUM_K=$(echo $NUM3 | cut -d '.' -f 4)
let "PORT=($NUM_J-1)*4+$NUM_K"
LINK_NAME=USBHUB${HUB_INDEX}-${PORT}
rm -f /dev/$LINK_NAME
參考鏈接:http://reactivated.net/writing_udev_rules.html