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

    根据FHS的标准文件指出,他们的主要目的是希望让使用者可以了解到已安装软件通常放置于那个目录下, 所以他们希望独立的软件开发商、操作系统制作者、以及想要维护系统的使用者,都能够遵循FHS的标准。 也就是说,FHS的重点在于规范每个特定的目录下应该要放置什么样子的数据而已。 这样做好处非常多,因为Linux操作系统就能够在既有的面貌下(目录架构不变)发展出开发者想要的独特风格。

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

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

    • 可分享的:可以分享给其他系统挂载使用的目录,所以包括可执行文件与使用者的邮件等数据, 是能够分享给网络上其他主机挂载用的目录;

    • 不可分享的:自己机器上面运行的设备文件或者是与程序有关的socket文件等, 由于仅与自身机器有关,所以当然就不适合分享给其他主机了。

    • 不变的:有些数据是不会经常变动的,跟随着distribution而不变动。 例如函数库、文件说明文档、系统管理员所管理的主机服务配置文件等等;

    • 可变动的:经常改变的数据,例如登录文件、一般用户可自行收受的新闻群组等。

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

    • / (root, 根目录):与开机系统有关;
    • /usr (unix software resource):与软件安装/执行有关;
    • /var (variable):与系统运行过程有关。
      为什么要定义出这三层目录呢?其实是有意义的喔!每层目录下面所应该要放置的目录也都又特定的规定喔! 由于我们尚未介绍完整的Linux系统,所以下面的介绍你可能会看不懂!没关系,先有个概念即可, 等到你将基础篇全部看完后,就重头将基础篇再看一遍!到时候你就会豁然开朗啦!^_^

    Tips 这个 root 在 Linux 里面的意义真的很多很多~多到让人搞不懂那是啥玩意儿。 如果以“帐号”的角度来看,所谓的 root 指的是“系统管理员!”的身份, 如果以“目录”的角度来看,所谓的 root 意即指的是根目录,就是 / 啦~ 要特别留意喔!

    • 根目录 (/) 的意义与内容:
      根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的,同时根目录也与开机/还原/系统修复等动作有关。 由于系统开机时需要特定的开机软件、核心文件、开机所需程序、函数库等等文件数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。 因为根目录是这么的重要,所以在FHS的要求方面,他希望根目录不要放在非常大的分区内, 因为越大的分区你会放入越多的数据,如此一来根目录所在分区就可能会有较多发生错误的机会。

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

    事实上FHS针对根目录所定义的标准就仅有上面的咚咚,不过我们的Linux下面还有许多目录你也需要了解一下的。 下面是几个在Linux当中也是非常重要的目录喔:

    早期 Linux 在设计的时候,若发生问题时,救援模式通常仅挂载根目录而已,因此有五个重要的目录被要求一定要与根目录放置在一起, 那就是 /etc, /bin, /dev, /lib, /sbin 这五个重要目录。现在许多的 Linux distributions 由于已经将许多非必要的文件移出 /usr 之外了, 所以 /usr 也是越来越精简,同时因为 /usr 被建议为“即使挂载成为只读,系统还是可以正常运行”的模样,所以救援模式也能同时挂载 /usr 喔! 例如我们的这个 CentOS 7.x 版本在救援模式的情况下就是这样。因此那个五大目录的限制已经被打破了呦!例如 CentOS 7.x 就已经将 /sbin, /bin, /lib 通通移动到 /usr 下面了哩!

    好了,谈完了根目录,接下来我们就来谈谈/usr以及/var啰!先看/usr里面有些什么东西:

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

    很多读者都会误会/usr为user的缩写,其实usr是Unix Software Resource的缩写, 也就是“Unix操作系统软件资源”所放置的目录,而不是使用者的数据啦!这点要注意。 FHS建议所有软件开发者,应该将他们的数据合理的分别放置到这个目录下的次目录,而不要自行创建该软件自己独立的目录。

    因为是所有系统默认的软件(distribution发布者提供的软件)都会放置到/usr下面,因此这个目录有点类似Windows 系统的“C:\Windows\ (当中的一部份) + C:\Program files\”这两个目录的综合体,系统刚安装完毕时,这个目录会占用最多的硬盘容量。一般来说,/usr的次目录建议有下面这些:

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

    建议在你读完整个基础篇之后,可以挑战FHS官方英文文件(参考本章),相信会让你对于Linux操作系统的目录有更深入的了解喔!

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

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

    • /bin —> /usr/bin
    • /sbin —> /usr/sbin
    • /lib —> /usr/lib
    • /lib64 —> /usr/lib64
    • /var/lock —> /run/lock
    • /var/run —> /run

    另外,在Linux下面,所有的文件与目录都是由根目录开始的!那是所有目录与文件的源头~ 然后再一个一个的分支下来,有点像是树枝状啊~因此,我们也称这种目录配置方式为:“目录树(directory tree)” 这个目录树有什么特性呢?他主要的特性有:

    • 每一个目录不止能使用本地端的 partition 的文件系统,也可以使用网络上的 filesystem 。举例来说, 可以利用 Network File System (NFS) 服务器挂载某特定目录等。
    • 每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的。
      好,谈完了FHS的标准之后,实际来看看CentOS在根目录下面会有什么样子的数据吧!我们可以下达以下的指令来查询:

    上述目录相关的介绍都在上一个小节,要记得回去查看看。如果我们将整个目录树以图示的方法来显示,并且将较为重要的文件数据列出来的话,那么目录树架构有点像这样:

    目录树架构示意图图5.3.1、目录树架构示意图

    除了需要特别注意的FHS目录配置外,在文件名部分我们也要特别注意喔!因为根据文件名写法的不同,也可将所谓的路径(path)定义为绝对路径(absolute)与相对路径(relative)。 这两种文件名/路径的写法依据是这样的:

    • 绝对路径:由根目录(/)开始写起的文件名或目录名称, 例如 /home/dmtsai/.bashrc;
    • 相对路径:相对于目前路径的文件名写法。 例如 ./home/dmtsai 或 ../../home/dmtsai/ 等等。反正开头不是 / 就属于相对路径的写法
      而你必须要了解,相对路径是以“你当前所在路径的相对位置”来表示的。举例来说,你目前在 /home 这个目录下, 如果想要进入 /var/log 这个目录时,可以怎么写呢?

    • cd /var/log (absolute)

    • cd ../var/log (relative)
      因为你在 /home 下面,所以要回到上一层 (../) 之后,才能继续往 /var 来移动的! 特别注意这两个特殊的目录:

    • . :代表当前的目录,也可以使用 ./ 来表示;

    • .. :代表上一层目录,也可以 ../ 来代表。
      这个 . 与 .. 目录概念是很重要的,你常常会看到 cd .. 或 ./command 之类的指令下达方式, 就是代表上一层与目前所在目录的工作状态喔!很重要的呐!

    例题:如何先进入/var/spool/mail/目录,再进入到/var/spool/cron/目录内?答:由于/var/spool/mail与/var/spool/cron是同样在/var/spool/目录中,因此最简单的指令下达方法为:

    • cd /var/spool/mail
    • cd ../cron
      如此就不需要在由根目录开始写起了。这个相对路径是非常有帮助的!尤其对于某些软件开发商来说。 一般来说,软件开发商会将数据放置到/usr/local/里面的各相对目录,你可以参考图3.2.1的相对位置。 但如果使用者想要安装到不同目录呢?就得要使用相对路径啰!^_^

    例题:网络文件常常提到类似“./run.sh”之类的数据,这个指令的意义为何?答:由于指令的执行需要变量(bash章节才会提到)的支持,若你的可执行文件放置在本目录,并且本目录并非正规的可执行文件目录(/bin, /usr/bin等为正规),此时要执行指令就得要严格指定该可执行文件。“./”代表“本目录”的意思,所以“./run.sh”代表“执行本目录下, 名为run.sh的文件”啰!

    如同在第一章谈到的 Linux distribution 的差异性, 除了 FHS 之外,还有个 Linux Standard Base (LSB) 的标准是可以依循的!我们可以简单的使用 ls 来查看 FHS 规范的目录是否正确的存在于你的 Linux 系统中, 那么 Linux 核心、LSB 的标准又该如何查阅呢?基本上,LSB 团队是有列出正确支持 LSB 标准的 distribution 在如下的网页中:


    • 不过,如果你想要知道确切的核心与 LSB 所需求的几种重要的标准的话,恐怕就得要使用诸如 uname 与 lsb_release 等指令来查阅了。 不过,这个 lsb_release 指令已经不是默认安装的软件了,所以你得要自己安装该软件才才行。因为我们尚未讲到网络与挂载等动作, 所以下面的安装流程在你的机器上面应该是无法执行的 (除非你确实可以连上 Internet 才行!),因为 CentOS7 在这个软件上面实在有太多的相依软件, 所以无法单纯使用 rpm 来安装!若你有公开的网络,那么下面的指令才能够顺利运行!
    1. [dmtsai@study ~]$ uname -r # 查看核心版本
    2. 3.10.0-229.el7.x86_64
    3. [dmtsai@study ~]$ uname -m # 查看操作系统的位版本
    4. x86_64
    5. # 2\. 假设你的 CentOS 7 确实有网络可以使用的情况下 (要用 root 的身份)
    6. [root@study ~]# yum install redhat-lsb # yum 的用法后面章节才会介绍
    7. .....(前面省略)....
    8. Install 1 Package (+85 Dependent packages
    9. Total size: 47 M
    10. Total download size: 31 M
    11. Is this ok [y/d/N]: y
    12. .....(后面省略)....
    13. Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    14. Importing GPG key 0xF4A80EB5:
    15. Userid : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
    16. Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
    17. Package : centos-release-7-0.1406.el7.centos.2.3.x86_64 @anaconda
    18. From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    19. .....(后面省略)....
    20. [root@study ~]# lsb_release -a
    21. LSB Version: :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:
    22. desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:
    23. printing-4.1-amd64:printing-4.1-noarch # LSB 的相关版本
    24. Distributor ID: CentOS
    25. Description: CentOS Linux release 7.0.1406 Core
    26. Release: 7.0.1406

    这个 lsbrelease 的东西大家先看看就好,因为有牵涉到后面的 yum 软件安装的东西,这部份我们还没有谈到啊~而且如果你现在就直接安装, 未来我们谈网络与软件的阶段时,恐怕有些地方会跟我们的测试机环境不同~所以…先看看就好喔! ^^

    Tips 在这里要跟大家说抱歉,因为不想要破坏整体测试机器的环境,所以鸟哥使用了另一部虚拟机来安装 redhat-lsb 这套软件,而另一部虚拟机是通过 CentOS 7.0 而非 CentOS 7.1 的版本,因此你应该会发现到上面使用 lsb_release 指令的输出中,竟然出现了 7.0.1406 的东东~真是不好意思~