Debian

alsa/timidity 在 Debian 10 上無法辨識使用者 root 和 init.d 中的預設設備

  • March 23, 2021

在 Debian 10 中,當我timidity以普通使用者的 alsa sequencer 啟動時,完全沒有問題。它完美無瑕。

samuele@INSPIRON-17:~$ timidity -Os -iA
Requested buffer size 32768, fragment size 8192
ALSA pcm 'default' set buffer size 32768, period size 8192 bytes
TiMidity starting in ALSA server mode
Opening sequencer port: 128:0 128:1 128:2 128:3

當我切換到root使用者時,它不再起作用了:

root@INSPIRON-17:~# timidity -Os -iA
ALSA lib pcm_dmix.c:1108:(snd_pcm_dmix_open) unable to open slave
Can't open pcm device 'default'.
Couldn't open ALSA pcm device (`s')

似乎找不到“預設”設備。我知道我可以強制它創建~/.asoundrc文件或全域/etc/asound.conf,但普通使用者不需要它。似乎它正在訪問 global /usr/share/alsa/alsa.conf,而root沒有。

所以我的問題是:如何在不編寫新配置文件的情況下解決這個問題?是否可以讓root訪問全域文件,或者我錯過了什麼?

系統正在執行 Debian 10。

我想我已經解決了。這是設計和許可問題的混合。

根據/usr/share/alsa/alsa.conf,所有來自的 conf/etc/alsa/conf.d都已載入。我們有一個99-pulse.conf, 連結到/usr/share/alsa/pulse-alsa.conf. 在最後一個文件中,在啟動pulse時設置為預設 alsa 設備pulseaudio,並且它不會在啟動時啟動,而僅在使用者登錄時啟動。

Root不能使用膽小主要是因為他沒有訪問pulse的權限,這是第一個權限問題。

使用者登錄後嘗試將膽怯作為服務啟動的事件不起作用,因為包提供的初始化腳本timidity-daemon正在嘗試(通過 start-stop-daemon)以使用者膽怯的身份啟動程序,但這種行為是不允許的,這是第二個權限問題。而且由於 root 缺少權限,即使更改腳本刪除了使用者更改部分,它也不起作用。唯一的謎團(對我來說)是,在安裝包 timidity-daemon 之後,權限問題沒有發生,但在第一次重新啟動後它停止工作。

無論如何,它可以通過兩種方式修復。

第一個簡單且侵入性較小的解決方案是根本不使用該包timidity-daemon,而是創建一個timidity.service位於/usr/lib/systemd/user/.

在安裝所需的軟體包之前

sudo apt-get install timidity fluid-soundfont-gm

/usr/lib/systemd/user/timidity.service然後使用此內容創建文件(使用 sudo)

[Unit]
Description=Timidity
After=pulseaudio.service

[Service]
Type=simple
ExecStart=/usr/bin/timidity -Os -iA

[Install]
WantedBy=pulseaudio.service

現在安裝並啟動它

systemctl --user enable timidity.service
systemctl --user start timidity.service

它完成了。

第二種解決方案是在系統範圍內啟動脈衝並允許 root 和膽小的人使用它,從安全形度來看,這不是最佳選擇。無論如何,為了讓脈衝/膽怯作為根系統範圍內的工作,這些是步驟:(靈感來自https://raven4.cz/wp/pulseaudio-in-system-wide-mode/

首先安裝基礎包

sudo apt-get install timidity timidity-daemon fluid-soundfont-gm

編輯(使用 sudo)/etc/pulse/daemon.conf,搜尋行

; system-instance = no

取消註釋並將其設置為是

system-instance = yes

現在將文件/etc/pulse/system.pa和符號連結 default.pa 刪除為 system.pa

sudo rm /etc/pulse/system.pa
sudo ln -s /etc/pulse/default.pa /etc/pulse/system.pa

現在編輯 (sudo) /etc/pulse/default.pa,找到該行

load-module module-native-protocol-unix

並以這種方式改變它

load-module module-native-protocol-unix auth-group-enable=true auth-group=pulse-access socket=/tmp/pulse-socket

現在編輯 (sudo) /etc/pulse/client.conf,找到該行

; default-server =

取消註釋並以這種方式設置

default-server = unix:/tmp/pulse-socket

現在我們需要在帳戶中添加我們希望能夠訪問 pulseaudio 的每個使用者pulse-accesstimidity將以他自己的使用者身份執行,所以我們也需要添加它。在我的情況下,我想要使用者root和我的主要使用者samuele,所以我會這樣做:

usermod -a -G pulse-access root
usermod -a -G pulse-access samuele
usermod -a -G pulse-access timidity

現在我們需要創建自定義pulseaudio.service文件。/etc/systemd/system/pulseaudio.service所以用這個內容創建一個文件

[Unit]
Description=Pulseaudio

[Service]
User=root
Type=forking
ExecStart=/bin/pulseaudio --realtime --daemonize
Restart=always

[Install]
WantedBy=graphical.target

現在是糾正膽怯的時候了。

檢查它是否正在使用

aconnect -lo | grep -i timidity

如果沒有,請啟動它

sudo service timidity start

再次檢查,如果一切正常,是否有生成的服務文件/run/systemd/generator.late/timidity.service

將其複製到/etc/systemd/system

sudo cp /run/systemd/generator.late/timidity.service /etc/systemd/system/timidity.service

現在編輯它(sudo)並在文件中開始搜尋

After=remote-fs.target

並以這種方式改變它

After=remote-fs.target pulseaudio.service

在文件結尾添加這兩行以使其可安裝

[Install]
WantedBy=multi-user.target

現在是清潔的時候了。停止膽怯並將其從 init.d 中刪除

sudo service timidity stop
sudo update-rc.d -f timidity remove

停止每個使用者的 pulseaudio,禁用它並清理你的 userdir 配置

systemctl --user stop pulseaudio.socket
systemctl --user stop pulseaudio.service
systemctl --user disable pulseaudio.socket
systemctl --user disable pulseaudio.service
rm -Rf ~/.config/pulse/

現在啟用新服務

sudo systemctl enable /etc/systemd/system/pulseaudio.service
sudo systemctl enable /etc/systemd/system/timidity.service

重啟機器aaaand..它完成了!

引用自:https://unix.stackexchange.com/questions/589257