荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: georgehill (New Century New Dream), 信区: Linux
标  题: 第九章 管理、维护和排错(上)(转寄)
发信站: BBS 荔园晨风站 (Sat Jan  6 14:51:42 2001), 站内信件

【 以下文字转载自 georgehill 的信箱 】
【 原文由 georgehill.bbs@smth.org 所发表 】
发信人: ruster (尘埃*星辰*领悟), 信区: Linux
标  题: 第九章 管理、维护和排错(上)(转寄)
发信站: BBS 水木清华站 (Thu Dec 21 13:52:00 2000)

第9章   管理、维护和排错

  本章要点:

  本章归纳系统管理员的日常工作任务,对于系统灾难的处理,以及如何制作更高性能
的Linux服务器。

      本章具体包括以下内容。

    系统的日常维护内容,如开关机,备份和恢复

    系统任务的调度

    对系统进行监控

    设置强大的Linux服务器

  9.1 启动和关机

  相信大家肯定都知道开关机器的步骤。与任何UNIX系统一样,Linux系统只要上电就可
以开机,关机使用shutdown命令。但是在日常维护中,开关机仍然是必须学习的内容,
因为在开关机的过程中可能会有一些特殊的问题,而且你必须准备好从灾难中恢复。

  当你给系统加电的时候,Linux将自动从lilo开始执行,启动的过程我们在第四章已经
介绍过了。通常我们不需要对系统的启动作任何干预,Linux就可以自动执行启动脚本直
到出现登录提示符login:。

  本节实际是FAQ的性质,介绍一名管理员在启动和关闭系统的过程中可能碰到的问题,
这些东西是非常重要的,但是在具体的发行版本中的显示信息可能和我们的情况不同,
如果你理解了我们说的内容,那么它实际是很简单的。

  当/etc/rc.sysinit开始执行的时候,系统必须首先mount 上文件系统。然而如果某个
文件系统在上次关机的时候没有清洁地被卸下,那么系统将会调用fsck程序来检测根文
件系统。一般情况下,fsck会正确修复文件系统中的错误。然而,如果发生了致命错误
,那么fsck会退出,这时系统启动脚本会出现类似于这样的提示:

  *** An error occurred during the file system check.

  *** Dropping you to a shell; the system will reboot

  "*** when you leave the shell.

  然后启动脚本会调用一个sulogin程序,这个程序会提示你输入超级用户口令:

  Give root password for maintenance

  (or type Control-D for normal startup):

  输入超级用户口令之后,你将得到一个shell,在这个shell中你可以使用fsck命令修
理有问题的文件系统,关于fsck程序的细节请参考第三节。

  fsck结束之后,用exit命令退出这个shell,系统将会重新启动。

  如果由于某种原因你想关闭系统(关闭系统还要理由?当然,原则上,服务器的行为
就应该是永不关机。对于Linux系统,一年不停机是正常的事情),可以使用shutdown命
令:

  shutdown [时间] [信息]

  时间参数定义在什么时候关机,基本的格式是hh:mm,比如12:30代表12点30分。不过
更多的人喜欢用+[分钟],例如shutdown +3代表3分钟后关闭系统。一个特殊的字符串n
ow表示+0,即立刻关机。信息参数用来向连接在系统上的所有用户发送一条消息,例如
,想要在两分钟后关闭系统,并且向所有用户发送一条“system now halted.Please s
ave your work”的信息,命令是

  shutdown +2 'system now halted,Please save your work'

  如果要重新启动机器,可以使用shutdown的-r参数,例如

  shutdown now –r

  也可以用reboot命令:

  reboot

  另外,在第四章我们曾经介绍过,一般的系统在/etc/inittab文件中定义了对于热启
动的组合键(Ctrl+Alt+Del)的缺省行为:

  ca::ctrlaltdel:/sbin/shutdown -t3 -r now

  -t3表示延迟三秒。因此,你可以使用这个组合键来重新启动计算机。不过要注意,对
于很多Linux系统,这个组合键必须是左Ctrl+左Alt+Del,否则无效。

  如果你不喜欢这个功能,只要在/etc/inittab中将这一行删除,并且重新启动计算机
就可以了。这样,只有超级用户才能关闭系统。

  在关闭系统的过程中,系统会在/etc目录下生成一个nologin文件,并且在系统例行任
务结束准备彻底关闭系统时删除,如果由于某种原因这个删除过程没有被正确执行,那
么在重新启动之后,除了root以外的其它用户就无法登录到系统上。如果你发现除了ro
ot以外所有其它用户都不能登录系统,检查/etc目录并且删除nologin文件。

  在启动过程中,如果发生DNS失败,amd程序找不到所需要的网络资源等等情况,那么
像sendmail,httpd,amd等等程序会花费很长的时间去验证错误,系统在这过程中将失
去响应,碰到这种情况,只需耐心等待,经过一段时间后系统就会正确启动。

  在某些情况下,系统的情况会变得十分糟糕,以至于按照一般的方式启动已经不可能
。这种情况下,通常的处理方法是:

  如果系统还能启动通过sysinit脚本,那么使用单用户方式启动,启动方式在第四章已
经做过介绍。

  如果lilo已经被破坏,那么用DOS软盘引导系统,并且用loadlin程序引导系统到单用
户状态,例如,你的Linux 根分区在/dev/hda1,那么执行

  loadlin vmlinuz init=/sbin/init 1 root=/dev/hda1 ro

  如果由于某种原因/分区已经出现问题,比如/bin和/sbin目录被破坏,那么这时唯一
的方法是从一个别的Linux系统引导,然后将/分区mount到新系统上进行处理。这可以通
过把硬盘挂到别的机器上进行,或者可以考虑制作一张小型Linux系统软盘。

  制作Linux启动软盘是一件比较复杂的事情,建议你到网上找到一个适合你的系统的启
动软盘镜像。如果你的系统实在比较特殊而没有现成的启动软盘可以使用,那么你可以
参考Linux的Boot-HOWTO。

  另外一种非常糟糕的情况是/dev中的设备项目损坏,这时所有依赖于该设备的程序都
无法工作。解决的方法是用mknod重新建立这个设备文件项目。另外,有时为了增加tty
的数目或者支持多余的调制解调器,你也需要建立设备项目。

  mknod的用法是:

  mknod [设备名] [设备类型] [主设备号] [次设备号]

  设备类型是c或者b,c代表原生/字符设备,而b代表块设备。主设备号和次设备号都是
Linux核心用来标记设备类型的选项,如果要了解某个设备的设备号,可以参考核心文档
。不过,实际中的问题远远没有这样复杂,因为/dev/下的设备文件已经是相当完备的,
你只要备份这个目录项目并且正确恢复就行了:

  # ls -l /dev/hda1

  brw-rw----   1 root     disk       3,   1 May  6  1998 /dev/hda1

  显然,/dev/hda1设备的主设备号是3,次设备号是1。同样,/dev/hda2设备主设备号
是3,次设备号是2。

  一个有趣的用处是增加分区。Linux允许每个物理硬盘64个分区,不过缺省的情况下你
只能用fdisk程序分出16个,因为/dev下面只有16个hda*的项目。如果你要使用更多的分
区,那么

  mknod /dev/hda17 b 3 17

  mknod /dev/hda18 b 3 18

  ……………

  这样就可以使用更多的分区了。

  9.2 系统记录

  UNIX经常被看成一个复杂而古怪的系统,不过,在系统管理员看来,它其实比许多自
