内容发布更新时间 : 2024/12/26 20:13:51星期一 下面是文章的全部内容请认真阅读。
经过一些判断,解压配置文件 包。 接下来:
type platform_check_image,检测platform_check_image命令是否存在,为了 下步做准备。找不到的话,脚本 退出,升级终止。
接下来:
for check in $sysupgrade_image_check;
do( eval \ ###通过board name 和image magic number来判断升级文件是否合法
if [ $FORCE -eq 1 ]; then ####检测失败了,但是因为设置了-F选项,强制升级,停止检测 echo \ break else ###检测失败,且不要求强制升级,脚本退出,停止升级 echo \ exit 1 fi } done
做升级文件的检测,$sysupgrade_image_check就是platform_check_image,这个 检测在升级开始的 时候,已经做过了 ,这里又做了一遍。如果检测失败了,但是设置了-F选项,强制升级,如果没设置,就脚本退出,停止升级。
接下来:
if [ -n \ ####需要从文件中恢复配置 case \ ####获取文件内容,并拷贝2个字节,且转换为16进制输出 # .gz files
1f8b) ;; ###检测文件失败,退出脚本,停止升级 *) echo \ exit 1 ;; esac
get_image \export SAVE_CONFIG=1
elif ask_bool $SAVE_CONFIG \ ###默认升级保存配置 [ $TEST -eq 1 ] || do_save_conffiles export SAVE_CONFIG=1 else export SAVE_CONFIG=0 fi
这段的 意思是,如果需要从文件中恢复配置,就开始处理。这个文件是从命令行参数中传进来的。get_magic_word函数在文件common.sh中,这个函数与前面所讲的get_magic_long函数实现基本一样,所 不同的是get_magic_word函数利用dd bs=2 count=1,获取头2个字
节,而不是4个。 接下来“
if [ $TEST -eq 1 ]; then exit 0 fi
这段的意思是:如果设置了-T选项,因为只是做了升级文件和.tar.gz配置文件的检测,不需要升级,脚本退出,停止升级。
接下来:
run_hooks \
这句的意思是:运行函数sysupgrade_pre_upgrade。先介绍下run_hooks函数,定义在文件common.sh中。 run_hooks() { local arg=\ for func in \ eval \ done }
run_hooks函数是钩子函数,其中传过来的第一个参数是函数运行的参数,其余参数为要运行的函数。
再介绍sysupgrade_pre_upgrade函数。定义在platform.sh文件中。 #append sysupgrade_pre_upgrade disable_watchdog
disable_watchdog() { killall watchdog ( ps | grep -v 'grep' | grep '/dev/watchdog' ) && { echo 'Could not disable watchdog' return 1 } }
其实就是在升级前,去清除watchdog进程。不过这个函数被注释掉了,所以不用管。
接下来:
ubus call system upgrade
openwrt ubus: 为了在OpenWrt中提供守护进程和应用程序间的通讯,开发了ubus项目工程。它包
含了守护进程、库以及一些额外的帮助程序。
核心部分是ubusd守护进程,它提供了其他守护进程将自己注册以及发送消息的接口。因为这个,接口通过使用Unix socket来实现,并使用TLV(type-length-value)消息。
用法:Usage: ubus [
这句的意思是:调用注册到ubus进程的system路径下的update方法,update方法设置了upgrade_running变量值为1,使得在ubus上注册的服务退出时无需等待。
接下来:
kill_remaining TERM sleep 3 kill_remaining KILL kill_remaining函数,这个函数定义在common.sh文件中,就是发送信号给一些应用层进程。 用以升级前清除进程。
接下来:
run_ramfs '. /lib/functions.sh; include /lib/upgrade; do_upgrade'
是sysupgrade脚本的最后一句。也是开始升级的地方。 run_ramfs函数定义在common.sh文件中,先是安装一些命令到/tmp/root下,再在/tmp/root下构建一个临时文件系统。最后调用exec /bin/busybox ash -c \,来调用do_upgrade函数。do_upgrade函数调用platform_do_upgrade函数,platform_do_upgrade函数调用default_do_upgrade函数。
default_do_upgrade() { sync if [ \ get_image \| mtd $MTD_CONFIG_ARGS -j \write - \ else get_image \ fi }
介绍一下这个函数,sync命令的作用是,将有关文件系统的存储器常驻信息送入物理介质内,以确保文件系统的完整性。然后就是根据是否需要保存配置去分别调用mtd命令,去完成升级。
接下来:
v \ [ -n \ ask_bool 1 \ v \ reboot -f sleep 5 echo b 2>/dev/null >/proc/sysrq-trigger
升级完了,需要重启了。整个升级流程到这里,就完成了。
6.添加升级文件标识以及升级文件md5值
功能很简单,就是在升级文件前添加一个自定义的字段,以及升级软件的md5值。用以阻止刷机,以及升级文件被破坏。字段以及md5值添加在编译时进行的。字段、md5值取出,是在升级文件检测时进行的。
添加字段:
在Makefile(路径前面已经列出)文件中,最后生成升级文件的地方添加。 define MkImageSysupgrade/squashfs $(eval output_name=$(IMG_PREFIX)-$(2)-$(1)-$(if $(4),$(4),sysupgrade).bin) $(eval output_name_tmp=$(IMG_PREFIX)-$(2)-$(1)-$(if $(4),$(4),sysupgrade_tmp).bin) cat $(KDIR)/vmlinux-$(2).uImage $(KDIR)/root.$(1) > $(KDIR)/$(output_name) $(call prepare_generic_squashfs,$(KDIR)/$(output_name)) if [ `stat -c%s \ echo \ else \\ $(CP) $(KDIR)/$(output_name) $(BIN_DIR)/$(output_name_tmp); \\ fi + echo \ + md5sum $(BIN_DIR)/$(output_name_tmp) | cut -d ' ' -f 1 >> $(BIN_DIR)/mykey + cat $(BIN_DIR)/mykey $(BIN_DIR)/$(output_name_tmp) > $(BIN_DIR)/$(output_name) + rm -rf $(BIN_DIR)/$(output_name_tmp) + rm -rf $(BIN_DIR)/mykey
endef行前有+号的地方就是添加的代码。添加了”100msh“字段在升级文件前。
字段取出:
get_image() { #
+ {
+ echo \ + }|| + {
+ echo \ + exit 1 + } + sed -i \ + head -n 1 /tmp/myupfile > /tmp/check + sed -i \ + md5sum /tmp/myupfile | cut -d ' ' -f 1 > /tmp/mymd5 + diff -r /tmp/check /tmp/mymd5 + if [ $? -ne 0 ] ; then + echo different + exit 1 + fi + rm -rf /tmp/check /tmp/mymd5 + cat /tmp/myupfile + }
行前有+号的地方,就是添加的代码。就是取出第一行,其他不变。
另外default_do_upgrade()函数中的get_image \,修改成cat /tmp/myupfile,因为在调用default_do_upgrade()函数时,get_image函数中有些命令已经不能再用。
OK,文档到此结束。
水平有限,如有错误,请多包涵。 2015.10.30