alsa/timidity 在 Debian 10 上無法辨識使用者 root 和 init.d 中的預設設備
在 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.pasudo 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-access
。timidity
將以他自己的使用者身份執行,所以我們也需要添加它。在我的情況下,我想要使用者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..它完成了!