认识文件系统——转载

来源: ChinaUnix博客
 
文件系统形成了 Linux系统上所有数据的基础,Linux程序、库、系统文件和用户文件都驻留在文件系统上,因此对文件系统的适当管理是很重要的。 
    8.4.1 文件系统的目录结构
    在 Linux下,用户所见到的文件空间是基于树状结构的,树的根在顶部。在这个空间中的各种目录和文件从树根向下分支,顶层目录(/)被称为根目    录,图11-1给出了树形结构的图例。
    Linux操作系统由一些目录和许多文件组成。根据用户选择的安装不同,这些目录可能是不同的文件系统。通常,大多数操作系统都驻存在两个文件系统上:即称为/的根文件系统和安装在/usr下的文件系统。
    如果你用 cd /命令将当前目录改变到根目录,并用ls命令列出目录清单,你就会看到一些目录。这些目录组成了根文件系统的内容,它们也为其他文件系统提供了安装点。
    /bin目录包含称为二进制( binary)文件的可执行程序 (事实上,名为/bin的目录是 binary的缩写)。这些程序是必需的系统文件,许多 Linux命令(如 ls)放在该目录中。
    /sbin目录也用于存储系统二进制文件。这个目录中的大多数文件用于管理系统。
    /etc目录非常重要,它包含许多Linux系统配置文件。从本质上说,这些文件使你的Linux系统具有自己的个性。口令文件(口令)就放在这里,在启动时安装的文件系统列表( fstab)也放在这里。另外,这个目录还包括 Linux的启动脚本、你想要永久记录的、带 IP地址的主机列表和许多其他类型的配置信息。
    /lib目录中存储着程序运行时使用的共享库被存储在此。通过共享库,许多程序可以重复使用相同的代码,并且这些库可以存储在一个公共的位置上,因此能减小运行程序的大小。
    /dev目录包含称为设备文件的特殊文件,这些文件用于访问系统上所有不同类型的硬件。例如,/dev/mouse文件是用于读取鼠标输入的。通过用这种方法组织对硬件设备的访问,Linux有效地使硬件设备的接口看起来就象一个文件。这意味着在许多情况下,你可以用对软件使用的相同语法来对计算机的硬设备进行操作。例如,为了在软盘驱动器上建立你的起始目录的磁盘档案,你可以使用下面的命令:
    tar-cdf/dev/fd0~ tackett
    /dev目录中的许多设备都放在逻辑组中,表11-1列出了/dev 目录中一些最常用的设备。
设备文件
描述
/dev/console
系统控制台,它是与Linuxmso-hansi-font-family: "Times New Roman"">系统实际连接的计算机显示器
/dev/hd
IDE硬盘驱动器的设备驱动程序接口。/dev/hdal设备指在硬盘驱动hda上的第一个分区,设备/dev/hda指整个硬盘 had。
/dev/sd
SCSI磁盘的设备驱动程序接口。 SCSI磁盘和分区使用与IDE/dev/hd设备相同的约定。
/dev/fd
提供支持软盘的设备驱动程序。/dev/fd0是第一个软盘驱动器,/dev/fd1是第二个软盘驱动器。
/dev/st
SCSI磁带驱动器的设备驱动程序
/dev/tty
为用户输入提供不同控制台的设备驱动程序。它的名字来源于实际挂接到 UNIX系统的、被称为电传打字机(teletype)的终端。在Linux下,这些文件提供对虚拟控制台的支持,可以通过按<Alt-F1>到<Alt-F6>键来访问这些虚拟控制台。这些虚拟控制台提供独立的、同时进行的本地登录对话过程
/dev/pty
支持伪终端的设备驱动程序,伪终端用于远程登录进程,如使用Telnet的远程登录
/dev/ttyS
计算机的串行接口。/dev/ttySO对应MS-DOS下的 COM1。如果有一个串行鼠标,/dev/mouse是对连接了鼠标的ttyS设备的符号链接。 
/dev/cua
与调制解调器一起使用的特殊呼出设备。
/dev/null
数据将永远丢失。如果你想要运行一个命令并丢弃标准输出或标准错误输出,那么这个设备是非常有用的。而且,如果用/dev/null作为一个输人文件,则会建立一个长度为零的文件。
表8-2 /dev目录中一些最常用的设备
    /proc 目录实际上是一个虚拟文件系统,它被用于从内存中读取处理信息。
    /tmp目录用于存储程序运行时生成的临时文件。如果你有一个程序,它会生成许多大的临时文件,那么你可能想把/tmp目录作为一个独立文件系统来安装,而不是只把它作为根文件系统上的一个目录。如果把/tmp作为根文件系统上的一个目录,并且有许多大文件要写入其中,那么根文件系统的空间就会用尽。
    /home目录是用户起始目录的基础目录。通常把它作为一个独立的文件系统来安装,这样用户就能有大量用于自己文件的空间。事实上,如果系统上有许多用户,则可能需要把/home分成几个文件系统。为此,需要建立子目录,如用/home/staff和/home/admin目录分别作为公司职员和管理人员的子目录。把每一个这样的子目录做为不同的文件系统来安装,然后在其下建立用户的起始目录。
    /var目录保存要随时改变大小的文件。通常,各种系统记录文件都放在这个目录下。
    /usr目录及其子目录对 Linux系统的操作是非常重要的。它包含这样一些目录,这些目录中保存系统上的一些最重要的程序。通常,/usr的子目录包含你安装的大型软件包。
