libvirt: настройка гостя для общего доступа к звуку хоста
В последние дни я пытался смешать аудио 64-битной виртуальной машины Windows 8.1 с аудио хоста с переменным успехом.
Решение, которое работает сейчас для меня, заключается в использовании Spice для аудио и ICH6 в качестве настройки для звуковой карты, но из-за известной ошибки в Spice, о которой я мог только обнаружить, сообщаемой для Fedora и Red Hat, звук довольно плохой и единственный частичный обходной путь должен поставить <playback compression='off'/>
в моей конфигурации домена VM. Под частичным я подразумеваю, что качество звука становится несколько пригодным для использования, но в аудио все еще есть глюки, на что некоторые пользователи также указывали в сообщениях об ошибках выше.
Я также пытался использовать VNC вместо Spice, но клиент не поддерживает звук. После этого сообщения об ошибке я понял, что аудио можно отправлять через обычные бэкэнды, если клиент VNC не поддерживает его, изменив пользователя и группу, под которой виртуальная машина работает под моим текущим пользователем, и добавив настройку VNC в /etc/libvirt/qemu.conf
вот так:
vnc_allow_host_audio = 1
user = "yourusernamehere"
group = "yourusernamehere"
но и делает моего пользователя частью kvm
& libvirtd
группы и, кроме того, добавив эту строку в /etc/default/libvirt-bin
:
export QEMU_AUDIO_DRV=pa
Выполнение этого дало мне желаемый эффект, и гостевой звук работал бы гладко, но основной звук не работал, пока я не закрыл бы гостя. Глядя на процессы хоста, я заметил, что libvirt породила другой экземпляр Pulseaudio под моим текущим пользователем (фактически имея 2 экземпляра Pulseaudio) вместо использования уже доступного экземпляра.
После еще немного поиска в Google я обнаружил, что pulseaudio может делиться своим звуком с другими пользователями, если module-native-protocol-tcp
был включен. К сожалению, здесь я перестал находить полезную информацию. В каждой статье, в которой объясняется, как включить эту функцию, предлагается запуск Pulseaudio в системном режиме, что, очевидно, является проблемой безопасности, но также может привести к тому, что мои виджеты импульсного звука в Plasma5 не будут работать должным образом. Мне удалось отследить эту статью для Fedora 12, объяснив, что можно запускать Pulseaudio как непривилегированный пользователь (он же мой текущий пользователь), но я не понимаю, как я могу поделиться аудио с собой.
Кто-нибудь знает, как я могу использовать Pulse, чтобы я мог обмениваться аудио с моей виртуальной машиной или предоставить другое решение для микширования звука с гостя и хоста без сбоев звука?
1 ответ
Хорошо, после долгих проб и ошибок мне наконец-то удалось заставить его работать как надо, без каких-либо сбоев.
Некоторые из следующих шагов могут не потребоваться для того, чтобы заставить это работать, но это сработало для меня после их создания. Если кто-то хочет изменить ответ и избавиться от ненужных шагов, сделайте это.
Помимо того, что я сказал выше при использовании VNC (изменив настройки в qemu.conf & libvirt-bin и убедившись, что мой пользователь был частью необходимых групп), я также убедился, что мой пользователь был частью pulse
& pulse-access
групп.
Я скопировал все из / etc / pulse в.pulse моего домашнего каталога:
cd ~
mkdir .pulse
cp /etc/pulse/* .pulse/
В ~/.pulse/client.conf
Я прокомментировал / изменил следующие строки:
enable-shm = yes
auto-connect-localhost = yes
auto-connect-display = yes
В ~/.pulse/daemon.conf
daemonize = yes
allow-module-loading = yes
use-pid-file = yes
enable-shm = yes
Также я установил paprefs (apt-get install paprefs
) и проверил:
- Сделайте обнаруживаемые сетевые звуковые устройства PulseAudio доступными локально
- Включить сетевой доступ к локальным звуковым устройствам
- Не требует аутентификации
- Включить многоадресный /RTP-приемник
- Добавить виртуальное устройство вывода для одновременного вывода на все локальные звуковые карты
После того, как вы внесли все изменения, вы можете перезагрузить компьютер или просто выйти из системы, войти в систему и перезапустить libvirt-bin, и все должно работать идеально при запуске виртуальной машины.
PS: если звук от виртуальной машины трещит, убедитесь, что виртуальная машина имеет ту же частоту дискретизации и битовую глубину, что и хост, и она должна работать.
Обновление: для меня стало очевидным, что у аудио все еще могут быть проблемы в гостевой системе (звук прерывистого звука), потому что libvirt, возможно, не сможет загрузить импульсную конфигурацию, из того, что я видел в лог-файле домена (/var/log/libvirt/qemu) /yourdomain.log). Вы можете временно отключить профиль или просто добавить:
@{HOME}/.pulse/** rw,
в /etc/apparmor.d/abstractions/libvirt-qemu и перезагрузите профили apparmor с помощью:
sudo invoke-rc.d apparmor reload
Примечание: я настроил libvirt для запуска в качестве текущего пользователя в /etc/libvirt/qemu.conf по соображениям безопасности.
Это немного устарело, но, возможно, это сэкономит время кому-нибудь, кто будет ходить по нему. Что сработало для меня, так это настроить сокет unix и использовать глобальную конфигурацию pulseaudio вместо TCP-соединенияmodule-native-protocol-tcp
указан для пользователя, как предлагают большинство онлайн-руководств.
Я думаю, pulseaudio по какой-то причине не улавливал отдельного пользователя. Итак, я закончил редактирование конфигурации pulseaudio в/etc
.
Я редактировал /etc/pulse/default.pa
со строкой:
load-module module-native-protocol-unix auth-anonymous=1 socket=/tmp/system-pulseaudio.socket
В /etc/pulse/client.conf
Я добавил строку:
default-server = unix:/tmp/system-pulseaudio.socket