Linux 的档案权限与目录配置--3

Linux 目录配置

在了解了更改档案属性/权限后 在了解以下为什么每个 Linux distribution 的设定档、执行档、每个目录里面都放置的什么东西。
其实都差不多,因为Linux的发行版本太多了,所以有了一套标准 Filesystem Hierarchy Standard(FHS).
FHS的主要目的是希望让使用者可以了解到安装软件通常放置于哪个目录下。
实际上,FHS一直在改版,FHS依据档案系统使用的频繁与否允许使用者随意更动,而将目录定义为四中交互作用的形态,用表格来说类似下表:

可分享的(shareable) 不可分享的(unshareable)
不变的(static) /usr(软件放置处) /etc(设定档)
/opt(第三方协力软件) /boot(开机与核心档)
可变动的(variable) /var/mail(使用者邮件信箱) /var/run(程序相关)
/var/spool/news(新闻群组) /var/lock(程序相关)
  • 可分享的:可以分享给其他系统被挂在使用的目录,所以包括执行档与使用者的邮件等资料,是能够分享给网络上其他主机挂在用的目录;
  • 不可分享的:自己机器上面运作的装置档案或者是与程序有关的 socket 档案等,由于仅与自身机器有关,所以当然就不适合分享给其他主机了;
  • 不变的:有些资料是不会经常变动的,跟随者 distribution 而不变动。例如函式库、文件说明档、系统管理员所管理的主机服务设定档等等;
  • 可变动的:经常改变的资料,例如登录档、一般用户可自行收受的新闻群组等。

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

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

为什么要定义这三个目录呢?其实是有意义的,每层目录底下所应该要放置的目录也都又有特定的规定,先有个概念即可,后面慢慢学。


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

根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的,同时根目录也与开机/还原/系统修复等动作有关。
由于系统开机时需要特定的开机软件、核心档案、开机所需程序、函式库等档案资料,若系统出现错误时,跟目录也必须要包含能够修复档案系统的程序才行。因为根目录是这么重要,所以在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建议不要放置可执行档(binary)在这个目录中哦。比较重要的档案有:/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是【媒体】的英文,顾名思义,这个/media底下放置的就是这个可移除的装置啦!包括软盘、光盘、DVD等等装置都暂时挂在于此。常见的档名有:/media/floppy, /media/cdrom等等。
/mnt 如果你想要暂时挂载某些额外的装置,一般建议你可以放置到这个目录中。在古早时候,这个目录的用途与 /media 相同啦,只是有了 /media 之后,这个目录就用来暂时挂载用了。
/opt 这个是给第三方协力软件放置的目录。什么是第三方协力软件啊?举例来说,KDE 这个桌面管理系统是一个独立的计划,不过他可以安装到 Linux 系统中,因此 KDE 的软件就建议放置到此目录下了。另外,如果你想要自行安装唯爱的软件(非原本的 distribution 提供的),那么也能够将你的软件安装到这里来。不过,以前的 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 服务器需要的网页资料就可以放置在 /src/www/ 里面。不过,系统的服务资料如果尚未提供给网际网络任何人浏览的话,预设还是建议放置到 /var/lib 底下即可。
/tmp 这是让一般使用者或是正在执行的程序暂时放置档案的地方。这个目录是任何人都能够存取的,所以你需要定期的清理一下。当然,重要资料不可放置在此目录下啊!因为 FHS 甚至建议在开机时,应该要将 /tmp 下的资料都删除哊!
/usr 第二层 FHS 设定,后续介绍
/var 第二层 FHS 设定,主要放置变动的资料,后续介绍
第二部分:FHS 建议可以存在的目录
/home 这是系统预设的使用者家目录(home directory)。在你新增一个一般用使用者账号时,预设的使用者家目录都会规范到这里来。比较重要的是,家目录有两种代号喔:
  • ~:代表目前这个使用者的家目录
  • ~dmtsai:则代表 dmtsai 的家目录!
/lib 用来存放与 /lib 不同的格式的二进位函式库,例如支持 64 位元的 /lib64 函式库等
/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 distributions 由于已经将很多非必要的档案移除 /usr 之外了,所以 /usr 也是越来越精简,同时因为 /usr 被建议为【即使挂在称为只读,系统还是可以正常运作】的模样,所以救援模式也能同时挂在 /usr 喔!
因此,那个五大目录的限制已经被打破了!例如 CentOS 7.x 就已经将 /sbin, /bin, /lib 通通移动到 /usr 底下了哩!



/usr 的意义与内容

