页面紧急升级

openwrt页面升级中“不支持所上传的文件格式”的解决方案

推荐访问:

  我们在使用openwrt页面升级的时候,可能会遇到“不支持所上传的文件格式请确认选择的文件无误”这个问题,今天说说这个错误的原因和解决方法。

  1.现象

  通过页面升级提示如下,“不支持所上传的文件格式。请确认选择的文件无误。”

这里写图片描述

  通过sysupgrade命令升级时提示如下错误

  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#12341234

  2.原因:

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

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

  3.发现问题:

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

  通过上面的错误可以看出是这个函数出错platform_check_image,而这个函数不在sysupgrade里面,看这个文件包含了什么其他什么脚本

  #!/bin/sh

  . /lib/functions.sh

  . /lib/functions/system.sh123123

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

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

  echo “Sysupgrade is not yet supported on $board.”11

  有没有发现和刚才升级的时候报错很像!是的 就是他报的那个错误!!

  那么board为什么是“generic”呢?在函数的开头是这样的

  platform_check_image() {

  local board=$(ramips_board_name)

  local magic="$(get_magic_long "$1")"123123

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

  ramips_board_name() {

  local name

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

  [ -z "$name" ] && name="unknown"

  echo "$name"

  }1234567812345678

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

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

  还在这个脚本中,看到这个脚本只有两个函数,另一个就是ramips_board_detect,他就是生成/tmp/sysinfo/board_name这个文件的地方!

  *"Mediatek MT7621 evaluation board")

  name="mt7621"

  ;;

  *"Mediatek MT7628AN evaluation board")

  name="mt7628"

  ;;

  *"MediaTek LinkIt Smart 7688")

  linkit="$(dd bs=1 skip=1024 count=12 if=/dev/mtd2 2> /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

  }1234567891011121314151617181920212223242526272812345678910111213141516171819202122232425262728

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

  往上看:RAMIPS_BOARD_NAME=”$name”

  那么name就是关键了,看到函数的最上面对name的赋值依赖于machine,而machine是这样得来的

  machine=$(awk 'BEGIN{FS="[ \t]+:[ \t]"} /machine/ {print $2}' /proc/cpuinfo)11

  我们在板子上跑下这个命令,结果如下

  root@OpenWrtdl:/tmp/sysinfo# awk 'BEGIN{FS="[ \t]+:[ \t]"} /machine/ {print $2}' /proc/cpuinfo

  Ralink MT7620A evaluation board

  root@OpenWrtdl:/tmp/sysinfo#123123

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

  4.解决方法:

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

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

这里写图片描述

  2.在ramips_board_detect函数的case中添加对“Ralink MT7620A evaluation board”的支持,写成name=mt7620a,然后在platform_check_image函数中加入一行对mt7620a的支持

这里写图片描述

  OK,修改好之后编译就可以了,记得make clean!!!!

我们在使用openwrt页面升级的时候,建议做到认真,仔细没有解决不了的问题!


2017-07-10 16:52:46浏览次数:77次
本文来源:http://m.yiqi.com/retiao/detail_41.html
热门标签:
分享到
上一篇:instrument:词组以及解释
下一篇:页面升级:网站正在升级过程中模板

最新资讯

看过该文章的人还看过

页面升级

页面升级

页面升级