首页 > 编程笔记

Linux文件系统详解

前面我们已经学习了文件系统的结构、文件类型以及目录和功能。从本节开始,我们继续学习文件系统的使用方法和常见的文件系统。

在安装 Linux 系统的过程中,系统会提供默认的文件系统供存储设备选择,Linux 文件系统为在硬盘存储和应用中使用的文件与目录之间搭建了沟通的桥梁。

什么是Linux文件系统

文件的系统是操作系统用于确定磁盘或分区上的文件的方法和数据结构,也就是在磁盘上组织文件的方法,同时文件系统还用于存储文件的磁盘、分区或文件系统的种类。

操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。Linux 系统中的文件系统结构如图 1 所示。

Linux下的文件系统结构图
图 1 Linux 下的文件系统结构图

在文件系统中,一小部分程序可以直接对磁盘或分区的原始扇区进行操作,但这会破坏已经存在的文件系统。还有一部分程序是在文件系统的基础上进行操作,遇到这种情况时,要想顺利工作必须在同种类的文件系统上操作才可以。

一个分区或磁盘在作为文件系统使用前,需要初始化,并将记录的数据结构写到磁盘上,这个过程就叫建立文件系统。

注意,对硬盘进行格式化时,不仅清除了硬盘中的数据,格式化过程中还向硬盘中写入了文件系统。不同的操作系统,管理系统中文件的方式也不相同,给文件设定的属性和权限也是不一样的,因此,为了使硬盘能够有效地存放当前系统中的文件数据,就需要将硬盘格式化,令其使用和操作系统相似的文件系统格式。

文件系统是操作系统用于在存储设备上组织文件的方法。不同的文件系统,其运作模式和操作系统的文件数据有关。例如 Linux 操作系统中的文件,文件数据不仅包括文件中的内容,而且还有很多的文件属性,即文件的 rwx 权限以及文件的所有者、所属组、创建时间等。

通常情况下,文件系统会将文件的实际内容和属性分开存放:

注意,i 节点中所有的属性都是用来描述文件的,并不是文件中的内容。

一个 i 节点就是一个与某个特定的文件或目录相关的信息列表。i 节点实际上是一个数据结构,它存放了普通文件、目录或其他文件系统的基本信息。

在 Linux 系统中,当一个磁盘被格式化成文件系统(如 ext 3 或 ext 4)时,系统将自动生成一个 i 节点(inode)表,其中包含了所有文件的元数据(metadata,描述数据的数据)。i 节点(inodes)的数量决定了在这个文件系统的分区中最多可以存储多少个文件,这是由于每一个文件和目录都对应一个唯一的i节点,而这个 i 节点是使用一个 i 节点号(inode number,简写成 inode-no)来标识的。

也就是说,在一个分区中有多少个 i 节点,就只能够存储多少个文件和目录。在多数类型的文件系统中,i 节点的数目是固定的,并且是在创建文件系统时生成的。在一个典型的 UNIX 或 Linux 文件系统中,i 节点所占用的空间大约是整个文件系统大小的 1%。

注意,Linux 系统在启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出现错误而退出启动。另外,可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件系统。

为什么要使用文件系统

文件系统管理着许多文件,而这些文件就是数据,这些数据又保存在磁盘上。所以,文件系统实质上就是管理磁盘的软件系统,它不仅简化了用户对磁盘空间的使用方法,而且降低了磁盘空间的使用难度,将磁盘中的数据通过更加形象的方式展示给用户。

文件系统实现对磁盘空间的统一管理,一方面文件系统需要对磁盘空间进行统一规划,另一方面文件系统是提供给普通用户人性化的接口。文件系统类似于仓库中的货架,通过货架可以将空间进行规划和编排,这样根据编号可以方便地找到具体的货物。文件系统也可以将磁盘空间进行规划和编号处理,这样通过文件名就可以找到具体的数据,而并不需要知道数据到底是怎么存储的。

在 Linux 文件系统中,访问文件的过程具有如下特征:
  1. 在访问和维护文件时需要经常使用到文件名。
  2. i 节点(inodes)是系统用来记录有关文件信息的对象。
  3. 数据块是用来存储数据的磁盘空间的单位。