称容易使用的系统更容易管理,尤其在排错的过程中,这是因为它提供了大量的运行记
录,诸如在/var/log目录下面的那些记录文件是系统管理员解决问题的第一手资料。不
幸的是,UNIX著名的前后不一致和不兼容的特点使得在/var/log下面寻找登记文件成了
系统管理员的一件新工作。我们在这一节将讨论如何分析和建立系统记录文件。

  另外一个重要的功能是对用户的各种操作记账,包括用户使用的CPU时间,进行的操作
消耗的资源等等,尽管对Linux来说对每个用户使用的CPU时间收费似乎有些不现实,但
是我们决定仍然阐述这个功能。

  9.2.1  syslog

  UNIX的系统记录文件隐藏在硬盘的各个地方,尽管它们理论上都应该处在硬盘的/var
/log目录下,但是这个目录下的文件实在是太多了,一个一个文件地查找各种登记信息
简直是一种自虐行为。另外,尽管缺省配置已经不错,但是你可能仍然不喜欢它对于某
些信息的记录方式,或是有自己的某种要求。比如,想按照上一章说的将ipchains的记
录信息保存下来以便分析,或者类似的其他目标。所有这些都需要你了解UNIX系统记录
信息的方式。

  几乎所有的UNIX系统都使用syslogd程序进行系统记录,Linux也不例外。实际上,sy
slogd程序就是一个信息过滤器,用户程序可以用它提供的openlog,syslog和closelog
函数向它提供消息,而它按照系统设定的规则把这些消息分门别类,存放在各个文件里
面。如果syslogd程序没有启动,那么应用程序输出的消息就得不到处理,这种情况下,
这些消息通常被直接输出到系统终端上。

  syslogd程序的行为由/etc/syslog.conf文件控制,这个文件由一系列定义消息“到哪
里去”的行组成。按照一般的conf文件规则,以#开头的行被当成注释行。

  syslog.conf的行的基本语法是:

  [消息类型]  [动作]

  中间的分割符必须是TAB字符,我曾经在这个问题上犯过错误,所以提醒你一下。

  消息类型由“消息来源”和“紧急程度”构成,中间用一个点号连接,消息来源是指
发送消息的设备/程序类别,紧急程度表示这个消息的重要性。如果你想在一行上标出多
个消息类型,中间用分号分开。例如,kern.emerg表示来自内核的“紧急”信息,而da
emon.warning;auth.info表示来自任何守护进程的警告加上来自安全性检验程序的一般
信息。

  下面是消息来源的一览表:

  kern  内核

  user  用户程序

  mail  电子邮件系统(smtp,pop3等等)

  daemon  系统守护进程

  auth  和安全性以及权限修改相关的命令

  lpr  打印机

  authpriv  私用的授权信息

  mark  定时产生的时间戳

  cron  cron程序

  syslog  syslod程序自身产生的消息

  local0-7  8种本地消息

  news  Usenet系统消息

  uucp  uucp程序

  注意你可以使用一个通配符来指代所有的设备,例如*代表一切消息来源,而none表示
什么都没有。

  紧急程度的列表见下表,紧急程度由上到下逐步减小:

  emerg  陷入极度恐慌的状态之中,这是最高的紧急程度。它还有一个别名叫panic,
不过手册上建议你不要用这个,还是用emerg比较好。

  alert  紧急状态(红色警报?)

  crit  临界状态

  err  出现错误,它有一个别名叫error,这个别名已经停用。

  warning  警告,别名是warn

  notice  出现了某些不寻常的事情,可能应该调查

  info  一般性消息

  debug  用于调试的信息

  紧急程度的规则是向上匹配,也就是一个debug标志意味着所有消息都要被处理,而c
rit选项将处理所有级别为crit,alert和emerg的消息。如果你希望只匹配某个确定的紧
急程度,使用一个等号,例如kern.=crit。* 和 none通配符仍然可以使用,例如kern.
*表示所有核心产生的信息,而kern.none将抛弃掉所有核心信息。

  “动作”选项告诉syslogd应该如何处理对应的消息:将它存入硬盘文件,显示在终端
上,发送给某个用户或者转发给另外一台主机。下面是可用动作的一览:

  文件名  写入某个文件,注意这里必须使用文件的绝对路径

  @主机名  转发给另外一台主机上的syslogd程序

  @IP地址  等价于@主机名,只是使用IP地址标志远程机器

  用户列表  用逗号分开的用户列表,例如user1,user2表示如果user1 和 user2登录的
话就把信息发送到他们的终端上

  *   发送到所有用户的终端上

  /dev/console 发送到本地机器的屏幕上

  |程序  通过管道转发给某个程序

  为了解释上面的内容,现在让我们看一看范例性的syslog.conf文件,这个文件把紧急
性的消息直接发送给所有用户,而不寻常的安全性信息发送到另外一台主机上。普通的
消息就直接写入记录文件:

  #/etc/syslog.conf

  kern.emerg                                                       /dev/cons
ole

  #一旦发生核心恐慌,立刻把信息显示在控制台上。

  *.emerg                                                 *

  #当出现任何紧急事件的时候,把消息发送给所有用户

  *.info;mail.none;news.none;authpriv.none;daemon.none  /var/log/messages

  #把一般性的信息送到/var/log/messages文件中保存起来,但是不包括信件,新闻和
本地安全性信息。

  auth.*;authpriv.*                                               @locallog.
yourdomain.com

  #与身份认证有关的安全性信息,例如su(对应auth事件),发送到locallog.youredom
ain.com主机上记录下来

  mail.*                                                  /var/log/maillog

  #所有与电子邮件相关的信息,保存在/var/log/maillog中

  uucp,news.crit                                          /var/log/spooler

  #UUCP和电子新闻系统的问题,记录到/var/log/spooler文件中

  在这个例子中,某些信息

  daemon.notice       /var/log/daemon.log

  #系统守护进程发出的警告,存储到/var/log/daemon.log

  设置了syslogd.conf之后,就可以启动syslogd了:

  #/sbin/syslogd

  在这个例子中,我们将一些信息发送到了locallog.yourdomain.com主机上,为此,l
ocallog主机必须设置为可以接受来自网络的syslog信息,这可以用-r选项实现:在loc
allog主机上执行

  #/sbin/syslogd –r

  这样locallog主机就会监听网络记录所有来自其他机器的系统记录请求。

  接下来就可以测试你做的设置是否正确了,当然,像*.info这样的信息可以随便在系
统上做一点工作产生出来,不过,大概你不会希望为了测试kern.alert而制造一次核心
恐慌。为此,syslog中包含logger程序,可以用它产生出各种syslog消息:

  logger –p [消息类型] [消息内容]

  例如,我们想测试对于我们这个syslog.conf的缺省kern.emerg行为,可以执行

  # logger -p kern.emerg "test kern"

  #

  Message from syslogd@wxd at Tue Mar 21 08:21:32 2000 ...

  wxd wanghy: test kern

  信息被发送给了所有的用户,表明*.emerg那一行已经正常工作了。

  发送给locallog的信息也可以这样产生出来,例如

  #logger –p auth.info "I'm testing syslogd"

  然后可以察看locallog主机上的记录,在locallog主机上,所有*.info信息都被记录
