19-Openwrt双固件升级

OpenWrt固件升级实战:从sysupgrade到mtd的进阶操作指南 本文深入解析了OpenWrt固件升级的进阶操作,从常规的sysupgrade命令到更底层的mtd命令。详细介绍了sysupgrade在保留配置、强制升级等场景下的应用,并重点阐述了mtd命令在备份分区、刷写引导程序及救砖等高级场景中的关键作用与风险控制,帮助用户从普通用户进阶为设备管理员。 阅读详情

在上一章节《Openwrt sysupgrade系统升级》中,我们描述了sysupgrade升级系统的过程,这种升级过程会直接firmware分区进行写入,无法保证系统的安全性,只要在写入过程突然断电就会出现系统写入失败,升级失败无法启动系统的问题。

为了解决该问题一般会使用双固件升级的方式,有一个主分区firmware和一个备份分区firmware_backup,常见的有双固件升级方式有很多种,这边只介绍一种通用方式

1.升级流程
  • 1.根据sysupgrade的过程,将固件进行校验写入,不过写入的时候将升级文件写入到备份分区firmware_backup,不直接写主分区firmware。
  • 2.写完备份分区后,设置备份分区写入完成标志位(一般会开辟一块很小的分区用来写标志位),然后重启系统
  • 3.uboot启动的时候,检测到备份分区标志位被置位,则读取备份分区firmware_backup的固件内容。
  • 4.对firmware_backup的内容进行校验,校验一切正常后,将firmware_backup的内容写入到firmware分区。
  • 5.firmware写入完成后,启动系统,系统启动完成后将备份分区标志位清零,这样下次启动后就不会再次升级系统。

通过双固件的方式就不会出现升级失败系统启动不了的问题。

  • 如果步骤1写入过程被断电也不会出问题,因为主分区正常启动,只是没有升级到最新的分区而已。
  • 如果是步骤4升级过程被断电也不会出问题,再次启动的时候会检测到主分区有问题会被再次写入。
2.修改内容
2.1 sysupgrade写入备份分区

PART_NAME修改位备份分区

PART_NAME=firmware_backup

写入固件完成重启前,设置备份分区标志位

//set backup_flg=1

v "Upgrade completed"
                              
[ -n "$DELAY" ] && sleep "$DELAY" 
v "Rebooting system..."          
upgrade_log_end                  
reboot -f                        
sleep 2                          
force_reboot   


2.2 uboot对双系统的支持

双固件最主要的工作都在uboot下面进行,一些mtk提供的新版本uboot一般会有支持部分双固件功能,位于dual_image.c文件中。

uboot添加双固件支持的配置


CONFIG_MTK_DUAL_IMAGE_SUPPORT=y
CONFIG_MTK_DUAL_IMAGE_PARTNAME_MAIN="firmware"
CONFIG_MTK_DUAL_IMAGE_PARTNAME_BACKUP="firmware_backup"
CONFIG_MTK_DUAL_IMAGE_SQUASHFS_DATA_CHECK=y
# CONFIG_MTK_DUAL_IMAGE_RESTORE_KERNEL_ONLY is not set

CONFIG_MTDPARTS_DEFAULT="mtdparts=raspi:576k(u-boot),7360k(firmware),7360k(firmware_backup)"

dual_image_check()函数里面就是校验firmware合法性的内容。

firmware为kernel+rootfs,所以校验的时候两块都会进行验证

printf("Verifying main image at 0x%llx...\n", image1_off);
ret = verify_image(flash, image1_off, image1_partsize, &image1_size);
if (ret < 0) {
	printf("Dual image checking is bypassed\n");
	return 0;
}

if (ret == 0) {
	ret = verify_rootfs(flash, image1_off + image1_size,
			    image1_partsize - image1_size,
			    &image1_padding_bytes, &rootfs1_size);
}

image1_ok = ret == 0;

2.2.1 kernel校验

kernel的校验有两种格式

  • 一种是老版本的kernel,我们会把它称作LEGACY
  • 另一种是支持最新设备树的Flattened uImage Tree,会把它称作FIT

校验函数位于verify_image中

	case IMAGE_FORMAT_LEGACY:
		return verify_legacy_image(flash, offset, maxsize, load_addr,
					   image_size);
#if defined(CONFIG_FIT)
	case IMAGE_FORMAT_FIT:
		return verify_fit_image(flash, offset, maxsize, load_addr,
					image_size);
#endif
	default:
		printf("Invalid image format\n");
		return 1;
	}

里面的具体校验内容,查看代码细究,里面对于几种类型的image都有对于的校验函数。

 image-fdt.c
 image-fit.c
 image-sig.c
 image.c
2.2.2 rootfs校验

