首页 > 代码库 > OpenWRT新框架的flash layout
OpenWRT新框架的flash layout
唔,新框架下,同时支持了一个只读的文件系统(SquashFS)和一个可读写的文件系统(jffs2)。所以,这些是怎么处理的,需要进一步了解。
关于flash
在大多数嵌入式系统中,flash是其主要的程序和data的存储空间。因为flash的速度原因,在系统运行时,这些程序和data还要再被搬移到RAM中去,运行时,CPU事实上是从RAM中取程序和data。著名的uboot就是专门负责把操作系统搬移到RAM中去的,至于存储在文件系统中的data和其他程序,则是由操作系统负责去加载。
根据其内部结构不同,flash有两种:NandFlash,NorFlash。以前大家比较倾向于使用NorFlash,因为其没有坏块,所以使用也相对的容易一点,OpenWRT对NorFlash的支持已经很完美。不过,因为大容量的NandFlash价格很有优势,所以,现在许多需要大容量Flash的设备(> 32M Bytes)都选择NandFlash;缺点是,它会有坏块。很遗憾的时,OpenWRT对NandFlash的支持并不好,如果非要使用的话,可以使用UBIFS来支持Nandflash。
然后,根据其连接到CPU的方式不同,我们使用的驱动类型也有不同,主要有:Raw flash和FTL flash。Raw flash是指那些直接连接到soc(CPU)的,可以直接通过地址线寻址就可读出数据的挂载方式。而FTL flash则是通过一块额外的控制器来连接到系统的Flash,比如USB,SSD,MMC, eMMC, SD, CompactFlash等。这个时候,我们需要一个FTL (Flash Translation Layer)来获取flash中的数据。
Flash中文件系统的Partitioning
上一段我们提到uboot,kernel,filesystem什么的。这里主要是讲讲OpenWRT中,这些是怎样被组织在flash设备内的。我们可以通过一张图,来这个问题有一个整体的了解。通常情况下,OpenWRT设备中,具体的配置都是大同小异,可以相互参考的:
上面的图中,我们可以看到。flash被分成了5大块,分别存放着不同的信息,他们分别是:u-boot, kernel, SquashFS, JFFS2, art。
从图里面我们可以明显区分的时,这几部分,都是放在不同的mtd块下面,那么,什么是MTD?MTD是media technology device的缩写,从操作系统来看,它是为raw flash设备提供的一个抽象映射,使得内核可以对这些设备进行统一操作。目前知道的是,mtd已经是标准内核的一部分,api在“include/linux/mtd/mtd.h”中可以看到,同时提供character(/dev/mtdXX)和block(/dev/mtdblockXX)两种设备驱动,另外,还有一个用户空间的shell工具mtd(比如,烧写flash:mtd -r write linux.trx linux)。
所以,为了让结构更加的清晰,我们可以分层来考虑整个的存储映射:
1. Layer0:也就是我们的整块Flash,这里是一块8MB的m25Q64,它是通过spi接口与我们的soc相连。
2. Layer1:我们把整个flash分区为三大区,第一个是用来存放uboot的mtd0,第二个是用来存放真个“Firmware”的mtd5,第三个是用来存放Atheros Radio测试数据的mtd4。其中,mtd0中除了存放uboot外,还有一个数据空间,存放有Wi-Fi的MAC和WPS-PIN等信息,如果没有在这里设置MAC,Wi-Fi将无法正常工作;ART测试数据如果不完整,设备也无法正常工作,但是,似乎和具体设备无关,只要是一类设备,该数据是可以通用的。
3. Layer2:我们又把整个mtd5分为mtd1(kernel)和mtd2(rootfs)。kernel被编译出来后,现实经过lazma压缩,得到的文件再经过gzip压缩,然后mtd1放到的就是最终得到的文件了。
4. Layer3:虽然,我们把真个mtd2当做是系统的rootfs,但是,其实它又是被分成两块不同的部分被挂载的。唔,我们可以看出,这里其实是打了个擦边球。首先,SquashFS被放在mtd2开始的地方,所以,在系统启动的时候,SquashFS被当做是rootfs挂载;我们不要忘了,SquashFS是只读文件系统,那么它的大小是固定的,所以,用来放置SquashFS的mtd2上其实还有一块大小固定的空间,然后,这块大小固定的空间被命名为mtd3. mtd3上挂载了jffs2格式的文件包,即上面说的rootfs_data。
手上的系统
ok,了解了上面的分布,我们来看看手上系统是怎样进行分区的。首先是查看/proc/mtd:
# cat /proc/mtd dev: size erasesize namemtd0: 00020000 00010000 "u-boot"mtd1: 000fc144 00010000 "kernel"mtd2: 006d3ebc 00010000 "rootfs"mtd3: 00140000 00010000 "rootfs_data"mtd4: 00010000 00010000 "art"mtd5: 007d0000 00010000 "firmware"
另外,还可以在启动信息中找到如下信息(可以用dmesg来“回放”):
[ 0.490000] 5 tp-link partitions found on MTD device spi0.0[ 0.490000] Creating 5 MTD partitions on "spi0.0":[ 0.500000] 0x000000000000-0x000000020000 : "u-boot"[ 0.500000] 0x000000020000-0x00000011c144 : "kernel"[ 0.510000] mtd: partition "kernel" must either start or end on erase block boundary or by[ 0.520000] 0x00000011c144-0x0000007f0000 : "rootfs"[ 0.530000] mtd: partition "rootfs" must either start or end on erase block boundary or by[ 0.540000] mtd: device 2 (rootfs) set to be root filesystem[ 0.540000] 1 squashfs-split partitions found on MTD device rootfs[ 0.550000] 0x0000006b0000-0x0000007f0000 : "rootfs_data"[ 0.560000] 0x0000007f0000-0x000000800000 : "art"[ 0.560000] 0x000000020000-0x0000007f0000 : "firmware"
然后,我们再看看,哪些文件是被放在squashFS的,哪些是被放在jffs2下的:
# cd /root@Easy-link:/# ls rombin etc mnt proc root sys usr wwwdev lib overlay rom sbin tmp varroot@Easy-link:/# ls overlay/etc mnt rootroot@Easy-link:/# cd overlay/etc/root@Easy-link:/overlay/etc# lsconfig ethers rc.d uci-defaultsdropbear init.d samba
所以,这里,我们能够编辑和修改的目录,只有etc下的几个特定目录(主要是为了系统配置),mnt,以及root。而其他的文件,全部是被编译到SquashFS里面的,在SquashFS被完成后,我们是无法进行修改的。
参考:
1. http://wiki.openwrt.org/doc/techref/flash.layout
2. http://www.linux-mtd.infradead.org/doc/general.html
3. http://www.osslab.com.tw/Hardware/Open_Embedded_System/MIPS/Atheros/WR-703N