在/var/log/messages文件中,因此我们可以察看这个文件,你会看到类似这样的行:

  Mar 21 08:28:21 wxd wanghy: I'm testing syslogd

  这说明消息正确地传送和记录了。这里的wxd wanghy表示消息来自wxd主机,发送消息
的用户是wanghy。

  一般情况下,syslogd的记录信息是对系统进行分析和出错的最重要手段,而且在有人
侵入系统的时候,也是最主要的记录。不过,缺省的Linux syslog.conf的配置并不是很
合适,特别是,所有信息被不分青红皂白地放在/var/log/messages下面,你应该重新按
照自己的需要配置syslog.conf。

  一个常用的手段是建立独立的系统监视账户。一般情况下,系统的*.emerg和*.alert
表示已经出现了紧急情况,必须立刻处理。我们可以建立一个仅用来监视系统紧急情况
的账号,比如watch,然后把所有紧急消息发送给它:

  *.alert     watch

  系统管理员每天早晨以watch身份登录,这样,一旦出现危机,消息会立刻传送到wat
ch登录的终端上显示出来。

  必须注意的是,原则上也可以用/dev/console把信息发送到终端上,不过要注意用户
可以使用^S键锁住屏幕,结果是syslogd会被阻塞,直到有人按下^Q键解锁为止。

  syslogd只能处理那些使用openlog()、syslog()、closelog()库例程发送消息的程序
,其他的程序会产生出自己的记录文件,这些文件的位置只能靠你自己去摸索。

  每次修改syslog.conf文件之后必须重新启动syslogd:

  killall –HUP syslogd

  这个信号导致syslogd关闭所有记录文件,重读/etc/syslog.conf然后重新开始记录。

  必须注意的一个问题是如果想修改syslogd的记录文件(比如压缩或者清空它们),那
么你必须先杀掉syslogd进程,在修改完毕之后再启动syslogd。否则,如果某个文件正
好处于打开的状态,那么可能会产生出不可预测的后果。

  在一些较早的系统上,建议你用mark消息不断地产生出时间戳,以便确定系统是在什
么时间发送的消息,不过在现在版本的syslogd中,syslogd程序会自动写下消息的产生
时间,因此这个设施已经不需要了。

  9.2.2 进程记账

  如同我们介绍的那样,Linux是System V和BSD的奇怪组合,不过这个组合看起来挑选
的很好。Linux的启动脚本是System V类型的,而打印系统是BSD。下面的进程记账系统
是来自BSD的又一个特性。

  我们仍然保持本章开始的看法,即在一般情况下,对Linux系统进行进程记账是没有多
少意义的,因为对于一台internet服务器,你不会允许用户随便登录到你的机器上来,
而httpd程序的用户身份是nobody。不过,如果你的Linux机器允许别人上来进行某些很
消耗资源的操作,比如说你有一台PIII Xeon的机器,允许用户在上面跑matlab这类极其
消耗CPU速度的工作,你可能就需要BSD进程记账系统了。

  要使用进程记账系统,首先必须正确地配置内核。大部分发行版本中的缺省内核并没
有配置为允许进程记账,因此你必须重新编译内核。在Linux内核中,这部分功能在“G
eneral Setup”中,相应的选项是“BSD Process Accounting”,配置内核的过程我们
在前面已经介绍过,比如我们用图形方式进行系统配置

  #make xconfig

  在配置界面出现之后,选择General Setup选项,出现子选单:



  图9.1 设置进程记账

  设置BSD进程记账系统为yes,然后重新编译内核,用新内核启动,然后就可以设置进
程记账了。

  记账程序必须用命令启动,启动它的命令是/sbin/accton程序,格式是

  /sbin/accton [记录文件]

  例如#/sbin/accton /var/log/pacct将会打开进程记账系统,记账信息存放在/var/l
og/pacct文件中。注意,在启动记账之前,/var/log/pacct文件必须存在,你可以用to
uch命令自己建立它:

  #touch /var/log/pacct

  不带参数的accton程序关闭进程记账功能:

  #/sbin/accton

  在设置了记账功能之后,就可以观察各个用户的记录信息了,第一种情况是汇总记账
数据,对每个用户的操作进行归纳,这可以通过sa命令来完成,sa命令的开关极其复杂
,我们也不想介绍这些无聊的信息(绝大多数用于格式化输出),只介绍常用的几个命
令:

  sa

  不带参数执行这个命令对系统记账信息按照命令进行进行归纳。它会产生出很长的分
栏信息,例如:

  [root@mail /root]# sa |more

    266790 1979381.34re    7365.13cp         0avio       436k

        16   93368.51re    7102.28cp         0avio       292k   lpd*

      5478  472026.69re      51.38cp         0avio      1148k   httpd*

       136     250.91re      46.90cp         0avio       469k   ypserv*

      3418      33.84re      33.76cp         0avio      1417k   cc1

        24    2223.79re      22.36cp         0avio       328k   cce

       300  513535.07re      17.36cp         0avio       358k   identd*

  第一栏是总的命令执行次数,接下来的两栏是使用的时间信息:首先是命令消耗的时
间,然后是CPU使用的时间,第四栏是平均每次命令的I/O数量,第五栏是平均的内存使
用量,最后是命令的名字。

  如果要对用户的操作进行汇总,使用sa –m:

  #sa –m |more

             266759 1979362.08re    7365.09cp         0avio       436k

  root       249106 1407784.55re    7325.03cp         0avio       425k

  wanghy       6944   25280.96re      23.88cp         0avio       356k

  nobody       7735  472039.06re      14.87cp         0avio       889k

  zhangfl       416      47.20re       0.18cp         0avio       394k

  第一栏是用户的名字,注意总量以不带用户名的方式出现在最上面一行。第二栏是用
户执行的命令,第三栏和第四栏是使用的时间,即系统时间和CPU使用时间,接下来是平
均I/O量和内存使用量。

  如果你准备清空pacct文件,首先应该把它的内容转储到/var/log/savacct,这可以用
sa –s命令完成:

  #sa –s

  第二种常用功能是对用户的连接时间记账,这个功能是由ac命令完成的。不过要注意
,这个记账信息是放在/var/log/wtmp文件中的,而在reboot时,很多系统脚本会自动删
除这个文件,因此你应该定时执行这个程序。

  不带参数的ac命令显示系统的总连接时间:

  # ac

  total       62.12

  如果要确定每个用户的连接时间,使用ac –p:

  # ac -p

  wanghy                              12.19

  wangxudong                           0.37

  a_ppp                                0.16

  lyf                                  3.24

  pipi                                 0.05

  root                                46.12

  zhangfl                              0.00

  total       62.12

  单位是小时。

  如果要单独确定某个用户的连接时间,在-p参数的后面使用用户的账号名字。

  也可以按照日期汇总这个信息:

  # ac -d

  Mar 10  total        0.37

  Mar 11  total        1.43

  Mar 11  total        7.70

  Mar 12  total       17.51

  Mar 13  total        1.35

  Mar 14  total        3.17

  Mar 18  total        3.42

  Mar 19  total       19.57

  Mar 20  total        3.16

  Today   total        4.56

  显然,12日和19日的连接时间比较长。

  有一个经常使用的记账信息是关于打印机的。如果在/etc/printcap变量中使用了打印
