目录
我们都知道 Linux 有很多发行版,不过你有没有注意到,每个 Linux 发行版它们的配置文件、执行文件、每个目录内放置的东西,其实都差不多?为什么呢?原来这个是有一套标准依据的。
那么,接下来我们就重点探索一下 Linux 的目录配置依据:FHS(Filesystem Hierarchy Standard)
根据 FHS 的标准文件指出,它们的主要目的是希望让用户可以了解到已安装软件通常放置于哪个目录下,所以它们希望独立的软件开发商、操作系统制作者以及想要维护系统的用户,都能够遵循 FHS 的标准。也就是说,FHS 的重点在于规范每个特定的目录下应该要放置什么样子的数据而已。这样做好处非常多,因为 Linux 操作系统就能够在既有的面貌下发展出开发者想要的独特风格。
事实上,FHS 针对目录树架构仅定义出三层目录下面应该放置什么数据而已,分别是下面这三个目录的定义:
- / (root,根目录):与启动系统有关
- /usr (unix software resource):与软件安装/执行有关
- /var (variable):与系统运行过程有关
为什么要定义出这三层目录?其实是有意义的,每层目录下面应该要放置的目录也都有特定的规定。
1、根目录 (/) 的意义与内容
根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来,同时根目录也与启动、还原、系统修复等操作有关。因为根目录这么重要,所以在 FHS 的要求方面,它希望根目录不要放在非常大的分区内,因为越大的分区你会放入越多的数据,如此一来根目录所在分区就可能会有较多发生错误的机会。//建议根目录不要放在非常大的分区内
因此 FHS 标准建议,根目录 (/) 所在分区应该越小越好,且应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小越好。如此不但性能较佳,根目录所在的文件系统也较不容易发生问题。
FHS 定义出根目录 (/) 下面的子目录列表如下:
目录 | 应放置的文件内容 |
第一部分:FHS要求必须要存在的目录 | |
/bin | 【用户命令】:系统有很多存放执行文件的目录,但 /bin 比较特殊。因为 /bin 放置的是在单人维护模式下还能够被使用的命令。在 /bin 下面的命令可以被 root 与一般账号所使用,主要有:cat、chmod、chown、date、mv、mkdir、cp、bash 等常用的命令 |
/boot | 【系统启动时使用到的文件】:这个目录主要放置系统启动时使用到的文件,包括 Linux 内核文件以及启动选项与启动所需配置文件等。Linux 内核常用的文件名为:vmlinuz,如果使用的是 grub2 这个启动引导程序,则还会存在 /boot/grub2/ 这个目录 |
/dev | 【设备与接口设备文件】:在 Linux 系统上,任何设备与接口设备都是以文件的形式存在于这个目录当中。你只要通过读写这个目录下面的某个文件,就等于读写某个设备,比较重要的文件有:/dev/null、/dev/zero、/dev/ty、/dev/loop*、/dev/sd* 等 |
/etc | 【系统配置文件】:系统主要的配置文件几乎都放置在这个目录内,例如人员的账号密码文件、各种服务的启动文件等。一般来说,这个目录下的各文件属性是可以让一般用户查看的,但是只有 root 有权力修改。FHS 建议不要放置可执行文件 (binary) 在这个目录中。比较重要的文件有:/etc/modprobe.d/、/etc/passwd、/etc/fstab、/etc/issue 等。另外 FHS 还规范几个重要的目录最好要存在 /etc/ 目录下: /etc/opt/:这个目录在放置第三方辅助软件 /opt 的相关配置文件。(必要) /etc/X11/:与 X Window 有关的各种配置文件都在这里,尤其是 xorg.conf 这个 XServer 的配置文件。(建议) /etc/sgmI/:与 SGML 格式有关的各项配置文件。(建议) /etc/xmI/:与 XML 格式有关的各项配置文件。(建议) |
/lib | 【系统函数库】:系统的函数库非常多,而 /lib 放置的则是在启动时会用到的函数库,以及在 /bin 或 /sbin 下面的命令会调用的函数库而已。什么是函数库?你可以将它想成是外挂,某些命令必须要有这些外挂才能够顺利完成程序的执行之意,另外 FSH 还要求下面的目录必须要存在: /lib/modules/:这个目录主要放置可抽换式的内核相关模块(驱动程序) |
/media | 【可删除的设备】:media 是媒体的英文,顾名思义,这个 /media 下面放置的就是可删除的设备,包括软盘、光盘、DVD 等设备都暂时挂载于此。常见的文件名有:/media/floppy、/media/cdrom 等 |
/mnt | 【暂时挂载的设备】:如果你想要暂时挂载某些额外的设备,一般建议你可以放置到这个目录中。在早些时候,这个目录的用途与 /media 相同。只是有了 /media 之后,这个目录就暂时用来挂载。 |
/opt | 【软件安装目录】:这个是给第三方辅助软件放置的目录。什么是第三方辅助软件?举例来说,KDE 这个桌面管理系统是一个独立的软件,不过它可以安装到 Linux 系统中,因此 KDE 的软件就建议放置到此目录下。另外,如果你想要自行安装额外的软件(非原本的发行版提供),那么也能够将你的软件安装到这里来。不过,以前的 Linux 系统中,我们还是习惯放置在 /usr/local 目录下 |
/run | 【系统运行信息】:早期的 FHS 规定系统启动后所产生的各项信息应该要放置到 /var/run 目录下,新版的 FHS 则规范到 /run 下面,由于 /run 可以使用内存来模拟,因此性能上会好很多。 |
/sbin | 【系统命令】:Linux 有非常多命令是用来设置系统环境的,这些命令只有 root 才能够用来设置系统,其他用户最多只能用来查询而已。放在 /sbin 下面的为启动过程中所需要的,里面包括了启动、修复、还原系统所需要的命令。至于某些服务器软件程序,一般则放置到 /usr/sbin/ 当中。至于本机自行安装的软件所产生的系统执行文件(system binary),则放置到 /usr/local/sbin/ 当中了。常见的命令包括:fdisk、fsck、ifconfig、mkfs 等 |
/srv | 【服务数据】:srv 可以视为 service 的缩写,是一些网络服务启动之后,这些服务所需要使用的数据目录,常见的服务例如 WWW、FTP 等。举例来说,WWW 服务器需要的网页数据就可以放置在 /srv/www/ 里面。不过系统的服务数据如果尚未要提供给任何人浏览的话,默认还是建议放置到 /var/lib 下面即可 |
/tmp | 【临时数据】:这是让一般用户或是正在执行的程序暂时放置文件的地方。这个目录是任何人都能够存取的,所以你需要定期地清理一下。当然,重要数据不可放置在此目录。因为 FHS 甚至建议在启动时,应该要将 /tmp 下的数据都删除。 |
/usr | 第二层 FHS 设置 |
/var | 第二层 FHS 设置,主要放置变动性数据 |
第二部分:FHS建议可以存在的目录 | |
/home | 【用户家目录】:这是系统默认的用户家目录(home directory)。在你新增一个一般用户账号时,默认的用户家目录都会规范到这里来,比较重要的是家目录有两种代号: ~:代表目前这个用户的家目录 ~swadian:则代表 swadian 用户的家目录 |
/lib<qual> | 【二进制函数库】:用来存放与 /lib 不同的格式的二进制函数库,例如支持 64 位的 /lib64 函数库等 |
/root | 【root用户的家目录】:系统管理员(root)的家目录,之所以放在这里,是因为如果进入单人维护模式而仅挂载根目录时,该目录就能够拥有 root 的家目录,所以我们会希望 root 的家目录与根目录放置在同一个分区中 |
事实上 FHS 针对根目录所定义的标准就仅有上面的东西,不过我们的 Linux 下面还有许多目录。下面是几个在 Linux 当中也非常重要的目录:
目录 | 应放置的文件内容 |
/lost+found | 【遗失文件信息】:这个目录是使用标准的 ext2、ext3、ext4 文件系统格式才会产生的一个目录,目的在于当文件系统发生错误时,将一些遗失的片段放置到这个目录下,不过如果使用的是 xfs 文件系统的话,就不会存在这个目录 |
/proc | 【内核与系统硬件状态信息】:这个目录本身是一个虚拟文件系统(virtual filesystem),它放置的数据都是在内存当中,例如系统内核、进程信息(process)、外接设备的状态及网络状态等。因为这个目录下的数据都是在内存当中,所以本身不占任何硬盘空间。比较重要的文件例如:/proc/cpuinfo、/proc/dma、/proc/interrupts、/proc/ioports、/proc/net/* 等 |
/sys | 【内核与系统硬件状态信息】:这个目录其实跟 /proc 非常类似,也是一个虚拟的文件系统,主要也是记录内核与系统硬件信息相关的内容。包括目前已加载的内核模块与内核检测到的硬件设备信息等,这个目录同样不占硬盘容量 |
早期 Linux 在设计的时候,若发生问题时,恢复模式通常仅挂载根目录而已,因此有五个重要的目录被要求一定要与根目录放置在一起,那就是 /etc、/bin、/dev、/lib、/sbin 这五个重要目录。现在许多的 Linux 发行版由于已经将许多非必要的文件移出了 /usr 之外,所以 /usr 也是越来越精简,同时因为 /usr 被建议为 “即使挂载成为只读,系统还是可以正常运行” 的模样,所以恢复模式也能同时挂载 /usr。例如 CentOS 7.x 版本在恢复模式的情况下就是这样,因此那个五大目录的限制已经被打破了。例如 CentOS 7.x 就已经将 /sbin、/bin、/lib 通通移动到了 /usr 下面。
以下是 CentOS 7.9 中的根 (\) 目录:
2、/usr 的意义与内容
依据 FHS 的基本定义,/usr 里面放置的数据属于可分享与不可变动 (shareable,static) 的数据,如果你知道如何通过网络进行分区的挂载,那么 /usr 确实可以分享给局域网络内的其他主机来使用。
请注意,/usr 并不是 user 的缩写,而是 UNIX Software Resource 的缩写,也就是 UNIX 操作系统软件资源所放置的目录,而不是用户的数据。FHS 建议所有软件开发者,应该将他们的数据合理地分别放置到这个目录下的子目录,而不要自行建立该软件自己独立的目录。
因为所有系统默认的软件都会放置到 /usr 下面,因此这个目录有点类似 Windows 系统 “C:Windows\(当中的一部分) + C:\Program Files\” 这两个目录的综合体,系统刚安装完毕时,这个目录会占用最多的硬盘容量。一般来说,/usr 的子目录建议有下面这些:
目录 | 应放置的文件内容 |
第一部分:FHS要求必须要存在的目录 | |
/usr/bin/ | 【用户命令】:所有一般用户能够使用的命令都放在这里。目前新的 CentOS 7 已经将全部的用户命令放置于此,而使用链接文件的方式将 /bin 链接至此。也就是说,/usr/bin 与 /bin 是一模一样的。另外,FHS 要求在此目录下不应该有子目录 |
/usr/lib/ | 【函数库】:基本上,与 /lib 功能相同,所以 /lib 就是链接到此目录中的 |
/usr/local/ | 【软件安装目录】:系统管理员在本机安装自己下载的软件,建议安装到此目录,这样会比较便于管理。举例来说,你的发行版提供的软件较旧,你想安装较新的软件但又不想删除旧版,此时你可以将新版软件安装于 /usr/local/ 目录下,可与原先的旧版软件有分别。你可以自行到 /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++ 等程序语言头文件与包含文件】:c/c++ 等程序语言的头文件 (header) 与包含文件 (include) 放置处,当我们以 Tarball 方式 (*.tar.gz 的方式安装软件) 安装某些程序时,会使用到里面的许多文件 |
/usr/libexec/ | 【特殊文件或脚本】:某些不被一般用户常用的执行文件或脚本(script)等,都会放置在此目录中。例如大部分的 X 窗口下面的操作命令,很多都是放在此目录下 |
/usr/lib<qual>/ | 【二进制函数库】:与 /lib<qual>/ 功能相同,因此目前 /lib<qual> 就是链接到此目录中 |
/usr/src/ | 【源代码】:一般源代码建议放置到这里,src 有 source 的意思。至于内核源代码则建议放置到 /usr/src/Linux 目录 |
以下是 CentOS 7.9 中的 /usr 目录:
3、/var 的意义与内容
如果说 /usr 是安装时会占用较大硬盘容量的目录,那么 /var 就是在系统运行后才会渐渐占用硬盘容量的目录。因为 /var 目录主要针对经常性变动的文件,包括缓存(cache)、日志文件(log file)以及某些软件运行所产生的文件,包括程序文件(lock file、run file),或例如 MySQL 数据库的文件等。/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 信息】:某些程序或是服务启动后,会将它们的 PID 放置在这个目录下,与 /run 相同,这个目录链接到 /run 目录 |
/var/spool | 【队列数据】:这个目录通常放置一些队列数据,所谓的队列就是排队等待其他程序使用的数据,这些数据被使用后通常都会被删除。举例来说,系统收到新邮件会放置到 /var/spool/mail/ 中,但用户收下该邮件后该封信原则上就会被删除,邮件如果暂时寄不出去会被放到 /var/spool/mqueue/ 中,等到被送出后就被删除。如果是计划任务数据(crontab),就会被放置到 /var/spool/cron/ 目录中 |
以下是 CentOS 7.9 中的 /var 目录:
由于 FHS 仅是定义出最上层(/)及次层(/usr 与 /var)的目录内容应该要放置的文件或目录数据,因此,在其他子目录层级内,就可以随开发者自行来配置。举例来说,CentOS 的网络设置数据放在 /etc/sysconfig/network-scripts/ 目录下,但是 SUSE 则是将网络放置在 /etc/sysconfig/network/ 目录下,目录名称是不同的。不过只要记住大致的 FHS 标准,差异性其实有限。
最后,如果你对 FHS 的官方文档有兴趣,可以点击这里查阅官方文档。(2015年的标准文件)
至此,全文结束。