当前,除了linux标准的文件系统Ext2/Ext3/Ext4外,存在很多种文件系统,比如reiserfs, xfs, Windows的vfat NTFS,网络文件系统nfs 以及flash 文件系统jffs2, yaffs/yaffs2 ubifs。linux通过叫做VFS的中间层最这些文件系统提供了完美的支持。
对于用户来说,这些文件系统是几乎透明的,在大部分情况下(比如fat vfat不支持链接,比如各个文件系统支持最大文件限制不同),文件系统用户通过libc和kernel的VFS交互,不需要关心底层文件系统实现。
VFS存在的意义
1. 向上提供一个标准的文件系统和文件操作接口;
2. 对下向文件系统提供一个灵活的接口,以便其他操作系统的文件系统可以方便的移植到Linux上;
3. VFS内部则提供一套高效的管理机制,比如inode cache, dentry cache 以及文件系统的预读,使得底层文件系统不需沉溺到复杂的内核操作,即可获得高性能;
4. 此外VFS把一些复杂的操作分尽量抽象到VFS内部,使得文件系统实现更简单。
VFS架构图
文件系统分类
文件系统一般可以分为以下几类
1. 磁盘文件系统
这类文件系统数目最多,最常见:ext2/ext3/ext4文件系统;resierfs文件系统 SGI的XFS文件系统;jffs2 yaffs ubifs等flash文件系统;crasmfs squashfs等只读文件系统;fat vfa ntfs等windows文件系统;
这类文件系统大部分都是基于块设备的文件系统,文件系统的数据和元数据都保存在块设备上;flash文件系统略有差别,flash文件系统是位于MTD之上的,
flash文件系统需要处理坏快,垃圾收集,磨损平衡等复杂的功能。f随着SD/MMC卡的普及,以及flash文件系统在可扩展性,启动速度上的先天不足。flash文件系统已经慢慢退出了嵌入式舞台。
cramfs squashfs存在的意义在于简单,高效,稳定(简单的东西自然稳定),在文件系统只读的场景,仍然会被用到。二者的共同特点就是只读,压缩。我们要有这样一个概念,文件系统的复杂来源于写数据,删除,truncate操作,目录添加删除,因此一个只读文件系统远比可读写文件系统简单。最直观的方法就是查看cramfs文件系统实现代码,只有区区两个小文件。
Reiserfs 提出了很多文件系统的新概念,对小文件的读写操作做了很大的优化,当然新概念过多,也是导致可读性可理解性差的原因。此外由于reiserfs的作者Hans reiserfs因为杀妻罪名成立,所以reiserfs的开发也受到了影响。
XFS相当的复杂,后面我会单独开一片分析
2. 特别的文件系统
此类文件系统也很常用,他们不是提供常规文件存储和访问,文件系统建立在内存之上,提供特殊的文件系统功能。如proc文件系统,pipe文件系统,以及ramdisk。
3. 网络文件系统