文件系统系列学习笔记(1)
话说做文件系统也半年多了,没啥总结、没啥积累,遇到问题还是临时看代码。写这个系列的目的有二:
1 对文件系统形成系统化的认识。
2 督促自己好好抓住业余时间好好学习。
3 本地文件系统之后就是分布式系统(hadoop+分布式计算),这是后话。。。
注:以Linux文件系统作为基点,“深为目,情为本”。 :-)
废话少说,开始了。。。
一 VFS
为了支持种类繁多的不同种文件系统,Linux提出了VFS虚拟文件系统的概念。虚拟文件系统说的直接点就是Linux为了屏蔽各种文件系统的差异性提供的一套抽象的通用数据结构和相应的操作函数,所谓实现依赖于抽象嘛(俺的理解),其他不同种类的文件系统只需要实现VFS提供的操作函数和数据结构及可连接入操作系统文件系统大家庭。可以引用一个<<深入理解>>的例子:
考虑下面使用场景:cp /floop/test /temp/test
其中/floop是MS-DOS磁盘的一个安装点,而/tmp是一个标准的第二扩展文件系统的目录,如图所示:
inf = open("/tmp/test", O_WRONLY|O_CREAT|O_TRUNC, 0600); outf = open("/floppy/test", O_RDONLY,0); do { i = read(inf, buf, 4096); write(outf, buf, i); }while(i); close(inf); close(outf);
整如你所见,cp应用程序直接与VFS进行交互,它不必关心所交互的具体文件系统类型。
二 VFS所支持的文件系统类型大致分为三类:
1 磁盘文件系统
- Linux使用的如ext2、ext3;
- unix家族的文件系统如ufs、minix;
- 微软的文件系统如MS-DOS、VFAT、NTFS
- ISO9660 CD_ROM、DVD文件系统
- 其他如HPFS(IBM)、HFS(apple)、AFFS、ADFS
2 网络文件系统
- NFS、CODA、AFS、CIFS。
3 特殊文件系统
- 如linux中的/proc
三 通用文件系统模型
VFS的主题思想是引入一个通用的文件系统模型,这个模型能够表示所有支持的文件系统。要实现每个具体的文件系统必须将将其组织结构转换为虚拟文件系统的通用文件模型。例如在通用文件系统模型中,每个目录被看做是一个文件,可以包括若干个文件和其他的子目录。但是某些磁盘文件系统利用文件的分配表存放每个文件在目录树中的位置,在这些文件系统中存放的是目录不是文件。通用文件系统模型定义了一个约束,这个约束包括一些数据结构和操作接口,具体的文件系统只需支持这些约束就可以挂入系统的文件系统。
通用文件系统模型定义了一些数据结构机器对应的操作,最重要的是四大对象:索引节点对象(inode)、目录项对象(dentry)、超级块对象、文件对象。
下篇文章重点介绍这四大对象,及他们之间的关系。