null

Дружим PulseAudio с Windows 10 в QEMU/KVM


​​​​​В процессе сборки виртуальной машины для игрового времяпрепровождения на Windows 10, столкнулся с проблемой со звуком - его просто не было.

​​​​​​​Проблема затронула протоколы: SPICE, VNC, RDP.

Задача: необходима трансляция звука из Windows домена средствами PulseAudio на основной KVM хост.
​​​​​​​Добавленные ICH6 и ICH9 устройства через virt-manager не работают.

В главных ролях:

KVM host:

$ uname -r
5.4.0-92-generic

$ pulseaudio --version 
pulseaudio 13.99.1

$ /usr/bin/qemu-system-x86_64 --version
QEMU emulator version 4.2.1 

Guest OS: 

Windows 10 Pro 21H2 19044.1415

Решение:

​​​​​​​Редактируем конфиг виртуальной машины:

virsh edit <domain name>

​​​​​​​<domain name> - имя домена виртуальной машины.

Меняем:

<domain type='kvm'>

на

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>

Добавляем в конце конфига перед </devices>:

<qemu:commandline>
  <qemu:arg value='-device'/>
  <qemu:arg value='ich9-intel-hda,bus=pcie.0,addr=0x1b'/>
  <qemu:arg value='-device'/>
  <qemu:arg value='hda-micro,audiodev=hda'/>
  <qemu:arg value='-audiodev'/>
  <qemu:arg value='pa,id=hda,server=unix:/run/user/1000/pulse/native'/>
</qemu:commandline>

Где 1000 ​​​​​​​в 7 строке - uid вашего пользователя в системе (можно узнать с помощью команды "id").

Важно чтобы <devices> и <qemu:commandline> (аналогично </devices> и </qemu:commandline>)​​​​​​​ имели одинаковый отступ.

Удаляем все звуковые устройства из конфига, пример строк для удаления:

<sound model="ich9">
  <address type="pci" domain="0x0000" bus="0x00" slot="0x1b" function="0x0"/>
</sound>

Либо удаляем с помощью "virt-manager":
​​​​​​​
​​​​​​

Далее добавляем следующие строчки в /etc/apparmor.d/abstractions/libvirt-qemu:

/etc/pulse/client.conf.d/ r,
/etc/pulse/client.conf.d/* r,
/run/user/1000/pulse/native rw,
/home/<USERNAME>/.config/pulse/* r,
/home/<USERNAME>/.config/pulse/cookie k,

1000 - uid вашего пользователя в системе (можно узнать с помощью команды "id"), <USERNAME> - имя пользователя в системе.

Перезагружаем систему и проверяем звук в гостевой ОС.


​​​​​​​