我想从容器内部访问特殊的 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