linux 网络在线升级,linux在线升级

//=======================================

前提信息:

1.系统分区信息

SPI-Flash:

[0] 0x000000000000-0x000000020000 : "SPL,128KB"

[1] 0x000000020000-0x0000000e0000 : "U-Boot,768KB"

[2] 0x0000000e0000-0x000000100000 : "U-Boot Env,128KB"

[3] 0x000000100000-0x000000200000 : "Reseved,1024KB"

Nand-Flash:

[4] 0x000000000000-0x000000500000 : "Kernel,5MB"

[5] 0x000000500000-0x000004500000 : "Rootfs,64MB"

[6] 0x000004500000-0x000010000000 : "Data,187MB"

#cat /proc/partitions

major minor  #blocks  name

31        0        128 mtdblock0

31        1        768 mtdblock1

31        2        128 mtdblock2

31        3       1024 mtdblock3

31        4       5120 mtdblock4

31        5      65536 mtdblock5

31        6     191488 mtdblock6

# cat /proc/mtd

dev:    size   erasesize  name

mtd0: 00020000 00001000 "SPL,128KB"

mtd1: 000c0000 00001000 "U-Boot,768KB"

mtd2: 00020000 00001000 "U-Boot Env,128KB"

mtd3: 00100000 00001000 "Reseved,1024KB"

mtd4: 00500000 00020000 "Kernel,5MB"

mtd5: 04000000 00020000 "Rootfs,64MB"

mtd6: 0bb00000 00020000 "Data,187MB"

2.用到以下工具,均在根文件系统里有,需要拷出来

注意:以下文件一定是解压到在SDRAM中或Data分区[需要挂载在/dev/mtdblock6]中执行,否则影响rootfs的升级。

$ ls

flash_erase  flash_eraseall  nanddump  nandwrite

//=======================================

1.制作升级包update.tar.gz,解压里面应该有

|-- update.sh

|-- uImage

|-- ubi.img

`-- util/

|-- flash_erase

`-- nandwrite

2.升级Kernel

/tmp/updatefile/util/flash_erase /dev/mtd4 0 0

/tmp/updatefile/util/nandwrite -p /dev/mtd4 /tmp/updatefile/$NAME_KERNEL

说明:-p参数,表示如果要写入的数据不是页大小的整数倍,会自己加填充数据即,如需要,自动padding

3.升级rootfs

升级rootfs的话,尽量把其他非内核必须的进程都关闭掉,防止在升级过程中,还有进程或和程序去读取nand flash上的rootfs

方法一:以下两条命令,不能使用reboot命令[直接断电或看门狗]

/tmp/updatefile/util/flash_erase /dev/mtd5 0 0

/tmp/updatefile/util/nandwrite -p /dev/mtd5/tmp/updatefile/$NAME_ROOTFS

方法二:失败!!

/tmp/updatefile/util/ubidetach -p /dev/mtd5

/tmp/updatefile/util/flash_erase /dev/mtd5 0 0

/tmp/updatefile/util/ubiformat /dev/mtd5 -f /tmp/updatefile/$NAME_ROOTFS

另外,发现有个更加好用的命令:

mtd_debug

# mtd_debug

usage: mtd_debug info mtd_debug read mtd_debug write mtd_debug erase

=================MLO的升级=======================

root@am335x-evm:/tmp#mtd_debug info /dev/mtd0

mtd.type = MTD_NORFLASH

mtd.flags = MTD_CAP_NORFLASH

mtd.size =131072(128K)

mtd.erasesize = 4096 (4K)

mtd.writesize = 1

mtd.oobsize = 0

regions = 0

root@am335x-evm:/tmp#mtd_debug erase /dev/mtd0 0131072【擦除整个分区】

Erased 131072 bytes from address 0x00000000 in flash

root@am335x-evm:/tmp# du -sh /tmp/MLO.byteswap

100.0K  /tmp/MLO.byteswap

root@am335x-evm:/tmp##ls -l MLO.byteswap | awk '{print $5}'

101169

root@am335x-evm:/tmp#mtd_debug write /dev/mtd0 0101169/tmp/MLO.byteswap【写入新内容,写入大小等于实际文件大小,否则出错!】Copied 101169 bytes from /tmp/MLO.byteswap to address 0x00000000 in flash