现在一般使用的都是squashfs文件系统,校验函数为verify_squashfs

static int verify_rootfs(void *flash, uint64_t offset, uint64_t maxsize,
			 size_t *header_prefix_bytes, size_t *rootfs_size)
{
	uint64_t end = offset + maxsize, leading, extra_bytes, tmp;
	int ret;

	ret = verify_squashfs(flash, offset, end, rootfs_size);
	if (!ret) {
		if (header_prefix_bytes)
			*header_prefix_bytes = 0;
		return 0;
	}

	tmp = offset;
	leading = do_div(tmp, mtk_board_get_flash_erase_size(flash));

	if (!leading)
		return 1;

	extra_bytes = mtk_board_get_flash_erase_size(flash) - leading;
	offset += extra_bytes;

	ret = verify_squashfs(flash, offset, end, rootfs_size);
	if (!ret) {
		if (header_prefix_bytes)
			*header_prefix_bytes = extra_bytes;
		return 0;
	}

	printf("No SquashFS found\n");
	return 1;
}

squashfs文件系统头部有专门的结构信息,如下

#define SQUASHFS_MAGIC		0x73717368

struct squashfs_super_block {
	__le32 s_magic;
	__le32 pad0[9];
	__le64 bytes_used;
};

校验内容

if (le32_to_cpu(sb.s_magic) != SQUASHFS_MAGIC)
	return 1;

size = le64_to_cpu(sb.bytes_used);
if (offset + size >= end) {
	printf("RootFS is truncated\n");
	return 1;
}

2.2.3 根据校验结果进行操作
  • 如果两个分区的固件都有问题,则报错
  • 如果主分区和备份分区都没有问题,判断备份分区是否有置位,置位则将备份分区拷贝到主分区;
  • 如果主分区正常,备份分区异常,则将主分区拷贝到备份分区
  • 如果主分区异常,备份分区正常,则将备份分区拷贝到主分区
2.2.4 注意事项

spi flash的块大小为64K,有时候为了节省空间把设置标志位的分区设置成4k,它不是64k的倍数,这样mtd 读写的时候也会报错

Detected w25q128bv with page size 256 Bytes, erase size 64 KiB, total 16 MiB

另外mount的时候,一般要大于64k的5倍,不然也会出现一直挂载不上

2.3 系统标志位清零

系统启动成功后,在init之后的某个脚本处,将标志位清零即可。后面再次启动的时候就不会重复烧录

保姆级教程:OpenWrt 21.02升级,用sysupgrade还是mtd命令?看完这篇不再纠结 本文深入解析OpenWrt 21.02固件升级的两种核心方法:sysupgrade与mtd命令。通过对比两者的操作层级、风险等级和适用场景,帮助用户根据设备状态和需求选择最佳升级方案,并详细介绍了FritzBox 7530等设备的实战案例与风险规避技巧。 阅读详情

相关推荐

跟着佐大学OpenWrt开发入门培训班视频教程目录

课程内容列表: 课时00-关于网络上盗版视频的看法.mp4 课时00-我为什么做OpenWrt开发视频教程?.mp4 课时01-路由器的软硬件构成上篇.mp4 课时01-路由器的软硬件构成下篇.mp4 课时02-路由器固件开发的一般流程是什么?.mp4 课时03-如何配置OpenWrt开发环境?.mp4 课时04-如何扩充虚拟机磁盘容量?.mp4 课时05-如何编译OpenWrt?.mp4 ...

佐须之男-佐大的优快云博客 4105

Openwrt固件升级步骤

root@ROUTE:/tmp# tftp -gr 文件名.bin 192.168.1.235(IP是电脑获取到的地址)root@ROUTE:/tmp# cat 文件名.bin> /dev/mtdblock4。

luvianqaq的博客 7543

如何用Zabbix监控OpenWrt路由器-Zabbix-Agent安装篇

我们将以OpenWrt路由器作为监控对象,分别采用Zabbix-Agent和SNMP两种不同的采集方式进行数据采集。今天我们先从Zabbix-Agent方式说起。硬件:Openwrt路由器-水星MW4530R 1台。软件:Openwrt固件-openwrt-19.07.1,Zabbix 4.4.3。第一步 路由器升级到最新固件。第二步 修改源包地址获取zabbix-agentd包。第三步 安装Agent相关包

cutepat的博客 3842

OpenWRT sysupgrade升级流程

OpenWRT提供了一套系统升级机制,可以通过命令行方式也可以通过网页方式,本文主要想介绍一下OpenWRT下sysupgrade常见的操作用法和sysupgrade升级流程,这里主要介绍了整个升级过程涉及到的进程,有了这个宏观上的升级流程后在深入到各个进程中去查看对应的功能,这么一套组合拳下来,相信大家会对OpenWRT的升级流程有更深的理解。