从以上内容可以看出,每个文件必须拥有一个名字,并且这个名字肯定与一个i节点相关。通常情况下,系统通过文件名就可以确定 i 节点,之后通过 i 节点中的指针就可以定位存储数据的数据块,如图 2 所示。

访问文件的过程
图 2 访问文件的过程

除了以上介绍的普通本地文件系统之外,还有相对于本机端的文件系统而言的分布式文件系统。分布式文件系统(Distributed File System,DFS),也称为网络文件系统,是一种允许文件透过网络在多台主机上分享的文件系统,可以让多机器上的多用户分享文件和存储空间。

注意,普通的文件系统只能在本地进行磁盘格式化并使用,解决了普通用户使用磁盘存储数据的问题;而分布式文件系统解决了资源共享的问题,它最大的特点是多个客户端可以访问相同的服务端。

Linux文件系统的标准

Linux 操作系统采用了 FHS(文件系统层次化标准)的文件组织形式,FHS 采用树状结构组织文件,定义了系统中每个区域的用途、所需要的最小构成的文件和目录。

FHS 定义了两层规范,分别如下:
  1. 第一层是“/”下面的各个目录应该要放什么文件数据。例如 /etc 应该要放置设置文件,/bin 与 /sbin 则应该要放置可执行文件等。
  2. 第二层则是针对 /usr 及 /var 这两个目录的子目录来定义。例如 /var/log 放置系统登录文件、/usr/share 放置共享数据等。

文件系统层次化标准将目录划分为4种交互作用的形态,如表 3 所示。

表 3 文件目录交互作用的形态
  可分享的(shareable) 不可分享的(unshareable)
不变的(static) /usr (软件存放) /etc (配置文件)
  /opt (第三方软件) /boot (开机与核心)
可变的(variable) /var/mail (使用者邮件信箱) /var/run (程序相关)
  /var/spool/news (新闻组) /var/lock (程序相关)

表 3 中提到的几种交互形态术语具体解释如下。
通过前面的学习,我们已经能够简单画出 Linux 文件系统的树状结构图,FHS 针对目录树的结构仅定义出 3 层目录下应该放置的数据,分别是下面 3 个目录:

1、/(根目录):与开机系统有关

根目录在 Linux 系统中属于最重要的一个目录,这是由于所有的目录都是由根目录衍生出来的,同时根目录也与开机、还原、系统修复等动作有关。在系统开机时,需要特定的开机软件、核心档案、开机所需程序、函式库等档案数据,如果系统出现错误,根目录中有能够修复文件系统的程序才能及时阻止错误的发生。

在 Linux 系统中,根目录与开机有必然联系,开机过程中只有根目录则会被挂载,其他分割槽则是在开机完成之后才会持续地进行挂载行为。因此,根目录下与开机过程有关的目录就不能够与根目录放在不同的分割槽中。

下面的 5 个目录则是与开机密不可分且不能与根目录分开的目录。

2、/usr(UNIX software resource):与软件安装执行有关

根据 FHS 的定义,/usr 里面存放的数据属于可分享的但不可变动的数据。类似于 Windows 系统的 C:\Windows 与 C:\Program Files 这两个目录的结合体。建议将数据合理的分别放置在这个目录下的次目录中,而不是自行建立该软件自己独立的目录。

3、/var(variable)目录:与系统运作过程有关。

/var 目录主要针对常态性变动的档案,包括快取(cache)、登录档(log file)以及某些软件运作所产生的档案,包括程序档案(lock file,run file),或者 MySQL 数据库的档案等。

注意,文件系统与树状结构之间的关系如下:
  1. 目录:新建一个目录时,ext 2 会分配一个 inode 和至少一块 block 给该目录。inode 记录目录权限和属性,以及分配的 block 号。block 记录目录下的文件名和文件名占用的 inode 号。
  2. 文件:新建一个文件时,ext 2 会分配一个 inode 和对应文件大小的 N 个 block 块给该文件。inode 和文件名会同时被记录在目录的 block 中,以便通过目录访问到该文件。block 存放文件内容。
  3. 文件查找:查找文件时,会先找到文件所在目录,目录的 inode 对应的 block 中,存放着文件的名称和 inode,找到文件名对应的 inode,然后找到文件 inode 对应的 block,找到文件内容。

优秀文章