完美应用RHEL 8
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.1 掌握RHEL文件系统

3.1.1 RHEL文件层次结构

从RHEL使用者的角度来看,RHEL的文件系统只是一个树形层次组织结构的目录文件。RHEL就是根据这棵树来管理和组织服务器系统的软硬件资源的,因为RHEL中一切皆文件,无论是软件还是硬件,最终都会被抽象为文件,这一点和Windows系统存在很大不同,文件系统在Windows中就是一个存储。至于文件系统的起点,将根据用户身份的不同而不同,如超级用户root的家目录是root,而普通用户的家目录是/home目录下和用户名相同的目录。所有的目录无论其类型如何,归根到底都是要直接、间接、自动、手动地挂载到根目录/之上的,这与大树的层级结构类似,大树层级结构是根—干—枝—叶,无论如何组织,最终—干—枝—叶都要连接到根,这就比较容易理解UNIX/Linux化繁为简的系统管理思路了,所以根目录/相当于整个目录文件树的根,RHEL目录文件的层次组织结构如图3-1所示。

图3-1 RHEL目录文件的层次组织结构

子目录是整个目录文件树形层次组织结构中的一个中间节点,是比当前目录层次低一级的目录。文件是整个目录树形层次组织结构中的一个叶子节点。如果/etc目录是当前目录,那么所有位于/etc下面的目录及其子目录都是当前目录的子树,如network和NetworkManager就是/etc下的子树。除非明确指定了目录路径,大多数Linux系统命令均把文件参数看作当前目录中的文件。

在文件系统中,若干文件可以组成一个目录,而若干不同的目录可以构成一个目录的层次组织结构,那么位于目录层次结构顶端的就是一个称为根目录的特殊目录。根目录包含了各种系统目录和文件,如/bin、/boot、/dev、/etc、/home、/lib、/proc、/sbin、/tmp、/usr及/var等,更多权威信息请访问维基百科。

RHEL文件系统的设计目的是把文件有序地组织在一起,提供一个从逻辑上组织文件的文件系统。除了文件的组织,文件安全也是文件系统的设计要点,所以文件的访问权限就是文件系统的一个不可或缺的关键组成部分。

3.1.2 深入RHEL文件系统

RHEL文件系统的目录和文件的组织结构是按一定逻辑功能划分,并遵循LSB的HFS标准组织在一起的,这种结构有助于RHEL系统的管理和维护,并且便于用户访问和使用。下面介绍RHEL文件系统的重要目录(不是全部),具体如下。

1.根目录

根目录是整个文集系统的逻辑终点,用/表示。

2.一级目录

● /bin:RHEL 8中的/bin目录只是/usr/bin目录的一个链接文件,包含用户高频使用的各种程序,如bash、dd、df、gzip、grep、mv和mkdir等。

● /boot:包含系统引导程序GRUB及其配置文件、Linux内核文件vmlinuz和磁盘内存映像文件initrd.img等。

● /dev:包含系统支持的所有设备文件,具体来说,console表示系统控制台,lp0表示打印机,mem表示系统的物理内存,sda表示连接到主控制器上第一个磁盘,sda1和sda2分别表示其中的第一个和第二个磁盘分区,ttyXX表示系统的串口设备,等等。

● /etc:包含系统管理和维护方面的所有配置文件,如host.conf、resolv.conf、sysctl.conf和syslog.conf等。此外,还有大量的配置文件分别位于单独的子目录中。需要注意的是,应定期使用Backups工具备份这个目录中的重要配置文件,以便需要时能够快速地恢复系统。

● /home:包含所有普通用户的家目录,每增加一个新用户,系统将会在/home目录中创建一个和用户名相同的子目录作为该用户的家目录。

● /lib:RHEL 8中为指向/usr/lib的符号链接,只包括内核模块和各种动态链接共享库文件(扩展名为.so,类似Windows系统中的.dll文件)。

● /lib64:RHEL 8中为指向/usr/lib64的符号链接,与/usr/lib类似,主要是64位的模块和动态链接库。

● /lost+found:每个文件系统分区都存在一个lost+found目录,用于存储fsck命令在检测与修复文件系统时删除的文件或目录。