=================U-boot的升级=======================

root@am335x-evm:/tmp#mtd_debug info /dev/mtd1

mtd.type = MTD_NORFLASH

mtd.flags = MTD_CAP_NORFLASH

mtd.size =786432(768K)

mtd.erasesize = 4096 (4K)

mtd.writesize = 1

mtd.oobsize = 0

regions = 0

root@am335x-evm:/tmp#mtd_debug erase /dev/mtd1 0786432 【擦除整个分区】

Erased 786432 bytes from address 0x00000000 in flash

root@am335x-evm:/tmp# ls -l /tmp/u-boot.img

-rw-r--r--    1 root     root       482400Jun 26 12:01 /tmp/u-boot.img

root@am335x-evm:/tmp#mtd_debug write /dev/mtd1 0482400/tmp/u-boot.img   【写入新内容,写入大小等于实际文件大小,否则出错!】

Copied 482400 bytes from /tmp/u-boot.img to address 0x00000000 in flash

root@am335x-evm:/tmp#

参考资料:

//-------------------------------------------------------------------------------------------------

对于yaffs2系统(仅参考):

./util/nandwrite -o /dev/mtd2 rootfs.4k.arm.yaffs2

因为此处的rootfs镜像文件是yaffs2文件系统,包含了oob数据。所以此处加上参数-o,意思是写入页数据同时也写入oob数据,而且,加

了-o 参数同时就不能再像之前的uboot和uImage一样,加-p参数了,因为包含了oob数据的rootfs,本身就是页大小的整数倍,不需要

padding。

不论实际使用的是4K+128 还是对于4K+218(内部处理为4K+192)的nand,此处都是使用4K+128的rootfs镜像。

//-------------------------------------------------------------------------------------------------

在烧写某个文件之后,如果希望查看当前写入的数据,是否是我们所期望的,那么可以用nanddump工具,将对应部分的数据“打印”出来,比

如:

查看uboot的第一page的数据:

./nanddump -l 0x1000 -s 0x80000 -p /dev/mtd0

//-------------------------------------------------------------------------------------------------

把东西放到ramdisk中以避免影响

之前遇到很多人问这个问题了。那就是,如果在升级的时候,由于也会升级rootfs,但是本身升级过程中,所利用到的文件,如果是放在rootfs中,岂

不是会导致系统崩溃了?

答案是,不会。因为我之前介绍的方法中,是把升级所需的mtd工具,放到U盘的。而U盘是单独mount系统中的。

不过,更加好的做法是,把此处升级所相关的,所有的文件,包括mtd工具,要升级的各个文件,甚至其他可能用到的reboot等工具,设置是这些工具

可能依赖的到库文件等等,都全部拷贝到ramdisk中。这样,通过运行ramdisk中的所有工具,访问ramdisk中的要升级的文件,去升级系统,就不会对

升级rootfs而有啥负面影响,也不会由于升级rootfs而可能导致任何的系统崩溃了

$cat update.sh

#!/bin/bash

# =============================================================

# Author     : QiuWeibo

# Date          : 2014.5.12

# Version     : V1.0.0

# Comment     : For update aPM.MCU

#          1.Support Kernel update

#          2.Support Rootfs update

#          3.Support Monitor App update

#

# =============================================================

# Author     : QiuWeibo

# Date          : 2014.6.9

# Version     : V1.0.1

# Comment     : Add MLO and uboot update

#          1.Support MLO update

#          2.Support uboot update

# =============================================================

echo "firmware update shell start..."

UPDATE_MLO="Y"

UPDATE_UBOOT="Y"

UPDATE_KERNEL="Y"

UPDATE_ROOTFS="Y"

CLEAR_UBOOT_ENV="Y"

MONITOR_APP="Y"

NAME_MLO="MLO.byteswap"

NAME_UBOOT="u-boot.img"

NAME_KERNEL="uImage"

NAME_ROOTFS="ubi.img"

NAME_MONITOR="Monitor"

echo "   UPDATE_MLO=$UPDATE_MLO=$NAME_MLO"

echo " UPDATE_UBOOT=$UPDATE_UBOOT=$NAME_UBOOT"

echo "UPDATE_KERNEL=$UPDATE_KERNEL=$NAME_KERNEL"

