URL: https://linuxfr.org/forums/linux-debian-ubuntu/posts/utilisation-d-un-dongle-usb-dvb-depuis-un-conteneur-lxc-unprivilegied Title: Utilisation d'un dongle USB DVB depuis un conteneur LXC unprivilegied Authors: ROUGEXIII Date: 2024年04月07日T11:06:12+02:00 License: CC By-SA Tags: lxc, dvb, vdr, conteneur, mapping, permission et udev Score: 1 Bonjour, Après avoir buté sur le sujet je l'avais mis de côté, le temps est venu de refaire une tentative: Utiliser un dongle usb DVB depuis un conteneur LXC **unprivilegied**. _--Disclaimer: J'ai tenté de regrouper toutes les tentatives et les résultats associés, mais cela s'est déroulé sur une longue période. Aussi,toutes les commandes exécutées sur l'hôte et les résultats associés sont retapés à la main. Il peut donc y avoir des coquilles. Je m'excuse d'avance si c'est le cas--_ 1. Le postulat de départ ======================== L'hôte et le conteneur sont sur debian (bullseye pour l'hôte bullseye puis bookworm pour le conteneur). LXC est utilisé nu (sans promox ou lxd ou autre), le conteneur est démarré via la commande `lxc-unpriv-start -n mycontainername`. Sur l'**hôte** depuis l'user non root: ``` lsusb Bus 001 Device 048: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T ``` ``` ls -al /dev/bus/usb/001/048 crw-rw-rw- 1 root root 189, 47 5 Avril 20:20 /dev/bus/usb/001/048 ``` ``` ls -al /dev/dvb drwxr-xr-x 2 root root 120 5 Avril 20:21 adapter0 ``` ``` ls -al /dev/dvb/adapter0 crw-rw----+ 1 root video 212, 0 6 Avril 20:22 demux0 crw-rw----+ 1 root video 212, 1 6 Avril 20:22 dvr0 crw-rw----+ 1 root video 212, 3 6 Avril 20:22 frontend0 crw-rw----+ 1 root video 212, 2 6 Avril 20:22 net0 ``` (la partie qui nous intéresse seulement): ``` cat /etc/group video:x:44:monusernonroot monusernonroot:x:1000: ``` La config du conteneur LXC unprivilegied (concernant les groupes): ``` lxc.idmap = u 0 100000 65536 lxc.idmap = g 0 100000 65536 ``` Depuis le conteneur LXC en utilisateur non root: (la partie qui nous intéresse seulement): ``` cat /etc/group video:x:44: monusernonroot:x:1000: ``` Évidemment sans configuration particulière, dans le conteneur, `/dev/dvb/` et `/dev/usb/` n'existent pas. Seul `lsbusb` fait apparaître le dongle USB en question. 2. Premiers essais de Passthrought du dongle USB ================================================ Sur l'**hôte** depuis l'user non root: La config du conteneur (la partie qui nous intéresse seulement): ``` nano /home/mynonrootusername/.local/share/lxc/mycontainername/config lxc.idmap = u 0 100000 65536 lxc.idmap = g 0 100000 65536 lxc.cgroup.devices.allow = c 212:* rwm lxc.mount.entry = /dev/dvb dev/dvb none bind,optional,create=dir ``` J'ai également essayé ceci mais je pense que ce n'est pas nécessaire: ``` lxc.cgroup.devices.allow = c 189:* rwm lxc.mount.entry = /dev/bus/usb/001/048 dev/bus/usb/001/048 none bind,optional,create=file ``` Depuis le conteneur LXC en utilisateur non root: ``` ls -al /dev/dvb/ drwxr-xr-x 2 nobody nogroup 120 Apr 6 16:47 adapter0 ``` ``` ls -al /dev/dvb/adapter0/ crw-rw----+ 1 nobody nogroup 212, 0 Apr 6 16:47 demux0 crw-rw----+ 1 nobody nogroup 212, 1 Apr 6 16:47 dvr0 crw-rw----+ 1 nobody nogroup 212, 3 Apr 6 16:47 frontend0 crw-rw----+ 1 nobody nogroup 212, 2 Apr 6 16:47 net0 ``` ``` cat /etc/group | grep video video:x:44: ``` Évidement avec `nobody` et `nogroup` il n'est pas possible d'utiliser le dongle que ce soit avec l'user non root ou avec l'utilisateur root du conteneur. ```FATAL: ***** NO USEABLE TERRESTRIAL CARD FOUND. *****``` 3. Essais avec modifications provisoires pour tests ==================================== Je confirme c'est bien un problème de permissions: En root sur l'hôte j'ai fait : ``` chown 100000:100000 /dev/dvb/adapter0/demux0 chown 100000:100000 /dev/dvb/adapter0/dvr0 chown 100000:100000 /dev/dvb/adapter0/frontend0 chown 100000:100000 /dev/dvb/adapter0/net0 ``` Et là ça se met à fonctionner dans le conteneur LXC unprivilegied mais seulement si j'utilise sudo pour utiliser le dongle. Même constat lorsque je fais un ``` chown 100000:100044 -R /dev/dvb ``` Du coup à partir de là si dans le conteneur LXC unprivilegied, je fais un ajout de l'utilisateur non root au groupe video: ``` sudo adduser $USER video ``` Cela fonctionne sans sudo. Bon par contre je suppose que ce n'est pas la bonne méthode. 4. Essais de mappage du groupe video ==================================== Sur l'hôte dans la conf du conteneur LXC j'ai ajouté le mappage du groupe video : ``` lxc.idmap = g 0 100000 44 lxc.idmap = g 44 44 1 lxc.idmap = g 45 100045 65491 ``` Mais je me prends un `newidmap gid range 44-45 not allowed` au démarrage du conteneur LXC unprivilegied Si j'ai bien compris il faut que j'ajoute un `root:44:1` au fichier `/etc/subgid` en root de l’hôte => **4A)** Ai besoin de faire cela et pourquoi? => **4B)** Est-ce que cela risque de créer une possibilité d'accès au root de la machine depuis l’intérieur du conteneur? => **4C)** J'ai toujours la même erreur, est-ce qu'une commande doit être lancée pour que la modif soit prise en compte? (je me suis contenté de fermer et rouvrir la session) => **4D)** au lieu de root il ne faudrait pas plutôt mettre le nom de l'user non root qui lance le conteneur LXC? 5. Essais de création d'une règle udev ====================== J'avais également fait des essais avec des règles udev, mais je ne sais plus ni pourquoi ni comment: Les différentes configs que j'avais testé: ``` SUBSYSTEM=="usb",ATTRS{idProduct}=="0bda",ATTRS{idProduct}=="2838",MODE="0666",OWNER:="root", GROUP:="video" SUBSYSTEM=="usb",ATTRS{idProduct}=="0bda",ATTRS{idProduct}=="2838",MODE="0666",SYMLINK+="rtl_sdr" SUBSYSTEM=="usb",ATTRS{idProduct}=="0bda",ATTRS{idProduct}=="2838",GROUP="monusernonroot",MODE="0666",SYMLINK+="rtl_sdr" SUBSYSTEM=="usb",ATTRS{idProduct}=="0bda",ATTRS{idProduct}=="2838",OWNER="monusernonroot",MODE="0666",SYMLINK+="rtl_sdr" KERNEL=="demux0",NAME"adapter00/demux0",GROUP="monusernonroot",MODE="0666" ``` (_je m’aperçois au passage que j'avais sûrement fait des erreur de syntaxe:_ `=` _au lieu de_ `:=` ) => **5A)** Est-ce qu'il faut faire quelque-chose avec ces règles udev? => **5B)** Quel est le principe? 6. Autres questions ====================== => **6A)** Est-ce qu'il faudrait que je créer un autre user video dédié au conteneur LXC unprivilegied? Genre:`video-lxc:x:44:100044:` => **6B)** Est-ce qu'il faut juste ajouter l'utilisateur non root au groupe `video`? Sur l'hôte ou dans le conteneur? => **6C)** Une autre approche? => **6D)** Hors sujet: Tous mes conteneurs utilisent la même configuration pour le mappage de l'user non root, est-ce une erreur? Quel sont les risques? Quelle est la bonne méthode?