LXR | KVM | PM | Time | Interrupt | Systems Performance | Bootup Optimization

OpenWRT(18):固件升级sysupgrade

sysupgrade的主要作用是升级OpenWrt固件,同时尽可能保留用户配置。它通过备份指定的配置文件,擦除整个文件系统,安装新版本的OpenWrt,然后恢复保存的配置文件来实现升级。

参考《[OpenWrt Wiki] Sysupgrade – Technical Reference》。

1 sysupgrade脚本

sysupgrade功能的核心是/sbin/sysupgrade脚本:

Usage: /sbin/sysupgrade [<upgrade-option>...] <image file or URL>
       /sbin/sysupgrade [-q] [-i] [-c] [-u] [-o] [-k] <backup-command> <file>

upgrade-option:
    -f <config>  restore configuration from .tar.gz (file or url)
    -i           interactive mode
    -c           attempt to preserve all changed files in /etc/
    -o           attempt to preserve all changed files in /, except those
                 from packages but including changed confs.
    -u           skip from backup files that are equal to those in /rom
    -n           do not save configuration over reflash
    -p           do not attempt to restore the partition table after flash.
    -k           include in backup a list of current installed packages at
                 /etc/backup/installed_packages.txt
    -T | --test
                 Verify image and config .tar.gz but do not actually flash.
    -F | --force
                 Flash image even if image checks fail, this is dangerous!
    --ignore-minor-compat-version
             Flash image even if the minor compat version is incompatible.
    -q           less verbose
    -v           more verbose
    -h | --help  display this help

backup-command:
    -b | --create-backup <file>
                 create .tar.gz of files specified in sysupgrade.conf
                 then exit. Does not flash an image. If file is '-',
                 i.e. stdout, verbosity is set to 0 (i.e. quiet).
    -r | --restore-backup <file>
                 restore a .tar.gz created with sysupgrade -b
                 then exit. Does not flash an image. If file is '-',
                 the archive is read from stdin.
    -l | --list-backup
                 list the files that would be backed up when calling
                 sysupgrade -b. Does not create a backup file.

