Du multi­me­dia, partout, tout le temps !

Un peu d’his­toi­re…

Ah, il est bien loin le temps où la chaîne stéréo trônait fière­ment dans son coin, faisant la pluie et le beau temps sur la musique qu’on écou­tait dans tout l’ap­part. Pour les vidéos, c’était la télé (avec ou sans magné­to­scope). Le seul outil multi­mé­dia portable était le bala­deur, avec lequel on devait se trim­bal­ler autant de cassettes que d’al­bums !

On va faire court et dire que je suis passé direc­te­ment au pc et au bala­deur numé­rique (un archos 504 pour tout dire) sur lequel, oh miracle, je pouvais écou­ter de la musique, regar­der une vidéo et admi­rer des photos. Sa capa­cité de 80Go m’a bien faci­lité la vie pendant long­temps.

Mais je suis aujourd’­hui passé au smart­phone (HTC Incre­dible S), qui fait tout ce qu’un ordi fait ou peu s’en faut. Le seul hic, c’est sa capa­cité de 8Go…

Que faire ?

Conti­nuer à me trim­bal­ler mon vieil archos qui vieillit de plus en plus (c’est pas que le design, y a des GROS problèmes de stabi­lité et de batte­rie) ? Non ! En bon geek que je suis, j’ai trouvé la solu­tion : profi­ter de mon serveur dédié pour y poser les copies de mes cd et les écou­ter en strea­ming (c’est de la copie privée, c’est légal).

C’est pourquoi je vous présente Subso­nic ! Un logi­ciel libre (GPL) écrit en Java (il ne pouvait pas être vrai­ment parfait) et très simple d’em­ploi. Ce qui ne gâche rien, le site propose un paquet .deb.

Pourquoi ce serveur de strea­ming et pas un autre ?

Oh, j’en ai testé d’autres, mais j’avais un cahier des charges assez rigou­reux :

  • il fallait que le logi­ciel soit libre
  • il fallait que je puisse écou­ter ma musique depuis mon Android
  • il fallait que ce soit avec un méca­nisme d’au­then­ti­fi­ca­tion (si n’im­porte qui peut écou­ter mon flux, c’est de la diffu­sion non auto­risé d’œuvres proté­gées (en tout cas pour les 50% de mon cata­loque qui ne vient pas de Jamendo) et ça, ce n’est pas pur)
  • l’in­ter­face web est un plus !

J’ai donc testé Mpd (bien mais sans authen­ti­fi­ca­tion), Ampache (inter­fa­ce… euh… pas pratique DU TOUT à mon goût) et d’au­tres… J’ai même envi­sagé un serveur DLNA et un VPN, mais heureu­se­ment, j’ai trouvé Subso­nic avant de m’y mettre, et de toute façon les clients DLNA Android ne sont pas pratique, pas libre et/ou payants.

Vous instal­lez donc le paquet .deb de subso­nic et… c’est fini ! Vous pouvez toujours aller voir s’il y a des options inté­res­santes à instal­ler via subso­nic—­help mais ce n’est pas néces­saire pour que ça fonc­tionne.

L'interface web de Subsonic
L’in­ter­face web de Subso­nic

Pour sécu­ri­ser l’ap­pli (i.e. chan­ger le mot de passe admin), allez sur votre serveur sur le port 4040 (port par défaut), et suivez ce que vous dit le site. Vous pour­rez écou­ter votre musique via le site ou lire le flux contrôlé par le site avec Vlc par exemple. Le strea­ming de vidéos est sensé aussi fonc­tion­ner : je ne sais pas si c’est la faute de mon plugin flash tout caca (64 bits en béta depuis je sais pas quand, merci Adaube) ou si c’est le trans­co­dage qui échoue.

Le client Android s’ap­pelle tout simple­ment Subso­nic, et il existe d’autres clients pour les autres plate­formes.

Au bout de 30 jours, la possi­bi­lité de strea­mer vers les smart­phones sera suppri­mée, ainsi que d’autres petites feature, si vous n’ache­tez pas de licence. Mais 10€, c’est pas cher, et comme c’est un logi­ciel libre, vous pouvez toujours le forker.

Le lecteur de l'application Android de Subsonic
Le lecteur de l’ap­pli­ca­tion Android de Subso­nic

 

Et pour Mpd ?

Parce que Mpd est un compa­gnon de longue date qui ne m’a jamais fait défaut, même en ASRALL (sacré Marvin !), je voulais quand même en dire deux mots.

Pour ceux qui ne connaissent pas, Mpd veut dire Music Player Daemon, c’est à dire que vous n’avez pas d’in­ter­face au départ mais, ce qui est génial, c’est que du coup vous pouvez utili­ser une multi­tude de client, en CLI (ncmpcpp pour moi), en GUI (sonata, pour moi), en inter­face web, en local, via le réseau, mettre la sortie audio en local, sur un autre systè­me…

Le problème, c’est qu’une instance mpd ne lira qu’une seule play­list : il n’est pas possible pour deux personnes d’écou­ter deux pistes diffé­rentes.

