Univers Libre

Ajout d'une carte son à chaud dans un conteneur LXC

Written on 21 January 2014, 21:02 EST
Tags: alsa, cgroup, lxc, sysadmin.

Voici un article express pour rajouter une carte son dans un conteneur LXC, plus un aide-mémoire en fait, car c'est pas le genre de chose que je fais tous les 4 matins.

  1. Brancher la carte son à la machine hôte. Dans mon cas une carte USB, si c'est en PCI, la procédure n'a que peu d'intérêt puisqu'il faudra dans tout les cas redémarrer.
  2. le kernel doit la détecter et créer des fichiers spéciaux de type caractère dans /dev/snd :

    # ls -l /dev/snd/
    total 0
    drwxr-xr-x 2 root root       60 Jan 21 19:44 by-id
    drwxr-xr-x 2 root root       60 Jan 21 19:44 by-path
    crw-rw---T 1 root audio 116,  4 Jan 21 19:44 controlC0
    crw-rw---T 1 root audio 116,  3 Jan 21 19:44 pcmC0D0c
    crw-rw---T 1 root audio 116,  2 Jan 21 19:44 pcmC0D0p
    crw------T 1 root root  116,  1 Dec 17 09:24 seq
    crw-rw---T 1 root audio 116, 33 Dec 17 09:24 timer
    

    Notez le numéro majeur et mineur de chaque pseudo fichier (dans mon cas 116 et de 1 à 4 et 33).

  3. Ajoutez les autorisations nécessaires dans votre conf LXC pour le conteneur en question :

    # /dev/snd/*
    lxc.cgroup.devices.allow                = c 116:4 rwm
    lxc.cgroup.devices.allow                = c 116:3 rwm
    lxc.cgroup.devices.allow                = c 116:2 rwm
    lxc.cgroup.devices.allow                = c 116:1 rwm
    lxc.cgroup.devices.allow                = c 116:33 rwm
    

    Adaptez bien sûr avec les bons numéro majeurs et mineurs.

  4. À ce stade, il faut redémarrer le conteneur pour que les nouveaux cgroups s'appliquent. Comme j'avais pas envie de faire ça et que les cgroups cesttropbien, On va appliquer les nouvelles règles à chaud via son pseudo système de fichier :

    # cat >/sys/fs/cgroup/lxc/<nom du conteneur>/devices.allow
    c 116:4 rwm
    c 116:3 rwm
    c 116:2 rwm
    c 116:1 rwm
    c 116:33 rwm
    ^D
    
  5. Maintenant, on peut créer manuellement les pseudo fichiers dans le conteneur :

    # mkdir /dev/snd; cd /dev/snd
    # mknod controlC0 c 116 4
    # mknod pcmC0D0c c 116 3
    # mknod pcmC0D0p c 116 2
    # mknod seq c 116 1
    # mknod timer c 116 33
    # chgrp audio controlC0 pcm* timer
    # chmod 1660 controlC0 pcm* timer
    # chmod 600 seq
    

    Et ajoutez vous dans le groupe audio si besoin.

  6. Installer alsa-utils puis :

    $ alsactl init
    

    Votre carte devrait à présent être détectée, vous pouvez vérifier que tout fonctionne avec un speaker-test.

Et voila.

Bon c'est pas tout ça, allons mettre à jour le kernel et rebooter :-).