从 systemd-nspawn 容器访问 USB 设备

从 systemd-nspawn 容器访问 USB 设备

我想从容器内部访问特殊的 USB 设备(不是简单的闪存驱动器)。我/dev/bus/usb在容器内绑定,lsusb轻松列出 USB:

$ lsusb
...
Bus 002 Device 002: ID 0a89:0009 
...

但我的程序无法与该设备交互。

答案1

systemd-nspawn通过 [cgroups][1] 处理设备的权限。默认情况下,任何容器仅被授予对常见设备(如 、 等)的权限/dev/null/dev/zero此外还授予直接传递给--bind参数(如 )的任何设备的权限--bind=/dev/vcs。这不适用于 USB,因为/dev/bus/usb它是一个目录。

要为当前正在运行的名为my_container(假设您systemd-nspawn直接从命令行启动它)的容器授予权限,请以 root 身份执行:

$ echo 'c 189:* rwm' > \
 /sys/fs/cgroup/devices/machine.slice/machine-my_container/devices.allow

c 189:* rwm方法r电子头w仪式任何类型(标识符)为 189 且子类型为任意字符设备的 knod 权限。另请参阅:https://kernel.org/doc/html/latest/admin-guide/cgroup-v1/devices.html 您可以使用以下命令查找设备的类型和子类型file

$ file /dev/bus/usb/002/002

此权限仅在容器运行时持续。

如果您正在使用[email protected]或想要保留其权限,请创建

/etc/systemd/system/[email protected]/override.conf

或者

/etc/systemd/system/systemd-nspawn@my_container.service.d/override.conf

systemd-nspawn(取决于您是想从任何容器还是仅从相应容器访问 USB my_container),内容如下:

[Service]
DeviceAllow=char-usb_device rwm 

usb_device是一个别名。您可以在 中找到其他内容/proc/devices。 [1]:https://wiki.archlinux.org/index.php/cgroups

相关内容