【Linux进阶】Linux目录配置,FHS

在了解了每个文件的相关种类与属性,以及了解了如何修改文件属性与权限的相关信息后,再来要了解的就是,为什么每个Linux发行版它们的配置文件、执行文件、每个目录内放置的东西,其实都差不多?原来是有一套标准依据,我们下面就来看一看。

1. Linux目录配置的依据------FHS

因为利用Linux来开发产品或发行版的社区、公司及个人实在太多了,如果每个人都用自己的想法来配置文件放置的目录,那么将可能造成很多管理上的困扰。你能想象,你进入一个企业之后,所接触到的Linux目录配置方法竟然跟你以前学的完全不同吗? 很难想象吧!所以,后来就有所谓的Filesystem Hierarchy Standard (FHS)标准的出炉。

根据FHS的标准文件指出,它们的主要目的是希望让用户可以了解到已安装软件通常放置于哪个目录下,所以它们希望独立的软件开发商、操作系统制作者以及想要维护系统的用户,都能够遵循FHS 的标准。

也就是说,FHS的重点在于规范每个特定的目录下应该要放置什么样子的数据而已。这样做好处非常多,因为Linux 操作系统就能够在既有的面貌下(目录架构不变)发展出开发者想要的独特风格。

事实上,FHS是根据过去的经验一直在持续地改版,FHS依据文件系统使用的频繁与否与是否允许用户随意修改,而将目录定义成为四种交互作用的形态,用表格来说有点像下面这样:

|---------------|----------------------|-------------------|
| | 可分享(shareable) | 不可分享(unshareable) |
| 不变(static) | /usr(软件存放处) | /etc(配置文件) |
| | /opt(第三方辅助软件) | /boot(启动与内核文件) |
| 可变动(variable) | /var/mail(用户邮箱) | /var/run(程序相关) |
| | /var/spool/news(新闻组) | /ar/lock(程序相关) |

上表中的目录就是一些代表性的目录,该目录下面所放置的数据在下面会谈到,这里先略过不谈。我们要了解的是,那四个类型是什么?

  • **可分享:**可以分享给其他系统挂载使用的目录,所以包括执行文件与用户的邮件等数据,是
  • 能够分享给网络上其他主机挂载用的目录;
  • **不可分享:**自己机器上面运行的设备文件或是与程序有关的socket文件等,由于仅与自身
  • 机器有关,所以当然就不适合分享给其他主机;
  • **不变:**有些数据是不会经常变动的,跟随着发行版而不变动。例如函数库、文件说明、系统
  • 管理员所管理的主机服务配置文件等;
  • **可变动:**经常修改的数据,例如日志文件、一般用户可自行接收的新闻组等。

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

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

为什么要定义出这三层目录?

其实是有意义的,每层目录下面应该要放置的目录也都有特定的规定。由于我们尚未介绍完整的Linux系统,所以下面的介绍你可能会看不懂。没关系,先有个概念即可。

这个root在Linux里面的意义很多很多,多到让人搞不懂那是啥玩意儿。

  • 如果以账号的角度来看,所谓的root指的是系统管理员的身份,
  • 如果以目录的角度来看,所谓的root意即指的是根目录,就是/,要特别留意。

2.根目录(/)的意义与内容

根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来,同时根目录也与启动、还原、系统修复等操作有关。

由于系统启动时需要特定的启动软件、内核文件、启动所需程序、函数库等文件数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行,因为根目录这么重要,所以在FHS的要求方面,它希望根目录不要放在非常大的分区内,因为越大的分区你会放入越多的数据,如此一来根目录所在分区就可能会有较多发生错误的机会。

因此FHS 标准建议:根目录(1)所在分区应该越小越好,且**应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小越好。**如此不但性能较佳,根目录所在的文件系统也较不容易发生问题。

有鉴于上述的说明,因此FHS 定义出根目录(/)下面应该要有下面这些子目录的存在才好,即使没有物理目录,FHS也希望至少有链接(link)目录存在才好。

