标题：Linux文件系统
创始人
Linus Torvalds
林纳斯·本纳第克特·托瓦兹（Linus Benedict Torvalds）出生于芬兰赫尔辛基市。父亲尼尔斯·托瓦兹（Nils Torvalds）是一名活跃的共产主义者及电台记者。托瓦兹家族属于在芬兰占6%的少数民族芬兰瑞典人。他毕业于赫尔辛基大学计算机科学系，1997年至2003年在美国加州硅谷任职于全美达公司（Transmeta Corporation）参与该公司芯片的code morph技术研发。后受聘于开源码发展实验室（OSDL : Open Source Development Labs,Inc），全力开发Linux内核。现任职于Linux基金会。
基本介绍
[1]　很详细地了解某个操作系统的实际工作方式是非常困难的，因为大多数操作系统的源代码都是严格保密的。在以实际使用为目标的操作系统中，让任何人都可以自由获取系统源代码，无论目的是要了解、学习还是修改，这样的系统并不多。本论文的主题就是这些少数操作系统中的一个：Linux。
Linux是一个性能稳定、功能强大、效率高的操作系统。它在功能特性方面与Unix系统相似，同时又具有多任务、多用户、多平台等若干特性。Linux的源代码是开放的，阅读Linux源代码,无疑是深入学习Linux的最好方法。
系统原理
Linux 最早的文件系统是Minix，但是专门为Linux 设计的文件系统——扩展文件系统第二版或EXT2被设计出来并添加到Linux中，这对Linux产生了重大影响。EXT2文件系统功能强大、易扩充、性能上进行了全面优化，也是现在所有Linux发布和安装的标准文件系统类型。
每个实际文件系统从操作系统和系统服务中分离出来，它们之间通过一个接口层：虚拟文件系统或VFS来通讯。VFS使得Linux可以支持多个不同的文件系统，每个表示一个VFS 的通用接口。由于软件将Linux 文件系统的所有细节进行了转换,所以Linux核心的其它部分及系统中运行的程序将看到统一的文件系统。Linux 的虚拟文件系统允许用户同时能透明地安装许多不同的文件系统。
在Linux文件系统中，作为一种特殊类型/proc文件系统只存在内存当中，而不占用内存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。/proc文件系统是一个伪文件系统，用户和应用程序可以通过/proc得到系统的信息，并可以改变内核的某些参数。
在Linux文件系统中，EXT2文件系统、虚拟文件系统、/proc文件系统是三个具有代表性的文件系统，本论文试图通过对他们的分析来研究Linux文件系统机制。并且在分析这三种文件系统的基础上对Linux文件系统操作进行了解、研究（本论文选取了open和close两种操作进行研究）。在第二部分中将介绍EXT2文件系统；第三部分论述虚拟文件系统的特点；第四部分简要介绍/proc文件系统；最后，介绍两种具体文件系统操作的实现。
EXT2文件系统
在Linux中普通文件和目录文件保存在称为块物理设备的磁盘或者磁带上。一套Linux系统支持若干物理盘，每个物理盘可定义一个或者多个文件系统。（类比于微机磁盘分区）。每个文件系统由逻辑块的序列组成，一个逻辑盘空间一般划分为几个用途各不相同的部分，即引导块、超级块、inode区以及数据区等。
引导块：在文件系统的开头，通常为一个扇区，其中存放引导程序，用于读入并启动操作系统；超级块：用于记录文件系统的管理信息。特定的文件系统定义了特定的超级块；inode区（索引节点）：一个文件或目录占据一个索引节点。第一个索引节点是该文件系统的根节点。利用根节点，可以把一个文件系统挂在另一个文件系统的非叶节点上；数据区：用于存放文件数据或者管理数据。
Linux最早引入的文件系统类型是MINIX。MINIX文件系统由MINIX操作系统定义，有一定的局限性，如文件名最长14个字符，文件最长64M字节。第一个专门为Linux设计的文件系统是EXT（Extended File System），但目前流行最广的是EXT2。
第二代扩展文件系统由Rey Card 设计，其目标是为Linux 提供一个强大的可扩展文件系统。它同时也是Linux界中设计最成功的文件系统。通过VFS的超级块（struct ext2_sb_info ext2_sb）可以访问EXT2的超级块，通过VFS的inode（struct ext2_inode_info ext2_i）可以访问EXT2的inode。
文件系统EXT2的源代码在/usr/src/linux/fs/ext2目录下，它的数据结构在文件/usr/src/linux/include/linux/ext2_fs.h以及同一目录下的文件ext2_fs_i.h和ext2_fs_sb.h中定义。
EXT2文件系统将它所占用的逻辑分区划分成块组（block group），如下图所示：
组0
组1
…………
组N
↓
超级块
组描述符表
块位图
inode位图
inode表
数据块
逻辑分区
和很多文件系统一样, EXT2 建立在数据被保存在数据块中的文件内这个前提下。这些数据块长度相等且这个长度可以变化，某个EXT2 文件系统的块大小在创建（使用mke2fs）时设置。每个文件的大小和刚好大于它的块大小正数倍相等。如果块大小为1024 字节而一个1025 字节长的文件将占据两个1024 字节大小的块。这样你不得不浪费差不多一半的空间。我们通常需要在CPU 的内存利用率和磁盘空间使用上进行折中。而大多数操作系统，包括Linux 在内，为了减少CPU 的工作负载而被迫选择相对较低的磁盘空间利用率。并不是文件中每个块都包含数据，其中有些块被用来包含描叙此文件系统结构的信息。EXT2通过一个inode 结构来描叙文件系统中文件并确定此文件系统的拓扑结构。inode 结构描叙文件中数据占据哪个块以及文件的存取权限、文件修改时间及文件类型。EXT2 文件系统中的每个文件用一个inode 来表示且每个inode 有唯一的编号。文件系统中所有的inode都被保存在inode 表中。 EXT2 目录仅是一个包含指向其目录入口指针的特殊文件（也用inode表示）。
对文件系统而言文件仅是一系列可读写的数据块。文件系统并不需要了解数据块应该放置到物理介质上什么位置，这些都是设备驱动的任务。无论何时只要文件系统需要从包含它的块设备中读取信息或数据，它将请求底层的设备驱动读取一个基本块大小整数倍的数据块。EXT2 文件系统将它所使用的逻辑分区划分成数据块组。每个数据块组将那些对文件系统完整性最重要的信息复制出来, 同时将实际文件和目录看作信息与数据块。为了发生灾难性事件时文件系统的修复，这些复制非常有必要。
与windows比较
相同点用户和组
Linux是多用户多任务操作系统而Windows是单用户多任务操作系统。都可以由许多不同的用户来使用，为每个用户提供单独的环境和资源。基于用户身份来控制安全性。都可以以组成员的方式来控制资源的访问权限，这样在用户数目较大时可以不必为每一个帐号设置权限。 
用户和组可以集中管理，让多个服务器共享相同的用户和身份验证数据。
文件系统
Linux和Windows都支持多种文件系统。文件资源可以通过NetBIOS、FTP或者其他协议与其他客户机共享。可以很灵活地对各个独立的文件系统进行组织，由管理员来决定它们在何处可以以何种方式被访问。
端口和设备
两种操作系统都支持各种物理设备端口，比如并口、串口和 USB 接口。支持各种控制器，比如 IDE 和 SCSI 控制器。Linux 还支持很多“刚刚上市”的标准硬件。
网络
Linux和Windows都支持多种网络协议，比如TCP/IP、NetBIOS和IPX。都支持多种类型的网络适配器。都具备通过网络共享资源的能力，比如共享文件和打印。都可以提供网络服务能力，比如 DHCP 和 DNS。
服务
Linux和Windows都提供服务。所谓服务，指的是那些在后台运行的应用程序，可以为系统和远程调用该服务的计算机提供一些功能。在系统引导的时候可以单独控制并自动启动这些程序。(注意：Linux 中沿用了 Unix 的习惯，称这种应用程序为 daemon)不同点Linux 的应用目标是网络而不是打印
Windows最初出现的时候，这个世界还是一个纸张的世界。Windows的伟大成就之一在于您的工作成果可以方便地看到并打印出来。这样一个开端影响了 Windows 的后期发展。
同样，Linux 也受到了其起源的影响。Linux 的设计定位于网络操作系统。它的设计灵感来自于 Unix 操作系统，因此它的命令的设计比较简单，或者说是比较简洁。由于纯文本可以非常好地跨网络工作，所以 Linux 配置文件和数据都以文本为基础。
对那些熟悉图形环境的人来说，Linux服务器初看可能比较原始。但是Linux开发更多关注的是它的内在功能而不是表面上的东西。即使是在纯文本的环境中，Linux同样拥有非常先进的网络、脚本和安全能力。执行一些任务所需的某些表面上看起来比较奇怪的步骤是令人费解的，除非您认识到 Linux 是期望在网络上与其他 Linux系统协同执行这些任务。Linux的自动执行能力也很强，只需要设计批处理文件就可以让系统自动完成非常详细的任务。Linux 的这种能力来自于其基于文本的本质。
可选的 GUI
Linux有图形组件。Linux支持高端的图形适配器和显示器，完全胜任图形相关的工作。现在，许多数字效果艺术家在Linux工作站上来进行他们的设计工作，而以前这些工作需要使用IRIX系统来完成。但是，图形环境并没有集成到 Linux 中，而是运行于系统之上的单独一层。这意味着您可以只运行 GUI，或者在需要时才运行 GUI。如果您的系统主要任务是提供Web应用，那么您可以停掉图形界面，而将其所用的内存和CPU资源用于您的服务。如果您需要在 GUI 环境下做一些工作，可以再打开它，工作完成后再将其关闭。 
Linux 有图形化的管理工具，以及日常办公的工具，比如电子邮件、网络浏览器和文档处理工具等。不过，在 Linux 中，图形化的管理工具通常是控制台 (命令行) 工具的扩展。也就是说，用图形化工具能完成的所有工作，用控制台命令同样可以完成。同样，使用图形化工具并不妨碍您对配置文件进行手工修改。其实际意义可能并不是特别显而易见，但是，如果在图形化管理工具中所做的任何工作都可以以命令行的方式完成，这就表示那些工作也可以由一个脚本来实现。脚本化的命令可以成为自动执行的任务。Linux 同时支持这两种方式，并不要求您只用文本或者只用 GUI。您可以根据您的需要选择最好的方法。
Linux 中的配置文件是人类可读的文本文件，这与过去的 Windows 中的 INI 文件类似，但与 Windows 的注册表机制在思路上有本质的区别。每一个应用程序都有其自己的配置文件，而且通常不与其他的配置文件放在一起。不过，大部分的配置文件都存放于一个目录树 (/etc) 下的单个地方，所以看起来它们在逻辑上是在一起。文本文件的配置方式使得不通过特殊的系统工具就可以完成配置文件的备份、检查和编辑工作。
文件名扩展
Linux不使用文件名扩展来识别文件的类型。相反，Linux根据文件的头内容来识别其类型。为了提高人类可读性您仍可以使用文件名扩展，但这对 Linux 系统来说没有任何作用。不过，有一些应用程序，比如 Web 服务器，可能使用命名约定来识别文件类型，但这只是特定的应用程序的要求而不是 Linux 系统本身的要求。
Linux通过文件访问权限来判断文件是否为可执行文件。任何一个文件都可以赋予可执行权限，这样程序和脚本的创建者或管理员可以将它们识别为可执行文件。这样做有利于安全。保存到系统上的可执行的文件不能自动执行，这样就可以防止许多脚本病毒。
重新引导是最后的手段
如果您使用Windows已经很长时间了，您可能已经习惯出于各种原因（从软件安装到纠正服务故障）而重新引导系统。在Linux思想中您的这一习惯需要改变。Linux在本质上更遵循“牛顿运动定律”。一旦开始运行，它将保持运行状态，直到受到外来因素的影响，比如硬件的故障。实际上，Linux系统的设计使得应用程序不会导致内核的崩溃，因此不必经常重新引导（与Windows系统的设计相对而言）。所以除了Linux内核之外，其他软件的安装、启动、停止和重新配置都不用重新引导系统。
如果您确实重新引导了 Linux 系统，问题很可能得不到解决，而且还会使问题更加恶化。学习并掌握 Linux 服务和运行级别是成功解决问题的关键。学习 Linux 最困难的就是克服重新引导系统的习惯。
另外，您可以远程地完成Linux中的很多工作。只要有一些基本的网络服务在运行，您就可以进入到那个系统。而且，如果系统中一个特定的服务出现了问题，您可以在进行故障诊断的同时让其他服务继续运行。当您在一个系统上同时运行多个服务的时候，这种管理方式非常重要。
命令区分大小写
所有的 Linux 命令和选项都区分大小写。例如， -R 与 -r 不同，会去做不同的事情。控制台命令几乎都是小写的。我们将在“ 第 2 部分. 控制台速成班”中对命令进行更详细的介绍。