天天看点

文件系统深入

问题一:根文件系统与文件系统的区别(以EXT4文件系统为例)

扩展1:我们使用的设备在 rcS---S25ambrwfs脚本中完成的操作:

1. 为 /dev/mmcblk0px 建立软链接:比如 data对应于mmcblk0p15; 建立其软链接:   /dev/data  注意,建立的软链接还在dev目录下

2. 在根文件系统中建立6个目录,然后用mount命令将部分上述/dev/mmcblkpxx设备挂载到各个目录下,比如将/dev/mtd_data  挂载到 /data 目录下,

3. 尤其需要注意的是,每个节点的挂载都是有一定操作顺序的:

    1)首先在根文件系统中新建对应的目录

    2)检查/dev/下的节点,用fsck.ext4 命令-p检查,

    3)如果检查不通过,则使用 fsck.ext4 -fy 对/dev/mmcblkpxx进行修复,注意这个修复过程是需要一定时间的

    4)使用mount命令将dev下的节点 挂载到1)中新建的目录

注意上述的挂载可以用mount命令查看到,mount命令可以显示当前挂载的各个文件系统

扩展2:上述的S25ambrwfs中的操作实际是将/dev下的mmcblkpxx 节点挂载到跟文件系统下,而且通过rcS可以得知,在rcS阶段,跟文件系统就已经挂载:

::sysinit:/bin/mount -a 2>/dev/null  (该句是rcS中的一个进程)说明rcS阶段运行的时候已经有跟文件系统了,

扩展3: rcS再往上追查,会发现在 内核的 init/main.c中的 kernel_init 接口里面就已经是用到根文件系统了(该函数会遍历查找哪个目录下有 init命令,找到后即运行)

扩展3: 实际上跟文件系统的挂载在 内核加载的末尾的阶段,会挂载根文件系统,然后访问第一个用户进程 init

内核init的末尾,会挂载根文件系统,然后访问文件系统中的第一个用户进程 init:
start_kernel --- rest_init --- kernel_init --- kernel_init_freeable --prepare_namespace
           

扩展4:根文件系统的制作:多个跟文件系统制作的手册都不约而同的说到了用busybox制作根文件系统(信盈达,海思)。

1) 海思手册对于busybox在文件系统的制作中起的作用为:busybox配置编译安装后,需要将编译生成的文件拷贝至rootfs的特定路径下,但实际产品中一般是仅将busybox(bin)拷贝至设备的rootfs/bin目录下,该目录下存在很多软链接,

2) 信盈达手册中的描述:

扩展5:海思手册中对不同文件系统的介绍:

常用的文件系统包括: cramfs, JFFS2, ysffs2,  ubifs, ext4  

1. carmfs文件系统的优缺点:

1)优点:将文件以压缩形式存储,需要用时进行解压,可以节省flash空间。

2)缺点:由于上述的压缩,所以里面的程序不能直接运行,而且使用时需解压数据,效率会降低,此外,该文件系统是只读的。

3)要想使用cramfs, 需要在内核配置中打开 如下选项:

      < >   Compressed ROM file system support (cramfs)    

4) mkfs.cramfs工具是用来制作cramfs文件系统镜像的,具体使用为:

mkfs.cramfs  ./rootfs  .cramfs-root.img  。其中cramfs-root.img即生成的镜像文件。

5) cramfs的关键词是 压缩 和 只读,容量上限为256MB。

2. JFFS2文件系统:

1)之所以有2的后缀,是因为这种文件系统是从JFFS改进而来的。

2)JFFS2的关键词为: 压缩但可读写       日志结构化的可读写的文件系统

3) 优点:压缩,同时可读写

4)缺点: 挂载时需要扫描整个文件系统,所以如果文件系统比较大,有可能耗时较长

                 文件系统接近满的时候,运行速度会迅速降低

5)内核配置: < >   Journalling Flash File System v2 (JFFS2) support  

6) 制作方法: mkfs.jffs2  -d  ./rootfs -l -e  0x20000  -o  rootfs.jfff2

-d  文件系统源目录的路径

-l  little-end 小端格式

-e flash 块大小

3. yaffs2 文件系统:

1) 专门为nand flash设计的一种文件系统,(包括SPI nand flash 以及 并行nand)

2) 关键词: 日志结构文件系统   提供损耗平衡和掉电保护,有效避免因掉电引起的一些列问题

3) 优点:专门针对nand,软件结构得到对应优化,速度块

              文件的组织信息放在专门的硬件(spare area)中,启动时仅扫描该硬件即可,启动快

              采用多策略的垃圾回收算法,从而达到损耗平衡

4)缺点:不是以压缩的形式存储内容,即包含的内容相同时,yaffs2比jffs2大。

5) 制作: mkfs.yaffs2  ./rootfs  image  pagesize  ecctype 

        其中的 pagesize 即NAND器件的页大小

        ecctype是NAND器件的ecc类型。

-----------------------------------------------------------------------------

4. UBIFS文件系统:

1)UBI(unsorted block Imgae)是一种新型flash文件系统。主要针对flash的特有属性,通过软件的方式实现日志管理,坏块管理,损益均衡等技术。

2)内核配置:

        (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。

------------------------------------------------------------------------------

5. Squashfs文件系统:基于linux内核使用的压缩只读文件系统,压缩率高。

1) 关键词: 基于linux内核    压缩率高    只读文件系统

2) 特点:

        (1)数据(data)节点(inode)目录(directory)均被压缩

        (2)保存了全部的32位UID/GIDS和文件的创建时间

        (3)最大支持4G文件系统

        (4)检测并删除重复文件。

3) 制作squashfs内核镜像:

        (1)<*>   SquashFS 4.0 - Squashed file system support 打开配置项

4)制作squashfs镜像: mksquashfs  ./rootfs  squa.img -b 64K -comp xz 

-b 64K:  指定squashfs的块大小为64k(取决于flash块大小)

-comp xz : 指定文件系统的压缩方式为xz, 

扩展6:信盈达手册中对根文件系统的制作的描述:

1. 根文件系统中目录的大致作用:

目录 内容
bin         不太重要的指令,比如more;以及busybox
sbin        系统管理员的命令,比较关键,比如insmod  ifconfig
dev 设备节点
etc 系统配置 环境变量profile 启动脚本(init.d)
lib c库文件,内核ko
home
root root管理员用户的主目录
usr/bin
var 日志文件
proc 与内核交互的虚拟文件系统(内存中)
sys 与内核交互的虚拟文件系统(内存中)
mnt 文件系统挂载点 比如sd卡的挂载
tmp 临时性文件之类

2. etc下文件的重要作用:

1)inittab: 内核的start_kernel中会挂载根文件系统,然后执行init命令,该命令会解析inittab;其中inittab中每一行为一个进程,一般会调用rcS,继而调用init.d中的脚本

2)profile: 其中的PATH即bin文件的默认路径, LD_LIBRARY_PATH 为so的默认路径

3)fstab:

        (1)应用程序仅读取该文件,不修改该文件。

        (2)该文件的每一行用于描述一个文件系统的信息,每条的不同字段用 tab分割。

        (3)注释以#开头

        (4)mount  unmount  fsck等命令执行时会 顺序 访问该文件,

3. busybox是一个可裁剪的,集成了100多个linux命令的软件bin,

遍历后发现没有多大的参考意义。