/!\下面的更新 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 實例。使用lsof
和ps
找出是哪一個。
Modprobingsnd-pcm-oss
並沒有真正的幫助:這是 ALSA 中的 OSS 模擬層,它提供了等等,這只是不同 API/dev/dsp
的別名。/dev/snd/pcmC0D0p
而如果你在 Pulseaudio 中同時啟用module-alsa-sink
和module-oss
,Pulseaudio 會很高興地打開兩者,這當然是廢話。所以再次停用 OSS 的東西,這不是解決方案。
根據我的經驗,pulseaudio -vvvv
這足以讓您了解實際出了什麼問題。如果你真的遇到了崩潰,例如“分段違規”等,如果可能的話,在帶有調試符號的版本上使用strace
或啟動它,應該會再次讓你知道實際出了什麼問題。gdb
我懷疑您的配置在某個地方有問題,但我沒有足夠的資訊來解決它。