子目录
描述
/usr/bin
这个目录保存许多在Linux系统上能找到的可执行程序。
/usr/etc
这目录包含许多各种各样的系统配置文件。
/usr/include
这个目录及其子目录是存放 C编译程序的所有包含文件的地方。这些头文件定义常量和函数,对 C编程是重要的。
/usr/g++-include
这个目录包含 C十十编译程序的包含文件。
/usr/lib
这个目录包含程序在链接时使用的各种库。
/usr/man
这个目录包含Linux系统上的程序的各种联机帮助。在/usr/man下是一些与联机帮助的不同段相对应的子目录。
/usr/src
这个目录包含保存系统的不同程序的源代码的目录。如果你得到了一个想要安装的软件包,那么/usr/src/packagename是安装该包前放置源代码的好地方。
/usr/local
这个目录用于存放系统的本地定制内容。通常,许多本地软件安装在这个目录的子目录中。这个目录的格式在几乎你所见到的每—个UNIX系统上都不相同。建立此目录的一种方法是:为二进制文件建立一个/usr/local/bin目录;为配置文件建立一个/usr/local/etc目录;为各种库建立一个/usr/local/lib目录;为源代码建立一个/usr/local/src目录。如果要使/usr/local具有许多空间的话,则可把整个/usr/local目录树作为一个独立的文件系统来安装
表8-3 /usr文件系统中重要的子目录
    应当引起大家注意的是Linux文件系统这个词有两个不同且经常是相互矛盾的含义:一个含义是磁盘和磁盘机制的文件系统,另一个含义是用户看得见并能操作的逻辑文件系统。本章讨论用户看得见并能操作的逻辑文件系统。另外,如果用户熟悉如 MS-DOS和 OS/2这样的 PC操作系统的话,那么就会发现下面许多话题都是熟悉的,这是因为2.0版本以上的 MS-DOS的文件结构都是模仿UNIX的文件结构的,而 UNIX的文件结构也是 Linux使用的文件结构。
    Linux中的每个实际的实体和逻辑实体在Linux文件系统中都用文件来表示。实际的实体包括磁盘、打印机和终端,逻辑实体包括目录、存储文档和程序的普通文件。
    8.4.2 了解文件名和路径名
    就象在 MS-DOS等其他操作系统中一样,在Linux系统中必须区分文件名和路径名。一个文件名由字母、数字和某些标点符号组成的简单串组成,文件名中不能包含空格或作为字段分隔符的任何字符。例如,文件名 johns.letter是正确的,而 johns letter则是不正确的。文件名中不应包含任何对shell来说有特殊含义的字符。这些特殊字符如下所示:
    ! @ # $ % ~ & * () [] {} ' " \/ | ;<> `
    另外,文件名中不能包含“/”符号,因为这个符号用于指示路径名。
    早期的大多数 UNIX版本把文件名限制在14个字符内,但 Linux允许一个文件名有256个字符。有些最近的 UNIX版本(如Berkeley版本( BSD))允许64个字符的文件名,但是只有前14个字符是有效的。由于 Linux的目标之一是可移植,所以为了书写可移植程序和 shell脚本,你应该把文件名限制在14个字符以内。
    路径名可以有任意多个字符。在Linux中,文件不是存在于真空中的,而是存在于目录中。关于目录的知识,我们已在上一节作了比较详细的介绍。Linux中的最高层目录是根目录,用斜杠符号(/)标记,如果一个名为fred的文件存在于根目录下,它的绝对路径名就是/fred。当用 adduser命令向系统添加新用户时,新用户分配到一个起始目录。按常规,该起始目录通常建在根目录下一个名为home的目录中。如果一位名为 Fred的用户被分配了一个名为/home/fred的目录,那么Fred建立的所有文件都置于/home/fred目录中。 Fred的某个文件的绝对路径名可能是/home/fred/freds. file。绝对路径名准确地指出了在文件系统的什么地方能找到文件。
    另一种路径名是相对路径名,它明确地指出了文件相对于当前目录的位置。如果Fred在他的起始目录中,那么文件名freds. file是一个相对于当前目录的相对路径名。为了找出哪个目录是当前目录,可以使用 pwd 命令(打印工作目录)。也可以用 echo$PWD命令检查环境变量 $PWD 的内容,以查看哪个目录是当前的工作目录。
    通过使用两个建在所有目录下的别名,你可用相对路径名来定义在 Linux文件系统任何地方的文件。—个点(.)指当前目录;两个点(..)指父目录。 MS-DOS和OS/2使用与此相同的约定。
    大多数 Linux命令按路径名操作。在大多数情况下,你使用的路径名是当前目录中的某个文件名,默认的路径名指向你的当前目录。如果Fred在他的起始目录(/home/fred)中,下面的三种方式都是等价的:
    command freds.letter
    command/home/fred/freds. letter
    d./freds. letter
 8.4.3 Linux的文件类型
    Linux只有四种基本的文件类型:普通文件、目录文件、连接文件和特殊文件。
    可以用file命令来确定文件的类型,它可以识别文件类型属于可执行文件还是文本文件、数据文件等等。许多 UNIX命令只是 shell脚本,或者是与 MS-DOS的批处理文件相似的解释执行的程序,可用 file命令来报告一个 UNIX命令是一个二进制的可执行程序还是一个简单的shell脚本;也可用该命令来确定文件是不是文本文件,即是否能浏览或编辑该文件。这个命令的语法是:
    file [-vczL] [-f namefile] [-m magicfile] filelist
    下表对file命令中的参数作了说明。