Bonus : Mpd peut aussi faire office de serveur de strea­ming ! Et le client Android MpDroid permet de pilo­ter le daemon (pratique pour pas lever ses fesses pour chan­ger de musique) et de lire le strea­ming si la fonc­tion est acti­vée sur le serveur.

Et le DLNA dans tout ça ?

Le DLNA est une norme permet­tant de parta­ger des fichiers multi­mé­dias et de les exploi­ter sur un appa­reil idoine. En l’oc­cu­rence mon superbe lecteur DVD Bluray acheté à prix d’or grâce à mon salaire scan­da­leu­se­ment élevé de quand je bossais au Luxem­bourg (je dirais pas la marque, y a un boycott qui court en ce moment dessus que je respecte même si je ne vais pas jeter mon lecteur dvd, acheté avant le boycott).

En gros : j’ai mes vidéos de vacances sur le pc, mais la télé et le fauteuil, c’est plus sympa que l’écran plus petit et la chaise de bureau. Je pour­rais copier les fichiers sur un disque externe pour le bran­cher sur le lecteur DVD mais c’est fati­guant de se lever (les meilleurs infor­ma­ti­ciens sont feignants, je dois donc être TRÈS bon ;)) et en plus ça prend du temps.

Je lance donc un serveur DLNA sur mon ordi­na­teur (en ssh avec mon télé­phone et ConnectBot) et je n’ai plus qu’à allu­mer le lecteur DVD. Le DLNA permet aussi de parta­ger de la musique, pratique pour toute la famille !

Et ce serveur DLNA, c’est Cohe­rence, écrit en python et simple d’em­ploi. Un fichier de conf (il y a un exemple sur le site), on lance, c’est prêt. Le seul truc que j’ai confi­guré, c’est les réper­toires à parta­ger, c’est vous dire si c’est simple.

Il est dispo­nible dans les dépôts Debian et contrai­re­ment aux autres serveurs DLNA dans ces dépôts, il fonc­tionne !

# apt-get install python-coherence

Ce système souffre quand même d’une méchante limi­ta­tion, à savoir les codecs utili­sés pour la vidéo qui ne sont pas tous suppor­tés par le lecteur, mais c’est la faute du fabriquant, pas du serveur !

Lxc sur Debian

Les Linux contai­ners (lxc) sont une solu­tion d’iso­la­tion ou de virtua­li­sa­tion (selon l’uti­li­sa­tion) à l’ins­tar des Jails BSD. Contrai­re­ment à d’autres solu­tions simi­laires (vser­ver ou openvz) sous Linux, les lxc ne néces­sitent pas de patch du noyau car faisant direc­te­ment partie de la branche prin­ci­pale du déve­lop­pe­ment du noyau. Même si lxc est jeune (donc souf­frant d’un certain nombre de bugs), il s’agit d’une solu­tion déjà fonc­tion­nelle. Je vais décrire ici l’ins­tal­la­tion et la confi­gu­ra­tion de lxc sur une Debian Squeeze dispo­sant d’une seule inter­face avec une IP publique (comme sur un serveur dédié quoi).

Prépa­ra­tion du système

On installe d’abord lxc et deboots­trap :

# apt-get install lxc debootstrap

Il nous faudra aussi créer un bridge lié à une inter­face dummy :

# apt-get install bridge-utils
# modprobe dummy

Ensuite il faut créer un bridge. Ajou­tez ceci au fichier /etc/network/inter­faces :

auto br0
iface br0 inet static
    address 192.168.1.1
    netmask 255.255.255.0
    network 192.168.1.0
    broadcast 192.168.1.255
    bridge_ports dummy0
    bridge_fd 0
    bridge_maxwait 0
    pre-up /sbin/modprobe dummy

Pour char­ger cette nouvelle confi­gu­ra­tion :

# /etc/init.d/networking restart

Prépa­ra­tion des cgroups

Pas très compliqué :

# mkdir /cgroup
# echo "cgroup        /cgroup        cgroup        defaults    0    0" >> /etc/fstab
# mount cgroup

Véri­fi­ca­tion de la confi­gu­ra­tion de lxc

Cela se fait à l’aide de la commande lxc-check­con­fig :

$ lxc-checkconfig
Kernel config /proc/config.gz not found, looking in other places...
Found kernel config file /boot/config-2.6.32-5-amd64
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled

--- Control groups ---
Cgroup: enabled
Cgroup namespace: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: missing
Cgroup cpuset: enabled

--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
File capabilities: enabled

Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

Il est possible que vous n’ob­te­niez pas enabled sur la ligne File capa­bi­li­ties. Vous aurez alors besoin d’ins­tal­ler libcap2-bin :

# apt-get install libcap2-bin

Créa­tion d’un contai­ner

Le paquet lxc four­nit un moyen très simple de créer un contai­ner Debian via le script /usr/lib/lxc/templates/lxc-debian mais celui-ci ne four­nit qu’une debian lenny, sans comp­ter que son chemin d’ac­cès n’est pas très pratique. Donc :

