升级到20.04.1 LTS后,蜂鸣器不工作。

我刚刚升级到了Ubuntu Server 20.04.1 LTS,目前只遇到了一个问题:当以用户身份运行beep命令时,会返回beep: Error: Could not open any device的错误。按预期,使用sudo beep也无法解决该问题。经过一番研究,我发现系统上并不存在beep组,这与手册中所述相符。我尝试重新安装和重新配置,但都没有成功。
更奇怪的是,在启动过程中,beep命令通过rc.local可以正常工作;然而,在某个时间点之后,它停止工作并返回错误,从而破坏了我的rc.local例程。另外,以下命令可以正常运行: sudo env -u SUDO_GID -u SUDO_COMMAND -u SUDO_USER -u SUDO_UID beep 为了澄清一下:我正在运行一个无头家庭服务器,没有连接任何扬声器;这个简单的发声扬声器用于在启动过程中提供简单的反馈,以及在需要干预的错误发生时使用。在Ubuntu Server 18.04 LTS下,我的设置一直正常工作。

我对 beep 一无所知,但软件包描述中提到了 printf "\a" ... 所以想知道这个是否有效? - xiota
1我遇到了这个错误:beep: 错误:为pcspkr evdev设备文件设置权限,并以非root用户身份运行。 - xiota
2pcspkr/etc/modprobe.d/blacklist.conf中被列入黑名单了吗? - nobody
@nobody:pcspkr没有被列入黑名单。在启动期间和通过上面添加的命令,beep可以正常工作,因此这不是驱动程序问题。 @xiota:我猜这是一个权限问题,但我现在不知道如何解决它... - senthor
你的用户是否在音频服务器组中,意味着没有脉冲音频,我想。 - nobody
替代方案 https://unix.stackexchange.com/questions/1974/how-do-i-make-my-pc-speaker-beep使用 paplay 命令播放 /usr/share/sounds/sound-icons/capital 的声音文件。 - pierrely
4个回答

将我的用户添加到组input对我起了作用,即:
sudo usermod -aG input USERNAME

直到您再次登录后,更改才会显示出来(在Ubuntu上,我不得不重新启动,而不仅仅是注销并重新登录,然后新的shell才会在groups输出中显示新的组)。要在一个shell中看到更改,打开一个新的登录shell:
su USERNAME -

这对我来说不起作用。在重新启动后,确认我在新的组中使用groups命令,beep仍然输出"错误:无法打开任何设备"。Ubuntu 21.04。 - Jonathan Hartley
对我来说似乎有效,而且我甚至不需要重新启动或再次登录。 - Yan King Yin

在文档PERMISSIONS.md中提出的一个解决方案是创建一个名为'beep'的系统组,然后使用ACL来允许该组成员对设备进行写入访问。
$ addgroup --system beep

然后为udev创建一个规则,例如:
/lib/udev/rules.d/90-pcspkr-beep.rules :
# Add write access to the PC speaker for the "beep" group
ACTION=="add", SUBSYSTEM=="input", ATTRS{name}=="PC Speaker", ENV{DEVNAME}!="", RUN+="/usr/bin/setfacl -m g:beep:w '$env{DEVNAME}'"

然后你应该能够将用户添加到这个群组中,他们可以给发言者写信。
$ usermod user_name -a -G beep

当然,上述方法只适用于启用了ACL的情况。如果您不能或不愿这样做,他们有一个关于udev规则的不同建议。
# Give write access to the PC speaker only to the "beep" group
ACTION=="add", SUBSYSTEM=="input", ATTRS{name}=="PC Speaker", ENV{DEVNAME}!="", GROUP="beep", MODE="0620"

但这将会使得发言者被默认系统组"input"排除在外——由于该方法在文档中被建议使用,不良影响可能是可以忽略的。


不好的解决方案:

我相当确定这是一个权限问题,但我不知道如何解决。我尝试根据ArchLinux Wiki创建udev文件和组,但那行不通。

然后,我改变了设备本身的权限:

sudo chmod 777 /dev/input/by-path/platform-pcspkr-event-spkr

虽然这样做是可行的,但让任何人都能随意写入设备肯定是一个糟糕的主意。

多年来,让“beep”工作一直是个痛苦的事情。最终,我得到了这行代码,可以将其作为一个别名放在“~/.bash_aliases”中,或者放在一个名为...嗯,就叫做“beep”的脚本中。
/usr/bin/aplay /usr/share/sounds/sound-icons/prompt.wav 2>/dev/null &

随意选择您的命令行播放器和声音。