openwrt MTK7621分区划分

本文详细介绍了OpenWRT在MTK7621平台上的分区结构,包括命令行查看分区信息的方法,以及分区的嵌套层次。重点解释了Layer0至Layer3的分区逻辑,特别是Layer3中rootfs_data和SquashFS分区的特性。此外,还阐述了启动过程,包括kernel、rootfs和rootfs_data的挂载以及/rom和/overlay的使用。最后,讨论了代码分析中遇到的问题和解决方案。

命令行查看

执行df -kh查看分区信息:

执行cat /etc/mtab命令显示具体的挂载信息如下:

执行cat /proc/partitions命令查看到的分区如下:

执行fdisk -l查看到信息如下:

admin@OpenWrt:~# fdisk -l

Disk /dev/mtdblock0: 32 MiB, 33554432 bytes, 65536 sectors

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mtdblock1: 192 KiB, 196608 bytes, 384 sectors

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mtdblock2: 64 KiB, 65536 bytes, 128 sectors

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mtdblock3: 64 KiB, 65536 bytes, 128 sectors

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mtdblock4: 31.7 MiB, 33226752 bytes, 64896 sectors

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mtdblock5: 30.2 MiB, 31677440 bytes, 61870 sectors

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mtdblock6: 25.8 MiB, 27000832 bytes, 52736 sectors

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

分区嵌套说明

flash总大小是32M,但是几个分区相加是大于32M的,这是为什么呢?

我们需要先了解一下openwrt的分区嵌套实现。由于分区是嵌套(nested)的,我们把它分成几层来看(以8M falsh大小为例):

Layer0

对应Flash芯片,8MiB大小, 焊接在PCB上,连接到CPU(SoC) – 通过SPI (Serial Peripheral Interface Bus)总线.

Layer1

我们把存储空间”分区”为 如下4个分区,mtd0是整个flash:

admin@OpenWrt:~# cat /proc/mtd

dev: size erasesize name

mtd0: 02000000 00010000 "ALL"

mtd1: 00030000 00010000 "Bootloader"

mtd2: 00010000 00010000 "Config"

mtd3: 00010000 00010000 "Factory"

mtd4: 01fb0000 00010000 "firmware"

Layer2

我们把mtd4 (固件) 进一步分割为 (kernel/内核) 和 (rootfs); 在固件的一般处理流程中 (参考obtain.firmware.generate) Kernel 二进制文件 先由LZMA打包, 然后用gzip压缩 之后文件被 直接写入到raw flash (mtd4)中 而不mount到任何文件系统上!

Layer3

我们把rootfs更进一步分割成 mtd3 (rootfs_data) 和剩下的 未命名 部分 – 未来用来容纳SquashFS-分区.

我们重点看第3层,mtd2分为mtd3+未命名的一段,rootfs_data分区为jffs2格式的文件系统,另一个为SquashFS,其中jffs2是可读可写的,SquashFS是只读的,也就是说我们平时对路由器的各种配置文件的更改都是针对jffs2的。(jffs2是一种日志类型的文件系统,专为NorFlash设计。日志的意思是,新的写入信息总是在现有内容的后面。这样带来两个显而易见的好处,一是做到了负载平衡(在整片Flash上循环的写入和擦除),二是做到了掉电保持(写入新的数据不需要擦除原来数据,而只是维护一个表来保持系统可以找到新写入的数据)。

从上面的描述来看,mtd2(firmware分区)最终被分成了三个分区,从fdisk中看到信息如下:

Disk /dev/mtdblock4: 31.7 MiB, 33226752 bytes, 64896 sectors

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mtdblock5: 30.2 MiB, 31677440 bytes, 61870 sectors

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mtdblock6: 25.8 MiB, 27000832 bytes, 52736 sectors

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

这三段存储空间分别用来存储:kernel(1513K/1.5M)、rootfs(4567K/4.46M)和rootfs_data(26368K/25.75M)

查看目前板子里kernel和rootfs的大小如下,rootfs的大小已经超过了预留空间??

从地址到高地址依次存储内容如下:

分区存在子分区,比如kernel和rootfs就是firmware的子分区。而rootfs_rom,rootfs_data就是rootfs的子分区。

kernel分区的容量计算公式如下,firmware大小减去rootfs大小。

挂载点

/ 这是文件系统根入口,它由 /rom和/overlay构成,在/目录下看到的文件是/rom和/overlay目录下文件的总和。在日常使用中请忽略/rom和/overlay目录!

/rom 包含所有基础文件,比如busybox, dropbear 也或iptables包含的缺省配置文件。此目录不包含内核,此目录重点文件是在SqashFS区域, 因此文件无法删除。

/overlay与/rom共同构成统一的/根目录,/overlay是可读可写的部分。它包含写入flash中的所有数据,比如配置文件的更改,opkg安装的软件包等,整个分区格式化为jffs2。

OpenWRT设计的一个特点是:系统先将rootfs_rom(mtdblock5)挂载为/根目录,这样具备了一个完整的系统,然后再将rootfs_data(mtdblock6)以透明方式挂载在/根目录上。

启动过程

1.首先 uboot 启动了 kernel 完成之后,由 kernel 加载 ROM 分区,就是 rootfs 减去 rootfs_data 得到的那一块分区,ROM 分区采用的是 Linux 内核支持的 squashFS 文件系统(一种压缩只读文件系统),加载完毕后将其挂载到/rom 目录(同时也挂载为根文件系统)

2.系统将使用 JFFS2文件系统格式化 rootfs_data 这部分并且将这部分挂载到/overlay 目录。

3.将/overlay 透明挂载为/分区。

4.将一部分内存挂载为/tmp 目录。

代码分析

dmesg中打印信息如下,前6个mtdblock都能对应上,最后一个分区dmesg中没有打印:

[ 2.124000] mtd .name = raspi, .size = 0x02000000 (32M) .erasesize = 0x00010000 (64K) .numeraseregions = 0

[ 2.144000] Creating 5 MTD partitions on "raspi":

[ 2.152000] 0x000000000000-0x000002000000 : "ALL" ----(32M/32768K)

[ 2.164000] 0x000000000000-0x000000030000 : "Bootloader"----(192K)

[ 2.172000] 0x000000030000-0x000000040000 : "Config"---------(64K)

[ 2.184000] 0x000000040000-0x000000050000 : "Factory"--------(64K)

[ 2.196000] 0x000000050000-0x000002000000 : "firmware"------(31.6875M/32448K)

[ 2.208000] 0x0000001ccf60-0x000002000000 : "rootfs"----------(30.2M/30934K)

admin@OpenWrt:~# cat /proc/mtd

dev: size erasesize name

mtd0: 02000000 00010000 "ALL"-----32M

mtd1: 00030000 00010000 "Bootloader"----192K

mtd2: 00010000 00010000 "Config"---------64K

mtd3: 00010000 00010000 "Factory"--------64K

mtd4: 01fb0000 00010000 "firmware"------32448k/

mtd5: 01e35b76 00010000 "rootfs"-------30934K/30.2M

mtd6: 019c0000 00010000 "rootfs_data"----26368K/25.75M

代码中定义如下:

根据dmesg中的打印,可以确定设备上比数组中多了两个分区,分别是rootfs(30.1M/30924K)和rootfs-data(25.75M/26368K)

在分区表中firmware分区前面添加一个5M的log分区

编译版本后系统无法启动,dmesg中打印异常信息:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李小白20200202

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值