當我從 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

我懷疑您的配置在某個地方有問題,但我沒有足夠的資訊來解決它。

相關內容