alsa/timidity 无法识别 Debian 10 上的 root 用户和 init.d 中的默认设备

alsa/timidity 无法识别 Debian 10 上的 root 用户和 init.d 中的默认设备

在 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-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,禁用它并清理你的用户目录配置

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..就完成了!

相关内容