Linux系统篇-文件系统虚拟文件系统(非常重要!)
看了之前的关于Linux内存管理和进程调度的文章,相比读者们应该对Linux有了大致的了解,本文的主题是Linux虚拟文件系统。闲话少说,开始! 1.软链接和硬链接的区别 我们知道文件都有文件名与数据,数据分两部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块 为解决文件的共享使用,Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link)。链接为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。若一个 inode 号对应多个文件名,则称这些文件为硬链接。硬链接就是同一个文件使用了多个别名 由于硬链接是有着相同 inode 号仅文件名不同的文件,因此硬链接存在以下几点特性:
inode 号仅在各文件系统下是唯一的,当 Linux 挂载多个文件系统后将出现 inode 号重复的现象,因此硬链接创建时不可跨文件系统 软链接与硬链接不同,若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块。因此软链接的创建与使用没有类似硬链接的诸多限制:
2.Linux VFS Linux 有着极其丰富的文件系统,大体上可分如下几类:
实现以上这些文件系统并在 Linux 下共存的基础就是 Linux VFS(Virtual File System 又称 Virtual Filesystem Switch),即虚拟文件系统。VFS 作为一个通用的文件系统,抽象了文件系统的四个基本概念:文件、目录项 (dentry)、索引节点 (inode) 及挂载点,其在内核中为用户空间层的文件系统提供了相关的接口。VFS 实现了 open()、read() 等系统调并使得 cp 等用户空间程序可跨文件系统。VFS 真正实现了上述内容中:在 Linux 中除进程之外一切皆是文件。 Linux VFS 存在四个基本对象:超级块对象 (superblock object)、索引节点对象 (inode object)、目录项对象 (dentry object) 及文件对象 (file object)。超级块对象代表一个已安装的文件系统;索引节点对象代表一个文件;目录项对象代表一个目录项,如设备文件 event5 在路径 /dev/input/event5 中,其存在四个目录项对象:/ 、dev/ 、input/ 及 event5。文件对象代表由进程打开的文件。为文件路径的快速解析,Linux VFS 设计了目录项缓存(Directory Entry Cache,即 dcache)。 3.文件的打开过程 open()系统调用的过程如下: 1.查看system-wide open-file table(系统打开文件表)中是否有该文件,即查看该文件是否已经被其他进程打开了 2.如果存在,那么该进程会在自己的per-process open-file table(进程打开文件表)中,建立一个项目,指向system-wide open-file table中的该文件 3.如果不存在,则需要根据file name在directory中查找该file,通常directory中的部分内容在cache中,这样可以加快搜索速度。 4.一旦文件被找到,那么FCB(file control block)文件控制块会被复制到system-wide open-file table中,该表不仅仅保存FCB,而且记录每个文件被多少个进程打开 5.接下来,在per-process open-file table(进程打开文件表)中,简直一个entry,指向进程打开文件表中该项目 当进程close()一个文件时: 1.该进程的per-process open-flle table中的对应项会被删除,系统打开表中的该文件计数器会减1 2.如果系统打开表中的计算为0,那么删除该文件项 4.inode的理解 操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。 文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。 inode包含文件的元信息,具体来说有以下内容: * 文件的字节数 * 文件拥有者的User ID * 文件的Group ID * 文件的读、写、执行权限 * 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。 * 链接数,即有多少文件名指向这个inode * 文件数据block的位置 除了文件名以外的所有文件信息,都存在inode之中 每个inode都有一个号码,操作系统用inode号码来识别不同的文件。 (编辑:ASP站长网) |