4.1 Ubuntu文件系统
Ubuntu文件系统就是采用一种逻辑的方法组织、存储、访问、操作和管理信息,把文件组织在一个层次目录结构的文件系统中,每个目录包含一组相关文件的组合,每个文件一般都提供打开(Open)文件、创建(Create)文件、读(Read)文件和写(Write)文件等基本操作。
最终,Ubuntu通过其文件系统,实现了对软硬件的统一管理和控制,提供了一种通用的文件处理模式,简化物理设备的访问,按文件方式处理物理设备,并允许用户以同样的命令处理普通文件和物理设备。例如,磁盘存储设备被视为一个块设备文件,而键盘、鼠标和显示器则被视为字符设备文件。Windows的文件系统则比较单纯,功能也比较单一,只具有数据存储概念,用于存储各种文件并以分区为单位创建。
由于本章会涉及大量的命令行操作,对于初学者而言接受起来或许会有一点困难,如果实在理解不了也没有关系,先熟悉一下,等对Ubuntu了解得更为全面和深入时再来复习,相信那时会更有收获。
4.1.1 Ubuntu文件层次结构
Windows和Ubuntu文件及文件系统的差异是这两个系统最为本质的差别之一。从Ubuntu使用者的角度看,Ubuntu的文件系统只是一个树形层次组织结构的目录文件树,文件系统的起点根据用户身份的不同而不同,如超级用户root的家目录是root,而普通用户的家目录则是/home目录下和用户名相同的目录。所有的目录无论如何组织,最终都要挂在根目录“/”之上,这和树的层级结构比较类似。树的层级结构是根—干—枝—叶,无论如何组织,最终,干—枝—叶都要连接到根,这样,理解UNIX/Linux化繁为简的系统管理思路就比较容易了,所以,根目录“/”相当于整个目录文件树的根。Ubuntu根目录文件如图4-1所示。
图4-1 Ubuntu根目录文件
子目录是整个目录文件树形层次组织结构中的一个中间节点,是比当前目录层次低一级的目录。文件是整个目录树形层次组织结构中的一个叶子节点。如果/etc目录是当前目录,那么所有位于/etc下的目录和其子目录都是当前目录的子树,如Network和Network Manager就是/etc下的子树。除非明确指定了目录路径,大多数Linux系统命令均把文件参数看作当前目录中的文件。
在文件系统中,若干文件可以组成一个目录,而若干不同的目录则可以构成一个目录的层次组织结构,位于目录层次组织结构顶端的就是一个被称为根目录的特殊目录。根目录包含各种系统目录和文件,如/bin、/boot、/dev、/etc、/home、/lib、/proc、/sbin、/tmp、/usr和/var等标准目录。
需要说明的是,文件系统层次结构标准(Filesystem Hierarchy Standard,FHS)很早就是一个独立的UNIX或类UNIX的文件系统层次结构标准。
FHS文件系统层次结构通用标准示意图如图4-2所示。
图4-2 FHS文件系统层次结构通用标准示意图
后来FHS标准被纳入Linux标准规范(Linux Standard Base,LSB)中。
Ubuntu文件系统的设计目的就是把文件有序地组织在一起,提供一个从逻辑上组织文件的文件系统。除了文件的组织,文件安全也是文件系统设计的要点。所以,文件的访问权限是文件系统不可或缺的组成部分。
4.1.2 绝对路径和相对路径
文件系统是一个层级系统,所以,要访问层级系统有两个起点:一是从根目录开始算起,称为绝对路径,特点是路径名以斜线开始;二是从当前目录开始算起,称为相对路径,特点是以目录名而非斜线开始。绝对路径名指定了文件在文件系统的层级结构中,从根目录开始的存储位置。而相对路径名则是以当前目录为起始字符的所有路径名,相对路径名指定了文件在文件系统中相对于当前工作目录的存储位置。
细心的读者会注意到每个目录都存在两个特殊目录,它们就是以句点“。”和双句点“..”命名的两个特殊的目录文件,分别表示当前目录和其父目录。这两个特殊目录把文件系统中的各级目录有机地连接在一起。
Tips:特殊目录名称。
◆ ~:表示家目录。
◆ -:表示切换到当前目录之前的目录。
4.1.3 Linux文件类型
在Ubuntu系统中,文件是由一系列连续的字节流组成的,最后以一个EOF字符结束。但从物理实现上讲,文件实际上是由磁盘(或其他存储介质)上的一系列数据块组成的,且组成文件的数据块并不一定是连续的。如果文件是一个ELF的可执行文件,且具有执行权限,它执行后就会出现在内存中,以进程的形式在内存中运作。
Ubuntu系统并不像Windows系统那样以扩展名区分文件的类型。因此,单从文件名本身来看,大部分文件的类型都无从知晓。Ubuntu系统虽然没有对文件的命名规则,却有约定俗成的命名习惯,如以“.c”作为C源程序文件名的扩展名,以“.sh”作为Shell脚本文件名的扩展名。
Ubuntu文件系统中存在多种类型的文件,如最流行的Ext3/Ext4文件系统,一般都支持普通文件、目录文件、链接文件、设备文件4种不同类型的常规文件。
1)普通文件
普通文件是一组信息的基本存储单位。通常,每个文件都拥有一个名字,通过名字可以对文件的数据内容进行处理。在Ext3/Ext4等文件系统中,文件名可以长达255个字符。普通文件以“-”表示。
普通文件可以保存任何数据,内容可以是ASCII文本、源代码、Shell脚本及各种文档等,也可以是二进制程序代码。
2)目录文件
在Ubuntu系统中,目录也是一种文件,而且是一种特殊类型的文件,其中存储的是一系列文件名及其信息节点号。除了存储的内容不同,目录还提供了文件名、信息节点与文件数据之间的关联关系。
目录文件是由一系列目录项组成的,每个目录项由两个不同的字段组成:一个字段为信息节点号,用于引用信息节点;另一个字段为文件的名字。
3)链接文件
链接文件类似于Windows系统的快捷方式,即为同一数据或程序赋予不同的文件名,这种类型的文件在Ubuntu中被称为链接文件。链接文件又分为硬链接文件和软链接文件两大类。硬链接实际上不增加存储空间,不占用新的inode的复制,不能跨越文件系统,而软链接能够跨越不同的物理文件系统建立链接文件。链接文件用字母Ⅰ表示。
4)设备文件
设备文件可能是最特殊的文件之一,初学者理解起来可能比较困难,其实只把它当成一个可打开、可读/写的文件即可,设备文件的发明令用户能够像读/写普通文件一样访问外部设备,而不必涉及各种I/O设备的具体操作细节。每个设备文件均对应一个I/O设备,由I/O设备驱动程序实现用户与设备之间的数据通信。常用到的设备文件类型有字符特殊文件(用字母c表示)和块特殊文件(用字母b表示)。
如何确定文件的类型呢?Ubuntu提供了file命令,这里只看该命令的执行结果: