Openwrt文件系统及flash分区介绍
flash介绍
从与CPU连接方法上flash分为两种
如果闪存芯片是直接连接到CPU(SoC),并且能够直接被操作系统/Linux读取, 我们就把他叫做”raw flash”. 如果闪存芯片不能够直接被操作系统/Linux读取 (由于闪存和SoC之间还需要另外的控制芯片来连接), 我们叫他 “FTL (Flash Translation Layer) flash”. 嵌入式系统几乎全部使用”raw flash”, 而USB 闪存盘/U盘/SD/MMC, 几乎全部使用 FTL flash!
从硬件存储方式上flash分为两种
NandFlash,NorFlash。以前大家比较倾向于使用NorFlash,因为其没有坏块,所以使用也相对的容易一点,OpenWRT对NorFlash的支持已经很完美。不过,因为大容量的NandFlash价格很有优势,所以,现在许多需要大容量Flash的设备(> 32M Bytes)都选择NandFlash;缺点是,它会有坏块。很遗憾的时,OpenWRT对NandFlash的支持并不好,如果非要使用的话,可以使用UBIFS来支持Nandflash。目前几乎所有市面上的路由器都是nor的flash,不过以后nand可能会越来越多,小米路由3已经是MT7620A+128MB NAND flash,并作为主要的卖点来介绍!
文件系统介绍
OpenWrt使用的文件系统主要是squashfs和jffs2,以及”连接”他们的mini_fo。
squashfs是一种只读的压缩文件系统,它的压缩率基本和gzip差不多。另外,也有使用LZMA作为压缩程序的squashfs项目,压缩率会更大一点。
jffs2是一种日志类型的文件系统,专为NorFlash设计。日志的意思是,新的写入信息总是现在现有内容的后面。这样带来两个显而易见的好处,一是做到了负载平衡(在整片Flash上循环的写入和擦除),二是做到了掉电保持(写入新的数据不需要擦除原来数据,而只是维
护一个表来保持系统可以找到新写入的数据)。
mini_fo是一个很有意思的特殊文件系统,它由ELDK开发,也就是U-boot的开发小组。mini_fo的有意思之处就是使squashfs文件系统可写!其实,就是将修改后的文件保存在jffs2的分区上,维护一个表使系统可以找到最新的修改。
OpenWrt这样做的目的就是,得到一个体积很小的文件系统(需要压缩),然后它必须可写。
有了以上的理解之后,我发现新出现的UBIFS似乎更合适以上的目的。UBIFS的主要优点有:
• 开源,并已经被纳入
linux的主代码树,这意味着它的稳定性足
可以使用到商业产品上。
• 可量测性,意思就是说它的主要操作都是有能够知道确切时间的。
形象化的好处就是挂载速度之类的提高了。
• 支持
Write-back (回写),意思是异步写入(多个写缓冲)这
样就提高了写入速度。也可以变成同步写入(类似jffs2)但是写入性能会对比jffs2有所下降。
• 动态压缩(on-the-flight compression),意思是读取时解压,
写入时压缩。有Zlib和LZO 两种压缩方式选择,LZO 压缩率会小一点,但是压缩/解压的速度相同。
• 校验,使用
CRS-32,当然也可以不使用。
• 预读(Read-ahead),读的时候多读一些数据。
估计,OpenWrt也会在适当的时候使用UBIFS,前提是内核版本支持UBIFS,至少2.6.27以上。目前openwrtdl的内核已经支持到3.18了!
flash分区
在openwrt里面一般把整个flash分为几个分区,uboot、kernel、rootfs、rootfs_data、art/factory,这是最详细的分区,看下wiki上给的例子
由于分区是嵌套(nested)的,我们把他分成几层来看:
1. 第0层Layer0: 对应Flash芯片,8MiB大小, 焊接在PCB上,连接到CPU(SoC) – 通过SPI (Serial Peripheral Interface Bus)总线.
2. 第1层Layer1: 我们把存储空间”分区”为 mtd0 给 bootloader, mtd5 给 firmware/固件使用, 并且, 在这个例子中, mtd4给ART (Atheros Radio Test/Atheros电波测试) – 它包含MAC地址和无线系统的校准信息(EEPROM). 如果该部分的信息丢失或损坏,ath9k (无线驱动程序) 就彻底罢工了.
3. 第2层Layer2: 我们把mtd5 (固件) 进一步分割为 mtd1 (kernel/内核) and mtd2 (rootfs); 在固件的一般处理流程中 (参考obtain.firmware.generate) Kernel 二进制文件 先由LZMA打包, 然后用gzip压缩 之后文件被 直接写入到raw flash (mtd1)中 而不mount到任何文件系统上!
4. 第3层Layer3: 我们把rootfs更进一步分割成 mtd3 (rootfs_data) 和剩下的 未命名 部分 – 未来用来容纳SquashFS-分区.
我们重点看第3层,mtd2分为mtd3+未命名的一段,rootfs_data分区为jffs2格式的文件系统,另一个为SquashFS,其中jffs2是可读可写的,SquashFS是只读的,也就是说我们平时对路由器的各种配置文件的更改都是针对jffs2的。
挂载点
• / 这是文件系统根入口,它由 /rom
和/overlay构成.。在日常使
用中请忽略/rom和/overlay目录!
• /rom 包含所有基础文件,比如busybox, dropbear 也或
iptables包含的缺省配置文件。此目录不包含内核,此目录重点文件是在SqashFS区域, 因此文件无法删除。但是,因为我们使用的是mini_fo文件系统, 所谓的overlay-whiteout-symlinks可以被创建在JFFS2区域.
• /overlay与/rom共同构成统一的/根目录,/overlay是可读可写
的部分。它包含写入flash中的所有数据,比如配置文件的更改,opkg安装的软件包等,整个分区格式化为jffs2。