У меня есть USB-камера /dev/video0
что я пытаюсь получить доступ перед пользователь входит в систему (если быть точным, у меня есть контейнер Azure IoT Edge, работающий на экземпляре Ubuntu 18.04, который должен работать в автономном режиме, и блок должен иметь возможность выключать и выключать питание без необходимости физического входа в систему каждый раз ).
Если я первый физически войдите в систему, 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
Добавление myuser к видео группа не работает (ACL в этом отношении кажутся сломанными в Ubuntu):
sudo usermod -a -G video myuser
Я пробовал все возможные варианты RE: groups, но без особого успеха. Похоже, мне действительно нужно автоматически добавлять myuser
в ACL для /dev/video0
когда запускается Ubuntu, но я не уверен, как это сделать. Любые идеи?
Чтобы быть предельно точным, вам нужно запустить это до того, как Docker запустит ваш контейнер.
Таким образом, вы можете добавить модуль Docker systemd, чтобы запускать все, что вы хотите, до запуска Docker.
Например, я бы создал такой системный drop-in:
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 заранее будет запущена указанная команда.