# cp /usr/lib/lxc/templates/lxc-debian /usr/lib/lxc/templates/lxc-debian-squeeze
# ln -s /usr/lib/lxc/templates/lxc-debian-squeeze /usr/sbin/lxc-debian-squeeze

Ensuite vous éditez ce nouveau script et vous rempla­cez :

SUITE=${SUITE:-lenny}

par

SUITE=${SUITE:-squeeze}

et

dhcp3-client,\

par

isc-dhcp-client,\

Vous êtes libre d’ajou­ter les paquets que vous voulez avoir par défaut dans votre contai­ner dans la liste des paquets déjà présente (htop et multi­tail par exemple). Vous avez un réper­toire tout près à accueillir vos contai­ners mais le chemin n’est pas très pratique. Je vous conseille donc de faire :

# ln -s /var/lib/lxc /lxc

Créons un répér­toire qui contien­dra le contai­ner et celui-ci dans la foulée:

# mkdir /lxc/vm0
# lxc-debian-squeeze -p /lxc/vm0

Le réper­toire /lxc/vm0 contien­dra un fichier config et un réper­toire rootfs. Voici le contenu du fichier de confi­gu­ra­tion du contai­ner :

lxc.tty = 4
lxc.pts = 1024
lxc.rootfs = /var/lib/lxc/sql/rootfs
lxc.cgroup.devices.deny = a
# /dev/null and zero
lxc.cgroup.devices.allow = c 1:3 rwm
lxc.cgroup.devices.allow = c 1:5 rwm
# consoles
lxc.cgroup.devices.allow = c 5:1 rwm
lxc.cgroup.devices.allow = c 5:0 rwm
lxc.cgroup.devices.allow = c 4:0 rwm
lxc.cgroup.devices.allow = c 4:1 rwm
# /dev/{,u}random
lxc.cgroup.devices.allow = c 1:9 rwm
lxc.cgroup.devices.allow = c 1:8 rwm
lxc.cgroup.devices.allow = c 136:* rwm
lxc.cgroup.devices.allow = c 5:2 rwm
# rtc
lxc.cgroup.devices.allow = c 254:0 rwm

# mounts point
lxc.mount.entry=proc /var/lib/lxc/sql/rootfs/proc proc nodev,noexec,nosuid 0 0
lxc.mount.entry=devpts /var/lib/lxc/sql/rootfs/dev/pts devpts defaults 0 0
lxc.mount.entry=sysfs /var/lib/lxc/sql/rootfs/sys sysfs defaults  0 0

Ajou­tez ceci :

lxc.utsname = vm0
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
# lxc.network.name = eth0
lxc.network.hwaddr = 00:FF:12:34:56:02
lxc.network.ipv4 = 192.168.1.2

La ligne lxc.network.name est commen­tée car eth0 est la valeur par défaut de l’in­ter­face du contai­ner. Libre à vous de la modi­fier.

ATTENTION : pour que vos contai­ners soient en mesure de commu­niquer entre eux, prenez soin de chan­ger leur adresse mac virtuelle ! (ligne lxc.network.hwaddr)

Si vous n’avez pas de serveur dhcp et ne voulez pas vous embê­ter à en instal­ler un, allez dans le réper­toire rootfs et modi­fiez le fichier etc/network/inter­faces en remplaçant :

auto eth0
iface eth0 inet dhcp

par

auto eth0
iface eth0 inet static
    address 192.168.1.2
    netmask 255.255.225.0
    network 192.168.1.0
    broadcast 192.168.1.255

Ajou­tez ceci au fichier etc/rc.local (toujours dans /lxc/vm0/rootfs, hein !):

route add default gw 192.168.1.1

Se simpli­fier la vie

Vous pouvez télé­char­ger ma lxc-debian : elle est en squeeze et surtout elle permet de choi­sir l’adresse ip, l’adresse mac et le host­name du contai­ner et ça ajoute la route dans rc.local lors de sa créa­tion. Par contre je n’ai pas mis de sécu­rité si on ne précise pas ces para­mêtres et certaines ip sont en dur donc « bla bla bla logi­ciel fourni bla bla bla aucune garan­tie bla bla bla à vos risques et périls ».

Confi­gu­rer le fire­wall

Et oui, sans fire­wal­ling, vos contai­ners vont avoir du mal à commu­niquer avec inter­net ! (sauf si vous les avez direc­te­ment intê­grés à votre réseau local) :

# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

Voici deux options à chan­ger dans /etc/sysctl.conf :

net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.default.forwarding=1

Pour les prendre en compte :

# sysctl -p

C’est fini

Vous pouvez main­te­nant lancer vos contai­ners :

# lxc-start -n vm0 -d

Les stop­per :

# lxc-stop -n vm0

Savoir s’ils sont up ou down :

# lxc-info -n vm0

Y entrer (pour sortir, faites Ctrl+a q) :

# lxc-console -n vm0

Sources

http://blog.foaa.de/2010/05/lxc-on-debian-squeeze/ (c’est par là si vous voulez tuner vos lxc (mémoire, cpu, toussa))

http://www.nsnam.org/wiki/index.php/HOWTO_Use_Linux_Contai­ners_to_set_up_virtual_networks