//sysupgrade 命令详解
http://www.cnblogs.com/sammei/p/3973322.html
刚开始的时候,在openwrt的页面上升级,选择编好的固件以后,死活升不了。
提示:The uploaded image file does not contain a supported format. Make sure that you choose the generic image format for your platform.
因为页面执行,没有打印信息,所以用WinSCP连到路由器上,把固件上传到路由器的/tmp目录下。
WinSCP用法详见百度。
然后在串口命令行上执行下面的命令.
因为网页上面升级,最后也是走到这个sysupgrade脚本这来。
sysupgrade在路径/sbin/sysupgrade
使用cat 可以查看脚本里面的内容。
执行sysupgrade openwrt.bin 时,出现下面的打印.
Sysupgrade is not yet supported on generic.
Image check 'platform_check_image' failed.
发现,原来是在check file的时候出问题了。
sysupgrage 升级固件的时候,会提取固件头的magic number来进行比对.
sysupgrage脚本中,有如下语句.
这会调用$sysupgrade_image_check函数去进行头部的 magic number检验.
for check in $sysupgrade_image_check; do
( eval "$check \"\$ARGV\"" ) || {
if [ $FORCE -eq 1 ]; then
echo "Image check '$check' failed but --force given - will update anyway!"
break
else
echo "Image check '$check' failed."
exit 1
fi
}
done
sysupgrade_image_check函数,定义在/lib/upgrade/platform.sh
vi platform.sh 可以看到如下信息:
. /lib/ramips.sh
PART_NAME=firmware
RAMFS_COPY_DATA=/lib/ramips.sh
platform_check_image() {
local board=$(ramips_board_name)
local magic="$(get_magic_long "$1")"
[ "$#" -gt 1 ] && return 1
case "$board" in
3g150b|\
3g300m|\
3g-6200n|\
3g-6200nl|\
查到这的时候,就可以知道是这个函数返回失败了。
这个函数里面做的事情很简单,就是获取board name 和 magic number
然后可以加调试打印:
echo $board
echo $magic
把这两个值打印出来,
然后查看下面那一大串中是否有和它们配配的。
没有的话就添加吧。
我是因为修改了dts里面的machine的内容。所以它无法进行匹配,异致它无法升级的。
还有一种是因为factory.bin 这个固件里面包含了uboot头了。
也会提示上面的错误。
解决这个的办法就是把uboot头干掉。
可以使用如下命令:
dd if=openwrt-ramips-mt7620-miwifi-mini-squashfs-sysupgrade.bin bs=32 skip=1 of=openwrt.trx
hd openwrt-ramips-mt7620-miwifi-mini-squashfs-sysupgrade.trx | head 查看boot头
然后再进行烧写。就OK了。