
相机一插拔,/dev/video0 就变?
用 udev 规则 一劳永逸解决!
"程序写死 /dev/video0,结果换了个 USB 口就崩了?"
"多台相机同时接,根本分不清哪个是哪个?"
别再靠猜设备路径了!
一条 udev 规则,让你的相机拥有固定"身份证"!
🔧 原理一句话
Linux 系统在识别 USB/GigE 相机时,会动态分配设备节点(如 /dev/video0)。
而 udev 是 Linux 的设备管理器,可通过 厂商 ID + 产品 ID 等硬件信息,创建永久软链接,比如:
bash
/dev/camera_front → /dev/video2
/dev/camera_top → /dev/video1
无论你插哪个口、重启多少次,名字永远不变!
🛠️ 实操三步走
第一步:查相机的唯一标识
bash
# 列出所有视频设备
lsusb
# 示例输出:
Bus 001 Device 004: ID 2676:ba02 Hikvision MV-CE050-10GM
Bus 001 Device 005: ID 2ab6:000a Baumer TXG50c
记下 idVendor(如 2676)和 idProduct(如 ba02)。
💡 GigE 相机?用
udevadm info -a -n /dev/videoX查网卡 MAC 或序列号。
第二步:创建 udev 规则文件
bash
sudo nano /etc/udev/rules.d/99-camera.rules
填入规则(以海康相机为例):
udev
# 海康前视相机
SUBSYSTEM=="video4linux", ATTRS{idVendor}=="2676", ATTRS{idProduct}=="ba02", SYMLINK+="camera_front"
# 堡盟顶视相机
SUBSYSTEM=="video4linux", ATTRS{idVendor}=="2ab6", ATTRS{idProduct}=="000a", SYMLINK+="camera_top"
✅ 关键点:
SUBSYSTEM=="video4linux":只匹配视频设备SYMLINK+="xxx":创建软链接(自动建在/dev/下)
第三步:重载规则 & 验证
bash
# 重载 udev 规则
sudo udevadm control --reload-rules
sudo udevadm trigger
# 拔插相机后检查
ls -l /dev/camera_*
# 输出应类似:
# lrwxrwxrwx 1 root root 6 Apr 7 camera_front -> video2
搞定!现在你的代码只需调用 /dev/camera_front,再也不怕设备顺序变了!
⚠️ 高频避坑指南
| 问题 | 解决方案 |
|---|---|
| 规则不生效 | 检查 idVendor/idProduct 是否正确;文件名必须以 .rules 结尾 |
| 权限不足 | 在规则末尾加 MODE="0666", GROUP="plugdev" |
| 多台同型号相机 | 用 ATTRS{serial} 区分(需相机支持序列号) |
💡 进阶技巧:按位置绑定(USB端口固定)
如果你的工控机 USB 接口物理位置固定,还可以按 总线路径 绑定:
udev
SUBSYSTEM=="video4linux", KERNELS=="1-2.3", SYMLINK+="camera_left"
用
udevadm info -a -n /dev/video0找到KERNELS路径。
✅ 总结
udev 规则 = 工业部署的"设备命名规范" 。
花 5 分钟配置,省下 50 小时调试!
别再让"设备漂移"拖垮你的自动化系统!