ngswfx

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx  发布于  2017-03-03 10:43:17
采纳率 0%
55个问答
3320

网络升级探讨-2种基本可行的思路

 
本帖最后由 ngswfx 于 2017-3-3 11:21 编辑

第一种思路就是我现在使用的:

直接在ARM APP里面建立和PC客户端SDK网络交互,将整体升级包,或者各个模块的升级包发送到arm嵌入式端,然后在嵌入式arm端,通过dd,或者flashcp程序,或者通过mtd直接操作,写入相关模块,目前遇到的最大问题就是rootfs部分总失败,考虑原因可能是因为,linux系统对于rootfs分区正在占用,正在使用的原因,其他部分,例如uboot,ENV,kernel,setting,logo等分区都可以实现升级,失败的几率很小。但rootfs失败的几率有些大,为此,这种思路的升级方式一直没敢公开使用。


第二思路:通过tftp方式,让uboot自动实现升级。
PC客户端向远端arm发出升级需求,并且准备好升级包,远端arm端,检查版本等信息是否正常,如果可以升级,PC客户端将升级包拆分抛弃掉升级头结构(升级包升级头结构,里面有芯片型号,内存大小,flash大小,版本等信息),准备好和flash内存一一对应的升级包,另外准备好tftp32程序,将最终升级包拷贝到tftp32程序所在目录,开启tftp32程序服务,将当前机器IP地址发送给远端arm端,远端arm端,检查自己的IP,以及tftp32服务器端IP,(当然可以顺便检查一下tftp32服务器是否基本正常),读取uboot后面的ENV环境变量,修改写入arm本地IP地址以及远端Tftp32服务器IP地址,并且设置升级标志bTftpUpdate=1,远端arm控制重启,本地升级工具进入300秒倒计时,并探测尝试APP连接状态(升级如果完全成功,arm启动后,会自动开启APP),用以标记升级是否成功。

远端uboot如果发现需要网络升级的标志bTftpUpdate=1,就开始组建升级包名称,然后到env里面读取tftp32服务器IP地址,然后通过tftp网络获取数据包,得到数据包以后,开始升级过程,升级结束并且成功以后,修改网络升级的标志bTftpUpdate=2,然后控制重新启动,当uboot再次启动时,发现升级标志是2,忽略,不进行其他动作,等进入操作系统rootfs系统以后,由APP程序接管,读取env环境变量,如果发现bTftpUpdate=2或者大于2,将其设置为0,升级正式结束。

第三种思路,超级疯狂的模式:lol (没戏可能性非常大),就是在APP下,将准备好的升级包放到内存的某个位置(例如海思占用的那部分内存空间,先把海思的驱动卸载了,然后放到内存后面那一部分,因为前面一些部分,再次开机,uboot可能要用到),然后重启系统,如果系统重启过程中,这部分内存不会被破坏,uboot重启接管后,直接使用这部分内存中的数据进行升级。不过我估计既然是重启,这些内存很可能被破坏掉了。


/////////////目前考虑采用第二种模式,这种方法的好处也是显而易见的,就是如果rootfs等大小即便发生明显改变,甚至是分区个数发生改变,升级依然正常(类似于u盘升级模式),另外的好处就是可以不同版本同时升级,只需要对PC客户端流程少许修改即可,而且升级出错的可能性很小,只需要控制好,实际升级时,单独对uboot以及env变量部分先升级,升级彻底失败的,报废返厂的可能性是很小的,是可控的,可以恢复的,即便失败,也可以再次通过u盘升级补救。当然这种升级模式,也可以让整个系统支持自动升级,甚至是无须技术员人为干预,只要升级服务器有升级包,就自动更新升级了,最根本还是因为这种升级模式类以u盘升级,不用过多考虑分区问题。

第一种模式由于和mtd相关,除非每个mtd最早规划都考虑了增容需求,否则,在系统环境下,写mtd,如果升级包内当前mtd空间需求比现在的大,就不好处理了。例如kernel等分区,如果加入某些项目支持,大小发生明显改变,超过了以前的值,并考虑到spi 64K  NAND 128K问题,整体大小发生明显改变。此时当前系统的mtd操作,应该无法应对这种情况吧(除非以前的kernel分区本身就有64K或者128K的富余)。

///不知道大家目前采用的何种模式进行网络升级。如果是第一种方式,又怎么去处理rootfs升级容易失败的问题。


