我正在使用预置功能来塑造自定义 Debian 10 x64 系统。一切都进展顺利,除了在 late_command 步骤中,我正在运行一个 shell 脚本来配置和部署其他东西,并且我希望能够访问物理音频接口。
通常,我使用 执行此操作pacmd list-sinks
,然后我可以轻松访问不同的音频卡名称。但在这种情况下,使用chroot /target/ sudo -u device pacmd list-sinks
,我唯一看到的是一个名为 的虚拟接口audio_null
:
我还明确指出,安装后系统重新启动后,我就可以正常访问物理音频接口。
(供参考,我需要访问物理接口名称来配置 Pulseaudio 默认配置文件中的默认接口,因为安装后根文件系统被设置为只读,所以这是一次性完成的最终时间)。
我认为这是一种预期的行为,因为安装期间不需要所有模块,因此可能会跳过一些所需的服务/配置步骤。
到目前为止我已经尝试过:
- 手动(重新)加载一些听起来相关的模块:
chroot /target/ sudo modprobe soundcore
- 重新加载 PulseAudio 服务(显然尚未启动)
- 从目标系统和目标系统外部列出(
chroot /target/ pacmd list-sinks
,pacmd list-sinks
)为了使前面的命令起作用,我需要重新启动 Pulse,chroot /target/ sudo -u device pulseaudio --start
否则我会收到一条错误消息No PulseAudio daemon running or not running as session daemon
之前的尝试都没有成功,我的想法已经用完了。我可能错过了/误解了一个显而易见的概念,外部的观点会受到欢迎。
即使这不是我的最终目的,将问题恢复为更广泛的问题可能会更容易:如何在late_command
Debian 安装步骤中播放声音。
PS:不管怎样,我目前正在使用 VmWare 部署到虚拟机,并将物理声卡桥接到该虚拟机。
答案1
此阶段仍在 chroot 中运行,因此不存在 systemd 实例,并且依赖于后台运行的 systemd 的任何内容均已损坏。
您还正在运行为安装程序构建的内核映像,虽然它可能与安装到目标系统中的内核映像相同,但通常情况并非如此,因为安装程序将选择安装时可用的最新内核 - 因此安装在系统上的模块可能不适合当前运行的内核。
最好的办法是寻找安装程序内核的声音模块(我相信这些模块存在于可选安装程序模块中,以便于访问)并使用 ALSA 工具播放声音。
答案2
这样做可能会作为第一次启动时运行的脚本更容易而不是从安装程序内部。
也就是说,通过手动执行“从安装媒体加载安装程序组件”,然后选择“sound-modules-5.10-8-amd64-di:声音支持”(在 Debian 11 中,但 Debian 10 上可能也有)进行快速测试,可以正确插入必要的内核模块。在 VirtualBox 上安装 alsa-utils(目标内)开箱即用。运行aplay
也可以,前提是您先使用取消静音卡amixer
。
Debian 11 所需的预置行如下所示:
d-i preseed/early_command string anna-install sound-modules
(...还有其他方法,这个对我有用)
然后你还需要确保目标上有 alsa-utils。如果你使用的是“任务”,例如桌面环境等,则不需要任何内容。但如果是裸机系统,则需要:
d-i pkgsel/include string alsa-utils
最后,发出一些声音(双关语):
d-i preseed/late_command string in-target /bin/sh -c \
"amixer set Master 80% unmute; amixer set PCM 80% unmute; aplay /usr/share/sounds/alsa/Noise.wav"
aplay -l
使用有效的 alsa 堆栈,您可以通过执行或类似操作(目标内)轻松获取硬件音频设备列表,并在稍后的设置脚本中使用该信息。
虽然这可以工作,但我可以想象,使用不同的硬件设置来实现这一点确实非常棘手。一些声卡需要选择额外的开关或输出等。此外,modprobe
最终系统中的选项可能与 di 环境有很大不同,并会影响卡索引等。祝您黑客愉快!