openWRT相关文件系统简介【转】

转自:https://blog.csdn.net/xiaoqiang2080/article/details/66971542

  openWRT作为嵌入式系统,使用到了多种文件系统来实现特定的功能。其常使用的文件系统有SquashFS、JFFS2和overlayfs等,每个文件系统都具有各自的特性,openWRT也正是据此来使用不同文件系统来实现各种功能需求。下面将对openWRT常用到的文件系统进行简单的介绍,并根据具体产品所使用的文件系统与空间布局关联性出发,进一步分析各种文件系统在openWRT中所扮演的角色。

1、openWRT主要使用的文件系统

         以下逐一简单介绍这些文件系统的主要特性,部分特性也是openWRT选择的依据。

(1)SquahFS文件系统简介

    SquashFS 是基于GPL协议开发的只读压缩文件系统。 早期版本使用gzip算法进行压缩,由于改进后的LZMA算法具有高压缩比、解压缩时仅需少量内存、解压和压缩速度快以及支持多线程等特点,使得该算法非常适合于嵌入式系统中。openWRT中使用了LZMA算法的SquashFS文件系统,其具有如下特点:

1)  占用更少的空间(据统计较之JFFS2文件系统可以节省20~30%的空间);

2)  可以支持FailSafe功能,即系统出现问题可以恢复出厂配置;

3)  只读文件系统;

4)空间浪费,当该文件系统中的某一文件被修改时,该文件会被拷贝到另一个分区(如JFFS2)中;

该文件系统在openWRT中主要是用于存储一些基础文件,如busybox、dropbear和iptables等,作为openWRT的只读部分以支持FailSafe模式。

(2)JFFS2简介

JFFS2是一种可写的日志结构文件系统,其可以使用LZMA算法进行压缩。具备如下的特点:

1)  可写,是日志结构类型文件系统,且具有损耗平衡;

2)  可压缩所以程序使用更少空间;

3)  读是以页(页大小512字节)为单位进行,而擦写是以擦写块((NOR:64~128KB, NAND:8~32KB))为单位操作。该系统维护了几个链表来管理擦写块,根据擦写块上的内容,擦写块可能会在不同的链表上。

该文件系统在openWRT中主要是用于存储可以更改的配置文件,以及安装的软件包等,作为openWRT的可写部分提供了更新升级软件不需要整体刷机的功能。

(3)overlayfs简介

overlayfs文件系统是由Miklos Szeredi所开发,主要目的是虚拟化系统建立在共同的基础文件系统上。其主要的特性:叠合两种不同的文件系统,一个可写,另一个只读。这样的特性对用户是透明的,可使得系统能支持恢复出厂配置等功能。目前该文件系统暂未合入到linux内核源码中,下文将详细介绍该系统的原理及相关特性。该文件系统在openWRT中主要是提供一种粘合机制,这样提高了openWRT所能采用不同文件系统实现不同功能的灵活性。
2、openWRT文件系统与Flash布局

由于嵌入式系统的特性限制,以及相关功能的需求导致了openWRT如果使用单一的文件系统将难以实现。所以目前openWRT根据所要实现的功能选择不同的文件系统进行组合实现,常用的文件系统以SquahFS、JFFS2和overlayfs等为主。

在大多数路由系统中使用Flash来存储程序和数据,根据Flash和处理芯片的连接方式可以分为两种:Raw Flash,即Flash和处理芯片直接连接;FTL Flash,通过在Flash和处理芯片之间加入附加控制芯片(Flash Translation Layer)进行连接。openWRT目前采用Raw Flash方式。

文件系统和Flash的布局具有较强的关联性,以下将根据某款路由产品所使用的文件系统及Flash的布局进行介绍。系统启动之后可以根据串口输出的打印和文件系统/proc综合分析得出具体产品的Flash布局和文件系统的使用情况。如下是一次正常启动的输出:

 

[0.680000] Creating 5MTD partitions on "spi0.0":

[0.690000]0x000000000000-0x000000020000 :  "u-boot"

[0.690000]0x000000020000-0x00000011da50 :  "kernel"

[0.710000]0x00000011da50-0x0000007f0000 :  "rootfs"

[0.740000]0x0000003d0000-0x0000007f0000 :  "rootfs_data"

[0.750000]0x0000007f0000-0x000000800000 :  "art"

[0.760000]0x000000020000-0x0000007f0000 :  "firmware"

         根据上述的输出,以及在串口中使用命令“cat /proc/mtd”和“mount”可以综合得出表1。

Flash Layout

Layer0
    

u-boot (mtd0)
    

firmware 8000KB(mtd5)
    

art (mtd4)

Layer1
    

 
    

kernel (mtd1)
    

rootfs 6985KB(mtd2)
    

 

mountpoint
    

 
    

 
    

/
    

 

filesystem
    

 
    

 
    

overlayfs
    

 

Layer2
    

 
    

 
    

 
    

rootfs_data (mtd3)
    

 

Size in KB
    

128KB
    

1014KB
    

2561KB
    

4424KB
    

64KB

mountpoint
    

 
    

 
    

/rom
    

/overlayfs
    

 

filesystem
    

 
    

 
    

SquashFS
    

JFFS2
    

 














                                      表1  Flash布局和文件系统

 

         OpenWRT使用MTD(Memory TechnologyDevice)来标记Flash的每个分区,这样可以方便的使用名称来操作相关分区。从表中可以看出各个分区所使用的文件系统及其挂载点,如果相关项为空说明没有使用相关文件系统及挂载使用。每个分区所包含的主要内容有:

1)u-boot(mtd0),该分区存放引导程序bootloader。

2)kernel(mtd1),该分区存放Linux内核。

3)rootfs(mtd2),该分区分成两部分,一部分以文件系统SquashFS的形式挂载到/rom为只读部分,该部分包括一些基础的文件,如busybox、dropbear和iptables等。也包含一些默认的配置文件可以用以openWRT的FailSafe模式。另一部分为mtd3。

4)rootfs_data (mtd3),该分区使用文件系统JFFS2成为可写部分,包含有可以更改的配置文件,以及安装的软件包等。

5)art (mtd4),该分区用于存储wifi的校准数据(art:Atheros Radio Test)。

6)firmware (mtd5),该分区包含分区mtd1和mtd2。

其中分区/rom和/overlayfs是通过overlayfs文件系统挂载到目录“/”下给用户操作,底层的处理对用户是完全透明的。在系统升级过程中常使用命令“mtd –r write xxx.bin firmware”来完成,需要更新整个分区的信息。否则如果使用命令“mtd –r write xxx.bin kernel”来升级的话,需要手动调整后面的文件系统相关信息,这可能会导致很多信息不一致的情况出现。
————————————————
版权声明:本文为CSDN博主「mac-2080」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiaoqiang2080/article/details/66971542

posted @ 2020-07-31 10:06  Sky&Zhang  阅读(1282)  评论(0编辑  收藏  举报