磁盘的格式化
磁盘被格式化的时候会分为以下三个区:
1) 超级块:用于存储文件系统的详细信息,比如块数,块大小,空闲块等。
2) 索引节点(inode)区:用于存储索引节点。
3) 数据块区: 用于存储文件的具体数据。
注意上述三种块中的前两种即超级块和索引节点被使用时会被加载进内存,即:
1) 超级块:当文件系统挂载进内存时候(因为超级块存储的是文件系统的关键信息)
2) 索引节点(inode)区::当文件被访问时。
文件系统的建立
一个分区作为文件系统使用前,需要初始化,并将记录数据结构写到磁盘上,该过程就叫做建立文件系统。(建立的内容也就是上一篇文章中介绍的文件系统的组成。)
文件系统的类型和制作方法与内核配置
linux支持的文件系统:根据存储位置的不同,可以分为三类。
1. 磁盘使用的文件系统:数据存放在磁盘上 EXT4, UBIFS, YSFFIS
2. 内存的文件系统:数据放在内存中,比如 proc sys, 这类的读写实际上是对内存的读写
3. 网络文件系统:用于访问其他主机的文件系统 NFS SMB等。
文件系统的使用
文件系统需要挂载到某个目录才能使用,比如linux启动时,会把文件系统挂载到根目录。
Squashfs文件系统
基于linux内核使用的压缩只读文件系统,压缩率高。
特点
(1)数据(data)节点(inode)目录(directory)均被压缩
(2)保存了全部的32位UID/GIDS和文件的创建时间
(3)最大支持4G文件系统
(4)检测并删除重复文件。
制作Squashfs文件系统镜像
打开配置内核项 <*> SquashFS 4.0 - Squashed file system support 打开配置项。
mksquashfs ./rootfs squa.img -b 64K -comp xz
将rootfs文件打包压缩为 squa.img
-b 64k 指定squashfs的块大小为64k(取决于flash块大小)
-comp xz 指定文件系统的压缩方式为xz
-noappend 不需要添加到现有文件系统
-no-progress 不显示进度条
UBIFS文件系统
UBI(unsorted block Imgae)是一种新型flash文件系统。主要针对flash的特有属性,通过软件的方式实现日志管理,坏块管理,损益均衡等技术。(可读写)
内核配置
(1)<*> Enable UBI - Unsorted block images ---> 使能UBI设备驱动
(2)< > UFS file system support (read only) 使能UBIFS文件系统。
(3)MTD_UBI_WL_THRESHOLD: UBI wear-leveling threshold: UBI 系统记录每个擦除块发生擦书操作的次数。此配置表示所有擦除操作次数中,最小值和最大值之间允许的最大间隔,此值默认为4096,对于寿命比较段的MLC器件,应配置的小一点(256之类)
(4) < > MTD devices emulation driver (gluebi): 模拟MTD驱动,选中此配置时,当创建一个卷时,UBI将同事模拟一个MTD设备,该功能提供了一个接口,供其他文件系统使用UBI。
制作UBIFS文件系统镜像
mkfs.ubifs工具制作
mkfs.ubifs -x lzo -m 2KiB -e 124KiB -c 360 -o ./tmp_ubifs.img -d ./rootfs
-x:指定压缩算法
-m:最小读写单位,也就是页的大小
-e:逻辑擦除块的大小,注:逻辑擦除块不等同于物理擦除块,常用计算方法是:(一个擦除块的页数 - 2)* 页大小,在这里即:(64 - 2) * 2048 = 124KiB
-c:最大的逻辑擦除块个数,这个需要根据分区大小进行计算,常用计算方法是:总块数- 2(volume table) - 1(Wear-leveling) - 1(atomic LEB change) - ?(bad blocks) ,当前的系统中,文件系统分区的大小为:0x3200000 / (64 * 2048) = 400,也就是400个块,如果我们为坏块保留36个块,那么该值即为:400 – 2 -1 -1 -36 = 360
-o:指定输出文件的文件名
-d:指定根文件系统目录
carmfs文件系统
优点:将文件以压缩形式存储,需要用时进行解压,可以节省flash空间。
缺点:由于上述的压缩,所以里面的程序不能直接运行,而且使用时需解压数据,效率会降低,此外,该文件系统是只读的。
内核配置
< > Compressed ROM file system support (cramfs)
制作carmfs文件系统镜像
mkfs.cramfs工具是用来制作cramfs文件系统镜像的,具体使用为:
mkfs.cramfs ./rootfs .cramfs-root.img 。其中cramfs-root.img即生成的镜像文件。
cramfs的关键词是 压缩 和 只读,容量上限为256MB。
JFFS2文件系统
1)之所以有2的后缀,是因为这种文件系统是从JFFS改进而来的。
2)JFFS2的关键词为: 压缩但可读写 日志结构化的可读写的文件系统
3) 优点:压缩,同时可读写
4)缺点: 挂载时需要扫描整个文件系统,所以如果文件系统比较大,有可能耗时较长, 文件系统接近满的时候,运行速度会迅速降低
内核配置
内核配置: < > Journalling Flash File System v2 (JFFS2) support
制作JFFS2文件系统镜像
制作方法: mkfs.jffs2 -d ./rootfs -l -e 0x20000 -o rootfs.jfff2
-d 文件系统源目录的路径
-l --little-endian 指定使用小端格式
-b --big-endian 指定使用大端格式
-e flash 块大小
YAFFS2文件系统
1) 专门为nand flash设计的一种文件系统,(包括SPI nand flash 以及 并行nand)
2) 关键词: 日志结构文件系统 提供损耗平衡和掉电保护,有效避免因掉电引起的一些列问题
3) 优点:专门针对nand,软件结构得到对应优化,速度块,文件的组织信息放在专门的硬件(spare area)中,启动时仅扫描该硬件即可,启动快,采用多策略的垃圾回收算法,从而达到损耗平衡
4)缺点:不是以压缩的形式存储内容,即包含的内容相同时,yaffs2比jffs2大。
制作YAFFS2文件系统镜像
制作: mkfs.yaffs2 ./rootfs image pagesize ecctype
其中的 pagesize 即NAND器件的页大小
ecctype是NAND器件的ecc类型。
ETX4文件系统
-
EXT4支持的文件系统大小以及单个文件大小都比EXT3大很多,解除了一些应用场景的限制。
-
EXT3最多支持32000级子目录,EXT4无此限制。
-
更多的块和inode数量:块数量以及inode数量在 EXT3均使用32bit记录,EXT4使用64bit记录。
-
多块分配:即EXT3的数据块分配器每次只分配一个4KB的块,需要分配25600次,EXT4 可以一次分配25600个块。
-
多块分配和延迟分配,可以将随机IO变为顺序IO,即写一个文件时,时间上可能有停顿,如果立刻回写flash,会导致不同时刻写的东西不连续,而且时间不确定,导致随机IO; 但是如果等全部写完后一次性回写flash,就可以做到空间和时间的连续,即顺序IO 。