Linux目录结构
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 /
目录
根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的,同时根目录也与开机/还原/系统修复等动作有关。由于系统开机时需要特定的开机软件、核心文件、开机所需程序、函式库等等文件数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。
- 因为根目录是这么的重要,所以在 FHS 的要求方面,它希望根目录不要放在非常大的分区内, 因为越大的分区你会放入越多的数据,如此一来根目录所在分区就可能会有较多发生错误的机会。
- FHS 标准建议:根目录
/
所在分区应该越小越好, 且应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小越好。如此不但性能较佳,根目录所在的文件系统也较不容易发生问题。
有鉴于上述的说明,因此 FHS 定义出根目录 /
下面应该要有下面这些次目录的存在才好,即使没有实体目录,FHS 也希望至少有链接文件存在才好:
- FHS 要求必须要存在的目录
目录 | 应放置文件内容 |
---|---|
/bin |
系统有很多放置可执行文件的目录,但 /bin 比较特殊。因为 /bin 放置的是在单人维护模式下还能够被操作的指令。在 /bin 下面的指令可以被 root 与一般帐号所使用,主要有:cat 、chmod 、chown 、date 、mv 、mkdir 、cp 、bash 等等常用的指令。 |
/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 下面的为开机过程中所需要的,里面包括了开机、修复、还原系统所需要的指令。常见的指令包括:fdisk 、fsck 、ifconfig 、mkfs 等等。至于某些服务器软件程序,一般则放置到 /usr/sbin 当中。至于本机自行安装的软件所产生的系统可执行文件,则放置到 /usr/local/sbin 当中。 |
/srv |
「srv」可以视为「service」的缩写,是一些网络服务启动之后,这些服务所需要取用的数据目录。常见的服务例如 WWW 、FTP 等等。举例来说,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 |
系统管理员在本机自行安装自己下载的软件(非发行版默认提供者的),建议安装到此目录,这样会比较便于管理。该目录下也具有bin 、etc 、include 、lib 等次目录。 |
/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/ 目录。 |
附录
参考资料:
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!