QemuがオーディオXMLの設定を許可しないのはなぜですか?

QemuがオーディオXMLの設定を許可しないのはなぜですか?

audiodevを仮想マシンに渡したいのですが、libvirtはこのエラーで終了します。

error: internal error: process exited while connecting to monitor: 2024-03-17T23:29:37.725695Z qemu-system-x86_64: XDG_RUNTIME_DIR not set

これはvmの行です。

<qemu:arg value="-device"/>
<qemu:arg value="usb-audio,audiodev=my_audiodev"/>
<qemu:arg value="-audiodev"/>
<qemu:arg value="pa,id=my_audiodev"/>

XMLにサウンドカードを直接挿入することが可能であることを知っていますが、なぜこのエラーが発生するのかを知りたいと思い、「virtio-sound」も試してみたいと思います。

<qemu:arg value="-device"/>
<qemu:arg value="virtio-sound,audiodev=my_audiodev"/>
<qemu:arg value="-audiodev"/>
<qemu:arg value="pa,id=my_audiodev"/>

もちろん、この行がないと仮想マシンが実行されます。

qemuバージョンは8.2.2、libvirtバージョンは10.0.0、システムはSlackware 15です。

pulseaudioを使用するqemuでエラーが発生します。

qemu-system-x86_64 -audiodev pa,id=hda,out.mixing-engine=off -audiodev pa,id=usb,out.mixing-engine=off 
qemu-system-x86_64: XDG_RUNTIME_DIR not set

xdg-runtime-dirを設定してみてください。

export XDG_RUNTIME_DIR=$TMPDIR
qemu-system-x86_64 -device usb-audio -audiodev alsa,id=hda,out.mixing-engine=off -audiodev pa,id=usb,out.mixing-engine=off 
qemu-system-x86_64: could not stat pidfile /pulse/pid: No such file or directory

答え1

解決策が見つかり、qemuで動作します。

XDG_RUNTIME_DIRの使用

mkdir /tmp/pulse
XDG_RUNTIME_DIR=/tmp/pulse pulseaudio -D
qemu-system-x86_64 -device usb-audio -audiodev pa,id=hda,out.mixing-engine=off -audiodev pa,id=usb,out.mixing-engine=off 

XDG_RUNTIME_DIRなし

qemu-system-x86_64 -device usb-audio -audiodev pa,id=hda,out.mixing-engine=off -audiodev pa,id=usb,server=unix:/tmp/pulse-socket

libvirtに関する別の質問(xdg_runtime_dirを使用)は別のユーザー(qemu)で実行されるため、qemuユーザーとサウンドを共有する方法を見つける必要があります。

error: internal error: process exited while connecting to monitor: 2024-03-17T23:56:30.886989Z qemu-system-x86_64: could not stat pidfile /tmp/pulse/pulse/pid: Permission denied

libvirtのソリューションも見つかりました(この場合、xdg_runtimeは役に立ちません)。

<qemu:arg value="-device"/>
    <qemu:arg value="usb-audio,audiodev=my_audiodev"/>
    <qemu:arg value="-audiodev"/>
    <qemu:arg value="pa,id=my_audiodev,server=unix:/tmp/pulse-socket"/>

default_paから

パワー $HOME/.config/pulse/default_pa

load-module module-native-protocol-unix auth-anonymous=1 socket=/tmp/pulse-socket
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.2;192.168.0.10

この設定を使用すると、他のユーザーがIPベースのACLを使用して認証なしで音声を使用して聞くことができます(100%安全ではありませんが、家庭用には問題ありません)。

関連情報