文件系统(File System)是磁盘上特定格式的一片区域,操作系统利用文件系统保存和管理文件。

认识文件系统

用户在硬件存储设备中执行的文件建立、写人、读取、修改、转存与控制等操作都是依靠文件系统来完成的。文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。Linux 系统支持数十种的文件系统,而最常见的文件系统如下所示。

(1)Ext3:是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能百分之百地保证资料不会丢失。它会把整个磁盘的每个写入动作的细节都预先记录下来,以便在发生异常宕机后能回溯追踪到被中断的部分,然后尝试进行修复。

(2)Ext4:Ext3 的改进版本,作为RHEL6系统中的默认文件管理系统,它支持的存储容量高达 1EB(1EB=1 073 741 824GB),且能够有无限多的子目录。另外,Ext4 文件系统能够批量分配 block 块,从而极大地提高了读写效率。 (3)XFS:是一种高性能的日志文件系统,而且是 RHEL7中å默认的文件管理系统。它的优势在发生意外宕机后显得尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。它最大可支持的存储容量为 18EB,这几乎满足了所有需求。

日常在硬盘中需要保存的数据实在太多了,因此 Linux 系统中有一个名为 super block 的“硬盘地图”。Linux 并不是把文件内容直接写人到这个“硬盘地图”里面,而是在里面记录着整个文件系统的信息。因为,如果把所有的文件内容都写人到这里面,它的体积将变得非常大,而且文件内容的查询与写入速度也会变得很慢。Linux 只是把每个文件的权限与属性记录在inode 中,而且每个文件占用一个独立的inode 表格。该表格的大小默认为 128 字节,里面记录着如下信息。

  • 该文件的访问权限(read、write、execute)
  • 该文件的所有者与所属组(owner、group)
  • 该文件的大小(size)
  • 该文件的创建或内容修改时间(ctime)
  • 该文件的最后一次访问时间(atime)
  • 该文件的修改时间(mtime)
  • 文件的特殊权限(SUID、SGID、SBIT)
  • 该文件的真实数据地址(point)

而文件的实际内容则保存在 block块中(大小可以是 1KB、2KB或 4KB),一个 inode 的默认大小仅为 128B(Ext3 ),记录一个 block 则消耗 4B。当文件的 inode 被写满后,Linux 系统会自动分配出一个 block 块,专门用于像 inode 那样记录其他 block 块的信息,这样把各个block 块的内容串到一起,就能够让用户读到完整的文件内容了。对于存储文件内容的 block块,有下面两种常见情况(以 4KB 的 block 大小为例进行说明)。

  • 情况 1:文件很小(1KB),但依然会占用一个 block,因此会潜在地浪费 3KB.
  • 情况 2:文件很大(5KB),那么会占用两个 block(5KB-4KB 后剩下的 1KB 也要占用一个 block )。

计算机系统在发展过程中产生了众多的文件系统,为了使用户在读取或写人文件时不用关心底层的硬盘结构,Linux 内核中的软件层为用户程序提供了一个 VFS( Virtual File System虚拟文件系统)接口,这样用户实际上在操作文件时就是统一对这个虚拟文件系统进行操作了。下图所示为 VFS 的架构示意图。从中可见,实际文件系统在 VFS 下隐藏了自己的特性和细节,这样用户在日常使用时会觉得“文件系统都是一样的”,也就可以随意使用各种命令在任何文件系统中进行各种操作了(如使用 cp命令来复制文件)。

理解Linux文件系统目录结构

在 Linux 系统中,目录、字符设备、块设备、套接字、打印机等都被抽象成了文件:Linux系统中一切都是文件。既然平时我们打交道的都是文件,那么又应该如何找到它们呢?在Windows 操作系统中,想要找到一个文件,我们要依次进入该文件所在的磁盘分区(假设这里是 D盘),然后在进入该分区下的具体日录,最终找到这个文件。但是在 Linux 系统中并不存在 C/D/E/F 等盘符,Linux 系统中的一切文件都是从“根(/)”目录开始的,并按照文件系统层次化标准(Filesystem Aierarchy Standard,FHS)采用树形结构来存放文件,以及定义了常见目录的用途。另外,Linux 系统中的文件和目录名称是严格区分大小写的。例如,root、rOOt、Root、rooT 均代表不同的目录,并且文件名称中不得包含斜杠(/)。Linux 系统中的文件存储结构如图所示。

在Linux系统中,最常见的目录以及所对应的存放内容如下表

目录名称 应放置文件的内容
/ Linux文件的最上层根目录
/boot 开机所需文件——内核、开机菜单以及所需配置文件等
/dev 以文件形式存放任何设备与接口
/etc 配置文件
/home 用户家目录
/bin Binary的缩写,存放用户的可运行程序,如ls、cp等,也包含其他shell,如bash和cs等
/lib 开机时用到的函数库,以及/bin与/sbin下面的命令要调用的函数
/sbin 开机过程中需要的命令
/media 用于挂载设备文件的目录
/opt 放置第三方如软件
/root 超级管理员的家目录
/srv 一些网络服务的数据文件目录
/tmp 任何人均可使用的“共享”临时目录
/proc 虚拟文件系统,保存了系统内核、进程、外部设备及网络状态等信息的文件
/usr/local 用于存放用户自行安装的软件
/usr/sbin Linux系统中需要超管权限才能执行的命令存放在这里
/usr/share 帮助与说明文件,也可放置共享文件
/var 主要存放经常变化的文件,如日志
/lost+found 当文件系统发生错误时,将一些丢失的文件片段存放在这里

绝对路径与相对路径

绝对路径和相对路径的概念。

  • 绝对路径:从根目录 / 开始写起的文件名或目录名称,如/home/zhangsan/subdir。
  • 相对路径:相对于当前路径的文件名写法,如./home/zhangsan/subdir或者../../home/zhangsan/subdir

技巧:开头不是/的就属于相对路径的写法

相对路径是以当前所在路径的相对位置来表示的。举例说明:你目前在/home这个目录下,如果想要进入/var/log这个目录时,可以有下面两种方法:

  • cd /var/log:绝对路径
  • cd ../var/log:相对路径

因为是在/home下,所以回到上一层../之后,才能进入/var/log目录。特别注意两个特殊的目录。

  • .:代表当前的目录,也可以使用./来表示。
  • ..:代表上一层目录,也可以用../来表示。

此处的.和..是很重要且常用的,例如:常常可以看到cd ..或者./command这一类的命令表达方式,就是代表上一层与目前所在目录的工作状态。