问题一:根文件系统与文件系统的区别(以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,
遍历后发现没有多大的参考意义。