第11章 Linux系统管理
11.1 系统管理概述
系统管理是指针对系统进行的一些日常管理和维护性工作,以保证系统安全、可靠地运行,保证用户能够合理、有效地使用系统资源来完成任务。
11.1.1 系统管理工作的内容
Linux的系统管理工作大致可分为基本系统管理、网络管理和应用管理3部分。对于大型系统,每部分都设置专门的管理员,如系统管理员、网络管理员、数据库管理员、应用系统(WEB系统、邮件系统)管理员等。小型系统则往往由一人负责全部管理工作。
本章只介绍基本系统管理,主要包括以下几项内容:
● 启动与关闭系统;
●用户管理;
●文件系统维护;
●系统备份;
●系统监视与控制;
●软件安装。
11.1.2 系统管理工具
系统管理员通常使用以下3种方法来管理和维护系统:
(1) 直接编辑系统配置文件和脚本文件。Linux系统的所有配置文件都是纯文本文件,大多数系统配置文件位于/etc和/usr/etc目录下,可以用vi等编辑器直接修改。这是最基本的,有时也是唯一可用的手段。
(2) 使用Shell命令。Linux系统提供了丰富的系统管理命令,大多数管理命令位于/sbin和/usr/sbin目录下。这些命令是最安全、最有效,也是最灵活的系统管理工具。
(3) 使用图形化管理工具。Linux的各个发行版都提供了一些图形界面的系统管理工具。这类工具使用起来简单方便,能完成大部分管理工作。
应当指出的是,图形化的系统管理工具虽然非常易用,但不能完全替代命令方式的操作。这是因为:第一,这些工具依赖于发行版本,缺乏一致性;第二,它们受图形界面操作方式的限制,无法获得命令所具有的高效率、高灵活性和自动化的特性;第三,当系统发生故障时,图形化工具对于诊断和修正问题没有太大的帮助。所以,作为Linux系统管理员,掌握前两种方式,尤其是命令方式是非常必要的。
11.1.3 root的权威性与危险性
与Windows系统的Administrator账号相比,Linux赋予root更多的权限。root几乎可以对系统做任何事情,他拥有对系统内所有用户的管理权,对所有文件和进程的处置权,以及对所有服务的使用权。Linux系统总是假设root知道自己在干什么,而不会加以限制。这种信任对于熟练的系统管理员来说是权威和自由,而对于初学者来说则可能是潜在的灾难。因为一旦某个操作失误,就有可能给系统造成重大损失以至崩溃。
由于root账号的权威性,系统管理员要严格保护root口令,防止口令泄露。口令应足够复杂、足够长,并经常更换。此外,系统管理员还应具有一个普通用户的账号,登录时(尤其是远程登录时)应以普通用户身份进入系统,只在必要时变换成root。
11.2 启动与关闭系统
11.2.1 系统的运行级别
Linux系统用运行级别(run level)来刻画系统的运行状态。在不同的状态下,系统启动的程序不同,提供的服务功能也就不同。Linux系统设有7个运行级别,见表10-1。
系统通常工作在1~5级,每一级都是在上一级的基础上增加启动了某些特定的服务。比如,2级比1级增加了多用户支持,3级又增加了网络支持,5级又增加了图形界面的支持。
系统启动时的默认级别在文件/etc/inittab中指定,桌面系统的默认启动级别通常是5,服务器系统的默认启动级别通常是3。root可以通过修改此文件来改变系统默认的运行级别。系统启动后root也可以用init(也就是telinit)命令改变系统的运行级别。
init命令的格式是:init 运行级别
例如:init 0为关机;init 5为启动X系统;init 3为停止X系统;init 6为重新启动。
11.2.2 系统的启动
系统的启动过程是:系统加电后,计算机硬件BIOS进行开机自检,然后,从引导盘(通常是硬盘)的第1个扇区中加载一小段引导代码到内存。引导代码随后开始运行,负责将操作系统的内核装入内存。内核加载完毕后,引导代码将控制交给内核。
Linux内核开始运行,首先进行硬件和设备的初始化,挂装root文件系统,然后启动init进程(/sbin/init程序)运行。init是系统内核启动的第一个用户级进程,其进程号为1。该进程在系统运行期间始终存在,在系统的启动和关闭时起着重要的作用。在启动阶段,init进程负责完成系统的初始化,包括挂装各文件系统和启动一系列后台进程,将系统一级一级地引导到默认的运行级别。初始化过程完成后,在各控制台上的login登录进程都已启动运行,守侯用户登录。
系统管理员对系统启动的过程不能直接干预,但可以通过编辑系统启动脚本/etc/inittab文件来改变系统的启动配置。
11.2.3 系统的关闭与重启
1. 关闭系统
关闭Linux系统不应直接切断电源,而应使用系统关机命令。这主要是因为Linux利用磁盘缓冲区缓存了要写入磁盘的数据,若遇系统掉电,这些数据可能还未写入磁盘,有可能会造成文件系统数据丢失或不一致。在关机命令执行的过程中,系统要将缓冲区中的数据写进硬盘,以保持文件数据的同步。此外,在多用户工作的环境下,妥善的关机过程可以提醒用户及时保存文件和退出,避免因意外中断而造成损失。
在多用户模式下最安全的关机方法是用shutdown命令关闭系统。命令首先向各登录用户的终端发送信息,通知他们退出,并冻结login进程。在给定期限到达后,向init进程发信号,请求其改变运行级别。init进程向各个进程发送SIGTERM信号,要它们终止运行,将磁盘缓冲区内容写入磁盘,然后拆卸文件系统,进入单用户或关机模式。注意:对于普通用户来说,系统进入单用户模式运行就等同于关机。
shutdown命令
【功能】关闭系统,缺省是进入单用户模式。
【格式】shutdown [选项] 时间 [警示消息]
【选项】
-h 关闭系统(0级);
-r 重新启动系统(6级);
【参数】时间可以是关机的绝对时间,格式为hh:mm;也可以是关机的延时时间,即以分钟为单位的延时数字;还可以是now,表示立即关机。警示消息指定向登录用户发出的关机警示信息。
例11.1 10分钟后进入单用户模式:
# shutdown 10 “It’s time for routine maintenance, please logout now.”
此时,所有登录用户的屏幕上都会出现root发出的关机警示以及系统的关机提示信息:
Broadcast message from root (tty1) (Tue Mar 18 21:37:49 2008):
It’s time for routine maintenance, please logout now.
The system is going DOWN to maintenance mode in 10 minutes!
以上信息将每分钟出现一次,以倒记时的方式提示距关机时刻的分钟数。10分钟后系统降为单用户级别运行,此时只有root可以进行系统维护操作。
在没有多个用户登录的情况下,root可以使用其他更简单的关机命令,如用halt、init 0或init 1命令来关机。
2. 重启系统
当添加了新的硬件或现有硬件出现问题不能复位时,通常需要重新启动系统。如果修改了某些与内核相关的配置文件,为使修改生效,也需要重启系统。系统重启过程是系统关闭然后再启动的过程。
重新启动系统的命令是shutdown -r命令。简单的重启可以使用reboot或init 6命令。
应当注意的是,Linux系统中的很多部分可以单独地对待,比如X Window系统及网络。因为它们没有与内核捆绑,因而可以独立地启动、关闭或重启。系统管理员应尽量针对某个软件进行停止或重启操作,在非必要时避免系统级的关机或重启操作。
11.3 用 户 管 理
Linux是一个多用户系统,通常会拥有少至几个多至几百个的可登录用户。为确保系统的安全性和有效性,必须对用户进行妥善的管理和控制,这是系统管理的一项重要工作。
11.3.1 用户管理概述
用户管理就是对用户账号进行管理。用户账号是用户在系统中的标识,用以鉴别用户身份,限制用户的权限,防止用户非法或越权使用系统资源。
用户管理的工作包括建立、删除用户和用户组,以及管理用户的登录口令等。
1. 用户
系统中每个用户拥有一个唯一的用户名(login name)和用户标识符(UID)。用户名供用户登录系统使用,而系统则通过UID来识别用户、定义文件和进程的归属关系。
系统将用户分为以下3类:
(1) 超级用户:每个系统都有一个超级用户账号,在安装系统时建立。超级用户的用户名为root,UID是0。
(2) 普通用户:普通用户是指除root外的可登录的用户,由root建立。普通用户的UID大于或等于500。
(3) 特殊用户: 特殊用户是系统内部使用的账号,不能登录使用。特殊用户的账号有bin、sys、nobody、daemon等,UID为1~499。通常这些账号只能被系统守护进程使用,用来访问具有特殊UID的文件。
系统中每个用户都对应一个用户账户(保存在passwd文件中)和口令(保存在shadow文件中)。root和普通用户还拥有自己的主目录和邮箱。
用户登录后可以用su命令改变身份,常用于系统管理员在必要时从普通用户改变到root。
su命令
【功能】转变为另一个用户。
【格式】su [-] [用户名]
【说明】不指定用户名时,转换到root;指定“-”选项时,同时变换环境。普通用户执行su时,须输入要转变为的用户口令。
例11.2 转变为root:
$ su - #转变为root
password:(输入root的口令)
#(转换为root账号,环境也变为root的环境)
...
# exit
$ (回到原来用户账号)
2. 用户组
用户组是可共享文件和其他系统资源的用户集合。分组的原则可以是按工作关系或用户性质来划分。例如,参与同一个项目的用户可以形成一个组。一个组中可以包含多个用户,同组用户具有相同的组权限。一个用户也可以归属于多个组。每个用户组有一个组账户(保存在group文件中),用唯一的组名和组标识符GID标识。
3. 用户权限
Linux使用属主和属组概念来描述文件和进程的归属关系,在此基础上定义对文件的访问权限。关于文件的归属关系及权限定义在第2.3.1小节中已经介绍了,这里需要介绍的是进程的归属关系和权限定义。进程的属主通常是启动该进程的用户,进程的属组就是该用户所在的用户组。进程的属主与属组属性限制了它对文件的访问权限:文件的属主进程对它有绝对的控制权;同属组的进程对其享有共同的组权限;其他进程只具有其他用户的权限。属主为root的进程可以超越任何权限限制来访问文件。
例11.3 显示进程的属主、属组、PID和命令:
$ ps -o user,group,pid,args
USER GROUP PID COMMAND
cherry faculty 1978 bash
cherry faculty 3600 ps -o user,group,pid,args
$
11.3.2 用户管理的相关文件
1. passwd文件
用户账号文件/etc/passwd存放用户账户的基本信息。每个用户账户占一行,每行由7个域组成,用冒号分隔各个域,格式如下:
登录名:密码:用户标识符UID:组标识符GID:用户信息:主目录:登录Shell
passwd文件的属主为root,权限为644,即任何人可读,root可读/写。
例11.4 一个passwd文件的部分内容:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
…
cheng:x:500:500:cic:/home/cheng:/bin/bash
cherry:x:501:501::/home/cherry:/bin/bash
密码域用于放置用户登录口令。但由于passwd文件未加密,且所有人可读,故通常的做法是将加密后的口令放在只有root可读的shadow文件中。出于习惯,在密码域中通常只放一个“x”字符,其他符号也可以。
用户信息域中存放用户相关的信息,如真实姓名、办公室地址、电话等。这些信息也可以通过usermod命令或chfn命令修改(见man手册页),用finger命令查看(见11.2.2小节)。此域可以不填写。
主目录域标明用户的主目录。当用户登录时,Shell自动将主目录作为它的当前目录。普通用户的主目录一般放在/home下,也可以指定其他位置。
登录Shell域指定用户登录时运行的程序,通常是某个版本的Shell程序,但也可以是其他某个程序。若未指定则默认启动/bin/sh(对于Linux系统来说,sh就是bash)。
2. shadow文件
现在的Linux系统都使用了shadow技术,即将加密后的口令放在/etc/shadow文件中,而在passwd中相应的位置只放一个“x”。shadow只对超级用户是可读的,一般用户无法读取。shadow文件保存了所有用户口令的加密信息以及口令的有效期信息。每个用户一行,每行由如下9个域组成,用冒号分隔各个域:
登录名:加密口令:口令上次更改时间:口令再次更改的最小天数:口令再次更改的最大天数:口令失效前警告用户的天数:口令失效距账号被封的天数:账号被封时间:保留字段
shadow文件的属主为root,权限为400。
例11.5 一个shadow文件的部分内容:
root:y9e2Gzjq/MCCc:11145:0:99999:7:::
bin:*:11145:0:99999:7:::
daemon:*:11145:0:99999:7:::
adm:*:11145:0:99999:7:::
…
cheng:$1$PwqdIiQ0$vBYHwbSA/Mt31OICCwSrI/:11242:0:99999:7:::
cherry:*$1$QRfSIh.2$6UokDtNIau1sjTsEAe3Kp0:11258:0:99999:7:::
其中,第4字段为0表示用户可以随时更改口令;第5字段为99999表示口令永不失效;第6字段为7表示口令失效前7天系统会警示用户口令即将失效;其余字段为空表示没有相应的设置。
3. group文件
组账号文件/etc/group保存了各个组的账号信息,每个组占一行,每行包括4个域,格式如下:
组名:口令:组描述符GID:用户列表
group文件的属主为root,权限为644。
例11.6 一个group文件的部分内容:
root::0:root
bin::1:root,bin,daemon
daemon::2:root,bin,daemon
sys::3:root,bin,adm
…
cheng::500:cheng
faculty::501:cherry
11.3.3 用户管理
1. 添加用户
添加用户的命令是useradd,它主要完成以下工作:
(1) 向passwd、shadow和group文件写入用户信息。
(2) 在/home目录下建立用户主目录。
(3) 将/etc/skel目录下的文件拷贝到用户主目录下,作为用户的环境初始化脚本。
(4) 在/var/spool/mail目录下建立用户的邮箱。
useradd命令
【功能】添加一个新用户。
【格式】useradd [选项] 用户名
【选项】
-d 目录 指定用户的主目录,否则使用默认的主目录/home/用户名。
-e 日期 指定用户账号的终止日期,格式为YYYY-MM-DD。
-g 组名 指定用户的用户组,否则默认使用与UID相同的GID。
-s shell 指定用户的登录Shell,否则默认使用bash。
例11.7 用useradd命令添加用户:
# useradd -g faculty zhaoxin #添加新用户zhaoxin,组为faculty
# useradd -e 2008-12-31 liuliu #添加新用户liuliu,到2008年底终止
2. 设置用户口令
系统管理员须为新添加的用户设置第一个口令。口令经加密后,存放在shadow文件中。此后用户可以登录修改自己的口令,root可修改任何用户的口令。
有些时候,root需要对用户的口令设置某些限制。比如,为督促用户定期更换口令,root可以设置用户口令的期限。这是通过修改/etc/shadow文件中相应行的第5个域来实现的。另外,有时出于用户本身的原因或者系统安全的需要,root需要封锁一个账号。被封锁账号的口令会暂时失效,不能够再登录,直至解禁。封锁用户的方法是在/etc/shadow文件中找到指定的用户,在其口令域的前面插入一个“!”符号。解封时删除这个标记即可。
以上对用户口令的操作都可通过编辑/etc/shadow文件或使用passwd命令来完成。
passwd命令
【功能】设置用户口令。
【格式】passwd [选项] [用户名]
【选项】
-d 删除用户的口令,使用户登录时不需要口令。
-l 封锁用户账号,使用户暂无法登录。
-u 解除封锁用户账号,使用户恢复登录。
-xn 设置口令的有效期限为n天。口令到期后必须重新设置
才可登录。
【说明】没有指定用户名时则是修改自己的口令。
例11.8 用passwd命令设置口令:
# passwd zhaoxin #为新用户zhaoxin设置口令
…(输入口令)
# passwd -x10 zhaoxin #设置zhaoxin口令的有效期为10天
#
另外,如果要强制用户下次登录时必须修改口令,可以用命令chage -d 0 用户名。
3. 设置用户登录环境
用户登录后,系统会自动执行一些初始化脚本文件,为用户建立Shell环境。主要的环境配置文件有如下几个:
(1) 系统级Shell启动文件:用于设置系统级的Shell环境变量及启动程序的脚本文件是/etc/profile。在用户登录时启动的登录Shell首先执行这个文件,它负责对Shell的一些重要的环境变量(如PATH等)进行初始设置。
(2) 登录Shell启动文件:登录Shell需要为自己和子Shell建立起完整的运行环境。它首先执行/ect/profile,建立系统级的环境变量,然后在用户主目录下查找登录Shell启动文件,找到后就执行它。登录Shell启动文件负责建立与具体用户相关的环境变量(如LOGNAME、TERM等)以及用户自定义的环境变量。用户可以通过修改此文件达到定制环境的目的,还可以在此文件中指定每次登录时要执行的程序。登录bash的启动文件可以是~/.bash_profile、~/.bash_login或~/.profile。bash将按顺序查找这3个文件,如能找到就执行找到的第一个文件。
(3) Shell启动文件:每当一个交互Shell启动时,Shell都将执行一个启动文件,它设置与具体用户相关的环境变量及用户自定义的环境变量。bash的启动文件是~/.bashrc。在登录Shell启动时,通过执行登录启动文件(如.bash_profile)调用此文件执行,在子交互Shell启动时则直接执行此文件。
(4) 登录Shell退出文件:当从登录Shell退出时,Shell将在主目录下查找退出登录文件,如果找到就执行它。bash的退出登录文件是~/.bash_logout。用户可以修改此文件,让它完成一些必要的退出操作,比如备份和清理文件等。
以上文件中,第1个是全系统共用的环境设置文件,只有root可以修改。后3个是用户可定义的环境设置文件,它们的最初版本是由系统提供的存放在/etc/skel目录下的默认环境配置文件,在创建用户时它们被复制到用户的主目录下。用户随后可以修改它们以适应自己的需要。root可以通过修改/etc/profile和/etc/skel目录下的文件来调整系统级以及默认的用户级环境,不过对它们的修改会影响到全系统的用户,没有特殊需要最好不要改动它们。
例11.9 定义用户自己的环境变量和登录时要执行的文件:
$ echo “PROJ=$HOME/project/hoc; export PROJ” >> ~/.bash_profile
$ echo “~/routine” >> ~/.bash_profile
$ . .bash_profile
Hello cherry!
$
此例中用两个echo命令向.bash_profile文件尾添加了两行,一行是定义导出变量PROJ,将一些经常使用的长路径名定义在变量中可以简化命令的输入;另一行是执行主目录下的routine脚本。routine是用户自定义的一些登录初始化操作,比如查看邮件、显示今日日程等。此例中只是显示了一句问候语。在下次登录时,这个修改即可起作用。为了立即看到它的执行结果,可以用“.”命令执行它,如例11.9所示。
4. 修改用户信息
与用户账号相关的信息保存在/etc/passwd和/etc/shadow文件中。root可以直接修改这些文件来修改用户的信息,也可以用系统提供的命令来修改用户信息。
修改用户账户信息的命令是usermod,它有许多选项,可以修改passwd文件中的各项,以及shadow文件中的第2、7、8项。关于usermod命令的用法读者可参看man手册。
5. 删除用户
删除用户的命令是userdel,它主要完成以下工作:
(1) 删除passwd和shadow文件中此用户的行。
(2) 修改group文件,如果该用户是组中唯一的成员则删除该组的行,否则从组用户列表中删除该用户。
(3) 若带有-r选项,则删除用户的主目录以及此用户的mail邮箱。
userdel命令
【功能】删除用户。
【格式】userdel [-r] 用户名
【选项】该命令只有一个-r选项,表示删除用户的同时删除其主目录及mail邮箱。没有此选项时则保留它们。
例11.10 用userdel命令删除用户:
# userdel -r zhaoxin #删除用户zhaoxin,不保留其主
目录和邮箱
11.3.4 用户组管理
Linux中如果创建用户时不指定用户组,则系统默认地为用户生成一个组,其组名与用户名相同。如果需要分组,则应先建立起用户组,然后向组中添加用户。
建立一个用户组的命令是groupadd,格式是groupadd组名。
向组中添加用户的方法有多种,一个是在建立新用户时指定该组的GID,另一个是用usermod命令修改一个已有用户的组属性,再有就是直接修改passwd和group文件。从组中删除一个用户的方法也与此类似。
删除一个用户组的命令是groupdel,格式是groupdel 组名。删除组时,若该组中仍包含有用户,则必须先将这些用户从组中删除(或改变他们的组),然后才能删除组。
11.4 文件系统维护
文件系统维护的工作包括创建文件系统、挂装和拆卸文件系统、监视文件系统的使用情况以及必要时对文件系统进行修复。
11.4.1 文件系统的目录结构
Linux文件系统的目录结构是树型可挂装的结构。与同是树型结构的Windows文件系统相比,Linux文件系统具有自身明显的特征。
首先,在Windows系统中,不同分区上的文件系统各自是一棵独立的树,用“盘符”代表树根,如:C:\、D:\、E:\等。从一个分区的目录树进入到另一个分区中时,需要先切换盘符。若新添一个本地分区,后面的盘符可能也会跟着改变。与此不同的是,Linux的目录树是唯一的,所有文件都放在从根目录开始的目录树下。Linux系统采用了分区挂装的概念,所有分区都要挂到根文件系统下的某个挂装点上,然后通过根目录来访问。不管挂入的是本地磁盘分区还是网络上的文件系统,它们都与根文件系统无缝结合,访问这些分区就如同访问根文件系统所在分区一样。
另外,在Windows系统中,文件几乎可以放在任何地方。安装软件时,所有的文件(如可执行文件、配置文件、数据文件、帮助文件等)通常都放在该软件自己的目录下,其存放结构由软件自行组织,而不是由系统设定。而在Linux系统中,文件是根据功能而不是按所属的软件来划分的。软件包中的各个文件应安放到哪些目录中由操作系统决定。例如,软件的文档应放在/usr/share/doc/目录下,手册页要放在/usr/share/man/目录下,可执行文件要放在/usr/bin目录下等。所有文件正是以这种方式与系统层次紧密结合,给管理提供了方便。
关于某个文件应该放入哪个目录,各个发行版都有自己的观点。为了避免产生混乱,在Linux面世不久就开始了对Linux文件系统的标准化活动。Linux文件系统标准FSSTND于1994年推出,之后FSSTND又扩大到Unix系统,形成了文件系统层次标准FHS(Filesystem Hierarchy Standard)。FHS标准使得Linux发行版有了可以遵循的标准,因而得到众多Linux发行版的支持。它也使得软件开发者和用户可以预知文件和目录的安装位置。
目前FHS的最新版本是2004年发行的FHS2.3,表10-2列出了基于FHS标准的Linux目录树的重要部分。
根目录是在系统启动时建立的,其他目录都可以用挂装的方式挂在根文件系统下的某个位置。根目录下一般不含任何非目录文件。
/usr目录是Linux文件系统中最大的系统目录之一。它存放了所有的命令、运行库等。/usr目录下的内容与特定系统无关,在系统运行期间保持不变,因而可以建在独立分区中,通过网络共享,以只读方式挂装。
/var目录存放有假脱机目录、日志文件、记账信息和其他各种快速增长或变化的信息。这些信息是系统运行期间产生的,与该系统密切相关。所以,如果是一个运营的系统,最好把/var建在一个独立的分区中。
有关文件系统结构的具体描述可参看hier手册页(man hier)。
11.4.2 存储设备命名规则
1. 磁盘设备的命名
在Linux系统中,每个磁盘有一个设备名,对应的设备文件是/dev/磁盘设备名。磁盘的命名规则如下:
IDE设备。一个系统可以挂4个IDE设备,它们的命名规则是:IDE-1主盘为hda,从盘为hdb;IDE-2主盘为hdc,从盘为hdd。如果还有IDE Raid卡,则依次命名为hde,hdf,hdg,hdh。
SCSI与USB存储设备。Linux系统将SCSI盘与USB盘同等看待。SCSI/USB存储设备命名规则是:系统上第1个SCSI/USB盘是sda,多个盘的命名顺序是sda、sdb、sdc、…。
2. 磁盘分区设备的命名
一个磁盘必须分区后才可以被操作系统使用。磁盘分区(partition)是磁盘上可独立管理的区域。一个磁盘可以分为1~3个主分区和0~1个扩展分区。扩展分区又可以划分为多个逻辑分区。扩展分区本身无法用来存放数据,它的作用是“扩展”出若干个逻辑分区以增加分区的数目。任何操作系统只能使用硬盘上的主分区和逻辑分区。
每一个磁盘分区(主分区或逻辑分区)都可以安装一个独立的文件系统,具有独立的设备文件名。磁盘分区的设备名为“磁盘的设备名+分区号”。主分区或扩展分区对应的分区号为1~4,如:hda1~hda4。扩展分区中的逻辑分区则从5开始编号。图10‑1示意了磁盘分区设备的命名规则。整个磁盘划分了2个主分区和1个扩展分区,分别命名为hda1、hda2和hda3。扩展分区中又划分了3个逻辑分区,分别命名为hda5、hda6和hda7。
图10‑1 磁盘分区及命名规则示意
3. 其他存储设备的命名
CD-ROM设备的命名规则是:IDE类型的设备按IDE设备命名,SCSI类型的设备按SCSI设备命名。通常系统还为CD-ROM设备提供了一个标准名称:cdrom。设备文件/dev/cdrom是到实际设备文件(如/dev/hdb)的一个符号链接。
软盘的命名规则是:A盘为fd0,B盘为fd1。
11.4.3 划分磁盘分区
划分磁盘分区的命令是fdisk。与Windows系统的fdisk命令相比,Linux的fdisk功能极其强大,可以划分出包括ext2/ext3、FAT16/32、NTFS、minix、BSD、AIX等几十种流行操作系统的分区格式。
fdisk命令
【功能】管理磁盘分区。
【格式】fdisk [选项] [/dev/设备名]
【选项】
-l 列出指定设备上的分区表的状况。要求参数是磁盘设备名(如/dev/hda)。未指定参数时,列出所有磁盘设备的分区表的状况。
-s 显示分区的大小,以块为单位。要求参数是分区设备名(如/dev/hda5)。
【说明】未指定选项时,fdisk以交互方式运行,修改磁盘的分区表。常用的fdisk操作命令包括:p显示分区表、n建立分区、d删除分区、m显示所有fdisk操作命令、w保存修改退出、q放弃修改退出。
例11.11 fdisk命令的用法示例:
# fdisk /dev/sda #进入交互式界面,修改sda盘的分区
Command ( m for help ): p
Disk /dev/sda: 4294 MB, 4294967296 bytes
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 474 3702982+ 83 Linux
/dev/sda3 475 522 385560 82 Linux swap
Command ( m for help ): q
# fdisk -l /dev/sdb #显示sdb盘中的所有分区
Disk /dev/sdb: 1039MB, 1039663104 bytes
256 heads, 32 sectors/track, 247 cylinders
Units = cylinders of 8192 * 512 = 4194304 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 248 1015280 6 FAT16
#
sda盘的分区表显示该盘划分了3个分区,sda1是boot分区,sda2是根文件系统分区,sda3是swap分区。sdb盘的分区表显示该盘上只有1个分区sdb1,它是一个Windows分区。
11.4.4 建立文件系统
建立文件系统就是用该文件系统的格式对分区进行格式化。例如,建立ext2/ext3文件系统就是在分区中划分出块组,建立超级块、组描述符、i节点区、数据区等结构。建立文件系统的命令是mkfs。
mkfs命令
【功能】建立文件系统。
【格式】mkfs [选项] /dev/分区设备名
【选项】
-t fstype 指定文件系统类型为fstype。默认类型为ext3。
-c 格式化前查找坏块。
-v 产生详细的输出。
例11.12 在分区hda1中建立ext3文件系统:
# mkfs -c /dev/hda1
11.4.5 挂装文件系统
VFS文件系统支持文件系统的挂装(mount)和卸载(unmount),这使得文件系统可以随意地组合和扩充。系统启动时,最初只有根文件系统,其他文件系统(如软盘、光盘、其他分区的文件系统等)可以根据需要作为子树挂装到根文件系统上。
挂装一个文件系统就是将它挂装到根文件系统的某一目录(称为挂装点)下。文件系统必须先挂装才可访问。挂装的方式有自动挂装和手工挂装两种。
1. 自动挂装
自动挂装就是在系统启动时自动地完成对指定文件系统的挂装。系统在引导时首先会挂装根文件系统,这使系统可以访问和读取一些重要的启动文件。在随后的启动过程中,系统会读取/etc/fstab文件,并自动挂装文件中指定的文件系统。
fstab文件中描述了每个文件系统应挂装在何处以及执行挂装时所使用的参数。每行对应一个文件系统,分为6个字段,格式如下:
文件系统标识 挂装点 文件系统类型 挂装选项 dump标志 fsck顺序
文件系统标识是该文件系统所在的设备名。挂装点是根文件系统下的一个目录,它是该文件系统要挂接的位置。文件系统类型指出该文件系统的类型。
挂装选项指定文件系统的挂装方式。常用的挂装选项有ro(只读挂装)、rw(读/写挂装)、auto(隐含挂装)、noauto(不隐含挂装)、user(一般用户可挂装)、nouser(只有root可挂装)、defauls(默认选项挂装)。隐含挂装的含义是,在系统启动时或使用mount -a命令时,所有在fstab文件中的有auto选项的文件系统都会被默认地挂装;不隐含挂装的含义是,它们必须用mount命令显式地挂装。默认选项挂装是采用默认的选项(包括rw、auto、nouser等选项)进行挂装。
dump标志指示dump备份程序是否备份该文件系统,1表示要备份,0与空白表示不要。
fsck顺序表示当系统进行文件系统检查(fsck)时的检查顺序,该列值为1的文件系统会首先被检查,然后检查值为2的文件系统,0表示不检查。
以下是一个/etc/fstab文件的示例:
/dev/hda1 / ext3 defauts 1 1
/dev/hda2 /boot ext3 defauts 1 2
/dev/hda3 swap swap defauts 0 0
/dev/cdrom /mnt/cdrom iso9660 noauto,user,ro 0 0
/dev/sda1 /mnt/usb vfat noauto,user 0 0
该文件列出了5个文件系统,前3个在磁盘的3个分区上,分别是根文件系统分区、系统引导分区和交换分区。这些文件系统采用默认方式挂装,在系统启动时会自动挂装上。后2个文件系统分别在光盘和USB盘上,挂装方式是显式挂装,且允许一般用户进行挂装。这样定义后,普通用户也可在需要的时候用mount命令来挂装了。
2. 用mount命令挂装
用户可以随时用mount命令手工地挂装文件系统。
mount命令
【功能】挂装文件系统。
【格式】mount [选项] [分区设备名] [挂装点目录]
【选项】
-t vfstype 指定文件系统的类型,默认类型为
iso9660。-t auto表示由系统自行测定文件
系统的类型。
-o options 指定挂装的方式,与fstab文件的挂装选项
相同。
-a 挂装/etc/fstab文件中描述的所有文件系统(除了有
noauto选项的)。
【说明】
(1) 参数设备名为要挂装的文件系统所在的分区设备名,必须是一个块设备。
(2) 挂装点目录必须存在。如果挂装点目录不为空,新挂装的文件系统会暂时覆盖挂装点目录下的原有文件。
(3) 若在fstab文件中设置了以某设备名标识的文件系统,则只需执行mount设备名。mount命令会搜索fstab文件,找到该设备名对应的那行,并用该行指定的挂装选项和挂装点进行挂装。例如,fstab文件如前所示,则挂装U盘时只需执行mount /dev/sda1即可。
例11.13 挂装一个Windows磁盘分区,磁盘设备名为hda,文件系统类型为FAT32:
# mkdir /mnt/msdos #建立挂装点
# fdisk -l /dev/hda #查看盘上的分区,确定要挂装的分区名和
类型
…
/dev/hda2 506 1014 529105 b FAT32
…
# mount -t vfat -o rw /dev/hda2 /mnt/msdos #挂装分区文件系统
#
例11.14 挂装CD-ROM(/mnt/cdrom目录须已存在):
# mount -t auto -o ro /dev/cdrom /mnt/cdrom
例11.15 挂装光盘映像文件something.iso:
# mkdir /mnt/iso #建立挂装点(如果没有的话)
# mount -o loop something.iso /mnt/iso
例11.16 挂装USB存储设备,设U盘的设备名为/dev/sdb,文件系统类型为FAT16:
# mkdir /mnt/usb #建立挂装点(如果没有的话)
# fdisk -l /dev/sdb #查看USB存储器上的文件系统
Disk /dev/sdb: 1039MB, 1039663104 bytes
256 heads, 32 sectors/track, 247 cylinders
Units = cylinders of 8192 * 512 = 4194304 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 248 1015280 6 FAT16
# mount -t vfat /dev/sdb1 /mnt/usb #挂装USB盘文件系统
11.4.6 拆卸文件系统
拆卸文件系统是挂装的反操作,命令是umount。文件系统被拆卸后,挂装点目录下的原有的文件(如果有的话)将被恢复。注意卸载文件系统时必须退出挂装点目录,否则系统会报告“文件系统忙”的信息。另外,系统在关闭时会自动拆卸所有已挂装的文件系统。
umount命令
【功能】卸下一个文件系统。
【格式】umount 分区设备名/挂装点目录名
例11.17 卸载光盘文件系统:
$ umount /dev/cdrom #或umount /mnt/cdrom
11.4.7 修复文件系统
由于Linux系统使用异步I/O方式访问硬盘,如遇系统突然断电或硬件异常可能会导致文件数据的不一致。当文件系统因出现故障而不能挂装时,可以用fsck命令进行修复。
fsck命令
【功能】检查文件系统并尝试修复错误。
【格式】fsck [选项] [文件系统...]
【选项】
-t vfstype 指定文件系统的类型。
-a 自动修复文件系统,不要求用户确认。
-r 交互式修复文件系统,修复动作前要求用户确认。
【退出状态】0:无错误;1:有错误已修复;2:系统需要重启;4:有错误未修复。
【说明】执行此命令前应先卸载被检查的文件系统。
例11.18 检查/dev/hda3分区的文件系统是否正常,如果有异常便自动修复:
$ fsck -t ext2 -a /dev/hda3
11.5 系 统 备 份
计算机系统在运行过程中不可避免地会发生各种故障,包括软硬件异常、操作失误和外界环境变化造成的系统崩溃或文件丢失。虽然现在的系统都具有一定的容错和安全措施,但都不能替代简单可靠的备份操作。备份是指定期地把系统和用户的数据打包拷贝到脱机的介质上去,制作成一系列的副本保存。常用的备份介质有磁带、软盘、光盘和移动硬盘。恢复指一旦系统出现故障或其他原因造成数据丢失,就可以从备份介质上把数据拷贝回硬盘,减小损失。良好的备份措施是保证系统正常运行的必要手段。因此,必须执行严格的备份制度,按时做数据的备份和转储工作。
11.5.1 备份策略
备份的方式可以分为以下几种:
(1) 完全备份:一次备份所有数据。这是最基本的备份方式,备份的工作量较大,需要的介质也较多,但恢复时比较容易。
(2) 更新备份:备份上一次完全备份后改变的所有数据。更新备份的备份和恢复工作量居中。恢复时需要先恢复上一次的完全备份,再恢复最近一次的更新备份。
(3) 增量备份:备份上一次备份后改变的所有数据。增量备份工作量小,但恢复较费力,需要从上一次的完全备份开始,逐级恢复随后的各个增量备份。
系统管理员应根据系统的使用情况制订备份方案并严格执行。常用的方案是每月1~2次完全备份。每周末做一次更新备份,每个工作日做一次增量备份。系统升级前必须进行完全备份。备份的范围也要根据系统的使用情况来决定,原则是对经常改动的文件应该比改动较少的文件备份更频繁一些。例如,对于多用户系统来说,/home目录中的用户文件是经常变化的,对于应用服务器系统来说,/var目录中的系统运行相关数据是经常变化的。这些目录需要每天都备份;/etc目录中的配置文件不需要频繁备份,根据配置更改的频繁程度每星期或每月备份一次即可;/usr和/opt目录中的程序文件很少发生变化,安装后做一次备份即可。另外,有些目录如/tmp、/mnt等是没有必要备份的;有些目录如/proc、/dev等则是不应该备份的。
11.5.2 备份命令
Linux系统提供了多种图形化的和命令方式的备份工具,用户可以选择使用。命令方式的备份工具包括归档命令和压缩命令两类。归档命令的功能是将要备份的文件打包成一个档案文件,写到存档介质上或备份目录下。在需要恢复时,用归档命令可以从档案文件中提取出文件,并写回文件系统中。在对文件进行归档和提取操作时,可配合使用压缩命令对文件进行压缩和解压缩。常用的归档和压缩命令如表10-3所示。
以下仅对最常用的gzip和tar命令做介绍,其他命令可参看man手册。
1. gzip命令
gzip命令用于对文件进行压缩和解压缩,其压缩率高于compress和zip命令,且可以和归档命令tar配合使用。
gzip命令
【功能】对文件进行压缩和解压缩。
【格式】gzip [选项] [文件名]
【选项】
-d 解压缩。
-l 列出压缩文件的大小和压缩比例等信息。
-r 压缩子目录。
-v 显示详细操作信息。
【说明】没有-d和-l选项时执行压缩。
例11.19 gzip命令用法示例:
$ ls
hoc hoc.c hoc.h init.c math.c
$ gzip -v *.c #压缩当前目录下的每个.c文件
hoc.c: 17.9% -- replaced with hoc.c.gz
init.c: 27.1% -- replaced with init.c.gz
math.c: 45.6% -- replaced with math.c.gz
$ ls
hoc hoc.c.gz hoc.h init.c.gz math.c.gz
$ gzip -l math.c.gz #显示压缩文件的信息,不解压
compressed uncompressed ratio uncompressed_name
274 458 45.6% math.c
$ gzip -dv math.c.gz #解压缩math.c.gz文件,显示详细信息
math.c.gz: 45.6% -- replaced with math.c
$
2. tar命令
tar命令用于将一组文件打包成一个文件,称为档案文件(archive)。归档的目的是为了便于对这些文件进行统一处理,如转储、传输、发布和下载等。档案文件比单个文件更节省存储空间,因为它消除了各个文件最后一块内的空闲空间。如果配合压缩命令则会进一步节省存储空间,减少传输时间。
tar命令
【功能】文件归档工具,可备份整个目录、分区或文件系统。
【格式】tar [选项] [文件/目录列表]
【选项】
-c 创建档案文件。
-f 文件名 指定档案文件或归档设备的文件名。
-p 归档时保持文件的访问权限。
-r 向档案文件中添加文件。
-t 列出档案文件中的内容。
-T 从参数指定的文件中读取要备份的文件列表。
-u 更新档案文件。
-v 显示详细操作信息。
-x 从档案文件中提取并还原文件。
-z 使用gzip的来压缩/解压缩文件。
--exclude 目录/文件 不备份指定的目录或文件。
【参数】参数为文件时,对文件进行操作;参数为目录时,对目录树中的所有文件进行操作;有-T选项时,参数应是文件,其内容被看作是要归档的文件名列表。
例11.20 打包文件:
$ tar -cf ~/bak/src.tar *.[c,h] #打包*.c和*.h文件,生成档案文件src.tar
$ tar -tf ~/bak/src.tar #显示档案文件内容
hello.c
print.c
print.h
…
$ cd newdir
$ tar -xf ~/bak/src.tar #在另一目录下解包
用户可以用这种方式打包和保存自己的文件,然后在必要时在某个目录下恢复这些文件。这种方式也常用来复制一个目录树到另一个位置。与用cp -r命令复制目录树的不同之处在于,tar命令可以保持文件的归属权和修改时间等属性不变。在以root身份进行复制操作时,这一点有时尤为有用。
例11.21 把cherry的主目录备份并压缩,按用户名和备份日期命名,存入/backup
目录:
# tar -czf /backup/cherry-`date +%m-%d`.tar.gz /home/cherry
# ls /backup
cherry-02-21.tar.gz
#
解包该档案的命令是:tar -xzf /backup/cherry-02-21.tar.gz。注意:使用-z选项打包的档案在进行显示、更新、解包等操作时也需使用-z选项。另外,档案文件名可以是一个存储设备名,如tar -czf /dev/st0 /home/cherry表示将打好的包存入磁带机的介质中。
例11.22 完全备份根文件系统。备份档案以日期命名,写到/archive文件系统上(/archive可以是任何已挂载的备份设备),不备份/mnt、/proc、/dev和/archive目录:
# tar -zcpf /archive/full-bak-`date +%d-%m-%Y`.tar.gz \
>--directory/ --exclude=mnt --exclude=proc -- exclude=dev \
>--exclude=archive
例11.23 更新备份/home目录,备份5日内被修改过的文件:
# find /home -mtime -5 -print > /tmp/filelist
# tar -zcTf /archive/home-update-bak-`date +%d-%m-%Y`.tar.gz /tmp/filelist
11.6 系 统 监 控
系统监控的任务是监控登录的用户、进程、内存和文件系统的情况,及时发现系统在安全、性能和资源使用等方面的问题。系统监控的手段是使用专用命令或图形监控工具。
11.6.1 监视用户的登录
root可以用last命令和w命令随时了解用户的登录情况以及用户的活动情况。
last命令
【功能】列出最近用户登录系统的相关信息。
【格式】last [用户名...] [终端名...]
【参数】用户名指定要查看某用户的登录信息,缺省时显示所有登录用户的信息;终端名指定查看在某终端上登录的用户信息,缺省时显示所有终端上的登录用户的信息。
【说明】显示格式如下:
用户名 登录终端名 登录日期 登录时间 - 退出时间 (持续时间)
例11.24 显示root最近的登录记录:
$ last root
root tty1 Mon Aug 13 09:39 still logged in
root tty2 Sun Aug 12 09:29 - down (23:25)
root tty2 Fri Aug 10 18:17 - down (1+20:15)
root pts/0 Sun Aug 5 10:14 - 10:19 (00:04)
root tty1 Sun Aug 5 08:37 - 08:46 (00:08)
…
$
last命令的输出中,退出时间为“down”表示系统关机时间。
w命令
【功能】显示目前登录系统的用户以及他们正在执行的程序。
【格式】w [-s] [用户名]
【说明】用户名指定要查看的用户,未指定用户时显示所有登录用户的活动情况。每个登录用户的信息占一行。-s选项表示以短格式显示,否则以长格式显示。短格式的输出格式为如下5列:
用户名 登录的终端名 登录的远程主机名 空闲时间 正执行的命令
例11.25 显示所有用户的登录与活动情况:
# w -s
22:19:30 up 3:59, 3 users, load average: 0.12, 0.09, 0.23
USER TTY FROM IDLE WHAT
root tty1 - 0.00s w -s
cherry tty7 :0 3.00s usr/bin/gnome-session
cherry pts/1 :0.0 7.24s gnome-terminal
#
命令的输出表示,root在本地tty1控制台登录,正在执行w -s命令;cherry在本地tty7控制台登录,运行的是gnome会话程序;同时cherry还在gnome虚拟终端登录,运行的是gnome终端程序。
11.6.2 监控进程的运行
监控进程的运行包括监视进程的活动状况,以及在必要的时候控制进程的活动,如终止进程、挂起以及恢复进程运行等。
1. 监视进程的运行
监视进程活动情况的常用命令是ps和top命令。ps命令提供系统中的进程在当前时刻的一次性“快照”;top命令展示系统正在发生的事情的“全景”,即实时地描述活动进程以及其所使用的资源情况的汇总信息。
top命令
【功能】实时显示系统中的进程活动,并提供交互界面来控制进程的活动。
【格式】top [选项]
【选项】
d 间隔秒数 以指定的间隔秒数刷新。缺省为10秒。
n 执行次数 指定重复刷新的次数。缺省为一直执行下去,直到按q键退出。
【说明】top命令运行后,将显示屏分为上下两部分:上部分是关于系统内的用户数和进程数的统计,以及CPU、内存和交换空间的资源占用率的统计;下部分是所有进程的当前信息,通常是按CPU使用率排列的,最活跃的进程显示在顶部。这些信息动态地刷新,反映出系统的实时运行状况。中间的分隔行是命令交互行,用户可以在此处输入top的命令字符。常用的有:“?”——显示命令列表;“k”——杀死进程;“r”——改变进程优先级;“q”——退出。
例11.26 用top监视进程的运行,界面显示如图10‑2所示:
图10‑2 top命令的显示界面
2. 改变进程优先级
进程的优先级取决于它的“谦让数”(nice number)。具有较高谦让数的进程对待其他进程较为谦让,因而具有较低的优先级;谦让数低的进程对待其他进程不够谦让,因而具有高优先级。谦让数的范围为-20~19,数字越小则优先级越高,也就是被进程调度选中的机会越高。Shell的默认谦让数是0。用户可以用一个指定的谦让数来运行进程,不过,只有root可以为进程指定负值。
为进程设置优先级的命令是nice,改变进程优先级的命令是renice。在top命令的界面中也可以调整进程的优先级。
nice命令
【功能】以调整的谦让数执行命令。
【格式】nice [选项] [命令行]
【选项】
-n 谦让数增量 在Shell的当前谦让数上加上指定的增量来运行命令。未指定此选项时,默认增量为+10。只有root可以指定负数增量。
【说明】未指定命令行时,显示Shell的当前谦让数。
例11.27 用nice命令指定进程的谦让数:
$ nice #显示当前nice数
0
$ nice -n 5 yes > /dev/null & #降低优先级运行一个yes进程
$ ps -o pid,ni,args #显示进程号、nice数和命令
PID NI COMMAND
1978 0 bash
4907 5 yes
4908 0 ps -o pid,ni,args
$
从上例可以看出,用nice命令执行yes进程的nice数是指定的5,而直接执行的ps进程的nice数是默认的0。
renice命令
【功能】调整正在运行的进程的谦让数。
【格式】renice 谦让数 进程号
【说明】进程的属主可以调高谦让数,只有root可以调低谦让数。
例11.28 用renice命令调整进程的谦让数:
$ renice 10 4907 #调整yes进程的nice数
4907: old priority 5, new prirority 10
$ ps -o pid,ni,args | grep yes #查看yes进程的nice数
4907 10 yes
$
3. 作业控制
在Linux系统中,作业控制指的是由用户来控制作业的行为。由于多数情况下一个作业就对应一个进程,因而控制作业也就是控制进程的行为。比如,挂起一个进程使其暂停运行,或重新恢复进程的运行,以及在前后台之间切换进程等。
通常,用户在同一时间只运行一个作业,即最后键入的命令行。若使用作业控制,用户就可以同时运行多个作业,并在需要时在这些作业间进行切换。在一个shell中同时运行多个作业的方法是将某些作业的进程挂起或放在后台运行。这在有些时候很有用,例如,当用vi编辑一个文件时,需要暂时中止编辑去做其他事情,如查看一下邮件,或查看一下man手册页等。此时,可以先将vi挂起,回到Shell做其他的事情,待事情做完后,再恢复vi的运行。恢复后用户将回到与上次离开时完全一样的编辑状态。
1) 显示作业的信息
用jobs命令显示当前Shell所启动的所有作业及其活动状态。由于jobs命令本身占据了前台运行,因此它所显示的是所有挂起的和在后台运行的作业。
jobs命令
【功能】显示Shell的作业清单。
【格式】jobs [-l]
【说明】jobs的输出包括作业号、作业当前状态以及作业执行的命令行,有-l选项时还显示作业的进程号PID。作业的状态可以是running、stopped、terminated、done等。
例11.29 jobs命令用法示例:
$ yes > /dev/null & #在后台执行一个命令
[1] 25054 (显示作业号、进程号)
$ sleep 10 &
[2] 25122
$ jobs -l #显示所有作业
[1] - 25054 Running yes > /dev/null &
[2] + 25122 Running sleep 10 &
$
作业号后有一个“+”符号表示的是当前的作业(即最后一个进入后台的那个作业),有“-”符号表示的是当前作业的下一个作业,其他作业没有此符号。
2) 挂起进程
挂起进程就是向它发暂停信号,使其暂停运行,进入暂停态。挂起前台进程的方法是用Ctrl+z键;挂起后台进程的方法是向它发SIGSTOP信号,即:kill -SIGSTOP 进程号。
3) 恢复进程
恢复进程就是向它发SIGCONT信号,使其进入可运行态,继续运行。通常用bg命令将挂起的进程在后台恢复运行,用fg命令将挂起的进程在前台恢复运行。也可以用kill命令直接向它发信号。fg和bg命令默认对当前作业进行操作。如果希望恢复其他作业的运行,可以在命令中指定要恢复作业的作业号来恢复该作业。
4) 切换进程
bg和fg命令还用于在前台与后台之间切换的进程。将前台进程切换到后台的方法是先用Ctrl+z挂起进程,然后用bg [%作业号]命令使其在后台运行。将后台进程切换到前台的方法是用jobs命令列出当前正在运行的进程的作业号,用fg [%作业号]命令将其放到前台运行。
5) 终止进程
终止进程即向进程发SIGTERM信号,终止它的运行。终止前台进程用Ctrl+c键,终止后台进程用命令kill 进程号或kill %作业号。有些进程会忽略SIGTERM信号,此种情况下可向它发SIGKILL信号终止掉它,即:kill -9 进程号。
需要注意的是,用户挂起或切换的单位应是作业,只不过很多时候一个作业就对应一个进程。但如果一个作业对应了多个进程(比如用管道连接的多个进程),用户则不应单独控制作业中的某个进程。
例11.30 进程控制示例:
$ cat > text.file #在前台执行一个cat进程
1st line.
2nd line.
[1] + Stopped cat > text.file
$ yes > /dev/null & #在后台执行一个yes进程
[2] 5551
$ jobs #显示当前所有作业
[1] + Stopped cat >text.file
[2] - Running yes > /dev/null &
$ fg 1 #将1号作业带到前台恢复运行
cat >text.file
3rd line.
$ cat text.file
1st line.
2nd line.
3rd line.
$ jobs
[2] + Running yes > /dev/null &
$ kill %2 #终止2号作业
$ jobs
$
4. 定时启动进程
有些系统维护工作比较费时而且占用资源较多(比如完全备份),将这些工作放在深夜或周末进行比较适合。这时可以采用调度运行的手段,事先指定好要完成的任务及其运行的时间,时间一到系统会自动按照调度安排完成这一切工作。
调度运行进程的命令主要有at和cron命令。at命令用于在指定的时间启动一些任务执行,但只是执行一次。若是需要重复执行任务,比如在每日或每周的某个时候都需要完成一些任务,就要使用cron命令来调度了。本节只对at命令作简单介绍。
at命令
【功能】从标准输入读入命令行,在指定的时刻运行之。
【格式】at [选项] 时间
【选项】
-f 文件名 从指定的文件中读取命令。若未指定文件,则读取标准输入。
【参数】时间参数用于指定命令的执行时间。at允许使用一套相当复杂的时间描述方法。它可以接受12小时或24小时计时制,也可以使用比较模糊的词语,如midnight、noon、teatime、1:00am等。日期可以是绝对日期,也可以是相对日期,如today、tomorrow、2days等。建议采用绝对日期和24小时计时的时间表示法,清楚地表达时间可以避免计时错误。
【说明】at命令将用户预约的作业保存在队列中,在指定的时间启动它并运行。用arq命令可以查看还未执行的作业信息,包括作业号、预约执行时间和分类信息。用atrm [作业号]命令可以删除一个还未执行的作业。
例11.31 at命令用法示例:
$ tty #确定当前使用的终端设备名
/dev/tty1
$ at 3:20 pm today #提醒自己下午3:30开会
at> echo “^GMeeting with the Director at 3:30 pm” > /dev/tty1
at> Ctrl+d <EOT>
job 1 at Wed Dec 19 15:20:00 2007
$ echo “mail ‘Merry Cristmas!’ mary” | at 17:30 12/23/07 #设定发送问候邮件。
job 2 at Sun Dec 23 17:30:00 2007
$ atq
1 Wed Dec 19 15:20:00 2007 a cherry
2 Sun Dec 23 17:30:00 2007 a cherry
$
当到作业1预定的时间时,如果用户还在终端上工作,则屏幕上将出现提示信息并响铃。注意:响铃字符“^G”的输入方法是连续按Ctrl+v和Ctrl+g键。当作业2预定的时间到时,将自动向mary发送圣诞问候邮件。
11.6.3 监视内存的使用
用free命令可监视内存的使用情况,包括实体内存(Mem)、虚拟的交换内存(Swap)以及系统核心使用的缓冲区(buffer/cache)等。
free命令
【功能】显示内存的使用情况。
【格式】free [选项]
【选项】
-b|-k|-m|-g 以指定的单位显示内存使用情况。
-s间隔秒数 持续观察内存使用状况。
例11.32 查看内存使用情况:
$ free -k #以k为单位显示内存的使用
total used free shared buffers cached
Mem: 515156 272620 242536 0 14908 192740
-/+ buffers/cache: 64972 450184
Swap: 524280 0 524480
$
11.6.4 监视文件系统的使用
用df和du命令监视文件系统空间的使用情况。
df命令
【功能】统计文件系统空间的使用情况。
【格式】df [选项] [文件系统]
【选项】
-a 显示所有文件系统的信息。
-h 用易于阅读的方式显示文件系统的信息。
-i 显示文件系统的索引节点的信息。
-k 用1 KB大小的块为单位显示文件系统的信息。
-T 显示文件系统的类型。
【说明】参数可以是文件系统的名称(通常是分区设备名),也可以是文件名,df命令将显示该文件系统或该文件所在的文件系统的信息。不带参数时会显示所有已挂装的文件系统的信息,显示格式如下:
文件系统名 类型 大小 已用空间大小 未用空间大小 已用空间比例 挂装点
例11.33 df命令用法示例:
$ df -kTh #显示所有挂装的文件系统的信息
Filesystem Type Size Used Avail Use% Mounted on
/dev/hda2 ext3 5.1G 2.9G 2.0G 60% /
/dev/hda1 ext3 190M 13M 168M 7% /boot
tmpfs tmpfs 252M 12K 252M 1% /dev/shm
/dev/sr0 iso9660 3.2G 3.2G 0 100% /media/DVD
$
du命令
【功能】统计目录和文件占用的磁盘空间。可以递归显示子目录的磁盘使用情况。
【格式】du [选项] [文件名/目录名]
【选项】
-a 统计指定目录下的所有目录及文件的块数。
-s 只产生一个总的统计信息。
-h 用易于阅读的方式显示文件的大小。
-k|-m 指定块大小为K或M。
【参数】指定文件为参数时,显示文件占用的磁盘空间; 指定目录为参数时,显示目录占有的磁盘空间,并递归地显示所有子目录占有的磁盘空间;不指定参数缺省为当前目录。
例11.34 du命令用法示例:
$ du -hs /home/cherry #显示/home/cherry目录占用的磁盘空间
1.3M /home/cherry
$ du -h ~/project/* #显示~/project目录下所有文件及目录占
用的磁盘空间
16K /home/cherry/project/a.out
0 /home/cherry/project/err.out
1.2M /home/cherry/project/src
4.0K /home/cherry/project/bin
…
$
注意:无论文件或目录的实际长度如何,它所占用的磁盘空间总是磁盘存储块的大小(4 KB)的整数倍,不过在以-h方式显示的数字有时会有舍入,如1.3 MB。
11.7 软 件 安 装
在初次安装Linux系统时,系统安装程序完成了基本系统和附加软件的安装。在随后的运行期间,可以根据需要添加或删除某些软件。系统管理员的职责之一是根据需要安装和配置软件,并保持软件的版本更新。
本节只讨论Linux附加应用软件的安装,有关Linux系统的安装见附录A。
11.7.1 软件的打包与安装
软件通常以软件包(package)的形式发行。软件包是将组成一个软件的所有程序和文档打包在一起而形成的一个具有特定格式的文件。软件包中带有安装需要的各种信息,如安装位置、版本依赖关系、安装和卸载时要执行的命令等。
与Windows系统不同,Linux系统中并没有专门的“软件安装”这个概念。实际上,对于Linux系统来说,软件“安装”不过就是将程序拷贝到某目录下,修改配置文件(全部是文本文件),然后就可以运行了。这些工作完全可以用系统提供的基本命令手工完成,既不需要专门的安装程序和配置程序,也不需要向系统“注册”。
不过,由于系统中安装的各种软件之间往往有复杂的依赖关系,比如一个图形化的应用软件要依赖于X Window软件,一个网络服务软件要依赖于网络协议软件等。因此,安装软件时需要检测和解决软件的版本依赖与冲突等问题,如果用手工方式检测,则操作难度较大。为方便安装,多数发行软件都提供一个安装脚本,它可以自动完成版本依赖检测、解包、解压缩、复制和配置等工作步骤,使安装工作变得轻松。
通常Linux软件主要采用以下几种方式发行和安装:
(1) 采用传统方式打包发行。传统的软件打包方式是用tar命令打包软件,安装时用tar解开到某个目录下。通常这种软件包解开后都有一个Install脚本文件,直接运行就可完成安装。另外还会有Readme之类的帮助文件,提供详细的安装说明。
(2) 利用专门的软件包工具打包发行。这是现在流行的软件发行方式。大多数Linux系统都提供一个专门的软件包管理工具,开发者用这个工具将软件打包,用户则用它来安装软件包。有了软件包管理工具,用户不必再关心安装的细节问题,使得软件包的安装和维护变得非常方便。常用的软件包格式有Red Hat的RPM软件包和Debian的DEB软件包,其中RPM软件包更为流行。
(3) 通过网络实现在线更新。目前,越来越多的Linux系统都提供了软件自动更新功能,大大方便了软件的更新和维护操作。例如Fedora/RedHat提供了两个强大的在线更新工具yum和apt,它们能自动检索软件的新版本,自动下载安装和处理软件依赖关系。
11.7.2 RPM软件包管理工具
RPM(Red Hat Package Manager)是Red Hat开发的软件包管理软件,它的功能比较完善而且易于使用。除了Red Hat Linux外,RPM还广泛地应用于其他Linux发行系统,如Fedora、Mandrake、SuSE、YellowDog等。
RPM工具用于管理以RPM格式打包构建的软件包。使用RPM工具构建的软件包具有特定的命名规则。典型的RPM软件发行包的名称为:
软件名-主版本号-次版本号.硬件平台.rpm
其中,“软件名”和“.rpm”扩展名不可缺少,其余可选。如:foo-1.0-1.i386.rpm表明该软件包名为foo,主版本号为1.0,次版本号为1,设计用于i386平台。
注意:安装后的软件包的名称没有rpm后缀名。例如,上例软件发行包在安装后的软件包名为foo-1.0-1或foo-1.0-1.i386。
除了构建软件包功能外,RPM具有5种基本操作模式,即安装、卸载、升级、查询和校验。所有的操作都由rpm命令来实现。执行rpm命令需要有root权限。
rpm命令
【功能】管理RPM软件包。
【格式】rpm [选项] RPM包
【选项】
-i 安装软件包。
-U 升级软件包。
-q 查询软件包信息。
-V 校验软件包。
-e 卸载软件包。
-v 显示执行过程的详细信息。
-h 显示执行的进度。
11.7.3 安装与升级RPM包
安装软件包其实就是文件的拷贝,即把软件的各个文件拷贝到特定目录下。用RPM安装软件包也是如此,只不过它更聪明一些。RPM将所有已安装的软件包的信息记录在一个数据库中,在以后的安装、升级、查询、校验和卸载操作中,RPM都要用这些信息自动地进行检测,防止依赖错误,避免冲突,从而大大简化了软件安装的难度。
安装软件包的操作主要有以下几个步骤:
(1) 根据软件包中对依赖和冲突关系的描述进行检查,不符合要求就中止软件包安装。
(2) 执行软件包中的安装前脚本程序,为安装作准备。
(3) 解压软件包并将其中的文件一一存放到正确的位置,设置好文件的权限等属性。
(4) 执行安装后的脚本程序,作安装后处理。
(5) 更新RPM数据库,将所安装的软件及相关信息记录到其数据库中。
升级软件包实际上是卸载和安装的组合,但升级最好能保持用户对原软件所做的配置,这是件比较麻烦的事。对此RPM采用了智能化的处理,它可以尽量地保留用户以前的配置文件,使其适应于新版本。
安装软件包使用-i选项,升级使用-U选项。参数为软件包的发行包全名。另外可以使用-vh选项显示安装和升级的过程。
例11.35 安装rpm软件包foo,显示安装过程的信息与进度:
# rpm -ivh foo-1.0-1.i386.rpm
Preparing…
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # [100%]
1: foo
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # [100%]
#
例11.36 升级rpm软件包foo:
# rpm -U foo-2.0-1.i386.rpm
11.7.4 查询RPM包
RPM数据库中记录了所有已安装的软件包的信息,通过rpm命令可以查询这些信息。此外,rpm还可以查询那些尚未安装的软件包的信息。
查询软件包用-q选项,配合其他选项可以完成各种查询操作。常用选项如下:
-qa 查询所有已安装的软件包。
-qp 查询某个未安装的软件包。参数是发行包的全名。
-qf 查询某文件属于哪个软件包(注意:必须指定文件的绝
对路径)。
-ql 查询包中文件的安装位置。
-qs 列出软件包中所有文件的状态。
-qi 列出软件包的综合信息。
例11.37 查询安装了哪些gcc相关的软件包:
$ rpm -qa | grep gcc
gcc-4.3.0-8.i386
gcc-gfortran-4.3.0-8.i386
libgcc-4.3.0-8.i386
gcc-c++-4.3.0-8.i386
$
例11.38 查询gzip包中文件的安装位置:
$ rpm -ql gzip
/bin/gunzip
/bin/gzip
/bin/zcat
/usr/bin/gunzip
/usr/bin/gzexe
…
$
例11.39 查询gzip程序属于哪个软件包:
$ rpm -qf /usr/bin/gzip #或rpm -qf `which gzip`
gzip-1.3.12-6.fc9.i386
$
11.7.5 校验RPM包
校验软件包就是将已安装的软件包中所有文件的信息与存储在软件包数据库中的原始软件包中的文件信息相比较,看是否和最初安装时一样。如果没有问题就不输出任何结果,如果任何一个文件有问题,会输出该文件名和一个8位字符组成的字符串,依次是:S M 5 D L U G T。8个字符分别代表文件的8个属性,即文件大小、模式、校验和、设备、符号链接、属主、属组和修改时间。若该文件的某个属性发生了改变,则在相应的位上会显示出代表该属性的字符,没有发生改变的位就显示“.”。
校验软件包使用-V选项。参数可以是软件名或软件包名。
例11.40 校验gcc软件包:
$ rpm -V gcc
. M . . . . . . /usr/bin/protoize
$
输出结果表明,gcc包中的protoize文件目前的权限模式与安装时的权限模式不同。
11.7.6 卸载RPM包
卸载软件包并不是将原来安装的文件逐个删除那样简单,因为软件包之间存在依赖关系。如果A软件包依赖于B软件包做某些工作,若将B卸载了,则A就不能正常运行了。
RPM在卸载软件包时,主要进行以下几步操作:
(1) 根据软件包中的依赖关系描述进行检查,确保没有任何软件包依赖于此软件包。
(2) 执行软件包中的卸载前脚本,作卸载前处理。
(3) 按照软件包中的文件列表,将文件逐个删除。
(4) 执行软件包中的卸载后脚本,作卸载后处理。
(5) 更新RPM数据库,删除该软件包的所有信息。
卸载rpm软件包用-e选项。参数可以是软件名或软件包名。
例11.41 卸载gnome-games软件包:
# rpm -e gnome-games
习 题
10-1 系统管理的基本任务是什么?
10-2 查看文件/etc/passwd,看系统中有多少个可登录的普通用户。
10-3 查看文件/etc/profile和~/.bash_profile,它们是如何定义PATH变量的。
10-4 编写一个Shell脚本,执行时先从标准输入读入一个用户名,然后显示该用户的登录名、姓名和主目录。
10-5 编写一个Shell脚本addusers,其功能是添加一批用户。要添加的用户名以参数形式给出,组名为temp。
10-6 查封用户joe可以用哪些命令?
10-7 某Linux系统需要扩充文件存储空间。现有一个空闲磁盘空间,设备名为hdc2。要在此分区建立ext3文件系统并挂装到根文件系统中需要执行哪些命令?
10-8 为什么在复制目录结构时tar命令比cp -r命令更好?
10-9 以下命令最终生成了一个什么文件(文件名及内容)?
# find /home -type f -group project > /tmp/files
# tar -cf projectfile.tar `cat /tmp/files`
# gzip projectfile.tar
10-10 从网上下载了一个foo.iso文件,如何将该文件以光盘方式挂载到文件系统上?
10-11 从网上下载了一个tcsh-6.06.tar.gz文件,如何解开这个文件?
10-12 如何用一个命令显示当前系统中所有进程的总数?如何用一个命令显示正处于可执行态的进程的总数?
10-13 如何用at命令定时执行某个任务?