echo "UPDATE_ROOTFS=$UPDATE_ROOTFS=$NAME_ROOTFS"

echo "CLEAR_UBOOT_ENV=$CLEAR_UBOOT_ENV"

echo "MONITOR_APP=$MONITOR_APP"

rm -rf /var/ftp/pub/*.tar.gz

echo "end rm -rf /var/ftp/pub/*.tar.gz "

cd /tmp/

# ============== handle for Monitor App Update start============

case "$MONITOR_APP" in

Y )

cp -f /tmp/updatefile/$NAME_MONITOR /mnt/userfs/Monitor

echo "update /mnt/userfs/Monitor success"

;;

* )

echo "Monitor App do not update"

;;

esac

rm -rf /tmp/updatefile/$NAME_MONITOR

echo "end rm -rf /tmp/updatefile/$NAME_MONITOR "

# ============== handle for Monitor App Update end============

# ============== handle for MLO update start============

case "$UPDATE_MLO" in

Y )

filesize=`ls -l /tmp/updatefile/$NAME_MLO | awk '{print $5}'`

if [[ $filesize -gt 1024 ]];then

mtd_debug erase /dev/mtd0 0 131072

mtd_debug write /dev/mtd0 0 $filesize /tmp/updatefile/$NAME_MLO

echo "mtd_debug write /dev/mtd0 0 $filesize /tmp/updatefile/$NAME_MLO"

else

echo "/tmp/updatefile/$NAME_MLO error! filesize= $filesize lt 1024!"

fi

;;

* )

echo "MLO do not update"

;;

esac

rm -rf /tmp/updatefile/$NAME_MLO

echo "end rm -rf /tmp/updatefile/$NAME_MLO "

# ============== handle for MLO update end============

# ============== handle for Uboot update start============

case "$UPDATE_UBOOT" in

Y )

filesize=`ls -l /tmp/updatefile/$NAME_UBOOT | awk '{print $5}'`

if [[ $filesize -gt 1024 ]];then

mtd_debug erase /dev/mtd1 0 786432

mtd_debug write /dev/mtd1 0 $filesize /tmp/updatefile/$NAME_UBOOT

echo "mtd_debug write /dev/mtd1 0 $filesize /tmp/updatefile/$NAME_UBOOT"

else

echo "/tmp/updatefile/$NAME_UBOOT filesize error! $filesize lt 1024"

fi

;;

* )

echo "u-boot do not update"

;;

esac

rm -rf /tmp/updatefile/$NAME_UBOOT

echo "end rm -rf /tmp/updatefile/$NAME_UBOOT "

# ============== handle for Uboot update end============

# ============== handle for clear u-boot env start============

case "$CLEAR_UBOOT_ENV" in

Y )

flash_erase /dev/mtd2 0 0

echo "end clear uboot env at eraseall /dev/mtd2"

;;

* )

echo "uboot env do not erase!"

;;

esac

# ============== handle for clear u-boot env end============

# ============== handle for kernel update start============

case "$UPDATE_KERNEL" in

Y )

flash_erase /dev/mtd4 0 0

nandwrite -p /dev/mtd4 /tmp/updatefile/$NAME_KERNEL

echo "end nandwrite /tmp/updatefile/$NAME_KERNEL /dev/mtd4"

;;

* )

echo "KERNEL do not update"

;;

esac

rm -rf /tmp/updatefile/$NAME_KERNEL

echo "end rm -rf /tmp/updatefile/$NAME_KERNEL "

# ============== handle for kernel update end============

# ============== handle for rootfs update start============

case "$UPDATE_ROOTFS" in

Y )

if [ -e "/tmp/updatefile/util/flash_erase" ] && [ -e "/tmp/updatefile/util/nandwrite" ];then

/tmp/updatefile/util/flash_erase /dev/mtd5 0 0

/tmp/updatefile/util/nandwrite -p /dev/mtd5 /tmp/updatefile/$NAME_ROOTFS

echo "end nandwrite /tmp/updatefile/$NAME_ROOTFS /dev/mtd5"

else

echo "/tmp/updatefile/util/flash_erase or nandwrite not exist! error"

fi

;;

* )

echo "rootfs do not update"

;;

esac

rm -rf /tmp/updatefile/

echo "end rm -rf /tmp/updatefile/ "

# ============== handle for rootfs update end============

rm -rf /tmp/rarlist.txt/

echo "end rm -rf /tmp/rarlist.txt/ "

rm -rf /tmp/update.sh/

echo "end rm -rf /tmp/update_firmware.sh/ "

echo "firmware update shell end"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372567.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XML反序列化出错,XML 文档(2, 2)中有错误

XML转换为实体类的错误处理方案 一.错误描述&#xff1a; XML反序列化出错&#xff0c;XML 文档(2, 2)中有错误二.解决方案&#xff1a; 在实体类的字段要加上XmlElement属性三.具体实现: 1.XML文档 <EVENT_INSTANCE><EventType>ALTER_TABLE</EventType><…

iOS--支付宝环境集成

1.下载支付宝SDK以及Demo https://doc.open.alipay.com/doc2/detail?treeId54&articleId103419&docType1 2.新建文件夹“AliSDK”&#xff0c;将压缩包内的文件拷贝到该文件夹下&#xff0c;完成后如下图所示&#xff1a; 3.将文件夹拷贝到项目中&#xff0c; 4.执行完…

再见,再见,5 * 60 * 1000 //五分钟,再见,再见

在这篇文章中&#xff0c;我将讨论一个在1.5版中首次引入的类&#xff0c;我使用了太多&#xff0c;但是与一些人交谈&#xff0c;他们说他们不知道它的存在。 此类是TimeUnit 。 TimeUnit类表示给定粒度单位的持续时间&#xff0c;还提供了转换为不同单位的实用方法以及执行计…

windows如何调用Linux的API,Windows和Native API中的系统调用?

最近&#xff0c;我在* NIX操作系统中使用了很多汇编语言。我想知道Windows域。Linux中的调用约定&#xff1a;mov $SYS_Call_NUM, %eaxmov $param1 , %ebxmov $param2 , %ecxint $0x80而已。这就是我们应该如何在Linux中进行系统调用。linux中所有系统调用的参考&#xff1a;关…

maven生命周期和插件

maven生命周期和插件 生命周期 maven的生命周期有三套&#xff0c;互相独立。每个生命周期含有不同阶段&#xff0c;常用如下 clean 清理项目 pre-clean 执行清理前需要完成的工作clean 清理上一次构建生成的文件post-clean 执行清理后需要完成的工作default 构建项目 validate…

Java EE 6测试第二部分– Arquillian和ShrinkWrap简介

在Java EE 6测试的第一部分中&#xff0c;我简要介绍了使用Glassfish嵌入式容器的EJB 3.1 Embeddable API&#xff0c;以演示如何启动该容器&#xff0c;如何在项目类路径中查找bean以及运行非常简单的集成测试。 这篇文章重点介绍Arquillian和ShrinkWrap以及为什么它们是用于企…

linux内存分配堆栈数据段代码段,linux – LD_PRELOAD堆栈和数据段内存分配

你好,我正在编写一个Linux模块(基于名为“Ccontrol”的GitHub项目)来创建缓存分区(a.k.a页面着色),以减轻定时侧通道攻击(用于防止Prime Probe等攻击).我已经使用LD_PRELOAD系统env变量来覆盖所有malloc(),calloc()和free()调用,并用颜色感知调用替换它们.现在我正在寻找颜色堆…

【腾讯Bugly干货分享】Android内存优化总结实践

本文来自于腾讯Bugly公众号&#xff08;weixinBugly&#xff09;&#xff0c;未经作者同意&#xff0c;请勿转载&#xff0c;原文地址&#xff1a;https://mp.weixin.qq.com/s/2MsEAR9pQfMr1Sfs7cPdWQ 导语 智能手机发展到今天已经有十几个年头&#xff0c;手机的软硬件都已经发…

以编程方式向OpenJPA注册实体类型

我刚刚开始为Isis开发 OpenJPA对象库 。 在一般情况下&#xff0c;可以在persistence.xml文件中注册实体类型。 但是&#xff0c;Isis是一个框架&#xff0c;可以构建自己的元模型&#xff0c;并且可以自行确定哪些类构成实体。 因此&#xff0c;我不想强​​迫开发人员重复自己…

linux redis客户端,Redisson 3.4.0和2.9.0发布,Redis客户端

Redisson 3.4.0和2.9.0发布&#xff0c;Redis客户端发布时间:2017-04-27 09:12:16来源:红联作者:baihuoRedisson于2017年4月26日发布了3.4.0和2.9.0版本Redisson是架设在Redis基础上的一个Java驻内存数据网格(In-Memory Data Grid)。充分的利用了Redis键值数据库提供的一系列优…

LeetCode 349 Intersection of Two Arrays

Given two arrays, write a function to compute their intersection. Example: Given nums1 [1, 2, 2, 1], nums2 [2, 2], return [2]. 思路&#xff1a; 利用ArrayList的contains(Object o)方法进行交集的查询。 解法&#xff1a; 1 import java.util.ArrayList;2 3 publi…

shell脚本1——变量 $、read、``

与Shell变量相关的几个命令&#xff1a; 变量只在当前Shell中生效. source 这个命令让脚本影响他们父Shell的环境&#xff08;. 可以代替source命令&#xff09; export 这个命令可以让脚本影响其子Shell的环境 () unset 从环境中删除变量 其他几个与变量有关的命令&#xff1…

令人印象深刻的第一个Apache Camel版本

为了准备下周的CamelOne会议&#xff0c;我花了一些时间回顾一下Apache Camel项目的历史。 因此&#xff0c;除其他外&#xff0c;我了解了Apache Camel的第一个正式1.0版本 。 Apache Camel 1.0 – 5年前 我看的越多&#xff0c;这个版本的事实给我留下了深刻的印象。 现在您…

Linux禁用user01账户,Linux 管理用户 useradd

创建用户、设置密码、修改用户、删除用户&#xff1a;useradd testuser 创建用户testuseruseradd [选项]useradd 命令选项-u uid:指定新用户的uid,默认用当前最大uid加1-g group:指定新用户所在的组(私有组),该组必须存在-G group:指定新用户的附加组-d dir:指定新用户的自家目…

css小细节

1. 文字居中显示 水平居中&#xff1a; text-align: center; 垂直居中&#xff1a; line-height: (height); 2.子元素相对于父元素的绝对布局。 父元素一定要 position: relative/absolute/fixed; 默认position 是static 转载于:https://www.cnblogs.com/zcancandice/p/5…

为什么在2012/2013年我将在新的Enterprise Java项目中继续使用Spring *和* Java EE

自从我担任技术决策职务以来已经过去了一年多&#xff0c;很高兴看到我仍然与之保持着完美的和谐。 几个月前&#xff0c;我在KaiWhner的一个不错的博客中写了一个有关JEE与Spring的答案。 如果观点没有不同&#xff0c;那么讨论的附加值在哪里&#xff1f; 我确实同意Kai的许多…

linux ubuntu 五笔输入法,ubuntu下安装fcitx五笔输入法

安装fcitx输入法sudo add-apt-repository ppa:fcitx-team/stable #添加安装源&#xff0c;apt-get 添加&#xff0c;nightly源也可以sudo apt-get update #更新源&#xff0c;否则无法安装fcit…

浅谈Windows下SVN在Android Studio中的配置、基本使用及解除关联

看到网上很多关于svn环境配置和关联Android-Studio的很多博文&#xff0c;发现很零散&#xff0c;想集大家所长整理一下&#xff1a; 在AndroidStudio中开发版本控制中&#xff0c;除了Git就是SVN&#xff0c;和Eclipse不同Android Studio没有提供单独的插件&#xff0c;只能和…

四. 基于环视Camera的BEV感知算法-BEVDepth

目录 前言0. 简述1. 算法动机&开创性思路2. 主体结构3. 损失函数4. 性能对比总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第四章——基于环视Cam…

【腾讯Bugly干货分享】Android Patch 方案与持续交付

本文来自于腾讯bugly开发者社区&#xff0c;非经作者同意&#xff0c;请勿转载&#xff0c;原文地址&#xff1a;http://dev.qq.com/topic/57a31921ac3a1fb613dd40f3 Android 不仅系统版本众多&#xff0c;机型众多&#xff0c;而且各个市场都各有各的政策和审核速度&#xff0…