Randy-LZY的博客 2万+

31-Openwrt 内核版本替换

有些时候因为一些解不了的bug,在新的内核版本里面已经解决了,这时候我们会想着升级下内核版本,而不是把整个openwrt升级。

Creator_Ly的博客 7822

手把手教你使用transciver-ip核的配置

手把手教你使用transciver-ip核的配置

u012938458的博客 5410

OpenWrt固件刷入及相关实验

MIS OpenWrt固件刷入及相关实验 曲折的学习笔记 实验目的 为路由器刷入openwrt系统 在openwrt上安装软件,开通ssh,AP服务等; 在openwrt上安装auditord,配置相关文件,抓取ftp、telnet和无线网卡wifi信号嗅探的内容,发送到外置服务器,并接收。 在openwrt上安装privoxy,完成配置文件,实现对http协议的js代码注入功能。 实验环境 所用硬件:TP-LINK WR840N v10.1 TP-LINK WR841N v8 小米路由器

weixin_51194266的博客 1万+

嵌入式Linux Qt/QML开发实战:从Buildroot配置到应用部署

本文详细介绍了嵌入式Linux Qt/QML开发全流程,从Buildroot系统配置、交叉编译工具链搭建到应用部署与调试。以RK3506开发板为例,提供实战指南,帮助开发者高效完成嵌入式应用开发,解决常见环境配置与性能优化问题。

m2n3o4p5的博客 224

【速记】openwrt - 编译、刷固件(资料整理)

玩过的固件有lede(听说是s插件作者)问题:无法指定版本,基本天天都有改动(大神辛苦了)稳定版lienol(听说是p插件作者)定期merge原生openwrt,但是有些插件要自己找定期merge原生openwrt,自带的插件挺全的在玩 2022年4月6日(解决数字摘要引起的自编固件上任意安装使用官方源软件问题)已安装的软件包 kernel 版本不兼容,需要 5.4.188-1-db222399… 而 5.4.188-1-a3831ee4… 已安装。这种提示就是数字摘要问题。

LawssssCat的博客 1万+

CVPR 2027 投稿规划:基于近3年录用率与截稿周期的5步时间管理法

本文为计算机视觉研究者提供CVPR 2027投稿的完整规划指南,基于近三年录用率与截稿周期数据,提出五步时间管理法。涵盖选题策略、实验设计、论文写作、同行评审到最终提交的全流程优化,特别针对CVPR日益激烈的竞争环境(2024年投稿量达11532篇,录取率仅23.6%)提供实用解决方案,帮助研究者提升投稿成功率。

weixin_34079177的博客 1139

AMS TMF8820/21/28 SPAD 掩码和模式选择

为了实现最快的测距周期,将报告周期设置在测距周期以下的毫秒,以确保不会有等待时间。除了8X8固定了pixel的位置意外,其他模式客户可以设计自己的spad掩码,并将spad单独分配给通道。对于这些spad掩码,有一些约束。左下角提示红色代表光学中心,绿色方框表示单个spad,每个MP里可能有2X3个spad,也有2X5个spad,也有3X6+3个spad,这部分适配光学,最大的程度的利用spad区域。以下是几种预定义的spad掩码,非常灵活的配置,来适配各种3X3,4X4,8X8的模式选择。

dream it possible 699

OpenWRT 19.07升级指南:如何启用WPA3加密提升Wi-Fi安全性

本文详细介绍了如何将OpenWRT系统升级至19.07版本并启用WPA3加密,以提升Wi-Fi网络安全性。文章从WPA2的KRACK漏洞风险切入,阐述了WPA3(SAE协议)的核心优势,并提供了从设备兼容性检查、编译/在线两种升级路径,到在LuCI界面或配置文件中具体启用WPA3或混合模式的完整操作指南。

uran的专栏 866

干货|C#上位机与西门子PLC的Profinet协议通信开发(工控机版)

文章摘要: Profinet是西门子主导的工业以太网协议,支持实时通信(RT/IRT),广泛应用于PLC与工控机通信。本文聚焦C#上位机通过S7协议(集成于Profinet接口)高效访问西门子PLC(S7-1200/1500等),提供完整开发方案: 协议基础:解析Profinet三层架构(TCP/IP层、实时层、应用层),对比S7协议优势(开发便捷、跨平台); 开发实践:基于S7NetPlus/Snap7库实现数据读写,涵盖DB块、I/O点等地址规则; 环境配置:工控机(Windows/Linux/统信UO

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1211

NetGear WNDR4300V1-OpenWrt 18.06.4/19.07.5【ar71xx】开启128M空间版本固件

