OpenWrt 软件包与配置备份恢复

太阳作者太阳
原创内容采用 CC-4.0 协议发布,转载请注明出处
OpenWrt路由器网络

我这份笔记主要解决刷机后把常用配置和软件补回来的问题:启用 LuCI,记下中文界面、流量统计等包,再从 overlay 和 ROM 的包清单里找出后来安装的部分。原来的命令使用 opkg,下面保留这条流程,并补上配置归档和恢复时需要核对的步骤。

OpenWrt 24.10 及更早版本使用 opkg,25.12 及更新版本使用 apkOpenWrt 软件包管理文档25.12 发布说明说明了这个边界。

安装 LuCI

. /etc/openwrt_release
printf '%s %s\n' "$DISTRIB_ID" "$DISTRIB_RELEASE"

24.10 及更早版本:

opkg update
opkg install luci
/etc/init.d/uhttpd enable
/etc/init.d/uhttpd start

25.12 及更新版本:

apk -U add luci
/etc/init.d/uhttpd enable
/etc/init.d/uhttpd start

插件和语言包先用当前包管理器查询再安装,避免混用版本命令。

我当时额外记录过这些 LuCI 包名,实际安装前仍要以当前 feed 是否提供为准:

luci-i18n-base-zh-cn
luci-i18n-upnp-zh-cn
luci-app-openclash
luci-app-uhttpd
luci-i18n-statistics-zh-cn
luci-i18n-nlbwmon-zh-cn
collectd-mod-thermal

记录、备份和恢复

24.10 及更早版本可列出已安装包:

awk '/^Package:/ {print $2}' /usr/lib/opkg/status | sort > /tmp/installed-packages.txt

旧系统还可以从 overlay 的包元数据查看安装记录:

ls -1 /overlay/upper/usr/lib/opkg/info/*.list 2>/dev/null | awk -F/ '{print $NF}' | sed 's/\.list$//'

我当时用 ROM 与当前系统的 Package: 列表做差集,再生成安装文件;这只适用于 opkg 系统:

comm -23 <(awk '/^Package:/ {print $2}' /usr/lib/opkg/status | sort) <(awk '/^Package:/ {print $2}' /rom/usr/lib/opkg/status | sort) > /root/my_installed_packages.txt
opkg update
opkg install $(cat /root/my_installed_packages.txt)

这里的 <(...) 是进程替换语法,执行前应确认当前 shell 支持;精简固件还可能没有 comm。在不支持的环境里,可以先把两份已排序的清单分别写到文件,再在装有 comm 的电脑上运行 comm -23 current.txt rom.txt,把结果传回路由器。差集也包含后来安装的依赖,不等于只列出手动选择的顶层包;恢复前先读一遍 /root/my_installed_packages.txt,确认当前仓库仍提供这些包,再执行安装。

25.12 可用 apk list -I。配置备份:

sysupgrade -b /tmp/openwrt-backup.tar.gz

/tmp 会在重启时清空,备份应复制到其他设备;恢复前确认原设备型号、target、版本和存储布局一致。sysupgrade -l 列出当前配置备份会包含的文件,是待备份源文件清单,不是归档内容;归档生成后用 tar -tzf 查看其中的文件:

sysupgrade -l
tar -tzf /tmp/openwrt-backup.tar.gz

在电脑终端把归档和包清单拉到当前目录,HOST 替换为路由器地址:

scp root@HOST:/tmp/openwrt-backup.tar.gz .
scp root@HOST:/tmp/installed-packages.txt .

第二条要求已生成包清单;使用 apk 时先在路由器执行 apk list -I > /tmp/installed-packages.txt。如果路由器没有 SFTP 子系统,支持该选项的 OpenSSH 客户端可用 scp -O 切换到旧 SCP 协议。确认归档已落到电脑,再重启或刷机。

配置备份不包含固件镜像,也不等于已安装软件包清单;固件和软件包需要分别准备。sysupgrade -r /path/to/openwrt-backup.tar.gz 只适合恢复到兼容的原硬件、target、版本和配置格式;恢复前保留当前配置并准备串口或本地回退路径。24.10 可按确认过的包名执行 opkg updateopkg install,25.12 使用 apk -U add PACKAGE_NAME

apk list -I 的输出包含基础包和手动安装包,不能未经筛选直接拼接成 apk add 命令。先区分固件自带包与自己安装的包,再逐项验证名称和架构;OpenWrt 25.12 文档也提醒不要用 apk upgrade 盲目升级全部包。

清理边界

清理部分记录了下面这条移除 miniupnpd-nftables 的命令;它还可能移除不再需要的依赖,执行前应确认是否仍需要该 UPnP 服务:

opkg --autoremove remove miniupnpd-nftables