命令行查看
执行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中打印异常信息:

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

被折叠的 条评论
为什么被折叠?



