陈莉君

陈莉君的博客

她的个人主页  她的博客

Linux文件系统(二)-为仁由己

陈莉君  2010年01月21日 星期四 21:31 | 1957次浏览 | 2条评论

儒家倡导 修身齐家治国平天下 ,认为 天下之本在国,国之本在家,家之本在身 在儒家看来,通过修身养性而实现的人内在的身心和谐,是实现人际和谐、群己和谐,最后达至天人和谐的必要前提。只有 成己 才能 成人 ,只有 成己 才能 成物 ,出发点都是 成己 ,就是自我内在的身心和谐。

    Linux 文件系统的魅力在于“成己 ”  成人”。如果说整个 Linux 内核相当于一个“国”,那么, VFS  相当于一个“家”,且是一家之长,而各种具体的文件系统相当于“己”,或者说家庭中的一个个子女。在 VFS 统领的这个大家庭中,各个成员之所以能相互友好共存,在于其所具有共性和个性。

   尽管我们熟知一些文件系统如 Ext2/Ext3 NTFS VFAT JFS 等,但是,要给文件系统下一个确切易懂的定义并不容易。文件系统似躲在 文件 背后一只无形的手,对文件进行种种的操作(打开,读,写等),从这个意义上说,文件系统是文件的 管理者(这是一种笼统的说法) 。然文件既不存放在真空中,也不存放在空气中,而通常存放在磁盘上(有时可能在内存,如 /proc 文件系统),因此说,文件系统实际上是对文件以及所存储空间的管理机制。

l 共性 - 抽象层
   虚拟文件系统 VFS 的第一个词是“虚拟”,这就意味着,这样的文件系统在磁盘(或其他 存储介质上)并没有对应的存储信息。那么,这样一个虚无的文件系统到底怎样形成?尽管 Linux 支持多达几十种文件系统,但这些真实的文件系统并不是一下子都挂在系统中的,他们实际上是按需被挂载的。 老子说: 有无相生 ,这个“虚”的 VFS 的信息都来源于“实”的文件系统, 所以 VFS 必须承载各种文件系统的共有属性。 另外,这些实的文件系统只有安装到系统中, VFS 才予以认可,也就是说, VFS 只管理挂载到系统中的实际文件系统。

   既然, VFS 承担管家的角色,那么我们分析一下它到底要管哪些对象。 Linux 在文件系统的设计中,全然汲取了 Unix 的设计思想。 Unix 在文件系统的设计中抽象出四个概念: 文件,目录项,索引节点和安装点(mount point)。

l 文件系统中对象的演绎

从本质上讲文件系统是特殊的数据分层存储结构,它包含文件、目录和相关的控制信息。文件系统的典型操作包含创建、删除和安装等等。在Unix中,文件系统被挂载在根文件系统的某个枝叶上,这就是 安装点 ,安装点在全局的层次结构中具有独立的命名空间。

  如何给耳熟能详的 文件 给一个明确的定义?其实可以把 文件 看作是一个有序字节串,字节串中第一个字节是文件的头,最后一个字节是文件的尾。为了便于系统和用户识别,每一个文件都被分配了一个便于理解的名字。典型的文件操作有读、写、创建和删除等。

   文件系统通过 目录 来组织文件。文件目录好比一个文件夹,用来容纳相关文件。因为目录也可以包含子目录,所以目录可以层层嵌套,形成文件路径。路径中的每一部分被称作 目录项 ,例如“/home/clj/myfile”是文件路径的一个例子,其中根目录是/,目录home,clj和文件myfile都是目录项。在Unix中,目录属于普通文件,所以对目录和文件可以实施同样的操作。

   文件系统如何对文件的属性(例如文件名,访问控制权限、大小、拥有者、创建时间等信息)进行描述?这就是大名鼎鼎的索引节点(index Inode),为什么不叫文件控制块而叫索引节点,主要是因为有一个叫索引号的属性可以惟一的标识文件。

   以上说明了文件,目录项,索引节点,而更重要的是,如何描述各种文件系统的控制信息,这就是 超级块 ,超级块是一种包含文件系统信息的数据结构。

通过以上的介绍,可以概括出VFS中四个主要的对象:

超级块对象 ,描述已安装文件系统。

索引节点对象 ,描述一个文件。

* 目录项对象 ,描述一个目录项, 是路径的组成部分

* 文件对象 ,描述由进程打开的文件。

注意,因为VFS将目录作为一个文件来处理,所以不存在目录对象。换句话说,目录项不同于目录,但目录却和文件相同.

l 对象的和谐共存



  图1 显示的一个简单的实例,说明进程怎样与文件进行交互。三个不同进程打开同一个文件(用 inode object 表示),而每个打开的文件就是一个文件对象 file object (体会文件和文件对象是截然不同的),其中两个进程使用同一个硬链接(说明这两个进程打开的文件在磁盘存放在相同的位置)。这里,每个进程都使用自己的文件对象,但只需要两个目录项对象 dentry object ,因为目录项对象描述的是路径,因此与硬链接对应。但是,殊途同归,这两个目录项对象实际上指向的是同一个索引节点对象,也就是说,索引节点对象+超级块对象(表示文件系统)就可以确切地标识普通的磁盘文件。( 这段文字左拐右绕,需静心体会,方可理解设计之根本)

 

图1 进程与VFS对象之间的交互(摘自ULK)


  VFS 除了能为所有文件系统的实现提供一个通用接口外,还必须关注系统性能。目录项高速缓存(dentry cache)就承担此角色,最近最常使用的目录项对象被放在这种缓存中,以加速把文件路径名转换成索引节点,也就是路径中的最后一项(文件)对应的索引节点。

l 为仁由己
   文件,目录项,索引节点,超级块,实际上是抽象出来的对象,但Linux文件系统在物理磁盘布局时把这些抽象的概念赋之实施。比如说在磁盘上,把文件(目录也属于文件)信息按照索引节点形式存储在单独的块中;把文件系统控制信息集中存储在磁盘的超级块中,等等(看看Ext2/Ext3磁盘信息的存储就了然)。各个具体文件系统尽力“成己”,实现了这些概念,VFS的设计目标就是要保证与这些文件系统协同工作。比如,FAT或NTFS这样的非Unix风格的文件系统,虽然也可以在Linux上工作,但是它们必须经过封装,提供一个符合这些概念的界面。比如,即使一个文件系统不支持索引节点,它也必须在内存中装配索引节点结构体,就像它本身包含索引节点一样。再比如,如果一个文件系统将目录看作是一种特殊对象,那么要想使用VFS,就必须将目录重新表示为文件形式。通常,这种转换需要在使用现场引入一些特殊处理,使得非Unix文件系统能够兼容Unix文件系统的使用规则并满足VFS的需求。通过这些处理,非Unix文件系统便可以和VFS一同工作了,也就是说,各个文件系统通过“修己”,而达到与VFS以及其他文件系统的 群己和谐”

评论

我的评论:

发表评论

请 登录 后发表评论。还没有在Zeuux哲思注册吗?现在 注册 !
漆浩

回复 漆浩  2011年08月17日 星期三 22:26

其实 还是看不太懂呢。。。不过还是赞一个

0条回复

李登

回复 李登  2010年01月21日 星期四 23:03

呵呵 先占个座 明天考完自辩再回来看...

0条回复

暂时没有评论

Zeuux © 2024

京ICP备05028076号