Ubuntu 16.04 LTS重启后符号链接失效求助
这个问题我碰到过好多次——手动创建的/dev/ttyS5符号链接在重启后会变成死链接,而且还赖在/dev目录里,导致你重新执行ln -s时提示"链接已存在"。核心原因是/dev/ttyACM0是USB设备动态生成的节点,系统重启时它的加载时机晚于你手动创建链接的时间,而/dev作为临时文件系统,原本应该清空的死链接却因为某些机制残留了下来。
最靠谱的持久化方案是用udev规则,它会在USB设备被系统识别的瞬间自动创建符号链接,完全不用手动干预。具体步骤如下:
1. 获取USB键盘的专属设备标识
首先要拿到你的USB密码键盘的厂商ID和产品ID,这样udev规则只会针对这台设备生效,不会影响其他USB串口设备:
sudo udevadm info -a -n /dev/ttyACM0 | grep -E "idVendor|idProduct"
执行后会输出类似这样的内容:
ATTRS{idVendor}"1234"
ATTRS{idProduct}"5678"
把这两个值记下来,后面要用到。
2. 创建自定义udev规则文件
在/etc/udev/rules.d/目录下创建一个规则文件(这个目录的规则会被系统自动加载):
sudo nano /etc/udev/rules.d/99-usb-keyboard.rules
在文件里写入以下内容,把xxxx和yyyy替换成你刚才拿到的厂商ID和产品ID:
SUBSYSTEM=="tty", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="yyyy", SYMLINK+="ttyS5"
保存退出(nano里按Ctrl+O,回车确认,再按Ctrl+X)。
3. 加载新规则并触发生效
让系统重新加载udev规则,这样不用重启就能测试效果:
sudo udevadm control --reload-rules && sudo udevadm trigger
4. 验证效果
现在拔掉你的USB密码键盘,再重新插上,然后查看链接是否正常:
ls -l /dev/ttyS5
如果输出显示它指向/dev/ttyACM0,说明规则生效了。重启系统后,这个链接会自动创建,再也不用手动删除重建了。
补充说明
为什么手动创建的链接不靠谱?因为/dev是临时文件系统,理论上重启后内容会清空,但实际中死链接可能残留;而且系统启动时ttyACM0还没被识别出来,手动创建的链接从一开始就是无效的。udev规则是在设备实际被系统检测到的时刻触发创建,完美避开了这些问题。
内容的提问来源于stack exchange,提问作者Simon Sande

