当我从 VirtualBox 启动虚拟机时,如何防止 Pulseaudio 崩溃?

当我从 VirtualBox 启动虚拟机时,如何防止 Pulseaudio 崩溃?

/!\下面的更新 2 - Pulseaudio 不是罪魁祸首,libpam-systemd 才是罪魁祸首/!\

我注意到每次我使用 VirtualBox 启动虚拟机时gksu virtualbox %U,Pulseaudio 总是会崩溃。然后我立即从 VirtualBox 收到此错误:

No audio devices could be opened. Selecting the NULL audio backend
with the consequence that no sound is audible.

HostAudioNotResponding

此外,VMware Workstation 指出它无法发出声音,因为产生了以下错误:

找不到 /dev/dsp。

这是真的,因为我什至找不到该文件。

然而,系统日志并没有透露太多关于崩溃的信息:

May 31 18:18:58 HostName pulseaudio[3466]: [autospawn] core-util.c: Failed to create secure directory (/run/user/1000/pulse): Permission denied
May 31 18:18:58 HostName pulseaudio[3466]: [autospawn] lock-autospawn.c: Cannot access autospawn lock.
May 31 18:18:58 HostName pulseaudio[3466]: [pulseaudio] main.c: Failed to acquire autospawn lock
May 31 18:18:59 HostName pulseaudio[3471]: [autospawn] core-util.c: Failed to create secure directory (/run/user/1000/pulse): Permission denied
May 31 18:18:59 HostName pulseaudio[3471]: [autospawn] lock-autospawn.c: Cannot access autospawn lock.
May 31 18:18:59 HostName pulseaudio[3471]: [pulseaudio] main.c: Failed to acquire autospawn lock
May 31 18:18:59 HostName pulseaudio[3473]: [autospawn] core-util.c: Failed to create secure directory (/run/user/1000/pulse): Permission denied
May 31 18:18:59 HostName pulseaudio[3473]: [autospawn] lock-autospawn.c: Cannot access autospawn lock.
May 31 18:18:59 HostName pulseaudio[3473]: [pulseaudio] main.c: Failed to acquire autospawn lock
May 31 18:18:59 HostName pulseaudio[3475]: [autospawn] core-util.c: Failed to create secure directory (/run/user/1000/pulse): Permission denied
May 31 18:18:59 HostName pulseaudio[3475]: [autospawn] lock-autospawn.c: Cannot access autospawn lock.
May 31 18:18:59 HostName pulseaudio[3475]: [pulseaudio] main.c: Failed to acquire autospawn lock
May 31 18:18:59 HostName pulseaudio[3478]: [autospawn] core-util.c: Failed to create secure directory (/run/user/1000/pulse): Permission denied
May 31 18:18:59 HostName pulseaudio[3478]: [autospawn] lock-autospawn.c: Cannot access autospawn lock.
May 31 18:18:59 HostName pulseaudio[3478]: [pulseaudio] main.c: Failed to acquire autospawn lock
May 31 18:19:00 HostName pulseaudio[3483]: [autospawn] core-util.c: Failed to create secure directory (/run/user/1000/pulse): Permission denied
May 31 18:19:00 HostName pulseaudio[3483]: [autospawn] lock-autospawn.c: Cannot access autospawn lock.
May 31 18:19:00 HostName pulseaudio[3483]: [pulseaudio] main.c: Failed to acquire autospawn lock
May 31 18:19:09 HostName pulseaudio[3488]: [autospawn] core-util.c: Failed to create secure directory (/run/user/1000/pulse): Permission denied
May 31 18:19:09 HostName pulseaudio[3488]: [autospawn] lock-autospawn.c: Cannot access autospawn lock.
May 31 18:19:09 HostName pulseaudio[3488]: [pulseaudio] main.c: Failed to acquire autospawn lock
May 31 18:19:09 HostName pulseaudio[3490]: [autospawn] core-util.c: Failed to create secure directory (/run/user/1000/pulse): Permission denied
May 31 18:19:09 HostName pulseaudio[3490]: [autospawn] lock-autospawn.c: Cannot access autospawn lock.
May 31 18:19:09 HostName pulseaudio[3490]: [pulseaudio] main.c: Failed to acquire autospawn lock
May 31 18:19:17 HostName pulseaudio[3496]: [autospawn] core-util.c: Failed to create secure directory (/run/user/1000/pulse): Permission denied
May 31 18:19:17 HostName pulseaudio[3496]: [autospawn] lock-autospawn.c: Cannot access autospawn lock.
May 31 18:19:17 HostName pulseaudio[3496]: [pulseaudio] main.c: Failed to acquire autospawn lock
May 31 18:19:18 HostName pulseaudio[3498]: [autospawn] core-util.c: Failed to create secure directory (/run/user/1000/pulse): Permission denied
May 31 18:19:18 HostName pulseaudio[3498]: [autospawn] lock-autospawn.c: Cannot access autospawn lock.
May 31 18:19:18 HostName pulseaudio[3498]: [pulseaudio] main.c: Failed to acquire autospawn lock
May 31 18:20:28 HostName pulseaudio[1847]: [pulseaudio] protocol-native.c: Denied access to client with invalid authorization data.

因为它只是说 Pulseaudio 无法重新启动,因为它/run/user/1000/pulse/有一个由 root 拥有的臭名昭著的错误。我简单地修复了:

chown standardUser /run/user/1000/pulse/ && chgrp standardUser /run/user/1000/pulse/

但是,仍然没有迹象表明是什么原因导致 Pulseaudio 崩溃。

