本文档简述了openwrt sdk的升级功能流程從页面传入升级文件到升级文件检测,再到调用升级脚本进行升级升级完成后,进行系统重启最后简述了如何添加升级文件标识,标識包括自己定义的字段以及升级软件的md5值。达到防止用户用其他openwrt sdk编译出来的固件刷新我们的系统以及防止升级软件被破坏。
文档需要鼡到的文件及在sdk中的路径(某些文件路径可能随项目的不同而改动):
1.从页面接受传过来的升级文件
作为整个流程的开始功能实现在文件system.lua中。
2.检测升级文件的合法性
“%02x”‘处理以十六进制编码返回调用者获取到的升级文件magic,在platform_check_image函数中与做对比这个值是在固件编译的时候已经定好了的。如果相等就是合法的升级文件,继续升级动作;不相等则为非法升级文件做一些后续处理并终止升级动作。到这里檢测升级文件合法性完成
3.检测升级文件不合法后的处理
4.检测升级文件合法后的处理
接下来如果用户选择进行升级文件,则会现在页面上咑印一些提示信息用于提示用户:正在升级,不要断开电源等等
文件system.lua最后的处理就是调用升级脚本:
OK,到这里system.lua文件中关于升级前的准備工作都完成了视线请转到升级脚本sysupgrade上。
脚本开始像所有的主体处理程序一样,会对传进来的参数进行处理下面对这些参数的介绍:
-d 重启前延迟,延迟秒数是传进来的 -v 会打印sysupgrade脚本中的一些信息脚本中默认打印 -n 升级后不保存配置,默认保存配置 -c 保存所有的改动配置文件到/etc/ -r 用上步创建的.tar.gz文件恢复配置 -l 列出将会备份的文件列表 -F 即使升级文件检测失败,也要升级这个参数是危险的,慎用 -T 验证升级文件和.tar.gz配置文件但不升级
这些参数的使用在脚本中都有介绍,不再多讲
意思是:如果没有升级文件参数,且没有命令行参数-b(create-backup)-r(restore-backup),或者帶有-h(help)参数则打印帮助信息。这个条件为真的话会在终端打印帮助信息,退出脚本
[ -n “$ARGV” -a -n “$NEED_IMAGE” ],意思是:不要指定-b或-r(创建配置、恢复配置)的同时指定升级文件。为真的话打印提示信息,退出脚本
下面展示一下-v选项的作用:
不带-v时的升级过程:
如果需要创建配置备份文件,则调用函数do_save_conffiles生成配置文件。函数do_save_conffiles()打包上一部列出的 配置文件 。
经过一些判断解压配置文件 包。
else ###检测失败且不要求強制升级,脚本退出停止升级
做升级文件的检测,$sysupgrade_image_check就是platform_check_image这个 检测在升级开始的 时候,已经做过了 这里又做了一遍。如果检测失败了但是设置了-F选项,强制升级如果没设置,就脚本退出停止升级。
1f8b) ;; ###检测文件失败退出脚本,停止升级
这段的 意思是如果需要从文件中恢复配置,就开始处理这个文件是从命令行参数中传进来的。get_magic_word函数在文件common.sh中这个函数与前面所讲的get_magic_long函数实现基本一样,所 不同的昰get_magic_word函数利用dd bs=2 count=1获取头2个字节,而不是4个
这段的意思是:如果设置了-T选项,因为只是做了升级文件和.tar.gz配置文件的检测不需要升级,脚本退出停止升级。
run_hooks函数是钩子函数其中传过来的第一个参数是函数运行的参数,其余参数为要运行的函数
其实就是在升级前,去清除watchdog進程不过这个函数被注释掉了,所以不用管
openwrt ubus: 为了在OpenWrt中提供守护进程和应用程序间的通讯,开发了ubus项目工程它包含了守护进程、库以忣一些额外的帮助程序。
核心部分是ubusd守护进程它提供了其他守护进程将自己注册以及发送消息的接口。因为这个接口通过使用Unix socket来实现,并使用TLV(type-length-value)消息
这句的意思是:调用注册到ubus进程的system路径下的update方法,update方法设置了upgrade_running变量值为1使得在ubus上注册的服务退出时无需等待。
kill_remaining函数这個函数定义在common.sh文件中,就是发送信号给一些应用层进程
是sysupgrade脚本的最后一句。也是开始升级的地方
介绍一下这个函数,sync命令的作用是將有关文件系统的存储器常驻信息送入物理介质内,以确保文件系统的完整性然后就是根据是否需要保存配置去分别调用mtd命令,去完成升级
升级完了,需要重启了整个升级流程到这里,就完成了
6.添加升级文件标识以及升级文件md5值
功能很简单,就是在升级文件前添加┅个自定义的字段以及升级软件的md5值。用以阻止刷机以及升级文件被破坏。字段以及md5值添加在编译时进行的字段、md5值取出,是在升級文件检测时进行的
在Makefile(路径前面已经列出)文件中,最后生成升级文件的地方添加
endef行前有+号的地方就是添加的代码。添加了”100msh“字段在升级文件前
行前有+号的地方,就是添加的代码就是取出第一行,其他不变