1. 简介

由于 Linux 系统是开源的,存在众多不同的发行版,为了防止不同的 Linux 发行版的系统目录结构大相径庭,以至于用户从一个发行版迁移到别的发行版后不会使用,FHS(Filesystem Hierarchy Standard)标准诞生了。FHS 标准旨在让用户可以了解到系统上的库文件、已安装的软件文件通常的存放位置,即规范每个特定的目录下应该要放置什么数据。目前主流的 Linux 发行版基本都遵循 FHS 标准,因此它们的系统目录结构也大致相同。

  • 了解 Linux 文件目录结构的标准和每个目录的详细功能,对于用户用好 Linux 系统至关重要。

2. FHS 标准

以 Centos 7.x 为例,其文件系统架构如下图所示:

2.1 目录的形态

FHS 依据文件系统使用的频繁与否和是否允许使用者随意更改,将目录定义为四种交互作用的形态,具体举例如下表格所示:

可分享的(Shareable) 不可分享的(Unshareable)
不变的(Static) /usr(软件放置处)
/opt(第三方协力软件)
/etc(配置文件)
/boot(开机与核心档)
可变动的(Variable) /var/mail(使用者邮件信箱)
/var/spool/news(新闻群组)
/var/run(程序相关)
/var/lock(程序相关)
  • 可分享的:可以分享给其它系统挂载使用的目录,所以包括可执行文件与使用者的邮件等数据,是能够分享给网络上其它主机挂载使用的目录。
  • 不可分享的:自己机器上面运行的设备文件或者是与程序有关的 Socket 文件等,由于仅与自身机器有关,所以当然就不适合分享给其它主机了。
  • 不变的:有些数据是不会经常变动的,跟随着发行版而不变动。比如函式库、文件说明文档、系统管理员所管理的主机服务配置文件等等。
  • 可变的:经常改变的数据,比如登录文件、一般用户可自行收受的新闻群组等。

2.2 目录的架构

FHS 针对目录树架构仅定义出三层目录下面应该放置什么数据而已,分别是下面这三个目录的定义:

  • /(root,根目录):与开机系统有关。
  • /usr(unix software resource):与软件安装/执行有关。
  • /var(variable):与系统运行过程有关。

2.2.1 / 目录

根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的,同时根目录也与开机/还原/系统修复等动作有关。由于系统开机时需要特定的开机软件、核心文件、开机所需程序、函式库等等文件数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。

  1. 因为根目录是这么的重要,所以在 FHS 的要求方面,它希望根目录不要放在非常大的分区内, 因为越大的分区你会放入越多的数据,如此一来根目录所在分区就可能会有较多发生错误的机会。
  2. FHS 标准建议:根目录 / 所在分区应该越小越好, 且应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小越好。如此不但性能较佳,根目录所在的文件系统也较不容易发生问题。

有鉴于上述的说明,因此 FHS 定义出根目录 / 下面应该要有下面这些次目录的存在才好,即使没有实体目录,FHS 也希望至少有链接文件存在才好:

  • FHS 要求必须要存在的目录
