#===============================================================
INFO "步骤 4/4:验证音效文件与配置开关 ..."
MISSING=0
for sf in /usr/share/sounds/deepin/stereo/desktop-login.wav
/usr/share/sounds/deepin/stereo/system-shutdown.wav; do
if [ -s "$sf" ]; then
OK "音效文件存在: sf ((du -h "$sf" 2>/dev/null | cut -f1))"
else
FAIL "音效文件缺失或为空: $sf"
MISSING=1
fi
done
尝试读取 dde-dconfig 音效开关(不同版本配置位置不同,尽力而为)
if command -v dde-dconfig >/dev/null 2>&1; then
for appid in org.deepin.dde.daemon deepin-system-sound org.deepin.dde.control-center; do
OUT=(dde-dconfig get "appid" soundeffect 2>/dev/null)
if [ -n "OUT" ] && [ "OUT" != "not exist" ]; then
INFO "appid 的音效配置: OUT"
break
fi
done
fi
问题
【前置条件】:华硕星耀笔记本 U9 285H
【复现步骤】点击设置关机音效,返回后再进入,没有设置成功
【预期结果】开关机有音效
【实际结果】:开关机没有声音
解决脚本:
fix-deepin-sound.sh
#!/bin/bash
#=====================================================================
Deepin 开关机音效 & 系统音效修复脚本 (支持 Deepin 20/23/25)
#---------------------------------------------------------------------
解决以下三个问题:
1. 开机/登录没有音效
2. 关机/重启没有音效
3. 系统音效设置失败 / 系统提示音无法播放
适用系统:统信 UOS / Deepin(Debian 系)
使用方法:sudo bash fix-deepin-sound.sh
或 以 root 直接运行 bash fix-deepin-sound.sh
原理(根因):
A. ALSA 状态目录 /var/lib/alsa/card0.conf.d 属主为 root 且不可写,
而音效服务 sound-theme-player / deepin-*-sound 以 deepin-daemon
用户 + audio 附加组运行,执行 alsactl restore 时因权限不足
报 exit status 13(EACCES),音效播放被中止。
B. 部分系统 alsactl 未编译 zlib 支持,无法读取 gzip 压缩的
asound-state-.gz 状态文件,报 exit 22。
C. deepin-login-sound / deepin-shutdown-sound /
deepin-sound-theme-player 服务未启用/未启动,导致音效调用落空。
#=====================================================================
set -u
RED='\033[1;31m'; GREEN='\033[1;32m'; YELLOW='\033[1;33m'; BLUE='\033[1;36m'; NC='\033[0m'
OK(){ echo -e "{GREEN}[OK]{NC} $1"; }
FAIL(){ echo -e "{RED}[FAIL]{NC} $1"; }
INFO(){ echo -e "{BLUE}[INFO]{NC} $1"; }
WARN(){ echo -e "{YELLOW}[WARN]{NC} $1"; }
#------------ 检查 root 权限 ------------
if [ "$(id -u)" -ne 0 ]; then
FAIL "请使用 root 权限运行:sudo bash $0"
exit 1
fi
echo "==========================================================="
echo " Deepin 开关机音效 & 系统音效 一键修复脚本"
echo "==========================================================="
echo
#===============================================================
步骤 1:修复 ALSA 状态目录权限(核心修复)
使 deepin-daemon(audio 组) 能执行 alsactl restore
#===============================================================
INFO "步骤 1/4:修复 ALSA 状态目录权限 ..."
DIR=/var/lib/alsa/card0.conf.d
if [ -d "$DIR" ]; then
chown root:audio "$DIR"
chmod 775 "$DIR"
OWNER=(stat -c '%U:%G %a' "DIR")
if stat -c '%U:%G' "DIR" | grep -q "root:audio" && [ "(stat -c '%a' "$DIR" | cut -c2)" -ge 7 ]; then
OK "ALSA 状态目录 DIR 已修复为 root:audio 775 (当前: OWNER)"
else
WARN "ALSA 状态目录权限可能仍不正确 (当前: $OWNER)"
fi
else
WARN "目录 $DIR 不存在,将尝试创建(若无需写入可忽略)"
mkdir -p "DIR" 2>/dev/null && chown root:audio "DIR" && chmod 775 "$DIR"
fi
同时确保上级目录可被读取
chmod 755 /var/lib/alsa 2>/dev/null
#===============================================================
步骤 2:处理 alsactl 无法读取 gzip 状态文件的问题
若存在 *.gz 状态文件,且 alsactl 不支持 zlib,则转成明文
#===============================================================
INFO "步骤 2/4:检查 ALSA 状态文件格式兼容性 ..."
STATE_FILES=$(ls /var/lib/alsa/.gz /var/lib/alsa//*.gz 2>/dev/null || true)
if [ -n "$STATE_FILES" ]; then
检测 alsactl 是否支持 gzip:尝试 restore 一个空 .gz 文件看是否报错
TMP=$(mktemp)
if alsactl -f /dev/null restore 2>/dev/null; then
#===============================================================
步骤 3:启用并启动音效相关服务
#===============================================================
INFO "步骤 3/4:检查并启动音效相关服务 ..."
3.1 系统级服务(登录音效 / 关机音效 / 主题音效播放器)
for svc in deepin-login-sound deepin-shutdown-sound deepin-sound-theme-player; do
if systemctl list-unit-files "$svc.service" >/dev/null 2>&1; then
systemctl enable "$svc" >/dev/null 2>&1
systemctl start "$svc" >/dev/null 2>&1
ST=(systemctl is-active "svc" 2>/dev/null)
if [ "$ST" = "active" ]; then
OK "服务 $svc 已启用并运行"
else
WARN "服务 svc 已启用,但当前状态为 ST(部分服务仅在开机/关机时触发,属正常)"
fi
else
WARN "未找到服务 $svc(系统版本可能不同,已跳过)"
fi
done
3.2 用户级音效服务 SoundEffect1(系统提示音,需在用户会话下启动)
if [ "$(id -u)" -eq 0 ]; then
尝试为当前登录用户启动用户服务
if command -v loginctl >/dev/null 2>&1; then
for uid in $(loginctl list-users --no-legend 2>/dev/null | awk '{print $1}' | head -5); do
if [ "$uid" != "0" ]; then
UNAME=(getent passwd "uid" | cut -d: -f1)
INFO "为用户 $UNAME 启动音效用户服务 ..."
loginctl enable-linger "$UNAME" 2>/dev/null
runuser -u "$UNAME" -- systemctl --user enable org.deepin.dde.SoundEffect1 >/dev/null 2>&1
runuser -u "$UNAME" -- systemctl --user restart org.deepin.dde.SoundEffect1 >/dev/null 2>&1
ST=(runuser -u "UNAME" -- systemctl --user is-active org.deepin.dde.SoundEffect1 2>/dev/null)
if [ "$ST" = "active" ]; then
OK "用户 $UNAME 的 SoundEffect1 服务已运行"
else
WARN "用户 UNAME 的 SoundEffect1 服务状态: ST"
fi
fi
done
fi
fi
#===============================================================
步骤 4:验证音效文件与配置开关
#===============================================================
INFO "步骤 4/4:验证音效文件与配置开关 ..."
MISSING=0
for sf in /usr/share/sounds/deepin/stereo/desktop-login.wav
/usr/share/sounds/deepin/stereo/system-shutdown.wav; do
if [ -s "$sf" ]; then
OK "音效文件存在: sf ((du -h "$sf" 2>/dev/null | cut -f1))"
else
FAIL "音效文件缺失或为空: $sf"
MISSING=1
fi
done
尝试读取 dde-dconfig 音效开关(不同版本配置位置不同,尽力而为)
if command -v dde-dconfig >/dev/null 2>&1; then
for appid in org.deepin.dde.daemon deepin-system-sound org.deepin.dde.control-center; do
OUT=(dde-dconfig get "appid" soundeffect 2>/dev/null)
if [ -n "OUT" ] && [ "OUT" != "not exist" ]; then
INFO "appid 的音效配置: OUT"
break
fi
done
fi
echo
echo "==========================================================="
if [ "$MISSING" -eq 1 ]; then
WARN "部分音效文件缺失,建议:sudo apt reinstall deepin-sound-theme 或 deepin-system-sound"
fi
echo " 修复完成!"
echo " 自测命令(可手动播放验证):"
echo " aplay /usr/share/sounds/deepin/stereo/desktop-login.wav # 模拟登录音"
echo " aplay /usr/share/sounds/deepin/stereo/system-shutdown.wav # 模拟关机音"
echo "==========================================================="
echo
INFO "提示:若仍需重启系统验证开关机音效,请执行:sudo reboot"
exit 0
运行:
sudo fix-deepin-sound