以下操作以非root用户执行 mkdir Downloads cd Downloads wget http://downloads.openwrt.org/releases/18.06.4/targets/ar71xx/nand/openwrt-imagebuilder-18.06.4-ar71xx-nand.Linux-x86_64.tar.xz xz -d openwrt-imagebuild...

inthesun29的博客 3537

外骨骼机器人(五):步态分析之正常步态

研究病理步态之前,需要了解正常步态,作为判断标准。但是需要记住两个问题:1.“正常”因人而异,性别、年龄、身体情况都需要考虑在内,因此,需要对不同的个体选择合适的正常标准;2.即使病人的步态与正常步态有某种不同,这也不能说明这是不可取的,也不能说明应该把它变成“正常”步态。许多步态异常是对病人的一些问题的一种补偿,尽管异常,但它们仍然是有用的。步态周期的定义是连续为两次发生重复行走事件之间的时间间隔。尽管可以选择任何事件来定义步态周期,但通常使用一只脚接触地面的瞬间(“初始接触”)是方便的。

行者无疆的博客 1990

58.Sobel边缘检测算子

注:在梯度运算中,很可能会出现负的灰度值,我们不能再采用uint8类型作为像素的数据类型,而是采用了CV_16S或者CV_32F这种有负数范围的类型,运算结果里的负数也不能不处理,否则在显示的时候就会被截断为0,这样就会丢失边界信息。如下图所示,对中心像素Z5求取多个方向的灰度差分,对于Z5的8邻域,分为4个方向,即对角线和水平垂直4个方向对:(z1, z9) ,(z2, z8), (z3, z7), (z6, z4) 给定邻域方向梯度矢量g的幅度为:|g| = <像素灰度差分>/<相邻像素的距离>。

twnkie的博客 4884

Openwrt研习笔记五之编译及升级

关于openwrt自编译及刷机失败后如何救活的解决方案

草帽的后花园 6891

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

cudy tr3000(128M))刷机openwrt方法并恢复原厂固件方法

a: 将网线插到lan口,将电脑设置成静态 ip192.168.1.88,此时长按路由器的reset键再插电,等待5秒进入恢复模式 (红灯闪烁状态)将电脑的IP换成动态获取的方式,访问192.168.10.1,此时访问的就是原厂固件了,也可以更新从官网下载的固件了。b: 访问 http://192.168.1.1/uboot.html,然后选择官方原厂的 FIP.bin 文件。如果目前用的是大分区的需要先刷入FIP.bin再按小分区的方法恢复原厂固件。2.访问192.168.1.1 从过渡包再刷入升级包。

u010470258的博客 2万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

中兴e8820刷openwrt_中兴E8820V2(电信天翼宽带类似新路由3歌华链)-拆机及OpenWrt固件...

本帖最后由 yumeimm 于 2020-12-20 10:53 编辑2020-12更新:-- 增加Openwrt v19.07.5固件2020-10更新:-- 添加openwrt v19.07.4固件2020-05更新:-- 添加openwrt v19.07.3固件2020-02更新:--增加Openwrt v19.07.2固件--增加OpenWrt v19.07.1固件OpenWrt固件:...

weixin_30290131的博客 1万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

TL-WAR308 刷openwrt以及魔改8M固件到16M

原厂固件就是openwrt的,但是内核版本太低了,升级下比较好。 拆机后使用编程器刷入breed: https://breed.hackpascal.net/breed-qca953x-letv-lba-047-ch.bin 再刷入openwrt:https://downloads.openwrt.org/releases/19.07.8/targets/ath79/generic/openwrt-19.07.8-ath79-generic-tplink_tl-wr810n-v2-squashfs-fact

fjh1997的博客 5370

OpenWrt19.07自定义型号笔记(MT7688)

文章目录写在前面说明硬件概况openwrt下载openwrt编译的一般过程自定义型号添加设备信息添加设备树dts修改rootfs写在后面最终结果 写在前面 说明 为了方便调试MT7688开发板,有时需要将自己喜欢的名字加入openwrt的选择列表,这样编译后在openwrt的管理界面显示的就是自己定义的名字了。本文参照Openwrt中某些开发版的配置文件写了自己的配置,以下均为笔记或个人理解。 硬件概况 MT7688 128M RAM 16M SPI Flash 串口0用作调试 启用以太网口0(WAN)

H_177的博客 4797

OpenWRT编译及乐视路由器固件升级

openwrt编译及路由器固件升级

qq_23960449的博客 905

跟 UMU 一起玩 OpenWRT(入门篇5):升级固件

OpenWRT 的主线于 2014-06-19 06:07...

weixin_34268579的博客 431
上一篇: 18-Openwrt sysupgrade系统升级
下一篇: 20-Openwrt crond crontab
szembed
博客等级 码龄18年 1475粉丝 256原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值