在哪里安装设备驱动程序以使docker识别设备?

12

我在Ubuntu上运行一些二进制文件,控制着各种设备,比如板载/USB无线电/蓝牙芯片。有些芯片需要额外的驱动程序。

我的猜测是,仅仅将驱动程序安装到Docker镜像中还不够,主机操作系统必须具有这些驱动程序。这个说法正确吗?

如果是的话,如果主机已经拥有驱动程序,为什么Docker镜像还需要任何驱动程序呢?如何使Docker镜像正确地委派给主机?这些需不需要为每个驱动程序在每个主机操作系统上硬编码?

此外,从这个角度来看,与虚拟机相比,Docker需要更多或更少的硬编码吗?

我认为答案可能取决于设备如何呈现给Docker以及驱动程序必须在哪里运行(例如内核空间与用户空间)。

谢谢!

1个回答

6
这将取决于设备和驱动程序。大多数驱动程序需要内核的一些支持,在这些情况下,您的主机内核必须提供功能。某些驱动程序的功能、依赖库和应用程序可能在用户空间中实现(例如包 libusb、usbutils...),因此您的容器应该安装了这些软件包。并且,在运行容器时,您必须明确指示 Docker 映射您容器中的设备(任何 /dev/*)。您有两个选项:
  1. 使用带有选项 --device 的 docker run
  2. 使用特权模式下的 -v 选项将设备映射为卷的 docker run

嗨,哈维尔,你的回答表明Docker容器调用主机操作系统的用户空间函数来访问设备。所以这些必须在某个地方进行硬编码,对吧? - Yey
另一种选择是将设备本地初始化到容器中。这避免了委派,但在多个容器之间存在同步问题。无论哪种方式,是否有任何源代码或文档证明其中之一?谢谢! - Yey
大多数驱动程序都是在内核空间中实现的,必须安装在主机上。但是,有些硬件位于用户空间中,需要安装工具/实用程序才能使用,这些工具/实用程序需要安装在容器中。使用选项 --device--privileged -v 将硬件的访问和并发使用委托给主机内核。我认为多个容器之间不应该存在同步问题。 - Javier Cortejoso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接