sysupgrade

用法:

sysupgrade [<升级选项>...] <image file 或 URL>

sysupgrade [-q] [-i] <备份选项>

升级选项:

  • -d 重启前等待 delay 秒
  • -f 从 .tar.gz (文件或链接) 中恢复配置文件
  • -i 交互模式
  • -c 保留 /etc 中所有修改过的文件
  • -n 重刷固件时不保留配置文件
  • -T | --test 校验固件 config .tar.gz,但不真正烧写
  • -F | --force 即使固件校验失败也强制烧写
  • -q 较少的输出信息
  • -v 详细的输出信息
  • -h 显示帮助信息

备份选项:

  • -b | --create-backup

    把sysupgrade.conf 里描述的文件打包成.tar.gz 作为备份,不做烧写动作
  • -r | --restore-backup

    从-b 命令创建的 .tar.gz 文件里恢复配置,不做烧写动作
  • -l | --list-backup

    列出 -b 命令将备份的文件列表,但不创建备份文件

举例

  • 更新openwrt.bin固件

    sysupgrade openwrt.bin

  • 强制更新openwrt.bin固件

    sysupgrade会检查支持板子的固件头信息,如果一个model没有在sysupgrade的支持列表里,使用-F来忽略检查失败,强制烧写。

    sysupgrade -F openwrt.bin

  • 更新后不保存之前的配置

    sysupgrade烧写时默认会备份配置文件,在烧写后把配置文件覆盖到新系统中。-n参数指定不做这个动作。

    sysupgrade -n openwrt.bin

  • 备份配置文件到/tmp/backup.tgz

    sysupgrade -b /tmp/backup.tgz

  • 恢复之前备份的/tmp/backup.tgz

    sysupgrade -r /tmp/backup.tgz

  • 列出会被备份的文件

    sysupgrade -l

    列出的文件会在-b备份时或系统升级时被保存。

实现

解析选项参数

  1. # parse options
  2. while [ -n "$1" ]; do
  3. case "$1" in
  4. -i) export INTERACTIVE=1;;
  5. -d) export DELAY="$2"; shift;;
  6. -v) export VERBOSE="$(($VERBOSE + 1))";;
  7. -q) export VERBOSE="$(($VERBOSE - 1))";;
  8. -n) export SAVE_CONFIG=0;;
  9. -c) export SAVE_OVERLAY=1;;
  10. -b|--create-backup) export CONF_BACKUP="$2" NEED_IMAGE=1; shift;;
  11. -r|--restore-backup) export CONF_RESTORE="$2" NEED_IMAGE=1; shift;;
  12. -l|--list-backup) export CONF_BACKUP_LIST=1; break;;
  13. -f) export CONF_IMAGE="$2"; shift;;
  14. -F|--force) export FORCE=1;;
  15. -T|--test) export TEST=1;;
  16. -h|--help) export HELP=1; break;;
  17. -*)
  18. echo "Invalid option: $1"
  19. exit 1
  20. ;;
  21. *) break;;
  22. esac
  23. shift;
  24. done
  25. export CONFFILES=/tmp/sysupgrade.conffiles
  26. export CONF_TAR=/tmp/sysupgrade.tgz
  27. export ARGV="$*"
  28. export ARGC="$#"

解析选项。\(ARGV是参数列表,\)ARGC是参数个数。

选项中有-d, -b, -r, -f时,由于这些选项都要带一个参数,所以使用了shift去减少\(ARGV和\)ARGC的值。

CONFFILES 和 CONF_TAR 是两个临时文件,后面会用到。

sysupgrade openwrt.bin --> ARGV="openwrt.bin", ARGC=1

sysupgrade -b config.backup --> ARGV为空,ARGC=0

判断参数合法

  1. [ -n "$ARGV" -a -n "$NEED_IMAGE" ] && {
  2. cat <<-EOF
  3. -b|--create-backup and -r|--restore-backup do not perform a firmware upgrade.
  4. Do not specify both -b|-r and a firmware image.
  5. EOF
  6. exit 1
  7. }

如果sysupgrade附带参数-b或-r时,则$NEED_IMAGE=1,否则为空

