Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6478795
  • 博文数量: 579
  • 博客积分: 1548
  • 博客等级: 上尉
  • 技术积分: 16635
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-12 15:29
个人简介

http://www.csdn.net/ http://www.arm.com/zh/ https://www.kernel.org/ http://www.linuxpk.com/ http://www.51develop.net/ http://linux.chinaitlab.com/ http://www.embeddedlinux.org.cn http://bbs.pediy.com/

文章分类

全部博文(579)

文章存档

2018年(18)

2015年(91)

2014年(159)

2013年(231)

2012年(80)

分类: 服务器与存储

2014-09-03 12:14:16

    Linux的老江湖们对这个概念当然不会陌生,然而刚接触Linux的新手们就会被文件系统这个概念弄得晕头转向,恰好我当年正好属于后者。从windows下转到Linux的童鞋听到最多的应该是fat32ntfs(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不同的发行版都存在如下的目录结构:

      上图中一个比较特殊的目录就是硬盘的根目录“/”,如果我们将一块硬盘格式化成ext3ext4格式后,通过mount命令将其挂载到根目录下,就形成了我们通常所说的“根文件系统”。根文件系统不是一个新实体,而是指挂载在根目录下的存储设备(或某个分区)实际所使用的文件系统类型。当“根文件系统”被挂载后,内存中就有了如上所示的目录结构树。这里提醒一点,千万不要以为你在命令行输入“cd /usr/src/”等命令时是在“操作”硬盘,其实你是在内存的VFS的目录树里。这里就不展开了,后面剖析VFS时再详细介绍。作为用户在使用文件系统时,对于某个具体的存储设备,例如U盘或硬盘,无非是首先执行诸如mk2fsmkfs.xxx这样的命令对存储设备进行格式化,将其格式化成某种类型的文件系统,然后用mount命令将该存设备挂载到某个具体的目录下,然后对该目录下的文件进行“增、删、改、查”就可以实现对该存储设备上数据的操作。

      这里就有几个关键点需要大家留意了,以便我们后面分析VSF机制时心里能做到“提前亮”。在类Unix系统中讨论文件系统,不可回避的要就要牵扯到挂载(mount)机制,在windows下这个过程已经被微软封装了,普通用户察觉不到,至少在我接触windows这么些年从来没听谁跟我提起过windows下的mount机制。所以我们在分析源码时可以留意一下挂载的实现机制。另一个就是目录,这个再熟悉不过,Unix/LinuxWindows,几乎所有的操作系统都至此,其目的就是用来对文件进行组织便于用户管理,即站在用户的角度来说就是回答了“我的文件在哪儿放着”的问题。

      Linux早期设计阶段,文件系统与内核代码是整合在一起的,这样做的缺点是显而易见的。假如,我的系统只能识别ext3格式的文件系统,我的U盘是fat32格式,那么很不幸的是我的U盘将不会被我的系统所识别,所以fat32格式的U盘在我们的系统上将无法使用。为了支持不同种类的文件系统,Linux采用了在Unix系统中已经广泛采用的设计思想,通过虚拟文件系统VFS来屏蔽下层各种不同类型文件系统的实现细节和差异。

      其实VFS最早是由Sun公司提出的,目的是实现网络文件系统NFS(Network File System),其基本思想是将各种文件系统的公共部分抽取出来,形成一个抽象层。对用户的应用程序而言,VFS提供了文件系统的系统调用接口。而对具体的文件系统来说,VFS通过一系列统一的外部接口屏蔽了实现细节,使得对文件的操作不再关心下层文件系统的类型,更不用关心具体的存储介质,这一切都是透明的。

     小结一下:所谓文件系统就是操作系统用来明确磁盘或分区上的文件以及数据结构的一种方法,也就是磁盘上文件的组织方法。普通用户所看到的文件系统,是以目录结构而存在的一个多级分层的树状结构,但作为开发人员我们得知道其实每个目录下都可以挂载不同类型的文件系统。最后一点是,每个文件系统可以占用磁盘的一个分区,而不是整个硬盘,这一点请注意。VFS并不是一个实际的文件系统,它是类Unix操作系统给我们提供的一种用于统一管理具体文件系统的机制。当我们要开发一种新的文件系统时,需要遵照VFS的规范,才能享受VFS带来的好处。
     未完,待续...
阅读(2483) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~