机的记账选项(af),那么就可以对打印机的使用进行记账,例如,打印机的设置文件
是这样:

  ##PRINTTOOL3## LOCAL laserjet 300x300 letter {} LaserJet Default {}

  lp:\

          :sd=/var/spool/lpd/lp:\

          :mx#0:\

          :sh:\

          :af=/var/log/lp-acct:\

        :if=/var/spool/lpd/filter1:\

          :lp=/dev/lp0:fo=true:

  af选项定义了打印机的记账文件,然后就可以用/usr/sbin/pac程序显示用户的记账信
息了,例如:

  [root@mail /etc]# pac

    Login               pages/feet   runs    price

    total                       0.00    0   $  0.00

  注意后面的price选项,它按照每页2美分的价格计算打印费用,你应该用pac –p选项
更改这个价格,例如pac –p0.30等等。

  需要指出的一点是,pac程序盲目地按照输入过滤器产生的页数计算价格,说实话我不
太相信过滤器能否产生正确的页数结果,你就当个乐子吧。

  9.3 硬盘管理

  无论你的硬盘有多大,你都会比预料的时间更快地看到它被塞满。UNIX用磁盘限额来
对付这种情况。某些操作系统(比如早期的Windows NT)不使用磁盘限额,因此一个愚
蠢的用户可以在一夜之间塞满你的全部剩余硬盘空间。在Linux下面你可以防止这种情况
,不过这个功能在缺省情况下是并不打开的,因此你必须手工启动它。

  除此之外,我们还要介绍fsck程序,它是在出现文件系统灾难的时候唯一的恢复工具
。说实话我不太喜欢UNIX的灾难恢复能力,或许因为它出现灾难的几率比较小,但是无
论如何,灾难总会发生。

  9.3.1  磁盘限额

  磁盘限额是设置用户可以使用的最大磁盘空间。在使用磁盘限额之前,你必须理解它
是基于文件系统的,也就是说,如果你有多个文件系统,而且某个用户在每一个系统上
都有写权限,那么你限制他的办法是对每个文件系统限制其使用空间。这确实是一件比
较恶心的事情,但是总比不带限额功能要好。

  要启动磁盘限额,首先必须保证内核编译时打开了Disk Quota选项,这个选项在File
 System选单中:



  图9.2 配置核心quota支持

  在确认内核支持quotas之后,需要建立缺省的quota文件,必须注意,如果你有若干个
文件系统,对每一个想使用quotas的文件系统,你都需要在它的根目录下面建立一个qu
ota文件,例如,某个文件系统连接到/home,你就需要将它连接上之后在/home下面建立
quota文件。

  quota文件的名字是quota.user和quota.group,属主必须是root。你可以这样建立:
(假设需要限额的文件系统是/)

  #touch /quota.user

  #chmod 600 /quota.user

  #touch /quota.group

  #chmod 600 /quota.group

  然后就可以启动磁盘限额了,要启动磁盘限额,需要在文件系统说明文件/etc/fstab
中明确地设置quota选项,例如,你的fstab文件是

  /dev/hda1     /                ext2    defaults        1 1

  /dev/hda4     swap             swap    defaults        0 0

  /dev/fd0      /mnt/floppy      ext2    noauto          0 0

  /dev/cdrom    /mnt/cdrom       iso9660 noauto,ro       0 0

  none          /proc            proc    defaults        0 0

  none          /dev/pts         devpts  mode=0622       0 0

  现在你想对/文件系统加上quota,那么需要在参数栏里面加上usrquota参数,也就是
/dev/hda1那一行改成:

  /dev/hda1     /                ext2    defaults,usrquota        1 1

  注意不要拼写错误。

  接下来,执行限额检验程序,填入每个用户使用的磁盘空间:

  #cd /

  #quotacheck /dev/hda1

  参数是进行quota的文件系统的设备名字,如果你想统计所有的文件系统,使用quota
check –a。

  依照系统中用户和文件的多少,这个动作会消耗几秒钟到十几分钟的时间,然后你会
看到/quota.user文件的变化:

  #ls -l /q*

  -rw-r--r--   1 root     root            0 Mar 21 11:12 /quota.group

  -rw-r--r--   1 root     root        19232 Mar 21 11:17 /quota.user

  下面可以为每个用户编辑磁盘限额了,这是通过edquota程序实现的,这个程序会调用
在环境变量EDITOR里面设置的编辑器来编辑对应用户的quota值,语法是edquota [用户
名]:

  #edquota wanghy

  Quotas for user wanghy:

  /dev/hda7: blocks in use: 1442, limits (soft = 0, hard = 0)

          inodes in use: 48, limits (soft = 0, hard = 0)

~

~

  "/tmp/EdP.ahjUuba" 3L, 132C

  缺省的编辑器是vi程序,在每个用户的quota 值中存在两组数据。首先是块数,这组
数值用来限制用户使用的磁盘空间,缺省下,每个块是1KB。另外一组数值是i-结点的数
目,或者说用户可以使用的文件个数。在现在的情况下,用户wanghy已经使用了1442KB
磁盘空间和48个文件。

  括号内的数值是对用户的限制,限制有两种,称为软限制和硬限制。硬限制是用户所
能使用的实际上限。而软限制只是一个警戒线,一旦用户使用的量突破这个数值,系统
就会向用户发出警告。为了避免用户简单地忽略警告,quota程序设置了内部定时,一旦
经过确定的时间(缺省是一星期),软限制将被硬化,用户无法再使用硬盘空间,除非清
理磁盘。

  在现在的情况,用户wanghy的软限制和硬限制都是0,意味着系统并没有对这个用户进
行限额。你可以修改soft和hard值到你认为合适的数值,然后存盘。

  也可以用edquota程序修改quota程序的计时期限,命令是edquota –t,例如:

  #edquota –t

  Time units may be: days, hours, minutes, or seconds

  Grace period before enforcing soft limits for users:

  /dev/hda1: block grace period: 7 days, file grace period: 7 days

~

  "/tmp/EdP.aJWEBkD" 3L, 170C

  这个信息说明/dev/hda1系统的缺省限时是7天,你可以修改它到一个合适的值,然后
存盘退出。因为这个过程实际就是用vi编辑一个临时文件,可以使用vi的各种调试命令


  要编辑对于用户组的限额,使用命令edquota –g,例如,要对group1设置限额,使用
edquota –g group1。

  当你修改正确了全部的信息之后,可以用quotaon程序启动quota功能了,例如:

  quotaon /dev/hda1

  如果你要启动在/etc/fstab中包含usrquota参数的所有文件系统的磁盘限额,使用

  quotaon –a

  由于缺省的系统启动脚本就带有quotaon –a命令,所以你也可以简单地重新启动系统
来启动磁盘限额。如果你改变了缺省的系统启动脚本,注意不要把这一行删掉。一般情
况下,启动quotaon之前应该用quotacheck刷新quota数据,你可以察看脚本中是否有下
面形式的行:

  quotacheck –a –p

  quotaon -a

  edquota的编辑器是使用环境变量EDITOR中的值,缺省下是vi。我个人很讨厌这个东西
,如果你对这个感到困扰,将EDITOR变量设置为你喜欢的任何编辑器,比如:

  #EDITOR=/usr/bin/joe

  #export EDITOR

  再启动edquota就使用joe编辑了。

  这里使用的是命令行管理quota。一般来说,这个过程确实很简单,但一旦弄错却绝对
