• 8.1 嵌入式文件系统简介
• 8.1.1 Linux文件系统简介
– 每个操作系统使用的文件系统并不相同,例如,Windows 98 以前 的微软操作系统使用FAT(FAT16)文件系统,Windows 2000 以后 的版本使用NTFS 文件系统,而Linux 的正统文件系统是Ext2
• FAT:File Allocation Table,文件配置表
– FAT16使用了16位的空间来表示每个扇区(Sector)配置文件的情形,故 称之为FAT16
• NTFS:New Technology File System,新技术文件系统
• Ext2:second Extended file system,第二代扩展文件系统
– 通常情况下,文件系统会将文件的实际内容和属性分开存放:
• 文件的属性保存在 inode中(i节点)中,每个 inode都有自己的编 号。每个文件各占用一个 inode。不仅如此,inode中还记录着文件 数据所在 block 块的编号。
• 文件的实际内容保存在 block 中(数据块),每个 block 都有属于自 己的编号。当文件太大时,可能会占用多个 block 块。
• 另外,还有一个 super block(超级块)用于记录整个文件系统的整体 信息,包括 inode和 block 的总量、已经使用量和剩余量,以及文件 系统的格式和相关信息等。
• 8.1.2 嵌入式文件系统简介
– 1、嵌入式操作系统的文件系统的设计目标
① 使用简单方便
② 安全可靠
③ 实时响应
④ 接口标注的开放性和可移植性
⑤ 可伸展性和可配置性
⑥ 开放的体系结构
⑦ 资源有效性
⑧ 功能完整性
⑨ 热插拔
⑩ 支持多种文件类型
– 2、一些流行的嵌入式文件系统
• QNX嵌入式操作系统:
QNX是一种商用的遵从POSIX规范的类Unix实时 操作系统,目标市场主要是面向嵌入式系统
① POSIX文件系统:Portable Operating System Interface of UNIX,可移植 操作系统接口
② SMB文件系统:Server Message Block,服务器报文块协议
③ FAT文件系统:File Allocation Table,文件分配表
④ CD-ROM文件系统
• VxWorks嵌入式操作系统:
VxWorks 操作系统是美国WindRiver公司于1983年 设计开发的一种嵌入式实时操作系统(RTOS)
① FFS:Fast File System,快速文件系统
② SCSI:Small Computer System Interface,小型计算机系统接口
③ FAT:File Allocation Table,文件分配表
④ RT11FS:Real Time 11 File System,实时文件系统
⑤ TAPEFS:TAPE File System,磁带文件系统
• 8.2 嵌入式Linux文件系统框架
• 传统文件系统
– 采用设备API,经过设备驱动,直接去访问磁盘。
– 或者,采用文件API,经过文件管理器,以及设备驱动,去访问磁盘。
• Linux文件系统
– 采用POSIX文件API,经过设备驱动,直接去访问磁盘。
– 或者,采用POSIX文件API,经过VFS和磁盘独立转换器,以及设备驱动, 去访问磁盘。
• 8.3 JFFS2嵌入式文件系统
• JFFS:Journalling Flash File System,闪存设备日志型文件系统,最初是由瑞典 的 Axis Communication AB 公司开发,其目的是作为嵌入式系统免受宕机和断 电危害的文件系统。
• JFFS2:Journalling Flash File System Version2,闪存日志型文件系统第2版,其 功能就是管理在MTD设备上实现的日志型文件系统。除了提供具有断电可靠 性的日志结构文件系统,JFFS2还会在它管理的MTD设备上实现“损耗平衡” 和“数据压缩”等特性。
MTD:Memory Technology Device,内存技术设备。是用于访问memory设备(ROM、 flash)的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱动更加简单, 为此它在硬件和上层之间提供了一个抽象的接口。MTD的所有源代码在/drivers/mtd 子目录下。CFI接口的MTD设备分为四层(从设备节点直到底层硬件驱动),这四层 从上到下依次是:设备节点、MTD设备层、MTD原始设备层和硬件驱动层。
• 8.3.1 目录节点的定义
struct jffs2_raw_direct
{
_u16 magic; //节点类型的补充
_u16 nodetype; //节点类型
_u32 totlen; //节点总长度
_u32 hdr_crc; //CRC校验码
_u32 pino; //上层目录节点的标号
_u32 version;
_u32 ino; //节点编号
_u32 mctime; //创建时间
_u8 nsize; //大小
_u8 unused[2];
_u32 nod_crc; //校验码
_u32 name_crc;
_u8 name[0]; //名称
}
• 8.3.2 数据节点
• 8.3.3 内存使用
– JFFS2中的i节点信息并没有全部存放在内存里面,存放在内存中的 节点信息是一个缩小尺寸的数据节点结构体(struct jffs2_raw_node_ref):
– 通过使用structjffs2_inode_cache结构体,管理struct jffs2_raw_node_ref信息。
– 通过使用structjffs2_sb_info结构体,管理所有的节点链表和Flash 块。
• 8.3.4 JFFS3简介
– JFFS3:Journalling Flash File System Version3,闪存日志型文件系统第3版
– JFFS3支持大容量Flash:大于1TB
– JFFS3是将索引信息存放在Flash上,而JFFS2则将索引信息保存在内存中
– JFFS3的基本结构借鉴了ReiserFS4的设计思想,整个文件系统就是一个B+ 树
ReiserFS4:是一种新型的文件系统,它通过一种与众不同的方式——完全 平衡树结构来容纳数据,包括文件数据,文件名以及日志支持。ReiserFS4 还以支持海量磁盘和磁盘阵列,并能在上面继续保持很快的搜索速度和很 高的效率。
B+树:是一种树数据结构,通常用于数据库和操作系统的文件系统中。B+ 树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间 复杂度。B+树元素自底向上插入,这与二叉树恰好相反。
• 8.4 根文件系统
• 8.4.1 什么是根文件系统
– 系统挂载的第一个文件系统就是根文件
– 根文件系统顶层目录:
① bin:用户命令所在目录
② sbin:系统管理员命令目录
③ usr:共享的文件
④ proc:虚拟文件系统,用来显示内核及进程信息
⑤ dev:硬件设备文件及其它特殊文件
⑥ etc:系统配置文件,包括启动文件等
⑦ lib:链接库文件目录
⑧ boot:引导加载程序使用的静态文件
⑨ home:多用户主目录
⑩ mnt:装配点,用于装配临时文件系统或其他的文件系统
⑪ opt:附加的软件套件目录
⑫ root :用户主目录
⑬ tmp:临时文件目录
⑭ var:监控程序和工具程序所存放的可变数据
• Ubuntu的根文件系统(在Ubuntu的“终端”上执行):
– linux@linux-pc:/$ cd /
– linux@linux-pc:/$ ls
• bin boot cdrom dev etc home initrd.img initrd.img.old lib lib32 lib64 libx32 media
• mnt opt proc root run sbin snap source srv sys tftpboot tmp usr var vmlinuz vmlinuz.old
– linux@linux-pc:/$
• 实验箱的根文件系统(在Xshell上执行):
– linux@localhost:~$ cd /
– linux@localhost:/$ ls
• bin dev home lost+found mnt proc run snap sys tmp var
• boot etc lib media opt root sbin srv system usr
– linux@localhost:/$
• 8.4.2 建立JFFS2根文件系统
– Linux下常用文件系统结构:
• 采用JFFS2作为根文件系统
– 手工建立JFFS2文件系统的步骤:
① 准备制作JFFS2根文件系统的工具:mkfs.jffs2
② 建立根文件系统的目录
③ 编译busyBox
④ 复制动态链接库到lib目录中
⑤ 创建/etc/init.d/rcS、/etc/profile、/etc/fstab、/etc/inittab文 件,并且复制主机中的/etc/passwd、/etc/shadow、 /etc/group文件到相应的目录中
⑥ 移植bash,将其复制到/bin目录中
⑦ 执行“mkfs.jffs2 –r ./rootfs–o rootfs.jffs2 –n –e 0x20000”, 生成JFFS2根文件系统镜像