第四章文件系统管理计算机系统中除了CPU、存储器和I/O设备等硬件资源外,还有许多系统和用户程序、数据这样的软件资源。这些软件资源都是一些具有一定逻辑意义的相关联的信息集合。从系统管理的角度把它们看成一个个的文件,并把它们保存在某种存储介质上;对计算机系统中软件资源的管理形成了操作系统的文件系统。操作系统通过文件系统对用户的程序和数据进行组织、存放、保护和共享,其目的是方便用户对文件按名存取、提高存储设备的利用率、保护用户软件资源的安全。4.1文件与文件系统的概念用户在使用操作系统时,最经常用的就是文件系统。特别地,在Linux操作系统中把CPU、内存以外的所有设备都抽象为文件来处理。进程只和文件系统发生关系,当进程使用计算机系统中的硬件设备时,由文件系统屏蔽掉硬件设备的具体特性和如何提供服务等细节,这些具体细节由操作系统的设备管理模块实现并为文件系统提供一个简单、统一的接口。因此,在Linux系统中文件系统也是设备管理模块的接口。4.1.1文件的概念文件是存储在某种存储介质上具有标识名的一组相关信息集合。文件具有以下特性:1.任何具有独立意义的一组信息都可以组织成一个文件。2.可保存性。3.可按名存取,无需了解它在存储介质上的具体物理位置。Linux系统中的一切都是以进程或文件的形式存在。例如:Linux系统把鼠标看成文件/dev/mouse,目录也是一种文件类型,内核被看成vmlinuz文件或bzImage文件。甚至终端也被看成文件(如/dev/tty2)。因此、要让Linux系统平稳地运行,必须要了解文件和文件结构。在DOS/Windows系统中,文件的属性有:只读、隐藏、系统和存档四种。而在Linux系统中,文件的属性主要包括文件类型和文件权限两个方面,如图4-1所示。4.1.1.1文件类型在不同的操作系统下文件的类型有一些差别,Linux系统中的文件类型有:普通文件所有用编辑程序、语言编译程序、数据库管理程序等产生的文本文件、二进制文件、数据文件等都是普通文件,它是一种无结构的流式文件,所谓流式文件它是相关信息的有序集合,或者说是有一定意义的字符流。它包含的内容最多,范围最广。普通文件又可进一步分为文本文件和二进制文件。如用文本编辑器编辑的hello.c(文本)文件,对hello.c文件编译生成的hello.o(二进制)文件,对hello.o文件连接生成的hello(二进制—可执行)文件。目录文件用于存放文件名和其他有关文件信息的文件,即用于检索文件的文件。目录文件可以包含下一级目录文件和普通文件,每一级的目录文件都是如此以便在系统中形成一棵目录树。Linux的目录文件由目录项构成,它包括两个部分:即文件名和文件号,文件号被称作i节点号i_number。如图4-2所示要注意的是Linux下的目录文件与DOS/Windows下的“目录”不同,Linux这样作的目的是为了加快文件检索的速度。DOS/Windows下的目录也是由目录项构成,但是它的目录项中没有文件号,而是列出每个文件的属性、起始簇号、创建日期、修改日期等等,长度远大于16个字节。Linux下目录文件只包含文件名和文件号,目的是减少目录项的长度,这样在搜索文件时根据文件名进行比较,找到该文件名后再从对应的文件号(i_number)找出该文件的其他信息。由于目录项短,相同容量下可存储的目录项就多,找到文件的几率就大,所以可以加快文件检索的速度。链(连)接文件从使用的角度来说一个文件或目录出现在文件系统目录结构的几个地方常常是方便的(当然这会破坏真正的树型结构)。例如,两个程序员正在某个相同的项目上工作,都希望与项目关联的若干文件保存在自己的目录中;这可以通过文件的共享来实现。文件或目录的共享不同于文件或目录拷贝。在Linux系统中文件或目录的共享通过创建链接的方式来实现。Linux与Unix一样支持两种类型的链接;第一种是硬链接,它是复制指向相同存储区的目录条目,如图4-3所示,第二种是软链接(也称为符号链接)就是在自己目录文件中建立指向共享目录或文件所在目录文件中目录项的指针,如图4-4所示。链接实际上就是给文件或目录起一个绰号,可以用多个名字表示同一个目录或文件,软链接类似于MSWindows中的快捷方式。链接文件就是指向被链接目录或文件的文件。采用链接机制不需要复制文件,能有效地节省磁盘空间,特别是为文件共享提供了一条有效的途径。i节点在硬链接与软链接中都起到了重要的作用。硬链接硬链接指向文件的i节点。用ln命令就可以创建一个硬链接。例如,执行lnaddaddlink命令就建立一个add文件的硬链接addlink文件。在下面的例子中可以看到add和addlink文件有相同的i节点或索引号(297731);有相同的文件创建日期和时间(1月9日,22:20);有相同的文件大小(138字节)。#ls–liadd*297731-rw-r--r--2rootroot1381月922:20add297731-rw-r--r--2rootroot1381月922:20addlink如果要建立目录的硬链接,则要用命令ln–d或ln–F,也可以直接用lndir命令。只有超级用户或具有超级用户权限的系统管理员才能建立目录的硬链接。硬链接的文件可以被移动或编辑,这并不影响实际的文件。软链接软链接是与要链接文件或目录的路径链接,而不是与i节点链接;因此,软链接只是指向i节点号。可以用ln–s命令创建一个软链接。例如,执行ln–saddsoftlink命令就建立一个add文件的软链接softlink文件。在下面的例子中可以看到add和softlink文件有不同的i节点或索引号(分别为297731和297777);有不同的文件创建日期和时间(分别为1月9日,22:20和2月28日,20:41);有不同的文件大小(分别为138和3字节)。#ls–liaddsoftlink297731-rw-r--r--2rootroot1381月922:20add297777lrwxrwxrwx1rootroot32月2820:41softlink-add与硬链接相比,软链接不直接访问文件系统,因此它可以位于不同的磁盘分区上;但是,移动它会影响原文件。对于采用硬链接方式,要对被链接的文件进行特殊管理,以免它被删除时引发系统错误。对Linux系统而言,系统为每个文件设有链接计数器。当指向一个文件的新链接建立时,该链接计数器加1;当一个文件链接被从目录中删除时,该链接计数器减1,如果链接计数器的值为0,则该文件所占据的空间被释放。对于采用软链接方式,如果原来被链接的文件删除,那么所有软链接将被留下悬空。这就像在MSWindows中为某个应用程序建立快捷方式后,如果该应用程序被删除,则系统不会自动删除对应的快捷方式一样。设备文件设备文件是Linux系统中比较特殊的一类文件,设备文件有时也称为特别文件。通过这类文件用户才可以访问计算机系统的外部设备,如磁盘、打印机等;通过这类文件Linux系统实现了设备的独立性。现代计算机系统往往配置多种类型的设备,每一种类型的设备又可以配置多台。为了提高计算机系统的可适应性与可扩展性,操作系统希望用户不指定特定的设备,而代之以指定逻辑设备。逻辑设备是实际物理设备属性的抽象,它并不限于某个具体设备。例如,逻辑设备LPT1可以是并行打印机,也可以是其他并行设备;可以是0号打印机,也可以是1号打印机。同样,逻辑设备CON1可以是串行端口的鼠标,也可以是游戏杆等其他串行设备。所谓设备独立性也称为设备无关性,它是指用户程序中的逻辑设备与实际使用的物理设备无关,可以脱离具体的物理设备来使用设备;由操作系统建立逻辑设备与物理设备之间的映像关系,并由操作系统做相应的连接工作。Linux系统采用将外部设备看作是一个独立的文件来解决增加新设备的问题。无论向计算机系统中添加哪种类型的设备,只需要在系统内核中添加必要的设备驱动程序即可,当使用该设备时,系统内核都可以用与访问文件一样的方式来访问设备。设备文件就是在外部设备和操作系统之间提供一种标准的接口,使用户可以像使用普通文件一样来使用外设,所不同的就是打开一个设备文件相当于为一个进程分配设备,关闭一个设备文件相当于释放一个进程所占用的设备。在Linux系统中,设备文件通常存放在/dev目录下。从设备文件的名称可以看出它使用设备的主设备号和次设备号来指定外设,主设备号用于说明设备类型,而次设备号用于说明具体是哪一个设备。例如,设备文件/dev/hda指的就是系统中的第一个硬磁盘驱动器。其中hd是硬磁盘的英文缩写(harddisk),同时也是主设备名;而a是次设备名,表示第一个硬磁盘。如果有多个硬磁盘,则以hda、hdb等表示;如果每个磁盘上有多个分区,则在次设备号后用数字编号来表示分区,如hda0、hdb3等等。设备文件还可细分为块设备和字符设备两种。块设备指以固定长度的数据块为单位来组织和传送数据的设备,如磁盘、磁带等;字符设备指以单个字符为单位来传递信息的设备,如终端显示器、打印机等。大多数设备都同时提供数据块和字符两种数据访问方式,但是每一种设备都有其最佳的访问方式。例如,对于终端一般采用字符访问方式,而对于磁盘则两种方式都可以采用。设备文件中最特殊的是/dev/null,它就像“黑洞”一样,将所有写入的数据吞噬。通常将它作为一个废物池,将不需要的输出信息或是要删除的文件送到这里。注意,送到这里的文件是不可恢复的。如果用它作为一个输入文件,如cat/dev/nullmyfile.txt,则会产生一个零长度的myfile.txt文件。在Linux系统中除了普通文件、目录文件、连接文件、设备文件外,还有管道(FIFO)文件和套接字文件。4.1.1.2文件权限文件是系统和普通用户的软件资源,因此,文件有系统文件与用户文件。对于系统文件如果不加限制地访问,可能会由于无意或有意的操作造成这些文件被删除或修改而使操作系统无法正常工作;同样,对于用户文件如果不加限制地访问,也会使用户的程序与数据被破坏或泄密;另外,当文件被多个用户或进程共享时,如果不加以限制则可能会破坏文件的一致性,造成结果错误。换句话说,由于文件需要共享、保护和保密,所以操作系统要对文件设置权限(也称为文件存取权限)。文件权限即文件读、写和执行的许可权。Linux系统是多用户、多任务的操作系统,为了保证系统、用户程序与数据的安全性,对文件的存取权限有严格的规定。Linux采用存取控制表(accesscontrollists)机制,把用户与文件的关系定为三类:第一类是文件所有者(文件主),即创建文件的人。第二类是同组用户,即几个有某些共同关系的用户组成的集体。第三类是其他用户。Linux把文件权限也分为三类:第一类是可读,用r表示。第二类是可写,用w表示。第三类是可执行,用x表示。每一类用户的文件权限设置成三位,如果为可读、可写、可执行,则表示为rwx;如果没有某类权限,则用-表示;例如,某类用户的文件权限为r-x,表示该类用户对文件只有读、执行权限,而没有写的权限。因此,一个文件需要用9位来表示三类用户的文件权限。实际上在Linux系统的终端中用ls–l命令查看一个文件的权限时,系统显示的是文本视图,用户看到的是十个字符,第一个字符表示文件类型,如果为-表示普通文件、b是块设备文件、c是字符设备文件、l是连接文件、d是目录文件、s是隐藏文件。第二到四个字符表示文件主的权限,第五到七个字符表示同组用户的权限,第八到十个字符表示其他用户的权限。例如,显示为-rw-r--r--。Linux系统除了文本视图外,还可以采用数字视图,用9个二进制位表示权限。每个二进制位为1表示可读(显示r)或可写(显示w)或可执行(显示x);为0表示不可读或不可写或不可执行(显示-)。但数字视图主要在文件权限修改命令中使用,用三位二进制一组的八进制数字(0~7)输入。Linux系统默认文件主对所创建的文件拥有可读、可写和可执行(如果是可执行文件)权限,对创建的目录拥有所有的权限;同组用户