不是好玩的。在大部分Linux发行版本中提供了一个配置工具linuxconf,它包含许多程
序的配置功能,对我们来说,配置disk quota可以使用这个工具:

  #linuxconf




  图9.3 配置quota

  选择File system下面的Access local drive选项,设置文件系统:



  图9.4 配置quota(2)

  选择你准备使用quota的文件系统,按下回车键,在options栏目中可以找到user quo
ta和group qouta选项:



  图9.5 配置quota(3)

  选中Accept回到主选单,再选择File Systems下面的set quota defaults选项,就可
以设置缺省的quota参数:



  图9.6 配置quota(4)

  可以设置缺省的用户quota,组quota和quota的计时时间。利用这个方法,很容易设置
各种缺省参数,注意在这个配置程序中每个可以使用quota(在/etc/fstab中设置为usrq
uota)的文件系统都会有自己的缺省quota值。

  设置了缺省值之后,就可以用edquota程序修改每个用户的quota值了。

  在进行例行管理的时候,你可能想要了解每个用户使用的磁盘空间,这可以用repquo
ta命令实现:

  # repquota -a |more

                          Block limits               File limits

  User            used    soft    hard  grace    used  soft  hard  grace

  root      --  235880       0       0          12873     0     0

  adm       --       8       0       0              2     0     0

  news      --     220       0       0             26     0     0

  ………………………

  如果你只想了解某个特定分区被使用的信息,使用repquota [设备名],如repquota
/dev/hda1。

  9.3.2   回收磁盘空间

  磁盘空间总是在不断地减少。无论你有多少硬盘空间,它总是不够用。对于UNIX来说
,由于磁盘限额的存在,某个恶意的用户用垃圾文件塞满硬盘的情况不太可能发生。但
是即使在正常的情况下,各种程序的记录文件(比如/var/log/messages,/var/log/wt
mp等等)也在不断增长。你必须定期清理这些文件,免得它们增长到太大而对系统产生
威胁。当然,对于硬盘动辄以数十GB论的Linux服务器,/var分区被塞满导致系统崩溃的
情况不太可能发生。在早期的Sun系统中,由于缺省的/var分区太小,系统管理员们发现
他们每天的主要任务是按照一张表删除记录文件,当然,在某些单位,这对系统管理员
申请加薪颇有好处。

  对于这些记录文件,必须知道的是你不能随便删除这些文件,由于许多程序的愚蠢实
现,它们在对应的文件不存在的时候不是去创建这些文件而是简单地抱怨文件不存在并
且退出。对于这些文件,你必须在删除之后建立一个空的同名文件以免应用程序发生错
误。

  举个例子来说,一个增长的极其迅速的文件是/var/log/httpd/access_log。通常它在
几天之内就可以有上兆的增长。我们需要定期删除这个文件,apache是一个比较正常的
程序,所以我们可以简单地删除这个文件:

  #rm –rf /var/log/httpd/access_log

  另一个增长迅速的文件是/var/log/wtmp,我们同样需要定期删除这个文件,但是许多
程序依赖于它的存在,因此我们用下面的方法清空这个文件:

  #cat /dev/null > /var/log/wtmp

  /dev/null是一个“空”设备,它没有任何内容,因此这样的重定向命令将导致/var/
log/wtmp文件被一个长度为0的空文件取代。

  更复杂的情况是syslogd使用的记录文件,例如/var/log/messages文件。我们不能直
接修改这样的文件,否则可能会扰乱syslogd的行为,因此我们使用下面的指令组:

  #killall syslogd

  #cat /dev/null > /var/log/messages

  #/sbin/syslogd

  除此之外,各种莫名其妙的应用软件,用户上传的图片等等都会惊人地消耗硬盘空间
。一般来说,你需要了解每个硬盘上还有多少空间,以及消耗的磁盘空间都是谁在使用
,用来干什么。前面讲的repquota命令可以显示各个用户使用的磁盘空间,另外两种知
识可以通过df和du命令实现:

  df命令显示每个分区消耗了多少空间:

  $df

  Filesystem           1k-blocks      Used Available Use% Mounted on

  /dev/hda1              1011928    415388    545136  43% /

  /dev/hda5             11598524   7793364   3215980  71% /ftp

  /dev/hda7              2016016    743696   1169908  39% /home

  /dev/hda8              2016016     87664   1825940   5% /home/httpd

  /dev/hda9              2016016        20   1913584   0% /temp

  /dev/hda10             2016016   1536592    377012  80% /usr

  /dev/hda6              6048320    504848   5236232   9% /var

  显然,在我们的情况中,/ftp分区已经用了7G的空间,这很正常,因为我们允许用户
向这个分区上上传文件。

  du命令可以显示某个目录下的文件一共占据了多少空间,例如:

  $du /var/spool/mail

  /var/spool/mail

  单位是块数,每块1KB。

  如果某个目录有子目录,那么du会逐个测试所有子目录:

  $du /var/run

  4       /var/run/netreport

  4       /var/run/news

  84      /var/run

  如果你不喜欢这样,可以用-s选项让du程序显示某个目录的综述:

  $du -s /ftp

  7793364 /ftp

  缺省的时候,du输出的信息以块(block)为单位,每块是1KB,也可以设置它以字节
或者MB为单位,只要使用-b和-m开关,例如:

  $du -s -m /ftp

  7611    /ftp

  在发现了硬盘占用的主要原因之后,你就可以采取相应的步骤解决问题,如删除某些
程序,压缩某些数据文件等等。

  9.3.3 fsck程序

  当系统意外掉电或者类似的原因导致硬盘发生错误的时候,系统再次重启就会调用fs
ck程序对硬盘进行检查。通常这个检查过程是自动的,但是如果检查中发现的错误太多
,或者出现了无法自动解决的问题,那么系统将提示你输入超级用户口令并且启动一个
单用户shell,让你手工运行fsck解决问题。

  另外一种需要手工运行fsck的情况是系统启动了足够多的次数,系统希望你进行例行
的硬盘检查。这时系统在引导过程中提示你输入超级用户口令进入系统维护,或者直接
按下^D组合键继续正常的引导。

  无论哪一种情况,在你决定进行fsck检测之后,你都会进入一个单用户shell。当然,
也存在另外的情况:纯粹出于好奇心,你想对某个硬盘进行检查。

  在讨论fsck之前,你必须记住,原则上你不应该在一个已经连接的文件系统上使用fs
ck,相反,你应该把它拆卸下来再做检查。当你试图fsck一个已经连接的文件系统的时
候,你会得到这样的提示:

  $fsck /dev/hda5

  Parallelizing fsck version 1.15 (18-Jul-1999)

  e2fsck 1.15, 18-Jul-1999 for EXT2 FS 0.5b, 95/08/09

  /dev/hda5 is mounted.


  WARNING!!!  Running e2fsck on a mounted filesystem may cause

  SEVERE filesystem damage.


  Do you really want to continue (y/n)?

  如果你知道DOS的chkdsk命令在windows 下面执行会有什么结果的话,你就会理解为什