最大的困惑就是,现在这些厂家做的都是IE升级,在IE里面有一个网络升级功能,从升级动作的流程来看,好像就是第一种思路,因为点击完升级,立刻就开始发送数据了。只不过不知道他们是怎么处理rootfs等系统占用分区的问题的。
我来回答
回答14个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-03-03 11:32:32
认可0
第一种方式

既然发现是分区被占用,那升级前都umount;P

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2017-03-03 11:58:53
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=45996&ptid=14393]zhuangweiye 发表于 2017-3-3 11:32[/url]
第一种方式

既然发现是分区被占用,那升级前都umount[/quote]

呵呵谢谢指点,看来我要研究一下怎么umount这个rootfs分区才行,目前总是失败,有好多程序在占用/根目录。

falloutmx

1个粉丝

15

问答

0

专栏

0

资料

falloutmx 2017-03-03 13:50:36
认可0
最小rootfs应该是很稳定的,不需要升级吧?

falloutmx

1个粉丝

15

问答

0

专栏

0

资料

falloutmx 2017-03-03 13:52:52
认可0
第二种方法我已经实现了,只要uboot不被破坏,可自动升级/修复板卡。

hanfei69882

2个粉丝

26

问答

0

专栏

2

资料

hanfei69882 2017-03-03 15:08:32
认可0
本帖最后由 hanfei69882 于 2017-3-3 15:10 编辑

第一种方法可以实现,linux启动之后是在内存中运行的,升级是对flash操作的,理论上是没影响的,我这边用的就是这种方法
“linux系统对于rootfs分区正在占用”之前遇到一个问题是mtd分区设备号没处理好,可以参考一下

hanfei69882

2个粉丝

26

问答

0

专栏

2

资料

hanfei69882 2017-03-03 17:58:01
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=45996&ptid=14393]zhuangweiye 发表于 2017-3-3 11:32[/url]
第一种方式

既然发现是分区被占用,那升级前都umount[/quote]

刚确认了一下,是要先umount:handshake

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2017-03-04 00:57:22
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=46014&ptid=14393]hanfei69882 发表于 2017-3-3 17:58[/url]
刚确认了一下,是要先umount[/quote]

有道理,我现在也是umount -f /dev/mtdblock3

uboot +env+kernel+rootfs+APP+config+logo

这样的话,mtdblock3就是rootfs,提示有占用,使用fuser /dev/mtdblock3发现很多程序占用。

///////看来要关闭部分程序,否则,umount总提示无法卸载。不过就目前测试看,rootfs基本可以升级成功了。还在做大量测试,看失败几率能否接受。

blacktulip7

0个粉丝

3

问答

0

专栏

0

资料

blacktulip7 2017-03-06 23:46:30
认可0
第一种方式应该很多公司都在用,一般保持rootfs体积很小,一般情况下不会去升级rootfs分区;在内存比较充足的情况去擦写rootfs分区会有警告,但是不会变砖,但是内存比较紧张的话就容易出问题,直接起不来;
第二种方式没用过,做工业安防产品应该没什么问题,但是做消费类产品的话需要用到公网,tftp down不下来固件,这个只能在局域网环境下用;
第三种方式前几年在海思的平台上用过,可以负责任的说,mmz部分的内存只要不下电,数据是不会丢失的,所以可以把固件写到mmz,然后重启,uboot里面去检查,升级;
最后推荐的方式呢,就是使用initramfs或者initrd,前者将rootfs跟kernel打在一起,后者呢会将rootfs load内存中来挂在,原则只有一个,运行中的系统的rootfs在内存中,不依赖flash,然后呢,所以得事情就迎刃而解了,至于缺点就是rootfs放到内存里面,使用xz算法的话会占1-2MB的内存,应该不是问题

blacktulip7

0个粉丝

3

问答

0

专栏

0

资料

blacktulip7 2017-03-06 23:53:46
认可0
至于想umount rootfs,只能说想法不对,你把一个人的腿砍了,还指望他走路……

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2017-03-07 02:54:02
认可0
本帖最后由 ngswfx 于 2017-3-7 03:31 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=46139&ptid=14393]blacktulip7 发表于 2017-3-6 23:53[/url]
至于想umount rootfs,只能说想法不对,你把一个人的腿砍了,还指望他走路……[/quote]