$NEED_IMAGE=1时,我们希望ARGV是空的,否则就是出错,则输出帮助信息,并退出。

例如:

  • sysupgrade -b config.backup,此时$NEED_IMAGE=1, ARGV为空,合法
  • sysupgrade -b config.backup openwrt.bin,此时$NEED_IMAGE=1, ARGV为"openwrt.bin",参数多了,错误。
  1. # hooks
  2. sysupgrade_image_check="platform_check_image"
  3. [ $SAVE_OVERLAY = 0 -o ! -d /overlay/etc ] && \
  4. sysupgrade_init_conffiles="add_uci_conffiles" || \
  5. sysupgrade_init_conffiles="add_overlayfiles"

带-c参数,且"/overlay/etc"目录存在 --> sysupgrade_init_conffiles="add_overlayfiles"

否则 --> sysupgrade_init_conffiles="add_uci_conffiles"

这里会影响要备份的配置文件

  1. include /lib/upgrade

包含lib/upgrade目录下的所有文件

  1. [ "$1" = "nand" ] && nand_upgrade_stage2 $@

命令指定nand时,则调用nand_upgrade_stage2函数,例如sysupgrade nand openwrt.bin。 暂时使用spi flash,不讨论这里。

backup list

  1. add_uci_conffiles() {
  2. local file="$1"
  3. ( find $(sed -ne '/^[[:space:]]*$/d; /^#/d; p' \
  4. /etc/sysupgrade.conf /lib/upgrade/keep.d/* 2>/dev/null) \
  5. -type f 2>/dev/null;
  6. opkg list-changed-conffiles ) | sort -u > "$file"
  7. return 0
  8. }
  9. if [ $CONF_BACKUP_LIST -eq 1 ]; then
  10. add_uci_conffiles "$CONFFILES"
  11. cat "$CONFFILES"
  12. rm -f "$CONFFILES"
  13. exit 0
  14. fi

列出一份文件列表,放入/tmp/sysupgrade.conffiles,打印出来,然后删掉。文件列表:

  1. find $(sed -ne '/^[[:space:]]*$/d; /^#/d; p' /etc/sysupgrade.conf /lib/upgrade/keep.d/* 2>/dev/null) -type f 2>/dev/null
  2. opkg list-changed-conffiles

create backup

  1. do_save_conffiles() {
  2. local conf_tar="${1:-$CONF_TAR}"
  3. [ -z "$(rootfs_type)" ] && {
  4. echo "Cannot save config while running from ramdisk."
  5. ask_bool 0 "Abort" && exit
  6. return 0
  7. }
  8. run_hooks "$CONFFILES" $sysupgrade_init_conffiles
  9. ask_bool 0 "Edit config file list" && vi "$CONFFILES"
  10. v "Saving config files..."
  11. [ "$VERBOSE" -gt 1 ] && TAR_V="v" || TAR_V=""
  12. tar c${TAR_V}zf "$conf_tar" -T "$CONFFILES" 2>/dev/null
  13. rm -f "$CONFFILES"
  14. }
  15. if [ -n "$CONF_BACKUP" ]; then
  16. do_save_conffiles "$CONF_BACKUP"
  17. exit $?
  18. fi

-b 如果指定打包文件时,$CONF_BACKUP 为那个文件名。则此时按如下流程来生成备份文件:

  1. do_save_conffiles
  2. -> sysupgrade_init_conffiles
  3. -> add_uci_conffiles
  4. -> tar czf /tmp/backup.tgz -T /tmp/sysupgrade.conffiles
  5. -> rm -f /tmp/sysupgrade.conffiles

restore

  1. if [ -n "$CONF_RESTORE" ]; then
  2. if [ "$CONF_RESTORE" != "-" ] && [ ! -f "$CONF_RESTORE" ]; then
  3. echo "Backup archive '$CONF_RESTORE' not found."
  4. exit 1
  5. fi
  6. [ "$VERBOSE" -gt 1 ] && TAR_V="v" || TAR_V=""
  7. tar -C / -x${TAR_V}zf "$CONF_RESTORE"
  8. exit $?
  9. fi

sysupgrade -r config.tgz --> tar -C / -xzf config.tgz

解压,覆盖到/目录下

image check

  1. for check in $sysupgrade_image_check; do
  2. ( eval "$check \"\$ARGV\"" ) || {
  3. if [ $FORCE -eq 1 ]; then
  4. echo "Image check '$check' failed but --force given - will update anyway!"
  5. break
  6. else
  7. echo "Image check '$check' failed."
  8. exit 1
  9. fi
  10. }
  11. done

sysupgrade openwrt.bin --> 检查bin文件:platform_check_image openwrt.bin

lib/upgrade/platform.sh 中定义platform_check_image函数,取.bin文件的头部,检查magic number

upgrade backup

  1. if [ -n "$CONF_IMAGE" ]; then
  2. case "$(get_magic_word $CONF_IMAGE cat)" in
  3. # .gz files
  4. 1f8b) ;;
  5. *)
  6. echo "Invalid config file. Please use only .tar.gz files"
  7. exit 1
  8. ;;
  9. esac
  10. get_image "$CONF_IMAGE" "cat" > "$CONF_TAR"
  11. export SAVE_CONFIG=1
  12. elif ask_bool $SAVE_CONFIG "Keep config files over reflash"; then
  13. [ $TEST -eq 1 ] || do_save_conffiles
  14. export SAVE_CONFIG=1
  15. else
  16. export SAVE_CONFIG=0
  17. fi

在升级时会先保存配置文件到/tmp/sysupgrade.tgz

  1. -f 指定配置文件
  2. 交互模式 ask_bool 可以获取输入值,如果不在交互模式,则ask_bool的第一个参数就是默认值。

    $SAVE_CONFIG默认为1, 这里调用do_save_conffiles保存当前系统的配置文件。

upgrade

  1. if [ -n "$(rootfs_type)" ]; then
  2. v "Switching to ramdisk..."
  3. run_ramfs '. /lib/functions.sh; include /lib/upgrade; do_upgrade'
  4. else
  5. do_upgrade
  6. fi
  1. rootfs_type = "overlayfs" ,执行第一个逻辑
  2. run_ramfs, 在/tmp/root下安装一个临时ramdisk,最后再执行do_upgrade
  3. do_upgrade -> platform_do_upgrade -> get_image "$1" | mtd -j "$CONF_TAR" write - "firmware"

mtd工具在写入时,会把$CONF_TAR文件整合进入jffs2分区,可以看到打印信息:

  1. Appending jffs2 data from /tmp/sysupgrade.tgz to firmware...

Sysupgrade – Technical Reference

openwrt: sysupgrade的更多相关文章

  1. 【转载】OpenWrt sysupgrade 命令行更新固件到最新版

    OpenWrt sysupgrade 命令行更新固件到最新版 下面我们要使用 sysupgrade 更新固件到trunk最新版. 要注意的是,trunk包含试验的功能,可能不稳定,刷机风险自己承担. ...

  2. openwrt的sysupgrade和factory固件的区别

    openwrt的固件一般分两种类型:factory原厂固件.sysupgrade固件 factory多了一些验证的东西,用于在原厂固件的基础上进行升级. 普通家用路由一般不是openwrt固件,如果要 ...

  3. 使用ubifs作为根文件系统的openwrt如何在进行sysupgrade时保存旧的配置

    1.openwrt的默认方案(squashfs + jffs2) sysupgrade脚本直接调用default_do_upgrade更新设备树.内核.根文件系统,那么它是如何保存旧配置的呢?请看de ...

  4. OpenWrt编译后生成的bin文件:jffs2与squashfs、factory与sysupgrade

    OpenWrt编译后会生成多个bin文件,比如 openwrt-ar71xx-generic-tl-wr841nd-jffs2-factory.bin 8126464 openwrt-ar71xx-g ...

  5. 如何用极路由+OpenWrt+SDR电视棒搭建SDR服务器

    0×00 前言 近期因为有个从异地捕获无线信号的需求,便尝试着用OpenWrt+公网IP搭建了一台SDR服务器.如果有小伙伴嫌SDR硬件天线看起来太乱.或者电脑没有足够的USB接口也可在局域网搭建SD ...

  6. 360路由器刷openwrt、不死uboot、双系统 、wifi中继

    该类教程网上有很多,但是很多不全,给小白用户造成了很多困扰.我也是按照网上的教程刷了半天,才熟悉了是怎么个回事.这里整理成教程. 注意: 请看教程步骤走,不要跳跃性刷机.不懂的术语.软件,若本文无介绍 ...

  7. 转:openwrt中luci学习笔记

    原文地址:openwrt中luci学习笔记 最近在学习OpenWrt,需要在OpenWrt的WEB界面增加内容,本文将讲述修改OpenWrt的过程和其中遇到的问题. 一.WEB界面开发         ...

  8. 如何用极路由+OpenWrt+RTL电视棒搭建一台SDR服务器,并隐秘地捕获和传输数据

    0×00 前言 近期因为有个从异地捕获无线信号的需求,便尝试着用OpenWrt+公网IP搭建了一台SDR服务器.如果有小伙伴嫌SDR硬件天线看起来太乱.或者电脑没有足够的USB接口也可在局域网搭建SD ...

  9. Openwrt 初探

    最近想研究一下Openwrt,于是开始搭建openwrt环境,虽然现在没有现成的板子,但是 可以先编译起来. openwrt的特点是基于下载 -> patch -> 编译 的一个工作模式, ...

随机推荐

  1. python算法-快速排序

    快速排序: 学习快速排序,要先复习下递归: 递归的2个条件: 1. 函数自己调用自己 2.有一个退出的条件 练习:基于递归下一个函数,计算n!并且求出当n等于10的值. n!=n * n-1*…..* ...

  2. CentOS 下通过命令登录Mysql

    CentOS 下通过命令登录Mysql: mysql -uroot -p 按回车键后输入密码

  3. 总结搭建Oracle11g DG踩的坑

    此次的操作环境是Oracle11g 单实例,os为Linux,采用duplicate在线创建物理备库 primary上设置相关参数 ALTER SYSTEM SET LOG_ARCHIVE_CONFI ...

  4. Linux硬件配置信息

      在网上找了N久,发现了一篇不错的文档,转载一下: 1.查看机器所有硬件信息: dmidecode |more dmesg |more 这2个命令出来的信息都非常多,所以建议后面使用"|m ...

  5. Python MySQLdb的execute和executemany的使用

    如果使用executemany对数据进行批量插入的话,要注意一下事项: conn = MySQLdb.connect(host = “localhost”, user = “root”, passwd ...

  6. BZOJ 2946 [Poi2000]公共串 ——后缀自动机

    任意选择一个串作为模式串,构建出后缀自动机. 然后用其他的串在后缀自动机上跑匹配. 然后就到了理解后缀自动机性质的时候. 在某一个节点的最大值是可以沿着parent树上传的. 然后用dp[i][j]表 ...

  7. BZOJ 1197: [HNOI2006]花仙子的魔法【DP】

    Description 相传,在天地初成的远古时代,世界上只有一种叫做“元”的花.接下来,出 现了一位拥有魔法的花仙子,她能给花附加属性,从此,“元”便不断变异,产生了大千世界千奇百怪的各种各样的花. ...

  8. 洛谷P3758 - [TJOI2017]可乐

    Portal Description 给出一张\(n(n\leq30)\)个点\(m(m\leq100)\)条边的无向图.初始时有一个可乐机器人在点\(1\),这个机器人每秒会做出以下三种行为之一:原 ...

  9. Contest Hunter #46 T1 磁力块 [分块]

    描述 在一片广袤无垠的原野上,散落着N块磁石.每个磁石的性质可以用一个五元组(x,y,m,p,r)描述,其中x,y表示其坐标,m是磁石的质量,p是磁力,r是吸引半径.若磁石A与磁石B的距离不大于磁石A ...

  10. Codevs 5564 陶陶摘苹果2

    5564 陶陶摘苹果2 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 白银 Silver 题目描述 Description 陶陶已经够高摘到所有苹果了,但是他力量有限,最大承受质量为 ...