Forum Linux.debian/ubuntu Utilisation d'un dongle USB DVB depuis un conteneur LXC unprivilegied

Posté par  . Licence CC By‑SA.
1
7
avr.
2024

Sommaire

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?

  • # regarder comment font les autres ?

    Posté par  . Évalué à 4. Dernière modification le 07 avril 2024 à 19:24.

    je dirais qu'il y a des bons tutos pour d'autres outils qui se servent aussi de LXC.

    Proxmox par exemple a un wiki qui explique comment faire le passtrhough (passer du matos physique à une VM/CT en direct) ?

    et c'est plutot simple

    pour le PCIe et la carte graphique c'est un peu plus compliqué,
    mais en gros il faut faire sauter le pilote du linux physique, pour pouvoir mapper le device dans la VM/CT, sinon le device est deja utilisé

    dans mon cas j'ai fini par mapper le device PCI qui gere un groupe de port USB de la machine physique (merci DMESG qui te dit sur quel PCI/USB tu branches un truc)

    ainsi tout le port PCI/USB est map dans la VM/CT, et j'y branches ce que je veux, clavier, souris, usb key, DVB=T, etc)

    j'ai pas la machine allumée pour l'instant, mais je pourrais aller voir comment ca se traduit dans les fichiers de config

    et une fois cela fait, dans le CT? il faut gerer comme si c'etait une machine phhysique, donc si les tutos disent qu'il faut que le user soit dans le groupe "video" alors il faut le mettre dans le groupe video, dans le CT evidemment puisque le dongle n'est pas vu, pas géré par la machine physique.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.