目录 应放置文件内容
/bin 系统有很多放置可执行文件的目录,但 /bin 比较特殊。因为 /bin 放置的是在单人维护模式下还能够被操作的指令。在 /bin 下面的指令可以被 root 与一般帐号所使用,主要有:catchmodchowndatemvmkdircpbash 等等常用的指令。
/boot 这个目录主要在放置开机会使用到的文件,包括 Linux 核心文件以及开机菜单与开机所需配置文件等等。Linux Kernel 常用的文件名为:vmlinuz,如果使用的是 grub2 这个开机管理程序,则还会存在 /boot/grub2 这个目录。
/dev 在 Linux 系统上,任何设备与周边设备都是以文件的型态存在于这个目录当中的。你只要通过存取这个目录下面的某个文件,就等于存取某个设备。比较重要的文件有 /dev/null/dev/zero/dev/tty/dev/loop/dev/sd 等等。
/etc 系统主要的配置文件几乎都放置在这个目录内,例如人员的帐号密码档、各种服务的启始档等等。一般来说,这个目录下的各文件属性是可以让一般使用者查阅的,但是只有 root 有权力修改。FHS 建议不要放置可可执行文件在这个目录中。比较重要的文件有: /etc/modprobe.d//etc/passwd/etc/fstab/etc/issue 等等。另外 FHS 还规范几个重要的目录最好要存在 /etc 目录下:
/etc/opt(必要)——这个目录在放置第三方协力软件 /opt 的相关配置文件。
/etc/X11(建议)——与 X Window 有关的各种配置文件都在这里,尤其是 xorg.conf 这个 X Server 的配置文件。
/etc/sgml(建议)——与 SGML 格式有关的各项配置文件。
/etc/xml(建议)——与 XML 格式有关的各项配置文件。
/lib 系统的函式库非常的多,而 /lib 放置的则是在开机时会用到的函式库,以及在 /bin/sbin 下面的指令会调用的函式库而已。另外 FHS 还要求下面的目录必须要存在:
/lib/modules——这个目录主要放置可抽换式的核心相关模块(驱动程序)。
/media /media 下面放置的就是可移除的设备。包括软盘、光盘、DVD等等设备都暂时挂载于此。
/mnt 如果你想要暂时挂载某些额外的设备,一般建议你可以放置到这个目录中。在很早时候,这个目录的用途与 /media 相同。只是有了 /media 之后,这个目录就用来暂时挂载用了。
/opt 这个是给第三方协力软件放置的目录。另外,如果你想要自行安装额外的软件(非原本的发行版提供的),那么也能够将你的软件安装到这里来。不过,以前的 Linux 系统中,我们还是习惯放置在 /usr/local 目录下。
/run 早期的 FHS 规定系统开机后所产生的各项信息应该要放置到 /var/run 目录下,新版的 FHS 则规范到 /run 下面。由于 /run 可以使用内存来仿真,因此性能上会好很多。
/sbin Linux 有非常多指令是用来设置系统环境的,这些指令只有 root 才能够利用来「设置」系统,其他使用者最多只能用来「查询」而已。 放在 /sbin 下面的为开机过程中所需要的,里面包括了开机、修复、还原系统所需要的指令。常见的指令包括:fdiskfsckifconfigmkfs 等等。
至于某些服务器软件程序,一般则放置到 /usr/sbin 当中。
至于本机自行安装的软件所产生的系统可执行文件,则放置到 /usr/local/sbin 当中。
/srv 「srv」可以视为「service」的缩写,是一些网络服务启动之后,这些服务所需要取用的数据目录。常见的服务例如 WWWFTP 等等。举例来说,WWW 服务器需要的网页数据就可以放置在 /srv/www 里面。 不过,系统的服务数据如果尚未要提供给网际网络任何人浏览的话,默认还是建议放置到 /var/lib下面即可。
/tmp 这是让一般使用者或者是正在执行的程序暂时放置文件的地方。 这个目录是任何人都能够存取的,所以你需要定期的清理一下。当然,重要数据不可放置在此目录。因为 FHS 甚至建议在开机时,应该要将 /tmp 下的数据都删除。
/usr 第二层 FHS 设置,下文介绍。
/var 第二层 FHS 设置,下文介绍。
  • FHS 建议可以存在的目录
目录 应放置文件内容
/home 这是系统默认的使用者主文件夹。在你新增一个一般使用者帐号时,默认的使用者主文件夹都会规范到这里来。比较重要的是,主文件夹有两种代号:
~ ——代表目前这个使用者的主文件夹。
~xxx ——代表 xxx 用户的主文件夹。
/lib<qual> 用来存放与 /lib 不同的格式的二进制函式库,例如支持 32 位的 /lib32、64 位的 /lib64 函式库等。
/root 系统管理员 root 的主文件夹。之所以放在这里,是因为如果进入单人维护模式而仅挂载根目录时,该目录就能够拥有 root 的主文件夹,所以我们会希望 root 的主文件夹与根目录放置在同一个分区中。
  • 非 FHS 标准规定但同样重要的目录
