分类: 服务器与存储
2015-06-21 09:00:19
原文地址:小议Linux系统下的文件系统 作者:wjlkoorey258
Linux的老江湖们对这个概念当然不会陌生,然而刚接触Linux的新手们就会被文件系统这个概念弄得晕头转向,恰好我当年正好属于后者。从windows下转到Linux的童鞋听到最多的应该是fat32和ntfs(在windows 2000之后所出现的一种新型的日志文件系统),那个年代经常听到说“我要把C盘格式化成ntfs格式,D盘格式化成fat32格式”。一到Linux下,很多入门Linux的书籍中当牵扯到文件系统这个术语时,二话不说,不管三七二十一就给出了下面这个图,然后逐一解释一下每个目录是拿来干啥的、里面会放什么类型的文件就完事儿了,弄得初学者经常“丈二和尚摸不着头脑”。难道这就是Linux下的文件系统。而且新手一直被“灌输”一个思想:Linux下一切都是文件,不再像Windows那样用扩展名来为文件分类等等。这就让那些喜欢刨根问底的fresh-fish很是不爽,他们本着对学术的严谨、技术的狂热的态度,一心想弄明白:到底什么才是文件系统。本文的目的就是和大家分享一下我当初是如何学习Linux的文件系统的,也算是一个“老”油条的一些心得吧。
“文件系统”的主语是“文件”,那么文件系统的意思就是“用于管理文件的(管理)系统”,而这套管理系统所管理的对象当然就是文件了。在大多数操作系统里,“文件是数据的集合”这个基本点是一致的,而这些数据最终都是存储在存储介质里,如硬盘、光盘、U盘等。
另一方面,用户在管理数据时也是文件为基本单位,他们所关心的问题是:
1、我的文件在什么地方放着?
2、我如何将数据存入某个文件?
3、如何从文件里将数据读出来?
3、不再需要的文件怎么将其删除?
简而言之,文件系统就是一套用于定义文件的命名和组织数据的规范,其根本目的是便对文件进行查询和存取。
Unix/Linux系统中的文件系统有个很重要的特性就挂载,即文件系统在使用前必须被挂载在一个实际的目录下才能使用,这是因为类Unix系统中的文件系统都遵循了FHS(Filesystem Hierarchy Standard)。在FHS中详细定义了类Unix操作系统中各种应用软件、管理工具、开发工具、脚本和帮助文件所处的位置。这样,通过该标准,软件发布商和用户在不同的发行版的linux系统里都能预测软件安装后,文件和目录所处的位置。
文件系统为了实现对文件更好的管理、组织方式,引入了目录的概念。目录里不但可以保存文件还可以保存目录,以目录为依托,最终会形成一个目录树的结构。根据FHS的规定,Linux不同的发行版都存在如下的目录结构:上图中一个比较特殊的目录就是硬盘的根目录“/”,如果我们将一块硬盘格式化成ext3或ext4格式后,通过mount命令将其挂载到根目录下,就形成了我们通常所说的“根文件系统”。根文件系统不是一个新实体,而是指挂载在根目录下的存储设备(或某个分区)实际所使用的文件系统类型。当“根文件系统”被挂载后,内存中就有了如上所示的目录结构树。这里提醒一点,千万不要以为你在命令行输入“cd /usr/src/”等命令时是在“操作”硬盘,其实你是在内存的VFS的目录树里。这里就不展开了,后面剖析VFS时再详细介绍。作为用户在使用文件系统时,对于某个具体的存储设备,例如U盘或硬盘,无非是首先执行诸如mk2fs或mkfs.xxx这样的命令对存储设备进行格式化,将其格式化成某种类型的文件系统,然后用mount命令将该存设备挂载到某个具体的目录下,然后对该目录下的文件进行“增、删、改、查”就可以实现对该存储设备上数据的操作。
这里就有几个关键点需要大家留意了,以便我们后面分析VSF机制时心里能做到“提前亮”。在类Unix系统中讨论文件系统,不可回避的要就要牵扯到挂载(mount)机制,在windows下这个过程已经被微软封装了,普通用户察觉不到,至少在我接触windows这么些年从来没听谁跟我提起过windows下的mount机制。所以我们在分析源码时可以留意一下挂载的实现机制。另一个就是目录,这个再熟悉不过,Unix/Linux和Windows,几乎所有的操作系统都至此,其目的就是用来对文件进行组织便于用户管理,即站在用户的角度来说就是回答了“我的文件在哪儿放着”的问题。
在Linux早期设计阶段,文件系统与内核代码是整合在一起的,这样做的缺点是显而易见的。假如,我的系统只能识别ext3格式的文件系统,我的U盘是fat32格式,那么很不幸的是我的U盘将不会被我的系统所识别,所以fat32格式的U盘在我们的系统上将无法使用。为了支持不同种类的文件系统,Linux采用了在Unix系统中已经广泛采用的设计思想,通过虚拟文件系统VFS来屏蔽下层各种不同类型文件系统的实现细节和差异。
其实VFS最早是由Sun公司提出的,目的是实现网络文件系统NFS(Network File System),其基本思想是将各种文件系统的公共部分抽取出来,形成一个抽象层。对用户的应用程序而言,VFS提供了文件系统的系统调用接口。而对具体的文件系统来说,VFS通过一系列统一的外部接口屏蔽了实现细节,使得对文件的操作不再关心下层文件系统的类型,更不用关心具体的存储介质,这一切都是透明的。