在 Debian 10 中,当我timidity
以普通用户身份启动 alsa 序列器时,完全没有问题。它工作完美。
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
,但普通用户不需要它。看起来它正在访问全局/usr/share/alsa/alsa.conf
,但root
实际上没有。
所以我的问题是:如何在不编写新的配置文件的情况下解决这个问题?是否可以让root
访问全局文件,或者我遗漏了什么?
系统运行的是 Debian 10。
答案1
我想我已经解决了。这是设计和许可问题的混合体。
根据,加载/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 作为服务启动的事件不起作用,因为包提供的 init 脚本timidity-daemon
正在尝试(通过 start-stop-daemon)以用户 timidity 的方式启动进程,但这种行为是不允许的,这是第二个权限问题。而且由于 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
取消注释并将其设置为 yes
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-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,禁用它并清理你的用户目录配置
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..就完成了!