依据 FHS 的基本定义, /usr 里面放置的资料属于可分享的与不可变动的(shareable, static),如果你知道如何通过网络进行分割槽的挂载,那么 /usr 确实可以分享给区域网络内的其他主机来使用喔!
usr 是 Unix Software Resource 的缩写,而不是 user 的缩写。也就是【Unix作业系统软件资源】所放置的目录,而不是使用者的资料。FHS 建议所有软件开发者,应该将他们的资料合理的分别放置到这个目录下的次目录,而不要自行建立软件自己独立的目录。

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

目录 应放置档案内容
第一部分:FHS 要求必须要存在的目录
/usr/bin/ 所有一般用户能够使用的指令都放在这里!目前新的 CentOS 7 已经将全部的使用者指令放置于此,而使用连结档的方式将 /bin 链接至此!也就是说, /usr/bin 与 /bin 是一模一样了!另外,FHS 要求在此目录下不应该有子目录!
/usr/lib/ 基本上,与 /lib 功能相同,所以 /lib 就是链接到此目录中的!
/usr/local/ 系统管理员在本机自行安装自己下载的软件(非 distribution预设提供者),建议安装到此目录,这样会比较便于管理。例如,你的 distribution 提供的软件较旧,你想安装较新的软件但有不想移除旧版本,此时你可以将新版软件安装于 /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++等程序语言的档头(header)与包含档(include)放置处,当我们以 tarball 方式(*.tar.gz 的方式安装软件)安装某些资料时,会使用到里头的许多包含档喔!
/usr/libexec/ 某些不被一般使用者管用的执行档或脚本(script)等等,都会放置在此目录中。例如大部分的 X 视窗底下的操作指令,很多都是放在此目录下的。
/usr/lib/ 与 /lib/ 功能相同,因此目前 /lib 就是链接到此目录中
/usr/src/ 一般原始码建议放置到这里,src 有 source 的意思。至于核心原始代码则建议放置到 /usr/src/linux/ 目录下。


/var 的意义与内容:

如果 /usr 是安装时会占用较大硬盘容量的目录,那么 /var 就是在系统运作后才会渐渐占用硬盘容量的目录。
因为 /var 目录主要针对常态性变动的档案,包括快取(cache)、登录档(log file)一级某些软件运作后所产生的档案,包括程序档案(lock file, run file),或者例如 MySQL 资料库的档案等等。
常见的次目录有:

目录 应放置档案内容
第一部分: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/ 这个目录通常放置一些佇[zhù]列资料,所谓的【佇列】就是排队等待其他程序使用的资料啦!这些资料被使用后通常会被删除。例如:系统收到新信会放置到 /var/spool/mail/ 中,但使用者手下该信件后该信原则上就会被删除。信件如果暂时寄不出去就会被方到 /var/spool/mqueue/ 中,等到被送出后就会被删除。如果是工作排程资料(crontab),就会被放置到 /var/spool/cron/ 目录中!


针对 FHS,各家 distributions 的异同,与 CentOS 7 的变化

由于 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


目录树(directory tree)

在Linux下,所有的档案与目录都是由根目录开始的!那是所有目录与档案的源头~然后在一个个的分支下来,有点像树枝的形状,因此我们也成这种目录配置方式为【目录树(directory tree)】。
目录树主要有如下特点:

  • 目录树的起始点为根目录(/, root);
  • 每一个目录不止能使用本地端的 partition 的系统档案,也可以使用网络上的 filesystem 。 例如:可以利用 Network File System (NFS)服务器挂在某特定目录等。
  • 每一个档案在此目录树中的档名(包含完整路径)都是独一无二的。

directory-tree

了解了FHS后,可以回去看看linux规划的分割情况了。根据 FHs 的定义,最好能够将 /var 独立出来,这样对于系统的资料还有一些安全性的保护呢!因为至少 /var 死掉时,你的根目录还活着呢,可以进入救援模式。



绝对路径与相对路径

根据档名写法的不同,可以将所谓的路径(path)定义为绝对路径(abslute)与相对路径(relative).
这两种档名/路径的写法依据是这样的:

  • 绝对路径:由根目录(/)开始写起的档名或目录名称,如:/home/hare/.bashrc;
  • 相对路径:相对于当前路径的档名写法。如:./home 或 ../../home 等等。反正开头不是 / 就属于相对路径的写法。
    • .:代表当前的目录,也可以使用./来表示;
    • ..:代表上一层目录,也可以使用../来表示。

CentOS 的观察

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

如果想要知道确切的核心与 LSB 所需要的几种重要的标准的化,恐怕就得要使用诸如 uname 与 lsb_release 等指令来查询了。不过, lsb_release 指令已经不是预设安装的软件了,是需要自己安装的,后面在学吧。

hare
2020.3.5

posted @ 2020-03-04 20:22  hare1925  阅读(133)  评论(0编辑  收藏  举报