目录 应放置文件内容
/lost+found 这个目录是使用标准的 Ext2/Ext3/Ext4 文件系统格式才会产生的一个目录,目的在于当文件系统发生错误时,将一些遗失的片段放置到这个目录下。如果使用的是 xfs 文件系统,就不会存在这个目录。
/proc 这个目录本身是一个「虚拟文件系统」。它放置的数据都是在内存当中,例如系统核心、进程信息、周边设备的状态及网络状态等等。因为这个目录下的数据都是在内存当中,所以本身不占任何硬盘空间。比较重要的文件有:/proc/cpuinfo/proc/dma/proc/interrupts/proc/ioports/proc/net/* 等等。
/sys 这个目录其实跟 /proc 非常类似,也是一个「虚拟文件系统」,主要也是记录核心与系统硬件信息较相关的信息。包括目前已载入的核心模块与核心侦测到的硬件设备信息等等。这个目录同样不占硬盘容量。

需要注意的是,因为根目录与开机有关,开机过程中仅有根目录会被挂载,其它分区则是在开机完成之后才会持续地进行挂载的行为。因此根目录下与开机过程有关的目录,就不能够与根目录放到不同的分区中。以下目录不可与根目录分开:

  • /etc:存放配置文件。
  • /bin:存放重要执行文件。
  • /dev:存放所需要的设备文件。
  • /lib:存放重要执行文件所需的函式库和核心相关模块。
  • /sbin:存放重要的系统执行文件。

2.2.2 /usr 目录

【注】很多读者都会误会 usr 为 user 的缩写,其实 usr 是 Unix Software Resource 的缩写,即「Unix 操作系统软件资源」所放置的目录,而不是使用者的数据目录。

早期 Linux 在设计的时候,若发生问题时,救援模式通常仅挂载根目录而已,因此有五个重要的目录被要求一定要与根目录放置在一起,那就是 /etc/bin/dev/lib/sbin 这五个重要目录。现在许多的 Linux 发行版由于已经将许多非必要的文件移出 /usr 之外了,所以
/usr 也是越来越精简。同时因为 /usr 被建议为「即使挂载成为只读,系统还是可以正常运行」的模样,所以救援模式也能同时挂载 /usr

CentOS 7.x 版本在救援模式时就挂载了 /usr 目录,而且 CentOS 7.x 已经将 /sbin/bin/lib 通通移动到 /usr 下面了,即 /sbin/bin/lib 都只是 /usr/sbin/usr/bin/usr/lib 的符号链接。因此那个五大目录的限制其实已经被打破了。

依据 FHS 的基本定义,/usr 里面放置的数据属于可分享的与不可变动的。所有系统默认的软件(发行版发布者提供的软件)都会放置到 /usr 下面,因此这个目录有点类似 Windows 系统的 C:\Windows(当中的一部份)和 C:\Program files 这两个目录的综合体。FHS 定义出目录 /usr 下面应该要有下面这些次目录的存在才好:

  • FHS 要求必须要存在的目录
目录 应放置文件内容
/usr/bin 所有一般用户能够使用的指令都放在这里。目前新的 CentOS 7 已经将全部的使用者指令放置于此,而使用链接文件的方式将 /bin 链接至此。另外,FHS 要求在此目录下不应该有子目录。
/usr/lib 基本上,与 /lib 功能相同,所以 /lib 就是链接到此目录中的。
/usr/local 系统管理员在本机自行安装自己下载的软件(非发行版默认提供者的),建议安装到此目录,这样会比较便于管理。该目录下也具有binetcincludelib 等次目录。
/usr/sbin 非系统正常运行所需要的系统指令。最常见的就是某些网络服务器软件的服务指令(daemon)。不过基本功能与 /sbin 也差不多,因此目前 /sbin 就是链接到此目录中的。
/usr/share 主要放置只读架构的数据文件,当然也包括共享文件。在这个目录下放置的数据几乎是不分硬件架构均可读取的数据,因为几乎都是文字文件。在此目录下常见的还有这些次目录:
/usr/share/man ——线上说明文档。
/usr/share/doc ——软件杂项的文件说明。
/usr/share/zoneinfo ——与时区有关的时区文件。
  • FHS 建议可以存在的目录
目录 应放置文件内容
/usr/games 与游戏比较相关的数据放置处。
/usr/include C/C++ 等程序语言的文件开头(header)与包含档(include)放置处,当我们以 tarball 方式(*.tar.gz 的方式安装软件)安装某些数据时,会使用到里头的许多包含档。
/usr/libexec 某些不被一般使用者惯用的可执行文件或脚本等等,都会放置在此目录中。例如大部分的 X 窗口下面的操作指令,很多都是放在此目录下的。
/usr/lib<qual> /lib<qual> 功能相同,因此目前 /lib<qual> 就是链接到此目录中。
/usr/src 一般源代码建议放置到这里,src 有 source 的意思。至于核心源代码则建议放置到 /usr/src/linux 目录下。

2.2.3 /var 目录

如果说 /usr 是安装时会占用较大硬盘容量的目录,那么 /var 就是在系统运行后才会渐渐占用硬盘容量的目录。因为 /var 目录主要针对常态性变动的文件,包括高速缓存(cache)、登录文件(log file)以及某些软件运行所产生的文件,包括程序文件(lock file、run file)等等。例如 MySQL 数据库的文件。FHS 定义出目录 /var 下面应该要有下面这些次目录的存在才好:

  • FHS 要求必须要存在的目录
目录 应放置文件内容
/var/cache 应用程序本身运行过程中会产生的一些暂存文件。
/var/lib 程序本身执行的过程中,需要使用到的数据文件放置的目录。在此目录下各自的软件应该要有各自的目录。举例来说,MySQL 的数据库放置到 /var/lib/mysql 中,而 rpm 的数据库则放到 /var/lib/rpm 中。
/var/lock 某些设备或者是文件资源一次只能被一个应用程序所使用,如果同时有两个程序使用该设备时,就可能产生一些错误的状况,因此就得要将该设备上锁(lock),以确保该设备只会给单一软件所使用。目前此目录也已经挪到 /run/lock 中。
/var/log 重要到不行。这是登录文件放置的目录,里面比较重要的文件如 /var/log/messages/var/log/wtmp(记录登录者的信息)等。
/var/mail 放置个人电子邮件信箱的目录,不过这个目录也被放置到 /var/spool/mail 目录中。
/var/run 某些程序或者是服务启动后,会将他们的 PID 放置在这个目录下。与 /run 相同,这个目录链接到 /run 去了。
/var/spool 这个目录通常放置一些伫列数据,所谓的「伫列」就是排队等待其他程序使用的数据,这些数据被使用后通常都会被删除。举例来说:
系统收到新邮件会放置到 /var/spool/mail 中,但使用者收下该邮件后该封邮件原则上就会被删除。
邮件如果暂时寄不出去会被放到 /var/spool/mqueue 中,等到被送出后就被删除。
如果是工作调度数据(crontab),就会被放置到 /var/spool/cron/ 目录。

附录

参考资料: