Starten Sie eine gefälschte / minimale X-Sitzung für Pulseaudio / dbus

12

Ich verwende Pulseaudio, um Audio zwischen einem Desktop und einem Raspberry Pi zu teilen.

Pulseaudio benötigt jedoch dbus und dbus benötigt eine X-Sitzung. Ohne grafische Sitzung kann Pulseaudio nur im Systemmodus ausgeführt werden, der offiziell nicht empfohlen wird.

Abgesehen von einem Himbeer-Pi sind die Kosten für eine X-Sitzung dramatisch hoch, daher möchte ich sie auf die effizienteste (kostengünstigste) Weise loswerden.

Wie kann ich die kleinste X-Sitzung starten, in die Pulseaudio eintreten soll?

kursus
quelle
Udev braucht definitiv kein X. Ich weiß nicht, was Pulseaudio ist: Was schlägt fehl, wenn X fehlt? Steht dies im Zusammenhang mit D-Bus?
Gilles 'SO- hör auf böse zu sein'
Naja das habe ich gelesen aber es könnte nur Pulseaudio sein. In Abwesenheit von X wird Pulseaudio im systemweiten Modus gestartet, was bedeutet, dass keine Sitzung pro Benutzer stattfindet, was
laut
Sorry, ich habe udev und dbus gemischt, bearbeitet.
kursus

Antworten:

11

Sie können Xvfb verwenden , einen X-Server mit einem virtuellen Framebuffer, dh einen X-Server, der nur im Arbeitsspeicher angezeigt wird und keine Verbindung zu Hardware herstellt. Sie müssen auf diesem Server keinen Client ausführen, den Sie nicht möchten, insbesondere keine Desktop-Umgebung oder keinen Fenstermanager.

Xvfb :1 -screen 0 1x1x8 &

Danach:

DISPLAY=:1 dbus-launch
DISPLAY=:1 pulseaudio --start

Nach dem Start müssen Sie etwas warten, bis Xvfbdas Display verfügbar ist. Mit können Sie xiniteinen X-Server starten und dann Clients starten, wenn dieser bereit ist. Fügen Sie die Befehle, die Sie ausführen möchten, in ein Skript ein (beachten Sie, dass der X-Server beim Beenden des Skripts beendet wird):

#!/bin/sh
dbus-launch
pulseaudio --start
sleep 99999999

Starten Sie den virtuellen X-Server mit

xinit /path/to/client.script -- /usr/bin/Xvfb :1 -screen 0 1x1x8

Wenn Sie es beim Booten ausführen möchten, können Sie es von cron aus starten. Führen Sie crontab -e(als Benutzer, nicht als Root) und fügen Sie die Zeile hinzu

@reboot xinit /path/to/client.script -- Xvfb :1 -screen 0 1x1x8

Wenn Sie diese Sitzung beenden möchten, beenden Sie den xinitProzess.

Gilles 'SO - hör auf böse zu sein'
quelle
Es tut mir leid, dass ich Schwierigkeiten habe, den Befehl pulseaudio start (4. Zeile Ihres Beispiels) beim Booten automatisch auszuführen. Ich frage mich, ob es die DISPLAY-Eigenschaft ist. Ich habe rc.local, /etc/init.d, rcS ausprobiert, aber das Skript startet niemals pulseaudio. Wenn ich mein Skript über SSH starte, funktioniert es einwandfrei. Ich würde mich freuen, wenn Sie beraten könnten.
kursus
Xvfb muss einige Einstellungen vornehmen, bevor es X-Verbindungen akzeptieren kann. Wenn die späteren Befehle also zu früh ausgeführt werden, können Sie möglicherweise feststellen, dass keine Verbindung zum X-Server hergestellt werden kann. Möglicherweise möchten Sie xinit zum Starten von Xvfb verwenden und diese Befehle in .xinitrc einfügen, sodass xinit sie erst startet, wenn Xvfb für sie bereit ist.
Alanc
Es tut mir leid, dass ich dich nicht gesund bekommen habe. Muss ich Xvfb mit .xinitrc starten? Im Moment wird es mit rc.local gestartet. Wenn ja, wo lege ich den PA-Befehl ab? Ich habe versucht, den PA-Befehl in .xinitrc zu starten, aber leider fehlt mir etwas.
kursus
@kursus Sie müssen alle diese Befehle als Benutzer ausführen. Sie können es von einem crontab mit tun @reboot. Auch alanc hat recht, es muss eine Verzögerung nach dem Start von Xvfb geben, und xinit löst dieses Problem. Siehe meine Bearbeitung.
Gilles 'SO- hör auf böse zu sein'
Vielen Dank für die Bearbeitung, es ist jetzt klarer. Ich erhalte jedoch eine nicht erkannte Option: Xvfb beim Starten des Befehls xinit mit oder ohne Skriptaufruf.
kursus
1

Ich hatte gestern das gleiche Problem, mit Pulse Audio für Raspberrypi 0 W mit DBus in einer Umgebung ohne Kopf erstellen mit Yocto ohne X11 und ohne Systemd, müssen Sie Dbus ausführen und exportieren, bevor Sie Pulseaudio ausführen.

if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then
     echo "Starting dbus" 
     export $(dbus-launch)
fi

Aktivieren Sie in der Datei etc / pulse / client.conf die Option allow-autospawn-for-root = yes

Führen pulseaudio -vSie den Befehl aus, um zu überprüfen, ob in Ihrer Konfiguration ein anderes Problem vorliegt. Verwenden Sie den --systemSchalter nicht , da er nicht korrekt ist.

pulseaudio -D --disallow-exit
Drl Sherif Omran
quelle
0

Es gibt eine elegantere Methode, um zu verhindern, dass das Skript EOF erreicht, als mit sleep 99999999!

Verwenden Sie sleep infinitystattdessen. Es macht was es sagt ...

Jost
quelle