虚拟文件系统
- 什么是虚拟文件系统?
- 通用文件系统接口
- 文件系统抽象层
- UNIX文件系统
- 根目录
- 文件
本系列博客追寻《Linux内核设计与实现-Robert Love》,各个Linux机中的内核源代码不一,因此直接下载官网内核源码
参考书籍:《Linux内核设计与实现-Robert Love》
什么是虚拟文件系统?
虚拟文件系统(也称为虚拟文件交换,常见的简称VFS)作为内核子系统,为用户空间程序提供了文件和文件系统相关的接口。系统中所有文件系统不但依赖VFS共存,而且也依靠VFS系统协同工作。
通过虚拟文件系统,程序可以利用标准的UNIX系统调用对不同的文件系统,甚至不同介质上的文件系统进行读写
通用文件系统接口
VFS使得用户可以直接使用open()、read()和write()这样的系统调用而无需考虑具体文件系统和实际物理介质,使得系统调用可以在这些不同的文件系统和介质之间执行。
文件系统抽象层
之所以可以使用这种通用接口对所有类型的文件系统进行操作,是因为内核在他的底层文件系统接口上建立了一个抽象层
VFS抽象层之所以能衔接各种各样的文件系统,是因为他定义了所有文件系统都支持的、基本的、概念上的接口和数据结构,同时实际文件系统也将自身的“如何打开文件”“目录是什么”等概念在形式上与VFS的定义保持一致。
ret = write(fd, buf, len);
该系统调用将buf指针指向的长度为len字节的数据写入文件描述符fd对应文件的当前位置,这个系统调用首先被一个通用系统调用sys_write()处理,sys_write()函数要找到fd所在的文件系统实际给出的是哪个写操作,然后再执行该操作
write()(用户空间)— sys_write()(VFS虚拟文件系统)— 文件系统的写方法(具体文件系统)—物理介质
UNIX文件系统
UNIX使用了四种和文件系统相关的传统抽象概念:文件、目录项、索引节点和安装点(mount point)
从本质上来讲文件系统是特殊的分层存储结构,他包含文件。目录和相关的控制信息。在UNIX中,文件系统被安装在一个特定的安装点上,该安装点在全局层次结构中被称为命名空间,所有的已安装文件系统都作为根文件系统树的枝叶出现在系统中
根文件系统
根文件系统首先是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。
展开来细说就是,根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载(mount)的第一个文件系统,内核代码的映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。我们要明白文件系统和内核是完全独立的两个部分
根目录
/bin目录
该目录下存放所有用户都可以使用的、基本的命令,这些命令在挂接其它文件系统之前就可以使用,所以/bin目录必须和根文件系统在同一个分区中。
/bin目录下常用的命令有:cat,chgrp,chmod,cp,ls,sh,kill,mount,umount,mkdir,mknod,test等,我们在利用Busybox制作根文件系统时,在生成的bin目录下,可以看到一些可执行的文件,也就是可用的一些命令。
/sbin 目录
该目录下存放系统命令,即只有管理员能够使用的命令,系统命令还可以存放在/usr/sbin,/usr/local/sbin目录下,/sbin目录中存放的是基本的系统命令,它们用于启动系统,修复系统等,与/bin目录相似,在挂接其他文件系统之前就可以使用/sbin,所以/sbin目录必须和根文件系统在同一个分区中。
/sbin目录下常用的命令有:shutdown,reboot,fdisk,fsck等,本地用户自己安装的系统命令放在/usr/local/sbin目录下。
/dev目录
该目录下存放的是设备文件,设备文件是Linux中特有的文件类型,在Linux系统下,以文件的方式访问各种设备,即通过读写某个设备文件操作某个具体硬件。比如通过"dev/ttySAC0"文件可以操作串口0,通过"/dev/mtdblock1"可以访问MTD设备的第2个分区。
/etc目录
该目录下存放着各种配置文件,对于PC上的Linux系统,/etc目录下的文件和目录非常多,这些目录文件是可选的,它们依赖于系统中所拥有的应用程序,依赖于这些程序是否需要配置文件。在嵌入式系统中,这些内容可以大为精减。
/lib目录
该目录下存放共享库和可加载(驱动程序),共享库用于启动系统。运行根文件系统中的可执行程序,比如:/bin /sbin 目录下的程序。
/home目录
用户目录,它是可选的,对于每个普通用户,在/home目录下都有一个以用户名命名的子目录,里面存放用户相关的配置文件。
/root目录
根用户的目录,与此对应,普通用户的目录是/home下的某个子目录。
/usr目录
/usr目录的内容可以存在另一个分区中,在系统启动后再挂接到根文件系统中的/usr目录下。里面存放的是共享、只读的程序和数据,这表明/usr目录下的内容可以在多个主机间共享,这些主要也符合FHS标准的。/usr中的文件应该是只读的,其他主机相关的,可变的文件应该保存在其他目录下,比如/var。/usr目录在嵌入式中可以精减。
/var目录
与/usr目录相反,/var目录中存放可变的数据,比如spool目录(mail,news),log文件,临时文件。
/proc目录
这是一个空目录,常作为proc文件系统的挂接点,proc文件系统是个虚拟的文件系统,它没有实际的存储设备,里面的目录,文件都是由内核临时生成的,用来表示系统的运行状态,也可以操作其中的文件控制系统。
/mnt目录
用于临时挂载某个文件系统的挂接点,通常是空目录,也可以在里面创建一引起空的子目录,比如/mnt/cdram /mnt/hda1 。用来临时挂载光盘、硬盘。
/tmp目录
用于存放临时文件,通常是空目录,一些需要生成临时文件的程序用到的/tmp目录下,所以/tmp目录必须存在并可以访问。
文件
文件其实可以做一个有序字节串,字节串中第一个字节是文件的头,最后一个字节是文件的尾,每一个文件为了便于系统和用户识别,都被分配了一个便于理解的名字
文件通过目录组织起来,在UNIX中,目录属于普通文件,他列出了其中的所有文件。
VFS把目录当作文件看待,所以可以对目录执行和文件相同的操作
UNIX系统将文件的相关信息(元数据)和文件本身相区分。
文件相关信息被存储在一个单独的数据结构中,该结构被称为索引节点(inode)。
文件系统是一种中间层抽象概念,在此不做过多概述