文件系统的理解一共分为了三个部分,第一个部分主要是VFS 的理解,第二个部分主要是linux 上的经典文件系统(ext2\ext3),最后再输出一下无持久存储的文件系统,通过以上三部分基本可以熟悉到文件系统的所有基础内容了.本文主要从VFS 的层面进行分析文件系统。我们知道linux 为了在支持本机的文件系统外同时允许访问其他操作系统的文件,用户态和文件系统之间加入了一个抽象层,该抽象层就是VFS,VFS 处于内核态。它的主要作用就是为了实现在linux系统里面那句万物皆文件的口号。
文件系统主要分三类:
1:基于磁盘的文件系统:主要包括了一些iso9660、FAT EXT2/3等,底层设备无非是存储块组成的一个列表。
2:虚拟文件系统,在内核中生成,主要是用户态获取内核态信息的一个通信方式
3:网络文件系统(NFS)
通用文件系统模型
VFS 不仅为文件系统提供了方法和抽象,还支持文件系统中对象的统一视图,该模型只存在于虚拟中,需要使用各种对象和函数指针与每种文件系统进行适配,所有文件系统的实现都需要提供与VFS 定义的结构配合。ext2与vfs结构之间的转换,几乎是可以不计损失时间。
对于文件的处理,用户态和内核态处理的对象有所不一样,对于用户程序来说对文件的处理主要是通过文件描述符标识。该描述符是一个整数,在对所有的文件操作中用做标识文件的参数,它在打开的时候由内核分配,只能在一个进程中有效,两个不通的进程可以使用相同的标识符,但他们不能指向同一个文件,所以通过文件描述符来共享文件是不行的。而内核处理文件的关键是inode,每个文件和目录都有一个inode,inode包含其他文件属性却并不包含文件名。
inode的成员主要有如下两类
1:描述文件状态的元数据,访问权限和修改日期
2:保存实际文件内容的数据段(数据指针)
为了更清楚的了解inode是如何构建文件系统的目录结构,我们用一个图可以很清晰的看出来(这里略)。其中查看inode的方法可以通过ls -li 查出
这里简单的介绍下链接,
软链接:每个软链接都会使用一个inode,相应的inode数据段包含的则是链接目标的路径
硬链接:硬链接创建后是无法区分源文件,创建的文件使用了同一个inode编号,这个有个问题如果我们删除了源文件,是否inode 也删除了呢?此时我们在inode中加入了一个计数器,对于每个硬链接计数器都会增加1,只有计数器为0 时系统才确定该文件不需要使用了。
inode和三个文件管理命令关系
cp和inode
分配一个空闲的inode号,在inode表中生成新条目
在目录中创建一个目录项,将名称与inode编号关联
拷贝数据生成新的文件
rm 和inode:
链接数递减,从而释放的inode号可以被重用
把数据块放在空闲列表中
删除目录项
数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖
mv和inode
1、如果mv命令的目标和源在相同的文件系统,作为mv 命令
用新的文件名创建对应新的目录项
删除旧目录条目对应的旧的文件名
不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!、如果目标和源在一个不同的文件系统, mv相当于cp和rm
下一期 我们将针对VFS 的结构和文件操作进行分析。敬请关注!