第3章Linux文件系统 文件系统是操作系统用于确定磁盘或分区上的文件的方法和数据结构,即文件在磁盘 上的组织方法。文件系统由3部分组成:与文件管理有关的软件、被管理的文件以及实施 文件管理所需的数据结构。从系统角度来看,文件系统是对文件存储空间进行组织和分配, 负责文件存储并对存入的文件进行保护和检索的系统。 3.1 Ubuntu的文件系统 1.文件系统简介 3.1 计算机文件是数据元素的有序序列,根据不同的实现方式,这些数据元素可以是机器 字、字符或二进制位。程序或用户只需通过文件系统就可以创建、修改、删除文件。每个文 件都有一个符号化的名称,即文件名。用户可以通过指定文件名以及数据元素在文件中的 线性索引,从而引用文件中的数据元素。 目录是文件系统维护所需的特殊文件,它包含了一个项目列表。一个计算机系统中有 成千上万的文件,为了便于对文件进行存取和管理,计算机系统要建立文件的索引,即文件 名和文件物理位置之间的映射关系,这种文件的索引称为文件目录。文件目录为每个文件 设立一个表目。文件目录的表目中至少要包含文件名、物理地址、文件逻辑结构、文件物理 结构和存取控制信息等,以建立起文件名与物理地址的对应关系,方便用户对文件的查找和 修改等操作,实现按名存取文件。 文件系统是操作系统用于确定磁盘或分区上的文件的方法和数据结构,即文件在磁盘 上的组织方法。文件系统也指用于存储文件的磁盘或分区。操作系统中负责管理和存储文 件信息的部分称为文件管理系统,简称文件系统。从系统角度来看,文件系统是对文件存储 空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它 负责为用户建立、保存、读出、修改、转储文件,控制文件的存取,当用户不再使用时删除文 件等。 从另一个角度来看,文件系统还是操作系统在计算机的硬盘上存储和检索数据的逻辑 方法,这些硬盘可以是本地驱动器,也可以是在网络上使用的卷或存储区域网络(Storage AreaNetwork,SAN)上的导出共享等。一般来说,一个操作系统对文件的操作包括:创建 和删除文件,打开文件以进行读写操作,在文件中搜索,关闭文件,创建目录以存储一系列文 件,列出目录内容,从目录中删除文件,等等。 磁盘或分区和它所包括的文件系统的种类有很大的关系。少数程序直接对磁盘或分区 的原始扇区进行操作,这可能会破坏文件系统。大部分程序基于特定文件系统进行操作,在 其他类型的文件系统中不能工作。一个分区或磁盘在作为文件系统使用前,需要进行初始 化,并将记录数据结构写到磁盘上。这个过程就称为文件系统的建立。 ·68· 下面介绍几种常见的文件系统类型。 1.FAT文件系统 FAT的英文全称是FileAlocationTable,即文件分配表,最早于1982年开始应用于 MS-DOS中。FAT文件系统主要的优点是允许多种操作系统访问,如MS-DOS 、Windows x、Wix、Wi3命名规则( 3. ndows9ndowsNT和OS/2等。这一文件系统在使用时遵循8.即 文件名最多为8个字符,扩展名为3个字符)。MSDOS 、Wids3.now -nowx和Wids95都使 用FAT16文件系统。 FAT文件系统也是一种最初用于小型磁盘和简单文件夹结构的简单文件系统,用文件 分配表映射和管理磁盘空间。它是专门为单用户操作系统开发的,不保存文件的权限信息, 除了隐藏、只读等公共属性以外,不具备高级别安全防护措施。FAT文件系统在磁盘的第 一个扇区保存其目录信息。当文件改变时,FAT必须随之更新,当复制多个小文件时,这种 开销就会变得很大。FAT16和FAT32能够管理的磁盘空间的大小不同。FAT16最大只 能支持2GB,而FAT32可达到2047GB 。 FAT32文件系统主要应用于Windows98系统,它可以增强磁盘性能并增加可用磁盘 空间。FAT32的一个簇要比FAT16小很多,所以可以节省磁盘空间。而且它支持2GB以 上的分区大小。默认情况下,Windows98也可以使用FAT16 。 2.NTFS文件系统 NTFS(NewTechnologyFileSystem,新技术文件系统)最早专用于WindowsNT/ 2000操作系统的文件系统。它支持文件系统故障恢复,尤其是大存储量的媒体和长文 件名。 NTFS是一个高度可靠、可恢复的文件系统,提供了FAT文件系统所没有的安全性、可 靠性和兼容性。它提供了文件加密功能,能够大大提高信息的安全性,可以赋予单个文件和 文件夹访问权限。它支持在大容量的硬盘上快速执行读、写和搜索等文件操作,支持文件系 统恢复等高级操作。NTFS为本地用户及网络上的远程用户都提供了文件和文件夹的安全 特性。在NTFS分区上,可以为共享资源、文件夹以及文件设置访问权限。 与FAT16和FAT32相比,NTFS的主要优点是:它通过使用相同卷大小条件下较小 的簇,从而更有效地利用磁盘空间。只要简单地将文件系统从FAT转换为NTFS,就可以 释放出几百兆字节(MB)的磁盘空间。 NTFS的主要弱点是只能被WindowsNT/2000及以后的操作系统所识别。虽然它可 以读取FAT文件系统和HPFS(HighPerformanceFileSystem,高性能文件系统)文件系 统的文件,但其文件却不能被FAT文件系统和HPFS文件系统所存取,因此兼容性较差。 WindowsNT支持FAT16 、NTFS文件系统,Windows2000支持FAT16 、FAT32和NTFS 文件系统。 3.2 Lnx文件系统架构 1.iu Linux操作系统的核心是内核,而文件系统则是操作系统与用户进行交互的主要工具。 不同的操作系统,其文件系统也不尽相同。例如,MS-DOS 、Windows95等操作系统采用的 是FAT16文件系统,Windows2000/NT等操作系统采用的是NTFS文件系统,SunSolaris 操作系统采用的是ZFS 、UFS文件系统。Linux操作系统采用的文件系统一般为Ext2、 ·69· Ext3和Ext4等。Ext是ExtendedFileSystem 的缩写,意为扩展的文件系统。 Linux作为开源操作系统,其最大的优势就是支持多种文件系统。现代Linux内核几 乎支持计算机系统中的所有文件系统。Linux操作系统从一开始就追求让用户能够使用多 个文件系统。事实上,用户在硬盘上使用一个或多个非Linux分区(如FAT32 或NTFS)的 情况并不少见,如果用户想在Linux操作系统中使用非Linux文件系统,就必须在操作系统 中挂载这些文件系统到Linux内核中。 Linux文件系统采用了分层结构,如图3-1所示。 图3-1Linux文件系统的分层结构 1. 设备驱动程序 文件系统需要利用存储设备来存储文件,因此,存储设备是文件系统的物质基础。除此 之外,Linux系统中的其他设备也作为文件,由文件系统统一管理。这些设备都由特定的设 备驱动程序直接控制,它们负责设备的启动、数据传输控制和中断处理等工作。 Linux系统中各种设备驱动程序都通过统一的接口与文件系统连接。文件系统向用户 提供使用文件的接口,设备驱动程序则控制设备实现具体的文件I/O操作。 2. 实际文件系统 实际文件系统是以磁盘分区来划分的,每个磁盘分区由一个具体的文件系统管理,不同 磁盘分区的文件系统可以不同。Linux系统支持多种文件系统,除了专为Linux设计的 Ext2/Ext3、JFS 、XFS 、ReiserFS 和NFS 之外,还支持以下文件系统:UNIX 系统的sysv、 ufs和bfs,Minix系统的minx和XIA,Windows系统的FAT16 、FAT32 和NTFS,以及 OS/2系统的hpfs,等等。这些文件系统都可以在Linux系统中工作。Linux默认使用的文 件系统是Ext2/Ext3/Ext4。 3. 虚拟文件系统 实际文件系统通常是为特定的操作系统专门设计的,各种文件系统具有不同的组织结 构和文件操作接口函数,相互之间往往差别很大。Linux为了屏蔽各个文件系统之间的差 别,为用户提供访问文件的统一接口,在具体的文件系统之上增加了一个称为虚拟文件系统 (VirtualFileSystem,VFS)的抽象层。 VFS 是Linux文件系统对外的接口。任何要使用文件系统的程序都必须经由这个接 口来使用它。VFS 是一个异构文件系统之上的软件粘合层。有时也把VFS 称为可堆叠的 文件系统(stackablefilesystem), 因为VFS 可以无缝地使用多个不同类型的文件系统,就 像把多个文件系统堆叠在一起一样。通过VFS,可以为访问文件系统的系统调用提供一个 ·70· 统一的抽象接口。VFS最早由Sun公司提出,以实现NFS(NetworkFileSystem,网络文件 系统),但是现在很多系统都采用了VFS(包括UNIX 、Linux、FreBSD 、Solaris等)。VFS 的原理如图3-2所示。 图3-2 VFS的原理示意图 虚拟文件系统运行在各个具体的文件系统之上,它采用一致的文件描述结构和文件操 作函数,使得不同的文件系统能够按照同样的模式呈现在用户面前。有了VFS,用户察觉 不到文件系统之间的差异,可以使用同样的命令和系统调用来操作不同的文件系统,并可以 在它们之间自由地复制文件。 VFS的作用就是采用标准的Linux系统调用读写位于不同物理介质上的不同文件系 统中的文件。VFS是一个可以让open、read、write等系统调用不必关心底层的存储介质和 文件系统类型就可以工作的粘合层。在MS-DOS操作系统中,要访问本地文件系统之外的 文件系统,需要使用特殊的工具才能进行。而在Linux中,通过VFS这个抽象的通用访问 接口屏蔽了底层的文件系统和物理介质的差异性。 每一种文件系统代码都隐藏了实现的细节。因此,对于VFS层和内核的其他部分而 言,每一种文件系统看起来都是一样的。在Linux中,VFS采用的是面向对象的编程方法。 Linux的VFS截取与文件系统有关的所有调用,为所有文件系统提供标准的接口或API 。 对于用户而言,在使用ls命令列出不同物理介质上的文件时,实际上是没有区别的。 在VFS的公共文件模型中,目录被看作包含其他文件和其他目录列表的文件。某些文 件系统(如FAT16 、FAT32和VFAT)在目录树中显示各个文件的存储位置。在这种情况 下,目录不是普通的文件。因此,在文件系统上执行操作的过程中,文件系统必须将目录的 视图动态建立为文件。显然,这样的视图实际上不是存储在文件系统中的,而是作为对象存 在于内核空间中的。 此外,Linux不会在实际的内核函数中执行与文件有关的系统调用。更确切地说,每个 read和icoctl都将转化为各个文件系统处理该文件专用的函数的指针。为了实现这一点, VFS的公共文件模型引入了公共文件系统控制块的概念,使各个文件系统与传统的UNIX 方法相互协调。这些控制块如下: (1)超级块结构。用于记录有关已装载的文件系统的信息。这个结构实际上匹配存储 在设备上的文件系统控制块。 (2)inode(信息节点)对象。用于记录关于特定文件的信息。这个对象通常指向设备 上的文件控制块。每一个这样的对象都有一个信息节点号码,该号码唯一地指向文件系统 ·71· 中的一个文件。 (3)file(文件)对象。用于记录目前打开的文件以及访问它的进程的信息。这个对象 只保留在内核中,并在关闭文件时消失。 (4)dentry(目录项)对象。它是目录项目与相关联的文件之间的连接信息。每个文件 系统都有这个对象的具体实现方式。 4. 缓存机制 文件系统和存储设备进行数据传输时,采用了缓存机制来提高存储设备的访问效率。 缓存区是在内存中划分的特定区域,每次从外部设备读取的数据都暂时存放在这里。下次 读取数据时,首先搜索缓存区。如果有需要的数据,则直接从这里读取;如果缓存区中没有, 则再启动存储设备,读取相应的数据。写入磁盘的数据也先放入缓存区中,然后再分批写入 磁盘中,使用缓存机制使得大多数数据传输都直接在进程的内存空间和缓存区之间进行,减 少了对存储设备的访问次数,提高了系统的整体性能。VFS 使用了内存缓存区、目录项缓 存以及inode缓存等机制,使得整个文件系统具有相当高的效率。 3.1.3 Ext2文件系统 Linux的Ext2文件系统和UNIX 使用的其他文件系统非常相似,但更接近于BSD 系 统所用的FFS(FastFileSystem,快速文件系统)。Ext2文件系统的特点是存取文件的性能 极好,对于中小型的文件更具优势,这主要得益于它的簇快取层的优良设计。其单一文件大 小与文件系统本身的容量上限以及簇的大小有关。在x86 计算机系统中,簇最大为4KB, 则单一文件大小上限为2048GB,而文件系统的容量上限为16384GB 。 Ext2文件系统采用了多重索引结构,用inode中的索引表描述,如图3-3所示。 图3-3 Ext2文件的多重索引结构 ·72· 索引表中前12 个表项是直接指针,直接指向文件的数据块,这些块称为直接块。第13 个 表项是一个一级间接指针,它指向一个索引块,这个索引块中存放的是间接索引表。索引表 的第14 项和第15 项提供了一个二次间接指针和一个三次间接指针,可提供对更多的间接 块的索引。提供多级间接指针的目的是为了表达大型文件的结构。 Ext2文件系统的默认块大小是1KB 。对于12KB 以下的小文件,不需要使用间接索 引,所有信息均在inode中,因此访问的速度非常快。较大的文件需要用到一个间接索引 表。一个间接索引表含有256 个间接指针,每个指针占4B,则1KB 的块可以容纳256 个指 针,可以索引256 个间接块。因此,大小为12~268KB 的文件需要一次间接索引,访问速度 会有所降低。而对于大型的文件,可以使用二次间接指针甚至三次间接指针,得到最大约 16GB 的文件。 Ext2的核心是两个内部数据结构,即超级块(superblock)和inode。 超级块是一个包含文件系统重要信息(例如标签、大小、inode的数量等)的表格,它是 对文件系统结构的基础性、全局性描述,因此,没有了超级块的文件系统将不再可用。由于 这个原因,Ext2文件系统中不同位置存放着超级块的多个副本。 inode是基本的文件级数据结构,文件系统中的每一个文件都可以在一个inode中找到 它的描述。inode描述的文件信息包括文件的创建和修改时间、文件大小、实际存放文件数 据的块列表等。对于较大的文件,块列表可能包含附加数据块列表的磁盘位置(即间接块), 甚至有可能出现二级或三级间接块列表。文件名字通过目录项(directoryentry,通常缩写 为dentry)关联到inode,目录项由文件名和inode构成。 图3-4展示了Ext2文件系统的数据结构。 图3-4 Ext2文件系统的数据结构 Ext2文件系统以引导扇区(bootsector)开始,紧接着是块组(blockgroup)。因为 inode表和存储用户数据的数据块(datablock)可以位于磁盘相邻位置,这样就可以减少 寻道的时间。为了性能的提升,整个文件系统被分为多个块组。一个块组由下面几项 组成: ·73· . 超级块:存储文件系统信息,必须位于每个块组的顶部。 . 块组描述符:存储块组的相关信息。 . 块位图:用于管理未使用的数据块。 .inode位图:用户管理未使用的inode。 .inode表:每个文件都有一个相应的inode表,用来保存文件的元数据,例如文件模 式、uid、gid、atime 、ctime 、mtime 、dtime 和数据块的指针。 . 数据块:存储实际的用户数据 。 每个块组组成的详细说明如下 。 1. 超级块 超级块描述整个分区的文件系统信息,例如块大小、文件系统版本号、上次挂载的时间 等。这些都是文件系统挂载、检查、分配、检索等操作的基本参数,是文件系统中最重要的数 据,如果超级块损坏,则整个分区的文件系统就不再可用。超级块在每个块组的开头都有一 个副本。 2. 块组描述符表 块组描述符表(GroupDescriptorTable,GDT)由很多块组描述符(groupdescriptor)组 成,整个分区分成多少个块组,就有多少个块组描述符。每个块组描述符存储一个块组的描 述信息,例如,在这个块组中从哪里开始是inode表,从哪里开始是数据块,空闲的inode和 数据块还有多少个,等等。和超级块类似,块组描述符表在每个块组的开头也都有一个副 本。这些信息是非常重要的,一旦块组描述符意外损坏,就会丢失整个块组的数据,因此它 有多个副本。通常内核只用到第0个块组中的块组描述符表,当执行e2fsck命令检查文件 系统一致性时,第0个块组中的超级块和块组描述符表就会复制到其他块组。这样,当第 0 个块组的开头意外损坏时,就可以用其他副本来恢复,从而减小损失。 3. 块位图 一个块组中的块是这样被利用的:数据块存储文件中的数据。例如,某个分区的块大 小是1024B,某个文件是2049B,那么就需要3个数据块,即使第三个块只存了1B,也需要占 用一个整块;超级块、块组描述符表、块位图、inode位图、inode表这几部分存储该块组的描 述信息。块位图(blockbitmap)是用来描述整个块组中哪些块已用、哪些块空闲的,它本身 占一个块,其中的每个二进制位代表本块组中的一个块,这个二进制位为1表示该块已用 , 这个二进制位为0表示该块空闲。 4.ide位图 ind位(o) ioima和块位图类似 , 其中每个二进制位表示一个 oe(n) 图(ndebtp) 本身占一个块 , inode是否空闲。 5.inode表 一个文件除了数据需要存储之外,一些描述信息也需要存储,例如文件类型(常规文件、 目录、符号链接等)、权限、文件大小、创建/修改/访问时间等。利用ls-l命令看到的那些信 息都保存在inode中,而不是数据块中。每个文件都有一个inode,一个块组中的所有inode 组成了ie表(e)。 nodinodetablinode表占多少个块在格式化时就已决定,并写入块组描述符中。格式化工具mke2fs 的默认策略是一个块组有多少个8KB 就分配多少个inode。由于数据块占整个块组的绝大 ·74 · 部分,也可以近似认为一个数据块有多少个8KB就分配多少个inode。换句话说,如果平均 每个文件的大小是8KB,当分区存满的时候inode表会得到比较充分的利用,数据块也不浪 费。如果这个分区保存的都是很大的文件,则数据块用完的时候inode会有一些浪费;如果 这个分区保存的都是很小的文件,则有可能数据块还没用完inode就已经用完了,数据块可 能有很大的浪费。如果用户在格式化时能够对这个分区以后要存储的文件大小做一个预 测,也可以用mke2fs的-i参数指定每多少字节分配一个inode。 6.数据块 数据块根据不同的文件类型有以下几种情况: .对于常规文件,文件的数据存储在数据块中。 .对于目录,其下的所有文件名和目录名存储在数据块中。文件名保存在它所在目录 的数据块中,除文件名之外,l命令看到的其他信息都保存在该文件的ie中。 ls-nod 目录也是一种文件,是一种特殊类型的文件,即目录文件。 .对于符号链接,如果目标路径名较短,则直接保存在inode中,以便快速查找;如果目 标路径名较长,则分配一个数据块来保存它。 设备文件、FIFO和socket等特殊文件没有数据块。设备文件的主设备号和次设备号 保存在inode中。 为了找到组成文件的数据块,内核首先查找文件的inode。当一个进程请求打开/var/ log/mesages时,内核解析文件路径并查找根目录的目录项,获得其下的文件及目录信息。 下一步,内核继续查找/var的inode并查看/var的目录项,它也包含其下的文件及目录信 息。内核继续使用同样的方法,直到找到指定文件的inode。Linux内核使用文件对象缓存 (如目录项缓存或inode缓存)来加快查找相应inode的速度。 当Linux内核找到文件的inode后,它将尝试访问实际的数据块。inode保存了数据块 的指针。内核通过指针可以获得数据块。对于大文件,Ext2提供了直接或间接的数据块参 照,如图3-5所示。 当建立一个新的文件时,Ext2文件系统要为它分配一个inode和一定数目的数据块; 当该文件被删除时,Ext2文件系统将回收其占有的inode和数据块;当该文件在读写过程 中增加或减少了内容时,Ext2文件系统也需要动态地为它分配和回收inode和数据块。 分配时根据inode位图和块位图的记录为文件分配inode和数据块。分配策略在一定程 度上决定了文件系统的整体效率。Ext2文件系统会尽可能把同一个文件所使用的块、同一个 目录所关联的inode存放在相邻的单元中,至少是在同一个块组中,以提高文件的访问效率。 另外,Ext2文件系统还采用了预分配机制来保证文件内容扩展时空闲块的分配效率。 在文件建立的时候,如果有足够的空闲块,就在相邻的位置为文件分配多于当前需要的块, 称为预分配块;当文件内容扩展时,优先使用预分配块,可以提高分配效率,也可以保证这些 块相邻。如果预分配块用完或者根本没有启动预分配机制,分配新块时也要尽可能保证与 原有块相邻。 3.1.4 Ubuntu的目录结构 无论何时,当前工作目录中的所有文件都是可以直接存储的,并且通过名字可以直接引 用文件。而对于非当前目录中的文件,必须在文件名之前加上各级目录构成的路径才能访 ·75· 图3-5Ext2文件系统直接或间接的数据块参照 问。文件的路径名指的就是从某个目录开始,穿过整个文件系统,直至到达目标文件而经过 的目录层次。例如,从根目录开始,中间经过usr和bin两级子目录到达find文件的路径就 是find文件的路径名,把上述访问路径写成Linux文件系统中的路径名就是/usr/bin/find。 每个目录中均包含以句点(.)和双句点( . )命名的两个特殊的目录文件,分别表示当前 目录及其父目录。这两个特殊目录把文件系统中的各级目录有机地联系在一起。“.”是当 前目录的别名,要访问当前目录中的文件时,都可以直接使用“.,(”) 而不必明确给出当前目录 名。“是(”) 当前目录的父目录的别名,从任何目录位置开始,都可以使用“. 逐(”) 层攀升到文件系统层(. ) 次结构的最上层。 路径名要么是由斜线字符分隔的一系列名字,要么是单个名字。在一系列名字中,最后 一个名字是实际的文件,其他名字均为目录。文件可以是任何类型的文件。 Linux文件系统采用树状分层结构,且只有一个根节点。与Windows一样,在Linux 中路径分为绝对路径和相对路径。 (1)绝对路径。指文件的准确位置且以根目录为起点。例如,/usr/game/gnect就是一 个绝对路径,表示位于/usr/game/下的四子连线游戏。 (2)相对路径。是相对于当前目录的一个文件或目录的位置,还以上面的/usr/game/ gnect为例,如果用户现在处于/usr中,只需要game/gnect就可以确定这个文件,而不需要 将根目录和usr目录写出。 同样,Ubuntu的目录众多,但所有目录都在根目录下,所以在安装时一定要有一个与 根目录对应的磁盘分区才能安装系统。有序的组织结构有助于用户访问、管理和维护 Ubuntu系统。Ubuntu的目录结构如图3-6所示。 Linux目录结构的描述如表3-1所示 。 ·76 · 图3-6 Ubuntu的目录结构 表3- 1 Linux目录结构的描述 描述 Linux文件系统的根目录 存放系统中最常用的可执行文件(二进制文件)。系统所需要的基本命令位于此目录下, 也是最小系统所需要的命令,例如ls、cp、mkdir等命令。/usr/bin目录中的文件是普通用 户可以使用的命令 存放Linux内核和系统启动文件,包括grub、lilo启动程序 存放所有设备文件,包括硬盘分区、键盘、鼠标、USB 、 ty等 存放系统所有配置文件,例如,pswd存放用户账户信息,htame存放主机名。/etc/ fstab用于开机自动挂载一些分区,(a) 在里面写入一些分区的信息,(n) (s) (o) 就能实现开机挂载分区 用户主目录的默认位置 存放启动时挂载inirimg映像文件以及所需设备模块的目录 td. 存放共享的库文件,包含许多被/bin和/sbin中的程序使用的库文件 在Et2或Et3文件系统中,当系统意外崩溃或意外关机时产生的一些文件碎片放在这里。在(x) 系统启动(x) 的过程中,k工具会检查这里,并修复已经损坏的文件系统。有时系统 f发生问题,很多文件被移到这(s) 个(c) 目录中,可以用手工的方式修复文件或将其移到原来的位 置上 在这个目录下自动创建即插即用型存储设备的挂载点。例如,U盘系统自动挂载后,会在 这个目录下产生一个目录;CD-ROM/DVD-ROM自动挂载后,也会在这个目录下创建一 个目录,存放临时读入的文件 通常用于作为被挂载的文件系统的挂载点 作为可选文件和程序的存放目录,有些自定义软件包也会被安装在这里,用户自己编译的 软件包也可以安装在这个目录中 存放所有标识为文件的进程,它们通过进程号或其他的系统动态信息进行标识。例如, CPU 、硬盘分区、内存信息等就存放在这里 根用户(超级用户)的主目录 存放涉及系统管理的命令,也就是root用户可执行的命令。这个目录和/usr/sbin、/usr/ X11R6/sbin、/usr/local/sbin目录是相似的 存放系统所提供的服务数据 ·77· 目录 / /bin /boot /dev /etc /home /initrd /lib /lost+found /media /mnt /opt /proc /root /sbin /srv 续表 目录 /sys /tmp /usr /var 描述 用于将系统设备组织成层次结构,并向用户提供详细的内核数据信息 临时文件目录。/var/tmp目录与之相似 用于存放与系统用户直接有关的文件和目录,如应用程序及支持系统的库文件。其主要 的子目录如下:/usr/X11R6:XWindow 系统。 /usr/bin:用户管理员的标准命令。 /usr/include:C/C++等开发工具语言环境的标准include文件。 /usr/lib:应用程序及程序包的链接库。 /usr/local:系统管理员安装的应用程序。 /usr/local/share:系统管理员安装的共享文件。 /usr/sbin:用户和管理员的标准命令。 /usr/share:使用手册等共享文件。 /usr/share/dict:词表的。 /usr/share/man:系统使用手册。 /usr/share/misc:一般数据。 /usr/share/sgml:SGML 数据。 /usr/share/xml:XML 数据 通常用于存放长度可变的文件,例如日志文件和打印机文件。其主要的子目录如下: /var/cache:应用程序缓存目录。 /var/crash:系统错误信息。 /var/games:游戏数据。 /var/lib:各种状态数据。 /var/lock:文件锁定记录。 /var/log:日志记录。 /var/mail:电子邮件。 /var/opt:/opt目录的变量数据。 /var/run:进程的标识数据。 /var/spool:存放电子邮件、打印任务等的队列。 /var/tmp:临时文件目录 注意 t、 :与Winds不同,在Ubutu中是严格区分大小写的。例如,文件Fiett, ownl.xFILE.txTXT 是3个不同的文件, FILE.在文件处理时要特别注意。 同时,还有与Windows不同的是,在Windows中后缀名是一个非常重要的标识符,是 根据后缀名来判断文件的类型并进行处理的。例如,c是一个C语言的源程序,而A. A.txt 是一个纯文本文件。而在Linux系统中,文件类型与后缀名是没有直接关系的。 3.创建、挂载与卸载文件系统 2 2.创建文件系统 3.1 在安装操作系统时,安装程序将会引导用户提供必要的数据或作出相应的选择,然后自 动划分磁盘分区,创建文件系统。在日常的应用过程中,仅当需要增加新盘或使用移动硬 盘,改变现有的磁盘分区结构时,才有可能需要自己手工创建文件系统。在磁盘等存储设备 ·78· 分区之后,即可着手创建文件系统。 创建文件系统时,主要有两种方法: (1)使用最基本的、通用的mkfs命令。在选定的磁盘分区中创建指定的文件系统。 (2)利用各种特定的工具,如mke2fs、mkfs.ext2或mkfs.vfat等,在选定的磁盘分区上 直接创建特定类型的文件系统。 创建文件系统时,最基本的方法是使用mkfs命令。在Linux系统中,mkfs命令实际上 只是各种文件系统创建程序的一个总控程序,根据指定的文件系统类型,mkfs将会调用特 定文件系统的创建程序mkfs.fs,其中fs可以是ext2、ext3或vfat等。因此,在创建一个具 体的文件系统时,可以使用特定的文件系统创建命令。例如,为了创建一个Ext2/Ext3文 件系统,可以直接使用mkfs.ex2或mkfs.ext3等命令,也可以使用等价的mke2fs命令。对 于Ext2/Ext3文件系统而言,mke2fs命令是最基本的工具。 用于创建Ext2/Ext3文件系统的mkfs与mke2fs命令的语法格式如下。 (1)mkfs命令: mkfs [-V][-t fstype][fs-options]device [size] (2)mke2fs命令: mke2fs [-c|-l filename][-b block-size][-f fragment-size] [-i bytes-per-inode][-I inode-size][-J journal-options] [-G meta group size][-N number-of-inodes] [-m reserved-blocks-percentage][-o creator-os] [-g blocks-per-group][-L volume-label][-M last-mounted-directory] [-O feature[,...]][-r fs-revision][-E extended-option[,...]] [-T fs-type][-U UUID][-jnqvFSV]device [blocks-count] 其中的主要参数说明如下: .-b:指定块大小,单位为字节。 .-c:检查是否有损坏的块。 .-f:指定不连续段的大小,单位为字节。 .-i:指定每多少字节创建一个inode。 .-N:指定要建立的inode数目。 .-L:设置文件系统的标签名称。 .-m:指定给管理员保留的块的比例,默认值为5%。 .-M:记录最后一次挂入的目录。 .-r:指定要建立的Ext2文件系统版本。 .-V:显示命令的版本号。 下面以一个例子来说明mkfs命令的执行过程。首先在虚拟机中添加一块512MB的 未分区硬盘。添加完毕后重启系统,然后利用fdisk-l命令查看新增硬盘的信息。其中 Disk/dev/sdb即为新增的硬盘,因为没有创建文件系统,所有没有包含任何有效的分区表。 user@user-desktop:~$sudo fdisk -l [sudo]password for user: ·79· Disk /dev/sda: 10.7 GB, 10737418240 bytes 255 heads, 63 sectors/track, 1305 cylinders Units =cylinders of 16065 * 512 =8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000e8668 Device Boot Start End Blocks Id System /dev/sda1 * 1 1244 9990144 83 Linux /dev/sda2 1244 1306 492545 5 Extended /dev/sda5 1244 1306 492544 82 Linux swap / Solaris Disk /dev/sdb: 536 MB, 536870912 bytes 64 heads, 32 sectors/track, 512 cylinders Units =cylinders of 2048 * 512 =1048576 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/sdb doesn't contain a valid partition table user@user-desktop:~$ 接下来使用mkfs-text2/dev/sdb命令对其进行创建文件系统的操作,以下为具体执 行过程: user@user-desktop:~$sudo mkfs -t ext2 /dev/sdb mke2fs 1.41.11 (14-Mar-2010) /dev/sdb is entire device, not just one partition! 无论如何也要继续? (y,n) y 文件系统标签= 操作系统: Linux 块大小=4096 (log=2) 分块大小=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 32768 inodes, 131072 blocks 6553 blocks (5.00%) reserved for the super user 第一个数据块=0 Maximum filesystem blocks=134217728 4 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304 正在写入inode 表: 完成 Writing superblocks and filesystem accounting information: 完成 This filesystem will be automatically checked every 28 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. user@user-desktop:~$ ·80· 最后要说明的是,在使用mkfs命令创建文件系统时,如果未使用-L选项指定文件系统 的卷标,在创建文件系统后,也可以使用e2label命令指定文件系统的卷标。e2label命令的 主要功能就是显示和命名未安装文件系统的卷标。 e2label命令的格式如下: e2label device [newlabel] 其中,device为磁盘分区的设备名称,例如/dev/sda6;newlabel表示文件系统的卷标。 如果未指定newlabel,e2label命令将输出文件系统的卷标。需要指出的是,卷标不能超过 16个字符。下面将刚才创建的文件系统的卷标命名为data1: $sudo e2label /dev/sdb $sudo e2label /dev/sdb data1 $sudo e2label /dev/sdb data1 3.2.2 挂载文件系统 在Ubuntu系统中,对于一个文件系统或分区而言,如果想要使用它,必须先对其进行 挂载操作。挂载就是把新建的文件系统安装到Linux文件系统目录层次结构的某个挂载点 上,然后才能使用新建的文件系统。也就是说,挂载点必须是目录,可以将挂载看成一个链 接动作。 例如,如果想使用/dve/sdb分区,需要对该分区进行读写数据的操作,但是不能直接对 其进行操作,需要建立一个目录,使用挂载操作建立它与分区的对应关系。而这个目录就代 表了/dve/sdb分区,挂载后对于目录的数据读写操作本质上就是对/dve/sdb分区的读写操 作。与之对应,卸载就是断开目录与/dve/sdb分区之间的对应关系,但并不删除目录, /dve/sdb分区也继续存在,如果要读写数据,需要再次进行挂载操作。 对于任何文件系统———FAT16/FAT32类型的DOS文件系统、NTFS类型的Windows文 件系统以及iso9660格式的CD/DVD等,都需要先进行挂载,然后才能使用。 挂载文件分区的命令是mount,详见第4章。可以通过mount命令查看当前系统的挂 载信息: user@user-desktop:~$mount /dev/sda1 on / type ext4 (rw,errors=remount-ro) proc on /proc type proc (rw,noexec,nosuid,nodev) none on /sys type sysfs (rw,noexec,nosuid,nodev) none on /sys/fs/fuse/connections type fusectl (rw) none on /sys/kernel/debug type debugfs (rw) none on /sys/kernel/security type securityfs (rw) none on /dev type devtmpfs (rw,mode=0755) none on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620) none on /dev/shm type tmpfs (rw,nosuid,nodev) none on /var/run type tmpfs (rw,nosuid,mode=0755) none on /var/lock type tmpfs (rw,noexec,nosuid,nodev) ·81· none on /lib/init/rw type tmpfs (rw,nosuid,mode=0755) binfmt_ misc on /proc/sys/fs/binfmt _ misc type binfmt _ misc (rw, noexec, nosuid, nodev ) gvfs- fuse- daemon on /home/user/.gvfs type fuse.gvfs - fuse - daemon (rw, nosuid, nodev ,user=user) user@user-desktop:~$ 可以看到,刚才建立的512MB硬盘分区/dev/sdb并未挂载,因此无法使用。下面将建 立data1目录,并将/dev/sdb挂载到data1目录下: user@user-desktop:~$sudo mkdir /data1 user@user-desktop:~$sudo mount /dev/sdb /data1/ 挂载完毕后,再次使用mount命令查看挂载信息,可以看到,分区/dev/sdb已经被挂载 到data1目录下。 user@user-desktop:~$mount /dev/sda1 on / type ext4 (rw,errors=remount-ro) proc on /proc type proc (rw,noexec,nosuid,nodev) none on /sys type sysfs (rw,noexec,nosuid,nodev) none on /sys/fs/fuse/connections type fusectl (rw) none on /sys/kernel/debug type debugfs (rw) none on /sys/kernel/security type securityfs (rw) none on /dev type devtmpfs (rw,mode=0755) none on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620) none on /dev/shm type tmpfs (rw,nosuid,nodev) none on /var/run type tmpfs (rw,nosuid,mode=0755) none on /var/lock type tmpfs (rw,noexec,nosuid,nodev) none on /lib/init/rw type tmpfs (rw,nosuid,mode=0755) binfmt_ misc on /proc/sys/fs/binfmt _ misc type binfmt _ misc (rw, noexec, nosuid, nodev) gvfs- fuse- daemon on /home/user/.gvfs type fuse.gvfs - fuse - daemon (rw, nosuid, nodev,user=user) /dev/sdb on /data1 type ext2 (rw) user@user-desktop:~$ 还可以通过查看/etc/mtab文件获得挂载信息。具体操作如下: user@user-desktop:/$cat /etc/mtab /dev/sda1 / ext4 rw,errors=remount-ro 0 0 proc /proc proc rw,noexec,nosuid,nodev 0 0 none /sys sysfs rw,noexec,nosuid,nodev 0 0 none /sys/fs/fuse/connections fusectl rw 0 0 none /sys/kernel/debug debugfs rw 0 0 none /sys/kernel/security securityfs rw 0 0 none /dev devtmpfs rw,mode=0755 0 0 none /dev/pts devpts rw,noexec,nosuid,gid=5,mode=0620 0 0 none /dev/shm tmpfs rw,nosuid,nodev 0 0 ·82· none /var/run tmpfs rw,nosuid,mode=0755 0 0 none /var/lock tmpfs rw,noexec,nosuid,nodev 0 0 none /lib/init/rw tmpfs rw,nosuid,mode=0755 0 0 binfmt_misc /proc/sys/fs/binfmt_misc binfmt_misc rw,noexec,nosuid,nodev 0 0 gvfs-fuse-daemon /home/user/.gvfs fuse.gvfs-fuse-daemon rw,nosuid,nodev,user= user 0 0 /dev/sdb /data1 ext2 rw 0 0 user@user-desktop:/$ 在data1目录下建立测试目录testdir,并用ls-l查看目录信息,可以看到挂载成功,目 录被正确建立。 user@user-desktop:/$sudo mkdir /data1/testdir user@user-desktop:/$ls -l /data1/ 总计20 drwx------2 root root 16384 2012-05-01 00:44 lost+found drwxr-xr-x 2 root root 4096 2012-05-01 01:08 testdir user@user-desktop:/$ 3.2.3 卸载文件系统 卸载文件系统意味着把文件系统从挂载点移走,删除/etc/mtab文件中的挂载项。在 文件系统的管理与维护工作中,有些工作只能在未挂载的文件系统中执行,因此需要进行卸 载文件系统的操作。此外,当不再需要临时挂载的文件系统时,也应及时进行卸载操作,避 免数据的误操作。 要卸载的文件系统必须处于空闲状态。一般来说,不能卸载一个尚处于工作中的文件 系统。也就是说,当用户正在访问文件系统中的某个目录,或者进程打开了文件系统中的某 个文件,或者文件系统正处于共享状态时,就无法卸载文件系统。卸载文件系统的命令是 umount。 下面卸载刚才挂载的文件系统/dev/sdb,具体操作如下: user@user-desktop:/$sudo umount /dev/sdb user@user-desktop:/$mount /dev/sda1 on / type ext4 (rw,errors=remount-ro) proc on /proc type proc (rw,noexec,nosuid,nodev) none on /sys type sysfs (rw,noexec,nosuid,nodev) none on /sys/fs/fuse/connections type fusectl (rw) none on /sys/kernel/debug type debugfs (rw) none on /sys/kernel/security type securityfs (rw) none on /dev type devtmpfs (rw,mode=0755) none on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620) none on /dev/shm type tmpfs (rw,nosuid,nodev) none on /var/run type tmpfs (rw,nosuid,mode=0755) none on /var/lock type tmpfs (rw,noexec,nosuid,nodev) none on /lib/init/rw type tmpfs (rw,nosuid,mode=0755) ·83· binfmt_ misc on /proc/sys/fs/binfmt _ misc type binfmt _ misc (rw, noexec, nosuid, nodev) gvfs- fuse- daemon on /home/user/.gvfs type fuse.gvfs - fuse - daemon (rw, nosuid, nodev,user=user) user@user-desktop:/$ 可以看到,文件系统已经被卸载。查看/etc/mtab文件可以得到同样的结果。 user@user-desktop:/$cat /etc/mtab /dev/sda1 / ext4 rw,errors=remount-ro 0 0 proc /proc proc rw,noexec,nosuid,nodev 0 0 none /sys sysfs rw,noexec,nosuid,nodev 0 0 none /sys/fs/fuse/connections fusectl rw 0 0 none /sys/kernel/debug debugfs rw 0 0 none /sys/kernel/security securityfs rw 0 0 none /dev devtmpfs rw,mode=0755 0 0 none /dev/pts devpts rw,noexec,nosuid,gid=5,mode=0620 0 0 none /dev/shm tmpfs rw,nosuid,nodev 0 0 none /var/run tmpfs rw,nosuid,mode=0755 0 0 none /var/lock tmpfs rw,noexec,nosuid,nodev 0 0 none /lib/init/rw tmpfs rw,nosuid,mode=0755 0 0 binfmt_misc /proc/sys/fs/binfmt_misc binfmt_misc rw,noexec,nosuid,nodev 0 0 gvfs-fuse-daemon /home/user/.gvfs fuse.gvfs-fuse-daemon rw,nosuid,nodev,user= user 0 0 user@user-desktop:/$ 再次用ls-l查看data1目录,会发现testdir目录已经不存在了,说明卸载成功。 user@user-desktop:/$ls -l /data1/ 总计0 user@user-desktop:/$ 本章小结 本章介绍了Linux的文件系统以及Ubuntu的文件系统中的目录结构。对于文件系统 的具体使用,以创建文件系统、挂载文件系统和卸载文件系统为例进行了说明。 实 验 3 题目:文件系统的创建、挂载和卸载。 要求: (1)在虚拟机中增加一个新硬盘,利用mkfs命令为它创建一个文件系统。 (2)将它挂载到data1目录下。显示挂载后的结果。 (3)卸载该文件系统。显示卸载后的结果。 ·84· 习 题 3 .什么是文件系统 ? .什么是文件目录? 文件目录包括哪些具体内容 ? .比较下面几种文件系统的不同:FAT16 、FAT32 、NTFS 。 .Linux系统可以支持哪些文件系统类型? 其中默认的是什么文件系统类型 ? .什么是虚拟文件系统 ? .什么是绝对路径、相对路径 ? .详细解释Ubuntu系统的目录结构中各部分的主要功能 。 .如何创建、挂载、卸载文件系统 ? ·85· 第4章Linux常用命令 Linux系统提供了一整套十分完备的命令,利用这些命令可以高效地完成所有的操作 任务。使用命令方式进行操作,具有比图形化操作更加快捷高效的特点,但是命令方式不够 直观,需要用户熟练掌握命令的用法、格式以及选项和参数等内容,只有通过不断使用才能 得心应手。 4.iux命令 1 Ln 4.1 Shl 程序的启动 1.e 要使用命令,必须先启动Shel 程序。当用户成功登录字符终端后,Shel 也同时启动。 当用户登录到图形桌面后,在系统中找到终端即可启动Shel 。例如,对于Ubut04 nu18. LTS桌面系统,用户可以通过使用Ctrl+Alt+T组合键启动Shel 。或者,可以单击桌面左 侧下角的显示应用程序图标 ,在搜索栏输入terminal,单击“搜索”按钮,系统会自动搜索 出终端并启动它,同时,左侧dock面板上也将出现终端图标 户可以在此时右击左侧dock面板上的终端图标 。为了方便后续的使用,用 ,在快捷菜单中选择“添加到收藏夹”命 令,把终端图标添加至dock面板内。这样,以后在需要使用终端时,直接单击dock面板上 的终端图标即可。 终端提供了在图形环境下运行的字符命令行界面。Shel 启动后,显示命令提示符,普 通用户默认的提示符是$,root用户默认的提示符是#。普通用户的Shel 启动界面如 图4-roe 1所示,ot用户的Shl 启动界面如图42所示。 图4-1 普通用户的Shel 启动界面 图4-2root用户的Shel 启动界面 ·86· 4.1.2 命令的格式 Shell命令是由命令名和多个选项以及参数组成的,各部分之间用空格分隔。Shell命 令是严格区分大小写的,因此,在使用Shell命令时应特别注意。 Shell命令的格式如下: 命令名 [-选项…][参数…] 命令名是命令的名称,通常为小写。选项是以“-”(减号)作为前缀的,减号代表选项的 开始。一个命令可能会有多个选项,可以单独使用,也可以组合使用。 4.2 目录操作基本命令 4.2.1 ls命令 ls命令是最常用的命令之一。它与MS-DOS系统的dir命令类似,用户可以利用ls命 令查看某个目录下的所有内容。默认情况下,显示的条目按字母顺序排列。 【功能】 列出当前目录下的所有内容。ls是list的缩写。 【格式】 ls [选项] [文件名或目录名] 【说明】 各选项的作用如表4-1所示。 表4-1 ls命令各选项的作用 选 项作 用 -s 显示每个文件的大小 -S 按文件的大小排序 -a 显示目录中的全部文件,包括隐藏文件 -l 使用长列表格式,显示文件详细信息 -t 按文件修改的时间排序显示 -F 显示文件类型描述符。例如,*为可执行的普通文件,/为目录文件 在使用ls命令显示文件及目录的信息时,会发现文件及目录列表中有多种颜色出现。 Linux中不同的颜色代表不同的含义。 . 黑色(默认色)代表普通文件。 . 绿色代表可执行文件。 . 红色代表tar包文件,即Linux下的压缩打包文件。 . 蓝色代表目录文件,即一个目录,在Windows中称为文件夹。 . 水红色代表图像文件。 . 青色代表链接文件,此类文件相当于快捷方式。 . 黄色代表设备文件,即一个设备。 ·87·