参数
描述
-c
打印输出magic文件(/usr/lib/magic)的语法分析形式,该参数是个二进制文件第一部分中的一个数值,这个数值标识了该文件的类型。它通常与-m一起使用,用于在安装一个新的magic文件之前对该文件进行调试
-z
查看压缩文件内部并试图找出该文件的类型
-L
引起后续的符号连接
-f namefile
告诉file,要识别的文件列表在文本文件namefile中。当需要识别许多文件时,该参数是很有用的
-m magicfile
指定用于确定文件类型的magic数字的一个替代文件。默认文件是/usr/lib/magic
filelist
列出想知道其类型的、以空格分隔的一组文件
表8-4 file命令的参数
    8.4.3.1 普通文件
    普通文件是用户大部分时间都在进行操作的文件。普通文件包括文本文件、 C语言源代码、shell脚本(由 Linux shell解释的程序)、二进制的可执行程序和各种类型的数据。对比Linux来说,文件就是文件,Linux要知道的文件之间唯一区别是它是不是可执行文件。可执行文件可以直接执行,当然,这种文件应该含有要执行的内容,并且这种文件要在你的查找路径中。查找路径是你事先指定的路径名列表,Linux查找该路径名列表以找到可执行文件。可执行文件是二进制文件(也就是说,它包含可执行机器代码)和 shell脚本的文件。前面讨论过的 Linux的 file命令查看文件中的数据并对其内容进行合理的推测,如果你键入file*,你可能会看到类似于下面的内容:
    INSTALL: symbolic link to/var/adm
    ghostvw.txt:ascii text
    linux :symbolic link to/usr/src/linux
    mbox:mail text
    mterm.txt: English text
    seyon.txt: English text
    xcalc. txt: English text
    xclock.txt: English text
    xeyes. txt: English text
    xgrap. txt: English text
    xlock.txt: English text
    xsprea. txt: English text
    xtriss. txt: empty
    第一列中提到的所有文件都是普通文件,它们包含不同的数据类型,所有文件都置于file命令能被执行的那个目录中。
        8.4.3.2 目录文件
    目录也是文件,它们包含文件名和子目录名,并包含指向那些文件和子目录的指针。目录文件是Linux存储文件名的唯一地方,当你用ls命令列出一个目录的内容时,你所做的事只是列出了这个目录文件的内容,还没有触及文件本身。
    当你用 mv命令对存在当前目录中的一个文件重新命名时,你所做的事只是改变了该文件在目录文件中的条目。如果你把一个文件从一个目录移到另一个目录中,你所做的事只是把这个文件的说明从一个目录文件移到另一个目录文件中,当然,这要求新的目录在同一实际的磁盘上或在同一分区上。如果不是这样的话,Linux把该程序的每一个字节都实际地拷贝到另—磁盘上。
        8.4.3.3 目录与实际磁盘
    Linux系统中的每个文件都被赋予一个唯一的数值,这个数值称做索引节点。索引节点存储在一个称作索引节点表< inode table>中,该表在磁盘格式化时被分配。每个实际的磁盘或分区都有其自己的索引节点表。一个索引节点包含文件的所有信息,包括磁盘上数据的地址和文件类型。文件类型包括如普通文件、目录和特殊文件这样的信息。
    Linux文件系统把索引节点号 1赋于根目录,这给予 Linux的根目录文件在磁盘上的地址。根目录文件包括文件名、目录名及它们各自的索引节点号的列表,Linux可以通过查找从根目录开始的一个目录链来找到系统中的任何文件。根目录文件的内容可能像下面这样:
    1
    1 . .
    45 etc
    230 dev
    420home
    123.profile
    注意文件.(点)和..(双点)在目录中的含义。因为这是根目录,所以“.”和它的父目录“..”是相同的,而在/hom目录文件中它们的内容则不同:
    420.
    1 . .
    643 fred
    注意,当前目录(.)的索引节点与建在根目录文件中的/home的索引节点相同,父目录(..)的索引节点与根目录的索引节点相同。
    Linux通过上下连接目录文件系统来驾驭其文件系统。如果你想把文件移到另一实际磁盘的目录中,则Linux通过读取索引节点表来检测这种行动。在这种情况下,文件在被从原来的位置删除前,实际移动到新磁盘上并被赋予了该盘上的一个新的索引节点。
    与使用 mv命令一样,当你用 rm命令删除文件时,你也不能触及文件本身。取而代之的是,Linux标记该索引节点是自由的并把它放回可供使用的空闲索引节点表中,目录中的该文件的条目被擦除。
        8.4.3.4 连接
    普通的连接实际上根本不是文件,它们只是指向同一索引节点的那些目录条目。索引节点表记录一个文件有多少个连接;只有当最后一个目录引用被删除时,该索引节点才最终被释放回空闲表中。显然,普通的连接不能跨越设备界线,因为所有的目录条目都指向同一个索引节点。
    Linux及大多数 UNIX的现代版本都有另一种连接,称为符号连接。对于这种连接,这个目录条目包含一个文件的索引节点(该索引节点本身又是对Linux逻辑文件系统上某处的另一个文件的引用)。一个符号连接可以指向同一磁盘或另一磁盘上的另一个文件或目录,也可以指向另一台计算机上的一个文件或目录。普通连接与符号连接之间一个主要的差别是:使用普通连接,每个连接都有同等的地位(也就是说,系统把每个连接都看作是原始文件),并且在文件的最后一个连接被删除之前,实际的数据不会被删除;使用符号连接,当原始文件被删除时,所有对该文件的符号连接也都被删除,符号连接的文件没有与原始文件相同的地位。
    除了连接与文件之间的这些细微的差别外,你可像直接访问文件那样对待和准确地访问 连接。
    你可用 ls-l命令来看出某个文件是一个连接文件,因为该命令的回应显示了这个本地文件名,接着指示了被连接的文件:
    lrwxrwxrwx 1 root root 4 Oct l7 15:27 Info-> info/
    为了指示该文件是一个连接文件,文件权限标志以l开头。
        8.4.3.5 特殊文件
    每个与Linux系统相连的实际设备(包括磁盘、终端和打印机),都在文件系统中表示出来。大多数设备都放在/dev目录中。例如,如果你正在系统控制台( console)上工作,那么你的相关设备就叫/dev/console。如果你正在标准终端上工作,那么你的设备名可能是/dev/tty01。终端或串行线都称为 tty设备(它代表电传打字机,电传打字机是最初的UNIX(终端)。为了确定你的 tty设备叫什么名字,键人 tty命令,系统会显示你所连接的设备的名字。
    打印机和终端称作特殊字符设备,它们可接受和产生字符流。另一方面,磁盘把数据存储在由柱面和扇区编址的块中,你不能只访问磁盘上的一个字符,你必须读写整个块。对于磁带通常也是这样的,这种类型的设备称作特殊块设备。对更复杂的情况,磁盘和其他特殊块设备必须能像面向字符的设备那样工作,因此每个特殊块设备都有一个与之匹配的特殊字符设备。 Linux通过读取要送到字符设备的数据并为特殊块设备转换这些数据来实现这个转换过程,这一过程不需要你做任何事。
    至少还有另一种类型的特殊设备你可能遇到,即称为管道的FIFO(先入先出缓冲区)。 FIFO看起来像普通文件,如果你向里写入,它们就增长;如果你从FIFO读出,它的大小就会缩减。 FIFO主要用于系统进程中,以允许众多程序向一个单一的控制进程发送信息。例如,当你用 lp命令打印一个文件时, lp命令建立打印进程并通过向一个 FIFO发送信息来通知 lpsched守护程序。守护程序是一个不用用户要求就执行的系统进程。
    —个非常有用的特殊设备文件是位存储桶( bit bucket)/dev/null,你送入/dev/null的任何东西都被忽略,当你不想看到命令的输出结果时,它是很有用的。例如,如果你不想看到打印在标准错误设备上的任何诊断报告,你就可以用下列命令把它们放人位存储桶中:
    ls-la> /dev/null
    8.4.3.6 文件权限
    Linux中的文件极限的含义比你在文件或目录上所拥有的权限的含义多。虽然权限决定谁能读、写或执行一个文件,但它们也决定这个文件的类型及如何执行这个文件。
    可以用长格式的列表命令 ls-l来显示一个文件的权限。-l选项告诉 ls命令使用长格式的列表,如果你键人 ls-l,则你可能看到像下面这样的目录列表:
    drwx------2 sglines doc 512 Jan 1 13:44 Mail
    drwx------5 sglines doc lO24 Jan 17 08:22 News
    -rw------1 sglines doc 1268 Dec 7 15:01 biblio
    drwx------2 sglines doc 512 Dec 15 21:28 bin
    -rw------1 sglines doc 44787 Oct 20 06:59 books
    -rw------1 sglines doc 23801 Dec 14 22:50 bots.msg
    -rw-r-----1 sglines doc 105990 Dec 27 21:24 duckie.gif
    该列表几乎显示了目录条目和文件的索引节点所包含的与文件有关的所有信息。
    第一列显示文件的权限,
    第二列显示对一个文件(或一个目录中的附加块)的连接数量,
    第三列显示谁拥有该文件,(所有权有三种可能:所有者、所有者的组和其他人。)
    第四列显示文件所属的组,
    第五列显示文件中的字节数,
    第六列显示文件创建的日期和时间,
    第七列显示文件本身的名字。
    权限字段(第—列)分为四个子字段:
    -rwx rwx rwx
    第一个子字段定义文件的类型。普通文件以连字符(-)作为占位符,目录用一个 d标记。
    下表显示了文件类型子字段的权限值。
    字符     含义
    -       普通文件
    b       特殊快文件
    c       特殊字符文件
   d       目录
    l       符号连接
    表8-5 文件类型子字段的有效条目
    接下来的三个子字段显示文件的读、写和执行权限。例如,这三个子字段中的第一个子字段的rwx是说所有者对文件有读、写和执行权限。这三个子字段中的第二个子字段是说拥有该文件的组对文件有读、写和执行权限,第三个子字段显示其他人的权限。
    这些权限字段可以显示更多的信息。事实上,有几种属性包含在这三个字段内。可惜,这些属性的含义是由你所使用Linux的版本及文件是否是可执行文件来决定的。
   8.4.4 文件系统的管理
        8.4.4.1 安装文件系统

    首先介绍有关文件系统的一些概念。在一个文件系统被访问之前,它必须安装(mount)在某个目录下。例如:如果在软盘上有一个文件系统,则必须将它安装到某个目录下,比如mnt,以便能够访问其上的文件。安装了文件系统后,该文件系统的所有文件都会显示在那个目录下。卸载文件系统后,该目录(这里为/mnt)变为空。
    硬盘上的文件系统也是如此。在启动时系统自动将文件系统安装到硬盘上,根文件系统被安装在目录“/”下,如果/usr有另一个单独的文件系统,它则安装在/usr下。如果只有一个根文件系统,所有的文件(包括那些在/usr下的)都存放在该文件系统中。
    mount命令用来安装文件系统。
    命令:
    mount-av
    从文件/etc/rc中执行(它是在启动时的系统初始化文件), mount-av命令从文件/etc/fstab中获取文件系统和安装点的信息,fstab文件的一个例子如下:
    $ device directory type options
    /dev/hda2 / ext2 defaults
    /dev/hda3 /usr ext2 defaults
    /dev/hda4 none swap sw
    /proc /proc proc none
    第一个域是设备名,即安装的分区名;
    第二个域是安装点;
    第三个域是文件系统类型,如ext2( ext2fs文件系统)或minix( Minix文件系统)。
    fstab文件的最后一个域包括了mount的选择项,通常设置为“defaults”。
    可以看出,交换分区也包括在/etc/fstab中,其安装目录为none,类型为swap。命令swapon-a也是从/etc/rc中执行的,可用来交换列在/etc/fstab中的所有交换设备。
    安装或卸载文件系统,有许多软件包可以使普通用户安装或卸载文件系统(尤其是软盘)而不破坏系统的安全性。
    mount-av命令实际上安装除根文件系统(在fstab文件中为/dev/hda2)以外的全部文件系统,根文件系统在启动时由核心自动安装。
    除了用mount-av以外,还可以手工安装文件系统。命令:
    $ mount-t ext2/dev/hda3 /usr
    等价于在上例的fstab文件中安装文件系统/dev/hda3。
    一般地,不会用手工安装或卸载文件系统,/etc/rc中的mount-av命令在启动时负责安装文件系统,文件系统在用shutdown或halt命令关闭系统之前自动卸载。
        8.4.4.2 检查文件系统
    通常情况下,不断地检查文件系统中被破坏的文件是一个好的办法,有些系统在启动时自动检查它们的文件系统(用/etc/rc中适当的命令)。
    用于检查文件系统的命令依赖于出问题的文件系统类型,对ext2fs文件系统而言(最常用的类型),命令为e2fsck,例如,
    命令:$ e2fsck-av/dev/hda3
    将检查/dev/hda3上的ext2fs文件系统,并自动纠正任何错误。
    通常在检查文件系统之前最好卸载该文件。例如,
    命令
    $ umount/dev/hda3
    将卸载/dev/hda3上的文件系统,然后再检查该文件系统,但是不可能卸载根文件系统。为了在没有卸载之前就检查根文件系统,可以使用维护磁盘boot/root;当文件系统中有文件“忙”,即被其它运行进程使用着时,也不能卸载该文件系统。例如当某个用户的当前工作目录在某个文件系统上时就不能卸载该文件系统。如果试图卸载一个正在被使用的文件系统,将得到一个“Device busy”的错误信息。
    其它类型的文件系统用e2fsck命令的其它形式,比如efsck和xfsck。在某些系统中,可以简单地使用fsck命令,它将首先决定文件系统类型,再执行相应的命令。
    有一点很重要,那就是在检查完文件系统后,如果对该文件系统做了任何纠正,就应该立即重新启动系统(当然,一般情况下,不能在文件系统被安装时检查它)。例如,如果e2fsck报告对文件系统的错误作了些纠正的话,就应该立即用shutdown-r命令确保重新启动系统,这使得当e2fsck修改了文件系统后,系统能重新同步读文件系统的信息。
    /proc文件系统从不需要以这种方式检查,/proc是一个内存文件系统,直接由核心管理。
    除了为交换空间保留单独的分区以外,还可以使用交换文件。然而为了能这样做,必须安装相应的Linux软件,并将一切安排就绪,才能创建交换文    件。
    如果安装了Linux系统,则可以用下列命令创建交换文件。下面将创建一个大小为8208块(约8MB)的交换文件:
    $ dd if=/dev/zero of =/swap bs=1024 count=8208
    这条命令创建交换文件,“count=8208”项为交换文件的块数。
    $ mkswap /swap 8208
    该命令将初始化交换文件,同样地也可以用相应的值替换交换文件的命令和大小。
    $ /etc/sync
    $ swapon /swap
    同步以后便可对刚创建的/swap文件进行交换。同步是用来保证文件被写到磁盘上,这样做的一个主要缺点是,所有对交换文件的访问都是通过文件系统来实现的,这意味着组成交换文件的块可能不连续,因此性能也许不如使用交换分区,那样所有的块都是连续的,而且I/O请求是直接与设备打交道的。
    使用交换文件的另一个缺点是在使用大的交换文件时,破坏文件系统中数据的机会变大,如果出了错误的话,那将破坏文件系统。将文件系统和交换分区分开可以避免该现象发生。如果暂时需要很大的交换空间,使用交换文件便十分有用。例如,如果编译一个很大的程序,并希望运行得快一点的话,可以暂时创建一个交换文件,并同常规的交换空间一起使用。
    取消交换文件,首先用swapoff,例如:
    $ swapoff /swap
    然后再安全地删除该文件
    $ rm /swap
    请记住每个交换文件(分区)最大为16MB,但可以在系统中使用多达8个交换文件或分区。
8.4.4.3 其它任务
    对系统管理员来说还有许多日常事务性的工作:
            8.4.4.3.1 系统启动文件
    系统启动时,在任何用户注册之前系统将自动执行一系列初始化程序。下面是对该过程的详细描述:
    在启动时,内核产生进程/etc/init, init是一个程序,它读取其配置文件/etc/inittab,并根据该文件的内容产生其它进程。由inittab产生的最重要的进程之一就是可以在每个虚拟控制台(VC)上启动的/etc/getty进程。 getty进程抢占虚拟控制台VC,并在VC上启动login进程,它允许你在每个VC上注册,如果/etc/inittab不包含某个VC的getty进程,就不能在该VC上注册。
    另一个从/etc/inittab中产生的进程是/etc/rc,即主系统的初始化文件。该文件是一个shell程序,它执行在启动时需要的任何初始化命令,诸如安装文件系统和初始化交换空间。
    系统也可以执行其它的初始化程序,例如/etc/rc.local。/etc/rc.local通常包含针对用户自己系统的初始化命令,诸如设置主机名。 rc.local可以从/etc/rc或从/etc/inittab中直接启动。
8.4.4.3.2 设置主机名
    在一个网络环境中,主机名是用来识别某个机器的唯一标识,而在一个单机环境中,主机名只给出了系统的称呼。
    设置主机名是一件很简单的事,只需用hostname命令即可。如果在一个网络中,主机名必须是机器的主机名全称,比如goobe.norelco.com;如果不是网络环境,则可以选择任意的主机名和域名,比如loomer.vpizza.com, shoop.nowhere.edn或floof.org。
    设置主机名时,主机名必须在文件/etc/hosts中,它给每个主机赋一个IP地址,即使机器不在网络上,也应该在/etc/hosts中包含用户自己的主机名。
    例如,如果主机不在TCP/IP网络上,主机名为floof.org,则只需在/etc/hosts中包括下列项:
    127.0.0. 1 floof.org localhost
    它给主机floof.org赋了一个回送地址127.0.0.1(如果不在网络上就使用该地址),别名localhost也赋给该地址。
    如果在TCP/IP网络上,真正的IP地址和主机名也应该在/etc/hosts中,例如,如果主机名为goober.norelco.com, IP地址为128.253.154.32,则在/etc/hosts中增加下列行:
    128.253.154.32 goober.norelco.com
    如果主机名不在/etc/hosts中,那么将无法设置它。
    设置主机名,只需使用hostname命令即可,例如命令:
    $ hostname-S goober.norelco.com
    设置主机名为goober.norelco.com。多数情况下, hostname命令是由某个系统启动文件执行的,例如/etc/rc或/etc/rc.local。编辑上述两个文件,改变其中的hostname命令来设置主机名,再重新启动系统时,主机名将被设置为新值。
            8.4.4.3.3 紧急情况处理
    在某些偶然的场合下,系统管理员将面临从一个彻底性的灾难中恢复系统的问题,例如忘记了根的口令或破坏了文件系统。
    Linux并不是一个不稳定的UNIX版本,事实上Linux比商用UNIX在许多平台上出现的问题要少得多。 Linux还提供一个强有力的向导,它能帮助你走出困境。
    解决问题的第一步就是试图自己修复,到处看一看,看该如何办。系统管理员在仔细研究问题之前将会花大量的时间,不顾一切地发出请求帮助,多数情况下,你将发现自己解决问题实际上非常容易。
    很少情况下需要重新安装被损坏的系统。许多新用户由于不小心删掉了一些基本的系统文件,便立即去找安装盘,这并不是一个好主意。在采取这项极端的方法之前,仔细研究一下并寻求其他人帮助解决问题。多数情况下,可以从维护磁盘上恢复系统。
    * 用维护磁盘恢复
    系统管理员的一个必不可少的工具就是所谓的"boot/root"盘,它是一个可以以完整的Linux系统启动的软盘,它与硬盘无关。 boot/root盘实际上很简单,首先用软盘创建一个根文件系统,将所需要的应用例程放在上面,再在该软盘上安装LILO和可启动的内核。另一种方法是用一个软盘装内核,另一个装根文件系统,两种情况结果都一样,即可以完全从软盘上启动Linux系统。
    sunsite.unc.edu中/pub/Linux/GCC/rootdisk中H.J Lu的boot/root盘是另一个维护磁盘的例子,如果你想试一下的话也可以自己建一个。然而多数情况下,用事先做好的boot/root盘则比较容易而且可能更加完整。
    使用boot/root盘是很简单的,只需要用该盘启动系统,并用root注册(通常没有口令)。为了存取硬盘上的文件,需要手工安装文件系统,例如命令
    $ mount -text2/dev/hda2/mnt
    把/dev/hda2上的ext2fs文件系统安装在/mnt上。记住"/"现在在boot/root盘上,用户需要将硬盘的文件系统安装在某个目录下,以便存取其上的文件。因此,如果将根文件系统安装在/mnt下的话,硬盘上的/etc/passwd则在/mnt/etc/passwd中。
    * 修复根口令
    如果忘记了根口令,可以用boot/root盘启动,将根文件系统安装在/mnt下,并在/mnt/etc/passwd中将root的口令域清除,如:
    root::0:0: root:/:/bin/sh
    这时root没有口令。当用硬盘重新启动时,可以用root注册,并用passwd重新设置口令。如果知道如何使用vi,则可以在boot/root盘上使用它。因为在boot/root盘上,其它的编辑器,如Emacs,可能没有,但vi一定有。
    * 修复损坏的文件系统
    如果莫名其妙地破坏了文件系统,则可以用软盘运行 e2fsck来纠正文件系统中任何被破坏了的数据(当然指的是用ext2fs文件类型),其它文件系统类型可以用 fsck命令的其它形式。
    当从软盘检查文件系统时,最好此时文件系统没有被安装。
    最常见的文件系统损坏就是超级块损坏。超级块是文件系统的头,它包含了文件系统的状态、大小、空闲块等,如果超级块被损坏(例如不小心将数据直接写到文件系统的分区表中),系统将根本无法识别文件系统。任何试图安装文件系统的操作都将失效,e2fsck也无法修复系统。
    幸运的是ext2fs类型的文件系统在驱动器“块组”的边界保存了超级块的备份,通常情况下是每8K块为一个块组。为了告诉e2fsck用超级块的拷贝,可以用诸如下面的命令:
    $ e2fsck-b8193<partition>
    其中是文件系统驻留的分区表,-b 8193选择项告诉e2fsck用文件系统中存储在块8193的超级块备份。
    * 恢复丢失的文件
    如果不小心删除了系统中的重要文件,则没有办法取消删除(undelete)。然而可以从软盘拷贝相关的文件到硬盘中,例如,如果删除了系统中的/bin/login(允许注册的文件),只需用boot/root软盘启动,将根文件系统安装到/mnt上,并用命令:
    $ cp-a/bin/login /mnt/bin/login
    -a选择项告诉cp保留被拷贝文件的存取权限。
    当然,如果删除的文件并不是基本的系统文件,而这些文件在boot/root软盘上没有,那么就没办法了。不过如果做了备份,当然总是可以恢复的。
    * 恢复损坏的库
    如果不小心破坏了库或在/lib中的符号连接,那么依赖于那些库的命令将无法运行。最简单的办法就是用boot/root盘启动,安装根文件系统,并在/mnt/lib下修复库。

你可能感兴趣的:(认识文件系统——转载)