在OpenWrt的sysupgrade过程中,哪些文件被保留取决于以下几个因素:

  • /etc/sysupgrade.conf:这是一个可自定义的备份配置文件。你可以在该文件中指定你希望在升级过程中保留的文件和目录。
  • /lib/upgrade/keep.d/*:这些是由特定软件包提供的系统配置文件,它们会被默认保留。如果某些软件包在安装时在该目录下创建了符号链接,那么这些链接指向的文件也会被自动保留。
  • opkglist-changed-conffiles:这是一个由包管理器生成的文件列表,包含了自上次升级以来发生更改的配置文件。
  • -o选项会导致整个/overlay目录被保存,这意味着所有的自定义配置和变更都会保留下来。但-u选项有一个例外,如下所述。
  • -n选项会导致没有任何文件被保存,所有的配置设置都将从默认值重新初始化。
  • -u选项将阻止保留自上次sysupgrade以来未发生更改的任何文件。这可以防止程序迁移旧配置,减少升级所需的时间。
  • -f选项将完全覆盖上述所有行为。相反,.tar.gz文件中提供的确切文件将在sysupgrade后被提取到/overlay/upper。

参考《[OpenWrt Wiki] Sysupgrade – Options》。

2 sysupgrade工作流程

sysupgrade的工作流程详细参考《Sysupgrade – How It Works》:

  1. 解析命令行和验证选项:sysupgrade会解析命令行输入的选项,并确保没有传递互斥的选项。
  2. 可选的平台特定脚本:如果存在,执行/lib/upgrade/platform.sh脚本,该脚本可能覆盖默认行为。
  3. 创建保留文件列表:如果没有使用-f选项,sysupgrade会创建一个包含需要保留的文件的列表,并将其存储在/tmp/sysupgrade.tgz中。
  4. 下载固件:如果提供的固件是一个HTTP或HTTPSURL,sysupgrade会使用wget下载固件。
  5. 保存或复制固件:下载的固件会被保存到/tmp/sysupgrade.img,或者如果是本地文件,则直接复制到该位置。
  6. 验证固件:sysupgrade会验证固件的完整性,并检查设备树文件中的根compatible节点是否与当前固件中的值匹配。如果使用了-F选项,可以强制忽略检查。
  7. 发送升级消息:sysupgrade构建一个JSON消息,并通过ubus发送到procd以启动升级过程。
  8. procd处理消息:procd会解包并验证消息,然后验证固件。
  9. 不终止服务:procd在这一步不会终止任何服务。
  10. 执行/sbin/upgraded:/sbin/upgraded执行/lib/upgrade/stage2脚本,该脚本负责后续的升级步骤。
  11. 终止Telnet和SSH进程:sysupgrade会终止所有telnet、ash和dropbear进程。
  12. 发送TERM信号:对所有剩余的进程发送TERM信号,请求它们正常终止。
  13. 发送KILL信号:对所有仍未终止的进程发送KILL信号,强制它们终止。
  14. 创建新的RAM文件系统:sysupgrade创建一个新的RAM文件系统,挂载它,并将一些基本的二进制文件复制到其中。
  15. 切换到新的RAM文件系统:sysupgrade改变根目录到新的RAM文件系统。
  16. 重新挂载/overlay为只读:sysupgrade将/overlay重新挂载为只读,并在需要时延迟卸载它。
  17. 写入升级固件:sysupgrade将升级的固件写入磁盘。如果定义了platform_do_upgrade,则会运行它;否则,会使用mtd来刷写固件。
  18. 通过mtd保留文件:如果需要保留文件,sysupgrade会将tarball通过mtd的-j选项传递,这样在jffs2文件系统挂载后,tarball会以/sysupgrade.tgz的形式出现。
  19. 可选的平台复制配置:如果实现了platform_copy_config,则在这一点上运行它。
  20. 卸载所有文件系统:sysupgrade会卸载所有剩余的文件系统。
  21. 重启设备:完成升级后,sysupgrade会重启设备。
  22. 处理互斥选项:确保没有传递互斥的选项。
  23. 执行可选的平台特定升级函数:如果平台提供了platform_do_upgrade函数,则在这一步执行。

这个流程涵盖了从解析命令行选项到最终重启设备的整个sysupgrade过程。每个步骤都是为了确保固件更新的顺利进行,同时尽可能地保留用户的重要配置和数据。

3 sysupgrade触发方式:LuCI和CLI

参考《[OpenWrt Wiki] Upgrading OpenWrt firmware using LuCI and CLI》。

3.1 通过LuCI触发sysupgrade

配置LuCI支持sysupgrade更新:

LuCI
  3. Applications
    luci-app-attendedsysupgrade........ LuCI support for attended sysupgrades

使用LuCI进行OpenWrt固件升级的详细流程:

  • 准备工作

在开始升级之前,请确保你的设备已经安装了旧版本的OpenWrt固件,并且你希望进行sysupgrade操作来升级到新版本。

  • 定位并下载OpenWrt固件

-访问OpenWrt的官方下载页面,找到适用于你的设备的固件。
-下载对应的sysupgrade文件。请注意,不是所有设备都有名为sysupgrade.bin的固件镜像。

  • 验证固件文件并刷写固件
    通过LuCIWeb界面升级:
    • 连接设备:通过以太网线连接到你的设备(如果设备没有以太网连接选项,也可以使用无线连接)。
    • 登录Web界面:使用浏览器登录到LuCI的Web界面。
    • 访问固件升级页面:在LuCI的System→Backup/FlashFirmware菜单中,转到“Flashnewfirmwareimage”部分。
    • 取消勾选“保持设置”:特别是对于大版本升级,建议取消勾选“Keepsettings”复选框,以便应用新的默认设置。对于小版本升级,可能可以保留设置,但始终存在设置不兼容的风险。
    • 确保固件文件匹配:确保你准备刷写的OpenWrt固件文件与你路由器型号相匹配,并且文件名包含sysupgrade(如...sysupgrade.bin)。这表明你将升级现有的OpenWrt系统到一个更新的OpenWrt固件版本。
    • 选择固件文件:在“Flashnewfirmwareimage”部分,点击“Choosefile”选择固件镜像文件,然后点击“Flashimage...”。这将显示一个“FlashFirmware-Verify”页面,其中包含刚刚上传到路由器的固件文件的SHA256校验和。
    • 校验和验证:检查Web界面上显示的固件校验和是否与OpenWrt下载页面上的SHA256校验和匹配。如果不匹配,请不要继续,因为这可能是一个损坏的文件,可能会导致设备变砖。注意:如果你从OpenWrt15.05升级,显示的32个字符是MD5校验和,而不是SHA256。在继续之前,请在你的操作系统上验证此MD5校验和。
    • 开始升级:如果校验和匹配,点击“Proceed”。这将开始“System-Flashing...”进程,并显示一个旋转的加载图标和“Waitingforchangestobeapplied...”的提示。
    • 等待升级完成:升级过程可能需要几分钟时间,在此期间路由器会上传固件镜像并将其写入闪存ROM,最后重新启动。
    • 检查新固件是否已安装:新固件安装完成后,继续进行下一步以检查结果。
  • 故障排除

参考《[OpenWrt Wiki] Upgrading OpenWrt firmware using LuCI》。

3.2 通过CLI触发sysupgrade

使用命令行界面(CLI)通过sysupgrade进行OpenWrt固件升级的流程如下:

  • 准备工作

在开始升级之前,需要进行一些准备工作:

-备份当前设置:如果你希望在升级后保留现有的配置,需要备份当前的设置。这包括网络设置、Wi-Fi设置、设备主机名等。备份可以通过/etc/config目录下的配置文件来完成。

-导出/保存已安装的软件包列表:记录或保存当前已安装的软件包列表,以便在升级后重新安装这些软件包。

-获取/验证新的安装sysupgrade镜像:下载适用于你的设备的新的固件镜像,并验证其完整性。确保下载的固件与你的硬件兼容,并且是正确的sysupgrade镜像。

  • 下载固件

使用wget或其他工具下载固件到/tmp目录下。

  • 验证固件文件

验证下载的固件文件的完整性。对于旧的镜像,可以使用md5sum,对于新的镜像,推荐使用sha256sum:

md5sum -c md5sums2 > /dev/null | grep OK
sha256sum -c sha256sums2 > /dev/null | grep OK

期望的结果是下载的固件文件名后列出"OK"。

  • 执行sysupgrade

使用sysupgrade命令和固件文件名来执行升级。默认情况下,sysupgrade会保留设置(不使用-n选项):

sysupgrade -v /tmp/openwrt-15.05-ar71xx-generic-tl-wr1043nd-v1-squashfs-sysupgrade.bin

使用-v选项可以查看详细的升级过程。

  • 升级后的操作

-升级软件包:在基础操作系统固件镜像构建后发布的更新软件包,需要检查是否有更新的软件包。

-重新安装软件包:升级成功后,需要重新安装所有先前安装并保存的软件包。

-比较配置:新安装的软件包将安装新的默认版本配置文件。如果存在旧的自定义配置文件,opkg会显示警告,并将新配置文件版本保存在/etc/config/*-opkg文件名下。需要将新软件包提供的配置文件与旧的自定义文件比较,以合并任何新的选项或语法更改。可以使用diff工具来辅助完成这一步骤。

  • 故障排除

如果在升级过程中遇到问题,需要有应急计划:

-是否备份了当前设置?
-是否有当前(升级前)操作系统版本的副本以重新安装?
-是否有备用设备以防事情进展不顺利或需要比预期更多的时间?

通过以上步骤,你可以使用CLI通过sysupgrade工具来升级你的OpenWrt固件,同时保留你的配置设置。

参考《[OpenWrt Wiki] Upgrading OpenWrt firmware using CLI》。

4 sysupgrade升级保留配置和Package

[OpenWrt Wiki] Preserving OpenWrt settings during firmware upgrade》讨论了在sysupgrade过程中如何保留OpenWRT配置。

[OpenWrt Wiki] Preserving OpenWrt packages》讨论了在sysupgrade过程中如何保留OpenWRT的Package。

posted on 2024-10-06 23:59  ArnoldLu  阅读(628)  评论(0编辑  收藏  举报

导航