前言:OpenWrt作为嵌入式系统,使用到了多种文件系统来实现特定的功能。其常使用的文件系统有SquashFS、JFFS2和overlayfs等,每个文件系统都具有各自的特性,openWRT也正是据此来使用不同文件系统来实现各种功能需求。下面将对openWRT常用到的文件系统进行简单的介绍,并根据具体产品所使用的文件系统与空间布局关联性出发,进一步分析各种文件系统在openWRT中所扮演的角色。
1、openWRT主要使用的文件系统
以下逐一简单介绍这些文件系统的主要特性,部分特性也是openWRT选择的依据。
一)SquahFS文件系统简介
SquashFS是基于GPL协议开发的只读压缩文件系统。 早期版本使用gzip算法进行压缩,由于改进后的LZMA算法具有高压缩比、解压缩时仅需少量内存、解压和压缩速度快以及支持多线程等特点,使得该算法非常适合于嵌入式系统中。openWRT中使用了LZMA算法的SquashFS文件系统,其具有如下特点:
1) 占用更少的空间(据统计较之JFFS2文件系统可以节省20~30%的空间);
2) 可以支持FailSafe功能,即系统出现问题可以恢复出厂配置;
3) 只读文件系统;
4)空间浪费,当该文件系统中的某一文件被修改时,该文件会被拷贝到另一个分区(如JFFS2)中;
该文件系统在openWRT中主要是用于存储一些基础文件,如busybox、dropbear和iptables等,作为openWRT的只读部分以支持FailSafe模式。
二)JFFS2简介
JFFS2是一种可写的日志结构文件系统,其可以使用LZMA算法进行压缩。具备如下的特点:
1) 可写,是日志结构类型文件系统,且具有损耗平衡;
2) 可压缩所以程序使用更少空间;
3) 读是以页(页大小512字节)为单位进行,而擦写是以擦写块((NOR:64~128KB, NAND:8~32KB))为单位操作。该系统维护了几个链表来管理擦写块,根据擦写块上的内容,擦写块可能会在不同的链表上。
该文件系统在openWRT中主要是用于存储可以更改的配置文件,以及安装的软件包等,作为openWRT的可写部分提供了更新升级软件不需要整体刷机的功能。
三)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”来升级的话,需要手动调整后面的文件系统相关信息,这可能会导致很多信息不一致的情况出现。
本文章由作者:佐须之男 整理编辑,原文地址: OpenWrt 相关文件系统简介