么这里应该回答no。fsck一个已经连接的文件系统也许会把它彻底摧毁,或者至少导致
一定程度的破坏。当然,有时你可能认为自己已经别无选择,比如/分区发现了问题。不
过即使在这种情况下,你需要做的也应该是把硬盘拆卸下来,安装到另外的机器上作为
一个附加文件系统进行检测。

  所以你应该首先把这个文件系统拆卸下来,然后再运行fsck:

  $fsck /dev/hda5

  Parallelizing fsck version 1.15 (18-Jul-1999)

  e2fsck 1.15, 18-Jul-1999 for EXT2 FS 0.5b, 95/08/09

  /dev/hda5: clean, 44157/1474560 files, 1994621/2945911 blocks

  现在这个文件系统上没有发现逻辑错误。

  fsck的语法是fsck –t [文件系统类型] [设备名字]。文件系统类型通常并不需要明
确标出。不过,要知道,尽管我们现在是手工执行fsck,不过如果它发现了错误,你对
它的提示差不多只能选择“y”,除非你是一个UNIX文件系统专家。一般情况下,系统的
启动脚本是以fsck –a [设备名]让fsck自动执行,如果它发现了诸如两个文件项交叉,
目录项错误等等比较危险的错误,它就会退出,然后系统提示你手工执行fsck。但是你
能看出来,对于这样性质的错误,你又能帮助fsck什么呢?你能做的就是机械地选择ye
s并且让fsck盲目地执行下去。

   9.4 自动作业程序

  许多任务都应该每隔一段时间执行一次,例如Usenet新闻传送,清空记录文件等等。
另外,你也许会希望让某个程序在未来的某个时间执行。本节我们将讨论这种自动作业
程序。

  9.4.1 cron程序

  cron程序用来周期性地启动某些进程。它通常使用crond程序或者crontab程序进行控
制,你可以简单地把crond守护进程和crontab程序看成一个,它们实际是用同样的方式
执行的,只是方法不同。

  要使用cron的功能,首先需要启动crond守护进程,这个进程可以简单地用命令行启动


  #/usr/sbin/crond

  也可以用ntsysv程序启动。后者我们已经多次提到过,这里不再叙述。

  我们先介绍最简单的设置cron的办法。在Linux系统中,cron程序的行为由/etc/cron
tab文件控制,这个文件由若干个部分组成,一般情况下,它包括设置执行参数的部分和
实际的命令部分,我们用一个示意性的crontab文件来描述它的基本格式:

  # /etc/crontab

  SHELL=/bin/bash

  PATH=/sbin:/bin:/usr/sbin:/usr/bin

  MAILTO=root

  HOME=/

  ########

  12 * * * * wall test crond

  在一串#上面的部分是为cron设置的环境,这个环境现在设置的是使用bash。其他行的
意义一目了然。

  在一连串#号下面的部分是cron的执行语句,每个语句占据一行,代表一个作业设置。
行可以由6个或者7个栏目构成,7个栏目的语句格式是

  [分钟] [小时] [日期] [月份] [周中的天数] [用户] [命令]

  分钟和小时就是你准备执行命令的钟点,日期则指的是月中的日期,例如,一个典型
的crontab登记项可以写成

  30 4 1 * * root rm –f /var/log/httpd/*

  这里的五个时间域有两个是*号,表示通配,因此这里的时间域就是每个月的1日早晨
4:30,执行命令的用户身份是root,后面的部分是命令。连起来就是在每个月的1日4:3
0自动删除/var/log/httpd下面的所有文件。

  容易看出问题发生在同时设置日期和星期几的两个域的时候。例如,0 0 13 * 5到底
是代表每月的13日零点,还是每星期五的零点,或者必须是“黑色的星期五”才能执行
呢?

  答案是这样的一个写法代表所有的13日加上所有的星期五都会执行这个命令。这一点
是比较容易出现问题的地方。

  同样,我们在前面使用的那个crontab登记项是在每个小时的12分,以root身份向每个
用户发送一个“test crond”消息。

  当你书写crontab文件时一定要注意,crond程序设计得比较成问题,它要求每行必须
以回车结尾:你可以在文件末尾加上几个空行,这不会影响crond运行,但是如果你的最
后一行忘了加上一个回车,那么crond程序将会忽略这一行,不去执行对应的作业。

  每个时间域都可以使用列表来设置多个值,例如,你想让某个任务在每天的2:00,4:
00和6:00运行,那么时间域的部分应该写成

  0 2,4,6 * * *

  另外一个常用的cron时间域符号是/,它代表“每”。举个例子来说,你想让某个任务
每隔5分钟执行一次,当然你可以在分钟域中用0,5,10,15,20,....55来处理这个问题,
但是你也可以用这样的方式来设置时间域:

  */5 * * * *

  在时间域中,可以使用减号代表集合,例如,在小时域中的8-12和8,9,10,11,12是等
价的。

  也可以用六个域来表示crontab表项,这时用户身份项被省略,其他各项的含义不变。

  一般情况下,只要crond守护进程在运行中,它会每隔1分钟察看一次/etc/crontab文
件,因此你修改了crontab文件之后不需要重新启动crond程序,只要简单地等待就可以
发现crond会刷新它的列表。如果发生了什么不寻常的事情,或者crond程序没有完成你
设定的作业,你可以察看/var/log/cron文件查阅问题的原因。

  为了与其它系统兼容,(我不知道这样做到底有什么意义),crond程序除了读/etc/
crontab这个主要的控制文件之外,还要去察看/etc/cron.d目录(这是一个比较古老的
故事了,传说在System V 对BSD的时代………我faint),里面存在的任何文本文件都会
被当成一个crontab文件来执行,例如,在我的/etc/cron.d目录下有一个文件kmod,其
内容是:

  # rmmod -a is a two-hand sweep module cleaner

  */10 * * * *    root    /sbin/rmmod -as

  于是crond程序会察看这个文件,按照crontab的语法解释它,所以每隔10分钟,cron
d程序会强制运行一次rmmod –as。如果你不想更改crontab,就可以把自己的cron作业
放到这个目录下面,crond程序就会自动执行它们,同样,不必重起crond程序。

  上面解释的是系统的cron作业设置,每个用户还可以设置自己的cron作业表。比如,
我是某个用户,我想每隔5分钟在虚拟控制台1上显示一下当前时间,那么我可以建立这
样的一个文件:

  */5 * * * * date > /dev/tty1

  同样,回车符是不可缺少的。假设文件名字为testcron,然后用crontab命令设置作业
表:

  crontab testcron

  这样就可以了。

  同样,任何一个用户都可以建立自己的cron文件。

  要察看某个用户自己设置的作业,使用crontab命令的-l-u 开关:

  # crontab -l

  # DO NOT EDIT THIS FILE - edit the master and reinstall.

  # (testcron installed on Tue Mar 21 20:21:32 2000)

  # (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)

  */5 * * * * date > /dev/tty1

  或者察看某个其他用户的作业:

  # crontab -l -u wanghy

  no crontab for wanghy

  要清除自己的作业列表,使用crontab –r命令。

  在crontab的设置中,缺省的解释方式是前六栏(或者前五栏)被正常解释,而命令栏
被直接解释成shell命令或者外部程序,因此命令栏里面可以包含空格。不仅如此,cro
ntab在它的命令栏里面将百分号解释为命令行回车,因此你可以在一行中使用那些需要
回车换行的命令或者需要输入的命令,例如:

  * * * * * root mail wanghy% test mail % I am testing cron%.%

  这样的一行表示每隔一分钟,crond将以root身份向wanghy发送一封信件,可以看看信
