深入理解Linux内核-虚拟文件系统
Linux 成功的关键之一是它具有和其他操作系统和谐共存的能力
5个标准文件类型:
1、普通文件
2、目录文件
3、符号链接文件
4、设备文件
5、管道文件
虚拟文件系统(Virtual FileSystem):内核软件层,用来处理与Unix标准文件系统相关的所有系统调用。健壮性表现在能为各种文件系统提供一个通用的接口。
VFS支持的文件系统可以分为三种主要类型:
1、磁盘文件系统:
a、Linux使用的Ext2、Ext3,以及Reiser文件系统(ReiserFS);
b、Unix家族的文件系统,如sysv文件系统(System V, Coherent, Xenix)、UFS(BSD、SOlaris、NEXTSTEP),MINIX文件系统及 VERITAS VxFS (SCO UnixWare )
c、Window的文件系统,如MS-DOS,VFAT,NTFS
d、ISO9660 CD-ROM 文件系统和通用磁盘格式(UDF)的DVD文件系统
e、其他有专利权的文件系统,如HPFS(IBM公司的OS/2)、HFS(苹果公司的Macintosh)、AFFS、ADFS
f、起源于非Linux系统的其他日志文件系统,如IBM的JFS、SGI、XFS
2、网络文件系统
这些文件系统允许轻易的访问属于其他网络计算机的文件系统所包含的文件。虚拟文件系统所支持的一些著名的网络文件系统有:NFS、Coda、AFS、CIFS(Window的通用网络文件 系统)以及NCP
3、特殊文件系统
这些文件系统不管理本地或者远程磁盘空间。/proc 文件系统是特殊文件系统的一个典范。
通用文件模型:
1、能表示所有支持的文件系统
2、要实现每个具体的文件系统,必须将其物理组织结构转换为虚拟文件系统的通用文件模型。
文件分配表(File Allocation Table,FAT):基于目录的文件系统
读取文件:
当我们调用read函数时,内核会调用相应的sys_read()服务例程,在sys_read()中文件有结构File结构来表示,其包含一个f_op字段,这个字段包含了读取各种文件系统的方法
例如:file->f_op->read(), 针对不同的文件系统,由不同的read方法来读取
磁盘高速缓存:属于软件机制,允许内核将原本存在磁盘上的某些信息保存在RAM中,以便对这些数据的进一步访问能快速进行,不必慢速访问磁盘。
a、目录项高速缓存
b、索引节点高速缓存
c、页高速缓存
硬件高速缓存:是一个快速静态RAM,它加快了直接对慢速动态RAM的请求。
内存高速缓存:是一种软件机制,引入它是为了绕过内核内存分配器(参见slab分配器)
文件系统的注册:一个文件系统要能够被使用,需要将他的类型注册到一个单向链表中。
Linux的根文件系统:内核在引导阶段直接安装,并拥有系统初始化脚本以及最基本大系统程序。
安装点(mount point):安装文件系统的目录。
进程的命名空间:每个进程可以拥有自己的已安装文件系统树。
文件系统的安装:
1、多数类Unix内核中,每个文件系统只能安装一次;例如 存放在/dev/fd0 软磁盘上的ext2文件系统通过命令(mount -t ext2 /dev/fd0 /flp)安装在/flp
在通过umount卸载之前,所有作用在/dev/fd0的安装命令都会失效。
2、Linux不同,同一个文件系统可以被安装多次。
3、不管一个文件系统被安装了多少次,它都只有一个超级块对象。
4、同一个安装点可以安装多个文件系统
5、后安装的会隐藏先安装的,当顶层顶安装被删除后,下面的系统又变为可现
文件系统的卸载:umount()
路径名查找:
1、路径如果是以‘\’开头,是绝对路径,从 current->fs->root开始搜索
2、否则是相对路径,从current->fs->pwd开始搜索
标准路径名查找:
父路径名查找:
符号链接的查找:需要注意循环引用,采用计数器解决。
文件加锁:
Linux 文件加锁:
FL_FLOCK锁 和FL_POSIX锁: