Fedora 上更新手动安装的 DEB 应用
上一篇 Fedora 上安装 DEB 包的完整指南 讲了如何在 Fedora aarch64 上通过手动解压 DEB 包来安装应用。本篇记录后续问题:怎么更新。
手动安装的应用没有包管理器跟踪,dnf update 不会管它。更新只能自己来。以 WPS 协作(XieZuo)从 5.41.1 升到 5.41.2 为例,记录完整操作流程。
环境信息
- Fedora 43, aarch64 (Asahi Linux on Apple Silicon)
- WPS 协作 5.41.1 → 5.41.2
- 安装位置:
~/.local/opt/xiezuo/(用户级安装)
获取新版本安装包
DEB 应用的更新包来源通常有三种:
| 来源 | 说明 |
|---|---|
| 官网下载 | 最常见,但有些应用没有 aarch64 Linux 的独立下载页 |
| 应用内自动更新器下载 | Electron 应用通常自带 auto-updater,会把新包下到配置目录 |
| 第三方镜像 | 如 AUR、Spark Store 等 |
WPS 协作的情况比较特殊:官网没有 Linux aarch64 的直接下载入口,但应用自带的 auto-updater 会在后台下载新版 DEB 包。
检查自动更新器是否已下载
find ~/.config/xiezuo -name '*.deb' 2>/dev/null如果有输出(类似下面这样),说明新版已经下好了:
/home/user/.config/xiezuo/signed_02270911_xiezuo_5.41.2_arm64_rc_5.41.0_branch_b68d2a5ea5_stable.deb这个文件名包含了版本号、架构、分支等信息,可以直接用。
如果 auto-updater 没有下载,就需要从官网或其他渠道手动获取 DEB 包。
更新流程
和首次安装一样,核心步骤是:解压 DEB → 替换文件。但更新时多了"关闭旧进程"和"备份旧版本"两步。
1. 关闭正在运行的应用
pkill -f '\.local/opt/xiezuo/xiezuo'等几秒确认进程全部退出:
pgrep -af xiezuo || echo "已退出"如果还有残留进程(Electron 应用经常有多个子进程),用 -9 强杀:
pkill -9 -f '\.local/opt/xiezuo/'2. 解压新版 DEB 包
mkdir -p /tmp/xiezuo-update && cd /tmp/xiezuo-update
ar x ~/.config/xiezuo/signed_*_5.41.2_*_stable.deb先检查包信息确认版本:
tar xf control.tar.* ./control && cat control确认 Version: 5.41.2、Architecture: arm64 无误后,解压数据:
tar xf data.tar.*3. 备份旧版本并替换
mv ~/.local/opt/xiezuo ~/.local/opt/xiezuo-old.bak
cp -r /tmp/xiezuo-update/opt/xiezuo ~/.local/opt/xiezuo用 mv + cp 而不是直接覆盖,好处是出问题可以立刻回退:
# 回退:
rm -rf ~/.local/opt/xiezuo
mv ~/.local/opt/xiezuo-old.bak ~/.local/opt/xiezuo4. 同步图标文件
DEB 包里的图标在 usr/share/icons/ 下,需要同步到用户目录:
for size in 128x128 256x256 32x32 48x48 64x64; do
src="/tmp/xiezuo-update/usr/share/icons/hicolor/${size}/apps/xiezuo.png"
[ -f "$src" ] && cp "$src" ~/.local/share/icons/hicolor/${size}/apps/
done5. 验证 .desktop 文件
如果 .desktop 文件里的 Exec 路径没变(仍然指向 ~/.local/opt/xiezuo/xiezuo),就不用改。确认一下:
grep '^Exec=' ~/.local/share/applications/xiezuo.desktop输出应该是:
Exec=/home/<user>/.local/opt/xiezuo/xiezuo --no-sandbox --disable-gpu-sandbox --disable-setuid-sandbox %U6. 启动验证
~/.local/opt/xiezuo/xiezuo --no-sandbox --disable-gpu-sandbox --disable-setuid-sandbox &在启动日志中确认新版本号:
(app/beforeReady) appInfo|{productName:'xiezuo',version:'5.41.2',...}另外可以观察 auto-updater 的检查结果,如果显示当前已是最新版就说明更新成功:
AUTOUPDATER|doCheckForUpdates|response: version=5.41.2, ..., force_update=false7. 清理
确认新版本工作正常后,删除备份和临时文件:
rm -rf /tmp/xiezuo-update
rm -rf ~/.local/opt/xiezuo-old.bak完整脚本
把上面的步骤整合成一个脚本,方便下次使用:
#!/usr/bin/env bash
set -euo pipefail
APP_NAME="xiezuo"
INSTALL_DIR="$HOME/.local/opt/$APP_NAME"
CONFIG_DIR="$HOME/.config/$APP_NAME"
ICON_DIR="$HOME/.local/share/icons"
TMP_DIR="/tmp/${APP_NAME}-update"
# 查找最新的 DEB 包(自动更新器下载的)
DEB_FILE=$(find "$CONFIG_DIR" -maxdepth 1 -name '*.deb' -printf '%T@ %p\n' \
| sort -rn | head -1 | cut -d' ' -f2-)
if [ -z "$DEB_FILE" ]; then
echo "未找到更新包,请手动下载 DEB 文件后重试。"
exit 1
fi
echo "找到更新包: $DEB_FILE"
# 关闭应用
pkill -f "$INSTALL_DIR/$APP_NAME" 2>/dev/null || true
sleep 2
pkill -9 -f "$INSTALL_DIR/" 2>/dev/null || true
# 解压
rm -rf "$TMP_DIR"
mkdir -p "$TMP_DIR" && cd "$TMP_DIR"
ar x "$DEB_FILE"
tar xf data.tar.*
NEW_VERSION=$(tar xf control.tar.* ./control -O | grep '^Version:' | awk '{print $2}')
echo "新版本: $NEW_VERSION"
# 备份 + 替换
[ -d "$INSTALL_DIR" ] && mv "$INSTALL_DIR" "${INSTALL_DIR}-old.bak"
cp -r "$TMP_DIR/opt/$APP_NAME" "$INSTALL_DIR"
# 同步图标
for size in 128x128 256x256 32x32 48x48 64x64; do
src="$TMP_DIR/usr/share/icons/hicolor/${size}/apps/${APP_NAME}.png"
dst="$ICON_DIR/hicolor/${size}/apps/"
[ -f "$src" ] && mkdir -p "$dst" && cp "$src" "$dst"
done
# 清理
rm -rf "$TMP_DIR"
rm -rf "${INSTALL_DIR}-old.bak"
echo "更新完成: $APP_NAME $NEW_VERSION"
echo "启动命令: $INSTALL_DIR/$APP_NAME --no-sandbox --disable-gpu-sandbox --disable-setuid-sandbox"保存为 ~/.local/bin/update-xiezuo.sh,chmod +x 后每次收到更新提示只需执行一条命令。
通用化
这套流程不限于 WPS 协作,所有通过手动解压 DEB 安装的 Electron 应用都适用。不同应用需要调整的只有:
| 参数 | WPS 协作 | 其他应用 |
|---|---|---|
APP_NAME | xiezuo | 对应的目录名 |
CONFIG_DIR | ~/.config/xiezuo | 应用的配置目录 |
| 启动参数 | --no-sandbox --disable-gpu-sandbox | 视应用需求调整 |
| DEB 包来源 | auto-updater 自动下载 | 可能需要手动下载 |
关键原则不变:备份旧版 → 解压新包 → 替换文件 → 验证启动。