呵呵,我尝试砍腿,没有成功:lol

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2017-03-07 03:11:39
认可0
本帖最后由 ngswfx 于 2017-3-7 03:48 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=46138&ptid=14393]blacktulip7 发表于 2017-3-6 23:46[/url]
第一种方式应该很多公司都在用,一般保持rootfs体积很小,一般情况下不会去升级rootfs分区;在内存比较充足 ...[/quote]

这可能和我目前的rootfs内容有关吧,我是把不经常使用的,但是感觉一年左右时间不会变的应用程序的so库,都放到rootfs lib里面了,然后整个rootfs通过squashfs最高倍率压缩,为只读模式,例如QT等依赖库,海思SDK的相关库等,然后我把etc目录(这个目录如果不是可读写属性,没法保存修改IP了)以及APP执行程序等不停在修改的库,弄成jffs2格式了,mount到rootfs里面去,替换rootfs里面的etc以及app空目录,这样就可写入,不但可以保存程序的设置,也可以随时删除修改程序,直接板子上快速测试。

发布程序时,其实整个结构类似,只不过rootfs里面的东西更多了,APP分区的东西少了很多,基本都是空目录,或者是用来保存临时配置的目录。所有这些分区,只要是rootfs进入后加载的,都mount到rootfs根目录下了。

看来有必要再弄一个分区,来将现有rootfs剥离,也使用squashfs文件系统。而真正的rootfs的确几乎不变。


initramfs这种方法,我还真没试过,需要研究一下,如果把kernel,最小rootfs放到一起;
APP1只读(squashfs高压缩格式分区,估计压缩前30M左右,必须采用最高压缩方式,否则16M flash,放QT,onvif,有些吃力);
APP2,可写(主要是各种程序运行时需要的列表,配置保存,随时会添加删除,jffs2格式);
Config永久配置,可写(IP地址,序列号以及其他全局重要参数,jffs2格式)

这样调整一下,升级时,只需要处理APP1,APP2即可,其他的分区一般情况的确不会调整。

////////////


第二种方法,还是比较适合我们安防设备使用,一般用户如果想升级的话,通常都是局域网,另外都是技术维护人员操作,有一定基础。这种方式支持全升级,后面分区文件系统等位置可变,这种特性比较方便。也就是说,如果采用tftp32,直接在uboot阶段升级,后面的文件系统,即便在后续升级包里面发生较大改变,依然可以升级成功,这在某些情况还是很有意义的。因为我目前的确遇到了这种现实需求了。:lol


blacktulip7

0个粉丝

3

问答

0

专栏

0

资料

blacktulip7 2017-03-07 09:43:08
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=46143&ptid=14393]ngswfx 发表于 2017-3-7 03:11[/url]
这可能和我目前的rootfs内容有关吧,我是把不经常使用的,但是感觉一年左右时间不会变的应用程序的so库 ...[/quote]

建议呢,分区不宜搞太多,多了有浪费,uboot,kernel,rootfs,app.config,看你的情况应该是做nvr,uboot启动的时候要显示logo,可以再弄一个logo分区,至于你说的库文件放到rootfs里面,只建议将基本的库文件uclibc的放到里面,至于sdk,qt之类的,在/usr/lib/下面写好软连接就行了
qt的库文件使用静态链接可能会小一点,
至于jffs2,config分区用就可以了,其他分区都只读;
至于调试,nfs不是更加方便吗?flash那么紧张还用jffs2,压缩算法用gz远远没有squashfs的xz高,话说16MB的flash做NVR,加上qt,onvif应该是可以搞定的,就看成本管控严不严啦:lol

blacktulip7

0个粉丝

3

问答

0

专栏

0

资料

blacktulip7 2017-03-07 09:45:17
认可0
看楼主凌晨三四点不睡觉,莫非还在加班写代码?:lol

hanfei69882

2个粉丝

26

问答

0

专栏

2

资料

hanfei69882 2017-03-07 09:48:07
认可0
本帖最后由 hanfei69882 于 2017-3-7 09:54 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=46143&ptid=14393]ngswfx 发表于 2017-3-7 03:11[/url]
这可能和我目前的rootfs内容有关吧,我是把不经常使用的,但是感觉一年左右时间不会变的应用程序的so库 ...[/quote]

umount内容不一样:L
/dev/mtdblock3是分区,显示被占用部分因为有内容挂载在分区上,分区创建方式是mknod,属于结点,不能umount的吧。。。
umount /etc,也就是被挂载的内容,还有你的app目录
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区