欢迎来到天天文库
浏览记录
ID:8981411
大小:25.00 KB
页数:9页
时间:2018-04-13
《openwrt升级功能流程简介》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、文档说明:本文档简述了openwrtsdk的升级功能流程,从页面传入升级文件到升级文件检测,再到调用升级脚本进行升级,升级完成后,进行系统重启。最后简述了如何添加升级文件标识,标识包括自己定义的字段,以及升级软件的md5值。达到防止用户用其他openwrtsdk编译出来的固件刷新我们的系统,以及防止升级软件被破坏。文档需要用到的文件及在sdk中的路径(某些文件路径可能随项目的不同而改动):./package/ralink/ui/luci-mtk/src/modules/admin-full/luasrc/controller/admin/system.lua./target/l
2、inux/ramips/image/Makefile./package/base-files/files/lib/upgrade/common.sh./package/base-files/files/lib/functions.sh./package/base-files/files/sbin/sysupgrade./target/linux/ramips/base-files/lib/ramips.sh./target/linux/ramips/base-files/lib/upgrade/platform.sh文档正文:1.从页面接受传过来的升级文件作为整个流程的开始,功
3、能实现在文件system.lua中。这是一个lua文件,很容易在functionindex函数中找到系统升级功能的入口函数:action_flashops。在这个函数中首先通过fp=io.open(image_tmp,"w")打开升级临时文件:/tmp/firmware.img,打开后通过fp:write(chunk)写入页面传进来的升级文件。到这里,接受升级文件完成。2.检测升级文件的合法性实现同样在文件system.lua中。在函数image_supported()中进行检测,这个函数通过imagemagicnumber来检测升级文件是否合法。函数image_support
4、ed()会调用platform.sh脚本中的platform_check_image函数,platform_check_image函数调用ramips.sh脚本中的ramips_board_name函数,获取boardname,ramips_board_name函数从文件/tmp/sysinfo/board_name中获取boardname,若没有则为unknown,并返回给调用者,我用的板是ralink-soc。platform_check_image函数继续调用common.sh脚本中的get_magic_long函数,用以获取升级文件magic,就是升级文件前4位。get
5、_magic_long函数调用common.sh脚本中的get_image函数用以获取文件/tmp/firmware.img内容,其实就是cat/tmp/firmware.img.获取到的内容,通过ddbs=4count=1,来获取前4位,最后通过hexdump-v-n4-e'1/1"%02x"'处理以十六进制编码返回调用者。获取到的升级文件magic,在platform_check_image函数中与27051956做对比,这个值是在固件编译的时候已经定好了的。如果相等,就是合法的升级文件,继续升级动作;不相等则为非法升级文件,做一些后续处理并终止升级动作。到这里检测升级文件
6、合法性完成。3.检测升级文件不合法后的处理实现同样在文件system.lua中。检测到不合法后,通过nixio.fs.unlink(image_tmp)来删除临时文件/tmp/firmware.img,并通过image_invalid=true,设置检测失败,用以通知页面显示提示信息。终止升级。处理完成。4.检测升级文件合法后的处理实现同样在文件system.lua中。检测到升级文件合法后,会获取一些升级文件相关的信息,用以在页面显示:调用image_checksum(),获取checksum;调用storage_size(),获取可用空间大小;调用nixio.fs.stat(
7、image_tmp).size,获取升级文件大小;以及页面传过来的是否保存配置的值;其中,image_checksum()函数用的是md5sum命令,storage_size()函数是在系统文件/proc/mtd中找到firmware分区大小。接下来如果用户选择进行升级文件,则会现在页面上打印一些提示信息,用于提示用户:正在升级,不要断开电源等等。文件system.lua最后的处理就是调用升级脚本:fork_exec("killalldropbearuhttpd;sleep1;/sbin/s
此文档下载收益归作者所有