从 Docker 访问 USB 设备
Posted
技术标签:
【中文标题】从 Docker 访问 USB 设备【英文标题】:USB Device access from Docker 【发布时间】:2021-03-04 23:44:27 【问题描述】:在我们的 CI 中,我们使用 Jenkins,在 jenkinfile 中,我运行了一个 docker 映像,该映像创建了要闪存到 stm32 核板上的二进制文件。更准确地说,闪烁过程是在 docker 映像中的 CMakeLists.txt 文件中作为后期构建过程完成的。我知道 stm32 板在 docker 映像中可用,因为我使用 lsusb 对其进行了测试。但是 openOCD 出现的错误是:
错误:libusb_open() 使用 LIBUSB_ERROR_NO_DEVICE 失败
我还尝试从 Jenkinfile 调用相同的 openOCD 命令(所以在 docker 映像之外),它给了我错误:
libusb_open() 因 LIBUSB_ERROR_ACCESS 而失败
如果我在终端中使用该命令,它就可以工作。我认为这与 udev 和访问规则有关。但我不知道它们是如何使用或生成的。
问题:
为什么openOCD在docker镜像中找不到设备,即使它 调用 lsusb 时是否列出? 为什么 openOCD 在从 Jenkinsfile 即使在同一台机器上使用相同的命令 终端工作? 如果第二题的问题是缺少udev规则 openocd,我如何以脚本方式生成它们,以便它们 在码头工作?非常感谢您提前提供的帮助。
【问题讨论】:
【参考方案1】:这是我在 docker 中运行 OpenOCD 以对 Xilinx FPGA 进行编程的方法:
docker run --rm -it \
--device-cgroup-rule='c 189:* rmw' \
-v /dev:/dev \
docker.lan:5000/openocd \
openocd -f /opt/openocd/arty_a7.cf
--device-cgroup-rule
选项用于设置对主编号为 189 的字符设备的 cgroup 访问权限,可以在您尝试访问的设备的设备节点上找到 /dev
。
另外,-v /dev:/dev
提供对容器内设备树的访问。这可能只是您要使用的特定设备,这需要 udev 规则为其提供一个永久名称。
【讨论】:
以上是关于从 Docker 访问 USB 设备的主要内容,如果未能解决你的问题,请参考以下文章