所以问题是:是什么导致 Pulseaudio 崩溃以及如何防止它?

一切都是在更新的 Debian 8.7 和现有的 KDE 桌面环境上完成的。


更新1

经过多次尝试和猜测,我通过编辑 /etc/pluse/default.pa 文件得到了一些改进。

通过启用这些 Pulseaudio 模块: - module-alsa-sink - module-oss device="/dev/dsp" sink_name=output source_name=input

使用这些选项启用module-oss,启用 /dev/dsp 文件;并防止 VMware Workstation 引发错误。

进行模式探测:snd-pcm-oss

并禁用这些模块:

  • 模块 esound-协议-unix
  • 空闲时模块挂起

几乎没有任何错误(尽管仍然有 VirtualBox 和 root 拥有的臭名昭著的脉冲文件夹),除了我从 syslog 得到的这个:

May 31 22:09:11 HostName pulseaudio[3376]: Trying resume...
May 31 22:09:11 HostName pulseaudio[3376]: open '/dev/snd/pcmC0D0p' failed (-16)
May 31 22:09:11 HostName pulseaudio[3376]: Error opening PCM device front:0: Device or resource busy
May 31 22:09:11 HostName pulseaudio[3376]: Using generic matrix remapping

这是因为我通过执行“pulseaudio -vvvv”手动启动 Pulseaudio :

I: [pulseaudio] client.c: Created 1 "Native client (UNIX socket client)"
D: [pulseaudio] protocol-native.c: Protocol version: remote 29, local 29
I: [pulseaudio] protocol-native.c: Got credentials: uid=0 gid=0 success=0
W: [pulseaudio] protocol-native.c: Denied access to client with invalid authorization data.
I: [pulseaudio] client.c: Freed 1 "Native client (UNIX socket client)"
I: [pulseaudio] protocol-native.c: Connection died.

尽管如此,我还是不明白为什么会出现“/dev/snd/pcmC0D0p”错误,以及为什么它显然是一个权限问题。

除了 syslog 和以超详细模式运行 Pulseaudio 之外,我不知道如何跟踪 Pulseaudio 发生的情况。

我有什么办法可以提供有关该事故的更多信息吗?


更新2

除了我在更新 1 中所做的之外:

/etc/pulse/default.pa 已附加:

module-native-protocol-unix auth-anonymous=1
module-native-protocol-tcp auth-anonymous=1 auth-ip-acl=127.0.0.1

/etc/pulse/client.conf 已附加:

default-server = 127.0.0.1

modprobe snd-pcm-oss仍然需要。

与 Pulseaudio 相关的所有内容都有效,甚至 vmware 也没有抱怨没有获取 /dev/dsp (仅适用于modprobe snd-pcm-oss)。 Pulseaudio -vvvv 或 /var/log/syslog/ 未发现错误。

不幸的是,虽然 Pulseaudio 工作正常,但声音仍然缺失。

此外,我还尝试在系统模式下运行 Pulseaudio;但情况并没有好转,问题还是一样。

所以,看起来主要问题是 /run/user/1000/pulse 被 root 拥有,这意味着真正的问题是那个臭名昭著的错误。

经过一番研究,我发现 libpam-systemd 是造成这种情况的原因。这是 Debian 从 Systemd 获得的一个已知错误,已在 Debian 测试(延伸)和实验中报告;但根本不稳定:

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=732209

http://forums.debian.net/viewtopic.php?f=10&t=110035

https://bugs.debian.org/cgi-bin/pkgreport.cgi?dist=unstable;package=libpam-systemd

关于第二个链接,我还确认了“gksu gedit”问题,我也应用了相同的解决方法。

这个问题似乎尚未解决,至少在 Debian Stable 维护者更新 libpam-systemd 之前是这样。

另一方面,我已向他们发送了错误报告。另外,我建议也面临这个错误的人再次报告这个错误,这样他们就能得到真正的确认。

此外,如果有人知道如何同时修复该错误,我很乐意听取任何解决方案。这还包括将 libpam-systemd 重新编译为 deb(因为我不知道如何以 Debian 方式正确执行此操作),欢迎任何提示。

答案1

我可以解释这个/dev/snd/pcmC0D0p错误:这是一个 ALSA 设备。当 Pulseaudio 启动时,它会打开它能找到的所有 ALSA 设备,并且由于 ALSA 硬件设备无法共享且只能打开一次,因此下次有人尝试打开该设备时,该设备会给出“忙”错误。

因此,如果您在主环境中运行 Pulseaudio,并且已将 virtualbox 配置为仅“通过”声音设备,则主 Pulseaudio 使用该设备,因此 virtualbox 则不能。

如果 virtualbux 模拟声音设备,则您将在 virtualbox 中运行其他东西来打开它,例如第二个 Pulseaudio 实例。使用lsofps找出是哪个。

Modprobingsnd-pcm-oss并没有真正的帮助:这是 ALSA 中的 OSS 模拟层,它提供了等等,这只是不同 API/dev/dsp的别名。/dev/snd/pcmC0D0p而如果你在 Pulseaudio 中同时启用module-alsa-sinkmodule-oss,Pulseaudio 会很高兴地打开两者,这当然是废话。所以再次禁用 OSS 的东西,这不是解决方案。

根据我的经验,pulseaudio -vvvv这足以让您了解实际出了什么问题。如果你真的遇到了崩溃,如“分段违规”等,如果可能的话,在带有调试符号的版本上使用strace或启动它,应该会再次让你知道实际出了什么问题。gdb

我怀疑您的配置在某个地方有问题,但我没有足够的信息来解决它。

相关内容