件的内容:

  From root  Tue Mar 21 20:30:00 2000

  Date: Tue, 21 Mar 2000 20:30:00 +0800

  From: root <root@wxd.asnc.edu.cn>

  To: wanghy@wxd.asnc.edu.cn


   test mail

   I am testing cron

.

  crond程序周期执行程序的功能可以而且经常被用来清除垃圾文件回收磁盘空间,例如
,Linux的core dump文件是讨厌的磁盘空间浪费者,我们用这样的命令行来解决它们:

  0 2 * * * root find / -xdev –name core –atime +7 –exec rm –f {}

  在每天晚上2:00删除所有一周以来没有访问过的core文件。

  如果你要察看crontab的手册页面,记住有两个crontab,一个是/etc/crontab,一个
是用来启动用户自己的cron调度的程序,可以分别用man –S 5 crontab和man –S 1 c
rontab来察看它们的手册页面。

  9.4.2 at守护进程

  at程序是另外一种管理作业的工具,与crond程序不同,at调度程序是设置程序在设定
好的某个时刻执行,但是只执行一次。例如,你可能想要开始一个极耗CPU时间的进程,
但是发现目前许多用户都在登录中,开始你的工作必然会使得系统速度与蜗牛相似,于
是你决定设置程序在三个小时以后执行,那时是凌晨1:00,除了个别网虫,其他人都睡
觉去了。

  要使用at调度程序,必须首先启动atd守护进程,语法很简单:

  #/usr/sbin/atd

  然后就可以用at命令调度作业了,例如,对我们刚才说的情况,想在三个小时之后,
也就是1:00开始这个进程(假设进程的名字是cpu_killer),那么,可以这样使用at命
令:

  $ at now + 3 hours

  这里设置程序将在三个小时之后执行,也可以使用明确的时间:

  $ at 1:00 kill_cpu

  无论哪一种情况,都会出现at命令的提示符:

  at>

  可以输入命令:

  at> kill_cpu

  at>

  在这个提示符下可以输入多个命令,直到你按下^D组合键:

  at> <EOT>

  warning: commands will be executed using /bin/sh

  job 2 at 2000-12-31 04:00


  at命令的一般语法是

  at [时间] [命令]

  时间参数是启动命令的时间。at命令认识类似下面形式的命令:

  1930 December 5   表示12月5日晚上19点30分

  19:30 December 5  跟刚才的形式等效

  11:00 pm    表示夜间23:00

  11:00 P   同上

  now + 1 week   从现在开始一周以后

  4:30 Tuesday next week  下星期二4:30

  5:15 12/05/2000         2000年12月5日早晨5:15

  不是每个用户都可以使用at调度作业。与at执行相关的权限文件有两个,分别是/etc
/at.allow和/etc/at.deny。如果at.allow文件存在,系统试图从中读出可以执行at命令
的用户名字,其他的用户(除了root)都无法使用这个命令;否则,如果at.allow文件
不存在,系统将寻找/etc/at.deny文件,如果存在的话,那么系统认为所有人都可以执
行at命令,除了列在/etc/at.deny中的用户;最后,如果这两个文件都不存在,除了ro
ot以外的其他用户将无法使用at命令。

  可以在设置at命令之后再次对at队列进行编辑,首先,可以使用atq命令显示作业:

  $atq

  1       2000-12-05 04:05 a

  2       2000-12-31 04:00 a

  如果出于某种原因你想删除某个作业,可以使用atrm命令:

  $atrm 1

  $atq

  2000-12-31 04:00 a

  第一个作业已经被删除。

  9.5 备份和恢复

  没有任何系统是完全可靠的。无论你使用什么样的系统,你都应该考虑使用数据备份
来对付潜在的数据损失灾难。在今天,备份磁带机,CD-R和活动式硬盘已经使得备份需
要的介质不是那么困难(想象一下用软盘备份一个8GB的分区!)

  9.5.1 tar程序和数据备份

  如同你所知道的,tar程序和磁带机是联系在一起的。即使在今天,最常用的备份方式
仍然是用tar命令将数据写到磁带或者活动磁盘,或者干脆扔到某个网络文件服务器上。

  首先我们必须了解一些东西。备份磁带机是最常见的海量数据备份工具,在Linux下面
可以使用大部分磁带机,但是你必须了解它们的设备名字。在Linux中,按照磁带机的接
口是IDE或者SCSI,无论哪一种,你必须在编译内核时打开对磁带机的支持,这部分支持
在“Block Device”选单中:



  图9.7 配置磁带机支持

  按照Linux的一些说明,SCSI的磁带机设备名字是/dev/st*。例如/dev/st0,/dev/st
1等等,而IDE接口的磁带机设备名字是/dev/ht*。另外还有一种QIC-02类型的磁带机,
其设备名字是/dev/rmt*。

  无论哪一种,都可以直接用tar命令进行备份。tar命令的语法相当复杂,关于这个问
题我只能建议你去参考联机手册。但是对于我们的情况,实际上只要掌握备份和恢复的
几个主要形式就足够了:

  要把某个目录下面的所有文件备份下来,使用tar的c选项,例如,你的磁带机是/dev
/ht0,那么可以使用下面的命令把整个文件系统备份到磁带上:

  tar cvf /dev/ht0 /

  缺省的情况下,tar会递归查找所有文件并且将它们存储在对应的设备文件(磁带机上
)。

  要将磁带中备份的数据回复,使用

  tar xvf /dev/ht0

  如果在压缩的时候使用了绝对路径,那么恢复的时候tar会自动把它们放到原来的路径
下,如果路径不存在就建立它们。为了避免这种情况,可以进入到某个子目录中,然后
执行tar命令,例如:

  $ cd /willback

  $ tar cvf /dev/ht0 *

  或者在根目录下面:

  $ tar cvf /dev/ht0 willback

  尽管tar是最常见的备份/恢复程序,但是它也存在许多问题,最主要的是不支持分卷
压缩,因此如果你的数据超过了一盒磁带的容量,那么就无法用tar命令对它们进行备份
。另外,当你的磁带上有坏块的时候,tar命令也不会正确地处理它们。

  实际上,tar命令更常用的办法是用来给文件归档。在过去的时代,UNIX发行版本经常
以磁带的形式提供,对应地也经常用tar命令整个复制文件系统。现在,Linux发行版本
可以容易地从CD-ROM上得到,相反,我们的数据会无序地分布在磁盘的各个目录下面,
或者至少分布在一个有很多层次的目录下面。在备份的过程中,我们实际上只需要备份
一个完整的目录。而且,我们往往也不是把数据备份到磁带机,而是把它们归并在一起
,然后传送给远程网络服务器或者干脆用活动硬盘装走。

  为了解决这种问题,可以使用tar命令将目录压缩为文件,例如:

  $ tar cvf mydata.tar mydata

  将把mydata子目录中的所有文件打包成mydata.tar文件,然后你可以考虑如何处理这
个文件。要展开这个文件,只要:

  $ tar xvf mydata.tar

  tar命令简单地把文件打包,并不对文件进行压缩。你也许想要使用压缩程序以便节省
