如何将同PID/VID的单个USB软件无线电设备挂载到LXC容器
如何将同PID/VID的单个USB软件无线电设备挂载到LXC容器
问题背景
我在Linux服务器上接了两台软件无线电设备,它们的产品ID(productid)和厂商ID(vendorid)完全相同,同时服务器上运行着一个LXC容器。我希望只把其中一台设备挂载到容器里,不让容器访问另一台——毕竟我要给不太信任的用户开放容器的访问权限,但不想让他们接触到LXD主机,也不想让他们看到两台设备。
我已做过的调试步骤
先做了个 sanity check 确认LXC的USB挂载功能正常:
- 先把两台设备都挂载到容器:
lxc config device add my-container usrpUSB usb productid=6010 vendorid=0403 - 运行第三方刷写工具,能正常操作设备,没问题;
- 移除容器的USB设备:
lxc config device remove my-container usrpUSB - 再运行刷写工具,果然失败了,说明LXC的USB挂载功能是正常的。
之后我想搞清楚LXC挂载设备时改了容器里哪些文件,尝试手动映射:
- 挂载USB后,在容器里执行
find / -ls > /tmp/find_with_usb.txt; - 移除USB后,再执行
find / -ls > /tmp/find_without_usb.txt; - 对比两个文件,发现多了上百个文件,但都不是
/dev/ttyUSB*这类字符设备,大多在/var/lib/lxcfs和/sys/fs/cgroup目录下,不清楚这些在LXD主机上的来源,所以手动路径/字符设备映射这条路走不通。
解决方案:通过设备序列号(serial)区分挂载
其实LXC的USB设备添加命令支持通过设备序列号来精准指定要挂载的设备——毕竟同PID/VID的设备,序列号肯定是唯一的。
步骤如下:
先在LXD主机上找到两台设备的序列号:
可以用lsusb -v命令,找到对应idVendor 0x0403和idProduct 0x6010的设备,查看iSerial字段的值,就是设备的序列号。
或者用更简洁的命令直接过滤:lsusb -d 0403:6010 -v | grep iSerial记下你想挂载的那台设备的序列号。
使用序列号精准添加USB设备到容器:
把命令改成带serial参数的形式,比如假设目标设备序列号是ABC123:lxc config device add my-container usrpUSB usb productid=6010 vendorid=0403 serial=ABC123这样就只会把序列号为
ABC123的那台软件无线电设备挂载到容器里,另一台会留在主机上,容器无法访问。验证是否正确挂载:
进入容器后,用lsusb命令查看,应该只能看到指定的那台设备;再运行刷写工具,确认只能操作这一台设备。
备注:内容来源于stack exchange,提问作者EdwardTeach
相关产品推荐
相关产品推荐