● /media:包含移动存储介质(移动硬盘或U盘)的挂载点,如当插入U盘时,系统会自动将U盘挂载到此目录下的某个子目录中。

● /mnt:包含所有自定义文件系统的挂载点,可以挂载任何文件系统,如NFS或CIFS网络文件系统。

● /opt:应用程序等附加软件的安装目录,类似Windows系统中的Program Files目录。

● /proc:虚拟文件系统,系统关闭时为空目录,系统运行时为进程文件系统根目录,其中的部分文件分别对应当前正在运行的进程,可用于访问当前进程的地址空间。

● /root:超级用户root的主目录。

● /sbin:RHEL 8中为指向/usr/sbin的符号链接,包含超级管理员的常用工具,如管理和维护,系统引导和修复命令集合。

● /srv:分担/var目录的一些功能,保存一些网络服务所用的数据文件。

● /sys:和proc一样是虚拟目录,系统各种设备配置信息的根目录,如block子目录中含有磁盘及磁盘分区的配置信息。

● /tmp:临时文件目录,用于存储系统运行过程中生成的临时文件,也可以供用户存储自己的临时文件。需要注意的是,只有文件的创建者才能删除相应文件。

● /usr:此目录既可以作为根目录下的一个子目录,其中保存系统提供的各种共享数据(如用户命令、库函数、头文件和文档等),又可以作为一个单独的文件系统,可以认为是对根目录的一个递归目录,使得文件系统具有更大的灵活性。

● /var:该目录与/usr目录类似,首先是根目录下的一个子目录,也可作为一个单独的文件系统,用于存储各种可变长的数据文件(如日志文件)、暂存文件或待处理的临时文件等。

3.重要的二级目录

● /boot/grub2:该目录中保存的是GRUB 2的所有字体,配置等文件。

● /etc/yum.repos.d:该目录中保存软件仓库配置文件,定义软件仓库的地址,描述等内容的repo文件。

● /etc/cron.d:用于存储cron进程调度运行后台所用的配置和计划任务文件。

● /etc/sysconfig:用于保存系统中的各类重要配置文件,尤其是与网络相关的配置文件。

● /usr/bin:其中包含用户经常使用的各种命令,符号链接/bin目录指向真正的/usr/bin目录。

● /usr/include:用于存储各种C语言头文件。这个目录及其子目录中的头文件是C开发人员需要经常引用的文件。其中,sys、linux和bits等子目录中定义的数据结构,对于深入学习、理解和掌握Linux系统具有极大的参考价值。

● /usr/lib:根目录下lib实际指向的目录,其中包含各种共享的库函数,以及可供程序员以静态或动态方式链接自己开发的应用程序。

● /usr/lib64:根目录下/lib64实际指向的目录,其中包含各种共享的库函数,以及可供程序员以静态或动态方式链接自己开发的应用程序。

● /usr/sbin:包含系统引导完成之后系统管理员经常使用的各种系统管理和维护命令。

● /usr/share:共享目录,其中含有man(联机文档的根目录)、info(GNU info文档的根目录)、doc(各种软件包特定的文档)、locale(语言环境)、vim(用户指南)及zoneinfo(时区定义)等子目录。

● /usr/src:用于存放Linux系统内核的源代码和文档等。

● /usr/local/src:用于保存需要编译安装软件的源代码目录。

● /var/lib:保存软件包特定的动态链接共享库、配置文件、数据文件和状态信息等,如systemd、rpm等。

● /var/log:系统守护进程日志文件的存储目录,其中包括lastlog(每个用户最后一次注册的时间记录)、messages(由syslogd记录的所有内核和系统程序的日志消息)及wtmp(所有用户的系统注册/注销记录)等重要文件。位于/var/log目录中的文件会不断地增长,因而要求定期地备份或清除。通常,Linux系统均采用以日、周或月为时间周期,定时例行检查,以循环截取(如使用/usr/sbin/logrotate一类的程序)的方式,删除过时的数据,保留一定时间范围内的最新数据,使文件的大小保持一个适中的规模。在RHEL Linux系统中,每日将会定时执行一次logrotate程序,检查并处理系统日志文件。

● /var/lock:用于保存各种服务进程或应用程序访问特定的设备或文件时设置的封锁文件。

