马春杰杰 Exit Reader Mode

[mcj]Ubuntu16.04使用LXD/LXC容器连接USB

我需要将我的USB接口暴露给我的LXD容器,而我正在使用Ubuntu 16.04机器。运行“lsusb”,我可以在主机和容器上看到相同的接口。

在我的容器内我使用的软件利用了这个USB接口(和相关的连接设备),但在执行阶段,一条消息告诉:

“USB打开失败:权限不足””USB open failed: insufficient permissions”

下面以添加PS3控制器为例,描述如何将PS3设备添加进容器内

首先,我们需要找到我们的设备信息。即它vendoridproductid 所以让我们跑lsusb

输出应该类似于:

Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 004: ID 058f:6362 Alcor Micro Corp. Flash Card Reader/Writer
Bus 001 Device 006: ID 054c:0268 Sony Corp. Batoh Device / PlayStation 3 Controller

对于我们的容器,我们对ID部分感兴趣。所以在我的情况下 054c:0268

054c将是我们的“工厂”,而且 0268 是我们的“产品”

因此,根据配置文档,我们最终应该使用这样的命令来添加我们的设备

lxc config device add \
<ContainerName> \
<DeviceName> \
usb \
vendorid=<vendorid>

只指定了vendorid,它将添加具有匹配的vendorid的所有设备。如果您只想要那个特定的设备,您也可以指定productid。

所以对于我的情况(显示一个具体的例子)我有:

lxc config device add \
pcsx2 \
ps3controllerblack \
usb \
vendorid=054c \
productid=0268

ContainerName是“pcsx2”,DeviceName可以是你想要的任何东西,它不需要对任何东西进行处理,所以设置为“ps3controllerblack”

最后要注意的是,即使将设备添加到容器中,为了使控制器正常工作,还需要将它的设备文件添加到容器中。

所以必须找到设备文件,确定它的类型(unix-char或unix-block),然后添加它。

我的控制器提供了一个字符设备,/dev/input/js0 所以命令最终是:

lxc config device add \
pcsx2 \
joystickdevice \
unix-char \
path=/dev/input/js0

有了它,我应该可以访问我的USB设备。可能需要向配置中添加更多内容并指定模式,uid或gid,以便容器中的适当用户可以访问它。

如果您碰巧在命令中输入了错误信息并需要执行此操作,请首先删除该设备,然后重试

lxc config device remove <ContainerName> <DeviceName>

例如:

lxc config device remove pcsx2 ps3controllerblack

如果是要在LXD容器中进行Android编程,可以参考这个:

https://stgraber.org/2017/03/27/usb-hotplug-with-lxd-containers/

本文最后更新于2019年5月21日,已超过 1 年没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!