|--------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 目录 | 应放置文件内容 |
| /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/tty、/dev/loop*、/devlsd*等 |
| /etc | 系统主要的配置文件几乎都放置在这个目录内,例如人员的账号密码文件、各种服务的启动文件等。 一般来说,这个目录下的各文件属性是可以让一般用户查看的,但是只有root有权力修改。 FHS建议不要放置可执行文件(binary)在这个目录中。 比较重要的文件有:/etc/modprobe.d/、/etc/passwd、/etc/fstab、letc/issue等。另外FHS 还规范几个重要的目录最好要存在/etc/目录下: * letclopt(必要):这个目录在放置第三方辅助软件/opt的相关配置文件; * /etc/X11/(建议):与XWindow 有关的各种配置文件都在这里,尤其是xorg.conf这个X Server的配置文件; * /etc/sgml/(建议):与SGML格式有关的各项配置文件; * /etc/xm/(建议):与XML格式有关的各项配置文件 |
| /lib | 系统的函数库非常多,而/lib放置的则是在启动时会用到的函数库,以及在/bin或/sbin 下面的命令会调用的函数库而已。 什么是函数库? 你可以将它想成是外挂,某些命令必须要有这些外挂才能够顺利完成程序的执行之意,另外FSH 还要求下面的目录必须要存在: * /ib/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 下面的为启动过程中所需要的,里面包括了启动、修复、还原系统所需要的命令。 至于某些服务器软件程序,一般则放置到lusr/sbin/当中。至于本机自行安装的软件所产生的系统执行文件system binary),则放置到usr/local/sbin/当中了。 常见的命令包括:fdisk、fsck、ifconfig、mkfs等 |
| /srv | srv可以视为service的缩写,是一些网络服务启动之后,这些服务所需要使用的数据目录,常见的服务例如WWW、FTP等。 举例来说,WWW服务器需要的网页数据就可以放置在/svIww/里面。不过,系统的服务数据如果尚未要提供给因特网任何人浏览的话,默认还是建议放置到NvarNib下面即可 |
| /tmp | 这是让一般用户或是正在执行的程序暂时放置文件的地方。这个目录是任何人都能够存取的,所以你需要定期地清理一下。当然,重要数据不可放置在此目录。因为FHS 甚至建议在启动时,应该要将/tmp下的数据都删除 |
| /usr | 第二层FHS设置,后续介绍 |
| /var | 第二层FHS设置,主要为放置变动性的数据,后续介绍 |
[第一部分:FHS 要求/下必须要存在的目录]

|--------------|------------------------------------------------------------------------------------------------------------------------------|
| /home | **这是系统默认的用户家目录(home directory )。**在你新增一个一般用户账号时,默认的用户家目录都会规范到这里来,比较重要的是家目录有两种代号: * ~:代表目前这个用户的家目录; * ~dmtsai:则代表dmtsai的家目录 |
| /lib<qual> | 用来存放与 /lib不同的格式的二进制函数库,例如支持64位的 /lib64函数库等 |
| /root | 系统管理员(root)的家目录,之所以放在这里,是因为如果进入单人维护模式而仅挂载根目录时,该目录就能够拥有root的家目录,所以我们会希望root的家目录与根目录放置在同一个分区中 |
[第二部分:FSH建议/可以存在的目录]

看看我的根目录,跟上面对一对吧

事实上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。

例如我们的这个CentOS7.x版本在恢复模式的情况下就是这样,因此那个五大目录的限制经被打破了。例如CentOS7.x就已经将/sbin、/bin、/ib通通移动到了/usr下面。

3./usr 的意义与内容

依据FHS的基本定义,/usr 里面放置的数据属于可分享与不可变动(shareable,static),如果你知道如何通过网络进行分区的挂载(例如在服务器篇会谈到的NFS服务器),那么/usr确实可以分享给局域网络内的其他主机来使用。

很多读者都会误以为/usr为user的缩写,其实usr是UNIX Software Resource的缩写,也就是UNy操作系统软件资源所放置的目录,而不是用户的数据,这点要注意。

FHS建议所有软件开发者,应该将他们的数据合理地分别放置到这个目录下的子目录,而不要自行建立该软件自己独立的目录。

因为是所有系统默认的软件(发行版发布者提供的软件)都会放置到/usr下面,因此这个目录有点类似Windows系统"C:\Windowsl(当中的一部分)+C:\Program Files\"这两个目录的综合体,系统刚安装完毕时,这个目录会占用最多的硬盘容量。

一般来说,/usr的子目录建议有下面这些。

|-------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| /usr/bin | 所有一般用户能够使用的命令都放在这里。目前新的CentOS7已经将全部的用户命令放置于此,而使用链接文件的方式将/bin 链接至此。也就是说,/ust/bin与/bin 是一模一样的。另外,FHS要求在此目录下不应该有子目录 |
| /usr/lib/ | 基本上,与Nlib功能相同,所以/lib就是链接到此目录中的 |
| /usr/local/ | 系统管理员在本机安装自己下载的软件(非发行版默认提供者),建议安装到此目录,这样会比较便于管理。举例来说,你的发行版提供的软件较旧,你想安装较新的软件但又不想删除旧版,此时你可以将新版软件安装于/usr/local/目录下,可与原先的旧版软件有分别。你可以自行到/usr/local去看看,该目录下也是具有bin、etc、sinclude、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/ | **某些不被一般用户常用的执行文件或脚本(script)等,都会放置在此目录中。**例如大部分的X窗口下面的操作命令,很多都是放在此目录下 |
| /usr/lib<qual>/ | 与 /lib<qual>/功能相同,因此目前 /lib<qual>就是链接到此目录中 |
| /usr/src/ | 一般源代码建议放置到这里,src有source的意思。至于内核源代码则建议放置到/usr/src/Linux/ 目录下 |
[FHS建议可以存在的目录]

