从 systemd-nspawn 容器访问 USB 设备

Mad*_*ner 4 usb container systemd-nspawn

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

$ lsusb
...
Bus 002 Device 002: ID 0a89:0009 
...
Run Code Online (Sandbox Code Playgroud)

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

Mad*_*ner 12

systemd-nspawn通过cgroups处理设备的权限。默认情况下,任何容器被授予的权限只为常见设备喜欢/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
Run Code Online (Sandbox Code Playgroud)

c 189:* rwm装置- [R EAD瓦特仪式odify权限与类型(识别器)的任何字符设备189和任何亚型。您可以使用以下命令查找设备的类型和子类型file

$ file /dev/bus/usb/002/002
Run Code Online (Sandbox Code Playgroud)

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

如果您正在使用systemd-nspawn@.service或希望使用它保留权限,请创建

/etc/systemd/system/systemd-nspawn@.service.d/override.conf
Run Code Online (Sandbox Code Playgroud)

或者

/etc/systemd/system/systemd-nspawn@my_container.service.d/override.conf
Run Code Online (Sandbox Code Playgroud)

(取决于您是要从任何systemd-nspawn容器访问 USB还是仅从my_container相应的容器访问 USB )具有以下内容:

[Service]
DeviceAllow=char-usb_device rwm 
Run Code Online (Sandbox Code Playgroud)

usb_device是别名。您可以在/proc/devices.