10.openwrt调用sysupgrate失败

1.错误的产生

root@OpenWrtdl:/tmp# sysupgrade -n -v /tmp/openwrt-ramips-mt7620-mt7620a-squashfs-sysupgrade.bin 
Sysupgrade is not yet supported on generic.
Image check 'platform_check_image' failed.
root@OpenWrtdl:/tmp#

原因:

1、大部分情况都是用错了固件导致的,随便传一个文件给系统升级固件,肯定报这个错误

2、固件校验头错误,校验board name错误,这是本篇重点说的!
发现问题:

其实页面升级也是通过调用sysupgrade命令来升级的,而sysupgrade是在/sbin/下的一个脚本,直接看脚本,找对应的错误即可。

通过上面的错误可以看出是这个函数出错platform_check_image,而这个函数不在sysupgrade里面,看这个文件包含了什么其他什么脚本
Shell
#!/bin/sh
. /lib/functions.sh
. /lib/functions/system.sh

在lib下,那就去lib下用”grep -rn “platform_check_image” /lib”来搜索,发现了/lib/upgrade/platform.sh脚本实现了这个函数。

这个函数太长就不贴出了,脚本的第一个函数就是这个,函数的最后是这样的

echo “Sysupgrade is not yet supported on $board.”
有没有发现和刚才升级的时候报错很像!是的 就是他报的那个错误!!

那么board为什么是“generic”呢?在函数的开头是这样的
Shell
platform_check_image() {
local board= ( r a m i p s b o a r d n a m e ) l o c a l m a g i c = " (ramips_board_name) local magic=" (ramipsboardname)localmagic="(get_magic_long “$1”)"

board是执行了ramips_board_name函数的结果,而这个函数不在这个脚本内,在/lib/ramips.sh里面
Shell
ramips_board_name() {
local name

[ -f /tmp/sysinfo/board_name ] && name=$(cat /tmp/sysinfo/board_name)
[ -z "$name" ] && name="unknown"

echo "$name"

}

是读取的/tmp/sysinfo/board_name这个文件的结果。

那么这个文件是怎么生成的呢?

还在这个脚本中,看到这个脚本只有两个函数,另一个就是ramips_board_detect,他就是生成/tmp/sysinfo/board_name这个文件的地方!
Shell
*“Mediatek MT7621 evaluation board”)
name=“mt7621”
;;
*“Mediatek MT7628AN evaluation board”)
name=“mt7628”
;;
*“MediaTek LinkIt Smart 7688”)
linkit=" ( d d b s = 1 s k i p = 1024 c o u n t = 12 i f = / d e v / m t d 22 > / d e v / n u l l ) " i f [ " (dd bs=1 skip=1024 count=12 if=/dev/mtd2 2> /dev/null)" if [ " (ddbs=1skip=1024count=12if=/dev/mtd22>/dev/null)"if["{linkit}" = “LINKITS7688D” ]; then
name=“linkits7688d”
RAMIPS_MODEL="${machine} DUO"
else
name=“linkits7688”
fi
;;
*)
name=“generic”
;;
esac

[ -z "$RAMIPS_BOARD_NAME" ] && RAMIPS_BOARD_NAME="$name"
[ -z "$RAMIPS_MODEL" ] && RAMIPS_MODEL="$machine"

[ -e "/tmp/sysinfo/" ] || mkdir -p "/tmp/sysinfo/"

echo "$RAMIPS_BOARD_NAME" > /tmp/sysinfo/board_name
echo "$RAMIPS_MODEL" > /tmp/sysinfo/model

}

看到这个函数的倒数第二行了吧!!

往上看:RAMIPS_BOARD_NAME=”$name”

那么name就是关键了,看到函数的最上面对name的赋值依赖于machine,而machine是这样得来的
Shell
machine=$(awk ‘BEGIN{FS="[ \t]+:[ \t]"} /machine/ {print $2}’ /proc/cpuinfo)

我们在板子上跑下这个命令,结果如下
Shell
root@OpenWrtdl:/tmp/sysinfo# awk ‘BEGIN{FS="[ \t]+:[ \t]"} /machine/ {print $2}’ /proc/cpuinfo
Ralink MT7620a + MT7610e evaluation board
root@OpenWrtdl:/tmp/sysinfo#

发现这个结果在函数的switch case中没有匹配的,而没有匹配的就默认为“genneric”,所以就有了sysupgrade运行时的报错!

解决方法:

ok,问题知道了,解决方法就有很多了!

1、可以在platform_check_image函数中加入一行对generic的支持。

2、可以在ramips_board_detect函数的case中添加对“Ralink MT7620a + MT7610e evaluation board”的支持,写成name=mt7620a,然后在platform_check_image函数中加入一行对mt7620a的支持

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值