Initial commit
This commit is contained in:
128
scripts/capture-ubuntu-audio-baseline.sh
Executable file
128
scripts/capture-ubuntu-audio-baseline.sh
Executable file
@@ -0,0 +1,128 @@
|
||||
#!/usr/bin/env bash
|
||||
# 在安装 kaisa-hdmi-pipewire-fix 或其它大改前,采集「Ubuntu / 当前机」音频基线并落盘。
|
||||
# 输出目录默认:audio_topology/baseline-stash/<时间戳>_<hostname>/
|
||||
# 用法:./scripts/capture-ubuntu-audio-baseline.sh [输出目录]
|
||||
# 详见:docs/linux-hdmi/OPERATION_PipeWire_Kaisa_HDMI.md「基线备份与恢复」
|
||||
set -euo pipefail
|
||||
|
||||
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
STAMP="$(date +%Y%m%d_%H%M%S)_$(hostname)"
|
||||
|
||||
if [[ -n "${1:-}" ]]; then
|
||||
STASH="$(realpath "$1")"
|
||||
else
|
||||
STASH="${REPO_ROOT}/audio_topology/baseline-stash/${STAMP}"
|
||||
fi
|
||||
|
||||
mkdir -p "$STASH/backup/root"
|
||||
|
||||
write_manifest() {
|
||||
local mf="$STASH/manifest.txt"
|
||||
{
|
||||
echo "# capture-ubuntu-audio-baseline"
|
||||
echo "created_iso: $(date -Iseconds)"
|
||||
echo "hostname: $(hostname)"
|
||||
echo "stash_dir: $STASH"
|
||||
echo ""
|
||||
echo "## uname"
|
||||
uname -a
|
||||
echo ""
|
||||
echo "## dpkg (相关包)"
|
||||
dpkg -l 2>/dev/null | grep -E '^(ii|rc)\s+(alsa-ucm-conf|wireplumber|pipewire|pipewire-pulse|kaisa-hdmi-pipewire-fix)\s' || true
|
||||
echo ""
|
||||
if dpkg -s kaisa-hdmi-pipewire-fix &>/dev/null; then
|
||||
echo "## kaisa-hdmi-pipewire-fix: installed"
|
||||
dpkg -s kaisa-hdmi-pipewire-fix 2>/dev/null | grep -E '^(Package|Version|Status):' || true
|
||||
else
|
||||
echo "## kaisa-hdmi-pipewire-fix: not installed"
|
||||
fi
|
||||
echo ""
|
||||
echo "## deb 相关路径(存在性与 sha256)"
|
||||
} >"$mf"
|
||||
|
||||
local paths=(
|
||||
/etc/wireplumber/wireplumber.conf.d/50-kaisa-sof-rt5682-hdmi.conf
|
||||
/usr/share/alsa/ucm2/conf.d/sof-rt5682/sof-rt5682.conf
|
||||
/usr/share/alsa/ucm2/GoogleKaisa/sof-rt5682/HiFi.conf
|
||||
)
|
||||
local p
|
||||
for p in "${paths[@]}"; do
|
||||
if [[ -e "$p" ]]; then
|
||||
echo "PATH $p exists=yes" >>"$mf"
|
||||
if [[ -f "$p" ]]; then
|
||||
sha256sum "$p" >>"$mf" 2>/dev/null || echo "(sha256sum failed)" >>"$mf"
|
||||
fi
|
||||
else
|
||||
echo "PATH $p exists=no" >>"$mf"
|
||||
fi
|
||||
done
|
||||
echo "" >>"$mf"
|
||||
echo "## /usr/share/doc/kaisa-hdmi-pipewire-fix/" >>"$mf"
|
||||
if [[ -d /usr/share/doc/kaisa-hdmi-pipewire-fix ]]; then
|
||||
ls -la /usr/share/doc/kaisa-hdmi-pipewire-fix >>"$mf" 2>&1 || true
|
||||
else
|
||||
echo "(目录不存在)" >>"$mf"
|
||||
fi
|
||||
}
|
||||
|
||||
backup_vendor_ucm() {
|
||||
local src="/usr/share/alsa/ucm2/conf.d/sof-rt5682/sof-rt5682.conf"
|
||||
if [[ -f "$src" ]]; then
|
||||
install -D -m0644 "$src" "$STASH/backup/root/usr/share/alsa/ucm2/conf.d/sof-rt5682/sof-rt5682.conf"
|
||||
echo "已备份 vendor UCM: $src -> backup/root/..."
|
||||
fi
|
||||
}
|
||||
|
||||
backup_user_wireplumber() {
|
||||
local d="${HOME}/.config/wireplumber/wireplumber.conf.d"
|
||||
local names=()
|
||||
if [[ -d "$d" ]]; then
|
||||
shopt -s nullglob
|
||||
local f
|
||||
for f in "$d"/*; do
|
||||
[[ -e "$f" ]] || continue
|
||||
local b
|
||||
b="$(basename "$f")"
|
||||
if [[ "$b" == *kaisa* ]] || [[ "$b" == 50-kaisa* ]]; then
|
||||
names+=("$b")
|
||||
fi
|
||||
done
|
||||
fi
|
||||
if ((${#names[@]} > 0)); then
|
||||
tar -C "$d" -czf "$STASH/user-wireplumber-conf.tar.gz" "${names[@]}"
|
||||
echo "已打包用户 WirePlumber 片段: ${names[*]} -> user-wireplumber-conf.tar.gz"
|
||||
else
|
||||
echo "(未找到 ~/.config/wireplumber/... 下含 kaisa 的片段,跳过 user-wireplumber-conf.tar.gz)"
|
||||
fi
|
||||
}
|
||||
|
||||
pack_system_overlay() {
|
||||
if [[ -f "$STASH/backup/root/usr/share/alsa/ucm2/conf.d/sof-rt5682/sof-rt5682.conf" ]]; then
|
||||
tar -C "$STASH/backup/root" -czf "$STASH/system-overlay.tar.gz" \
|
||||
usr/share/alsa/ucm2/conf.d/sof-rt5682/sof-rt5682.conf
|
||||
echo "已生成 system-overlay.tar.gz(可配合 restore 还原安装 deb 前的 vendor sof-rt5682.conf)"
|
||||
else
|
||||
echo "(未备份 vendor sof-rt5682.conf,不生成 system-overlay.tar.gz)"
|
||||
fi
|
||||
}
|
||||
|
||||
write_manifest
|
||||
backup_vendor_ucm
|
||||
backup_user_wireplumber
|
||||
pack_system_overlay
|
||||
|
||||
TOPO="$STASH/topology.txt"
|
||||
echo "正在调用 collect_linux_audio_topology.sh -> $TOPO"
|
||||
bash "${REPO_ROOT}/audio_topology/collect_linux_audio_topology.sh" "$TOPO"
|
||||
|
||||
echo ""
|
||||
echo "========== 基线已写入: $STASH =========="
|
||||
echo " manifest.txt — 包状态与 deb 路径清单"
|
||||
echo " topology.txt — 完整音频拓扑"
|
||||
echo " system-overlay.tar.gz — 若存在:vendor sof-rt5682.conf 快照"
|
||||
echo " user-wireplumber-conf.tar.gz — 若存在:用户 kaisa WirePlumber 片段"
|
||||
echo ""
|
||||
echo "恢复至「尽量接近本次采集时」的系统文件状态:"
|
||||
echo " ./scripts/restore-ubuntu-audio-baseline.sh $STASH"
|
||||
echo ""
|
||||
echo "若曾启用 §4.3 user systemd 自动 restore,恢复基线前可先禁用该 user 单元(见 OPERATION)。"
|
||||
80
scripts/restore-ubuntu-audio-baseline.sh
Executable file
80
scripts/restore-ubuntu-audio-baseline.sh
Executable file
@@ -0,0 +1,80 @@
|
||||
#!/usr/bin/env bash
|
||||
# 将系统尽量恢复到某次 capture-ubuntu-audio-baseline 采集时的「安装 deb 前」文件状态。
|
||||
# 典型:purge kaisa-hdmi-pipewire-fix → reinstall alsa-ucm-conf → 可选解压备份 tar。
|
||||
# 用法:./scripts/restore-ubuntu-audio-baseline.sh [基线目录]
|
||||
# 若不传参数,使用 audio_topology/baseline-stash/ 下最近修改的子目录。
|
||||
# 需要:sudo(apt、解压到 /);建议在桌面会话下执行以便重启 PipeWire。
|
||||
set -euo pipefail
|
||||
|
||||
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
|
||||
resolve_stash() {
|
||||
if [[ -n "${1:-}" ]]; then
|
||||
realpath "$1"
|
||||
return
|
||||
fi
|
||||
local latest
|
||||
latest="$(ls -td "${REPO_ROOT}/audio_topology/baseline-stash"/*/ 2>/dev/null | head -1 || true)"
|
||||
if [[ -z "$latest" ]]; then
|
||||
echo "未找到基线目录。请先运行: ${REPO_ROOT}/scripts/capture-ubuntu-audio-baseline.sh" >&2
|
||||
exit 1
|
||||
fi
|
||||
realpath "${latest%/}"
|
||||
}
|
||||
|
||||
STASH="$(resolve_stash "${1:-}")"
|
||||
|
||||
if [[ ! -f "$STASH/manifest.txt" ]]; then
|
||||
echo "不是有效基线目录(缺少 manifest.txt): $STASH" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "========== 使用基线: $STASH =========="
|
||||
echo "manifest 创建于:"
|
||||
head -5 "$STASH/manifest.txt"
|
||||
echo ""
|
||||
|
||||
if ! command -v sudo &>/dev/null; then
|
||||
echo "需要 sudo 以执行 apt。" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if dpkg -s kaisa-hdmi-pipewire-fix &>/dev/null; then
|
||||
echo ">>> apt purge kaisa-hdmi-pipewire-fix"
|
||||
sudo apt purge -y kaisa-hdmi-pipewire-fix
|
||||
else
|
||||
echo "(未安装 kaisa-hdmi-pipewire-fix,跳过 purge)"
|
||||
fi
|
||||
|
||||
echo ">>> apt install --reinstall alsa-ucm-conf"
|
||||
sudo apt install --reinstall -y alsa-ucm-conf
|
||||
|
||||
if [[ -f "$STASH/system-overlay.tar.gz" ]]; then
|
||||
echo ">>> 解压 system-overlay.tar.gz -> /(覆盖 vendor sof-rt5682.conf,与 reinstall 通常等价)"
|
||||
sudo tar -xzf "$STASH/system-overlay.tar.gz" -C /
|
||||
else
|
||||
echo "(无 system-overlay.tar.gz,仅依赖 alsa-ucm-conf reinstall)"
|
||||
fi
|
||||
|
||||
if [[ -f "$STASH/user-wireplumber-conf.tar.gz" ]]; then
|
||||
echo ">>> 解压 user-wireplumber-conf.tar.gz -> ${HOME}/.config/wireplumber/wireplumber.conf.d/"
|
||||
mkdir -p "${HOME}/.config/wireplumber/wireplumber.conf.d"
|
||||
tar -xzf "$STASH/user-wireplumber-conf.tar.gz" -C "${HOME}/.config/wireplumber/wireplumber.conf.d"
|
||||
echo "已恢复用户 WirePlumber 片段。"
|
||||
else
|
||||
echo "(无 user-wireplumber-conf.tar.gz,跳过用户配置)"
|
||||
fi
|
||||
|
||||
if systemctl --user is-system-running &>/dev/null; then
|
||||
echo ">>> systemctl --user restart wireplumber pipewire pipewire-pulse"
|
||||
systemctl --user restart wireplumber pipewire pipewire-pulse 2>/dev/null || {
|
||||
echo "(user 会话重启 pipewire 失败,请手动重登或重启)" >&2
|
||||
}
|
||||
else
|
||||
echo "(无可用 user systemd 会话,请登录图形界面后执行: systemctl --user restart wireplumber pipewire pipewire-pulse)"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "========== 恢复步骤已完成 =========="
|
||||
echo "若曾启用登录自动 restore(user systemd),恢复前可先禁用 kaisa-hdmi-iec958-pipewire 单元(见 OPERATION §4.3 / §4.5)。"
|
||||
echo "建议核对: pactl list cards | head -40 ; aplay -l"
|
||||
Reference in New Issue
Block a user