● /var/run:系统运行信息文件的根目录,其中的各种.pid文件存有相应守护过程的PID,另外一个最典型的文件是/var/run/utmp,其中含有当前系统中的用户注册信息。

● /var/spool:用于缓存各种等待处理的文件,如打印任务等。通常,每类待处理的缓存文件均位于各自的子目录中,如/var/spool/cups等。

● /var/tmp:用于保存各种临时文件。

3.1.3 绝对路径和相对路径

文件系统是个层级系统,所以要访问层级系统有两个起点:一是每次都从根目录开始算起,称为绝对路径,其特点是路径名以斜线开始;二是从当前目录开始算起,称为相对路径,其特点是以目录名而非斜线开始。绝对路径名指定了文件在文件系统的层级结构中从根目录开始的存储位置,而相对路径名则是以当前目录为起始字符的所有路径名,指定了文件在文件系统中相对于当前工作目录的存储位置。

细心的读者会注意到每个目录都存在的两个特殊目录,它们是包含以句点“.”和双句点“..”命名的两个特殊的目录文件,分别表示当前目录及其父目录。这两个特殊目录把文件系统中的各级目录有机地连接在一起。此外,还可以活学活用,以此类推,可以用“../..”表示上一级目录的上一级目录,“../../..”表示上一级目录的上一级目录的上一级目录。

下面几个简单的规则适用于所有的路径名。

Tip:特殊目录名称

~:表示家目录。

-:表示切换到当前目录之前的目录。

在RHEL系统中,文件是由一系列连续的字节流组成的,最后以一个EOF字符结束。但从物理实现来讲,文件实际上是由磁盘(或其他存储介质)上的一系列数据块组成的,且组成文件的数据块并不一定是连续的。如果文件是一个ELF的可执行文件,且具有执行权限,它执行后就会出现在内存中,以进程的形式在内存中运作。

RHEL系统并不像Windows系统那样以扩展名区分文件的类型,因此单从文件名来看,大部分文件都无从知道其类型。RHEL系统虽然没有对文件的命名规则,但有约定俗成的命名习惯。例如,以“.c”作为C源程序文件名的后缀,以“.sh”作为Shell脚本文件名的后缀。

在RHEL文件系统中存在多种类型的文件,如最流行的Ext3/Ext4文件系统,一般都支持5种不同类型的常规文件,即普通文件、目录文件、链接文件、设备文件、符号链接文件(管道文件和套接字文件不在本章讨论之列)。

1.普通文件

普通文件是一组信息的基本存储单位。通常,每个文件都有一个名称,通过名称可以对文件的数据内容进行处理。在Ext3/Ext4等文件系统中,文件名可以长达255个字符。

普通文件可以保存任何数据,内容既可以是ASCII文本、源代码、Shell脚本及各种文档等,也可以是二进制程序代码。

2.目录文件

在RHEL系统中,目录也是一种文件,而且是一种特殊类型的文件,其中存储的是一系列文件名及其信息节点号。除了存储的内容不同,目录还用于提供文件名、信息节点与文件数据之间的关联关系。

实际上,目录文件是由一系列目录项组成的,每个目录项由两个不同的字段组成:一个字段为信息节点号,用于引用信息节点;另一个字段为文件的名称。

3.链接文件

链接文件类似Windows系统的快捷方式,即把同一数据或程序赋予不同的文件名,这种类型的文件在RHEL中被称为链接文件,链接文件又分为硬链接文件和软链接文件两大类。硬链接实质上不增加存储空间,既不占用新的inode的复制,也不跨越文件系统;软链接能跨越不同的物理文件系统建立链接文件,链接文件用字母l表示。

4.设备文件

设备文件可能是最特殊的文件之一,初学者难以理解,其实只把它当成一个可打开、能读写的文件就好,设备文件的发明令用户能够和读写普通文件一样访问外部设备,而不必涉及各种I/O设备的具体操作细节,每个设备文件均对应一个I/O设备,由I/O设备驱动程序实现用户与设备之间的数据通信。常用的设备文件类型有两种:一种是字符特殊文件,用字母c表示;另一种是块特殊文件,用字母b表示。

这么多的文件类型该如何确定呢?RHEL提供了file命令,下面来看一下该命令的执行结果。