C++面试题集LInux编程

Linux文件系统

2017-08-13  本文已影响48人  saviochen

Linux允许众多不同的文件系统共存,并支持跨文件系统的文件操作,这是因为有虚拟文件系统(VFS)的存在。VFS是Linux内核中一个软件抽象层。

一、VFS基本概念

从本质上讲,文件系统是特殊的数据分层存储结构,它包含文件、目录和相关的控制信息。为了描述这个结构,Linux引入了一些基本概念:

1、文件

一组在逻辑是哪个具有完整意义的信息项。普通文件、目录、设备、套接字都以以文件对待。“一切皆文件”。

2、目录

目录好比一个文件夹,用来容纳相关文件。因为目录可以包含子目录,所以目录是可以层层嵌套,形成文件路径。在Linux中,目录也是以一种特殊文件被对待的,所以用于文件的操作同样也可以用在目录上。

3、目录项

在一个文件路径中,路径中的每一部分都被称为目录项;如路径 /home/source/helloworld.c中,目录 /, home, source和文件 helloworld.c都是一个目录项。

4、索引节点(inode)

文件包含文件本身和文件的相关信息,这些相关信息包括访问控制权限、大小、拥有者、创建时间等内容,文件的相关信息被存储在一个单独的数据结构中,该结构就叫做索引节点。索引节点包含了内核在操作文件或目录时需要的全部信息,一个索引节点代表文件系统中一个文件(当然可以是设备和管道这样的特殊文件)。

5、超级块

包含文件系统信息的数据结构。文件系统的控制信息、单独文件的信息这些都包含超级块中。超级块通常存放在特定的扇区中。

磁盘与文件系统
6、创建

以某种方式格式化磁盘的过程就是在其之上建立一个文件系统的过程。创建文现系统时,会在磁盘的特定位置写入关于该文件系统的控制信息。

7、注册

向内核报到,声明自己能被内核支持。一般在编译内核的时侯注册;也可以加载模块的方式手动注册。注册过程实际上是将表示各实际文件系统的数据结构struct file_system_type 实例化。

8、安装(挂载)

也就是我们熟悉的mount操作,将文件系统加入到Linux的根文件系统的目录树结构上;这样文件系统才能被访问。

二、跨文件操作系统操作的原理

通过一个例子来理解跨文件系统的文件操作:将vfat格式的磁盘上的一个文件a.txt拷贝到ext3格式的磁盘上,命名为b.txt。这包含两个过程,对a.txt进行读操作,对b.txt进行写操作。

读写操作前,需要先打开文件。打开文件时,VFS会知道该文件对应的文件系统格式,以后操作该文件时,VFS会调用其对应的实际文件系统的操作方法。所以,VFS调用vfat的读文件方法将a.txt的数据读入内存;在将a.txt在内存中的数据映射到b.txt对应的内存空间后,VFS调用ext3的写文件方法将b.txt写入磁盘;从而实现了最终的跨文件系统的复制操作。

不论是普通的文件,还是特殊的目录、设备等,VFS都将它们同等看待成文件,通过同一套文件操作界面来对它们进行操作。操作文件时需先打开;打开文件时,VFS会知道该文件对应的文件系统格式;当VFS把控制权传给实际的文件系统时,实际的文件系统再做出具体区分,对不同的文件类型执行不同的操作。这也就是“一切皆是文件”的根本所在。

三、总结

VFS即虚拟文件系统是Linux文件系统中的一个抽象软件层;因为它的支持,众多不同的实际文件系统才能在Linux中共存,跨文件系统操作才能实现。VFS借助它四个主要的数据结构即超级块、索引节点、目录项和文件对象以及一些辅助的数据结构,向Linux中不管是普通的文件还是目录、设备、套接字等都提供同样的操作界面,如打开、读写、关闭等。只有当把控制权传给实际的文件系统时,实际的文件系统才会做出区分,对不同的文件类型执行不同的操作。由此可见,正是有了VFS的存在,跨文件系统操作才能执行,Unix/Linux中的“一切皆是文件”的口号才能够得以实现。

参考文献:
1、从文件 I/O 看 Linux 的虚拟文件系统
2、目录、目录项、超级块、索引节点、文件

上一篇下一篇

猜你喜欢

热点阅读