Il y a deux ans, j'ai fait un article pour installer une jukebox sous Linux. J'avais présenté comment faire fonctionner Pulseaudio. Ca fonctionnait, mais de façon bien peu optimale.
Pulseaudio par défaut attend une activation par un socket. Quand il n'y a rien, pulseaudio se désactive.
Sous Fedora le socket est dans /usr/lib/systemd/user/pulseaudio.socket
avec le code suivant:
[Unit]
Description=Sound System
ConditionUser=!root
[Socket]
Priority=6
Backlog=5
ListenStream=%t/pulse/native
[Install]
WantedBy=sockets.target
Il écoute dans /run/pulse/native
et ne doit pas être lancer en root. Il se charge ensuite de demmarer pulseaudio via son service dans pulseaudio.service
Sur un ordinateur avec une interface graphique, l'interface graphique se charge de la besogne. Elle démarre une instance de systemd en tant que l'utilisateur qui lance l'interface graphique avec systemd --user
, puis active le socket.
Sur un serveur on pourrait faire la même chose. Mais quels sont nos alternatives ?
Pulseaudio en mode 'system' lancé en root (mauvaise idée)
De nombreux articles proposent de lancer Pulseaudio avec l'option --system
. Ça permet de sauter ce problème d'utilisateur et de socket.
Pourquoi c'est pas terrible ?
- Déjà, ca demande de lancer Pulseaudio avec les droits root (en réalité, ca dure pas longtemps, pulseaudio se fork avec son propre utilisateur), c'est déconseillé dans la doc.
- Et par sécurité, pulseaudio va désactiver plein de plugins, l'expérience risque de pas être optimal.
Par contre, un avantage est de pouvoir utiliser Pulseaudio avec plusieurs utilisateurs à la fois.
Lancer pulseaudio en tant qu'un utilisateur pré-définie
Au lieu qu'une interface graphique se charge de lancer Pulseaudio, on va configurer le socket pour qu'il se lance seul au démarrage, avec l'utilisateur mopidy.
cp /usr/lib/systemd/user/pulseaudio.service /etc/systemd/system/pulseaudio.service
cp /usr/lib/systemd/user/pulseaudio.socket /etc/systemd/system/pulseaudio.socket
on va éditer /etc/systemd/system/pulseaudio.socket
en enlevant le ConditionUser=!root
et en ajoutant SocketUser=mopidy
.
on va faire la même chose pour le service /etc/systemd/system/pulseaudio.service
, on enlève ConditionUser=!root
et on ajoute User=mopidy
.
on désactive l'ancienne configuration:
systemctl --global disable pulseaudio.service pulseaudio.socket
On active la nouvelle:
systemctl enable pulseaudio.socket
Voila ! Vous avez une installation propre de Pulseaudio sur votre serveur. Vous ne pouvez par contre jouer du son que avec l'utilsateur mopidy (à vérifier), ce qui peut être limitant.