我有一个 USB 网络摄像头/dev/video0
,正在尝试访问前用户登录(准确地说,我有一个在 Ubuntu 18.04 实例上运行的 Azure IoT Edge 容器,它需要在无头模式下运行,并且该盒子需要能够进行电源循环,而无需每次都有人物理登录)。
如果我第一的物理登录到盒子上,ACL 已正确设置/dev/video0
,并且我的容器(在下运行myuser
)可以顺利访问/dev/video0
:
myuser@myuser-UBUNTU:~$ sudo getfacl /dev/video0
getfacl: Removing leading '/' from absolute path names
# file: dev/video0
# owner: root
# group: video
user::rw-
user:myuser:rw-
group::rw-
mask::rw-
other::---
但是如果我没有物理登录该机器(例如,在重启之后),我的用户帐户(myuser
)就永远不会获得 ACL 访问权限/dev/video0
(相反,是gdm
用户自己获得访问权限)。
myuser@myuser-UBUNTU:~$ sudo getfacl /dev/video0
getfacl: Removing leading '/' from absolute path names
# file: dev/video0
# owner: root
# group: video
user::rw-
user:gdm:rw-
group::rw-
mask::rw-
other::---
我 99% 确定这是一个 ACL 问题,因为当我通过 ssh 进入该框时(前在我尝试了 之后,我尝试了 (物理登录),并手动将其添加myuser
到 的 ACL 列表中/dev/video0
,我的容器就可以再次愉快地访问了/dev/video0
。
我的问题:我如何确保在启动时、/dev/video0
安装时自动发生以下情况:
sudo setfacl -m u:myuser:rw /dev/video0
添加我的用户到视频团体不起作用(在这方面,Ubuntu 上的 ACL 似乎被破坏了):
sudo usermod -a -G video myuser
我尝试了所有我能想到的关于 RE: 组的变化,但没有任何影响。看来我真的需要myuser
在 Ubuntu 启动时自动添加到 ACL /dev/video0
,但我不确定如何做到这一点。有什么想法吗?
答案1
非常准确地说,您需要在 Docker 启动容器之前启动它。
因此,您可以为 Docker systemd 单元添加一个插件,以便在 Docker 启动之前运行您想要的任何内容。
例如,我将创建一个如下的 systemd 插件:
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/video-permissions.conf <<EOF
[Service]
ExecStartPre=/usr/bin/setfacl -m u:myuser:rw /dev/video0
EOF
此时,无论何时 Docker 启动,都会预先运行指示的命令。