无法以非根用户身份打开 docker 容器中的 vfio 设备
Cannot open vfio device in docker container as non-root user
我在 BIOS 中启用了虚拟化并在内核命令行上启用了 IOMMU (intel_iommu=on)。
我将 solarflare NIC 绑定到 vfio-pci 设备并添加了一个 udev 规则以确保我的非 root 用户可以访问 vfio 设备(例如,/etc/udev/rules.d/10-vfio-docker-users.rules ):
SUBSYSTEM=="vfio", OWNER="myuser", GROUP=="myuser"
我已经使用 -u 1000
启动了我的容器并映射了 /dev (-v /dev:/dev
)。 运行 在容器中的交互式 shell 中,我能够验证设备是否存在并具有我的 udev 规则设置的权限:
bash-4.2$ whoami
whoami: unknown uid 1000
bash-4.2$ ls -al /dev/vfio/35
crw-rw---- 1 1000 1000 236, 0 Jan 25 00:23 /dev/vfio/35
但是,如果我尝试打开它(例如,python -c "open('/dev/vfio/35', 'rb')"
,我会得到 IOError: [Errno 1] Operation not permitted: '/dev/vfio/35'
。但是,与用户 ID 为 1000 的普通非 root 用户相同的命令在容器外工作!
似乎有额外的安全措施不允许我访问容器内的 vfio 设备。我错过了什么?
Docker 默认放弃一些权限,包括访问大多数设备的能力。您可以使用 --device
标志显式授予对设备的访问权限,类似于:
docker run --device /dev/vfio/35 ...
或者,您可以要求 Docker 不要放弃任何特权:
docker run --privileged ...
您会注意到,在上述两个示例中,都没有必要显式 bind-mount /dev
;在第一种情况下,您使用 --device
公开的设备将会显示,在第二种情况下,您默认会看到主机的 /dev
。
我在 BIOS 中启用了虚拟化并在内核命令行上启用了 IOMMU (intel_iommu=on)。
我将 solarflare NIC 绑定到 vfio-pci 设备并添加了一个 udev 规则以确保我的非 root 用户可以访问 vfio 设备(例如,/etc/udev/rules.d/10-vfio-docker-users.rules ):
SUBSYSTEM=="vfio", OWNER="myuser", GROUP=="myuser"
我已经使用 -u 1000
启动了我的容器并映射了 /dev (-v /dev:/dev
)。 运行 在容器中的交互式 shell 中,我能够验证设备是否存在并具有我的 udev 规则设置的权限:
bash-4.2$ whoami
whoami: unknown uid 1000
bash-4.2$ ls -al /dev/vfio/35
crw-rw---- 1 1000 1000 236, 0 Jan 25 00:23 /dev/vfio/35
但是,如果我尝试打开它(例如,python -c "open('/dev/vfio/35', 'rb')"
,我会得到 IOError: [Errno 1] Operation not permitted: '/dev/vfio/35'
。但是,与用户 ID 为 1000 的普通非 root 用户相同的命令在容器外工作!
似乎有额外的安全措施不允许我访问容器内的 vfio 设备。我错过了什么?
Docker 默认放弃一些权限,包括访问大多数设备的能力。您可以使用 --device
标志显式授予对设备的访问权限,类似于:
docker run --device /dev/vfio/35 ...
或者,您可以要求 Docker 不要放弃任何特权:
docker run --privileged ...
您会注意到,在上述两个示例中,都没有必要显式 bind-mount /dev
;在第一种情况下,您使用 --device
公开的设备将会显示,在第二种情况下,您默认会看到主机的 /dev
。