备份需要的磁盘空间,这可以使用gzip和compress实用程序完成。第一种方法是先将文
件打包,然后用gzip或者compress来处理它们:

  $compress book.tar

  $ls -l book.*

  -rw-r--r--   1 root     root     34919679 Mar 22 18:18 book.tar.Z

  这个动作把当前目录下的book.tar打包成为book.tar.Z,而book.tar则被删除。如果
要展开这个文件,使用uncompress命令:

  $uncompress book.tar.Z

  $ls -l book*

  -rw-r--r--   1 root     root     75735040 Mar 22 18:18 book.tar

  uncompress命令的行为正好相反,它将.Z文件展开,并且删除.Z文件。

  你可能会觉得这样的操作太麻烦,那么就可以使用tar的Z选项,例如,你想把某个目
录html下面的全部文件打包并且直接调用compress命令进行压缩:

  $ ls -l |grep html

  drwxr-xr-x  17 775      531          4096 Mar 10 09:19 html

  可以用:

  $ tar Zcvf book.tar.Z html

  可以看到html目录已经被压缩:

  $ ls -l book*

  -rw-r--r--   1 root     root     34919679 Mar 22 18:30 book.tar.Z

  要展开这样的文件,当然可以uncompress之后再tar xvf,但是也可以一次完成:

  $ tar Zxvf book.tar.Z

  与这个功能类似,也可以调用GNU的gzip程序进行压缩和解压。例如,把book.tar用g
zip 进行压缩:

  $ gzip book.tar

  book.tar程序将被删除,同时建立一个压缩格式的book.tar.gz。

  和compress相似,也可以一步完成归档和压缩,这是通过-z开关完成的:

  $ tar zcvf book.tar.gz html

  等价于首先用tar命令归档,然后用gzip命令进行压缩。

  同样,如果你得到了一个book.tar.gz(许多人喜欢把这种文件的名字命名为book.tg
z),那么你需要首先使用gzip命令解除压缩,然后再用tar展开:

  $ gzip –d book.tgz

  $ tar xvf book.tar

  当然也可以归并为一个:

  $ tar zxvf book.tgz

  tar命令到处都有,而gzip程序也包含在一切Linux发行版本中,你在网络上看到的压
缩归档文件几乎全是.tar.gz或者.tgz。

  9.5.2 dump、cpio和其它程序

  除了tar程序,常用的备份程序还有dump和cpio。

  dump命令和tar命令其实差不多,但是它支持分卷和增量备份的概念。而且,如果你要
与其它UNIX系统的用户联系,那么你会发现dump命令非常有用,因为许多UNIX系统的ta
r命令不支持超过100个字符的文件名。

  尽管dump命令非常有用,但是它不太好用。如果你一定要建立一个复杂的多级增量备
份系统,你需要研究这个程序。所谓“多级增量备份”大概是这样的:每星期一备份整
个文件系统;星期二备份从星期一基础上更新的内容;星期三备份从星期二基础上更新
的内容;…………如此下去,直到下一个星期一再进行一次完整备份。

  无论如何,我们在这本书里面不想讨论dump。你可以自己参考其它一些UNIX系统管理
员教程或者研究手册页面来得到足够的信息。

  另外一个著名的备份/回复程序是cpio程序,它和tar程序很类似。许多人用cpio程序
代替tar程序进行备份,因为它可以实现多卷磁带的备份,还可以跳过磁带上的坏区。

  cpio的命令格式也相当复杂。不过对于我们的情况,只需要使用两个参数:-i和-o。
使用-o参数的时候,它从标准输入读入文件名,然后归档并且送到标准输出,因此我们
可以用cpio程序加上一些重定向命令来进行归档。例如,我们想要把当前目录下面的所
有word文档用cpio合并成一个document文件,那么可以执行

  $ ls *.doc | cpio -o > documents

  如果要展开这个文件,可以使用

  $ cpio –i < documents

  需要注意的是,cpio会自动检查文件的日期,假如在备份中发现文件的日期比归档文
件中的旧或者相同,它会自动跳过对应的文件。在恢复时也类似。这样的功能使得自动
的增量备份成为可能。

  要备份整个文件系统,可以用find和cpio的管道构成,例如:

  find /home | cpio –o > home_filesys_backup

  就把/home目录下面的所有文件备份到home_filesys_backup文件中。

  如果你只想恢复备份中的部分文件,使用类似这样的命令:

  echo '*.doc' | cpio –o < my_backupfile

  就可以只恢复名字为*.doc的文件。

  适当地组合find,grep和cpio命令可以建立出良好的增量备份系统。

  还有一个经常使用的命令是dd。它有点类似于MS-DOS的disk copy实用程序。在过去,
许多人使用dd程序直接地复制两个硬盘,这是把某个系统快速地安装起来的重要手段。
不过在今天,特别在Linux的环境下,这样的做法已经相当少见了。

  dd程序现在一般用来建立软磁盘的全盘映像或者从磁盘映像建立系统软盘。它的语法


  dd [if=文件系统1] [of=文件系统2]

  例如,你有一张1.44MB软盘,想要把它的内容保存在硬盘上。不幸的是它不是Linux文
件格式。因此你决定使用Linux建立磁盘的绝对映像,这可以使用下面的命令:

  dd if=/dev/fd0 of=fdimage

  这样就会将软盘的内容映像到fdimage文件中。

  相反,当你想要写出fdimage的内容到某个磁盘的时候,使用

  dd if=fdimage of=/dev/fd0

  dd命令有一些参数,主要是确定每次读/写多少个字节。我的印象是这些参数意义不大
,如果你对此好奇,参考手册页面。

  9.5.3 使用软磁盘

  尽管使用软磁盘备份的情况已经相当少见,但是用软盘传递一些比较小的文件的情况
仍然非常常见。

  在Linux下面使用软盘首先要将它格式化。由于Linux的特性,你可以将软盘格式化为
一个ext2文件系统,也可以使用MS-DOS文件系统。

  要将软盘做成一个ext2文件系统,首先需要将它格式化,格式化是通过fdformat命令


  fdformat [设备名字/类型]

  例如,要将软盘格式化为1.44M格式,使用

  $fdformat /dev/fd0H1440

  fdformat命令会自动格式化和校验软盘。

  fdformat的常用格式有:

  fdformat /dev/fd0d360

  fdformat     /dev/fd0h1200

  fdformat     /dev/fd0h720

  fdformat   /dev/fd0H1440

  ……………

  等等,参考手册页面可以得到更多的信息。

  在格式化之后,需要建立文件系统:

  $ mkfs /dev/fd0

  然后将文件系统mount到某个目录下面,就可以使用了。

  将软盘做成MS-DOS类型可以用同样的方法来完成,但是更常用的办法是mtools。由于
我们主要讨论Linux系统,在本书中不会讨论mtools,你可以自己参考关于mformat,mc
opy,mdir,mcd等命令和/etc/mtools.conf文件的手册页面。



--
当我越过无尽虚空的时候,我看见星辰的欲望,光荣和毁灭,这是光辉世界的宿命,
一切的一切,最终必将落入黑暗和虚无。
所以,我随着星光飞翔,去逃脱必然的终结,也许有一天,我将回到世界的原初,
等待新的星辰的诞生。
尘埃是星的起源,星的终结。


※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.112.90.20]
--
※ 转载:·BBS 荔园晨风站 bbs.szu.edu.cn·[FROM: 192.168.1.115]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店