我的系统下面的/usr是这样子的

4./var的意义与内容

如果说/usr是安装时会占用较大硬盘容量的目录,那么/var就是在系统运行后才会渐渐占用硬盘容量的目录。

因为/var目录主要针对经常性变动的文件,包括缓存(cache)、日志文件(logfile)以及某些软件运行所产生的文件,包括程序文件(lock file、run file),或例如MySQL数据库的文件等。

常见的子目录有。

|-------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| /var/cache/ | 应用程序本身运行过程中会产生的一些缓存 |
| /var/lib/ | 程序本身执行的过程中,需要使用到的数据文件放置的目录。在此目录下各自的软件应该要有各自的目录。举例来说,MySQL的数据库放置到/arlib/mysql而 rpm的数据库则放到/ar/ib/rpm中 |
| /var/lock | 某些设备或是文件资源一次只能被一个应用程序所使用,如果同时有两个程序使用该设备时,就可能产生一些错误的状况,因此就得要将该设备上锁(lock),以确保该设备只会给单一软件所使用。 举例来说,刻录机正在刻录一张光盘,你想一下会不会有两个人同时在使用一个刻录机刻盘?如果两个人同时刻录,那光盘写入的是谁的数据?所以当第一个人在刻录时刻录机就会被上锁,第二个人就得要该设备被解除锁定(就是前一个人用完了)才能够继续使用,目前此目录也已经挪到/run/lock中 |
| /var/log/ | 重要到不行。这是日志文件放置的目录,里面比较重要的文件有/var/log/messages、/var/log/wtmp (记录登录信息)等 |
| /var/mail/ | 放置个人电子邮箱的目录,不过这个目录也被放置到/var/spool/mai/目录中,通常这两个目录是互 为链接文件 |
| /var/run/ | 某些程序或是服务启动后,会将它们的PID放置在这个目录下,至于PID的意义我们会在后续章节 提到,与/run相同,这个目录链接到/run目录 |
| /var/spool/ | 这个目录通常放置一些队列数据,所谓的队列就是排队等待其他程序使用的数据,这些数据被使用后通常都会被删除。举例来说,系统收到新邮件会放置到/var/spool/mail/中,但用户收下该邮件后该封信原则上就会被删除,邮件如果暂时寄不出去会被放到/var/spool/mqueue/中,等到被送出后就被删除。如果是计划任务数据(crontab),就会被放置到/var/spool/cron/目录中 |
[FHS 要求必须要存在的目录]

我的var目录

如果你还想了解更多,建议在你可以挑战FHS官方英文文档(参考本章参考资料),相信会让你对于Linux操作系统的目录有更深入的了解。

5.针对FHS,各家发行版的异同,与CentOS7的变化

由于FHS仅是定义出最上层(/)及次层(/usr与Nar)的目录内容应该要放置的文件或目录数据,因此,在其他子目录层级内,就可以随开发者自行来配置。举例来说,CentOS 的网络设置数据放在/etc/sysconfig/network-scripts/ 目录下,但是 SUSE 则是将网络放置在 /etc/sysconfig/network/目录下,目录名称是不同的。不过只要记住大致的FHS标准,差异性其实有限。

此外,CentOS7在目录的排列上与过去的版本不同。本节稍早之前已经介绍过,这里做个汇总。比较大的差异在于将许多原本应该要在根目录(/)里面的目录,将它内部数据全部移到/usr里面去,然后进行链接(link.)设置。包括下面这些:

  • /bin --> /usr/bin
  • /sbin --> /usr/sbin
  • /lib --> /usr/lib
  • /lib64 --> /usr/lib64
  • /var/lock --> /run/lock
  • /var/run --> /run
相关推荐
运维老司机11 分钟前
Jenkins修改LOGO
运维·自动化·jenkins
D-海漠27 分钟前
基础自动化系统的特点
运维·自动化
我言秋日胜春朝★36 分钟前
【Linux】进程地址空间
linux·运维·服务器
繁依Fanyi1 小时前
简易安卓句分器实现
java·服务器·开发语言·算法·eclipse
C-cat.1 小时前
Linux|环境变量
linux·运维·服务器
yunfanleo1 小时前
docker run m3e 配置网络,自动重启,GPU等 配置渠道要点
linux·运维·docker
m51271 小时前
LinuxC语言
java·服务器·前端
运维-大白同学2 小时前
将django+vue项目发布部署到服务器
服务器·vue.js·django
糖豆豆今天也要努力鸭2 小时前
torch.__version__的torch版本和conda list的torch版本不一致
linux·pytorch·python·深度学习·conda·torch
烦躁的大鼻嘎2 小时前
【Linux】深入理解GCC/G++编译流程及库文件管理
linux·运维·服务器