Openwrt学习笔记(二)——Flash Layout and file system

在大多数系统中,闪存不像RAM一样可以直接执行指令,所以闪存中的数据和指令需要拷贝到RAM中执行,比如存放在flash中的kernel需要bootload的帮忙,将kernel拷贝到RAM里面才能运行。

大多数router都是没有硬盘的,它使用闪存来完成相应的存储功能(包括存储固件以及系统数据),这种非易失性的闪存可以避免掉电丢失的问题。

我们常接触的闪存主要有两种:NOR flash 和NAND flash。如果闪存芯片和SOC直接连接并且又linux直接寻址,我们将它称作raw flash; 如果在SOC和flash芯片间有多加一个外部控制芯片,我们称它作“FTL (Flash Translation Layer) flash”。我们大多数嵌入式系统都是用raw flash,很少用SSD和USB这样的FTL flash。

老的router上用nor flash多,但是新的router上很多开始用nand flash和emmc等;一般nor flash有4/8/16/32M,相对nand flash来说存储量较小,价格更贵,但是它的优点是不会坏块, nand flash一般都是32~256M或者更大,但是它容易坏块,openwrt系统中squashFS的一个致命弱点是不能很好的处理坏块问题,一旦坏块就好重新烧写系统了,一个可选择的方式就是使用UBIFS文件系统。当然当前也有另外一种方案,就是使用emmc,坏块问题交由外部处理器完成。

There is a generic problem when running SquashFS on NAND: The issue is that SquashFS has no bad block management at all and requires all blocks on order; but for proper NAND bad block management you also need to be able to skip bad blocks and occasionally relocate blocks (see squashfs and NAND flash). That's why raw SquashFS is a bad idea on NAND (it works if you use a FTL like UBIFS).


如果使用的是raw flash,openwrt将会将这个寻址空间看作MTD,我们可以通过在bootload或者kernel中对这块存储空间进行分区的划分,我们通常描述为"partitionkernel starts at offsetx and ends at offsety". 一般我们都会对每个分区进行命名,方便更好的操作。

一般我们都会对flash进行如下分区的划分,从左到右分别存放bootloader,bootloader相关参数,kernel,文件系统,用户数据等.



下面是一些router的flash划分状况:


layer0 表示这个flash一共有8M

layer1表示这个flash总共划分了4个部分,分别存放uboot, uboot-env, factory参数(MAC,PIN)和FW;命名为MTD0,1,2,3

layer2表示firmware又分成两个部分,分别是kernel和rootfs,命名为MTD4,5
layer3表示rootfs分成两个部分/dev/root和rootfs_data

需要注意的是,mtd3和mtd4的起始位置是一样的,只是大小不一样。openwrt将文件系统分成两类,/dev/root分区使用squash FS,rootfs_data分区使用JFFS2;我们知道squash FS是只读不可写的,但是JFFS2可读可写,所以我们修改系统文件以后,一般保存在rootfs_data分区。
当前系统flash分区的划分信息可以在开机log中找到,也可以在/proc/mtd中查看:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值