Untitled - 文曲经典数字图书馆

538

Transcript of Untitled - 文曲经典数字图书馆

内 容 简 介

目前各种类型的Linux系统在其应用领域中都有着长足的发展,特别是在信息安全越来越重要的今天。

本书作为一本 Linux 的入门书籍,主要面向 Linux 在服务器及个人应用领域的初学者,希望读者在认真学

习后可以掌握 Linux 的基本操作及一些常见服务的安装配置方法。

本书由浅入深地讲解 Linux 系统的安装部署、桌面应用、基础操作、Shell 脚本、常用服务等相关知

识。本书从初学者的角度详细地讲解每一个操作步骤,力求让读者可以更加清楚、准确了解整个操作过程。

本书适合 Linux 初、中级用户参考学习,也可作为高等院校电子类、信息类、计算机类等专业的 Linux

教材。

未经许可,不得以任何方式复制或抄袭本书之部分或全部内容。

版权所有,侵权必究。

图书在版编目(CIP)数据

Linux 从初学到精通/张勤等编著. —北京:电子工业出版社,2011.4

(华清远见系列图书)

ISBN 978-7-121-12802-8

Ⅰ. ①L… Ⅱ. ①张… Ⅲ. ①Linux 操作系统 Ⅳ.①TP316.89

中国版本图书馆 CIP 数据核字(2011)第 010221 号

责任编辑:胡辛征

特约编辑:赵树刚

印 刷:

装 订:

出版发行:电子工业出版社

北京市海淀区万寿路 173 信箱 邮编 100036

开 本:787×1092 1/16 印张:33.75 字数:843 千字

印 次:2011 年 4 月第 1 次印刷

印 数:4000 册 定价:62.00 元(含 DVD 光盘 1 张)

凡所购买电子工业出版社图书有缺损问题,请向购买书店调换。若书店售缺,请与本社发行部联系,联

系及邮购电话:(010)88254888。

质量投诉请发邮件至 [email protected],盗版侵权举报请发邮件至 [email protected]

服务热线:(010)88258888。

三河市鑫金马印装有限公司

III

前 言

在 20 世纪 70 年代,UNIX 体系的源程序大多是开放的,互联网的基础协议 TCP/IP 就是

产生于那个年代。在当时,人们在创作各自的“程序作品”中享受着从事科学探索、创新活

动所特有的那种激情和成就感。那时的程序员,如同艺术家一样,急于“发表”自己的程序

作品,并不专注于保守“机密”,以换取高额利润。

1979 年,AT&T 宣布了 UNIX 的商业化计划,随之出现了各种二进制的商业 UNIX 版本。

于是就兴起了基于二进制机读代码的“版权产业”(Copyright Industry),使软件业成为一种

版权专有式的产业,围绕程序开发的那种创新活动被局限在某些骨干企业的小圈子里,源码

程序被视为核心“商业机密”。这种做法,一方面产生了大批的商业软件,极大地推动了软件

业的发展,诞生了一批软件巨人;另一方面,由于封闭式的开发模式,也阻碍了软件业的进

一步深化和提高。由此,人们为商业软件的“专有权”付出了巨大的代价。

1983 年,理查•马修•斯托曼(Richard Stallman)创立了 GNU(GNU 官方网站:

http://www.gnu.org/)计划。这个计划有一个目标,是为了发展一个完全免费自由的类 UNIX

操作系统。1991 年,李纳斯•托瓦兹(Linus Torvalds)编写出了与 UNIX 兼容的 Linux 操作

系统内核并在 GPL 条款下发布。之后 Linux 在网上广泛流传,许多程序员参与了开发与修改。

1992 年,Linux 与其他 GNU 软件结合,完全自由的操作系统正式诞生。该操作系统往

往被称为“GNU/Linux”或简称 Linux。

伴随着互联网的发展,Linux 得到了来自全世界软件开好者、组织、公司的支持。起初,

Linux 主要被用做服务器的操作系统,但是现在 Linux 除了在服务器操作系统方面保持着强

劲的发展势头以外,在个人电脑、上网本、嵌入式系统上都有着长足的进步。

有很多计算机的爱好者对 Linux 的印象还停留在多年前,认为 Linux 使用起来有一定的

难度,只有水平很高的用户才可以使用。创作本书的目的也在于此,希望广大读者通过学习

本书可以认识到 Linux 并不是想象中那么难,只是在操作习惯上有一些区别。

作者介绍

张勤:MCSE、MCDBA、RHCE,2004 年以前主要从事软件开发(Delphi、

Java)及项目管理工作,2004 年以后主要从事系统集成工作。在国内多个知名 IT

网站发表技术类文章,并已出版《Linux 服务器配置全程实录》、《开源 IT 系统及

应用架构宝典——系统、工具、案例》两本著作。

IV

本书特点

目前各种类型的 Linux 系统在其应用领域中都有着长足的发展,特别是在信息安全越来

越重要的今天。本书作为一本 Linux 的入门书籍,主要针对 Linux 在服务器及个人应用领域

的初学者,希望读者在认真学习后可以掌握 Linux 的基本操作及一些常见服务的安装配置方

法。本书主要具有以下特点。

Linux 系统日常的维护工作一般都是通过命令完成的,对于初学者来说记忆这些命令是

一件很困难的事情,所以本书中对所有命令都会标明一个常用指数,方便读者有选择地记忆

Linux 命令。常用指数包括:“ ”表示最常用的命令,这种命令需要熟悉其使用方法;

“ ”表示次常用的命令,需要掌握基本用法,具体操作在使用时可查阅帮助;“ ”表示

很少使用的命令,可在需要时查阅帮助。

内容丰富。本书由浅入深地讲解 Linux 系统的安装部署、桌面应用、基础操作、Shell 脚

本、常用服务的相关知识。

详细的操作步骤。本书从初学者的角度详细地讲解每一个操作步骤,力求让读者可以更

加清楚、准确地了解整个操作过程。

在本书附赠的光盘中包括配合本书使用的教学课件及测试习题,可以作为学校或培训机

构使用的教材。

附赠光盘内容

本书附赠光盘中主要包括以下内容,希望通过这些内容方便读者阅读和使用本书。

(1)教学课件。位于光盘 PPT 目录(文件名:chapXX-章节名称.pptx)下,包括书中所

有章节教学使用的课件。

(2)测试习题。位于光盘 Exam 目录下,包括书中每章测试习题(文件名:chapXX.pdf)

的电子版及三套综合测试题(文件名:examXX.pdf)。

(3)实验录像。位于光盘 Video 目录下,包括书中各章节的操作录像。

VMware Workstation 基本应用:光盘\Video\第 2 章\2.1 VMware Workstation 基本应

用.mp4

安装 RHEL5.4:光盘\Video\第 2 章\2.2 安装 RHEL5.4.mp4

vi 基本操作:光盘\Video\第 3 章\3.1 vi 基本操作.mp4

使用 SSH 管理 Linux:光盘\Video\第 3 章\3.2 SSH.mp4

使用远程桌面连接 Windows:光盘\Video\第 3 章\3.3 RDP.mp4

目录操作命令:光盘\Video\第 4 章\4.1 目录操作命令.mp4

文件操作命令:光盘\Video\第 4 章\4.2 文件操作命令.mp4

V

查找操作命令:光盘\Video\第 4 章\4.3 查找操作命令.mp4

压缩与归档命令:光盘\Video\第 4 章\4.4 压缩与归档命令.mp4

文本查看命令:光盘\Video\第 4 章\4.5 文本查看命令.mp4

用户及用户组管理命令:光盘\Video\第 5 章\5.1 用户及用户组管理命令.mp4

用户切换:光盘\Video\第 5 章\5.2 用户切换.mp4

文件及目录权限管理:光盘\Video\第 6 章\6.1 文件及目录权限管理.mp4

文件及目录 ACL 功能:光盘\Video\第 6 章\6.2 文件及目录 ACL 功能.mp4

创建及格式化分区:光盘\Video\第 7 章\7.1 创建及格式化分区.mp4

挂载分区:光盘\Video\第 7 章\7.2 挂载分区.mp4

管理交换分区:光盘\Video\第 7 章\7.3 管理交换分区.mp4

读写 NTFS 分区:光盘\Video\第 7 章\7.4 读写 NTFS 分区.mp4

创建 RAID 阵列:光盘\Video\第 7 章\7.5 创建 RAID 阵列.mp4

创建及管理 LVM:光盘\Video\第 7 章\7.6 创建及管理 LVM.mp4

管理磁盘配额:光盘\Video\第 7 章\7.7 管理磁盘配额.mp4

常见软件安装方法:光盘\Video\第 8 章\8.1 软件安装.mp4

修复 root 用户密码:光盘\Video\第 10 章\10.1 修复 root 用户密码.mp4

修复损坏的 boot 分区:光盘\Video\第 10 章\10.2 修复 boot 分区.mp4

自动化任务:光盘\Video\第 10 章\10.3 自动化任务.mp4

DHCP 服务配置:光盘\Video\第 12 章\12.1 DHCP 服务配置.mp4

BIND 服务配置:光盘\Video\第 13 章\13.1 BIND 服务配置.mp4

NFS 服务配置及客户端访问:光盘\Video\第 14 章\14.1 NFS 服务配置及客户端访

问.mp4

FTP 服务配置身份验证:光盘\Video\第 15 章\15.1 FTP 服务配置身份验证.mp4

Samba 服务共享配置及客户端访问:光盘\Video\第 16 章\16.1 Samba 服务共享配置

及客户端访问.mp4

Samba 服务访问控制:光盘\Video\第 16 章\16.2 Samba 对调.mp4

Samba 服务用户及权限配置:光盘\Video\第 16 章\16.2 Samba 对调.mp4

Apache 服务配置虚拟主机:光盘\Video\第 17 章\17.1 Apache 服务配置虚拟主机.mp4

Apache 服务配置用户认证:光盘\Video\第 17 章\17.2 Apache 服务配置用户认证.mp4

Apache 服务配置访问控制:光盘\Video\第 17 章\17.3 Apache 服务配置访问控制.mp4

Apache 服务配置 HTTPS:光盘\Video\第 17 章\17.4 Apache 服务配置 HTTPS.mp4

使用源码包搭建 LAMP:光盘\Video\第 17 章\17.5 Apache&MySQL&PHP(Make).mp4

Squid 服务配置正向代理:光盘\Video\第 18 章\18.1 Squid 服务配置正向代理.mp4

Squid 服务配置反向代理:光盘\Video\第 18 章\18.2 Squid 服务配置反向代理.mp4

VI

读者对象

本书非常适合对 Linux 有兴趣的初学者、Linux 应用爱好者,同时也适合其他相关从业

人员,如大、中专院校计算机专业师生、培训机构作为参考教材使用。

联系我们

初学者在接触和使用 Linux 系统时,一开始总会遇到各种各样的问题,本书中尽可能多

地讲述可能遇到的问题,但限于时间及作者的水平,书中难免会存在一些问题,恳请各位读

者批评与指正,同时也希望和大家共同学习进步。关于本书的任何问题或意见欢迎与本书作

者([email protected])联系,我们将尽快回复您的邮件。

本书主要由张勤、鲜学丰编写,其他参与编写的人员有王丽娜、周毅、林小峰、刘刚、 马

海波、李强、吴慧、马玉刚、冯浩、唐爱琴、李子龙、王明明、蒋志等,在此表示衷心感谢。

VII

目 录

第 1 章 前世今生——Linux 系统简介 ................................................................................1

1.1 Linux 诞生记............................................................................................................. 2

1.2 Linux 成长记............................................................................................................. 3

1.3 百家争鸣的 Linux 发行版........................................................................................ 3

1.3.1 Debian........................................................................................................... 4

1.3.2 Ubuntu .......................................................................................................... 6

1.3.3 SuSE/openSuSE............................................................................................ 8

1.3.4 RHEL............................................................................................................ 9

1.3.5 红旗 Linux.................................................................................................. 10

1.3.6 CentOS........................................................................................................ 11

1.3.7 Fedora ......................................................................................................... 12

1.3.8 为什么选择 RHEL 5.x ............................................................................... 13

1.4 为开源保驾护航的 GNU 及 GPL/LGPL ............................................................... 14

1.5 小企鹅大身手 ......................................................................................................... 16

第 2 章 开门见山——Linux 系统安装 ..............................................................................18

2.1 使用 VMware Workstation 搭建测试环境 ............................................................. 19

2.1.1 新建虚拟机 ................................................................................................ 20

2.1.2 虚拟机基本操作 ........................................................................................ 26

2.1.3 虚拟机网络模式 ........................................................................................ 30

2.2 Linux 磁盘分区及目录........................................................................................... 34

2.2.1 Linux 磁盘分区 .......................................................................................... 34

2.2.2 Linux 文件系统及目录结构 ...................................................................... 35

2.3 打造 RHEL 5.x 平台 ............................................................................................... 38

2.3.1 RHEL 5.x 安装方式 ................................................................................... 38

2.3.2 RHEL 5.x 安装与登录 ............................................................................... 39

2.3.3 命令输入 .................................................................................................... 49

2.3.4 VMware Tools 安装 ................................................................................... 51

2.4 Windows 7/Fedora 12 和平共处 ............................................................................. 51

2.5 实验任务 ................................................................................................................. 60

VIII

第 3 章 雾里看花——Linux 基本应用.............................................................................. 61

3.1 玩转桌面 .................................................................................................................62

3.1.1 桌面环境.....................................................................................................62

3.1.2 浏览器.........................................................................................................65

3.1.3 聊天软件.....................................................................................................68

3.1.4 邮件客户端.................................................................................................70

3.1.5 办公软件.....................................................................................................72

3.1.6 PDF 查看 ....................................................................................................76

3.1.7 媒体播放.....................................................................................................78

3.2 文本编辑器 .............................................................................................................82

3.2.1 Gedit 编辑器使用 .......................................................................................82

3.2.2 vi 编辑器使用.............................................................................................84

3.3 天涯若比邻 .............................................................................................................90

3.3.1 Telnet...........................................................................................................90

3.3.2 SSH .............................................................................................................92

3.3.3 RDP.............................................................................................................96

3.4 Linux 命令基础 .......................................................................................................97

3.4.1 Linux 命令分类 ..........................................................................................98

3.4.2 Linux 命令格式 ..........................................................................................98

3.4.3 Linux 命令辅助操作 ..................................................................................99

3.4.4 Linux 命令帮助获取 ................................................................................100

3.5 实验任务 ...............................................................................................................103

3.6 本章测试 ...............................................................................................................103

第 4 章 管好家产——Linux 目录及文件管理 ................................................................. 105

4.1 Linux 系统常见目录 .............................................................................................106

4.2 目录结构及操作命令............................................................................................107

4.2.1 Nautilus 工具 ............................................................................................107

4.2.2 pwd:查看当前目录 ................................................................................108

4.2.3 cd:改变当前目录 ...................................................................................108

4.2.4 ls:显示目录内容 ....................................................................................109

4.2.5 mkdir:创建目录 ..................................................................................... 111

4.2.6 tree:以树状图显示目录内容 ................................................................. 112

4.3 文件操作命令........................................................................................................ 113

4.3.1 touch:改变文件或目录时间 .................................................................. 113

4.3.2 file:识别文件类型 ................................................................................. 114

4.3.3 cp:复制文件或目录 ............................................................................... 114

4.3.4 rm:删除文件或目录 .............................................................................. 115

IX

4.3.5 mv:移动或更名现有的文件或目录...................................................... 116

4.3.6 ln:链接文件或目录 ............................................................................... 117

4.4 查找操作命令 ....................................................................................................... 118

4.4.1 locate:查找文件或目录 ......................................................................... 118

4.4.2 which:查找文件..................................................................................... 118

4.4.3 whereis:查找文件 .................................................................................. 119

4.4.4 find:查找文件或目录 ............................................................................ 120

4.5 压缩与归档命令 ................................................................................................... 123

4.5.1 gzip:压缩文件........................................................................................ 123

4.5.2 bzip2:压缩文件...................................................................................... 124

4.5.3 tar:压缩备份 .......................................................................................... 125

4.5.4 zip/uzip:ZIP 文件压缩与解压............................................................... 127

4.5.5 rar/unrar:RAR 文件压缩与解压 ........................................................... 129

4.5.6 7-Zip:7z 文件压缩与解密 ..................................................................... 131

4.6 文本查看命令 ....................................................................................................... 134

4.6.1 cat:显示文件内容················································································· 134

4.6.2 head:显示文件内容的最前部分 ........................................................... 135

4.6.3 tail:显示文件内容的末尾部分 ............................................................. 135

4.6.4 more:逐页显示文件内容 ...................................................................... 136

4.6.5 less:逐页显示文件内容......................................................................... 137

4.6.6 grep:查找并显示符合条件的内容........................................................ 138

4.7 实验任务 ............................................................................................................... 140

4.8 本章测试 ............................................................................................................... 141

第 5 章 人事档案——Linux 用户及组管理 .....................................................................143

5.1 Linux 用户及组管理方式..................................................................................... 144

5.1.1 用户管理方式 .......................................................................................... 144

5.1.2 用户组管理方式 ...................................................................................... 145

5.1.3 相关配置文件/目录 ................................................................................. 145

5.2 用户及用户组管理命令 ....................................................................................... 148

5.2.1 useradd:建立用户 .................................................................................. 148

5.2.2 passwd:更改用户密码........................................................................... 150

5.2.3 usermod:更改用户信息......................................................................... 151

5.2.4 userdel:删除用户 ................................................................................... 152

5.2.5 groupadd:建立用户组 ........................................................................... 152

5.2.6 groupmod:更改 GID 及组名称 ............................................................. 153

5.2.7 groupdel:删除用户组 ............................................................................ 153

5.2.8 chage:修改用户密码策略 ..................................................................... 154

X

5.2.9 finger:查找并显示用户信息 .................................................................154

5.2.10 w:显示当前登录系统的用户及用户进程信息 ..................................155

5.2.11 who:显示当前登录系统的用户信息 ..................................................156

5.2.12 last:显示当前及过去登录系统的用户信息 .......................................156

5.3 用户切换 ...............................................................................................................157

5.3.1 su:切换用户 ...........................................................................................157

5.3.2 sudo:以其他用户身份执行命令 ...........................................................159

5.4 实验任务 ...............................................................................................................161

5.5 本章测试 ...............................................................................................................162

第 6 章 看家护院——Linux 目录及文件权限管理.......................................................... 163

6.1 Linux 目录及文件权限管理方式 .........................................................................164

6.1.1 目录及文件的所有者及拥有组 ...............................................................164

6.1.2 目录及文件权限类型...............................................................................164

6.1.3 目录及文件权限特性...............................................................................165

6.2 文件及目录所有者/拥有组/权限管理 .................................................................168

6.2.1 chgrp:更改目录或文件的拥有组..........................................................168

6.2.2 chown:更改目录或文件的所有者或拥有组 ........................................169

6.2.3 chmod:更改目录或文件权限 ................................................................170

6.3 目录及文件高级权限管理....................................................................................172

6.3.1 权限掩码...................................................................................................172

6.3.2 特殊权限...................................................................................................173

6.3.3 ACL...........................................................................................................175

6.4 实验任务 ...............................................................................................................184

6.5 本章测试 ...............................................................................................................185

第 7 章 我的地盘我做主——Linux 磁盘及文件系统管理 ............................................... 187

7.1 Linux 磁盘分区 .....................................................................................................188

7.1.1 Linux 硬盘管理方式 ................................................................................188

7.1.2 通过命令对磁盘进行分区 .......................................................................189

7.2 Linux 文件系统 .....................................................................................................196

7.2.1 Linux 支持的文件系统 ............................................................................196

7.2.2 ext3 文件系统 ...........................................................................................198

7.2.3 ext4 文件系统 ...........................................................................................199

7.3 创建文件系统........................................................................................................200

7.3.1 创建 msdos 文件系统...............................................................................200

7.3.2 创建 vfat 文件系统...................................................................................201

7.3.3 创建 ext3 文件系统 ..................................................................................202

XI

7.3.4 更改分区卷标 .......................................................................................... 203

7.4 挂载设备 ............................................................................................................... 203

7.4.1 挂载及卸载设备 ...................................................................................... 203

7.4.2 /etc/fstab 配置文件挂载文件设备 ........................................................... 206

7.4.3 自动挂载 .................................................................................................. 207

7.5 查看文件系统 ....................................................................................................... 208

7.5.1 df:显示分区的使用情况 ....................................................................... 208

7.5.2 du:显示文件或目录占用空间............................................................... 209

7.6 交换分区 ............................................................................................................... 210

7.6.1 建立专用的交换分区 .............................................................................. 211

7.6.2 使用交换文件 .......................................................................................... 212

7.7 读写 NTFS 分区 ................................................................................................... 213

7.8 RAID 管理 ............................................................................................................ 213

7.8.1 RAID 等级................................................................................................ 213

7.8.2 在安装时创建 RAID 阵列....................................................................... 216

7.8.3 使用 mdadm 命令创建 RAID 阵列 ......................................................... 217

7.9 LVM 管理.............................................................................................................. 220

7.9.1 LVM 创建流程 ......................................................................................... 220

7.9.2 在安装时创建 LVM................................................................................. 221

7.9.3 LVM 相关命令 ......................................................................................... 222

7.9.4 LVM 建立与维护 ..................................................................................... 226

7.10 磁盘配额管理 ..................................................................................................... 230

7.10.1 磁盘配额相关命令 ................................................................................ 230

7.10.2 磁盘配额步骤 ........................................................................................ 233

7.11 实验任务 ............................................................................................................. 234

7.12 本章测试 ............................................................................................................. 234

第 8 章 不只是下一步——Linux 软件安装及管理...........................................................236

8.1 Linux 软件常见安装方式..................................................................................... 237

8.2 RPM 方式安装软件 .............................................................................................. 237

8.2.1 RPM 命名规则 ......................................................................................... 237

8.2.2 管理 RPM 软件包 .................................................................................... 238

8.2.3 维护 RPM 数据库 .................................................................................... 244

8.3 YUM 方式安装软件 ............................................................................................. 244

8.3.1 YUM 仓库配置 ........................................................................................ 245

8.3.2 YUM 客户端配置 .................................................................................... 246

8.3.3 YUM 客户端使用 .................................................................................... 247

8.4 源码包方式安装软件 ........................................................................................... 249

XII

8.4.1 编译 RPMs 包...........................................................................................249

8.4.2 编译 tar 包 ................................................................................................250

8.5 实验任务 ...............................................................................................................251

8.6 本章测试 ...............................................................................................................252

第 9 章 事半功倍——Shell 脚本 ................................................................................... 253

9.1 常见的 Shell ..........................................................................................................254

9.2 bash Shell ...............................................................................................................254 9.2.1 命令列表...................................................................................................254

9.2.2 在子 Shell 中运行命令.............................................................................255

9.2.3 命令别名...................................................................................................256

9.2.4 命令替换...................................................................................................257

9.2.5 转义字符...................................................................................................258

9.2.6 标准输入/输出及管道..............................................................................259

9.3 正则表达式 ...........................................................................................................263

9.3.1 正则表达式基本概念...............................................................................263

9.3.2 表达式全集...............................................................................................263

9.3.3 正则表达式实例.......................................................................................265

9.4 高级文本处理命令................................................................................................267

9.4.1 tr:转换或删除指定内容 ........................................................................267

9.4.2 sort:将显示内容排序.............................................................................268

9.4.3 cut:显示指定的内容 ..............................................................................269

9.4.4 split:拆分文件 ........................................................................................270

9.5 Shell 脚本 ..............................................................................................................271

9.5.1 变量...........................................................................................................272

9.5.2 条件测试...................................................................................................275

9.5.3 流程控制...................................................................................................278

9.5.4 函数...........................................................................................................283

9.5.5 脚本实例...................................................................................................284

9.6 实验任务 ...............................................................................................................289

9.7 本章测试 ...............................................................................................................289

第 10 章 识骨寻踪——Linux 引导及进程管理 ............................................................... 291

10.1 Linux 引导过程 ...................................................................................................292

10.1.1 开机自检.................................................................................................292

10.1.2 加载引导程序.........................................................................................293

10.1.3 加载内核.................................................................................................295

10.1.4 root 用户密码丢失 ...............................................................................300

XIII

10.1.5 修复损坏的/boot 分区 ........................................................................... 302

10.2 Shell 初始化 ........................................................................................................ 305

10.3 Linux 内核模块................................................................................................... 306

10.4 /proc 目录详解 .................................................................................................... 308

10.5 Linux 服务类型................................................................................................... 311

10.5.1 Standalone 服务...................................................................................... 311

10.5.2 Transient 服务 ........................................................................................ 316

10.6 Linux 进程管理................................................................................................... 320

10.6.1 Linux 进程查看 ...................................................................................... 321

10.6.2 Linux 进程管理 ...................................................................................... 331

10.7 Linux 作业管理................................................................................................... 334

10.8 自动化任务管理 ................................................................................................. 335

10.8.1 一次性任务管理 .................................................................................... 335

10.8.2 周期性任务管理 .................................................................................... 337

10.9 Linux 系统日志................................................................................................... 339

10.9.1 Linux 日志等级及设施 .......................................................................... 339

10.9.2 syslog 服务 ............................................................................................. 340

10.9.3 syslog 日志格式 ..................................................................................... 340

10.9.4 循环日志 ................................................................................................ 341

10.9.5 内核日志 ................................................................................................ 342

10.9.6 自定义日志 ............................................................................................ 342

10.10 实验任务 ........................................................................................................... 343

10.11 本章测试 ........................................................................................................... 343

第 11 章 开山铺路——Linux 网络管理...........................................................................345

11.1 网络接口配置 ................................................................................................... 346

11.1.1 网络接口................................................................................................. 346

11.1.2 配置网络接口......................................................................................... 348

11.1.3 IP 别名 .................................................................................................... 350

11.2 主机名配置 ......................................................................................................... 352

11.3 静态路由配置 ..................................................................................................... 353

11.4 ARP 配置............................................................................................................. 354

11.5 网络测试 ............................................................................................................. 355

11.5.1 ping:测试网络连通性.......................................................................... 355

11.5.2 nslookup:检查 DNS 查询结果 ............................................................ 356

11.5.3 traceroute:显示数据包到达目标的路径 ............................................. 357

11.5.4 tcpdump:监视网络传输数据............................................................... 358

11.5.5 wireshark................................................................................................. 359

XIV

11.6 图形化管理 Linux 网络参数 ..............................................................................365

11.7 实验任务..............................................................................................................366

11.8 本章测试..............................................................................................................366

第 12 章 IP 由我定——DHCP 服务配置 ....................................................................... 368

12.1 DHCP 基础 ..........................................................................................................369

12.2 DHCP 服务安装 ..................................................................................................370

12.3 DHCP 服务配置 ..................................................................................................371

12.3.1 作用域配置.............................................................................................372

12.3.2 选项配置.................................................................................................374

12.3.3 保留配置.................................................................................................376

12.3.4 中继代理配置.........................................................................................378

12.3.5 其他配置.................................................................................................380

12.4 客户端配置..........................................................................................................382

12.4.1 Linux 平台 ..............................................................................................383

12.4.2 Windows 平台.........................................................................................383

12.5 实验任务 .............................................................................................................384

12.6 本章测试 .............................................................................................................385

第 13 章 王者风范——BIND 服务配置.......................................................................... 387

13.1 DNS 基础 ............................................................................................................388

13.1.1 DNS 结构................................................................................................388

13.1.2 DNS 查询过程........................................................................................389

13.1.3 DNS 记录................................................................................................390

13.2 BIND 服务安装...................................................................................................391

13.3 BIND 服务配置...................................................................................................392

13.3.1 BIND 配置文件结构 ..............................................................................392

13.3.2 主 DNS 服务器配置...............................................................................399

13.3.3 从 DNS 服务器配置...............................................................................402

13.3.4 缓存 DNS 服务器配置...........................................................................404

13.4 客户端名称解析顺序..........................................................................................406

13.4.1 Linux 平台名称解析顺序 ......................................................................406

13.4.2 Windows 平台名称解析顺序.................................................................406

13.5 客户端配置..........................................................................................................407

13.5.1 Linux 平台 ..............................................................................................407

13.5.2 Windows 平台.........................................................................................407

13.6 实验任务 .............................................................................................................409

13.7 本章测试 .............................................................................................................410

XV

第 14 章 太阳光辉——NFS 服务配置 ............................................................................411

14.1 NFS 服务配置 ..................................................................................................... 412

14.1.1 NFS 只读共享 ........................................................................................ 413

14.1.2 NFS 可写共享 ........................................................................................ 414

14.1.3 用户访问权限 ........................................................................................ 414

14.2 客户端访问 ......................................................................................................... 415

14.2.1 Linux 平台 .............................................................................................. 415

14.2.2 Windows 平台 ........................................................................................ 416

14.3 实验任务 ............................................................................................................. 418

14.4 本章测试 ............................................................................................................. 419

第 15 章 固若金汤——vsftpd 服务配置..........................................................................421

15.1 FTP 基础 ............................................................................................................. 422

15.2 vsftpd 服务安装 .................................................................................................. 422

15.3 vsftpd 服务配置 .................................................................................................. 423

15.3.1 身份验证 ................................................................................................ 424

15.3.2 其他配置 ................................................................................................ 426

15.4 客户端访问 ......................................................................................................... 429

15.4.1 使用浏览器 ............................................................................................ 429

15.4.2 使用命令 ................................................................................................ 430

15.4.3 使用 FTP 客户端工具软件.................................................................... 432

15.5 实验任务 ............................................................................................................. 433

15.6 本章测试 ............................................................................................................. 433

第 16 章 桑巴起舞——Samba 服务配置........................................................................435

16.1 Samba 服务安装 ................................................................................................. 436

16.2 Samba 服务配置 ................................................................................................. 437

16.2.1 资源共享配置 ........................................................................................ 437

16.2.2 用户认证 ................................................................................................ 439

16.2.3 权限控制 ................................................................................................ 440

16.2.4 访问控制 ................................................................................................ 443

16.2.5 其他配置 ................................................................................................ 446

16.3 客户端访问 ......................................................................................................... 448

16.3.1 Linux 平台 .............................................................................................. 449

16.3.2 Windows 平台 ........................................................................................ 451

16.4 实验任务 ............................................................................................................. 452

16.5 本章测试 ............................................................................................................. 453

XVI

第 17 章 最流行的 Web 服务器——Apache 服务配置 .................................................. 456

17.1 Apache 服务安装 ................................................................................................457

17.2 Apache 服务配置 ................................................................................................457

17.2.1 基本 Web 服务........................................................................................459

17.2.2 虚拟主机.................................................................................................460

17.2.3 身份验证.................................................................................................462

17.2.4 访问控制.................................................................................................464

17.2.5 HTTPS 配置 ...........................................................................................465

17.2.6 LAMP 配置.............................................................................................466

17.3 Web 相关命令 .....................................................................................................471

17.3.1 wget:非交互式 Web 下载工具 ............................................................471

17.3.2 links:纯文本 Web 浏览器 ....................................................................472

17.4 实验任务 .............................................................................................................473

17.5 本章测试 .............................................................................................................473

第 18 章 可爱的章鱼——Squid 代理服务配置 .............................................................. 476

18.1 Squid 服务安装 ...................................................................................................477

18.2 Squid 服务配置 ...................................................................................................477

18.2.1 正向代理服务器配置.............................................................................478

18.2.2 反向代理服务器配置.............................................................................480

18.2.3 透明代理服务器.....................................................................................482

18.2.4 访问控制列表.........................................................................................484

18.3 客户端访问..........................................................................................................487

18.3.1 IE 浏览器 ................................................................................................487

18.3.2 FireFox 浏览器 .......................................................................................488

18.3.3 Opera 浏览器 ..........................................................................................489

18.4 实验任务 .............................................................................................................490

18.5 本章测试 .............................................................................................................491

第 19 章 看家护院——IPTables 防火墙配置 ................................................................. 493

19.1 IPTables 工作流程...............................................................................................494

19.1.1 filter 表 ....................................................................................................498

19.1.2 nat 表.......................................................................................................499

19.1.3 mangle 表 ................................................................................................499

19.1.4 raw 表......................................................................................................500

19.2 IPTables 状态机制...............................................................................................500

19.2.1 NEW 状态...............................................................................................500

19.2.2 ESTABLISHED 状态 .............................................................................501

XVII

19.2.3 RELATED 状态...................................................................................... 501

19.2.4 INVALID 状态 ....................................................................................... 501

19.2.5 UNTRACKED 状态 ............................................................................... 501

19.3 IPTables 配置 ...................................................................................................... 501

19.3.1 IPTables 开启与关闭.............................................................................. 501

19.3.2 IPTables 策略配置.................................................................................. 502

19.3.3 Firewall Builder ...................................................................................... 514

19.4 实验任务 ............................................................................................................. 518

19.5 本章测试 ............................................................................................................. 519

Linux 操作系统是一种类 UNIX 计算机操作系统的统称。Linux 操作

系统的内核的名字也是 Linux。Linux 操作系统是自由软件和开放源代码

发展中 著名的软件之一。

类 UNIX 系统指各种传统的 UNIX 系统,如 FreeBSD、OpenBSD、

Solaris 及各种与传统 UNIX 类似的系统,如 Minix、Linux、QNX 等。

这些系统虽然有的是自由软件,有的是商业软件,但都相当程度地继承

了原始 UNIX 的特性,有许多相似之处。

从严格意义来讲,Linux 本身只表示 Linux 内核,但实际上大多数人

已经习惯了用 Linux 来形容整个基于 Linux 内核,它是使用 GNU 工程的

各种工具和数据库的操作系统。基于这些组件的 Linux 软件被称为 Linux

发行版。一般来讲,一个 Linux 发行版包含大量的软件,如软件开发工具

(如 gcc)、数据库(如 PostgreSQL、MySQL)、Web 服务器(如 Apache、

Nginx)、X Window、桌面环境(如 GNOME、KDE)、办公软件(如

OpenOffice.org)、脚本语言(如 Perl、PHP 和 Python)等。

第1章

前世今生

︱Linux

系统简介

提 示

Linux 从初学到精通

2

Linux 内核 初是为英特尔 386 微处理器设计的,现在 Linux 内核支持从个人电脑到大型主

机甚至包括嵌入式系统在内的各种硬件设备。

Linux 已经成为一种受到广泛关注和支持的操作系统。包括 IBM 和惠普、戴尔在内的一

些计算机业巨头也陆续支持 Linux,并且成立了一些组织支持其发展。很多人认为和其他的

商用 UNIX 系统及微软 Windows 相比,作为自由软件的 Linux 具有低构建成本、高安全性、

更加可信赖等优势。

Linux 诞生记

Linux 内核 初只是由芬兰人李纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时

出于个人爱好而编写的,当时他并不满意 Minix 这个教学用的操作系统,部分原因是 Minix

只能在有限硬件上运行。 初的设想中,Linux 是一种类似 Minix 的一种操作系统。Linux

的第一个版本在 1991 年 9 月被大学 FTP 管理员 Ari Lemmke 发布在 Internet 上, 初 Torvalds

称这个内核的名称为“Freax”,意思是自由(“free”)和奇异(“freak”)的结合,并且附上了

“X”这个常用的字母,以配合所谓的类 UNIX 系统。但是当时的 FTP 管理员认为原来的命名

“Freax”不好听,把内核的称呼改成“Linux”,当时仅有 10000 行代码,仍必须运行于 Minix

操作系统之上,并且必须使用硬盘开机。随后在 10 月 0.02 版发布了,同时这位芬兰赫尔辛

基的大学生在 comp.os.minix 上发布一则消息。

Hello everybody out there using minix- I'm doing a (free) operation system (just a hobby,won't be big and professional like

gnu) for 386(486) AT clones.

Linux 的标志和吉祥物是一只名字叫做 Tux 的企鹅,标志的由来是因为 Linus 在澳大利亚

时曾被一只动物园里的企鹅咬了一口,便选择了企鹅作为 Linux 的标志。更容易被接受的说

法是:企鹅代表南极,而南极又是全世界所共有的一块陆地。这也就代表 Linux 是所有人的

Linux。

传统的 Linux 用户一般都安装并设置自己的操作系统,他们往往比其他操作系统,如微

软 Windows 和苹果 Mac OS 的用户更有经验。然而随着 Linux 越来越流行,越来越多的原始

设备制造商(OEM)开始在其销售的电脑上预装上 Linux,Linux 的用户中也有了普通电脑用

户,Linux 系统也开始慢慢抢占个人电脑操作系统市场。同时 Linux 也是 受欢迎的服务器

操作系统之一。Linux 在嵌入式消费电子市场上拥有优势,低成本的特性使 Linux 深受用户

欢迎。不仅许多物美价廉的上网本预装 Linux 操作系统,在手机方面,摩托罗拉许多款产品

均采用 Linux 系统,Google 发布的手机上使用的 Android 系统同样也基于 Linux。使用 Linux

主要的成本为移植、培训和学习的费用,早期由于会使用 Linux 的人较少,这方面费用较

高,但这方面的费用已经随着 Linux 的日益普及和 Linux 方面的软件越来越多、越来越方便

而降低。

前世今生——Linux 系统简介 第

3

1

Linux 成长记

Linus Torvalds 开发了 Linux,其实他开发的就是内核,按内核官方主页(内核官方主页:

http://kernel.org/)的理解,这个内核就是 Linux,其他的扩展和应用都是围绕内核而展开的。

所有 Linux 应用程序都会和内核发生直接或者间接的接触,比如硬件需要内核支持,网络的

通信也需要内核支持,文件系统更需要内核支持。

Linux 内核本身并不是操作系统,Linux 内核是一个完整操作系统的组成部分。Red Hat、

Novell、Debian 等 Linux 发行商都采用 Linux 内核,然后加入更多的工具、库和应用程序来

构建一个完整的操作系统。

Linux 发行商一般会根据自己的需要对基本内核进行定制,在一些情况下,不同的 Linux

版本会在自己的内核中加入主内核中没有的特性和支持,如 Red Hat 将部分 2.6 内核的特性

向前移植到它自己的 2.4.x 内核中。

一般可以从 Linux 内核版本号来区分系统是否是 Linux 稳定版还是测试版。以版本 2.4.0

为例:2 代表主版本号;4 代表次版本号;0 代表改动较少的末版本号。在版本号中,序号的

第二位为偶数的版本表明这是一个可以使用的稳定版本,如 2.4.6;而序号的第二位为奇数的

版本一般有一些新的内容加入,是一个不一定非常稳定的测试版本,如 2.5.7。这样稳定版本

来源于上一个测试版升级版本号,而一个稳定版本发展到完全成熟后就不再发展,如图 1-1

所示。

图 1-1 Linux内核版本

百家争鸣的 Linux 发行版

Linux 发行版指的就是通常所说的“Linux 操作系统”,可能是由一个组织、公司或者个

人发行的。Linux 主要作为 Linux 发行版的一部分而使用。通常来讲,一个 Linux 发行版包括

Linux 从初学到精通

4

Linux 内核,将整个软件安装到计算机上的一套安装工具、各种 GNU 软件、其他的一些自由

软件,在一些特定的 Linux 发行版中也有一些专有软件。发行版为许多不同的目的而制作,

包括对不同计算机结构的支持,对一个具体区域或语言的本地化,实时应用和嵌入式系统。

一个典型的 Linux 发行版包括 Linux 内核、一些 GNU 程序库和工具、命令行 Shell、图形界

面的 X Window 系统和相应的桌面环境,并包含数千种从办公、编译器、文本编辑器到科学

工具的应用软件。很多版本 Linux 发行版使用 LiveCD 是不需要安装就能使用的版本。比较

著名的有 Damn Small Linux、Knoppix 等。目前几百个发行版被积极地开发, 普遍被使用

的发行版有以下几种。

LiveCD 是“事先存储于某种可移动存储设备上,可以不依赖于计算机硬件而启动的操

作系统(通常还包括一些其他软件)”。LiveCD 不需要安装到计算机的硬盘中,采用的存储

设备包括 CD-ROM(Live CD)、DVD(Live DVD)、闪存(Live USB)等。在取出 LiveCD

并重新启动后,计算机就可以恢复到原本的操作系统。

1.3.1 Debian

Debian(Debian 官方网站:http://www.debian.org/)于 1993 年 8 月 16 日由一名美国普渡

大学学生 Ian Murdock 首次发表。Ian Murdock 初把他的系统称为“Debian Linux Release”。

在定义文件 Debian Manifesto 中,Ian Murdock 宣布将以开源的方式,本着 Linux 及 GNU 的

精神发行一套 GNU/Linux 发行版。Debian 的名称是由当前他的女友 Debra 和 Ian Murdock 自

己的名字合并而成的。Debian 可以算是迄今为止, 遵循 GNU 规范的 Linux 系统,如图 1-2

所示为运行 Gnome 的 Debian 桌面。

图 1-2 运行 Gnome的 Debian桌面

提 示

前世今生——Linux 系统简介 第

5

1

Debian 计划 初发展缓慢,在 1994 年和 1995 年各自发布了 0.9x 版本,1.x 版本则在 1996

年发布。1996 年,Bruce Perens 接替了 Ian Murdock 成为 Debian 计划的领导者。同年,一个

开发者 Ean Schuessler 提议 Debian 应在其计划与使用者之间建立一份社会契约。经过讨论,

Bruce Perens 发表了 Debian 社会契约(Debian Social Contract)及 Debian 自由软件指南(Debian

Free Software Guidelines),定义了开发 Debian 的基本承诺。

1998 年在基于 GNU C 运行期库的 Debian 2.0 发布之前,Bruce Perens 离开了 Debian 的

开发工作。Debian 开始选出新的领导者,并发布了另外两个 2.x 版本,包含了更多接口和软

件包。APT 和第一个非 Linux 接口——Debian GNU/Hurd 的开发也已展开。

在 2000 年 Debian 对数据库和发布的管理作出了重大的改变,重组了收集软件的过程,

并创造了“测试”(testing)版本,作为较稳定的对下一个发布的演示。同年,Debian 的开发

者开始举办名为 Debconf 的年会,为其开发者和技术专家提供讲座和工作室。

Debian 主要分三个版本:稳定版本(stable)、测试版本(testing)、不稳定版本(unstable)。

目前的稳定版本为 Debian lenny,目前的测试版本为 Debian Squeeze,不稳定版本永远为

Debian sid。到目前为止,所有开发代号均出自 Pixar 的电影玩具总动员。具体各版本代号及

发行年代见表 1-1。

表 1-1 客户端指定方法各版本代号及发行年代

版本 代号 发布日期 玩具总动员的对应角色

1.1 Buzz 1996 年 6 月 17 日 巴斯光年,电影主角之一的太空人

1.2 Rex 1996 年 12 月 12 日 暴龙

1.3 Bo 1997 年 6 月 2 日 放羊的女孩

2.0 Hamm 1998 年 7 月 24 日 小猪扑满

2.1 Slink 1999 年 3 月 9 日 玩具狗

2.2 Postato 2000 年 8 月 15 日 Potato Head 先生

3.0 Woody 2002 年 7 月 19 日 胡迪,电影主角之一的牛仔

3.1 Sarge 2005 年 6 月 6 日 绿色塑胶玩具士兵的首领

4.0 Etch 2007 年 4 月 8 日 玩具黑板

5.0 Lenny 2009 年 2 月 14 日 望远镜

6.0 Squeeze 2010 年春季 三只眼的外星人

Sid TBA 隔壁的男孩,玩具终结者

Debian 以稳定性闻名,所以很多服务器都使用 Debian 作为其操作系统,而很多 Linux

的 LiveCD 也以 Debian 为基础改写, 为著名的例子为 Knoppix。在桌面领域,Debian 的一

个改进版 Ubuntu Linux 就获得了很多 Linux 用户的支持,在 DistroWatch.com 浏览排名里排

名一直很靠前,而很多信息学竞赛也采用了 Debian 作为操作系统。

Debian 与 Ubuntu、OpenSuSE 等 Linux 发行版相比,较少桌面用户会选择使用 Debian。

主要原因是其版本一般需要长时间的测试,甚至因为为获得稳定的系统性能而测试时间过长

造成与 新的软件包相比有些落后。

Linux 从初学到精通

6

1.3.2 Ubuntu

Ubuntu 是一个南非的民族观念,着眼于人们之间的忠诚和联系。该词来自于祖鲁语和科

萨语。ubuntu 被视为非洲人的传统理念,也是建立新南非共和国的基本原则之一,与非洲复

兴的理想密切相关。作为一个基于 GNU/Linux 的平台,Ubuntu(Ubuntu 官方网站:

http://www.ubuntu.com/)操作系统将 ubuntu 精神带到了软件世界。Ubuntu 由马克·舍特尔沃

斯创立,其首个版本 4.10 发布于 2004 年 10 月 20 日,Ubuntu 以 Debian 为开发蓝本。与 Debian

稳健的升级策略不同,Ubuntu 每 6 个月会发布一个新版,以便人们及时地获取和使用新软件,

如图 1-3 所示为 Ubuntu 的桌面。

图 1-3 Ubuntu的桌面

Ubuntu 的开发目的是使个人计算机变得简单易用,同时也提供针对企业应用的服务器版

本。普通的桌面应用版可以获得 18 个月的支持,目前已发行版本见表 1-2,标为 LTS 的桌面

应用版可以获得更长时间的支持。如 Ubuntu 8.04 LTS 桌面应用系列可以获得为期三年的技术

支持,服务器版可以获得为期五年的技术支持。Ubuntu 具有庞大的社群力量,用户可以方便

地从社群获得帮助。

表 1-2 Ubuntu 发行历史

版本 发布日期 代号 最近的主要更新

4.10 2004 年 10 月 20 日 Warty Warthog

5.04 2005 年 4 月 8 日 Hoary Hedgehog

5.10 2005 年 10 月 13 日 Breezy Badger

前世今生——Linux 系统简介 第

7

1

(续表)

版本 发布日期 代号 最近的主要更新

6.06 LTS 2006 年 6 月 1 日 Dapper Drake 6.06.2 发布于 2008 年 1 月 21 日

6.10 2006 年 10 月 26 日 Edgy Eft

7.04 2007 年 4 月 19 日 Feisty Fawn

7.10 2007 年 10 月 18 日 Gutsy Gibbon

8.04 LTS 2008 年 4 月 24 日 Hardy Heron 8.04.3 发布于 2009 年 7 月 16 日

8.10 2008 年 10 月 30 日 Intrepid Ibex

9.04 2009 年 4 月 23 日 Jaunty Jackalope

9.10 2009 年 10 月 29 日 Karmic Koala

10.04 LTS 2010 年 4 月 29 日 Lucid Lynx

Ubuntu 默认桌面环境采用 Gnome,而 Kubuntu 与 Xubuntu 是 Ubuntu 计划正式支持的派

生版本,分别将 KDE 与 Xfce 桌面环境带入 Ubuntu。Ubuntu 及其派生版本至今似乎没有正式

的中文译名,至少从 Ubuntu 的官方中文网站上来看是这样。一些中文用户使用班图、乌班图、

乌斑兔、乌帮图等作为非官方译名,不过并未得到一致认可。目前 Ubuntu 正式支持的派生版

本包括以下几个。

Kubuntu:使用和 Ubuntu 一样的软件包,但不采用 GNOME,而是采用 KDE 作为默

认的桌面环境,以满足偏爱 KDE 的 Ubuntu 用户。

Edubuntu:是为教育量身定做的发行版,包含很多教育软件,可以帮助教师方便地

搭建网络学习环境,管理电子教室。

Xubuntu:属于轻量级的发行版,使用 Xfce4 作为默认桌面环境,与 Ubuntu 采用一

样的软件包。

Ubuntu Server Edition:自 Ubuntu 5.10 版(Breezy Badger)起与桌面版同步发行,

可用做多种服务器,如邮件服务器、基于 LAMP 的网站服务器、DNS 服务器、文

件服务器与数据库服务器等。与桌面版本相比,服务器版的光盘镜像较小,运行时

对硬件要求较低, 少只需要有 500MB 硬盘空间和 64MB 存储器。服务器版通常

不提供任何桌面环境。

Ubuntu Netbook Remix:专门为 EeePC 等小屏幕 Netbook 设计的 Ubuntu,接口尽量

精简以省屏幕空间,如 GNOME 的 Panel 减成只剩一条,且与视窗标题合在一起。

Ubuntu Studio:适合于音频、视频和图像设计的版本。

Ubuntu JeOS:一个高度精简的、专门针对虚拟化应用的版本。

Ubuntu Mobile:Ubuntu 在移动设备上运行的版本。

Ubuntu 计划强调易用性和国际化,以便能为尽可能多的人所用。在发布 5.04 版时,Ubuntu

就已经把万国码(UTF-8 Unicode)作为系统默认编码,用于应对各国各地区不同的语言文字,

试图给用户提供一个无乱码的交流平台。Ubuntu 在语言支持方面,算是 Linux 发行版中相当

好的。

Linux 从初学到精通

8

Ubuntu 的所有发行版本都可以免费获取。除了可下载光盘镜像(CD Image)外,用户也

可通过邮寄服务免费获取安装光盘。与其他大型 Linux 厂商不同,Ubuntu 不对所谓“企业版”

收取升级订购费(没有所谓的企业版本,人人所使用的版本皆一样,用户只有在购买官方技

术支持服务时才要付钱)。不过 Ubuntu 社区除推荐用户自行下载光盘镜像刻录成光盘安装外,

也推荐使用 USB 闪存盘进行安装,不推荐申请邮寄服务获取免费光盘,目的是减少成本。此

外,Ubuntu 计划强调要尽量使用自由软件,以便为各个版本的用户提供便捷的升级途径。

1.3.3 SuSE/openSuSE

SuSE(SuSE 官方网站:http://www.novell.com/linux/)原是以 Slackware Linux 为基础,

并提供完整德文使用界面的产品。1992 年 Peter McDonald 成立了 Softlanding Linux System

(SLS)发行版。这套发行版包含的软件非常多,更首次收录了 X Window 及 TCP/IP 等套件。

Slackware 就是一个基于 SLS 的发行版。

SuSE 于 1992 年末创办,目的是成为 UNIX 技术公司,专门为德国人推出量身定做的

SLS/Slackware 软件及 UNIX/Linux 说明文件。1994 年,他们首次推出了 SLS/Slackware 的安

装光盘,命名为 S.u.S.E. Linux 1.0。其后综合了 Florian La Roche 的 Jurix distribution(也是一

个基于 Slackware 的发行版),于 1996 年推出一个完全自家打造的发行版 S.u.S.E. Linux 4.2。

“S.u.S.E.”后来改称为简短的“SuSE”,意思为“Software-und System-Entwicklung”,这

是一句德文,英文为“Software and system development”。现在这家公司的名字再度更改成

SuSE Linux,“SuSE”已经不包含什么意义了。

2003 年 11 月 4 日,Novell 表示将会对 SuSE 提出收购。收购的工作于 2004 年 1 月完成。

Novell 也向大家保证 SuSE 的开发工作仍会继续下去,Novell 更把公司内全线电脑的系统换

成 SuSE Linux,并同时表示将会把 SuSE特有而优秀的系统管理程序YaST2 以GPL授权发行,

如图 1-4 所示为 SuSE 11 的桌面。

图 1-4 SuSE 11的桌面

前世今生——Linux 系统简介 第

9

1

2005 年 8 月 4 日,Novell 公共关系科的领导及代言人表示,SuSE Linux Professional 系

列的开发将变得更开放,以让社群参与当中的工作。新的开发计划名为 openSuSE(openSuSE

官方网站:http://www.opensuse.org),目的是吸引更多的使用者及开发人员。相比以往,现在

所有的开发人员及使用者能够测试 SuSE 的产品并一起开发新版本的 SuSE。在以往 SuSE 的

开发工作都是于内部进行的,SuSE 10.0 是第一个给予公众测试的版本。为了配合这个转变,

用户除了能够购买盒装版本的 SuSE 外,也可以从网络上免费下载。一系列的改变让于 2005

年 10 月 6 日推出的 SuSE Linux 有 3 个版本:OSS 版(完全地开放源代码);试用版(同时包

含开放源代码的程序及一些专属程序,如 Adobe Reader、Real Player 等,其实就是盒装零售

版,也可以免费下载,安装在硬盘上,并且没有使用限制或限期,但不含说明手册及 Novell

提供的技术支持);盒装零售版。

1.3.4 RHEL

Red Hat 公司(Red Hat 官方网站:http://www.redhat.com/)由 Bob Young 和 Marc Ewing

于 1995 年创建,2005 年 12 月 19 日在 NASDAQ 上市,2006 年 12 月 12 日转到纽约证券交

易所挂牌。目前是全球 大的开源技术厂家,其产品也是全世界应用 广泛的 Linux。Red Hat

公司总部位于美国北加利福尼亚。在全球拥有 22 个分部。对于 Red Hat 公司来说,开放源代

码已经不只是一个软件模型,这正是 Red Hat 公司的商业模式。因为 Red Hat 公司坚信只有

协作,企业才能创造出非凡质量和价值的产品,如图 1-5 所示为 Red Hat Enterprise Linux 5

的桌面。

图 1-5 Red Hat Enterprise Linux 5的桌面

Linux 从初学到精通

10

Red Hat Enterprise Linux(在本书中简称 RHEL)是 Red Hat 公司 成功的产品之一,目

前 新版为 RHEL 5.x。RHEL 5.x 是 Red Hat 公司的商业服务器操作系统版本的第四次重要版

本发布,Red Hat 公司酝酿发布 RHEL 5.x 的时间超过了两年,主要变化包括 Linux 内核升级、

支持 Xen 虚拟化技术、集群存储等。RHEL 5.x 的版本主要分为 Server 和 Desktop 两个版本,

而 Server 版又分为 Red Hat Enterprise Linux Advanced Platform、Red Hat Enterprise Linux;

Desktop 版又分为 Red Hat Enterprise Linux Desktop、Red Hat Enterprise Linux Desktop with

Workstation option。

Red Hat 公司于 1999 年推出自己的认证体系。通过多年的发展已经成为 IT 领域 有价值

的技术认证之一。Red Hat 认证体系中包括 Red Hat 认证技师(RHCT)、Red Hat 认证工程师

(RHCE)、Red Hat 认证安全专家(RHCSS)、Red Hat 认证架构师(RHCA)。

RHCT 和 RHCE 是以实际操作能力为基础的测试项目,主要考查考生在现场系统中的实

际能力。RHCA 课程主要面向那些负责部署和管理大型企业环境中众多系统的高级 Linux 系

统管理员为其提供深入的实际操作培训。Red Hat 认证架构师是 Red Hat 公司继 RHCT 和

RHCE 认证之后推出的顶级认证,也是 Linux 领域公认的 受欢迎的、 成熟的认证。RHCSS

课程主要证明考生具有使用 Red Hat 企业 Linux、SELinux 和 Red Hat 目录服务器来满足当

今企业环境安全需求等高级技能的 新安全认证。

1.3.5 红旗 Linux

红旗 Linux(红旗 Linux 官方网站:http://www.redflag-linux.com/)是由北京中科红旗软

件技术有限公司开发的一系列 Linux 发行版,包括桌面版、工作站版、数据中心服务器版、

HA 集群版和红旗嵌入式 Linux 等产品。目前在中国各软件专卖店可以购买到光盘版,同时

官方网站也提供光盘镜像免费下载,如图 1-6 所示为红旗 Linux 的桌面。

图 1-6 红旗 Linux的桌面

前世今生——Linux 系统简介 第

11

1

红旗 Linux 是中国较大、较成熟的 Linux 发行版之一。自 2000 年 6 月成立以来,红旗软

件迅速实现了主营业务的全面盈利,形成了以北京为总部,在广州、上海等地设有分公司的

架构,并拥有立体的销售渠道和遍布全国的服务网络。红旗软件提供的产品涵盖了高端 Linux

服务器操作系统、集群系统、桌面版操作系统、嵌入式系统及技术支持服务和培训等领域,

用户广泛分布在政府、邮政、教育、电信、金融、保险、交通、运输、能源、物流、媒体和

制造等各个行业。

1.3.6 CentOS

CentOS(CentOS 官方网站:http://www.centos.org/)是 Community Enterprise Operating

System(社区企业操作系统)的缩写。CentOS 并不是全新的 Linux 发行版,而是 RHEL 的派

生版本。在众多 RHEL 的派生版本中,CentOS 是比较出众的的一个,如图 1-7 所示为 CentOS

的桌面。

图 1-7 CentOS的桌面

RHEL 在发行后任何用户都可以免费获得,但如果使用 Red Hat 公司的在线升级或咨询

服务就必须付费。CentOS(CentOS 官方网站:http://www.centos.org/)是将 RHEL 发行的源

代码重新编译一次,形成一个可使用的二进制版本。由于 Linux 的源代码是 GNU,所以从获

得 RHEL 的源代码到编译成新的二进制都是合法的。只是 Red Hat 是注册商标,所以在新的

发行版里不能出现 Red Hat 的商标。Red Hat 公司对这种发行版并不反对,Red Hat 公司认为

真正付费的用户,重视的并不是系统本身而是 Red Hat 公司所提供的商业服务。所以,CentOS

可以得到 RHEL 的所有功能,甚至是更好的软件。但是 CentOS 并不向用户提供商业支持,

Linux 从初学到精通

12

当然也不承担任何商业责任。

1.3.7 Fedora

Fedora(Fedora Linux,Fedora 7 以前称为 Fedora Core)在众多 Linux 发行版中拥有较高

的知名度,由 Fedora Project 社区开发、Red Hat 公司赞助的 Fedora(Fedora 官方网站:

http://fedoraproject.org/)目标是推动自由和开源软件更快地进步。公开的论坛、开放的过程、

快速的创新、精英和透明的管理,所有这些都能为实现一个自由软件提供 好的操作系统和

平台。

Fedora 是基于 Red Hat Linux 开发的,在 Red Hat Linux 停止发行后,Red Hat 以 Fedora

来取代 Red Hat Linux 在个人应用的领域,而另外发行的 Red Hat Enterprise Linux 则取代 Red

Hat Linux 在商业应用的领域,如图 1-8 所示为 Fedora 12 的桌面。

图 1-8 Fedora 12的桌面

Fedora 的功能对于使用者而言,是一套功能完备、更新快速的免费操作系统,而对赞助

者 Red Hat 而言,是许多新技术的测试平台,被认为可用的技术 终会加入到 RHEL 中。Fedora

Project 一般每 6 个月发布一个新版本,目前已发行版本见表 1-3。

表 1-3 Fedora 发行历史

版本 名称 发布日期 状态

Fedora Core 1 Yarrow 2003 年 11 月 6 日 停止支持

Fedora Core 2 Tettnang 2004 年 5 月 18 日 停止支持

前世今生——Linux 系统简介 第

13

1

(续表)

版本 名称 发布日期 状态

Fedora Core 3 Heidelberg 2004 年 11 月 8 日 停止支持

Fedora Core 4 Stentz 2005 年 6 月 13 日 停止支持

Fedora Core 5 Bordeaux 2006 年 3 月 20 日 停止支持

Fedora Core 6 Zod 2006 年 10 月 24 日 停止支持

Fedora 7 Moonshine 2007 年 5 月 31 日 停止支持

Fedora 8 Werewolf 2007 年 11 月 8 日 停止支持

Fedora 9 Sulphur 2008 年 5 月 13 日 停止支持

Fedora 10 Cambridge 2008 年 11 月 25 日 停止支持

Fedora 11 Leonidas 2009 年 6 月 9 日 已发行

Fedora 12 Constantine 2009 年 11 月 17 日 已发行

Fedora承继了Red Hat Linux的安装界面Anaconda、桌面环境(同时包含Gnome和KDE)、

套件管理器 RPM、多国语言支持及许多配置工具,所以习惯使用 Red Hat 操作系统的用户会

感到相当熟悉,也因为如此,Fedora 使用者在转移至 RHEL、CentOS 等系统时在操作上不会

感觉有太多差异。

1.3.8 为什么选择 RHEL 5.x

20世纪 90年代末期,Linux以自由且开放源代码为号召,试图挑战商业且闭源的Windows

在操作系统在市场上的霸主地位。随着 Linux 不断发展、壮大,市场出现了很多 Linux 的发

行版。为什么本书在众多的 Linux 发行版中选择 Red Hat 公司的 Red Hat Enterprise Linux 进行

讲解呢?

Red Hat 在 1995 年成立后所推出的 Linux 系统与软件整合套件 Red Hat Linux 适时回应了

市场对 Linux 操作系统的需求,从而奠定了 Red Hat 在 Linux 业界的旗手地位。截至目前,

Red Hat 仍是提供 Linux 整合服务的同类企业中规模 大的公司。Red Hat 于 1999 年 8 月 11

日在 NASDAQ 上市,2006 年 12 月 12 日转到纽约证券交易所挂牌。目前全球拥有超过 27

家的分支机构。Red Hat Enterprise Linux 是 Red Hat 公司的 Linux 发行版,也是 Red Hat 公司

成功的产品之一,其主要面向商业市场。Red Hat 公司对企业版 Linux 的每个版本提供 7

年的支持。Red Hat Enterprise Linux 每 18~24 个月发布一个新版本。

Red Hat 是 Linux 界的老牌劲旅,Red Hat 经营范围从部署和经营到嵌入式设备和安全网

页服务器等面面俱到。在各个领域 Red Hat 都是 Linux 使用的开源软件来作为解决方案,可

以说是开源软件的老大。这也是本书选择使用 Red Hat Enterprise Linux 讲解的原因。

Linux 从初学到精通

14

为开源保驾护航的GNU及GPL/LGPL

在 20 世纪 70 年代,UNIX 体系的源程序大多是可以任意流传的。互联网的基础协议

TCP/IP 就是产生于那个年代。在当时,人们在创作各自的“程序作品”中享受着从事科学探

索、创新活动所特有的那种激情和成就感。那时的程序员,如同艺术家一样,急于“发表”

自己的程序作品,并不专注于保守“机密”,以换取高额利润。

1979 年,AT&T 宣布了 UNIX 的商业化计划,随之出现了各种二进制的商业 UNIX 版本。

于是就兴起了基于二进制机读代码的“版权产业”(Copyright Industry),使软件业成为一种

版权专有式的产业,围绕程序开发的那种创新活动被局限在某些骨干企业的小圈子里,源码

程序视为核心“商业机密”。这种做法,一方面产生了大批的商业软件,极大地推动了软件业

的发展,诞生了一批软件巨人;另一方面,由于封闭式的开发模式,也阻碍了软件业的进一

步深化和提高。由此,人们为商业软件的“专有权”付出了巨大的代价。

1983 年,理查·马修·斯托曼(Richard Stallman)创立了 GNU(GNU 官方网站:

http://www.gnu.org/)计划。这个计划有一个目标,是发展一个完全免费自由的类 UNIX 操作

系统。自 20 世纪 90 年代发起这个计划以来,GNU 开始大量地产生或收集各种系统所必备的

组件,如函数库、编译器、调试工具、文本编辑器、网站服务器等。1990 年,GNU 计划开

始在马赫微核(Mach microkernel)的架构之上开发系统内核,但是这个基于 Mach 的设计异

常复杂,发展进度则相对缓慢。

到了 1990 年,GNU 计划已经开发出的软件包括了一个功能强大的文字编辑器 Emacs、C

语言编译器 GCC 及大部分 UNIX 系统的程序库和工具。唯一依然没有完成的重要组件,就

是操作系统的内核。

1991 年,李纳斯·托瓦兹(Linus Torvalds)编写出了与 UNIX 兼容的 Linux 操作系统内

核并在 GPL 条款下发布。Linux 之后在网上广泛流传,许多程序员参与了开发与修改。

1992 年,Linux 与其他 GNU 软件结合,完全自由的操作系统正式诞生。该操作系统往

往被称为“GNU/Linux”或简称 Linux。(尽管如此,GNU 计划自己的内核 Hurd 依然在开发

中,目前已经发布 Beta 版本。)

许多 UNIX 系统上也安装了 GNU 软件,因为 GNU 软件的质量比之前 UNIX 的软件还要

好。GNU 工具还被广泛地移植到 Windows 和 Mac OS 上。

GNU 十几年以来已经成为一个对软件开发主要的影响力量,创造了无数重要的工具,如

强健的编译器、有力的文本编辑器,甚至一个全功能的操作系统。这个工程是从 1984 年麻省

理工学院的程序员 Richard Stallman 的想法得来的,他想要建立一个自由的、和 UNIX 类似的

操作环境。从那时开始,许多程序员聚集起来开始开发一个自由的、高质量的、易理解的软

件。

GNU 通用公共许可证,通常以 GNU GPL 称呼或直接简短为 GPL。GPL 给予了计算机程

序自由软件的定义,并且使用了所谓的“Copyleft”来确保程序的自由被完善地保留。GPL

目前主要有以下三个版本。

前世今生——Linux 系统简介 第

15

1

(1)GPLv1。GPL 版本 1,即 初的版本,发布于 1989 年 1 月,其目的是防止那些阻碍

自由软件的行为,而这些阻碍软件开源的行为主要有两种(一种是软件发布者只发布可执行

的二进制代码而不发布具有的源代码,一种是软件发布者在软件许可加入限制性条款)。因此

按照 GPLv1,如果发布了可执行的二进制代码,就必须同时发布可读的源代码,并且在发布

任何基于 GPL 许可的软件时,不能添加任何限制性的条款。

(2)GPLv2。理查德·斯托曼在 GPLv2 中所做的 大的改动就是增加了“自由还是死亡”

这章条款,即第七章 liberty-or-death Presentation。这章中声明道,如果哪个人在发布基于 GPL

的软件的时候,同时添加强制的条款,以在一定程度上保障和尊重其他一些人的自由和权益

(也就是说,在一些国家里,人们只能以二进制代码的形式发布软件,以保护开发软件者的版

权),那么他将根本无权发布该软件。到了 1990 年,人们普遍认为一个限制性弱的许可证对

于自由软件的发展是有战略意义上的好处的,因此当 GPL 的第 2 个版本(GPLv2)在 1991

年 6月发布时,与此同时第 2个许可证程序库GNU通用公共许可证(LGPL,the Library General

Public License)也被发布出来,并且一开始就将其版本定为第 2 版本以表示其和 GPLv2 的互

补性。这个版本一直延续到 1999 年,并分支出一个派生的 LGPL 版本号为 2.1,并将其重命

名为轻量级通用公共许可证,又称宽通用公共许可证(Lesser General Public License),以反

映其在整个 GNU 哲学中的位置。

(3)GPLv3。2005 年,GPL 版本 3 正是由斯托曼起草的,由伊本·莫格林和软件自由法

律中心(Software Freedom Law Center)提供法律咨询,2007 年 3 月 28 日正式启用。斯托曼

在 2006 年 2 月 25 日自由及开源软件开发者欧洲会议的演讲上说在 GPL 所有的改动中, 重

要的包括以下四点。

DRM 是 Digital Rights Management(数字版权管理)的缩写,DRM 指的是出版者用来

控制被保护对象的使用权的一些技术,这些技术保护的有数字化内容(如软件、音乐、电

影)及硬件,处理数字化产品的某个实例的使用限制。本术语容易和版权保护混淆。版权

保护指的是应用在消费电子产品上的数字化媒体内容上的技术,版权保护技术使用以后可

以控制和限制这些数字化媒体内容的使用权。

GPL 不会授予许可证接受人无限的权利,再发行权的授予需要许可证接受人开放软件的

源代码及所有修改,且复制件、修改版本,都必须以 GPL 为许可证。这些要求就是“copyleft”,

他的基础就是作品在法律上版权所有。由于版权所有,许可证接受人就无权进行修改和再发

行(除合理使用),除非有一个“copyleft”条款。如果某人想行使通常被法律所禁止的权利,

只需同意 GPL 的条款。相反地,如果某人发行软件违反了 GPL(如不开放源代码),他就有

可能被原作者起诉。“copyleft”利用版权法来达到与其相反的目的:“copyleft”给人不可剥

夺的权利,而不是版权法所规定的诸多限制。这也是 GPL 被称为“被黑的版权法”的原因。

许多 GPL 软件发行者都把源代码与可执行程序捆绑起来。另一方式就是以物理介质(如 CD)

解决软件专利问题。

与其他许可证的兼容性。

源代码分割和组成的定义。

解决数字版权管理问题。

提 示

Linux 从初学到精通

16

为载体提供源代码。在实践中,许多 GPL 软件都是在互联网上发行的,源代码也有许多可以

FTP 方式得到。“copyleft”只在程序再发行时发生效力。对软件的修改可以不公开或开放源

代码,只要不发行。“copyleft”只对软件有效力,而对软件的输出并无效力(除非输出的是

软件本身)。

GNU 宽通用公共许可证(GNU Lesser General Public License,LGPL)是一个自由软件

许可证,由自由软件基金会发布,被用于一些(但不是全部的)GNU 程序库。这个许可证以

前被称为 GNU 库(Library)通用公共许可证。此许可证 新版本为“版本 3”,2007 年 6 月

29 日发布,较早的版本有 2.0 版和 2.1 版。

GPL 和 LGPL 的主要差异为,后者允许 LGPL 的代码被连接入(作为一个库文件)一个

非 GPL 的程序,而不考虑是自由软件还是商业软件。

小企鹅大身手

由于 Linux 工具包拥有几乎所有的工具,能够轻松且廉价地搭建起 Internet 和 Intranet 应

用服务。因而在 Internet/Intranet 环境下,Linux 开始替代商业的 UNIX 和 Windows。Linux 环

境下的 Apache 服务软件在 Internet/Intranet 上提供了极高的性能和极低的费用。根据 Infobeads

的统计结果显示,超过 26%的 Internet 网上商业公司的服务是基于 Linux 平台的,并且这个

比例在不断地扩大。Apache 服务器软件是自由软件旗帜下的一个 典型的例子。Apache 管

理着全球半数以上的 Web 服务器,具有低成本、高性能、功能显著的特点。另外,Linux 在

硬件上的需求要小于其他的竞争者。当硬件系统升级后,Linux 系统很容易扩展其功能,系

统的性能也会相应地提高。一个单独的 Linux 系统就能够提供包括 WWW 浏览服务、文件下

载服务、代理服务、电子邮件服务、域名解析服务、TCP/IP 路由服务等内容。Linux 的各个

发行版本均提供了所需要的工具,能简单快速地安装 Internet 服务软件。

在高端服务器操作系统领域,随着开源软件在世界范围内影响力日益增强,Linux 服务

器操作系统在整个服务器操作系统市场格局中占据了越来越多的市场份额,并且形成了大规

模市场应用的局面。Linux 引起了全球 IT 产业的高度关注,并以强劲的势头成为服务器操作

系统领域中的中坚力量。

目前,国外服务器厂商使用的服务器操作系统主要包括 IBM 的 AIX、HP 的 HP-UX、Sun

的 solaris,其中 UNIX 系列的产品几乎占据了大部分服务器高端市场和部分服务器中低端市

场,Windows 系列占据了较大部分服务器中低端市场,Linux 由于其成本优势在中低端市场

也有良好的表现,并且市场份额上升幅度很大。目前国内的服务器操作系统情况基本类似于

国外,高端服务器操作系统市场基本为 UNIX 平台所占据,由于国内中低端服务器的市场保

有量较大,所以 Windows 系列产品的实际市场占有率相对较国外高,约占 40%,Linux 由于

低成本的特点,也取得了大约 35%的市场份额。

从 2001 年以来,基于 Linux 的服务器操作系统逐步发展壮大。国内几个主要的 Linux 厂

商和科研机构,国防科技大学、中标软件、中科红旗等先后推出了 Linux 服务器操作系统产

前世今生——Linux 系统简介 第

17

1

品,并且已经在政府、企业等领域得到了应用。从系统的整体水平来看,Linux 服务器操作

系统与高端 UNIX 系列相比差距越来越小,在很多领域已经实现了共存的局面。

Linux 服务器产品在服务器操作系统领域已经占有了相当的市场份额,并且保持着快速

的增长率,尤其在政府、金融、农业、交通、电信等国家关键领域。此外,考虑到 Linux 的

快速成长性及国家相关政策的扶持力度,为 Linux 服务器产品冲击更大的服务器市场提供了

宽广的舞台。

随着政府、金融、交通和电信等市场的发展,为开源的高端 Linux 服务器操作系统提供

了巨大的市场空间。可以预计,在未来的一段时间内,Linux 服务器操作系统不但将在中小

型服务器得以快速部署,在国产高性能计算领域,也必将凭借其开源、自主、适应力强的特

性成为主力。

不管学习操作系统还是其他应用软件,首先必须在自己的计

算机上安装。Linux 的各种发行版为了简化操作,都提供了一套

自己的安装方法。在本章中首先为大家讲解 Linux 的一些基本知

识及如何安装 Linux 操作系统。

第2章

开门见山︱︱Lin

ux

系统安装

开门见山——Linux 系统安装 第

19

2

使用 VMware Workstation 搭建测试环境

VMware Workstation 是 VMware 公 司 ( VMware 中 文 官 方 网 站 : http://

www.vmware.com/cn/)销售的商业软件产品之一,该软件包含一个用于英特尔 x86 兼容计算

机的虚拟化套件,允许多个 x86 虚拟机同时被创建和运行。每个虚拟机实例可以运行其自己

的客户机操作系统,比如(但不限于)Windows、Linux、BSD 等。简单地说,VMware Workstation

允许一台真实的计算机同时运行数个操作系统。

VMware Workstation 提供了这样一个机会:可以在一台机器上真正同时运行两个(或多

个)独立的操作系统,一个是原始的操作系统,一个运行于虚拟机上。基于上述原因,你现

在可以在运行 Windows 平台的计算机上通过 VMware Workstation 安装并运行 Linux,反之亦

然。事实上两个操作系统之间并没有太多的依赖关系,也可以在 Linux 上再装一个 Linux,

或者在 Windows XP 下装一个 Windows 7。使用 VMware Workstation 关键的好处在于,安装

新的操作系统时并不需要重新划分硬盘空间,不会破坏原有的系统结构,也可以同时运行多

个操作系统而不需要重新启动计算机。VMware Workstation 还提供了快照功能,通过该功能

可以对虚拟机备份,这一点对初学者来说是非常有用的。

在 VMware Workstation 安装完成后(本章中使用的是 VMware Workstation 7.0),在“开

始”→“所有程序”打开“VMware”后单击“VMware Workstation”按钮即可启动该软件。

由于 VMware Workstation 默认的一些快捷键与 Linux 系统的快捷键有冲突,推荐在 VMware

Workstation 的“Edit”→“Preferences”→“Hot Keys”中将 VMware Workstation 在虚拟机切

换到宿主机的快捷键修改为“Ctrl+Shift+Alt”或其他快捷键,如图 2-1 所示,修改后需要关

闭 VMware Workstation 并重新打开配置才会生效。

图 2-1 修改 VMware Workstation快捷键

Linux 从初学到精通

20

2.1.1 新建虚拟机

使用 VMware Workstation 搭建测试环境时,首先需要建立虚拟机,具体操作步骤如下。

(1)在 VMware Workstation 中选择“File”→“New”→“Virtual Machine…”,在弹出

的窗口中选择“Custom(advanced)”后,单击“Next”按钮,如图 2-2 所示。

图 2-2 建立虚拟机

(2)选择 VMware Workstation 建立虚拟机的版本。和其他大部分软件一样 VMware

Workstation 所建立的虚拟机只保证向下兼容,即 VMware Workstation 6.0 所建立的虚拟机使

用 VMware Workstation 7.0 可以运行,但反之则不一定。如果希望 VMware Workstation 7.0 建

立的虚拟机可以被 VMware Workstation 7.0 以下的版本打开,这里就需要选择建立较低版本

的虚拟机(本章中不考虑使用老版本的 VMware Workstation,所以直接单击“Next”按钮),

如图 2-3 所示。

图 2-3 选择虚拟机版本

开门见山——Linux 系统安装 第

21

2

(3)在选择虚拟机使用的光盘界面选择“I will install the operating system later.”后直接

单击“Next”按钮,此部分可在虚拟机建立完成后再放入光盘,如图 2-4 所示。

图 2-4 选择虚拟机使用光盘

(4)选择在虚拟机中使用操作系统,该部分可以根据自己的需要配置,本章中选择

“Linux”→“Red Hat Enterprise Linux 5”。选择完成后单击“Next”按钮,如图 2-5 所示。

图 2-5 虚拟机操作系统版本

Linux 从初学到精通

22

(5)输入虚拟机的标题及保存的路径。该界面中虚拟机的标题只是在 VMware Workstation

中显示的并不是虚拟机的主机名。虚拟机中所有的内容都是以文件的形式保存在宿主机的硬

盘中,在该界面中还需要输入虚拟机的文件保存在宿主机硬盘的位置,输入完成后单击“Next”

按钮,如图 2-6 所示。

图 2-6 虚拟机标题及保存路径

(6)选择虚拟机所使用的物理内存。对于 Linux 的初学者需要使用图形界面的情况下,

推荐分配 512MB 以上的内存,输入完成后单击“Next”按钮,如图 2-7 所示。

图 2-7 虚拟机使用物理内存

开门见山——Linux 系统安装 第

23

2

(7)选择网络类型,在本章中选择“Use host-only networking”,至于其他网络类型的功

能本章后续内容中会加以说明,选择完成后单击“Next”按钮,如图 2-8 所示。

图 2-8 选择网络类型

(8)选择虚拟机使用的 SCSI 接口类型,该界面可保持默认值直接单击“Next”按钮。

(9)选择“Create a new virtual disk”为虚拟机建立一个新的虚拟硬盘,如图 2-9 所示。

图 2-9 新建虚拟机硬盘

(10)选择虚拟硬盘是使用 IDE 还是 SCSI 接口,该界面可保持默认值直接单击“Next”

Linux 从初学到精通

24

按钮,如图 2-10 所示。

图 2-10 选择虚拟机硬盘接口

(11)输入虚拟硬盘的容量,在默认情况下该容量只是一个上限,虚拟硬盘占用宿主机物

理硬盘的实际大小是以虚拟机中保存数据的大小为准的,输入完成后单击“Next”按钮,如

图 2-11 所示。

图 2-11 虚拟硬盘大小

(12)选择虚拟硬盘在宿主机物理硬盘的保存目录及文件名,默认情况下虚拟硬盘保存在

开门见山——Linux 系统安装 第

25

2

虚拟机所在目录,输入完成后单击“Next”按钮,如图 2-12 所示。

图 2-12 虚拟硬盘文件所在目录

(13)完成上述配置后,单击“Finish”按钮完成虚拟机的新建,如图 2-13 所示。

图 2-13 完成新建虚拟机

(14)完成虚拟机的新建后,可以单击如图 2-14 所示的绿色按钮运行虚拟机。

Linux 从初学到精通

26

图 2-14 运行虚拟机

2.1.2 虚拟机基本操作

VMware Workstation 的功能非常强大,但对于初学者在使用 VMware Workstation 作为学

习工具时常用的操作一般会有以下几种。

启动、暂停、停止虚拟机 在“开始”→“所有程序”打开“VMware”单击“VMware Workstation”按钮启动 VMware

Workstation 后,可通过“File”→“Open…”打开虚拟机。通过如图 2-15 所示工具栏中启动、

暂停、停止按钮运行、暂停、停止及重新启动虚拟机。

图 2-15 启动、暂停、停止及重新启动虚拟机

开门见山——Linux 系统安装 第

27

2

如果在虚拟机运行过程中直接关闭 VMware Workstation,会弹出如图 2-16 所示的窗口,

其中“Suspend”表示暂停所有未关闭的虚拟机,“Power Off”表示关闭所有未关闭的虚拟机,

“Run in Background”表示将所有未关闭的虚拟机转到后台运行。

图 2-16 关闭 VMware Workstation

将光盘放入虚拟机光驱

在使用真实机时,可以使用 CD、DVD 或通过虚拟光驱软件挂载 ISO 文件的方式来使用

光盘,在 VMware Workstation 创建的虚拟机中使用光盘的方法有以下两种。

图 2-17 使用宿主机光驱

Linux 从初学到精通

28

(1)使用宿主机的光驱。在 VMware Workstation 创建的虚拟机中可以直接将宿主机光盘

的内容映射到虚拟机的光驱中,可以在虚拟机未运行时。单击“Edit virtual machine settings”

按钮后在弹出窗口中选择“CD/DVD”,在“Connection”中选择“Use physical drive:”,然后

选择需要使用的物理光驱,如图 2-17 所示,也可以在虚拟机运行过程中单击 VMware

Workstation 右下角光驱在弹出窗口中进行修改,如图 2-18 所示。

图 2-18 使用宿主机光驱

(2)使用 ISO 文件。使用 ISO 文件作为虚拟机光驱内容的配置界面和使用宿主机的光驱

相同,只需选择“Use ISO image file:”后,单击“Browse”按钮选择 ISO 文件即可。

调整虚拟机硬件配置 在使用VMware Workstation运行虚拟机时,可以根据需要增加或修改虚拟机的硬件配置,

大部分的硬件配置修改必须在虚拟机处于关机模式时,才可以进行。

如果需要修改虚拟机硬件配置,只需单击“Edit virtual machine settings”按钮(如图 2-19

所示)后,在弹出窗口中进行操作。

虚拟机截图及操作录像 VMware Workstation 提供了对虚拟机中的操作进行截图及录像的功能。如果需要截图,

在虚拟机运行后选择“VM”→“Capture Screen”;如果对虚拟机中的操作进行录像,在虚拟

机运行后选择“VM”→“Capture Movie”。

快照功能使用 很多读者在使用自己的计算机时,经常在安装完系统及各种应用软件后,习惯使用 Ghost

对系统进行备份,如果以后在使用过程中系统出了问题,可以直接使用 Ghost 快速地还原系

统。在 VMware Workstation 中,也可以通过快照功能对虚拟机进行类似的操作。快照功能可

开门见山——Linux 系统安装 第

29

2

以快速地备份/恢复虚拟机的内容,这一点对于初学者是非常有用的,在虚拟机中安装 RHEL

5.x 后先进行一个快照,这样以后可以快速地还原到刚安装好系统的状态。

图 2-19 调整虚拟机硬件配置

无论虚拟机在运行还是停止状态,选择“VM”→“Snapshot”→“Take Snapshot”,在

弹出窗口中为快照起一个名字并单击“OK”按钮,如图 2-20 所示,即可对当前虚拟机进行

一次快照,VMware Workstation 支持对一个虚拟机进行多次快照。

图 2-20 快照功能

快照完成后,无论虚拟机在运行还是停止状态,如果需要恢复虚拟机可以选择“VM”

Linux 从初学到精通

30

→“Snapshot Manager”,在弹出的窗口中会显示所有对当前虚拟机的快照,如图 2-21 所示,

双击快照名称即可恢复快照。

图 2-21 恢复快照

2.1.3 虚拟机网络模式

在使用 VMware Workstation 时,经常需要让虚拟机与宿主机或虚拟机与宿主机所在网络

其他计算机进行通信,这时就需要正确地配置虚拟机网卡的网络模式。在 VMware Workstation

安装完成后,会在宿主机增加如下的虚拟设备。

(1)VMnet0:用于虚拟桥接网络下的虚拟交换机。

(2)VMnet1:用于虚拟 Host-Only 网络下的虚拟交换机。

(3)VMnet8:用于虚拟 NAT 网络下的虚拟交换机。

(4)VMware Network Adapter VMnet1:宿主机用于与 Host-Only 虚拟网络进行通信的虚

拟网卡。

(5)VMware Network Adapter VMnet8:宿主机用于与 NAT 虚拟网络进行通信的虚拟

网卡。

修改虚拟机网络模式可以在虚拟机未运行时通过单击“Edit virtual machine settings”按钮

后,在弹出的窗口中选择对应网络接口进行修改,如图 2-22 所示。也可以在虚拟机运行过程

中单击 VMware Workstation 右下角对应网络接口在弹出窗口中进行修改,如图 2-23 所示。

开门见山——Linux 系统安装 第

31

2

图 2-22 配置虚拟机网卡网络模式(1)

图 2-23 配置虚拟机网卡网络模式(2)

VMware Workstation 中提供了以下三种网络模式。

1.桥接模式 宿主机的物理网卡和虚拟机的网卡在 VMnet0 交换机上通过虚拟网桥进行桥接,也就是

说,宿主机的物理网卡和虚拟机的虚拟网卡处于同等地位,此时的虚拟机就好像宿主机所在

的一个网段上的另外一台机器,如图 2-24 所示。

Linux 从初学到精通

32

虚拟机

宿主机网卡

虚拟机网卡

图 2-24 桥接模式

假设宿主机的物理网卡 IP 地址为 192.168.159.10、默认网关为 192.168.159.1;虚拟机的

虚拟网卡 IP 地址为 192.168.159.11、默认网关为 192.168.159.1,如果虚拟机的虚拟网卡配置

为桥接模式时,只要是可以和宿主机进行通信的网络设备就可以和虚拟机进行通信。

2.Host-Only 模式 Host-Only 网络被用来设计成一个与外界隔绝的网络,其实 Host-Only 网络和 NAT 网络

非常相似,唯一不同的地方就是在 Host-Only 网络中,没有用到 NAT 服务,没有服务器为

VMnet1 网络做路由,当然就没有办法访问 Internet,如果此时宿主机需要与虚拟机通信就要

用到 VMware Network Adapter VMnet1 这块虚拟网卡,如图 2-25 所示。

图 2-25 Host-Only模式

VMware Workstation 在安装时,会为 VMware Network Adapter VMnet1 虚拟网卡随机指

开门见山——Linux 系统安装 第

33

2

定一个 IP 地址,同时会安装一个 DHCP 服务(在 Windows 服务管理中可以找到该服务,名

称为“VMware DHCP Service”),为虚拟机分配 IP 地址。如果将虚拟机网卡模式设置为

Host-Only,且将虚拟机中 IP 地址配置自动获取或配置为与 VMware Network Adapter VMnet1

虚拟网卡同一网段的 IP 地址,那么虚拟机与宿主机之间可以通信。

3.NAT 模式 在 NAT 网络中,会使用到 VMnet8 虚拟交换机,宿主机上的 VMware Network Adapter

VMnet8 虚拟网卡被连接到 VMnet8 交换机上,与虚拟机进行通信,但是 VMware Network

Adapter VMnet8 虚拟网卡仅仅用于和 VMnet8 网段通信,并不为 VMnet8 网段提供路由功能,

处于虚拟 NAT 网络下的虚拟机是使用虚拟的 NAT 服务器来连接到 Internet 的,如图 2-26 所

示。VMware Workstation 功能非常强大,在 NAT 网络下,可以使用 Port Forwarding 功能,来

把宿主机的某一个 TCP 或 UDP 端口映射到虚拟机上。

图 2-26 NAT模式

VMware Workstation 在安装时,会为 VMware Network Adapter VMnet8 虚拟网卡随机指

定一个 IP 地址,同时会安装一个 DHCP 服务(在 Windows 服务管理中可以找到该服务,名

称为“VMware DHCP Service”),为虚拟机分配 IP 地址。如果将虚拟机网卡模式设置为 NAT,

且将虚拟机中 IP 地址配置自动获取,那么虚拟机会得到一个与 VMware Network Adapter

VMnet8 虚拟网卡同一网段的 IP 地址。这时虚拟机可以与宿主机进行通信,如果宿主机可以

访问 Internet,那么虚拟机也可以访问。

如果使用 VMware Workstation 主要是为了学习且不用访问 Internet,推荐将虚拟机网卡

配置为 Host-Only 模式,这样做实验时不会受其他网络中计算机的影响。如果需要在虚拟机

中访问宿主机可将虚拟机 IP地址与VMnet1虚拟网卡配置在同一网段;如果需要访问 Internet,

推荐配置为 NAT 模式并将 IP 地址配置为自动获取或与 VMnet8 虚拟网卡在同一网段。

Linux 从初学到精通

34

Linux 磁盘分区及目录

在学习 Linux 前首选需要明白,Linux 是一个与大家习惯使用的 Windows 完全不同的操

作系统,也许你已经习惯了开机后右手就放到鼠标上开始操作、习惯了开始菜单、习惯了

“Ctrl+C”和“Ctrl+V”,那么这些在 Linux 中都不是必需的,虽然在 Linux 中也可以使用图形

界面操作,但是这绝对不是必需的!你需要习惯所有一切的操作都通过键盘来完成,需要习

惯所有的配置都是通过修改配置文件完成的。

在开始学习 Linux 的安装前,首先从 基本的磁盘、文件系统、目录在 Linux 中的概念

开始。

2.2.1 Linux 磁盘分区

和其他操作系统一样,Linux 可以将磁盘划分为多个分区,每个分区可以被当做一个独

立的磁盘使用。在 Linux 中可以将磁盘划分为以下三种类型的分区。

1.主分区 主分区可以标记为活动,用于操作系统的引导。在一块磁盘上 多可以划分 4 个主分区。

主分区上可以用于存放操作系统所需文件,也可以用于存放用户数据。

2.扩展分区 为了解决一块磁盘只能划分 4 个分区而引入了扩展分区,只有在主分区小于 4 个时才可

以划分扩展分区,在一块磁盘上 多只能有一个扩展分区。扩展分区不能用于保存任何数据,

必须在扩展分区中进一步划分逻辑分区,用户数据只能保存在逻辑分区中。

3.逻辑分区 在扩展分区中可以建立多个逻辑分区。逻辑分区的分区信息作为一个链表存在,所以在

理论上讲可以建立的逻辑分区的数目不受限制。

在 Windows 中所有的主分区和逻辑分区都是采用英文字母标记,如 C 盘、D 盘等,而在

Linux 中计算机大多数的硬件设备都是以文件方式进行管理,这些硬件设备都被映射到“/dev”

目录下对应的文件中。磁盘分区也不例外,在“/dev”目录中会将每个磁盘分区映射为一个

文件,这些文件采用字母加数据的形式,其格式如下。

/dev/xxyN

其中“xx”表示分区名所在磁盘的设备类型,一般 hd 代表 IDE 接口的磁盘(包括 IDE

接口的光盘驱动器);sd 代表 SCSI 或 SATA 接口的磁盘(包括 SCSI 或 SATA 接口的光盘驱

动器以及 U 盘);fd 代表软盘驱动器。“y”表示分区所在硬盘是当前接口的第几个设备,比

如第一个 SCSI 硬盘就是“/dev/sda”、第二个 SCSI 硬盘就是“/dev/sdb”。“N”表示分区的序

号,前 4 个分区(主分区或扩展分区)使用 1~4 表示;逻辑分区从 5 开始,如图 2-27 所示。

开门见山——Linux 系统安装 第

35

2

图 2-27 磁盘分区

在分区完成后,用户并不能直接使用这些分区,需要格式化后再通过 mount 命令(有关

mount 命令见第 7 章 )挂载后才可以使用。比如使用 mount 命令将“/dev/sdb2”挂载到“/mnt/disk”

目录,那么所有保存到“/mnt/disk”目录的数据就会被保存到“/dev/sdb2”分区中。

2.2.2 Linux 文件系统及目录结构

文件系统是一种存储和组织计算机文件及数据的方法,文件系统使得对数据的访问和

查找变得容易。文件系统通常使用硬盘和光盘这样的存储设备,并维护文件在设备中的物

理位置。

在 Windows 中有 FAT、FAT32、NTFS 等文件系统,在 Linux 中推荐使用的是 ext3(第

三版 Extende File System,扩展文件系统)。目前 ext 文件系统 新的版本是 ext4,但是大多

数发行版中还只支持 ext3。

Linux 操作系统默认可以操作 FAT、FAT32 两种文件系统,由于一些原因默认情况下不

支持 NTFS 系统。目前对于 Linux 操作系统中还是推荐使用 ext3 文件系统。ext3 是一种日志

文件系统,在对该系统数据进行写操作前,将会把写操作的内容写入一个日志文件中,一旦

操作被意外中止,系统将能够在重新启动时根据日志记录完成该写操作。

在 Linux 的文件系统中,文件是存储信息的基本结构。文件、目录、硬件设备都以文件

的形式表现,文件名可以由字符、数据、圆点、下画线组成,长度不能超过 256 个字符。在

Windows 中通过圆点区分文件名及扩展名,扩展名对于 Windows 来说非常重要。在 Linux 中

通过圆点区分文件名及扩展名可以帮助用户区分文件类型,但并没有像 Windows 那样有实际

的约束力(不会影响文件在系统中的执行),用户可以根据自己的需要随意给文件加入自己的

扩展名。Linux 中的常见的文件可以分为以下 4 种类型。

(1)普通文件,比如文本文件、图片文件、视频文件、Shell 脚本文件。

(2)目录文件,在 Windows 中目录和文件是两种不同类型的数据,而在 Linux 中目录被

视为文件的一种。

(3)链接文件,类似于 Windows 中的快捷方式,在查看时文件名后面会通过箭头“→”

指向实际的文件,如图 2-28 所示。

Linux 从初学到精通

36

图 2-28 链接文件

(4)特殊文件,Linux 中的一些设备,如磁盘、打印机等,都是通过文件在文件系统中

表现出来,这类文件就是特殊文件。特殊文件通常存放在“/dev”目录中。

目前大部分的文件系统都是采用流行的树形目录结构来组织文件,这样的结构中会有一

个文件系统的根,然后在根下有若干的分杈(目录),在这些目录下还可以有目录或文件。

Linux 系统也是采用这样的树形目录结构(如图 2-29 所示),在有足够权限的情况下用户可以

进入任何目录,在目录下建立目录或文件,复制及移动目录或文件。下面是 Linux 中关于目

录的几个概念。

图 2-29 目录结构

(1)当前目录(工作目录),当用户登录到 Linux 系统后,无论做任何操作都会处于某个

目录之中,此类目录就被称为当前目录。用户可以使用“cd”命令随时切换当前目录,如果

不清楚当前目录可以通过“pwd”命令查看当前目录。

查看当前目录。

[root@srv ~]# pwd /root

进入/home 目录。

[root@srv ~]# cd /home

查看当前目录。

[root@srv ~]# pwd /home

(2)用户家目录(用户主目录),在 Windows 中每个用户有一个配置文件目录,如果系

统安装在 C 盘,在 Windows Vista 之前的系统中该目录在“C:\Documents and Settings”目录

开门见山——Linux 系统安装 第

37

2

下以用户名为名称的目录中;在 Windows Vista 之后的系统中该目录在“C:\Users” 目录下

以用户名为名称的目录中。在 Linux 中每个用户也有一个家目录,如果是管理员(root 用户)

其家目录是“/root”;如果是普通用户其家目录在“/home” 下以用户名为名称的目录中。每

次用户登录到 Linux 后,默认的当前目录就是该用户的家目录,如图 2-30 所示。

图 2-30 用户家目录

(3)路径,从一个目录到另一个目录或文件的道路被称为路径。在 Linux 中路径一般主

要由目录名称组成,目录名称之间使用斜杠“/”分隔。在路径中还有四种特殊的目录名称分

别是:“.”表示当前目录;“..”表示当前目录的父级目录;“~”表示当前用户的家目录;“-”

表示上一个工作目录。

进入/home/charles 目录。

[root@srv ~]# cd /home/charles

进入当前目录的上一级目录。

[root@srv ~]# cd ..

查看当前目录。

[root@srv ~]# pwd /home

进入当前用户的家目录。

[root@srv ~]# cd ~

查看当前目录。

[root@srv ~]# pwd /home/charles

返回上一个工作目录。

[root@srv ~]# cd -

查看当前目录。

[root@srv ~]# pwd /home

进入某一个目录或打开某个文件时,可以通过“绝对路径”及“相关对路径”两种方式。

绝对路径指的是目标目录或文件从根开始的路径,必须以“/”开头;相对路径指的是目标目

录或文件相对于当前目录路径。在如图 2-29 所示的目录结构中,假设当前用户是 charles;当

Linux 从初学到精通

38

前目录是“/etc/rc”,现在想进入“/home/charles/mail”目录可以通过以下几种方式。

使用绝对路径。

[root@srv ~]# cd /home/charles/mail

使用相对路径。

[root@srv ~]# cd ../../home/charles/mail

使用特殊路径。

[root@srv ~]# cd ~/mail

在实际应用中使用“绝对路径”还是“相对路径”并没有一个统一的规定,可以根据自

己的习惯或者选择一种方便的方式。

打造 RHEL 5.x 平台

学习任何操作系统,第一次都需要安装该操作系统,RHEL 5.x 的安装过程与大家已经很

熟悉的 Windows 安装过程不太一样,但总体来讲并不太复杂。RedHat 在安装系统时使用的

是该公司开发的 Anaconda。Anaconda 使用 Python 及 C 语言编写,可以用来自动安装配置,

使用户能够以 小的监督运行。Anaconda 安装管理程序应用在 RHEL/CentOS、Fedora 和其

他一些项目。

2.3.1 RHEL 5.x 安装方式

Linux 先天就可以满足大型应用的各种需求,安装 Linux 同样也有很多种方式,在实际

应用中可以根据实际情况选择不同的安装方式。

1.光盘安装 如果计算机上有 CD-ROM(或 DVD-ROM)驱动器,同时也有 RHEL 5.x 的光盘,可以

采用光盘安装的方式。从光盘安装是比较传统也是 直接的方式,不需要其他设备的支持。

在整个安装过程中所需的所有文件都从光盘中获取。

2.NFS 安装 如果计算机上没有 CD-ROM(或 DVD-ROM)驱动器,那么访问网络时,可以采用 NFS

(Network File System)安装 RHEL 5.x。当采用从 NFS 安装的方式时,必须将 RHEL 5.x 光盘

(或 ISO 映像文件)挂载到另一台含有 Rock Ridge 扩展的计算机上。安装时通过启动盘(或

PXE 启动)启动安装过程,输入 NFS 服务器的 IP 地址和 RHEL 5.x 光盘(或 ISO 映像文件)

挂载路径,选择需要的软件包安装到硬盘。

3.FTP 安装 通过 FTP 安装时,首先使用启动盘(或 PXE 启动)启动安装过程,再通过网络访问提

供了 RHEL 5.x 安装文件的 FTP 站点,然后下载安装文件并安装到本地硬盘。

开门见山——Linux 系统安装 第

39

2

4.HTTP 安装 通过 HTTP 安装时,首先使用启动盘(或 PXE 启动)启动安装过程,再通过网络访问提

供了 RHEL 5.x 安装文件的 Web 站点,然后下载安装文件并安装到本地硬盘。

5.硬盘安装 硬盘安装方式是将 RHEL 5.x 光盘(或 ISO 映像文件)复制到计算机的一个硬盘上,然

后通过启动盘启动安装进程,并把安装程序指向映像文件目录,开始从硬盘中执行安装过程。

2.3.2 RHEL 5.x 安装与登录

使用光盘安装对于初学者来说是 简单的方法,一般在开始学习时首先应该学会使用光

盘安装 RHEL 5.x 的方法。

(1)将 RHEL 5.x 光盘放入光驱后,启动计算机,在如图 2-31 所示的界面中按回车键,

开始进入安装过程。

图 2-31 开始安装

(2)在 RHEL 5.x 载入必需的文件后,会提示是否检查安装源(光盘)是否有错误,如

确定光盘没有任何问题,可直接选择“Skip”,如图 2-32 所示。

图 2-32 安装源检查

(3)进入图形界面后显示的是欢迎信息,这里可以直接单击“Next”按钮(如图 2-33 所

示)。在接下来每个安装的界面中都有一个“Release Notes”按钮,通过单击这个按钮可以查

Linux 从初学到精通

40

看与发行版相关的发行说明。

图 2-33 进入图形界面

(4)选择显示语言,这里推荐选择“English(English)”。如果对英语不太熟悉或是初学

者也可以选择“Chinese(Simplified)(简体中文)”。选择完成后,单击“Next”按钮,如图

2-34 所示。

图 2-34 选择语言

(5)键盘布局直接选择默认的“U.S.English”后,需要在弹出窗口中输入序列号。序列

号是一个 16 位的字符串,在安装过程中用于决定用户所订阅的 RHEL 5.x 所支持的软件包。

从 RHEL 5.x 开始 RHEL 安装程序会根据序列号决定用户可以安装哪些软件包,这样 RedHat

不需要为不同选项的发行版制作多个单独的安装包。这里可以选择“Skip entering Installation

Number”跳过只安装基本的软件包,如图 2-35 所示。

开门见山——Linux 系统安装 第

41

2

图 2-35 选择键盘布局

其他的软件包也可以在安装的后续步骤中或安装完成后手工配置安装。

(6)因为是第一次安装操作系统,硬盘没有进行过程初始化,在提示初始化时直接选择

“YES”即可。

(7)在选择硬盘分区方式窗口中,RHEL 5.x 提供了以下四种选择(如图 2-36 所示)。

Remove all partitions on selected drives and create default layout.:在选择的硬盘上删除

所有分区,并以默认方式建立 RHEL 5.x 所需分区。

Remove linux partitions on selected drives and create default layout.:在选择的硬盘上删

除 Linux 分区,并以默认方式建立 RHEL 5.x 所需分区。

Use free space on selected drives and create default layout.:使用选择硬盘上剩余空间

建立 RHEL 5.x 所需分区。

Create custom layout.:自定义分区。

分区应该是整个安装过程中 复杂的部分。对于初学者,在这里可以选择“Remove all

partitions on selected drives and create default layout.”,但是还是推荐选择“Create custom

layout.”根据需要定义各个分区。本章中选择“Create custom layout.”,选择完成后,单击“Next”

按钮。

(8)单击“New”按钮,在弹出的窗口中手动创建分区。在弹出的窗口中的“Mount Point”

选择“/”分区,“File System Type”选择“ext3”,“Size”处输入分区大小。使用相同的方法

依次建立“/home”、“/usr”、“/usr/local”、“/var”。使用相同的方法建立“/boot”,分区大小定

义为 150~200MB,如图 2-37 所示。

提 示

Linux 从初学到精通

42

图 2-36 选择硬盘分区方式

图 2-37 建立分区

在创建分区时需要选择 3 个重要的信息:“Mount Point”挂载点,在 Linux 系统中分区

必须指定一个目录作为挂载点后,分区才可以使用;“File System Type”文件系统,安装程

序可以使用 ext2、ext3、vfat 文件系统用于保存文件,通过 ext3 是 Linux 文件系统的默认

格式,除了以上 3 种以外还包括 swap(交换分区)、RAID、LVM(逻辑卷管理)3 种特殊

的文件系统;“Size”分区大小,可以指定为“Fixed size”(固定大小)、“Fill all space up”

(有限分区,分区在建立时只有“Size”的容量,当用完时可以增大,但最大只有该值)、“fillto

maximum allowable size”(非限定分区,分区在建立时只有“Size”的容量,当用完时可以

增大,直到用完硬盘剩余空间为止)。

提 示

开门见山——Linux 系统安装 第

43

2

(9)单击“New”按钮,在弹出窗口的“File System Type”选择“swap”,分区大小定义

为物理内存的 1.5~2 倍,选择完成后,单击“Next”按钮。

(10)选择 GRUB 存放分区及启动菜单显示窗口直接单击“Next”按钮。

(11)如果使用 DHCP 获取 IP 地址可直接单击“Next”按钮。如果需要手动配置 IP 地址,

则单击“Edit”按钮在弹出窗口中选择“Enable IPv4 support”下面的“Manual configuration”

后,输入 IP 地址及子网掩码,如果不需要使用 IPv6 则取消“Enable IPv6 support”完成后单

击“OK”按钮,可选择输入默认网关“Gateway”、首选 DNS 服务器 IP 地址“Primary DNS”、

其他 DNS 服务器 IP 地址“Secondary DNS”。如果希望定义计算机名称可选择“Hostname”

下面的“manually”后输入计算机名称。选择完成后,单击“Next”按钮,如图 2-38 所示。

图 2-38 配置 IP地址

(12)时区选择“Asia/ShangShi”后,单击“Next”按钮,如图 2-39 所示。

图 2-39 时区选择

Linux 从初学到精通

44

(13)设置 root 用户密码,由于 root 用户对系统的重要性,在设置密码时一定要保证密

码的强度。输入完成后,单击“Next”按钮,如图 2-40 所示。

图 2-40 设置 root密码

(14)在选择安装软件窗口勾选立即定制软件包“Customize now”后,单击“Next”按

钮,如图 2-41 所示。

图 2-41 定制软件包

(15)在选择软件包时,可以不选中服务器不必要的软件包(如“Sound and Video”),但

推荐将“Base Sysetem”→“System Tools”勾选,选择完成后单击“Next”按钮,如图 2-42

所示。

开门见山——Linux 系统安装 第

45

2

图 2-42 软件包选择

(16)等待安装结束后,单击“Reboot”按钮重新启动计算机,如图 2-43 所示。

图 2-43 重新启动

(17)启动完成后,需要对 RHEL 5.x 进行初始设置。在同意许可协议后,防火墙设置选

择“Disable”。防火墙是整合在 Linux 内核中的,这里关闭只是将默认规则改为允许所有通信,

选择完成后,单击“Forward”按钮,如图 2-44 所示。

Linux 从初学到精通

46

图 2-44 关闭防火墙

(18)在 SELinux 状态窗口选择“Disabled”模式,选择完成后,单击“Forward”按钮,

如图 2-45 所示。

SELinux(SELinux 官方网站:http://www.nsa.gov/selinux/)是 Security-Enhanced Linux

(安全增强式 Linux)的缩写,是一种强制存取控制的实现。SELinux 主要由美国国家安全

局开发,并于 2000 年 12 月 22 日发行给开放源代码的开发社区。按照美国国家安全局

SELinux 小组的定义“SELinux 是一组给 Linux 内核的修补程序,并提供一些更强、更安全

的强制存取控制架构来与内核的主要子系统共同运作。基于机密及完整性原则,它提供一

个架构来强制信息的分离,以对付入侵的威胁或任何企图略过安全架构的应用程序。借此

限制恶意或设计不良的程序可能造成的破坏。它包含一组安全性原则状态设定文件的范本,

以符合一般的安全性目标”。在 2.6 版的 Linux 内核中已整合 SELinux,因此独立的修补程

序也已经不需要了。SELinux 无疑使原本就以安全见长的 Linux 系统的安全性有了质的飞

越,但对于初学者还是推荐配置 SELinux 处于“关闭”(Disable)状态,这主要是希望学

习时不会受到 SELinux 的干扰。如果想了解 SELinux 在“开启阻挡”(Enforcing)状态下

的运行情况,又不想因为 SELinux 影响正常的学习实验可以将其状态配置为“提示”

(Permissive),这样当 SELinux 碰到不允许的操作进行时会提示用户但不会正真阻止用户的

操作。

提 示

开门见山——Linux 系统安装 第

47

2

图 2-45 开启 SELinux

(19)在 Kdump 窗口可直接单击“Forward”按钮,如图 2-46 所示。

图 2-46 Kdump

Kdump 是一种内核崩溃转储机制。崩溃转储数据可以从一个新启动的内核的上下文中

获取,而不是从已经崩溃的内核的上下文获取。当系统崩溃时,Kdump 使用 kexec 启动到

第二个内核。第二个内核通常叫做捕获内核(capture kernel),以很小内存启动,并且捕获

转储镜像。

提 示

Linux 从初学到精通

48

(20)在日期及时间选择窗口可以手动调整日期及时间,如果可以访问 Internet 或网络中

有 NTP 服务器可以选择“Network Time Protocol”后,输入 NTP 服务的 IP 地址或 FQDN,

选择完成后,单击“Forward”按钮,如图 2-47 所示。

图 2-47 选择 NTP服务器

NTP 是 Network Time Protocol(网络时间协议)的缩写,是一个用于同步计算机时钟

的网络协议,它可以使计算机与其他服务器或时钟源(如石英钟、GPS 等)进行时间同步,

进行高精度的时间校正(理论上局域网内与标准时间差小于 1 毫秒,广域网上与标准时间

差小于几十毫秒),而且 NTP 支持使用加密确认的方式防止恶意的协议攻击。

(21)选择不注册 RHN(如图 2-48 所示)后暂时先不建立其他用户,其他步骤直接使用

默认选择即可。

图 2-48 RHN注册

提 示

开门见山——Linux 系统安装 第

49

2

RHN 是 Red Hat Network(红帽网络)的缩写,RHN 是一个基于互联网的管理一个 Red

Hat 企业 Linux 网络的解决方案。所有的安全警告(Security Alert)、错误修正警告(Bug Fix

Alert)及功能增强警告(Enhancement Alert)都可以直接从 RHN 上下载获得。所有购买

RHN 的用户都可以获得基于 Web 的 RHN 支持服务。

(22)在完成安装后,在用户名处输入“root”按回车键并输入安装中为 root 用户配置的

密码即可登录到系统,如图 2-49 所示。

图 2-49 系统登录

2.3.3 命令输入

登录后怎么是图形界面?在哪里输入命令?在安装 RHEL 5.x 时默认安装了 GNOME 桌

面环境,如果需要输入命令可在桌面单击鼠标右键后选择“打开终端”(“Open Terminal”),

如图 2-50 所示。

图 2-50 打开终端

提 示

Linux 从初学到精通

50

在 KDE 桌面环境中输入命令的终端窗口是在桌面单击鼠标右键后选择 console。

除了可以在图形界面中使用“打开终端”输入命令以外,RHEL 5.x 还为用户提供了 6 个

可以使用的“虚拟控制台”,使用“Ctrl+Alt+F1”到“Ctrl+Alt+F6”的 6 个组合键访问这 6

个虚拟控制台,每个控制台对应这 6 组功能键中的一个(如果是在 VMware Workstation 中使

用 RHEL 5.x,推荐使用 2.1 中的方法修改 VMware Workstation 默认的快捷键,以免与 RHEL

5.x 的快捷键发生冲突)。在虚拟控制台中可以通过“Ctrl+Alt+F7”组合键返回图形界面。

在使用虚拟控制台开始会话时,屏幕如图 2-51 所示,登录时需要输入用户名按回车键后

输入密码,成功登录后会出现欢迎用户的 Shell 提示,如图 2-52 所示。

图 2-51 虚拟控制台

图 2-52 登录虚拟控制台

用户可以从任何终端上输入“who”命令,然后按回车键来判断有哪些用户在系统上及

及登录方式,如图 2-53 所示。

图 2-53 输入“who”命令

现在我们了解了在哪里可以输入命令,先来试试几个 基本的命令。

关闭系统。

[root@srv ~]# poweroff

重新启动计算机。

[root@srv ~]# reboot

清除屏幕所有内容。

[root@srv ~]# clear

提 示

开门见山——Linux 系统安装 第

51

2

2.3.4 VMware Tools 安装

如果是在 Vmare Workstation 中安装使用 RHEL 5.x,推荐安装“VMware Tools”,该工具

可以让鼠标在宿主机与虚拟机之间方便地切换、可以让虚拟机中的时间保持与宿主机同步、

可以让宿主机与虚拟机之间共享剪切板的内容。具体安装步骤如下。

(1)选择 Vmare Workstation 菜单“VM”→“Install VMware Tools…”。

(2)在桌面单击鼠标右键后选择“打开终端”并输入如下命令。

挂载光盘驱动器。

[root@srv ~]# mount /dev/cdrom /mnt

进入 root 用户家目录。

[root@srv ~]# cd

解压 VMware Tools。

[root@srv ~]# tar -xvzf /mnt/VMwareTools-8.1.3-203739.tar.gz

进入解压后的目录。

[root@srv ~]# cd vmware-tools-distrib/

运行 VMware Tools 安装脚本,在运行过程中对所有提示选择的内容直接按回车键,

只有 后一个提示可根据需要选择分辨率。

[root@srv ~]# ./vmware-install.pl

对于初学者,使用 Vmare Workstation 进行学习时,推荐登录到系统后,使用 Vmare

Workstation 提供的快照功能对系统进行备份,这样以后在学习过程中可以随时还原到系统

初始状态。

Windows 7/Fedora 12 和平共处

Windows 7 是微软 新的客户端操作系统,应该说 Windows 7 是微软继 Windows XP 之

后推出的 成功的客户端操作系统。Fedora 12 也是 Fedora 目前 新的版本,如果想在自己

的计算机而不是虚拟机中使用 Linux,又因为工作等一些原因暂时还不能抛开 Windows,那

安装一个双系统的计算机应该是个不错的选择,另外经常使用 Fedora 也是提高自己 Linux 水

平一个很好的途径。下面将在一台安装了 Windows 7 操作系统的计算机(该计算机硬盘分区

情况如图 2-54 所示)上通过 Fedora 12 的 ISO 文件安装一个 Windows 7 和 Fedora 12 并存的

双系统,具体操作步骤如下。

提 示

Linux 从初学到精通

52

图 2-54 硬盘分区

(1)下载 Fedora 12(HTTP 下载地址:http://mirrors.163.com/fedora/releases/12/Fedora/i386/

iso/Fedora-12-i386-DVD.iso,不支持断点续传;BT 种子下载地址:http://torrent.fedorapr

oject.org/torrents//Fedora-12-i386-DVD.torrent)的 ISO 文件。

(2) 将 Fedora-12-i386-DVD.iso 得到硬盘中的一个目录(该目录所在分区必须是一个

NTFS 分区),本章中复制到 “D:\”并将 Fedora-12-i386-DVD.iso 文件中 isolinux、images 两

个目录解压到与 Fedora-12-i386-DVD.iso 同一个目录。

(3)下载 GRUB4DOS(下载地址:http://nchc.dl.sourceforge.net/project/grub4dos/GRUB4DOS/

grub4dos%200.4.4/grub4dos-0.4.4.zip)后,将 grldr、grldr.mbr 两个文件解压到“C:\”。

(4)在“C:\”下建立一个名为“menu.lst”的文件,并在文件中加入如下内容。

default 0 timeout 3 splashimage=(hd0,6)/grub/splash.xpm.gz hiddenmenu title Windows 7 find --set-root --ignore-floppies /bootmgr chainloader /bootmgr title Install Linux kernel (hd0,2)/isolinux/vmlinuz #本章中 Fedora映像文件在 D盘所以这里是(hd0,2)。 initrd (hd0,2)/isolinux/initrd.img

(hd0,2)表示第一块硬盘的第三个分区,由于在 Windows 7 的系统中会有一个保留分

区,所以 D 盘成了第三个分区,在使用时推荐通过 Windows 7 的磁盘管理工具查看 Fedora

映像文件解压后是存放在第几个分区。

(5)将 GRUB 增加到 Windows 7 的引导菜单中。

提 示

开门见山——Linux 系统安装 第

53

2#执行完成该命令后,会返回一个 GUID,如图 2-55所示。 bcdedit /create /d "Grub4Dos" /application bootsector #执行以下三个命令时,需将{GUID}替换为上一个命令所显示的 GUID,如图 2-56所示。 bcdedit /set {GUID} device partition=C: bcdedit /set {GUID} path \grldr.mbr bcdedit /displayorder {GUID} /addlast

图 2-55 bcdedit生成 GUID

图 2-56 bcdedit

(6)重新启动计算机后,在启动菜单中选择“Grub4Dos”,如图 2-57 所示。

(7)在“Grub4Dos”菜单中选择“Install Linux”进入 Fedora 12 的安装程序,如图 2-58

所示。

图 2-57 选择 Grub4Dos菜单

图 2-58 Install Linux

Linux 从初学到精通

54

(8)选择系统语言为“Chinese(Simplified)”后按回车键,如图 2-59 所示。

(9)选择键盘类型为“us”后按回车键,如图 2-60 所示。

图 2-59 语言选择

图 2-60 键盘类型

(10)选择 Fedora 安装来源为“Hard drive”后按回车键,如图 2-61 所示。

(11)由于前面将 Fedora 映像文件解压到“D:\”,所以在选择 Fedora 安装文件所分区时

应为“/dev/sda3”并按回车键,如图 2-62 所示。

图 2-61 安装来源

图 2-62 安装文件目录

(12)完成安装目录选择后就进入了图形界面,开始 Fedora 的安装,在摘要页直接单击

“Next”按钮。

(13)选择显示语言,这里可以选择“Chinese(Simplified)(中文(简体))”。选择完成

后,单击“Next”按钮,如图 2-63 所示。

(14)键盘布局直接选择默认的“美国英语式”。选择完成后,单击“下一步”按钮,如

图 2-64 所示。

(15)根据需要输入主机名后单击“下一步”按钮,如图 2-65 所示。

开门见山——Linux 系统安装 第

55

2

图 2-63 选择语言

图 2-64 选择键盘布局

图 2-65 输入主机名

Linux 从初学到精通

56

(16)由于在前面选择了系统语言为简体中文,所以时区选择时 Fedora 会自动选择“亚

洲/上海”,直接单击“下一步”按钮,如图 2-66 所示。

图 2-66 时区选择

(17)配置 root 用户的密码后单击“下一步”按钮,如图 2-67 所示。

图 2-67 配置根用户密码

(18)选择“建立自定义的分区结构”后单击“下一步”按钮,如图 2-68 所示。

开门见山——Linux 系统安装 第

57

2

图 2-68 自定义分区

(19)单击“New”按钮,在弹出窗口的“Mount Point”选择“/”分区,“File System Type”

选择“ext4”,Size 处输入分区大小。使用相同的方法依次建立“/home”、“/usr”、“/usr/local”、

“/var”。使用相同的方法建立“/boot”,分区大小定义为 150~200MB。完成后单击“New”

按钮,在弹出窗口的“File System Type”选择“swap”,分区大小定义为物理内存的 1.5~2

倍,选择完成后,单击“下一步”按钮。

(20)在配置“引导操作系统列表”后直接单击“下一步”按钮。

(21)在选择安装软件窗口选择“现在定制”后,单击“下一步”按钮,如图 2-69 所示。

图 2-69 自定义安装

Linux 从初学到精通

58

(22)在自定义安装软件包窗口,可以根据需要选择要安装的软件包。为了以后使用方便

推荐勾选“开发”→“开发工具”,完成后,单击“下一步”按钮,如图 2-70 所示。

图 2-70 选择软件包

(23)完成软件包选择后 Fedora 安装程序将开始安装,等待安装完成后单击“重新引导”

按钮,如图 2-71 所示。

图 2-71 完成安装

(24)重新启动后 Fedora 的 GRUB 将成为引导程序,如果不做任何选择将直接进入 Fedora

12,按任意键后进行启动选择界面(如图 2-72 所示),其中“Other”表示进入 Windows 7。

开门见山——Linux 系统安装 第

59

2

此处还是需要进入 Fedora 完成后续安装。

图 2-72 选择启动操作系统

(25)在“欢迎”和“许可信息”窗口直接单击“前进”按钮后进入“创建用户”窗口,

Fedora 与 RHEL 5.x 不同,在默认情况下 Fedora 不允许使用 root 用户登录,所以在这里至少

需要建立一个用户,如图 2-73 所示。

图 2-73 建立用户

(26)在“日期和时间”窗口直接单击“前进”按钮后,在“硬件信息”窗口单击“完成”

按钮。

Linux 从初学到精通

60

(27)等待 Fedora 配置完成后,即可登录系统开始使用 Fedora 12,如图 2-74 所示。

图 2-74 登录系统

实验任务

通过 VMware Workstation 建立一台虚拟机后,使用 RHEL 5.x 的 ISO 文件为虚拟机安装

RHEL 5.x 并满足以下要求。

(1)硬盘分区。

/:10G

/home:50G

/swap:RAM*2

/boot:200M

(2)网络配置。

IP 地址:192.168.159.200

网关:192.168.159.1

DNS 服务器:192.168.159.15

主机名:lab.example.zqin

(3)安全配置。

关闭防火墙

禁止 SELinux

在很长的一段时间里,Linux 都被认为其 好的应用应该是

在服务器而不是客户端上,客户端应该使用Windows或Mac OS。

不过这些年来在开源社区的不断努力,以及很多企业也认识到

开源的力量等一些因素的推动下,Linux 在客户端的应用也逐渐

丰富起来。Linux 已经不再像从前的 UNIX 那样只是少数专业人

士的选择。在本章中将讲述 Linux 的一些基础操作及桌面环境的

使用。

第3章

雾里看花︱︱Lin

ux

基本应用

Linux 从初学到精通

62

玩转桌面

对于一个操作系统来说,图形界面只是一项普通的功能,甚至不是一项必要的功能。在

早期的 UNIX 系统 初形态是简单的终端服务器,由串行电缆连接。在一个企业级的操作系

统中,图形界面虽然可以在一定程度上提高可用性,但也增加了许多不必要的麻烦。实际上

微软也意识到了这一点,在其 新的服务器端操作系统 Windows Server 2008 就有一个名为

Server Core 特殊的无图形界面的版本。不过对于初学者或一些特定的应用中(如图形、多媒

体)来说,图形界面又是必不可少的。本章中将介绍在 Linux 中常用的桌面环境,以及在这

些桌面环境中一些基于图形界面的应用。

3.1.1 桌面环境

在 Linux 系统中并不像 Windows 那样只有一种图形界面,Linux 可用的图形界面非常多,

如 GNOME、KDE、Fluxbox、Xfce、FVWM、Icewm、sawflish、WindowMaker 等,不过在

众多的图形界面中 GNOME 和 KDE 是使用率较高的两种。

1.GNOME 桌面环境 GNOME 是 The GNU Network Object Model Environment(GNU 网络对象模型环境)的

缩写,1997 年 8 月由 Miguel de Icaza 和 Federico Mena 发起,目的是成为 KDE 的替代品。

GNOME 是 GNU 计划的一部分(GNOME 官方网站:http://www.gnome.org/),开放源码运动

的一个重要组成部分,也是 GNU 计划的正式桌面。目标是基于自由软件,为类 UNIX 构造

一个功能完善、操作简单及界面友好的桌面环境。

和大多数自由软件类似,GNOME 组织也很松散,其关于开发的讨论散布于众多向任何人开

放的邮件列表。为了处理管理工作、施加影响及同对开发 GNOME 软件有兴趣的公司联系,2000

年 8 月成立了 GNOME 基金会。基金会并不直接参与技术决策,而是协调发布和决定哪些对象

应该成为 GNOME 的组成部分。基金会网站将其成员资格定义为:“按照 GNOME 基金会章程,

任何对 GNOME 有贡献者都可能是合格的成员。尽管很难精确定义,贡献者一般必须对 GNOME

计划有不小帮助。其贡献形式包括代码、文档、翻译、计划范围的资源维护或者其他对 GNOME

计划有意义的重要活动。” 基金会成员每年 11 月选举董事会,其候选人必须也是贡献者。GNOME

桌面由许多不同的项目构成,每个项目都有自己的版本号和发布规划。但是单个模块的维护者协

调彼此的工作,以便大约每 6 个月建立一个完整的 GNOME 发布版本。

2.KDE 桌面环境

KDE 是 K Desktop Environment 的缩写,是一种著名的运行于类 UNIX 上面的自由图形

工作环境(KDE 也发行 Windows 版和 Mac OS X 版)。其源于 1996 年由德国人 Mathias Ettrich

开始的一个计划,他当年就读于蒂宾根大学时,由于对 UNIX 桌面的不满,决心开发一个易

于使用及更人性化的桌面系统。KDE(KDE 官方网站:http://www.kde.org/)桌面系统使用了

雾里看花——Linux 基本应用 第

63

3

Qt 程式库,很快地他和其他志愿开发人员于 1997 年初发布了第一个较大型及有规模的 KDE

版本。

虽然 KDE 是免费的开放源软件,但使用了非自由的 Qt 程序库,有很多人担心日后会出

现版权上的问题。但 1998 年 11 月 Qt 程序库所属的公司(Trolltech)发布了第一个以开放源

许可(QPL)的 Qt 程序库授权,可是还有很多人争议 QPL 无法满足 GPL 执照上的条款。因

此 Red Hat 一直无法将 KDE 成为默认桌面,而 Mandrake Linux 则趁此机会以 KDE 席卷欧洲

市场。直到 2000 年 9 月,一个以 GPL 发布的 UNIX 版本的 Qt 程序库发布后,大部分用户才

对 KDE 产生信心。

KDE 版本可以打破二进制文件和源代码兼容性,或者换句话说,所有当前版(X.1、X.2、...)

下,将保证源代码和二进制兼容性(API & ABI)。如某软件使用 KDE 3.0 开发将可以工作在

所有(未来)发布的 KDE 3 上,相对于应用程序开发使用 KDE 2,不保证能够利用 KDE 3

的库。KDE 的主要版本号按照 Qt 的发布周期,这意味着 KDE 4 是基于 Qt 4 的,而 KDE 3

是基于 Qt 3 的。

3.桌面环境切换 RHEL 5.x 在安装时默认使用的是 GNOME 桌面环境(如图 3-1 所示),在安装时也可以

同时选择 GNOME 和 KDE 环境,但是只要安装了 GNOME 桌面环境,RHEL 5.x 在登录时就

默认使用 GNOME,如果希望使用 KDE 桌面环境可以在登录前单击“Session”按钮,在弹

出窗口中选择“KDE”后单击“Change Session”按钮(如图 3-2 所示),然后输入用户名及

密码登录,在登录时会出现如图 3-3 所示的窗口,可以根据需要选择只在这次登录时改变桌

面环境(Just For This Session),还是将改变的环境作为默认桌面(Make Default)。

图 3-1 RHEL 5.x默认桌面环境

4.语言切换 如果在安装 RHEL 5.x 时选择了多种语言,在登录前还可以单击“Language”按钮选择

登录后的语言(如图 3-4 所示),然后输入用户名及密码登录,在登录时会出现如图 3-5 所示

的窗口,可以根据需要选择只在这次登录时改变显示语言(Just For This Session),还是将改

Linux 从初学到精通

64

变的语言作为默认显示语言(Make Default)。

图 3-2 改变桌面环境

图 3-3 改变桌面环境方式

图 3-4 改变语言

雾里看花——Linux 基本应用 第

65

3

图 3-5 改变显示语言

无论是 GNOME 还是 KDE 都具备了作为一个桌面环境应该包括的所有功能,只要在

Windows 图形界面上可以实现的,在这两个桌面环境都可以实现,而且 GNOME 和 KDE 还

包括了很多 Windows 图形界面没有的功能,如多个虚拟桌面等。这两种桌面环境使用起来并

没有太大的难度,只是一些操作习惯与大家习惯的 Windows 有一些不太一样的地方,这可能

需要有一个适应的过程。

3.1.2 浏览器

我们现在都生活在一个网络时代,无论哪种操作系统都提供了多种浏览器可以选择。各

个组织、公司在浏览器市场的竞争已经到了白热化地步。在 Windows 平台上有微软的 Internet

Explorer 浏览器、Mozilla 的 FireFox、Opera、Google 的 Chrome 及很多使用 Internet Explorer

内核的浏览器;在 Linux 平台也有 Mozilla 的 FireFox、Opera、Google 的 Chrome、KDE 自带

的 konqueror 等。下面就介绍几种在 Linux 下比较流行的浏览器的安装方法。

1.Firefox

Mozilla Firefox(Firefox 官方网站:http://www.mozillaonline.com/)在国内通常直译为“火

狐”(该名称被官方使用但是没作为商标)是由 Mozilla 基金会与开源团体共同开发的网页浏

览器,Firefox 的源代码以 GPL/LGPL/MPL 三种授权方式发布。Firefox 是从 Mozilla Application

Suite 派生出来的网页浏览器,从 2005 年开始,每年都被媒体 PC Magazine 选为年度 佳浏

览器。根据统计,截至 2009 年 7 月,统计的数据显示 Firefox 的市场占有率达到了 30%,仅

次于微软的 Internet Explorer 浏览器。Firefox 是目前 常用的跨平台浏览器。

Firefox 拥有标签页浏览、拼字检查、即时书签、下载管理器及自定义搜索引擎等功能。

此外,还可以通过由第三方开发者贡献的附加组件(在老版本的 Firefox 中称为“扩展”)来

增强各种功能,高扩展性是 Firefox 的特色之一。比较受欢迎的有专门浏览 IE only 网页的 IE

Tab、阻挡网页广告的 Adblock Plus、下载 FLV 格式的在线影片的 Video Downloader Helper、

保护计算机安全的 NoScript 等。截至 2009 年,Firefox 可用的附加组件超过 2000 种。

在 RHEL 5.x 中无论使用 GNOME 还是 KDE 桌面环境都提供了 Firefox 浏览器,当然所

提供的并不是 新的版本,如果希望使用 新版本的 Firefox,可以到 Firefox 官方网站下载

并使用如下方法安装。

(1)通过 RHEL 5.x 自带的老版本的 Firefox 访问 http://www.mozillaonline.com 后,在首

页选择“其他版本”后,下载 新版的 Firefox for Linux(推荐下载到“/usr”目录)。

(2)在桌面单击鼠标右键后选择“打开终端”后,输入如下命令。

进入“/usr”目录。

[root@srv ~]# cd /usr

Linux 从初学到精通

66

解压下载的 Firefox。

[root@srv usr]# tar -xvjf firefox-3.6.3.tar.bz2

将原来系统自带的 Firfox 改一个名称。

[root@srv usr]# mv /usr/bin/firefox /usr/bin/firefox.bak

将新版本的 Firefox 链接到“/usr/bin/firefox”文件。

[root@srv usr]# ln -s /usr/firefox/firefox /usr/bin/firefox

清除旧版本 Firefox 的配置目录。

[root@srv usr]# rm -rf ~/.mozilla/

(3)配置完成后,再次打开系统中自带的 Firefox 就可以使用 新版本的 Firefox,如图

3-6 所示。

图 3-6 启动新版 Firefox

2.Opera

Opera(Opera 官方网站:http://www.opera.com/)起初是一款挪威 Opera Software ASA 制

作的支持多页面标签式浏览的网页浏览器,由于新版本的 Opera 增加了大量网络功能,官方

将 Opera 定义为一个网络包。目前官方发布的个人计算机用的 新稳定版本为 10.50。

Opera 支持多种操作系统,如 Windows、Linux、Mac、FreeBSD、Solaris、BeOS、OS/2、

UNIX等,此外Opera还有手机用的版本(Opera Mini和Opera Mobile),在2006年更与Nintendo

签下合约,提供 NDS 及 Wii 游戏机 Opera 浏览器软件。

1992 年左右 Jon Stephenson von Tetzchner 和盖尔·伊瓦尔绥在 Televerket 公司(挪威 大

的电信公司)的研究小组工作。该小组正在开发 ODA(一个基于标准的文件存储修复系统),

尽管这个系统效率很高,但是还没有被广泛应用就销声匿迹了。研究小组还开发了第一个服务

器程序,并在 1993 年建立了主页。然后他们觉得 Mosaic( 早的浏览器)能实现的结构太单

调就决定开发一个新的浏览器。他们在 ODA 项目中获得灵感,预见到一个能实现多结构的网

雾里看花——Linux 基本应用 第

67

3

络浏览器的潜力,同时母公司给他们亮了绿灯。1993 年下半年这个浏览器项目就已经开始运行

了。1994 年,Televerket 变成一个国有控股公司,而 J.S.von Tetzchner 和伊瓦尔绥这个小组也被

允许在 Televerket 的办公室继续开发浏览器。在 1995 年底,Televerket 更名为 Telenor,Opera

Software 公司也成立了,但仍然在原来的办公室。他们的产品叫做 MultiTorg Opera(2.0 版本

以前的 Opera 一直用这个名字,但这些版本一直没有对外发行),而且很快因为其优良的多页

面浏览特性、快捷栏和工具栏设置闻名。在 RHEL 5.x 中安装 Opera 的具体步骤如下。

(1)访问“http://www.opera.com/download/index.dml?platform=linux”后,在“Select

distribution and vendor”选择“RedHat”,单击“Download Opera”按钮,如图 3-7 所示。

图 3-7 下载 Opera

(2)双击下载文件“opera-10.10.gcc4.shared.qt3.i386.rpm”,在弹出窗口中单击“应用”

按钮,如图 3-8 所示。

图 3-8 安装 Opera

(3)在安装过程中会弹出警告信息(如图 3-9 所示),单击“无论如何都安装”按钮。

Linux 从初学到精通

68

图 3-9 Opera安装警告

(4)安装完后选择“应用程序”→“Internet”→“Opera”命令就可以开始使用 Opera

浏览器,如图 3-10 所示。

图 3-10 使用 Opera

3.1.3 聊天软件

QQ 是深圳腾讯计算机通信公司(QQ 官方网站:http://im.qq.com/)于 1999 年 2 月 11 日

推出的一款免费即时通信软件及其相关娱乐工具,是目前中国大陆 流行、使用人数 广的

聊天软件。QQ 初的功能是网络寻呼机即时通信软件,后来相继发展了游戏、个人虚拟形

象和网上交友的功能。QQ 软件的发展赶上中国互联网发展的高峰,利用公司的本地化,在

短短的几年内发展成为中国使用量 大、用户 多的面向个人的即时通信软件。在 RHEL 5.x

中安装 QQ 的具体步骤如下。

(1)访问 QQ for Linux 网站(http://im.qq.com/qq/linux/)下载 QQ,在下载时应选择 RPM

包,如图 3-11 所示。

雾里看花——Linux 基本应用 第

69

3

图 3-11 下载 QQ

(2)双击下载文件“linuxqq-v1.0.2-beta1.i386.rpm”,在弹出窗口中单击“应用”按钮,

如图 3-12 所示。

图 3-12 安装 QQ

(3)在安装过程中会弹出警告信息(如图 3-13 所示),单击“无论如何都安装”按钮。

图 3-13 QQ安装警告

Linux 从初学到精通

70

(4)安装完后选择“应用程序”→“Internet”→“腾讯 QQ”命令就可以开始使用 QQ,

如图 3-14 所示。

图 3-14 使用 QQ

3.1.4 邮件客户端

在收发电子邮件时,很多用户习惯使用一些邮件客户端软件,这些邮件客户端软件通过

POP3 或 IMAP 协议访问邮件服务器并下载用户所需的电子邮件,同时还可以让用户编写电

子邮件,通过 SMTP 协议将电子邮件发出,目前几乎所有的电子邮件服务提供商都支持 POP3

或 IMAP 协议,方便用户使用电子邮件客户端。在 Windows 下有 Foxmail、Outlook 等邮件客

户端软件,而在 Linux 平台 著名的邮件客户端软件是 Thunderbird。Thunderbird(Thunderbird

官方网站:http://en-us.www.mozilla.com/en-US/thunderbird/)非正式中文名称为“雷鸟”。

Thunderbird 是 Mozilla 基金会出品的电子邮件客户端软件,支持 POP3 和 IMAP 收信方式,

支持新闻组,并有强大的垃圾邮件过滤和地址簿功能。在 RHEL 5.x 中安装 Thunderbird 的具

体步骤如下。

(1)下载Mozilla Thunderbird(下载地址:http://download.mozilla.org/?product=thunderbird-3.0.1&os

=linux&lang=zh-CN),本章中下载到“/root”目录。

雾里看花——Linux 基本应用 第

71

3

(2)在桌面单击鼠标右键后选择“打开终端”(或“Open Terminal”)后,输入如下命令。

进入“/root”目录。

[root@srv ~]# cd /root

解压下载的 Thunderbird。

[root@srv ~]# tar -xvjf thunderbird-3.0.1.tar.bz2

(3)在桌面上单击鼠标右键,在弹出的菜单中选择“创建启动器”。在“名称”中指定启

动器的名称(如 ThunderBird),“命令”选择 ThunderBird 所在目标的 thunderbird 文件,单击

“确定”按钮,如图 3-15 所示。

图 3-15 选择 thunderbird文件

(4)双击桌面的“ThunderBird”图标即可打开 ThunderBird。在第一次使用 ThunderBird

时会出现如图 3-16 所示的建立邮件用户的窗口。

图 3-16 建立邮件用户

(5)在输入名称、邮件地址、密码后,单击“继续”按钮,ThunderBird 会尝试连接到你

的邮件服务器,如图 3-17 所示。

Linux 从初学到精通

72

图 3-17 连接邮件服务器

(6)在连接到邮件服务器 ThunderBird 时可能会弹出一个警告信息,这是因为没有使用

加密的 POP3 协议(目前大部分免费邮箱并不提供这个功能),勾选“我已了解相关风险”后,

单击“创建账户”按钮,如图 3-18 所示。

图 3-18 安全警告

(7)完成上述配置后即可使用 ThunderBird 收发电子邮件,如果还需要增加其他邮件用

户,可以在 ThunderBird 的“编辑”→“账户设置”中增加。

3.1.5 办公软件

谈到办公软件微软的 Office 系列产品无疑是 成功的办公软件。微软的 Office 系列产品

在功能及本地化方面都做得非常好。微软推出了 Mac OS 平台的 Office,但并没有推出 Linux

平台的相关产品。不过没有关系,因为即使是在 Windows 平台上微软的 Office 并不是办公软

件的唯一选择(在国内还有 WPS 等其他一些 Windows 平台的办公软件)。在 Linux 平台上使

雾里看花——Linux 基本应用 第

73

3

用的办公软件也有很多,下面就介绍几种在 Linux 下比较流行的办公软件的安装方法。

1.OpenOffice.org OpenOffice.org(OpenOffice.org 官方网站:http://www.openoffice.org/)是一套开放源代

码的办公室软件,可以在多种操作系统上运行。OpenOffice.org 默认的文件交换格式是已经

成为 ISO 标准的开放文件格式(ODF,Open Document Format)。此外,OpenOffice.org 也支

持 Microsoft Office 97 至 Microsoft Office 2007 的文件格式,以及其余常见的文档文件。

OpenOffice 的前身是德国公司 StarDivision 所研发的 StarOffice 办公室软件。1999 年 Sun 收

购了 StarDivision,2000 年 Sun 以 LGPL、SISSL 两种协议公开了 StarOffice 的源代码,目的是通

过提供免费、优质、开放的软件,来打破办公室软件中微软 Office 的垄断状态。OpenOffice.org

集合了密切协同工作的不同程序,来提供一个现代办公包需要的功能。其中很多在设计上仿照

Microsoft Office,但是两者多数格式并不兼容,OpenOffice.org 主要包括以下组件。

(1)OpenOffice.org Writer。一个看起来及用起来都很像 Microsoft Word 的文字处理器,

以提供与其大致相同的功能与工具。Writer 不需额外软件就导出 PDF 文件,也可作为 HTML

编辑器创建网页。在 3.0 版本中新增文件多页显示功能,让同一画面内显示多页文件,还可

以导出成 MediaWiki 的格式(目前支持大部分 MediaWiki 语法)。

(2)OpenOffice.org Impress。一个看起来及用起来都很像 Microsoft PowerPoint 的演示稿

程序。除了准备演示稿的通常功能,也可以将演示稿转换成 Adobe Flash(SWF)文件。尽管

添加了很多类似 iWorks 的效果,Impress 运行还是较慢,动画也不太流畅。

(3)OpenOffice.org Calc。一个看起来及用起来都很像 Microsoft Excel 的电子表格,但公

式和操作方式与 Microsoft Excel 完全不通用,Calc 中提供了一些 Excel 不支持的功能,Calc

也同样可以将电子表格导出成为 PDF 文件。

(4)OpenOffice.org Base。一个跟 Microsoft Access 类似的数据库程序。Base 允许创建并

操作数据库,可建造方便用户读取数据的窗体及报告。和 Access 一样,Base 也是一种能够

和许多种不同的数据库系统链接的接口程序,如 Access 数据库(JET),支持 ODBC 的数据

库来源及 MySQL、PostgreSQL。Base 是在 2.0 版之后才包含进来的组件。

(5)OpenOffice.org Draw。一个跟 CorelDRAW 功能类似的绘图程序。Draw 可以灵活地

链接各种形状,以便制作流程图。此外,在 3.0 版本中支持修改 PDF 功能。

(6)OpenOffice.org Math。一个能够产生及编辑复杂数学公式的工具,除了可以利用 Math

的图形接口做输入以外,也支持 TeX 的数式输入。Math 所产生的公式可以插入其他的

OpenOffice.org 文件,并可以支持与微软的方程式编辑器的转换。Math 支持多种字体,而且

可以导出成为一个 PDF 文件。

在 RHEL 5.x 中安装 OpenOffice.org 的具体步骤如下。

(1)访问 OpenOffice.org 网站下载页面(http://zh.openoffice.org/new/zh_cn/downloads.html)

下载 OpenOffice.org,在下载时应选择“Linux 32-bit RPM”(如果是 64 位系统可选择“Linux

64-bit RPM”),如图 3-19 所示。

(2)在桌面单击鼠标右键后选择“打开终端”(或“Open Terminal”)后,输入如下命令。

进入“/root”目录。

Linux 从初学到精通

74

图 3-19 下载 OpenOffice.org

[root@srv ~]# cd /root

解压下载的 OpenOffice.org。

[root@srv ~]# tar -xvzf OOo_3.2.0_LinuxIntel_install_zh-CN.tar.gz

进入 OpenOffice.org 安装目录。

[root@srv ~]# cd OOO320_m12_native_packed-1_zh-CN.9483/RPMS

安装相关软件包。

[root@srv RPMS]# rpm -ivh *.rpm

进入 OpenOffice.org,向桌面环境中添加 OpenOffice.org 菜单软件包安装目录。

[root@srv RPMS]# cd desktop-integration/

在桌面环境中添加 OpenOffice.org 菜单。

[root@srv desktop-integration]#rpm -ivh openoffice.org3.2-redhat*.rpm

(3)安装完成后就可以在“应用程序”→“办公”中打开 OpenOffice.org 办公套件,如

图 3-20 所示。

图 3-20 使用 OpenOffice.org

雾里看花——Linux 基本应用 第

75

3

2.永中 Office 永中 Office 是一套由永中科技公司(永中科技公司官方网站:http://www.evermoresw.

com.cn)开发的办公软件。永中 Office 与 Microsoft Office 相似,包含了文字、表格和幻灯片

的制作处理程序。与其他办公软件套装不同的是,永中 Office 将所有的处理功能集成到一个

程序中,而不是分列为不同的处理程序。

永中 Office 是一款将办公三大应用(文字处理、电子表格、简报制作)集成在单一用户

接口中的办公软件,真正实现了集成 Office。永中 Office 是中国唯一拥有完全自主知识产权

的通用办公软件。永中在政府采购中屡屡获得大单,而且在日本的零售市场中,2009 年 3 月,

永中销量仅次于微软。

2008 年永中 Office 2009 在办公软件中率先支持了中华人民共和国推行的 UOF 标准,其

后发布的个人版首次以免费提供,以扩大市场占有率,而在此前,永中 Office 是唯一向个人

用户收费的中国办公软件产品。

在 RHEL 5.x 中安装永中 Office 的具体步骤如下。

(1)下载永中 Office(下载地址:http://218.90.147.70/EverMore/EIOPersonal/EIOffice_Personal_

Lin.tar.gz),本章中下载到“/root”目录。

(2)在桌面单击鼠标右键后选择“打开终端”(或“Open Terminal”)后,输入如下命令。

进入“/root”目录。

[root@srv ~]# cd /root

解压下载的永中 Office。

[root@srv ~]# tar -xvzf EIOffice_Personal_Lin.tar.gz

进入永中 Office 安装目录。

[root@srv ~]# cd EIOffice_Personal_Lin/

运行永中 Office 安装脚本。

[root@srv EIOffice_Personal_Lin]# sh setup.sh

(3)在运行永中 Office 安装脚本后,会启动一个安装向导(如图 3-21 所示),根据向导

完成安装。

图 3-21 安装永中 Office

Linux 从初学到精通

76

(4)安装完成后就可以在“应用程序”→“办公”中打开永中 Office,如图 3-22 所示。

图 3-22 永中 Office

3.1.6 PDF 查看

便携式文件格式(Portable Document Format,PDF)是由 Adobe Systems(Adobe Systems

官方网站:http://www.adobe.com/)在 1993 年用于文件交换所发展出的文件格式。PDF 的优

点在于跨平台、能保留文件原有格式(Layout)、开放标准、能免版税(Royalty-free)、自由

开发 PDF 相容软件。PDF 是一个开放标准,2007 年 12 月成为 ISO 32000 国际标准。除了 Adobe

推出的 Adobe Reader 以外,还有很多第三方的工具可以用于阅读 PDF 文件。Adobe 公司的很

多工具,比如 Adobe Acrobat 9 Pro、Adobe Illustrator 可以用于制作 PDF,当然也有很多办公

软件,比如 Microsoft Office、OpenOffice.org、永中 Office 及一些专业制作 PDF 的软件,如

pdfFactory 也可以生成 PDF 文件。

图 3-23 PDF阅读器

雾里看花——Linux 基本应用 第

77

3

在RHEL 5.x中已经内置了一个PDF阅读器(如图3-23所示),不过功能没有Adobe Reader

强大,在 RHEL 5.x 中安装 Adobe Reader 的具体步骤如下。

(1)访问 Adobe 网站下载 Adobe Reader(http://get.adobe.com/cn/reader/otherversions/),

在下载时应选择“Linux - x86(.rpm)”,如图 3-24 所示。

图 3-24 下载 Adobe Reader

(2)双击下载文件“AdobeReader_chs-8.1.7-1.i486.rpm”,在弹出窗口中单击“应用”按

钮,如图 3-25 所示。

图 3-25 安装 Adobe Reader

(3)在安装过程中会弹出警告信息(如图 3-26 所示),单击“无论如何都安装”按钮。

Linux 从初学到精通

78

图 3-26 Adobe Reader安装警告

(4)安装完后选择“应用程序”→“办公”→“Adobe Reader”命令就可以开始使用 Adobe

Reader,如图 3-27 所示。

图 3-27 使用 Adobe Reader

3.1.7 媒体播放

多媒体方面的处理应该算得上是 Linux 的弱项,不过在开源社区的不断努力下也有了长

足的进步,下面主要介绍比较流行的媒体播放软件在 Linux 下的安装方法。

由于在 Linux 中大多数的媒体播放软件安装时都需要安装很多其他的软件包,因此在安

装下述的媒体播放软件前配置一个 YUM 源(有关 YUM 的知识见 8.3 节),具体步骤如下。

(1)配置 Internet 上的 YUM 源。

[root@srv ~]# rpm --import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt [root@srv ~]# wget

http://apt.sw.be/redhat/el5/en/i386/RPMS.dag/rpmforge-release-0.3.6-1.el5.rf.i386.rpm [root@srv ~]# rpm -ivh rpmforge-release-0.3.6-1.el5.rf.i386.rpm

(2)将 RHEL 5.x 光盘配置为一个 YUM 源。

挂载光盘。

雾里看花——Linux 基本应用 第

79

3[root@srv ~]# mount /dev/cdrom /mnt

在 yum.repos.d 的目录下建立一个名为 cdrom.repo 的文件后,在文件中加入如下内容。

[root@srv ~]# cat /etc/yum.repos.d/cdrom.repo [cdrom] name=Red Hat Enterprise Linux $releasever baseurl=file:///mnt/Server enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

1.Audacious Audacious(Audacious 官方网站:http://audacious-media-player.org/)是一款 Linux 下的音

乐播放器,与其他播放器的不同之处在于,Audacious 除了支持 UTF-8 字符集之外,还提供

其他字符集的支持,这样能比较好地解决中文乱码的问题。在 RHEL 5.x 中安装 Audacious

的具体步骤如下。

(1)在桌面单击鼠标右键后选择“打开终端”(或“Open Terminal”)后,输入如下命令。

[root@srv ~]# yum -y install audacious*

(2)安装完成后就可以在“应用程序”→“影音”中打开“Audacious”,如图 3-28 所示。

图 3-28 Audacious

2.VLC media player

VLC media player(VLC media player 官方网站:http://www.videolan.org/vlc/)可以为

Windows、Linux、Mac OS 等平台提供一个视频播放器、解码器。VLC media player 可以播放

来自网络、摄像头、磁盘、光驱的文件,支持包括 MPEG 1/2/4、H264、VC-1、DivX、WMV、

Vorbis、AC3、AAC 等格式的解码。

Linux 从初学到精通

80

(1)在桌面单击鼠标右键后选择“打开终端”(或“Open Terminal”)后,输入如下命令。

下载并安装 fribidi 软件包。

[root@srv ~]# wget http://mirrors.dotsrc.org/mythdora/10.21/i386/os/Packages/fribidi-0.19.1-2.fc9.i386.rpm [root@srv ~]# rpm -ivh fribidi-0.19.1-2.fc9.i386.rpm

安装 VLC。

[root@srv ~]# yum -y install vlc*

(2)安装完成后就可以在“应用程序”→“影音”中打开“VLC”,如图 3-29 所示。

VLC media player 不允许 root 用户使用。

图 3-29 VLC

3.RealPlayer

RealPlayer 是一个由 RealNetworks 公司(RealNetworks 官方网站:http://www.real.com/)

开发的跨平台的播放器,RealPlayer 可以播放各种音频及视频文件,包括 MP3、MPEG-4、

QuickTime、Windows Media 及其专用的 RealAudio 与 RealVideo 格式。RealPlayer 的第一个

版本在 1995 年 4 月面世,是互联网上首个媒体流播放软件。RealPlayer 初一直都以数字来

命名各个版本,但第 6 版改名为“RealPlayer G2”,第 9 版又改名为“RealOne Player”。现时

新的版本为第 12 版,并改名为“RealPlayer SP”。RealPlayer 一直以来都为客户提供两个不

同的版本:分别为免费的基本版本和要付费的“Plus”版本。付费版本提供额外的功能。

RealPlayer 在 Mac OS X、Linux、UNIX、Palm OS、Windows Mobile 及 Symbian OS 都有其对

应的版本。在 RHEL 5.x 中安装 RealPlayer 的具体步骤如下。

(1)访问 RealPlayer for Linux 网站(http://www.real.com/linux)下载 RealPlayer,单击

“Download Download RPM Installer”下载 RPM 包,如图 3-30 所示。

提 示

雾里看花——Linux 基本应用 第

81

3

图 3-30 下载 RealPlayer for Linux

(2)双击下载文件“RealPlayer11GOLD.rpm”,在弹出窗口中单击“应用”按钮,如图

3-31 所示。

图 3-31 安装 RealPlayer

(3)在安装过程中会弹出警告信息(如图 3-32 所示),单击“无论如何都安装”按钮。

图 3-32 RealPlayer安装警告

Linux 从初学到精通

82

(4)安装完后通过“应用程序”→“影音”→“RealPlayer 11”就可以开始使用 RealPlayer,

如图 3-33 所示。

图 3-33 使用 RealPlayer

文本编辑器

在使用 Windows 的过程中,很多人已经习惯了通过图形界面修改计算机的配置、配置各

种服务等操作,而在 Linux 中大部分的配置工作都是通过修改 Linux 的各种配置文件实现。

修改配置文件就需要使用文件编辑器,Linux 下的文件编辑器非常多,有的是在字符界面下

使用,有的是在图形界面下使用。本章中主要介绍一款在图形界面下使用的文件编辑器 Gedit

及一款在字符界面下使用的文件编辑器 vi。

3.2.1 Gedit 编辑器使用

Gedit(Gedit 官方网站:http://www.gnome.org/projects/gedit/)是 Linux 下使用的一款纯

文本编辑器,Gedit 操作简单,具有一般文本编辑器所应该具有的所有功能。同时 Gedit 还支

持插件功能,可以把 Gedit 用来当成是一个集成开发环境,通过插件 Gedit 会根据不同的语言

高亮显现关键字和标识符。

很多 Linux 发行版在 Gnome 桌面环境下都包含了 Gedit。在 RHEL 5.x 中进入 GNOME

桌面环境后,通过“应用程序”→“附件”→“文本编辑器”即可打开 Gedit,如图 3-34

所示。

雾里看花——Linux 基本应用 第

83

3

图 3-34 启动 Gedit

在 KDE 桌面环境中提供的是 KEdit,该软件与 Gedit 在功能上区别并不大。

Gedit 使用时与一般 Windows 下的文本编辑器区别不大,这里就不一一介绍了。本章主

要介绍 Gedit 插件的使用文件。通过丰富多彩的插件,可以让 Gedit 的功能变得非常强大。在

RHEL 5.x 中 Gnome 桌面环境的 Gedit 已经包含了很多的插件,可以通过“编辑”→“首选项”

→“插件”勾选需要使用的插件,如图 3-35 所示。

图 3-35 编辑插件

提 示

Linux 从初学到精通

84

当然也可以访问 http://live.gnome.org/Gedit/Plugins,能下载到很多插件,这些插件的安装

方法也基本相同,下载插件将插件复制到“~/gnome2/gedit/plugins”目录(如果该目录不存在

就手动建立),重新启动 Gedit 后即可以通过“Edit”→“Preferences”→“Plugins”勾选插件。

3.2.2 vi 编辑器使用

1976 年由 Bill Joy 完成编写 vi,并由 BSD 发布。从 2006 年开始,作为“单一 UNIX 规

范”的一部分,vi 或 vi 的一种变形版本一定会在类 UNIX 系统中找到。直到现在,vi 仍然被

广泛地使用,vi 比其他许多文本编辑器启动得更快,并且占内存更少。

vim(vim 官方网站:http://www.vim.org/)是 vi 著名的一种变形版本。Bram Moolenaar

在 20 世纪 80 年代末购入 Amiga 计算机时,Amiga 上还没有 常用的编辑器 vi。Bram 从一

个开源的 vi 复制 Stevie 开始,开发了 vim 的 1.0 版本。 初的目标只是完全复制 vi 的功能,

当时的 vim 是 Vi IMitation 的简称。1991 年 vim1.14 版被“Fred Fish Disk #591”这个 Amiga

用的免费软体集所收录。1992 年 1.22 版本的 vim 被移植到了 UNIX 和 MSDOS 上。从当时

开始,vim 的全名就变成 Vi IMproved 了,在这之后 Vim 加入了不计其数的新功能。作为第

一个里程碑的是 1994 年的 3.0 版本加入了多视窗编辑模式。从那之后,同一屏幕可以显示的

vim 编辑文件数就不止一个了。1996 年发布的 Vim 4.0 是第一个利用图形接口的版本。1998

年 5.0 版本的 vim 加入了语法高亮功能。2001 年的 vim 6.0 版本加入了代码折叠、插件、多

国语言支持、垂直分割视窗等功能。2006 年 5 月发布的 Vim 7.0 版更加入了拼字检查、上下

文相关补完、标签页编辑等新功能。现在 新的版本是 2008 年 8 月发布的 vim 7.2,该版本

合并了 vim 7.1 以来的所有修正补丁,并且加入了脚本的浮点数支持。

1.vim 基本操作 vim 在日常管理中工作是非常重要的,作为一个合格的 Linux 系统工程师熟练地使用 vim

是一个基本的要求。

vim 新手在使用时 麻烦的就是模式,因为在使用过程中经常忘记自己处于何种模式,

或无意键入某个字符后切换到其他模式。不管当前处在什么模式,按下 Esc 键都会切换命令

模式。在一些时候需要按两次 Esc 键,如果 vim 以一声蜂鸣回答,说明已经切换到命令模式。

vim 包括以下几种模式(在几种模式之间切换键如图 3-36 所示)。

图 3-36 vim模式切换

雾里看花——Linux 基本应用 第

85

3

(1)命令模式。vim 编辑器启动后默认处于该模式,在其他任何一个模式下,用【Esc】

键或者【Ctrl+C】组合键可以切换到命令模式。

(2)插入模式。在该模式下,vim 就和其他编辑一样可以输入内容。在命令模式下,使

用“i”、“o”或“a”可以进行该模式。

(3)可视模式。在该模式下,可以使用方向键进行内容选择,然后进行复制、粘贴或其

他操作。在命令模式下,使用“v”进入可视模式。

(4)块操作模式。在该模式下,可以使用方向键进行内容选择,选择时可模拟鼠标选择

的方式。在命令模式下,使用【Ctrl+V】组合键进入本模式。

(5)修改模式。在该模式下,vim 类似于在其他很多软件法用【Insert】键来完成这个切

换。在命令模式下,使用 R 进入该模式。

(6)扩展命令模式。在该模式下,可执行一些 vim 的扩展命令。进入命令模式后,可以

使用“:”切换到此模式。

直接在命令行输入 vim 即可打开该编辑器,也可以在 vim 后接一个文件名,如“vim

/charles.txt”,如果该文件存在则直接打开该文件,如果该文件不存在 vim 会新建一个空白文件。

图 3-37 打开文件异常

vim 在编辑文件时会产生一个临时的交换文件,在退出 vim 时该文件会自动删除。如果

文件已被另一个vim会话编辑或上一次打开后未正常退出就会出现如图3-37所示的情况。vim

使用的临时交换文件是一个隐藏文件,文件名是编辑文件名后加“.swp”,如编辑的文件是

/etc/test.conf,那么其临时交换文件名为/etc/.test.conf.swp。在图 3-37 中 vim 提供了以下几种

操作选择。

(1)输入“o”可以只读方式打开该文件。

(2)输入“e”可正常编辑该文件,使用该方式一定要注意, 后可以确定没有其他用户

正在编辑这个文件。

(3)输入“r”可以从临时交换文件中恢复,如果可以确定临时交换文件是需要的内容,

可以使用此项。

(4)输入“q”可以退出编辑该文件。如果有另一个 vim 会话正在编辑, 好是选择退

出。如果是刚刚启动 vim, 这个选择会同时退出 vim。如果启动时打开了好几个窗口,vim 只

Linux 从初学到精通

86

有在第一个窗口遇到这种情况时才退出;如果是在使用一个编辑命令时选择退出,该文件就

不会被继续载入,系统回到此前的编辑状态。

(5)输入“a”将放弃并同时会撤销对后续命令的执行,这在执行一个 Shell 脚本时非常

有用。

(6)输入“d”可以删除临时交换文件。

在对文件编辑完成后,如果希望关闭首先需要切换到命令模式。vim 提供以下几种退出

方式。

(1):q:直接退出,如果文件内容发生改变 vim 会提示并不允许退出。

(2):q!:强行退出,如果文件内容发生改变则不会保存。

(3):wq 或:x:保存并退出。

(4):wq!或 x!:强行保存并退出。强行保存一般用于编辑文件是只读的情况下,但被编

辑文件的拥有者必须是当前用户。

vim 的功能非常强大,可以使用的操作键也非常多,但是常用的操作键并不多,对于一

般使用都只需要记住一些常用操作键的使用即可。vim 的使用没有什么特别的技巧,只有多

多练习才能熟练地使用。下面是各模式下一些常用的操作键。

(1)命令模式常用操作键

G:移动到文件 后一行。

nG:n 为数字,移动到文件的第 n 行。

/word:向下查找关键字 word。

?word:向上查找关键字 word。

n:重复前一个查找。

N:反向重复前一个查找。

:n,$s/a/b/:替换第 n 行开始到 后一行中每一行的第一个 a 为 b。

:n,$s/a/b/g:替换第 n 行开始到 后一行中每一行所有 a 为 b ,n 为数字,若 n 为.,

表示从当前行开始到 后一行。

d$:删除光标所在位置到该行 后一个字符。

dd:剪切当前行。

yy:复制选内容。

nyy:复制从光标开始 n 行内容。

p:将已复制的数据粘贴到光标下一行。

P:将已复制的数据粘贴到光标上一行。

u:复原上一个操作。

Ctrl+R:重复前一个操作。

o:当前下插入空行,并进入插入模式。

O:当前上插入空行,并进入插入模式。

.:重复前一个动作。

i:进入插入模式,从当前光标所在处插入。

雾里看花——Linux 基本应用 第

87

3

I:插入模式,从当前行第一个非空格处插入。

r:插入模式,替换光标所在字符。

R:进入修改模式。

<Esc>键:返回命令模式。

(2)扩展命令模式常用操作键

:w:保存。

:w!:文件为只读时强制保存,不过能否保存还要看文件权限。

:q:离开 vim。

:q!:强制离开。

:wq:保存后离开。

:x:保存后离开。

:e!:将文件恢复到原始状态。

:w [filename]:另存为新文件。

v:进入可视模式。

Ctrl+V:进块操作模式。

:r [filename]:将 filename 的文件读到光标的后面。

n1,n2 w [filename]:将 n1 到 n2 另存为新文件。

:new:新增水平窗口。

:new filename:新增水平窗口,并在新增的窗口加载 filename 的文件。

:v new 新增垂直窗口。

:v filename:新增垂直窗口,并在新增的窗口加载 filename 的文件。

Ctrl+W+[方向键]:切换窗口。

:only:仅保留目前的窗口。

:set nu:显示行号。

:set nonu:不显示行号。

:set readonly:文件只读,除非使用!可写。

:set ic:查找时忽略大小写。

:set noic:查找时不忽略大小写。

2.vim 高级操作 vim 成为 Linux 平台主流的文本编辑器,与其丰富的功能是分不开的。vim 除在上面提到

的基本功能外,还有许多高级功能。下面几种就是这些高级功能中的一部分。

(1)Shell 切换

在 vim 中进入文件编辑时,利用 vim 命令模式所提供的 Shell 切换功能,可以在不退出

vim 的情况下执行 Linux 命令。使用该功能时只需在命令模式中输入“:! <Linux 命令>”,当

Linux 命令执行完成后按回车就回到了 vim 环境中,如图 3-38 所示。

Linux 从初学到精通

88

图 3-38 Shell切换

(2)分割窗口

vim 可以在分割多窗口环境下同时编辑多个文件。在 vim 进入了多窗口后,可以使用

【Ctrl+W】组合键在不同窗口之间切换。要进入 vim 多窗口可以使用以下两种方法。

图 3-39 -o进入多窗口

在启动 vim 时使用“-o”或“-O”,并加上需要同时编辑的多个文件名,其中“-o”

是使用水平分割的多窗口;“-O”是使用垂直分割的多窗口。使用如下命令时,vim

就进入如图 3-39 所示的多窗口环境。

[root@srv ~]# vim -o /etc/fstab /boot/grub/grub.conf

在已经打开 vim 的情况下,如果希望 vim 进入多窗口,打开另一个文件使 vim 可以

在命令模式下输入“:split <文件名>”(水平分割)或“:vsplit <文件名>”(垂直分割)。

(3)键映射

键映射类似就是定义一个快捷键用于执行一个宏。下面是一个键映射的简单例子,将功

能键 F5 定义为在行尾输入分号(;),在 vim 命令模式下输入以下内容。

:map <F5> i<End>;<Esc>

上述定义完成后,当在命令模式下键入功能键<F5>时,vim 会依次执行输入字母“i”(进

行插入模式)、按【End】键(移动到当前行尾)、输入分号、按【Esc】键(返回命令模式)。

:map 定义的键映射并不是在 vim 的所有模式下都可用,vim 还可以定义其他模式的键映

射见表 3-1。

雾里看花——Linux 基本应用 第

89

3表 3-1 定义键映射

命令 可用模式

:map 命令模式、可视模式、Operator-pending 模式

:vmap 可视模式

:nmap 命令模式

:omap Operator-pending 模式

:map! 插入模式、扩展命令模式

:imap 插入模式

:cmap 扩展命令模式

Operator-pending 模式是指已经选择了一个作为命令的操作符,如“d”,接下来 vim 希

望继续选择一个移动命令或是一个文本对象。vim 希望继续接收命令而用户又尚未选择命

令的状态,如命令“dw”,其中的“w”就是在 Operator-pending 模式下选择的。

在各种模式下定义键映射的命令虽然不一样,但方法是完全相同的,只是在定义的时候

要注意映射的执行流程。如上述定义 F5 的例子如果希望定义在插入模式中就不能只将“:map”

改为“:imap”了,因为上述例子中的“i”是进入插入模式,而“:imap”定义的映射在使用

时已经处于该模式,所以如果希望实现相同的功能就需要修改为以下方式。

:imap <F5> <Esc>i<End>;<Esc>

大家在使用 Windows 平台软件时已经习惯了使用组合键,通过映射功能也可以定义组合

键,如将“Ctrl+O”定义为在行尾输入分号,在 vim 命令模式下输入以下内容即可。

:map <C-o> <Esc>i<End>;<Esc>

对于不需要使用的键映射可以使用如下方法删除其映射关系,不同模式删除映射关系的

命令见表 3-2。

:unmap <C-o>

表 3-2 删除映射关系

定义命令 删除命令

:map :unmap

:vmap :vunmap

:nmap :nunmap

:omap :ounmap

:map! :unmap!

:imap :iunmap

:cmap :cunmap

提 示

Linux 从初学到精通

90

4)插件

vim 的功能可以通过向其增加插件的方式扩展。插件就是会被 vim 自动载入执行的脚本。

在 RHEL 5.x 中,把插件的脚本放入/usr/share/vim/vim70/plugin 目录即可。RHEL 5.x 使用的

vim 已经自带了很多插件。如插件 gzip,使得 vim 可以直接打开使用 gzip、bzip2 及 compress

压缩的文件,当文件打开时被动态解压缩,并在写操作时被自动重新压缩。

正是由于 vim 庞大的用户群, vim 的插件的种类也相当丰富。用户可以在

http://www.vim.org/scripts 下载各种插件。

天涯若比邻

随着企业网络的不断扩展,网络管理人员经常需要对远程的服务器进行维护。为了满足

这样的要求,出现了很多远程管理软件,如 PCAnyWhere 等。在 Linux 系统中默认就提供了

多种方式,使管理员可以方便地远程管理 Linux 服务器,本章中主要介绍 Linux 所提供的几

种比较常见的远程管理方式。

3.3.1 Telnet

Telnet 协议是 TCP/IP 协议族中的一员,是 Internet 远程登录服务的标准协议。Telnet 为

用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的计算机上使用 telnet

程序连接到服务器,终端使用者可以在 Telnet 程序中输入命令,这些命令会在服务器上运行,

就像直接在服务器的控制台上输入一样。要开始一个 Telnet 会话,必须输入用户名和密码来

登录服务器。传统 Telnet 连接会话所传输的数据并未加密,这代表所输入及显示的资料,包

括账号名称及密码等隐秘资料,可能会遭其他人窃听,因此有许多服务器会将 Telnet 服务关

闭,改用更为安全的 SSH。Microsoft Windows 从 Vista 开始,Telnet 用户端不再是预先安装,

而要手动从程式集里启动才可以使用。在 RHEL 5.x 中也是一样,默认并没有安装 Telnet 服

务,也就是说,其他客户无法通过 telnet 程序连接到 RHEL 5.x。在 RHEL 5.x 中开户 Telnet

服务的具体操作步骤如下。

(1)安装 Telnet 服务,具体操作步骤如下。

挂载 RHEL 5.x 光盘。

[root@srv ~]# mount /dev/cdrom /mnt

安装 Telnet 服务。

[root@srv ~]# rpm -ivh /mnt/Server/telnet-server-0.17-39.el5.i386.rpm

(2)使用“vim /etc/xinetd.d/telnet”命令编辑 Telnet 服务配置文件修改如下内容。

service telnet { flags = REUSE socket_type = stream

雾里看花——Linux 基本应用 第

91

3 wait = no user = root server = /usr/sbin/in.telnetd log_on_failure += USERID disable = NO }

(3)重新启动 xinetd 服务。

[root@srv ~]# service xinetd restart

(4)完成后其他 Linux 或 Windows 客户端就可以通过 telnet 命令连接到 RHEL 5.x 的服务器。

在 Windows Vista 之后的 Windows 默认并没有提供 telnet 用于连接到远程的 Telnet 服

务器,如果需要使用 telnet 命令必须在“打开或关闭 Windows 功能”中勾选“Telnet 客户

端”,如图 3-40 所示。

图 3-40 Telnet客户端

Windows、Linux 作为客户端使用 telnet 命令时并没有什么区别,下面是通过一台 Linux

客户连接到 IP 地址为 192.168.159.12 并开启了 Telnet 服务的 RHEL 5.x 服务器的方法。

连接到 192.168.159.12。

[root@srv ~]# telnet 192.168.159.12 Trying 192.168.159.12... Connected to 192.168.159.12 (192.168.159.12). Escape character is '^]'. Red Hat Enterprise Linux Server release 5.4 (Tikanga) Kernel 2.6.18-164.el5 on an i686

输入 Telnet 服务器上的合法的用户。

提 示

Linux 从初学到精通

92

login: charles

输入 Telnet 服务器上的合法的密码。

Password:

成功连接到 192.168.159.12。

[charles@srv1 ~]$

在 RHEL 5.x 中 Telnet 服务默认不允许客户端使用 root 用户登录,如果希望 root 用户

也可以修改/etc/pam.d/login 内容如下。

#%PAM-1.0 #auth required pam_securetty.so #注释或删除该行。 auth required pam_stack.so service=system-auth auth required pam_nologin.so account required pam_stack.so service=system-auth password required pam_stack.so service=system-auth session required pam_stack.so service=system-auth session optional pam_console.so

3.3.2 SSH

SSH 是 Secure Shell 的缩写,由 IETF 的网络工作小组所制定,SSH 为建立在应用层和传

输层基础上的安全协议。传统的网络服务,如 FTP、POP、Telnet,其本质上都是不安全的,

因为这些网络服务在网络上用明文传送数据、用户账号及密码,很容易受到中间人

(man-in-the-middle)攻击方式的攻击,通过 SSH 可以对所有传输的数据进行加密,也能够防

止 DNS 欺骗和 IP 欺骗。SSH 的另一项优点为其传输的数据是经过压缩的,所以可以加快传

输的速度。SSH 有很多功能,SSH 既可以代替 Telnet,又可以为 FTP、POP 提供一个安全的

通道。Red Hat 推荐用户使用安全的 SSH 来远程登录服务器,而不要使用 telnet,因为 telnet

连接服务器时,密码是以明文方式传输。

在 RHEL 5.x 中 SSH 服务默认就已经安装并已启动,客户端可以连接到 RHEL 5.x 的 SSH

服务进行远程管理,下面介绍通过 Linux 及 Windows 客户端通过 SSH 连接到 RHEL 5.x 服务

器的方法。

1.Linux 客户端 在 Linux 客户访问 SSH 服务器主要通过以下几个命令完成。

(1)ssh 命令是 Linux 平台连接到 SSH 服务器 常用的命令,ssh 基本语法如下。

ssh [-CfLRv] [用户名@] SSH服务器 [命令]

常用指数:

常用选项:

SSH 服务器:指定需要连接的 SSH 服务器,可以使用 FQDN 或 IP 地址。

提 示

雾里看花——Linux 基本应用 第

93

3

用户名@:指定连接 SSH 服务器的用户名,不指定用户名时默认以 root 用户连接。

命令:使用 ssh 命令可以连接到 SSH 服务器,但有时只需要在 SSH 服务器上执行一

个命令时,可直接通过此参数指定需要执行的命令。

-C:启用压缩功能。

-f:在询问密码之后且在执行[命令]之前,将 ssh 转到后台运行。

-L:将本地系统中的某个端口转发到远程系统。

-R:将远程系统上的某个端口转发到本地客户端。

-v:显示与连接和传送有关的调试信息。如果命令运行不太正常的话,这个选项就

会非常有用。

下面在如图 3-41 所示的网络拓扑中,在 IP 地址为 192.168.159.100 的客户端上通过 ssh

命令管理 IP 地址为 192.168.159.11 的 RHEL 5.x 服务器,具体操作步骤如下。

图 3-41 ssh

通过 ssh 命令连接远程计算机,未输入用户名则默认使用 root 用户。

[root@srv ~]# ssh 192.168.159.11

如果是第一次连接到远程计算机,由于本地主机的用户需要生成连接远程主机的

RSA 公钥,所以出现警告提示此处输入 yes,OpenSSH 会将这台计算机识别标记加

入#~/.ssh/know_hosts 文件中,第二次连接时就不会出现警告。

The authenticity of host '192.168.159.11 (192.168.159.11)' can't be established. RSA key fingerprint is 1b:e5:af:97:e1:97:d4:ce:06:24:37:57:d2:88:b0:a8. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.159.11' (RSA) to the list of known hosts.

输入 IP 地址为 192.168.159.11 的 RHEL 5.x 服务器 root 用户密码。

[email protected]'s password: Last login: Sat Nov 7 11:34:06 2009

已经成功连接到 IP 地址为 192.168.159.11 的 RHEL 5.x 服务器,之后所有的命令将

Linux 从初学到精通

94

在该 RHEL 5.x 服务器上执行。

[root@ssh ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:D9:53:C0 inet addr:192.168.159.11 Bcast:192.168.159.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fed9:53c0/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:36 errors:0 dropped:0 overruns:0 frame:0 TX packets:68 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:4575 (4.4 KiB) TX bytes:11310 (11.0 KiB) Interrupt:59 Base address:0x2024 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:1670 errors:0 dropped:0 overruns:0 frame:0 TX packets:1670 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:4129904 (3.9 MiB) TX bytes:4129904 (3.9 MiB)

退出对 IP 地址为 192.168.159.11 的 RHEL 5.x 服务器的远程连接。

[root@ssh ~]# exit Connection to 192.168.159.11 closed.

在 IP 地址为 192.168.159.11 的 RHEL 5.x 服务器上执行 hostname 命令。

[root@srv ~]# ssh 192.168.159.11 hostname [email protected]'s password: ssh.example.zqin

(2)scp 命令可以使用 SSH 的方式在远程主机和本地主机之间复制文件或目录,scp 基本

语法如下。

scp [-Cpqrv] [[用户名@]复制源主机:]复制源文件[[用户名@]复制目标主机:][复制目标文件]

常用指数:

常用选项:

用户名@:指定连接 SSH 服务器的用户名,不指定用户名时默认以 root 用户连接。

命令:使用 ssh 命令可以连接到 SSH 服务器,但有时只需要在 SSH 服务器上执行一

个命令时,可直接通过此参数指定需要执行的命令。

-C:启用压缩功能。

-p:保留原文件的修改时间、访问时间及模式。

-q:不要显示复制进度信息。

-r:递归复制。

-v:显示与连接和传送有关的调试信息。如果命令运行不太正常的话,这个选项就

会非常有用。

雾里看花——Linux 基本应用 第

95

3

在 scp 命令中“复制源主机”和“复制目标主机”为两个系统名称,分别表示文件复制

操作的源和目的地,可以使用 FQDN 或 IP 地址。当未指定时,默认为本地主机。用户名都

默认为本地主机上正在输入该命令的用户,可以用“用户名@”来指定不同的用户。如果没

有指定复制目标文件,那么 scp 将把文件复制到指定目标主机用户的家目录。

下面在如图 3-41 所示的网络拓扑中,在 IP 地址为 192.168.159.100 的客户端上通过 scp

命令将 IP 地址为 192.168.159.11 的 RHEL 5.x 服务器上“/test”目录的所有内容复制到本地

“/tbak”目录,具体操作步骤如下。

使用 scp 命令进行远程复制。

[root@srv ~]# scp -pr 192.168.159.11:/test /tbak/

输入 IP 地址为 192.168.159.11 的 RHEL 5.x 服务器 root 用户密码。

[email protected]'s password: jack.xlsx 100% 120KB 120.0KB/s 00:00 house.docx 100% 60KB 60.0KB/s 00:00 oliva.pptx 100% 300KB 300.0KB/s 00:00

2.Windows 客户端 一 般 在 Windows 平 台 可 以 使 用 PuTTY ( PuTTY 官 方 网 站 :

http://www.chiark.greenend.org.uk/~sgtatham/putty/)连接到 SSH 服务器。PuTTY 是一个开源

软件,主要由 Simon Tatham 维护,使用 MIT licence。PuTTY 可以作为 Telnet、SSH 等的客

户端连接软件,较早的版本仅支持 Windows 平台,在新的版本中开始支持各类 UNIX 平台。

除了官方版本外,有许多非官方的团体或个人将 PuTTY 移植到其他平台上,如使用 Symbian

的 智 能 手 机 。 PuTTY 的 Windows 版 本 是 一 个 绿 色 软 件 , 下 载 ( 下 载 地 址 :

http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe)后不需要安装即可使用。

打开 PuTTY 后输入需要连接的远程主机的 IP 地址或 FQDN 后,单击“Open”按钮(如

图 3-42 所示)。如果是经常访问的服务器可以在“Saved Sessions”为当前服务器起个名称文

件以后使用。

图 3-42 PuTTY连接服务器

Linux 从初学到精通

96

由于本地主机的用户需要生成连接远程主机的 RSA 公钥,所以在第一次连接远程主机时

会出现警告提示此处选择“是”按钮,如图 3-43 所示。在输入用户名及密码后即可使用 SSH

登录到远程主机,如图 3-44 所示。

图 3-43 PuTTY警告提示

图 3-44 PuTTY连接成功

3.3.3 RDP

在 Windows 中可以通过“远程桌面”功能连接到远程的 Windows 计算机进行管理。在

微软的官方网站也可以下载基于 Mac OS 的“远程桌面”客户端,使得 Mac OS 可以连接到

远程的 Windows,但微软并没有提供基于 Linux 系统的“远程桌面”客户端。不过开源软件

rdesktop(rdesktop 官方网站:http://www.rdesktop.org/)使得 Linux 可以通过“远程桌面”连

接到 Windows 进行管理。在 Linux 中配置 rdesktop 的具体步骤如下。

(1)安装 rdesktop 及相关软件包。

将 RHEL 5.x 光盘挂载到/mnt 目录。

[root@srv ~]# mount /dev/cdrom /mnt

雾里看花——Linux 基本应用 第

97

3

安装相关软件包。

[root@srv ~]# rpm -ivh /mnt/Server/libao-0.8.6-7.i386.rpm

下载并安装 rdesktop 及相关软件包。

[root@srv ~]# wget ftp://rpmfind.net/linux/dag/redhat/el5/en/i386/dag/RPMS/libsamplerate-0.1.7-1.el5.rf.i386.rpm [root@srv ~]# wget ftp://rpmfind.net/linux/dag/redhat/el5/en/i386/dag/RPMS/libsndfile-1.0.17-1.el5.rf.i386.rpm [root@srv ~]# wget ftp://rpmfind.net/linux/dag/redhat/el5/en/i386/dag/RPMS/rdesktop-1.6.0-0.1.el5.rf.i386.rpm [root@srv ~]# rpm -ivh *.rpm

(2)通过如下命令可以连接到 IP 地址为 192.168.159.17 的 Windows 计算机,在弹出窗口

中输入 Windows 的用户名及密码即可远程管理 Windows,如图 3-45 所示。

[root@srv ~]# rdesktop 192.168.159.17

图 3-45 rdesktop

Linux 命令基础

在传统的类 UNIX 操作系统中,所有的管理工作都是通过命令的方式完成,虽然在目前

的绝大多数 Linux 的发行版中都包括了图形界面,一些管理工作可以通过图形工具完成。但

是作为一个合格的 Linux 工程师, 直接、 有效的管理方式还是使用命令,因为 Linux 绝

大多数的管理工作必须通过命令完成。在开始学习 Linux 命令之前我们首先应该了解 Linux

命令的一些基础知识。

Linux 从初学到精通

98

3.4.1 Linux 命令分类

在 Linux 操作系统中,命令一般分为以下两种。

(1)Shell 内部命令:Shell 内部命令是一些较为简单的又常用的命令,如 cd、mkdir、rm

等,这些命令在 Shell 启动时载入内存,就像是操作系统本身所具有的命令一样。

(2)Shell 外部命令:Linux 中大多数命令属于 Shell 外部命令,每一个 Shell 外部命令都

有一个独立的可执行程序。也就是说,Shell 外部命令实际上是一些实用工具程序,管理员可

以独立地在 Shell 环境下安装或卸载这些 Shell 外部命令。

在 Linux 中执行命令时,Shell 内部命令可以在任何目录、任何时间执行,而 Shell 外部

命令在执行时,Linux 必须可以找到对应的可执行程序。在 Shell 中有一个名为 PATH 的环境

变量(可使用如下方法显示 PATH 的内容),该变量中包括一些路径用于 Shell 自动搜索。如

果可执行程序直接位于 PATH 变量所包括的路径中,则可以直接输入可执行程序的名称;如

果不在 PATH 变量所包括的路径中,则需要指定路径来运行这个可执行程序。

查看 PATH 变量内容。

[root@srv ~]# echo $PATH /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr

/sbin:/usr/bin:/root/bin

不在 PATH 变量中定义的路径必须使用绝对路径来运行这个可执行程序。

[root@srv ~]# /usr/local/apachectl start

3.4.2 Linux 命令格式

Shell 解释器在用户和内核之间相当于一个翻译的角色,负责解释用户输入的命令。Shell

是操作系统与用户进行交互的界面,当用户输入命令后由 Shell 对命令进行分析并交给适当

的后台程序进行处理,等待处理完成后,将处理结果返回给用户。根据程序功能的不同,Shell

可能返回一些输入信息或不返回任何输入信息。在 Linux 中命令的基本格式都采用如下所示

的格式。

命令 [选项] [参数]

命令是需要执行的操作;选项说明对命令的要求;参数用于描述命令的作用对象。在下

面的例子中“ls”是需要执行的操作;“-l”选项表示对“ls”的要求(在“ls”命令中“-l”

表示要求以长格式显示文件信息);“/boot”是“ls”命令的参数,表示“ls”命令的作用对象

是“/boot”目录。

[root@srv ~]# ls -l /boot total 5541 -rw-r--r-- 1 root root 68663 Aug 19 03:56 config-2.6.18-164.el5 drwxr-xr-x 2 root root 1024 Jan 29 19:31 grub -rw------- 1 root root 2636467 Jan 29 19:46 initrd-2.6.18-164.el5.img drwx------ 2 root root 12288 Jan 29 19:09 lost+found

在执行 Linux 命令时可以根据需要包括“选项”或“参数”,通过“选项”或“参数”可

雾里看花——Linux 基本应用 第

99

3

以让一个命令每次运行时都能够接受用户不同的指令,采取不同的运行方式、作用于不同的

对象、产生不同的运行结果,一般“选项”会出现在“参数”的前面。在执行 Linux 命令时

需要注意以下几点。

(1)在 Linux 中无论是文件名、目录名、命令等对英文字符的处理都是区分大小写的,

因此“ls”和“LS”代表两个不同的命令。

(2)在“命令”、“选项”、“参数”中间至少使用一个空格分隔。

(3)虽然并不是所有的 Linux 命令都要求“选项”必须出现在“参数”前面,但推荐在

执行命令时,“选项”放在“参数”前面。

(4)在 Linux 命令中“选项”一般需要一个引导符,以“-”引导的是短格式选项(单个

字符),如“-l”;以“--”引导的是长格式选项(多个字符),如“--detail”。 多个短格式选

项可以写在一起,只用一个“-”引导,如“-rv”和“-r -v”表示相同的意思。

3.4.3 Linux 命令辅助操作

在 Linux 的图形界面打开终端或是在虚拟控制台中输入命令时,系统都提供了一些辅助

操作提高命令的输入效率,下面介绍几种常用的辅助操作。

(1)Tab 键补全命令行。当在命令提示符下输入命令或程序名时,可以不必输入完整命

令或程序名,使用 Tab 键,Linux 系统将自动补全命令、程序名、文件或目录。比如希望从

当前切换到/etc/services 目录下可以输入“cd /e<Tab 键>/ser<Tab 键>”。Tab 键根据前几个字

母查找出匹配内容,如果内容唯一会自动将所有内容补全,如果内容不唯一系统将不会做出

任何反应,这时可连续使用两次 Tab 键会列出与前几个字母匹配的所有内容。图 3-46 中在

cd /etc/s 后使用两次 Tab 键的效果。

图 3-46 Tab键补全

图 3-47 history

(2)历史命令。Linux 系统中保留了用户键入的每一个命令的历史记录,并提供多种方

式让用户方便从历史记录中找到命令。查看当前历史记录可使用“history”命令(如图 3-47

所示),在 history 命令中每个历史记录都有一个编号,使用“history -c”可清除命令的历史

记录。可以通过“↑”和“↓”方向键快速浏览历史记录列表。

(3)快捷键。在图形界面打开终端或虚拟控制台都可以使用以下快捷键(这些快捷键使

用是不区分大小写的)。

Ctrl+U:清空从光标所在位置到行首。

Ctrl+K:清空从光标所在位置到行尾。

Ctrl+L:清屏,相当于“clear”命令。

Linux 从初学到精通

100

Ctrl+C:停止本次命令的执行。

Ctrl+R+<若干字符>:开始向上搜索包含该字符的命令,继续按 Ctrl+R,查找上一

条匹配的命令。

Ctrl+U:剪切命令行中光标所在处之前的所有字符(不包括自身)。

Ctrl+K:剪切命令行中光标所在处之后的所有字符(包括自身)。

Alt+<:历史列表第一项。

Alt+>:历史列表 后一项。

Alt+u:把当前词转化为大写。

Alt+l:把当前词转化为小写。

(4)使用上一行命令的 后一个参数。在输入命令时使用【ESC+.】组合键可以在光标

所在位置加入上一行命令的 后一个参数。如上一行命令是“cp /boot/grub/grub.conf

/home/charles”,那么使用“ESC+.”可以在光标所在位置加入“/home/charles”。

(5)特殊字符。!<数字>:执行命令历史列表的第<数字>条命令;!!:执行上一条命令;!<

字符串>:执行含指定字符串的 新命令。

(6)强制换行。在输入命令的过程中如果命令太长,可以通过“\”分多行输入。

[root@srv ~]# cp /boot/grub/grub.conf \ > /home/charles

(7)在使用 Linux 命令指定文件、目录以及在一些查找中指定“范本样式”时,可使用

一些通配符:“*”任意个字符、“?”任意一个字符、“[0-9]”表示 0 到 9、“[abc]”匹配“abc”

中的任何一个字符、“[^abc]”不能匹配“abc”中的任何一个字符。

3.4.4 Linux 命令帮助获取

在各种 Linux 发行版中包含了大量的开源软件,如在 RHEL 5.x 中就包括了 Apache、

Samba、Squid 等。这些开源软件不但向用户开放其源代码,而且还提供了软件开发者或其他

参与者编写的大量帮助文档。这些帮助文档会与软件一起发布,并且随软件一起安装到系统

中,用户可以在使用这些开源软件时使用这些帮助文档。一般 Linux 用户可以通过以下几种

方法获得一个命令的帮助信息。

1.使用 man 命令获得帮助 大多数 Linux 命令都提供了对应的联机帮助文档,这些文档可以使用“man”命令查看。

使用 man 命令时,只需在所查找的命令前输入“man”即可。在图 3-48 的例子中就是使用“man”

命令查看“touch”命令的联机帮助文档。

“man”命令显示的帮助文档的信息一般保存在“/usr/shareman”目录,在显示帮助文件

时一般包括以下几个部分。

(1)NAME:显示程序名称。如果有其他一些和待帮助程序包有关的程序,也会同时显示。

(2)Synopsis:显示命令的格式及所有的选项和参数。

(3)Description:显示程序功能的描述信息。

(4)Options:显示所有选项清单及功能描述。

雾里看花——Linux 基本应用 第

101

3

图 3-48 man

(5)See Also:显示与这个程序相关的其他程序。

(6)Files:显示这个程序使用或修改的文件。

(7)History:显示这个程序开发的重要里程碑。

(8)Authors:显示程序的作者。

使用“man”命令显示帮助文档时会进入“man”命令的环境,在该环境中会用到以下功

能键。

(1)q:退出“man”命令。

(2)回车:一行一行地向下翻页。

(3)空格:一页一页地向下翻页。

(4)b:向上翻页。

(5)/ <字符串>:在帮助文档中查找“<字符串>”中指定的内容。

(6)n:查找上一次查找内容的下一个匹配。

2.通过帮助选项

Shell 命令一般可以使用“-h”或“--help”选项获得帮助信息,有些 Shell 命令两种方式

都支持,有些 Shell 命令只支持其中一种(如图 3-49 所示)。使用“-h”或“--help”选项时

所获得的帮助信息只是比较简单的帮助信息,并没有“man”命令全面。

图 3-49 --help

Linux 从初学到精通

102

3.使用 help 命令获得帮助 help 命令用于查看 Shell 命令的使用方法。使用 help 命令时,只需在所查找的命令前输

入“help”即可,如图 3-50 所示。

图 3-50 help

4.使用 info 查看信息

info 是 GUN 的超文本帮助系统,大多数 Linux 软件都提供了 info 文件形式的在线帮助

文档。info 文件一般保存在“/usr/shrare/info”目录,可以使用 info 命令查看。使用 info 命令

时,只需在所查找的命令前输入“info”即可,如图 3-51 所示。

图 3-51 info

雾里看花——Linux 基本应用 第

103

3

实验任务

(1)在一台 RHEL 5.x 服务器上安装以下软件。

新版 Firefox 永中 Office

QQ for Linux aMSN

VLC media player

(2)在一台 RHEL 5.x 服务器上将 IP 地址为 192.168.159.100 的 RHEL 5.x 服务器上“/test”

目录的所有内容复制到本地“/testbak”目录中。

(3)在一台 RHEL 服务器上通过“远程桌面”连接到 IP 地址为 192.168.159.20 的 Windows

Server 2008 服务器。

本章测试

(1)下面( )方式可以查看“cp”命令的帮助。

A.cp -? B.cp -h

C.cp -a D.cp --h

(2)在 vi 中从“可视模式”切换到“命令模式”使用( )。

A.: B.ESC

C.Ctrl+L D.Ctrl+Q

(3)下面( )是“ssh”命令正确的使用方法。

A.ssh -l 192.168.159.159 B.ssh -o 192.168.159.159

C.ssh -a 192.168.159.159 D.ssh 192.168.159.159

(4)关于“mkdir -p /fringe/oliva”命令说法正确的是( )。

A.“-p”是该命令的参数 B.该命令没有使用选项

C.“-p”是该命令的选项 D.该命令没有使用参数

(5)使用( )可以使当前行出现上一行的 后一组参数。

A.Ctrl+K B.ESC+.

C.Ctrl+L D.ESC+>

(6)下列不属于 Linux 桌面环境的是( )。

A.Fluxbox B.JDK

C.GNOME D.KDE

(7)下列关于 Linux 桌面环境说法正确的是( )。

A.在虚拟终端可以使用【Ctrl+F1】组合键回到 Linux 桌面环境

B.一个系统中只可以安装一种 Linux 桌面环境

Linux 从初学到精通

104

C.Linux 桌面环境是 Linux 运行不可缺少的内容

D.Linux 桌面环境不是 Linux 运行不可缺少的内容

(8)在 vim 中使用( )可以保存并退出当前编辑的文件。

A.:w B.:q!

C.:q D.:wq

(9)使用( )可以清除屏幕所有内容。

A.ESC B.ESC+C

C.Ctrl+U D.Ctrl+L

(10)下列关于 telnet 服务说法正确的是( )。

A.在 RHEL 5.x 中默认就安装了 telnet 服务

B.telnet 服务在数据传输过程中会对数据进行加密

C.telnet 服务只能在 Linux 系统之间使用

D.telnet 服务在数据传输过程中不会对数据进行加密

Linux 系统的所有数据以文件形式存放在 Linux 主机上,这

些文件以“/”目录为根,分层组成一个树状结构的文件系统。Linux

用户在使用时,日常的操作几乎都是围绕着文件系统而展开的,

所以熟练地使用目录及文件管理的相关操作是学好 Linux 系统的

重要前提。在本章中将讲述 Linux 目录及文件管理的相关操作。

第4章

管好家产

︱Linux

目录及文件管理

Linux 从初学到精通

106

Linux 系统常见目录

对于 Linux 新手来说, 感到迷惑的问题之一就是文件都存在哪里,特别是对于已经习

惯了 Windows 操作的用户。所以我们必须了解一下 Linux 下的主要目录及这些目录的作用。

(1)/:根目录。对一台计算机来说,有且只有一个根目录。所有的内容都是从根目录开

始。如当你在终端中输入“/etc”时,就是告诉 Linux 系统,先从“/”(根目录)开始,再进

入到“etc”目录。

(2)/root:系统管理员(root 用户)的家目录。对于 Linux 系统来说,系统管理员几乎

可以对系统做任何事情。

(3)/bin:存放了标准的 Linux 的工具,如 ls、cp、mv 等。一般来说,这个目录已经包

含在的“PATH”变量中定义过,也就是说使用该目录的程序时可以不需要使用路径。

(4)/boot:用于加载程序(GRUB)的文件。当计算机启动时(如果有多个操作系统,

有可能允许选择启动哪一个操作系统),这些文件首先被装载。这个目录也会包含 Linux 内核

(压缩文件 vmlinuz),但是 Linux 内核也可以存在别处。

(5)/proc:操作系统运行时,进程信息及内核信息,如 cpu、硬盘分区、内存信息等存

放在该目录。“/proc”目录伪装的文件系统“proc”的挂载目录,“proc”并不是真正的文件

系统,有关“/proc”目录见 10.8 。

(6)/etc:主要存放了系统配置方面的文件。如在系统安装了 vsftpd 这个软件,当你想要

修改 vsftpd 配置文件的时候,vsftpd 的配置文件就在/etc/vsftpd 目录下。

(7)/etc/init.d:存放系统或以 System V 模式启动的服务脚本。

(8)/etc/xinetd.d:如果服务是通过 xinetd 模式运行的,服务的脚本要放在这个目录下。

(9)/etc/rc.d:存放 BSD 方式启动脚本,如定义网卡开启脚本等。

(10)/etc/X11:存放 X-Windows 相关的配置文件。

(11)/dev:主要存放与设备(包括外设)有关的文件(UNIX 和 Linux 系统都把设备当

成文件)。

(12)/home:存放每个用户的家目录。具体每个用户的设置文件,用户的桌面文件夹,

还有用户的数据都放在这里。每个用户都有自己的家目录,位置为“/home/用户名”。当然 root

用户除外,root 用户的家目录是“/root”。

(13)/tmp:临时目录。对于某些程序来说,有些文件被用了一两次之后,就不会再被用

到,像这样的文件就放在这里。有些 Linux 发行版中会定期自动对这个目录进行清理,因此

千万不要把重要的数据放在这里。

(14)/bin、/usr/bin:大部分系统命令都是二进制文件的形式保存。一般用户使用的命令

通常位于这两个目录中。系统必需的核心工具命令,如 cd、ls、cp、mv 等都位于/bin 目录。

辅助工具,如 Web 浏览器、办公软件位于/usr/bin 目录,这些目录下的工具也可以通过共享

的方式给其他系统上的用户使用。这两个目录所有命令都是非特权命令,也就是说任何用户

都可以使用。

管好家产——Linux 目录及文件管理 第

107

4(15)/sbin、/usr/sbin:这两个目录也用于保存命令文件,但是与/bin、/usr/bin 不同,这

两个目录只有超级用户(root 用户)可以使用,其中包括安装和删除硬件、启动和关闭系统

及其他一些用于系统维护的命令。

(16)/usr/local:存放那些手动安装的软件,该目录和“/usr”目录具有相类似的目录结构。

(17)/usr/share:存放系统共用的文件,如 /usr/share/fonts 是字体目录;/usr/share/doc 和

/usr/share/man 帮助文件。

(18)/usr/src:存放内核源码存放的目录,有些 Linux 发行版系统也会把其他软件的源码

包安装在这里。

(19)/var:位于/bin 或/etc 目录的命令和配置文件基本上是不变的,这些文件通常都很

稳定,而另外一些文件则会经常变化,如系统日志、网站、收发的电子邮件等。这些经常变

化的文件通常位于/var 目录。

(20)/var/log:存放系统日志,分析日志的目录。

(21)/opt:存放那些可选的程序。

(22)/lib:库文件存放目录。

(23)/lost+found:在 ext2 或 ext3 文件系统中,当系统意外崩溃或意外关机时,而产生

一些文件碎片放在该目录。当系统启动的过程中 fsck 工具会检查这里,并修复已经损坏的文

件系统。 有时系统发生问题,有很多的文件被移到这个目录中,可能会用手工的方式来修复,

或移到文件原来的位置上。

(24)/mnt:这个目录一般是用于存放挂载储存设备的挂载目录。

(25)/media:有些 Linux 的发行版使用这个目录来挂载那些 USB 接口的移动硬盘、

CD/DVD 驱动器等。

目录结构及操作命令

目录结构编排文件是目前大多数操作系统所使用的一种通用的方法。每个文件都有文件

字,再将文件名编排成目录。目录自身也是一种文件,所以也可以将目录编排到另外一个目

录中。以此类推,层层组织可以建立一个结构性很强的环境。Linux 也是使用一个目录树来

编排所有的文件和目录,所有的文件和目录都在根目录(“/”)的下面。命名文件或目录的时

候,从 Linux 文件系统的树根开始,列出想要的文件或目录的所有分枝目录,目录间用斜线

(“/”)分隔。

4.2.1 Nautilus 工具

在 RHEL 5.x 的桌面环境中提供了一个名为 Nautilus 的工具,可以方便地进行文件系统的

管理。通过“应用程序”→“系统工具”→“文件浏览器”或直接双击桌面的“计算机”就

可以打开Nautilus,如图 4-1所示。Nautilus类似于Windows系统中的资源管理器,但是Nautilus

并不能提供所有的功能,所以还是那句话“在 Linux 系统学会使用命令完成操作是必需的”。

Linux 从初学到精通

108

图 4-1 打开 Nautilus

4.2.2 pwd:查看当前目录

pwd 命令告诉用户当前所在的目录。

[root@srv ~]# pwd /root

4.2.3 cd:改变当前目录

cd 命令用于改变用户的当前目录,该命令语法如下。

cd [目录|目录缩写]

常用指数:

cd 命令可以改变当前目录,其中目录名表示需要切换到的目录;目录缩写包括:“.”表

示当前目录;“..”表示当前目录的父级目录;“~”表示当前用户的家目录;“-”表示上一个

工作目录。下面看几个 cd 命令的例子。

将当前目录切换到/home/charles 目录。

[root@srv ~]# cd /home/charles

将当前目录切换到当前目录的上一级目录。

[root@srv ~]# cd .. [root@srv ~]# pwd /home

将当前目录切换到当前用户的家目录。

[root@srv ~]# cd ~ [root@srv ~]# pwd /home/charles

管好家产——Linux 目录及文件管理 第

109

4将当前目录切换到上一个工作目录。

[root@srv ~]# cd - [root@srv ~]# pwd /home

将当前目录切换到用户 charles 的家目录。

[root@srv ~]# cd ~charles [root@srv ~]# pwd /home/charles

4.2.4 ls:显示目录内容

ls 命令用于显示指定目录的内容,该命令语法如下。

在 Linux 系统中如果文件名以“.”开头则表示该文件是隐藏文件。

ls [-anruhtFSlR] --time=<atime|ctime> --color<=使用时机> [目录…]

常用指数:

常用选项:

[目录]:指定要显示内容的目录或目录缩写,如果需要显示多个目录时,可在目录

名之间使用空格分隔。

-a:显示包括以“.”开头的隐藏文件在内的所有文件及目录。

-n:使用 UID 和 GID 代替用户名显示文件或目录的所有者和拥有组(有关 UID、

GID、所有者、拥有组等概念见第 5 章)。

-r:反向排序,用相反的顺序列出文件和目录名称。

-u:以 后存取时间排序,显示文件和目录。

-h:使用 k(KB)、M(MB)、G(GB)为单位,提高信息可读性。

-t:根据文件或目录 后修改时间的顺序显示文件及目录。

-F:显示目录下的文件或目录的名称及类型。以“/”结尾表示是目录名;以“*”

结尾表示是可执行文件;以“@”结尾表示是符号连接;以“|”结尾的是软链接。

-S:根据文件大小的顺序显示。

-l:显示目录所有文件或目录的权限、所有者、文件大小、修改时间及名称。

-R:显示目录及其所有子目录的文件。

--time=<atime|ctime>:显示访问时间(atime)或改变权限属性时间(ctime),而不

是内容变更时间(mtime)。

--color<=使用时机>:在显示文件和目录时加上色彩,方便区别各种类型的文件。

使用时间的默认值为“none”,也就是不显示任何色彩。只加上“--color”表示设置

为“always”。一般在使用“always”时可能显示的色彩包括:蓝色表示目录;绿色

提 示

Linux 从初学到精通

110

表示可执行文件:红色表示压缩文件;浅蓝色表示链接文件;红底白字表示有问题

的文件,如符号链接所指向的文件已不存在时符号链接文件就属于有问题的文件(有

关符号链接见 4.3.6 );灰色(白色)表示其他文件。

在 Linux 系统会为目录或文件记录三个时间分别是:访问时间(atime)表示该文件或

目录最后被访问的时间;改变权限属性时间(ctime)表示该文件或目录最后被修改权限属

性的时间;内容变更时间(mtime)表示该文件最后被修改内容的时间。

ls 命令用于显示指定目录中的内容,如果没有指定需要显示的目录,则显示当前目录的

内容。下面看几个 ls 命令的例子。

显示当前目录的内容。

[root@srv ~]# ls anaconda-ks.cfg Desktop install.log install.log.syslog

显示“/boot”目录的内容。

[root@srv ~]# ls /boot config-2.6.18-164.el5 grub initrd-2.6.18-164.el5.img lost+found

使用长格式显示“/boot”目录的内容。

[root@srv ~]# ls -l /boot total 5541 -rw-r--r-- 1 root root 68663 Aug 19 03:56 config-2.6.18-164.el5 drwxr-xr-x 2 root root 1024 Feb 3 11:58 grub -rw------- 1 root root 2636467 Jan 29 19:46 initrd-2.6.18-164.el5.img drwx------ 2 root root 12288 Jan 29 19:09 lost+found

使用长格式并使用 k、M、G 单位显示“/boot”目录的内容。

[root@srv ~]# ls -lh /boot total 5.5M -rw-r--r-- 1 root root 68K Aug 19 03:56 config-2.6.18-164.el5 drwxr-xr-x 2 root root 1.0K Feb 3 11:58 grub -rw------- 1 root root 2.6M Jan 29 19:46 initrd-2.6.18-164.el5.img drwx------ 2 root root 12K Jan 29 19:09 lost+found

在 RHEL 5.x 中为“ls -l --color”定义了一个别名“ll”,也就是说,在 RHEL 5.x 系统

中使用“ll”命令时实际的意义是“ls - l--color”。

在使用“ls -l”时每行都会显示七列(如图 4-2 所示),每列的含义分别表示:第一列是

权限位;第二列,如果该行是文件显示的是包含硬链接数,如果该行是目录包含子目录数(新

建立的目录中就会显示子目录数为 2,这是因为任何新建的目录都包括“.”和“..”两个目录);

第三、四列是所有者和拥有组;第五列是大小;第六列是 后修改时间;第七列是文件或目

录名。“total”表示该目录所有文件占用的空间。

提 示

提 示

管好家产——Linux 目录及文件管理 第

111

4

图 4-2 ls -l

4.2.5 mkdir:创建目录

mkdir 命令用于创建目录,该命令语法如下。

mkdir [-p] [-m <目录属性>] 目录名称…

常用指数:

常用选项:

目录名称:需要创建的目录,如果需要建立多个目录时,可在目录名之间使用空格

分隔。

-p:如果要建立的目录的父级目录当前尚未创建,则一起建立父级目录。

-m:建立目录时,同时设置目录的权限,权限设置方法与 chmod 命令相同(chmod

命令具体见第 6 章 )。

mkdir 命令类似于在 Windows 图形界面中的“新建”→“文件夹”功能,但是 mkdir 功

能更强大。下面看几个 mkdir 命令的例子。

在当前目录下建立一个名为 charles 的目录。

[root@srv ~]# mkdir charles

在根目录下建立一个名为 charles 的目录。

[root@srv ~]# mkdir /charles

在/etc/目录是建立名为 charles 和 jack 的目录。

[root@srv ~]# mkdir /etc/charles /etc/jack

在根目录下的 doc 目录中建立一个名为 charles 的目录,使用“-p”选项是因为 doc

目录目前还不存在。

[root@srv ~]# mkdir -p /doc/charles

4.2.6 tree:以树状图显示目录内容

tree 命令用于以树状图显示目录内容,该命令语法如下。

tree [-aACdDfFgipstu] [-P <范本样式>] [-I <范本样式>] [目录…]

Linux 从初学到精通

112

常用指数:

常用选项:

[目录…]:指定要显示的目录,如果不指定则显示当前目录。

-a:显示所有文件和目录,包括以“.”为名称开头的文件;当前目录“.”;父级目

录“..”。

-A:使用 ANSI 绘图字符显示树状图。

-C:在文件和目录清单加上色彩,方便区分各种类型文件。

-d:只显示目录,而不显示文件。

-D:显示文件或目录的修改时间。

-f:在每个文件或目录前显示完整的相对路径名称。

-F:显示文件或目录的名称及类型。以“/”结尾表示是目录名;以“*”结尾表示

是可执行文件;以“@”结尾表示是符号连接;以“|”结尾的是符号链接。

-g:显示文件或目录的拥有组名称。

-i:不使用阶梯状列出文件或目录名称。

-p:显示文件或目录权限标示。

-s:显示文件或目录大小。

-t:使用文件或目录的修改时间排序。

-u:显示文件或目录的所有者名称。

-P <范本样式>:只显示符合范本样式的文件。

-I <范本样式>:不显示符合范本样式的文件。

tree 会显示指定目录下所有的文件、目录及子目录中的文件。下面看几个 tree 命令的例子。

以树状图显示/home 目录内容。

[root@srv ~]# tree /home/ /home/ |-- lost+found `-- charles ̀ -- grub.conf 2 directories, 1 file

以树状图显示/boot 目录以.conf 结尾的文件。

[root@srv ~]# tree /boot/ -P *.conf /boot/ |-- grub | ̀ -- grub.conf `-- lost+found 2 directories, 1 file

以树状图显示/bin 目录内容及文件类型,但是只显示以.conf 结尾的文件。

[root@srv ~]# tree -F -P t* /bin/ /bin/

管好家产——Linux 目录及文件管理 第

113

4|-- tar* |-- taskset* |-- tcptraceroute -> traceroute* |-- traceroute6 -> traceroute* |-- tracert -> traceroute* `-- true* 0 directories, 11 files

文件操作命令

建立目录是为了有效地分类管理文件,在学习了目录相关的操作命令后,下面学习在

Linux 中常用的一些与文件相关的命令。

4.3.1 touch:改变文件或目录时间

touch 命令用于改变文件或目录的访问时间及修改时间,该命令语法如下。

touch [-am] [-t <日期时间>] [-r <参考文件>] [目录|文件…]

常用指数:

常用选项:

目录|文件…:指定要改变时间的文件或目录。

-a:只修改访问时间。

-m:只修改修改时间。

-t <日期时间>:使用指定日期时间,而非系统当前时间。指定日期时间格式依次是

“年份、月份、日期、时间、分钟、秒数”,如“20121231235959”表示 2012 年 12

月 31 日 23 点 59 分 59 秒。

-r <参考文件>:把指定文件的日期时间改变为参考文件的日期时间。

使用 touch 命令可以改变文件或目录的时间,如果不指定日期时间及使用系统当前日期

时间。如果指定的文件不存在,则会建立一个空文件。下面看几个 touch 命令的例子。

建立一个名为 charles 的空文件。

[root@srv ~]# touch ~/charles

将/etc/fstab 文件的读取时间修改为当前时间。

[root@srv ~]# touch -a /etc/fstab

4.3.2 file:识别文件类型

在 Linux 系统中文件的扩展名只是为了方便使用者识别文件的类型,对系统本身没有任

何意义。这点与 Windows 是完全不一样的。当用户不清楚文件的类型时,file 命令可以识别

Linux 从初学到精通

114

文件的类型,该命令语法如下。

file [-bcLz] [-f <文件名>] 文件|目录

常用指数:

常用选项:

文件|目录:需要识别的文件或目录。

-b:显示识别结果时,不显示文件名称。

-c:详细显示命令执行过程。

-L:直接显示符号链接文件指向的文件类型。

-z:尝试去解读压缩文件的内容。

-f <文件名>:指定一个文件,该文件中记录了需要 file 命令识别的文件列表。在该

文件中一行一个文件名。

file 命令在识别文件类型时,如果是文本文件则会显示“ASCII”等信息;如果是执行则

会显示“Shell Script”等信息;如果是链接文件则会显示链接指向的文件等信息。下面看几

个 file 命令的例子。

显示/etc/fstab 文件的类型。

[root@srv ~]# file /etc/fstab /etc/fstab: ASCII text

显示 jack.tar.gz 文件的类型,但不显示文件名。

[root@srv ~]# file -b jack.tar.gz gzip compressed data, from UNIX, last modified: Fri Feb 5 21:01:00 2010

4.3.3 cp:复制文件或目录

cp 命令用于将目录或文件复制到另一个目录,该命令语法如下。

cp [-abdfilprsuv] [-S <备份字符串>] 源目录或文件… 目标目录或文件

常用指数:

常用选项:

-a:相当于-pdr 三个选项。

-b:在覆盖目标文件时,先备份目标文件。备份的文件会在文件名尾加上一个备份

字符串。

-S <备份字符串>:指定备份字符串。

-d:如果源文件是链接文件,则复制链接文件而不是其指向的文件。

-f:如果有重复或其他疑问时,不会询问用户,而强制复制。

-i:如果目标已经存在,在覆盖时会先询问用户。

管好家产——Linux 目录及文件管理 第

115

4 -l:建立源文件的硬链接,而不是复制源文件。

-p:复制时保留源文件或目录的属性。

-r:递归持续复制,该选项用于目录。

-s:建立源文件的符号链接,而不是复制源文件。

-u:只有目标文件比源文件新时才复制。

-v:显示命令执行过程。

在 RHEL 5.x 中为“cp -i”定义了一个别名“cp”,也就是说,在 RHEL 5.x 系统中使用

“cp”命令时实际上就已经包括了“-i”选项。

cp 命令用于复制文件或目录,如果同时指定两个以上的文件或目录,而且 后的目标目录

已存在,则会把前面指定的所有文件或目录复制到该目标目录中。下面看几个 cp 命令的例子。

将/etc/fstab 文件复制到当前用户家目录。

[root@srv ~]# cp /etc/fstab ~

将/etc/目录复制到当前用户家目录,如果需要复制的是一个目录一定要使用“-r”选

项。如果/etc/bak 目录不存在,系统会自动建立。

[root@srv ~]# cp -r /etc/ /etcbak

将/boot/grub/grub.conf 文件复制到本地,并将文件名改为 grub.conf.bak。

[root@srv ~]# cp /boot/grub/grub.conf ./grub.conf.bak

将/root 目录所有以“.docx”结尾的文件复制到/root/doc 目录。

[root@srv ~]# cp /root/*.docx /root/doc

4.3.4 rm:删除文件或目录

rm 命令用于删除文件或目录,该命令语法如下。

rm [-firv] 文件或目录

常用指数:

常用选项:

文件或目录:要删除的文件或目录。

-f:强制删除。

-i:在删除前会询问用户。

-r:递归,一般用于目录的删除。

-v:显示命令执行过程。

在 RHEL 5.x 中为“rm -i”定义了一个别名“rm”,也就是说,在 RHEL 5.x 系统中使

提 示

提 示

Linux 从初学到精通

116

用“rm”命令时实际上就已经包括了“-i”选项。

在使用 rm 删除时,如果是删除目录必须使用“-r”选项。下面看几个 rm 命令的例子。

删除~/fstab 文件。

[root@srv ~]# rm ~/fstab rm: remove regular file `/root/fstab'? y

删除~/fringe 目录,使用强制删除(不会要求用户确认)。

[root@srv ~]# rm -rf /fringe

删除/root 下所有以“.docx”结尾的文件和目录。

[root@srv ~]# rm -rf /root/*.docx

4.3.5 mv:移动或更名现有的文件或目录

mv 命令用于移动或更名现有的文件或目录,该命令语法如下。

mv [-fiub] [-S <备份字符串>] 源目录或文件… 目标目录或文件

常用指数:

常用选项:

-f:强制删除。

-b:在覆盖目标文件时,先备份目标文件。备份的文件会在文件名尾加上一个备份

字符串。

-S <备份字符串>:指定备份字符串。

-i:在覆盖目标文件前会询问用户。

-u:只有目标文件比源文件新时才复制。

在 RHEL 中为“mv -i”定义了一个别名“mv”,也就是说,在 RHEL 5.x 系统中使用

“mv”命令时实际上就已经包括了“-i”选项。

mv 用于移除源文件或目录到目标目录,如果源目录或文件和目标目录或文件相同则将

源目录或文件改名为目标目录或文件。下面看几个 mv 命令的例子。

将/abc 移动到当前用户家目录。

[root@srv ~]# mv /abc ~

将 jack.tar.gz 改名为 jack.tgz。

[root@srv ~]# mv jack.tar.gz jack.tgz

提 示

管好家产——Linux 目录及文件管理 第

117

4

4.3.6 ln:链接文件或目录

ln 命令用于链接文件或目录,该命令语法如下。

ln [-bdfis] [-S <备份字符串>] 源文件或目录 [链接文件]

常用指数:

常用选项:

-b:在覆盖目标文件时,先备份目标文件。备份的文件会在文件名尾加上一个备份

字符串。

-S <备份字符串>:指定备份字符串。

-d:建立硬链接文件。

-s:建立符号链接文件。

ln 命令用于建立文件或目录的链接文件,在 Linux 中链接文件分为硬链接(Hard Link)

文件和符号链接(Symbolic Link)文件两种。

符号链接也被称为软链接(Soft Link)。

在 Linux 系统中内核为每一个新创建的文件分配一个 inode(i 节点),每个文件都有一个

唯一的 inode 号。文件属性保存在索引节点里,在访问文件时,索引节点被复制到内存在,

从而实现文件的快速访问。链接是一种在共享文件和访问它的用户的若干目录项之间建立联

系的一种方法。硬链接是一个指针,指向文件 inode 号,系统并不为硬链接重新分配 inode。

尽管硬链接节省空间,也是 Linux 系统整合文件系统的传统方式,但是存在一些不足之处:

不可以在不同文件系统的文件间建立链接;只有 root 才可以为目录创建硬链接。符号连接有

点类似于 Windows 的快捷方式,符号连接实际上是特殊文件的一种。在符号连接中,文件实

际上是一个文本文件,其中包含有另一文件的位置信息。当源文件被删除后,硬链接文件同

样可以被使用,而符号链接文件将无法使用。符号链接会显示为“链接文件名->指向的实际

文件”,而硬链接通过文件名无法判断,如图 4-3 所示。

图 4-3 硬链接及符号链接

下面看几个 ln 命令的例子。

为/etc/fstab 文件在当前目录建立一个符号连接文件,文件名还是 fstab。

[root@srv ~]# ln -s /etc/fstab

提 示

Linux 从初学到精通

118

为/boot/grub/目录在当前目录建立一个符号链接文件,文件名是 gb。

[root@srv ~]# ln -s /boot/grub gb

查找操作命令

使用目录结构 大的好处就是可以将不同的文件进行分类,方便使用。但是无论目录规

划得多好,总会有不知道要使用的文件存在什么地方的问题,这时就需要使用查找工作找到

自己需要的文件。下面是在 Linux 中常用的一些与查找相关的命令。

4.4.1 locate:查找文件或目录

locate 命令用于查找文件或目录,该命令语法如下。

locate 查找内容

常用指数:

locate 命令用于查找文件或目录,该命令只会在保存文件和目录名称的数据库中查找符

合条件的内容。在查找内容中使用“*”表示任意个字符;使用“?”表示任何一个字符。比

如查找内容为“tony*zhang”,locate 命令会查找所有以“tony”开始并且以“zhang”结尾的

文件和目录。如果有目录的名称叫“tony_zhang”则会显示出该目录下包括子目录在内的所

有文件。locate 命令并不特别看待“/”、“.”为特殊符号,名为“tony.zhang”的文件或路径

名“tony/zhang”也符合查找条件。

locate 命令查找的速度非常快,这是因为该命令并不是实际在硬盘中每个目录去查找文

件,而是在一个保存了硬盘上目录结构及文件名的数据库中查找,也是因为这个原因对于刚

新增、修改、删除的文件和目录,locate 命令有可能无法找到,这时需要使用如下命令更新

数据库。在有些 Linux 发行版中系统会定期执行该命令。

[root@srv ~]# updatedb

下面看几个 locate 命令的例子。

查找名为 grub 的文件或目录。

[root@srv ~]# locate grub

查找名称中包括“charles”的文件或目录。

[root@srv ~]# locate *charles*

4.4.2 which:查找文件

which 命令用于查找文件,该命令语法如下。

管好家产——Linux 目录及文件管理 第

119

4which [文件]

常用指数:

which 命令用于查找文件,但该命令只会在 PATH 环境变量中定义的路径及命令别名中

查找。下面看几个 which 命令的例子。

显示 PATH 环境变量中定义的路径。

[root@srv ~]# echo $PATH /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr

/sbin:/usr/bin:/root/bin

在 PATH 环境变量中定义的路径及命令别名中查找“ll”。

[root@srv ~]# which ll alias ll='ls -l --color=tty' /bin/ls

4.4.3 whereis:查找文件

whereis 命令用于查找文件,该命令语法如下。

whereis [-bu] [-B <目录>] [-M <目录>] [-S <目录>] [文件…]

常用指数:

常用选项:

文件…:要查找的文件。

-b:只查找二进制文件。

-u:查找不包含指定类型的文件。

-B <目录>:只在指定的目录下查找二进制文件。

-M <目录>:只在指定的目录下查找帮助文件。

-S <目录>:只在指定的目录下查找源码文件。

whereis 命令只在特定的目录中查找符合条件的文件,查找的文件类型会属于源码文件、

二进制文件或帮助文件。如果不指定目录,whereis 命令会在下列目录中查找。

/bin /etc /sbin

/usr/bin /usr/etc /usr/games

/usr/include /usr/lib /usr/local

/usr/man /usr/sbin /usr/src

/usr/local/bin /usr/local/etc /usr/local/games

/usr/local/lib /usr/local/man

下面看几个 whereis 命令的例子。

查找 grub 及其帮助文件所在的目录。

Linux 从初学到精通

120

[root@srv ~]# whereis grub grub: /sbin/grub /etc/grub.conf /usr/share/grub /usr/share/man/man8/grub.8.gz

查找 grub 帮助文件所在的目录。

[root@srv ~]# whereis -m grub grub: /usr/share/man/man8/grub.8.gz

4.4.4 find:查找文件或目录

find 命令用于查找文件或目录,该命令语法如下。

find [目录…] [-amin <分钟>] [-anewer <参数文件>] [-atime <24小时数>] [-cmin <分钟>] [-cnewer <参数文件>] [-ctime <24小时数>] [-depth] [-empty] [-exec <执行命令>] [-fls <列表文件>] [-follow] [-fstype <系统文件类型>] [-gid <组编号>] [-group <组名称>] [-nogroup] [-mmin <分钟>] [-mtime <24小时数>] [-name <查找内容>] [-nogroup] [-nouser] [-perm <权限数值>] [-size <文件大小>] [-uid <用户编号>] [-user <用户名称>] [-nouser]

常用指数:

常用选项:

目录…:查找指定目录的内容,如果不指定目录则查找当前目录。

-amin <分钟>:查找在指定时间曾被访问过的文件或目录,单位以分钟计算。如指

定为“10”,find 命令会查找刚好在 10 分钟之前被访问过的文件或目录;配置为

“+10”,find 命令会查找 10 分钟以前被访问过的文件或目录;配置为“-10”,find

命令会查找在 10 分钟以内被访问过的文件或目录。

-anewer <参数文件>:查找访问时间比指定文件或目录的访问时间更接近现在的文

件或目录。

-atime <24 小时数>:查找在指定时间曾访问过的文件或目录,单位以 24 小时计算。

如配置为 2,find 命令会查找刚好在 48 小时之前访问过的文件;配置为+2,find 命

令会查找超过在 48 小时之前访问过的文件;配置为-2,find 命令会查找在 48 小时

之内访问过的文件。

-cmin <分钟>:查找在指定时间曾被更改过权限属性的文件或目录,单位以分钟计算。

如指定为“10”,find 命令会查找刚好在 10 分钟之前被更改过权限属性的文件或目录;

配置为“+10”,find 命令会查找 10 分钟以前被更改过权限属性的文件或目录;配置

为“-10”,find 命令会查找在 10 分钟以内被更改过权限属性的文件或目录。

-cnewer <参数文件>:查找更改时间比指定文件或目录的访问时间更接近现在的文

件或目录。

-ctime <24 小时数>:查找在指定时间曾更改过权限属性的文件或目录,单位以 24

小时计算。比如配置为 2,find 命令会查找刚好在 48 小时之前更改过权限属性的文

件;配置为+2,find 命令会查找超过在 48 小时之前更改过权限属性的文件;配置为

-2,find 命令会查找在 48 小时之内更改过权限属性的文件。

-depth:从指定目录下 深层的子目录开始查找。

-empty:查找文件大小为 0 字节的文件,或目录下没有任何子目录或文件的空目录。

管好家产——Linux 目录及文件管理 第

121

4 -exec <执行命令>:对找到的文件或目录执行 Shell 命令。

-fls <列表文件>:把查找结果保存为指定的列表文件。

-follow:查找时排除符号链接文件。

-fstype <系统文件类型>:只查找该文件系统类型下的文件或目录。文件系统类型可

以是:“adfs”(Advanced Disk File System)、“affs”(Amiga Fast File System)、“hfs”

(Macintosh Filesystem)、“fat”(DOS File Allocation Table)、“msdos”、“umsdos”

(UNIX-Like MS-DOS)、“vfat”(Virtual File System)、“hpfs”(High Performace File

System)、“qnx4”(QNX filesystem)、“ext2”(Second Extended Filesystem)、“sysv”

(System V Filesystem)、“ufs”(UNIX File System)、“efs”(IRIX File System)。

-gid <组编号>:查找拥有组是符合指定用户组条件的文件或目录。如配置为 500,

find 命令会查找组编号为 500 的文件或目录;配置为+500,find 命令会查找组编号

大于 500 的文件或目录;配置为-500,find 命令会查找组编号小于 500 的文件或目

录。

-group <组名称>:查找拥有组是指定用户组的文件或目录,也能以组编号指定。

-nogroup:查找拥有组不是“/etc/group”文件中存在的用户组的文件或目录。

-mmin <分钟>:查找在指定时间曾被更改过内容的文件或目录,单位以分钟计算。

如指定为“10”,find 命令会查找刚好在 10 分钟之前被更改过内容的文件或目录;

配置为“+10”,find 命令会查找在 10 分钟以前被更改过内容的文件或目录;配置为

“-10”,find 命令会查找在 10 分钟以内被更改过内容的文件或目录。

-mtime <24 小时数>:查找在指定时间曾更改过内容的文件或目录,单位以 24 小时

计算。如配置为 2,find 命令会查找刚好在 48 小时之前更改过内容的文件;配置为

+2,find 命令会查找超过在 48 小时之前更改过内容的文件;配置为-2,find 命令

会查找在 48 小时之内更改过内容的文件。

-name <查找内容>:查找指定的内容,在查找内容中使用“*”表示任意个字符;使

用“?”表示任何一个字符。如查找内容为“tony*zhang”,locate 命令会查找所有以

“tony”开始并且以“zhang”结尾的文件和目录。但文件或目录名前面的“.”并不

会并处理,比如“*charles*”并不会找到“.charles”的内容。

-perm <权限数值>:查找符合指定权限数值(有关权限数值见第 6 章)的文件或目

录。如配置为“0700”,find 命令会查找权限数值正好是“0700”的文件或目录;配

置为“+0700”,find 命令会查找权限数值大于 “0700”的文件或目录;配置为“-0700”,

find 命令会查找权限数值小于“0700”的文件或目录。

-size <文件大小>:查找符合指定大小的文件。文件大小单位可以是“c”表示 Byte;

“k”表示 KB。如配置为“100k”,find 命令会查找文件大小正好 100KB 的文件;配

置为“+100k”,find 命令会查找文件大小大于 100KB 的文件;配置为“-100k”,

find 命令会查找文件大小小于 100KB 的文件。

-uid <用户编号>:查找所有者是符合指定用户条件的文件或目录。如配置为 500,

find 命令会查找用户编号为 500 的文件或目录;配置为+500,find 命令会查找用户

编号大于 500 的文件或目录;配置为-500,find 命令会查找用户编号小于 500 的文

Linux 从初学到精通

122

件或目录。

-user <用户名称>:查找所有者是指定用户的文件或目录,也能以用户编号指定。

-nouser:查找所有者不是“/etc/passwd”文件中存在的用户的文件或目录。

find 命令用于查找符合条件的文件或目录,但 find 命令并不像 local 命令只在数据库中查

找,也不像 which 和 whereis 命令只在特定的目录中查找,find 可以在本机任何目录实时地查

找,虽然 find 命令没有 local 命令执行速度快,但 find 在硬盘查找不会出现文件或目录已存

在但无法找到的情况。其中“-exec <执行命令>”选项可以对查找到的内容执行其他的 Shell

命令,格式如下,必须以“ \;”结尾,“{}”可以表示找到的内容。

find -exec <执行命令> \;

下面看几个 find 命令的例子。

列出当前目录下所有子目录及文件的名称。

[root@srv ~]# find ./.bash_history

查找当前目录及其子目录下以“D”开头的文件或目录。

[root@srv ~]# find -name D* Desktop

查找当前目录及其子目录下以“D”或“M”开头的文件或目录,“-o”表示前后两

个条件中满足一个就显示。

[root@srv ~]# find -name D* -o -name M* ./.MultiGet/MultiGet-1.1.2-linux.tar.gz.mgidx ./Desktop

查找“/share”目录及其子目录中文件系统为“vfat”并且名称为“jack.docx”的文件。

[root@srv ~]# find /share jack.docx -fstype vfat

查找“/share”目录及其子目录中文件系统不是“vfat”并且名称为“jack.docx”的

文件,“!”表示不能符合后面所指定的条件。

[root@srv ~]# find /share jack.docx ! -fstype vfat

查找根目录及其子目录中所有大于 10M 的文件。

[root@srv ~]# find / -size +10M

查找“/boot”目录及其子目录中所有以“.conf”结尾的文件,并把这些文件复制到

/tmp 目录。

[root@srv ~]# find /boot -name *.conf -exec cp {} /tmp \;

管好家产——Linux 目录及文件管理 第

123

4

压缩与归档命令

对于不经常使用的文件或在进行备份时,很多人都习惯先将这些文件进行压缩。在

Windows 中有非常多的压缩软件,如 WinRAR、WinZIP 等,Linux 中同样也提供了很多种方

法进行压缩。下面是在 Linux 中常用的一些与压缩相关的命令。

4.5.1 gzip:压缩文件

gzip 是 GNU zip 的缩写,gzip 是一个 GNU 自由软件的文件压缩程序。gzip 的作者是

Jean-loup Gailly 和 Mark Adler。1992 年 10 月 31 日第一次公开发布,版本号是 0.1。gzip 的基

础是 DEFLATE,DEFLATE 是 LZ77 与哈夫曼编码的一个组合体。DEFLATE 初是作为 LZW

及其他受专利保护的数据压缩算法的替代版本而设计的,当时那些专利限制了压缩及其他一

些流行的归档工具的应用。该命令语法如下。

gzip [-cdflNnqtvr] [-压缩比] [--bast|--fast] [-S <压缩字尾字符串>] 要压缩的文件

常用指数:

常用选项:

要压缩的文件:需要压缩的文件。

-c:把压缩后的文件输出到标准输出设备(有关标准输出设备见 9.2.6 ),不去改变

原始文件。默认情况下,gzip 会将文件直接压缩后加上“.gz”扩展名,而不保留原

来的文件。可以使用“>”等特殊字符将压缩后的结果导向一个新的文件。

-d:解开压缩文件。

-f:强行压缩文件,不管文件名或硬链接是否存在,以及该文件是否是符号链接。

如不使用该选项,则压缩后加上“.gz”扩展名的文件若存在,gzip 会一一询问用户,

确认是否要覆盖已有的文件。至于硬链接和符号链接,gzip 默认是不处理的,加上

该选项后,gzip 命令会读取该链接所指向的文件,并将其压缩。

-l:显示压缩文件的相关信息。

-N:压缩文件时,存储原来文件名称及时间,这也是 gzip 默认的。

-n:压缩文件时,不存储原来文件名称及时间,这也是 gzip 默认的。

-q:不显示警告信息。

-t:测试压缩文件是否正确。

-r:递归处理,将指定目录下所有文件及子目录一并处理。

-v:显示命令执行过程。

-压缩比:压缩比是一个介于 1~9 的数值,9 表示压缩比 大;1 表示压缩速度 快。

默认值为 6。

--bast:相当于“-9”。

Linux 从初学到精通

124

--fast:相当于“-1”。

--S <压缩字尾字符串>:更改压缩后文件的扩展名,gzip 默认的扩展名是“.gz”,可

以通过该选项指定其他扩展名。

gzip 是一个广泛使用的压缩程序,文件被压缩后,默认其文件名后会加上“.gz”,源文

件将被删除。下面看几个 gzip 命令的例子。

使用 gzip 压缩当前目录下的 install.log 文件。

[root@srv ~]# gzip install.log

被 gzip 压缩后,原文件就没有了,只保留了压缩文件。

[root@srv ~]# ll i* total 28 -rw-r--r-- 1 root root 7810 Jan 29 19:31 install.log.gz

使用 gzip 压缩当前目录下的 install.log.syslog 文件,使用“-c”和“>”可以给压缩

文件一个新的名称,而保留回来的文件。

[root@srv ~]# gzip -c install.log.syslog > install.log.syslog.gz [root@srv~]# ll i* total 32 -rw-r--r-- 1 root root 3738 Jan 29 19:30 install.log.syslog -rw-r--r-- 1 root root 915 Feb 7 12:05 install.log.syslog.gz

使用 gzip 解压当前目录下的 install.log.gz 文件。

[root@srv ~]# gzip -d install.log.gz

4.5.2 bzip2:压缩文件

bzip2 是 Julian Seward 开发的开源数据压缩算法及程序。 Julian Seward 在 1996 年 7 月

第一次公开发布了 bzip2 0.15 版,在随后几年中这个压缩工具稳定性得到改善并且日渐流行,

Julian Seward 在 2000 年晚些时候发布了 1.0 版。bzip2 比传统的 gzip 或 ZIP 的压缩效率更高,

但是 bzip2 的压缩速度较慢。与 RAR 或 ZIP 等其他不同的是,bzip2 只是一个数据压缩工具,

而不是归档工具,在这一点上 bzip2 与 gzip 类似。程序本身不包含用于多个文件、加密或者

文档切分的工具。该命令语法如下。

bzip2 [-cdfktvz] [-压缩比] 要压缩的文件

常用指数:

常用选项:

要压缩的文件:需要压缩的文件。

-c:将压缩与解压的结果送到标准输出设备(有关标准输出设备见 9.2.6 )。

-d:执行解压操作。

-f:bzip2 在压缩或解压时,如果输出文件与现有文件同名则不会覆盖,使用该选项

管好家产——Linux 目录及文件管理 第

125

4后则会覆盖。

-k:bzip2 在压缩或解压后,会删除源文件,如果使用该选项则会保留源文件。

-t:测试“.bz2”的完整性。

-v:显示执行过程。

-z:强制执行压缩。

-压缩比:压缩比是一个介于 1~9 的数值,9 表示压缩比 大;1 表示压缩速度 快。

bzip2 在压缩时如果不加任何选项,在压缩完成后会产生“.bz2”的压缩文件并删除源文

件。下面看几个 bzip2 命令的例子。

使用 bzip2 压缩当前目录下 install.log 文件。

[root@srv ~]# bzip2 install.log

使用 bzip2 解压当前目录下 install.log.bz2 文件。

[root@srv ~]# bzip2 -d install.log.bz2

4.5.3 tar:压缩备份

类 UNIX 操作系统上的打包工具,可以将多个文件合并为一个文件,打包后的文件扩展

名为“.tar”。tar 在打包时默认情况下并不进行压缩的 tar 文件,但是可以通过选项使其在打

包的同时进行压缩。该命令语法如下。

tar [-AchikmMOpPrstuwxzjv] [-f <备份文件>] [-K <文件>] [-T <范本文件>] [-L <媒体容量>] [-N <日期时间>] [-V <卷名称>] [-X <范本文件>] [--delete] [--ignore-failed-read] [--no-recursion] [--numeric-owner] [--owner=<用户名>] [-C <目录>] [文件或目录]

常用指数:

常用选项:

文件或目录:要打包的文件或目录。

-A:新增打包文件到已存在的打包文件之后。

-c:建立新的备份文件。

-h:不建立符号链接,直接复制该链接所指向的文件。

-i:忽略备份文件中的 0Byte 区块。

-k:解开打包文件时,不覆盖已存在的文件。

-m:解包文件和变更文件的读取时间。

-M:在建立、解开打包文件或列出其中内容时,采用多卷模式。

-O:把从打包文件里还原的文件输出到标准输出设备。

-p:用原来的文件权限还原文件。

-P:文件名使用绝对名称,不移除文件名前的“/”。

-r:新增文件到已存在的备份文件结尾部分。

-s:还原文件的顺序和打包文件内的存放顺序相同。

Linux 从初学到精通

126

-t:列出备份文件内容。

-u:仅置换备份文件内的文件更新的文件。

-w:处理每个文件时,均要求用户确认。

-x:从备份文件中还原文件。

-z:通过 gzip 命令处理备份文件。

-j:通过 bzip2 命令处理备份文件。

-v:显示执行过程。

-f <备份文件>:指定备份文件。

-K <文件>:从指定的文件开始备份。

-T <范本文件>:指定范本文件,其内含有一个或多个范本样式,让 tar 解开或建立

符合设定条件的文件。

-L <媒体容量>:指定存储媒体的容量,单位以 1024Bytes 计算。如容量为 1000,则

能够存放的空间为 1024000Bytes。

-N <日期时间>:只将较指定日期更新的文件存储到备份文件中。

-V <卷名称>:建立使用指定的卷名称的备份文件。

-X <范本文件>:指定范本文件,其内含有一个或多个范本样式,让 tar 排除符合条

件的文件。

-C <目录>:指定解包的目录。

--delete:从备份文件中删除指定的文件。

--ignore-failed-read:忽略数据读取错误,不中断程序的执行。

--no-recursion:不做递归处理,也就是指定目录下的所有文件及目录不予处理。

--numeric-owner:以用户编号及组编号取代用户名及组名称。

--owner=<用户名>:把加入备份文件的所有者改为指定用户。

在使用 tar 命令时,使用“z”或“j”参数可以对打包的文件进行 gzip 或 bzip2 的压缩,

一般使用 gzip 压缩后文件的扩展名为“.tar.gz”或“.tgz”;使用 bzip2 压缩后文件的扩展名为

“.tar.bz2”或“.tbz”。如果在使用 tar 命令时使用了“f”参数指定文件名时,该参数必须出现

在所有参数的 后面。下面看几个 tar 命令的例子。

将/boot 目录打包并使用 gzip 方式压缩,打包后文件名为 boot.tar.gz。

[root@srv ~]# tar -cvzf boot.tar.gz /boot

将/boot 目录打包并使用 bzip2 方式压缩,打包后文件名为 boot.tar.bz2。

[root@srv ~]# tar -cvjf boot.tar.bz2 /boot

将 boot.tar.gz 文件解压到当前目录。

[root@srv ~]# tar -xvzf boot.tar.gz

将 boot.tar.bz2 文件解压到当前目录。

[root@srv ~]# tar -xvjf boot.tar.bz2

管好家产——Linux 目录及文件管理 第

127

4

4.5.4 zip/uzip:ZIP 文件压缩与解压

ZIP 文件格式是一种流行的数据压缩和文档储存的文件格式,原名 Deflate,发明者为菲

尔·卡茨(Phil Katz),他于 1989 年 1 月公布了该格式的资料。ZIP 通常使用后 名“.zip”,

ZIP 文件格式的 MIME 格式为“application/zip”。目前 ZIP 格式属于几种主流的压缩格式之一,

其竞争者包括 RAR 格式及开放源码的 7-Zip 格式。从性能上比较,RAR 及 7-Zip 格式较 ZIP

格式压缩率较高,而7-Zip由于提供了免费的压缩工具而逐渐在更多的领域得到应用。在Linux

中使用 zip 命令压缩文件;使用 unzip 解压文件,该命令语法如下。

zip [-AcdDfFgjJmoqrTuvXyz] [-b <工作目录>] [-i <范本样式>] [-x <范本样式>] [-n <字尾字符

串>] [-压缩比] [压缩文件] [文件…]

常用指数:

常用选项:

文件…:需要处理的文件。

压缩文件:需要压缩的文件。

-A:调整可执行的自动解压文件。

-c:替每个被压缩的文件加上注释,zip 会显示提示符号一一访问用户,不加注释的

文件可以按回车键略过。

-d:从压缩文件内删除指定的文件。

-D:压缩文件内不建立目录名称。默认 zip 命令会在压缩文件内单独建立目录的名称。

-f:此参数与“-u”参数类似,但不仅更新已有的文件,如果某些文件原本不存在于

压缩文件内,使用该参数会一并将其加入压缩文件中。

-F:尝试修复已损坏的压缩文件。

-g:将文件压缩后附加在已有的压缩文件之后,而非另行建立新压缩文件。如果附

加操作失败,zip 会尝试恢复原先的压缩文件,此参数一旦失败,则该压缩文件将无

法使用。

-j:只存储文件名及其内容,而不存放任何目录名称。默认 zip 命令会存储文件与当

前目录的相对路径名称。

-J:删除在压缩文件前面不必要的数据,如自动解压文件的文件头。

-m:将文件压缩并加入压缩文件后,删除原始文件。

-o:以压缩文件内拥有 新修改时间的文件为准,将压缩文件的修改时间设置成和

该文件一样。

-q:不显示命令执行过程。

-r:递归处理,将指定目录下的所有文件及子目录一并处理。

-T:检查备份内每个文件是否正确无误。

-u:更换较新的文件到压缩文件内。利用该参数可以把较新的文件(以修改时间为

准)压缩后,加入压缩文件中,替换原本压缩文件里较旧的文件。

-v:显示命令执行过程。

Linux 从初学到精通

128

-X:不存储额外的文件属性,如所有者和拥有组。

-y:直接存储符号链接,而非该链接所指向的文件。

-z:替压缩文件加上注释,zip 会显示提示符号询问用户,在注释 后输入“EOF”

控制字符(或按【Ctrl+D】组合键)即可。

-b <工作目录>:指定暂时存放文件的目录。

-i <范本样式>:只压缩符合条件的文件,用户可以配置范本文件,让 zip 只压缩符

合指定条件的文件。

-x <范本样式>:排除符合条件的文件,用户可以配置范本文件,让 zip 压缩时排除

符合指定条件的文件。

-n <字尾字符串>:不压缩具有特定字尾的文件,某些文件已经过特殊编码大幅缩减

文件大小,如 GIF 文件、JPEG 文件,再使用 zip 对其压缩几乎没有任何效果,使用

本参数能指定这类文件的字尾字符串,两个之间用“:”分隔,如“.gif:.jpg”。

-压缩比:压缩比是一个介于 1~9 的数值,9 表示压缩比 大;1 表示压缩速度 快。

默认值为 6。

unzip [-cflptuvzabCMnoqX] [.zip文件] [文件] [-d <目录>] [-x <文件>] [-P <密码>]

常用指数:

常用选项:

.zip 文件:指定“.zip”压缩文件。

文件:指定要处理“.zip”压缩文件中的哪些文件。

-c:将解压的结果显示在屏幕上,并对字符做适当的转换。

-f:更新现有的文件。unzip 会检查压缩文件中有哪些文件与当前目录中的文件重复,

如果压缩文件中的文件较新,则解压这些较新的文件到目录中,覆盖目录中较旧的

文件。

-l:显示压缩文件内包含的文件。

-p:与“-c”参数类似,会将解压的结果显示到屏幕上,但不会执行任何转换。

-t:检查压缩文件是否正确。

-u:与“-f”参数类似,但是除了更新现有文件外,也会将压缩文件中的其他文件解

压到目录中。

-v:执行时显示详细信息。

-z:仅显示压缩的备注文件。

-a:对文本文件进行必要的字符转换。

-b:不对文本文件进行必要的字符转换。

-C:压缩文件中的文件名区分大小写。

-M:将输入结果送到 more 程序处理(有关 more 见 4.6)。

-n:解压时不要覆盖原有文件。

-o:不必先询问用户,unzip 直接覆盖原有文件。

管好家产——Linux 目录及文件管理 第

129

4 -q:执行时不显示任何信息。

-X:解压的同时回收文件原来的 UID、GID(有关 UID、GID 见第 5 章 )。

-d <目录>:指定文件解压后要存储的目录,默认为当前目录。

-x <文件>:指定不要处理“.zip”文件中的哪些文件。

-P <密码>:使用 zip 的密码选项。

在 Linux 中 zip/unzip 这两个命令可以实现“.zip”文件的创建和解压,下面看几个 zip/unzip

命令的例子。

将当前目录 jack.docx 压缩成 jackbak.zip 文件。

[root@srv ~]# zip jackbak jack.docx adding: jack.docx (deflated 100%)

将当前目录下的 doc 目录及其下的所有文件和子目录压缩成 docbak.zip 文件。

[root@srv ~]# zip -r docbak doc/ adding: doc/ (stored 0%) adding: doc/jack.docx (deflated 100%) adding: doc/house.xlsx (deflated 100%)

将 doc.zip 文件的所有内容解压到当前目录。

[root@srv ~]# unzip doc.zip Archive: doc.zip creating: doc/ inflating: doc/jack.docx inflating: doc/house.xlsx

4.5.5 rar/unrar:RAR 文件压缩与解压

RAR(RAR 官方网站:http://www.rarlab.com/)是一种专利文件格式,用于数据压缩与

归档打包,开发者尤金·罗谢尔(Eugene Roshal),所以 RAR 的全名是:Roshal ARchive。

首个公开版本 RAR 1.3 发布于 1993 年。尤金·罗谢尔毕业于俄罗斯车里雅宾斯克工业大学

(Chelyabinsk Technical University),也是 FAR 文件管理器的作者。他开发程序压缩/解压 RAR

文件, 初用于 DOS,后来移植到其他平台。主要的 Windows 版本编码器,称为 WinRAR,

以共享软件的形式发行。不过 Roshal 公开了解码器源码,UnRAR 解码器许可证允许有条件

自由发布与修改(条件:不许发布编译 RAR 兼容编码器),而 RAR 编码器一直是有专利的。

在 RHEL 5.x 中并没有提供 RAR 文件的压缩与解压功能,所以必须先使用安装 RAR 工具,

具体操作步骤如下。

下载 rar for Linux。

[root@srv ~]# wget http://www.rarlab.com/rar/rarlinux-3.8.0.tar.gz

将 rar for Linux 解包到“/usr/local”目录。

[root@srv ~]# tar -zxvf rarlinux-3.9.2b1.tar.gz -C /usr/local

为了使用方便建立 rar/unrar 的符号链接。

Linux 从初学到精通

130

[root@srv ~]# ln -s /usr/local/rar/rar /usr/local/bin/rar [root@srv ~]# ln -s /usr/local/rar/unrar /usr/local/bin/unrar

使用 YUM 方式安装“glibc”(在使用 YUM 前需配置 YUM 源,方法见 8.3 ,也可

以见使用 3.1.7 中的方法配置后,再学习 8.3 )。

[root@srv ~]# yum -y install glibc

在 Linux 中使用 rar 命令压缩文件;使用 unrar 解压文件,该命令语法如下。

rar <命令> [<选项…>] 压缩文件 [文件...] [<解压缩路径>]

常用指数:

常用选项:

文件:要压缩的文件。

压缩文件:需要压缩或解压的文件。

解压缩路径:解压文件到指定目录。

命令:执行 rar 命令时所做的操作。

选项:执行 rar 命令时操作的选项。

命令包括以下几个:

a:添加文件到压缩文件。

c:添加压缩文件注释,注释的大小 大不能超过 62000 字节。

cf:添加文件备注。

ch:改变压缩文件参数。

cw:向指定文件写入文件备注。

d:从文件中删除文件。

e:解压缩文件到当前目录,不创建任何子目录。

f:刷新压缩文件中的文件,更新这些文件自被打包之后产生的变化,不在压缩文件

中增加新的文件。

x:解压缩到完整路径。

选项包括以下几个:

-df:压缩后删除原文件。

-hp <密码>:加密文件数据和文件头部。

-m <0..5>:设置压缩等级,0 表示存储,5 表示压缩 大,默认为 3。

-r:对子目录进行递归操作。

-sfx [名称]:创建 SFX 档案。

-v <大小>[k,b]:指定分卷压缩文件的大小。

-y:设定所有回答为 yes。

unrar 的命令和 rar 具有同样的功能,而且 unrar 只包含了 rar 的一部分命令,因此使用 rar

管好家产——Linux 目录及文件管理 第

131

4就可以完成所有操作。下面看几个 unrar 命令的例子。

将当前目录的 jack.docx 文件压缩成 jackbak.rar 文件。

[root@srv ~]# rar a jackbak.rar jack.docx RAR 3.80 Copyright (c) 1993-2008 Alexander Roshal 16 Sep 2008 Shareware version Type RAR -? for help Evaluation copy. Please register. Creating archive jackbak.rar Adding jack.docx OK Done

将当前目录下的 doc 目录及其下的所有文件和子目录压缩成 docbak.rar 文件。

[root@srv ~]# rar a -r docbak.rar doc RAR 3.80 Copyright (c) 1993-2008 Alexander Roshal 16 Sep 2008 Shareware version Type RAR -? for help Evaluation copy. Please register. Updating archive docbak.rar Adding doc/jack.docx OK Adding doc/renee.xlsx OK Adding doc OK Done

将 docbak.rar 文件的所有内容解压到当前目录。

[root@srv ~]# rar x docbak.rar RAR 3.80 Copyright (c) 1993-2008 Alexander Roshal 16 Sep 2008 Shareware version Type RAR -? for help Extracting from docbak.rar Extracting jack.docx OK Creating doc OK Extracting doc/jack.docx OK Extracting doc/renee.xlsx OK All OK

4.5.6 7-Zip:7z 文件压缩与解密

7-Zip(7-Zip 官方网站:http://www.7-zip.org/)是一个开源的数据压缩程序,主要用在

Windows、类 UNIX 操作系统。7-Zip 主体在 GNU LGPL 下发布,加密部分使用 AES 的代码,

使用 BSD License 发布,解压 RAR 部分使用 RAR 特定的许可协议。7-Zip 默认的格式是其自

行开发的 7z 格式,扩展名为“.7z”。7z 格式包含多种算法, 常使用的就是 Bzip2 及 Igor Pavlov

开发的 LZMA。LZMA 算法比起其他常见的传统压缩算法,如 Zip、RAR 来说相对较新,压

缩率也比较高。7z 格式本地的使用 Unicode 来存储文件名称,可以避免不同系统间压缩解压

乱码的问题。7-Zip 支持众多的压缩/未压缩的文件格式,如 ZIP、CAB、RAR、ARJ、Z、gzip、

bzip2、LLHA、tar、cpio、rpm。从 4.42 版开始支持 CD/DVD 镜像格式 ISO,另外因为授权

问题,不再支持 ACE 格式。

7-Zip 也是目前 普及的开放源代码压缩程序。在 RHEL 5.x 中并没有提供 7-Zip 文件的

压缩与解压功能,所在必须先使用安装 7-Zip 工具,具体操作步骤如下。

下载 7-Zip for Linux。

Linux 从初学到精通

132

[root@srv ~]# wget ftp://rpmfind.net/linux/dag/redhat/el5/en/i386/dag/RPMS/p7zip-4.61-1.el5.rf.i386.rpm

安装 7-Zip 工具。

[root@srv ~]# rpm -ivh /p7zip-4.61-1.el5.rf.i386.rpm

在 Linux 中使用 7za 命令压缩/解压“.7z”文件,该命令语法如下。

7za <命令> [<选项>...] 压缩文件 [<参数变量>...]

常用指数:

常用选项:

压缩文件:需要压缩或解压的文件。

命令:执行 7za 命令时所做的操作。

选项:执行 7za 命令时操作的选项。

<命令>包括以下几个:

a:添加文件到压缩文件。

d:从压缩文件删除文件。

e:从压缩文件中释放文件到当前目录中,或者通过“-o”选项指定目录。该命令会

将所有被释放的文件放置到一个文件夹。如果想使用完整路径释放文件,用户必须

使用 “x”命令。7-Zip 在覆盖现有文件时会提示用户如何进行下一步操作,除非用

户自定义了“-y”选项。7-Zip 所支持的回应包括:“y”是、“n”否、“a”将所有的

询问以 YES 来对待、“s”将所有的询问以 NO 来对待、“q”退出程序。

l:列出压缩文件内容。

t:测试压缩文件文件的完整性。

u 在压缩文件中使用较新的文件替换掉较旧的文件。

x:在当前目录中,使用完整路径从压缩档案中释放文件,或者通过“-o”选项指定

目录。

<选项>包括以下几个:

--:在命令行中使“--”后的选项开关“-”都失效。这样就允许在命令行中使用文件

名以“-”开头的文件。

-ai [<r[-|0]>] <@{listfile}|!{wildcard}>:指定附加文件,包括压缩档案文件名及通配

符。此选项可同时附加多个类型。“<r[-|0]>”指定通配符及文件名,该选项在这里

必须使用。如果此选项未被指定,那么将自动使用递归(有关递归参见“-r”选项)。

<@{listfile} | !{wildcard}>指定要处理的文件的文件名、通配符或文件列表。{listfile}

指定文件列表的文件名;{wildcard}指定通配符或文件名。

-ao[a|s|u]:指定在释放期间如何覆盖硬盘上现有的同名文件。“-aoa”表示直接覆盖

现有文件而没有任何提示;“-aos”表示跳过现有文件,其不会被覆盖;“-aou”表示

管好家产——Linux 目录及文件管理 第

133

4如果相同文件名的文件已存在,将自动重命名被释放的文件,如“charles.docx”将

被自动重命名为“charles_1.docx”;“-aot”表示如果相同文件名的文件已存在,将

自动重命名现有的文件。

-ax [<r[-|0]>] <@{listfile}|!{wildcard}>:排除文件名。

-i [<r[-|0]>] <@{listfile}|!{wildcard}>:指定附加文件或一类文件。

-o:指定释放文件的输出文件夹,该选项只能和释放命令配合使用。

-p:设置密码。

-r[-|0]:把命令行中的通配符及文件名以指定的方法对待。“-r”表示开启递归子目

录,对于 e、l、t、x 这些操作命令,会默认使用此选项;“-r-”表示关闭递归子目录,

对于 a、d、u 等所有需扫描磁盘文件的命令,会默认使用此选项;“-r0”表示开启

递归子目录。但只应用于通配符。

-t{压缩类型}:指定压缩文件格式,可以是:zip、7z、rar、cab、gzip、bzip2、tar,

默认值是 7z 格式。

-v{大小}[b|k|m|g]:指定分卷大小,可以使用字节、KB、MB、GB(1 GB = 1024 MB)。

可以同时指定多个“-v”选项。

-w:为文件压缩设置临时的工作目录。

-x [<r[-|0]>] <@{listfile}|!{wildcard}>:指定某一文件或某一类文件从操作中排除。

-y:使 7-Zip 执行命令时的大多数提示选择同意。

在“-i”、“-ai”、“-x”、“-ax”都可以通过{listfile}指定文件列表文件名;{wildcard}指定

通配符或文件名。文件列表文件名可以对要操作的文件进行批量操作,在文件中的文件名必

须用空格或另起一行隔开,如使用空格隔开,每一个文件必须加引号,如建立一个“lf.txt”

的文件内容如下则表示要操作的文件为“/My doc”目录中所有扩展名为“docx”的文件和

“/media”目录下所有扩展名为“mp3”的文件。7-Zip 支持和 Windows 相类似的通配符:“*”

表示任意个字符;“?”表示任何一个字符。

"/My doc/*.docx" /media/*.mp3

下面看几个 7-Zip 命令的例子。

将“/boot”下所有内容以 ZIP 格式压缩为“bootbak.zip”文件。

[root@srv ~]# 7za a -tzip -r bootbak.zip /boot/*

将“/etc”下所有内容以 7z 格式压缩为“charles.7z”文件,并对其进行分卷,第一

个分卷为 10MB,第二个为 15MB,剩下全部为 20 MB。

[root@srv ~]# 7za a charles.7z -r /etc -v10m -v15m -v20m

从压缩文件“bootbak.zip”中释放所有文件到当前目录。

[root@srv ~]# 7za x bootbak.zip

从压缩文件“bootbak.zip”中释放所有扩展名为“*.conf”的文件到“/root”目录。

Linux 从初学到精通

134

[root@srv ~]# 7za x bootbak.zip -r -o/root *.conf

文本查看命令

Linux 大部分配置都是通过修改配置文件实现,Linux 中的日志也是文本格式,所以在使

用 Linux 过程中经常需要查看文本文件,Linux 提供了很多用于文本文件查看的命令,下面

是在 Linux 中常用的一些与文本查看相关的命令。在这些文本查看的命令中需要查找的文件

名并不是一个必需的参数,因为在 Linux 中可以通过管道(有关管道见 9.2.6 )使这些命令

用于显示其他一些命令的输出结果。

4.6.1 cat:显示文件内容

cat 命令用于显示文件内容,该命令语法如下。

cat [-bEsT] [文件…]

常用指数:

常用选项:

文件…:要显示的文件。

-b:显示文件内容时,在所有非空白行的开头标上编号,编号从 1 开始依次累加。

-E:在每一行的 后标上“$”。

-s:当内容某部分的空白行超过一行时,则该处只以一行空白行表示。

-T:将制表符(Tab)以“^I”显示。

cat 命令会读取指定文件的内容,并输出到标准输出设备。下面看几个 cat 命令的例子。

显示“/etc/rc.d/rc.local”文件内容。

[root@srv ~]# cat /etc/rc.d/rc.local #!/bin/sh # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff. touch /var/lock/subsys/local

管好家产——Linux 目录及文件管理 第

135

4

在 Linux 中还有一个 tac 命令,也是用于显示文件内容,但该命令是从文件的最后一

行开始显示。

4.6.2 head:显示文件内容的最前部分

head 命令用于显示文件内容的 前部分,该命令语法如下。

head [-qv] [-c <显示数目>] [-[n] <显示行数>] [文件…]

常用指数:

常用选项:

文件…:要显示的文件。

-q:不显示文件名称。

-v:显示文件名称。

-c <显示数目>:指定要显示多少数据,单位以 Byte 计算,也可以在指定的数字后

面加上 b、k 和 m。

-n <显示行数>:设置要显示多少行内容。也可以通过“+”号表示从指定的行数开

始显示,如“+10”表示从该文件的第 10 行开始显示,直到文件结束。

head 命令会读取指定的文件内容,并将其内容 前的部分输入到标准输出设备。如不通

过“-n”指定行数,默认将显示 前的 10 行。下面看几个 head 命令的例子。

显示“/etc/fstab”文件前 2 行的内容。

[root@srv ~]# head - 2 /etc/fstab LABEL=/ / ext3 defaults 1 1 LABEL=/tmp /tmp ext3 defaults 1 2

4.6.3 tail:显示文件内容的末尾部分

tail 命令用于显示文件内容的末尾部分,该命令语法如下。

tail [-fqv] [-c <显示数目>] [-[n] <显示行数>] [文件…]

常用指数:

常用选项:

文件…:要显示的文件。

-q:不显示文件名称。

-v:显示文件名称。

-c <显示数目>:指定要显示多少数据,单位以 Byte 计算,也可以在指定的数字后

面加上 b、k 和 m。

提 示

Linux 从初学到精通

136

-n <显示行数>:设置要显示多少行内容。也可以通过“+”号表示从指定的行数开

始显示,如“+10”表示从该文件的倒数第 10 行开始显示,直到文件结束。

tail 命令会读取指定的文件内容,并将其内容末尾的部分输入到标准输出设备。如不通

过“-n”指定行数,默认将显示末尾的 10 行。tail 命令是一个经常会被用到的命令,很多时

候在查看 Linux 日志时会使用到该命令。下面看几个 tail 命令的例子。

显示“/var/log/messages” 后 3 行的内容。

[root@srv ~]# tail -3 /var/log/messages Feb 10 01:12:05 srv tpvmlpd[4017]: device type not supported Feb 10 01:12:20 srv tpvmlpd[4018]: device type not supported Feb 10 01:12:20 srv tpvmlpd[2695]: aborting

4.6.4 more:逐页显示文件内容

more 命令用于逐页显示文件内容,该命令语法如下。

more [-dfpsu] [-<行数>] [+/<字符串>] [+<行数>] [文件…]

常用指数:

常用选项:

文件…:要显示的文件。

-d:在下方显示“Press space to continue,’q’ to quite.”,用户如果按错键,则会显示

“Press ‘h’ for instructions.”。

-f:在计算行数时,以实际的行数来计算,而不是使用自动换行后的行数。

-p:在显示每页内容时,不采用滚动画面的方式,而是先将屏幕清空后再显示该页

内容。

-s:如果出现连接的空白行,则将其合并为一行。

-u:在有些文本文件中,有的字符有下画线,使用该选项则不显示下画线。

-<行数>:指定每次要求显示的行数。

+/<字符串>:在文件中查找指定的字符串,然后显示字符中所在页的内容。

+<行数>:从指定的行数开始显示。

more 命令可以将文件内容显示在屏幕上,每次显示一页内容。当使用 more 命令时,会

进入 more 命令浏览模式,在 下方会显示当前所在位置是各文件的百分比(如下所示)。可

以通过回车键向下逐滚动;空格键向上翻一屏幕;“b”键向下翻一屏幕;“q”键退出。

[root@srv ~]# more /var/log/messages Feb 10 02:24:21 srv gpm[3319]: Started gpm successfully. Entered daemon mode. Feb 10 02:24:22 srv tpvmlpd[3348]: device type not supported Feb 10 02:24:24 srv avahi-daemon[3409]: Found user 'avahi' (UID 70) and group 'avahi'

(GID 70). detected, consider installing nss-mdns! --More--(80%)

管好家产——Linux 目录及文件管理 第

137

4

4.6.5 less:逐页显示文件内容

less 命令用于逐页显示文件内容,该命令语法如下。

less [-dfgGiImMnNrsS] [-y <前卷行数>] [-z <显示行数>] [-p <范本样式>] [-O <输出文件>] [-o <输出文件>] [-j <行数编号>] [-h <回卷行数>] [文件…]

常用指数:

常用选项:

文件…:要显示的文件。

-d:忽略错误信息。

-f:强制开启特殊文件,所谓特殊文件是指外围设备文件、目录或二进制文件。

-g:只反白显示当前符合查找条件的字符串。通常 less 会反白显示所有符合查找条

件的字符串。

-G:不反白显示当前符合查找条件的字符串。

-i:在查找时忽略字符大小字差别。

-I:与“-i”选项效果类似,但就算查找的内容是大小写字符混杂也一概忽略。

-m:在屏幕下面使用与 more 命令类似的百分比模式。

-M:与“-m”选项效果类似,还会显示当前所有行及总行数。

-n:忽略行数编号。

-N:显示行数编号。

-r:显示控制字符。

-s:当内容某部分空白行超过一行时,则该处仅以一行表示。

-S:当某列内容超过显示画面的宽度时,直接将超出的部分去掉。

-y <前卷行数>:设置 大前卷行数。

-z <显示行数>:改变画面显示行数,默认值视终端类型而定。如果所指定的显示行

数为负数,如“-8”,而终端原本可以显示 30 行,则 less 命令将使用 22 行来显示。

-p <范本样式>:从指定的范本样式处开始显示。

-o <输出文件>:将 less 命令读入的数据输入成文件存储。当指定的文件存在时会询

问用户是否覆盖。该选项只适用于从管道导入的数据。

-O <输出文件>:与“-o”选项效果类似,但当指定的文件存在时不会询问用户是否

覆盖。

-j <行数编号>:设置目标行的行号,如设置为 12 时,则要查找的字符串从画面上第

13 行开始。

-h <回卷行数>:设置 大回卷行数,如果超过该行数将会重新刷新画面。

less 命令与 more 命令类似,但 less 命令功能更强大。在很多时候必须使用 less 命令,如

管道。当使用 less 命令时,会进入 less 命令浏览模式。可以通过回车键向下逐步滚动;空格

键向上翻一屏幕;“b”键向下翻一屏幕;“q”键退出;“/<字符串>”键向下查找指定内容;

Linux 从初学到精通

138

“?<字符串>”键向上查找指定内容;“n”键继续查找下一个。

[root@srv ~]# ll /etc | less total 3408 drwxr-x--- 3 root root 4096 Jan 29 19:16 audisp drwxr-x--- 2 root root 4096 Jan 29 19:16 audit -rw-r--r-- 1 root root 0 Jan 29 19:16 cron.deny drwxr-xr-x 2 root root 4096 Jul 15 2006 cron.hourly :

4.6.6 grep:查找并显示符合条件的内容

grep 命令用于查找并显示符合条件内容,该命令语法如下。

grep [-aciInqvwxE] [-显示行数] [-e <范本样式>] [-f <范本文件>] [-d <进行操作>] [范本样式] [文件或目录…]

常用指数:

常用选项:

文件或目录…:要显示的文件或文件所在的目录。

范本样式:要查找的内容。

-显示行数:除了显示符合范本样式的行之外,还显示该行前后指定的行数。如指定

为 5,表示会显示该行往前及往后各 5 行的内容。

-a:将二进制文件以文本文件查找。

-c:计算符合范本样式的行数。使用本选项将不会显示合乎条件行的内容,而会显

示每个文件里共有几行符合范本样式。

-i:忽略字符大小写区别,包括范本样式和指定要查找的文件名称。

-I:列出文件内容符合指定范本样式的文件名。

-n:在显示符合范本样式的行之前,标示出该行的行数。

-q:不显示任何信息。

-v:反向查找。如指定查找内容为“charles”,使用了该选项后,会显示文件中不包

括“charles”的内容。

-w:只显示全字符合的行,如查找“charles”,原本只需要包括这个字符串就会显示,

但使用了该选项后,必须是全字符合的内容,也就是说“charles”必须是完整的单

词。

-x:只显示完全符合的行,如查找“charles”,原本只需要包括这个字符串就会显示,

但使用了该选项后,必须完全满足要查找的内容,也就是说“charles”必须是单独

的一行才会显示。

-E:默认情况下,grep 命令只支持基本的正则表达式,该选项使 grep 命令支持扩展

正则表达式。

-e <范本样式>:指定字符串作为寻找文件内容的范本样式。该选项与直接指定范本

样式并无不同,但对于以“-”为首的指定字符串来说,可以有效避免与选项混淆,

管好家产——Linux 目录及文件管理 第

139

4导致 grep 命令发生错误。

-f <范本文件>:指定范本文件,其中含有一个或多个范本样式,让 grep 命令查找符

合范本条件的内容。指定的范本文件格式为每行一个范本样式。

-d <进行操作>:当指定要查找的是目录而非文件时,必须使用该选项,否则 grep

命令将返回信息并停止操作。有 3 个进行操作可以设定:“read”默认值,表示 grep

命令会把目录当做一般文件进行查找字符串;“recures”递归处理,表示将该目录下

的所有文件及子目录一并处理;“skip”表示略过该目录不进行处理。

grep 命令用于查找内容包含指定范本样式的文件,如果发现某文件的内容符合所指定的

范本样式,默认 grep 命令会把含有范本样式的那一行显示出来。grep 命令是一个非常有用的

使用,经常被使用在那些只需要显示大量文本中符合条件内容的时候,该命令也经常配合管

道对某些命令的输入结果进行过滤。下面看几个 grep 命令的例子。

显示/etc/fstab 文件中包含字符串“ext3”的行。

[root@srv ~]# grep ext3 /etc/fstab

对目录“/doc”中所有扩展名为“.txt”的文件内容中寻找并显示包含字符串“charles”

的行,查找时不区分大小写。

[root@srv ~]# grep -I charles /doc/*.txt

在当前目录中,查找包含字符串“charles”的文件,在查找过程中遇到子目录时,

并不查找此目录中的文件。

[root@srv ~]# grep -d skip charles *

在使用 grep 命令时除了可以使用一般的范本样式外,还可以使用正则表达式,下面看几

个 grep 命令使用正则表达式的例子。

在当前目录的“charles.txt”文件中显示所有以小写字母开头的行,并显示其行号。

[root@srv ~]# grep -n "^[a-z]" charles.txt

在当前目录的“charles.txt”文件中显示所有非空行,并显示其行号。

[root@srv ~]# grep -nv "^$" charles.txt

在当前目录的“charles.txt”文件中显示所有以“/.$”(“\”是一个转义符)结尾的

行,并显示其行号。

[root@srv ~]# grep -n "\.$" charles.txt

在当前目录的“charles.txt”文件中显示所有以“g”开头,中间两个任意字符,以

“d”结尾的行,并显示其行号。

[root@srv ~]# grep -n "g..d" charles.txt

在当前目录的“charles.txt”文件中显示所有连续 3 个 a 的行,并显示其行号。

[root@srv ~]# grep -n "a\{3\}" charles.txt

Linux 从初学到精通

140

在当前目录的“charles.txt”文件中显示所有包含一个以“g”开头、以“d”结尾,

在“g”和“d”之间包括一个以上“o”的单词的行,并显示其行号。

[root@srv ~]# grep -E -n "go+d" charles.txt

在当前目录的“charles.txt”文件中显示所有包含一个以“g”开头、以“d”结尾,

在“g”和“d”之间包括有空的或一个“o”的单词的行,并显示其行号。

[root@srv ~]# grep -E -n "go?d" charles.txt

在当前目录的“charles.txt”文件中显示所有包含一个“gd”或“good”单词的行,

并显示其行号。

[root@srv ~]# grep -E -n "gd|good" charles.txt

在当前目录的“charles.txt”文件中显示所有包含一个以“A”开头、以“C”结尾,

在“A”和“C”之间包括一个以上“xyz”的单词的行,并显示其行号。

[root@srv ~]# grep -E -n "A(xyz)+C" charles.txt

在当前目录的“charles.txt”文件中显示包含“jack”或“house”的行,其中“|”表

示或者的意思。

[root@srv ~]# grep -E "jack|house" charles.txt

如果在使用 grep 命令时,要查找的内容中包括一些特殊字符,如“$”、“.”、“'”、

“"”、“*”、“[”、“]”、“^”、“|”、“\”、“+”、“?”、“,”时,默认情况下会

造成 grep 命令无法执行或查找的内容不对,这时就需要对这些字符使用“\”进行转义,让

grep 命令知道这是要查找的内容而不是一个特殊字符。在下面的例子中就是显示“charles.txt”

文件中包括“Charles.Logan”的行。

[root@srv ~]# grep "Charles\.Logan" charles.txt

grep 允许使用国际字符模式匹配或匹配模式的类名形式。类名形式包括:“[[:upper:]]”

等同于“[A-Z]”、“[[:lower:]]”等同于“[a-z]”、“[[:digit:]]”等同于“[0-9]”、“[[:alnum:]]”等

同于“[0-9 A-Z a-z]”、“[[:space:]]”等同于空格或 Tab 键、“[[:alpha:]]”等同于“[a-zA-Z]”。

在下面的例子中就是显示“charles.txt”文件中以“Charles”开头,后面接一个大写字母的行。

[root@srv ~]# grep "Charles[[:upper:]]" charles.txt

在 Linux 中有一个“egrep”命令,该命令相当于“grep -E”的别名。如果希望使用扩

展正则表达时,也可以使用“egrep”命令。

实验任务

在一台安装了 RHEL 5.x 的计算机上完成以下任务。

提 示

管好家产——Linux 目录及文件管理 第

141

4(1)查看当前路径。

(2)查看当前目录下的所有文件,包括隐藏文件。

(3)查看根目录的目录结构。

(4)在当前用户家目录下建立一个名为“tmp”的目录。

(5)在“tmp”目录下通过一个命令建立“test/subtest”目录。

(6)为“tmp”目录在根目录下建立一个符号链接。

(7)复制“/etc/rc.d/rc.local”文件到“tmp”目录下的“test”目录中。

(8)将上一步复制后的文件改名为“test.file”。

(9)查看“test.file”的内容。

(10)分页查看“/var/log/message”文件。

(11)删除“tmp/test”目录下的“subtest”目录。

(12)通过 bzip2 文件将“tmp”目录打包。

本章测试

(1)下面( )命令可以分屏显示“/var/log/message”的内容。

A.cat B. file

C.grep D. less

(2)下面( )相对目录引用。

A... B.~

C./home D./etc

(3)下面( )命令解压“httpd-2.2.14.tar.bz2”文件。

A.tar -xvfj httpd-2.2.14.tar.bz2 B.tar -xvfz httpd-2.2.14.tar.bz2

C.tar -xvzf httpd-2.2.14.tar.bz2 D.tar -xvjf httpd-2.2.14.tar.bz2

(4)“cd ~”命令可以显示以下哪一项( )。

A./home/charles B./etc

C./home D...

(5)下面( )命令可以删除“/home/ctu/jack”目录。

A.del -rf /home/ctu/jack B.rm /home/ctu/jack

C.del /home/ctu/jack D.rm -rf /home/ctu/jack

(6)在 RHEL 5.x 中默认不能解压( )文件。

A.test.bz2 B.test.rar

C.test.zip D.test.wim

(7)下面( )命令可以显示“/etc/rc.d/rc.local”文件中不是以“#”开头的文件。

A.grep -v # /etc/rc.d/rc.local B.grep ^# /etc/rc.d/rc.local

C.grep -v ^# /etc/rc.d/rc.local D.grep -v # /etc/rc.d/rc.local

Linux 从初学到精通

142

(8)在执行下面一组命令后“pwd”命令会显示( )。

[root@srv ~]# cd /etc [root@srv ~]# cd ../root [root@srv ~]# cd -

A./ B.~

C./etc D./root

(9)下面( )命令可以显示“/var/log/message” 后 5 行的内容。

A.grep -v -5 /var/log/message B.head -5 /var/log/message

C.less /var/log/message D.tail -5 /var/log/message

(10)下面( )命令准确查找硬盘任何目录中的文件。

A.find B.which

C.local D.whereis

无论是哪个操作系统中,用户及组管理是最基本,也是最重

要的问题之一。用户需要使用操作系统时,都要先输入用户名及

密码登录到系统后才可以使用,在安装 RHEL 5.x 后默认只有一

个名为 root 的超级用户,该用户是整个系统的管理员,为了让其

他用户也可以使用这个系统我们还需要建立其他的用户。在本章

中将讲述 Linux 用户及用户组管理方式及相关操作。

第5章

人事档案︱︱Lin

ux

用户及组管理

Linux 从初学到精通

144

Linux 用户及组管理方式

每一个用户都需要给定一个单独的用户名,为了防止其他人使用自己的用户名,每个用

户又会有一个对应的密码,这就构成了用户管理的基本结构。

在用户使用过程中,并不是每个用户都可以做任何的事情,所以需要为用户配置各种不

同的权限,但有时多个用户会需要有相同的权限,为了操作方便可以在系统中建立一个用户

组后,对用户组配置权限,只要加入该用户组的用户都会继承用户组的权限。在 Windows 中

一个用户可以加入多个用户组,当用户加入多个用户组后,会继承这多个用户组的权限。在

Linux 系统也是这样,但在 Linux 系统中对用户来说用户组有两种:初始组、额外组。每个

用户必须属于一个初始组,同时也可以加入到多个额外组中。对于 Linux 系统中的用户初始

组是必需的,额外组是可选的。

5.1.1 用户管理方式

当在 Linux 系统中输入用户名及密码登录后,在整个使用过程中 Linux 系统会将每个用

户看做一个 32 位的整数,这个整数就是 UID。Linux 的内部运作大部分都是使用 UID,只有

在显示给人看时才会把 UID 转换为对应的用户名。通过如下命令可以查看到当前登录用户的

UID。在 Linux 系统中有以下三种类型的用户:

[charles@srv ~]$ id uid=500(charles) gid=500(charles) groups=500(charles)

1.一般用户 一般用户是登录计算机工作的人。不同的人使用不同的用户名以便他们可以独立操作。

每个不同的用户都有不同的 UID。在 RHEL 5.x 建立一般用户时,默认情况下 UID 会是一个

500 到 60000 的整数。

2.超级用户 超级用户默认是 root 用户,该用户的 UID 为 0。在 Linux 系统中只有 UID 为 0 的用户才

有权访问系统中所有的文件、目录和其他资源以及一些系统调用,比如挂载文件系统、关闭

计算机、建立用户等(虽然也可让非超级用户执行这些操作,但是这些也需要有一个 UID 为

0 的用户允许的情况下)。

3.系统用户

在 Linux 中有些服务在安装时会分配服务自身使用的 UID 和用户名。这些服务通常会利

用一些文件,并用自身的 UID 运行一些进程。这样的用户被称为系统用户。在 RHEL 5.x 中

为系统用户预留的 UID 是从 1 到 499 的整数。

人事档案——Linux 用户及组管理 第

145

5

在 RHEL 5.x 中默认情况下,如果当前用户是管理员提示符应该以“#”结尾,如果当

前用户是一般用户提示符应该以“$”结尾。

每个用户都会有一个家目录,该目录只有用户自己可以访问。一般用户的家目录在

“/home”目录下一个和用户名相同的目录中;超级用户的家目录在“/root”中;系统用户的

家目录根据服务的不同可能在其他目录中。

[charles@srv ~]$ id uid=500(charles) gid=500(charles) groups=500(charles) [charles@srv ~]$ ll /home/ total 20 drwx------ 2 root root 16384 Jan 29 19:08 lost+found drwx------ 3 charles charles 4096 Feb 14 09:51 charles #用户“charles”的家目录。

5.1.2 用户组管理方式

在 Linux 系统中,每个用户对应一个 UID,每个组也有一个 GID。和 UID 一样,系统自

身在运行过程中使用的是 GID,只有在显示给用户查看时才会将 GID 转换为组名称。

在建立用户时默认情况下会建立一个与用户名相同名称的组,组的 GID 与用户的 UID

相同,这个组就是该用户的初始组。

当一个用户属于多个时,这个用户的权限一般应该是该用户初始组及所属额外组权限的

并集。

5.1.3 相关配置文件/目录

Linux 中所有的信息都是通过配置文件的方式保存,用户及用户组也不例外,在学习用

户及用户组相关的命令之前,先来了解一些相关的配置文件。

使用 useradd 时,选项后面直接跟所添加的用户名时,该命令整个工作过程:读取添加

用 户 配置文 件 /etc/login.defs 和 /etc/default/useradd 文 件, 然 后权限 /etc/login.defs 和

/etc/default/useradd 中所定义的规则添加用户;并向/etc/passwd、/etc/shadow 和/etc/groups 文

件添加用户和用户组记录;同时会自动在/etc/login.defs 中所约定的目录中建用户的家目录,

并复制/etc/skel 中的文件(包括隐藏文件)到新用户的家目录中。

1./etc/default/useradd 文件 /etc/default/useradd 文件用于定义建立用户时的规则。

# useradd defaults file GROUP=100 #可创建普通组。 HOME=/home #将用户家目录建在目录/home中。 INACTIVE=-1 #是否启用用户过期功能,“-1”表示不启用。 EXPIRE= #指定用户过期日期。 SHELL=/bin/bash #指定用户默认使用的 Shell。 SKEL=/etc/skel #指定用户家目录模板目录。

2./etc/login.defs 文件 /etc/login.defs 文件用于定义建立用户时相关选项的默认值。

[root@srv ~]# grep -v ^# /etc/login.defs | grep -v ^$

提 示

Linux 从初学到精通

146

MAIL_DIR /var/spool/mail #指定新建用户的默认邮箱目录。 PASS_MAX_DAYS 99999 #指定新建用户的密码最长使用时间。 PASS_MIN_DAYS 0 #指定新建用户的最短使用时间。 PASS_MIN_LEN 5 #指定新建用户的密码最小长度。 PASS_WARN_AGE 7 #指定新建用户的密码过期警告时间。 UID_MIN 500 #指定新建用户的最小 UID。 UID_MAX 60000 #指定新建用户的最大 UID。 GID_MIN 500 #指定新建用户组的最小 GID。 GID_MAX 60000 #指定新建用户组的最大 GID。 CREATE_HOME yes #指定新建用户时是否自动建立用户家目录。 #指定新建用户的家目录的 UMASK值(有关 UMASK见第 6章)。 UMASK 077 #如果用户对应初始组中没有其他成员时,在删除用户时是否一起删除对应初始组。 USERGROUPS_ENAB yes #在保存用户密码时是否使用 MD5加密用户密码,如果指定为“no”则会使用 DES加密用 #用户密码。 MD5_CRYPT_ENAB yes

3./etc/skel 目录 在 Linux 中系统使用命令建立用户时,所建立用户的登录脚本、家目录等所有信息都是

以/etc/skel 目录中的内容为模板。

[root@srv ~]# ll -a /etc/skel/ total 76 drwxr-xr-x 4 root root 4096 Feb 14 14:11 . drwxr-xr-x 97 root root 12288 Feb 14 16:53 .. -rw-r--r-- 1 root root 33 Oct 21 2008 .bash_logout -rw-r--r-- 1 root root 176 Oct 21 2008 .bash_profile -rw-r--r-- 1 root root 124 Oct 21 2008 .bashrc -rw-r--r-- 1 root root 515 Dec 11 2007 .emacs drwxr-xr-x 4 root root 4096 Jan 29 19:25 .mozilla -rw-r--r-- 1 root root 658 Apr 15 2009 .zshrc

如果在/etc/skel/目录中建立目录或放入文件,那么新建用户的家目录中就会有这些目录

及文件;如果修改该目录中的用户配置文件、登录脚本内容,那么新建用户的用户配置文件、

登录脚本也会采用修改后的内容。

有关用户配置文件、登录脚本见第 10 章 。

4./etc/passwd 文件

/etc/passwd 文件中保存了 Linux 系统中所有的用户信息,该文件中每一行都代表一个用

户,有几行就代表有几个用户。不过需要特别留意的是,在文件中第一行就是 UID 为 0 的 root

用户也就是超级用户,在有些 Linux 系统中超级用户必须是在/etc/passwd 文件的第一行,因

此一般不要修改第一行;除了 root 用户以外,还有很多其他的用户,这些用户就是系统用户,

如 bin、daemon、adm、nobody 等,这些用户是系统正常运作时所需要的,不能随意地删除。 [root@srv ~]# head -3 /etc/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

提 示

人事档案——Linux 用户及组管理 第

147

5

/etc/passwd 文件中第一行有 7 列,第一列之间通过“:”分隔,每列含义如下:

(1)用户名,用户在登录时使用的名称。

(2)密码,在早期的 UNIX 系统中该列用于存放用户的密码,但是因为这个文件的权限是

所有的程序都能够读取,所以很容易造成用户密码的被窃取,因此后来就将这个字段的密码数

据存放/etc/shadow 中。而该列会使用一个“x”表示密码已经被移动到/etc/shadow 文件中。

(3)UID,该用户对应的 UID。

(4)GID,该用户初始组的 GID。

(5)用户说明信息,该列并没有什么重要用途,只是用来解释这个用户的意义。

(6)家目录,记录该用户的家目录所有位置。

(7)Shell,用户在登录时会运行一个程序,该程序就是登录 Shell(有关 Shell 相关内容

见第 9 章 ),在 RHEL 5.x 中默认的 Shell 是“/bin/bash”。有一些禁止用户登录的方式就是为

用户指定“/sbin/nologin”的登录 Shell。

5./etc/shadow 文件

/etc/shadow 文件保存了系统中所有用户的密码,该文件也是每行一个用户密码。

[root@srv ~]# head -3 /etc/shadow root:$1$PCWBPGyb$U.kzd76zm3mSKYTP/BZd40:14638:0:99999:7::: bin:*:14638:0:99999:7::: daemon:*:14638:0:99999:7:::

/etc/shadow 文件中第一行有 9 列,第一列之间通过“:”分隔,每列含义如下:

(1)用户名,由于密码也需要与用户对应,该文件的第一列就是用户名。用户名必须与

/etc/passwd 文件中的用户名一一对应。

(2)密码,该用户的密码,而且是经过加密过的密码,只会看到有一些特殊符号。该文

件只有 root 用户才可以读写。另外,如果是在该列的第一个字符为“!”,表示这个账号并不

会被用来登录的意思。所以不想让某个用户登录时,也可以在这个文件中,将他的密码字段

的最前面多加一个“!”。

(3)最近更动密码的日期,该列记录了该用户最后一次修改密码日期,这里的日期是以

“1970 年 1 月 1 日”作为 1,而“1971 年 1 月 1 日”则为 366 ,所以这个日期是一个累加值。

(4)密码最短更改时间,该列记录了对应用户最短需要经过几天才可以被修改密码。如

果是 0,表示密码随时可以更改。比如设置为 10 天的话,那么当用户修改密码后,10 天内都

无法改变这个密码。

(5)密码最长使用时间,为了保存自己的密码安全,最常见的做法就是定期修改自己的

密码,密码最长使用时间指定了一个密码多少天后必须修改,否则对应用户将被禁用。如果

设置为 99999 的,那么密码可以无限期地使用。

(6)密码更改警告时间:当用户因为密码最长时间快要到的时候,Linux 系统会依据这

个字段的配置的天数发出警告,提醒再过指定的时间后密码就会失效。比如指定为 5,表示

当离密码最长使用时间还有 5 天时向用户发出警告。

(7)密码过期的时间:如果用户过了警告时间还没有更改密码使得密码失效后,还可以

Linux 从初学到精通

148

用这个密码在指定的天数内进行登录。比如指定为 7,表示密码过期后 7 天内还可以登录。

(8)用户失效日期:在到达用户失效时间指定的天数后,用户将无法使用。这个日期和

“最近更动密码的日期”一样,使用 1970 年以来的总日数设置。

(9)保留:最后一个字段是保留的,目录还没有作用。

6./etc/group 文件 /etc/group 文件保存了系统中所有用户组信息,该文件也是每行一个用户组,有几行就代

表有几个用户组。

[root@srv ~]# head -3 /etc/group root:x:0:root bin:x:1:root,bin,daemon daemon:x:2:root,bin,daemon

/etc/group 文件中第一行有 4 列,第一列之间通过“:”分隔,每列含义如下:

(1)组名称,该组的名称。

(2)组密码,该组的密码,该列与“/etc/passwd”文件一样这里使用一个“x”表示该组

的密码记录在“/etc/gshadow”文件中。对于目前的 Linux 系统组密码已经没有作用。

(3)GID,该组对应的 GID。

(4)组成员,将该组作为额外组的所有用户。前面已经提到在 Linux 系统中每一个用户

都必须属于一个初始组,同时还可以属于任意个额外组,而且当建立用户时默认用户建立一

个与用户名相同的组作为该用户的初始组。初始姐不需要在该列中定义,该列中所有用户都

是把该列作为额外组的用户。如想要让用户“charles”也加入 root 这个组,那么在第一行的

最后面加上“,charles”,注意不要有空格,使其成为“root:x:0:root,charles”就可以。

将用户加入 root 组并不会使该用户具有管理员的权限。

用户及用户组管理命令

在了解 Linux 系统中与用户及用户组相关的配置文件后,实际上我们可以通过修改这些

配置文件来建立用户,但一般很少这样做,因为在 Linux 系统提供了很多命令方便我们建立

用户及用户组。

5.2.1 useradd:建立用户

useradd 命令用于建立用户,该命令语法如下。

useradd [-u <UID>] [-g <用户组>] [-G <用户组…>] -[Mm] [-c <说明信息>] [-d <目录>] [-s <Shell>] 用户名

提 示

人事档案——Linux 用户及组管理 第

149

5

常用指数:

常用选项:

用户名:要建立用户的名称。

-u UID:UID 是一个整数,直接指定用户的 UID。在 RHEL 5.x 中如果不使用该选项

时,用户的 UID 会从 500 开始,每建立一个用户该用户的 UID 会增加 1。

-g <用户组>:用户组可以指定为一个已存在用户组的名称或 GID,用于指定用户的

初始组。在 RHEL 5.x 中如果不使用该选项时,会建立一个与用户名相同的 ID 及名

称的组作为用户的初始组。

-G <用户组…>:用户组可以指定为一个或多个已存在用户组的名称或 GID,用于指

定用户的额外组。如果指定多个额外组时,每个组之前使用“,”分隔。在 RHEL 5.x

中如果不使用该选项时,是不会给用户指定额外组的。

-c <说明信息>:指定用户的说明信息,这个就是“/etc/passwd”文件中第 5 列的说

明内容。

-d <目录>:指定某个目录作为该用户家目录。在 RHEL 5.x 中如果不使用该选项时,

会在“/home”目录中建立一个与用户名相同的目录作为该用户的家目录。

-s <Shell>:指定用户的登录 Shell。在 RHEL 5.x 中如果不使用该选项时,会为用户

指定“/bin/bash”作为登录 Shell。

-M:不建立用户家目录。

-m:建立用户家目录。在 RHEL 5.x 中如果不指定“-M”或“-m”时,会根据

“/etc/login.defs”文件中“CREATE_HOME”选项决定是否建立用户家目录。

useradd 用于建立用户,用户建立完成后还需要通过“passwd”命令指定用户的密码。该

命令执行完成后,信息将会保存在“/etc/passwd”文件中。该命令默认只有 root 用户可以使

用。下面看几个 useradd 命令的例子。

建立一个名为“charles”的用户。

[root@srv ~]# useradd charles

建立一个名为“jack”的用户,并指定其用户说明信息为“JackBauer”。

[root@srv ~]# useradd jack -c JackBauer

建立一个名为“nina”的用户,并指定其登录脚本为“/sbin/nologin”(该用户不能登

录到系统)。

[root@srv ~]# useradd nina -s /sbin/nologin

建立一个名为“house”的用户,并指定其 UID 为 999。

[root@srv ~]# useradd house -u 999

建立一个名为“olivia”的用户,并指定其初始组为“charles”。

[root@srv ~]# useradd olivia -g charles

Linux 从初学到精通

150

建立一个名为“claire”的用户,并指定其家目录为“/home/heroes”。

[root@srv ~]# useradd claire -d /home/heroes

5.2.2 passwd:更改用户密码

passwd 命令用于指定或更改用户密码,该命令语法如下。

passwd [-luS] [-n <天数>] [-x <天数>] [-w <天数>] [用户名]

常用指数:

常用选项:

用户名:指定需要指定或更改密码的用户。

-l:将指定用户锁定,实际就是在“/etc/shadow”文件中该用户对应行第 2 列的第一

个字符前插入一个“!”。

-u:将锁定的用户解锁。

-S:显示指定用户与密码相关的信息。

-n <天数>:指定密码最短更改时间,实际就是在“/etc/shadow”文件中该用户对应

行第 4 列的内容。

-x <天数>:指定密码最长使用时间,实际就是在“/etc/shadow”文件中该用户对应

行第 5 列的内容。

-w <天数>:指定密码更改警告时间,实际就是在“/etc/shadow”文件中该用户对应

行第 6 列的内容。

passwd 命令可以让用户更改自己的密码,所有用户必须在指定密码后才有可能登录到系

统。root 用户可以通过该命令管理其他用户的密码。在使用 passwd 命令时如果不指定用户则

是修改当前用户的密码,实际上也只有 root 用户可以在该命令中指定用户名。下面看几个

passwd 命令的例子。

更改用户“charles”的密码(当前 root 用户登录)。

[root@srv ~]# passwd charles Changing password for user charles. New UNIX password: #指定密码。

该提示是一个警告表示指定的密码太简单。在 RHEL 5.x 中只有 root 用户可以指定

简单的密码,如果是一般用户该警告会是一个错误,一般用户必须重新指定一个复

杂的密码。

BAD PASSWORD: it is based on a dictionary word Retype new UNIX password: #再次输入密码。 passwd: all authentication tokens updated successfully.

更改当前用户的密码(当前使用“charles”用户登录)。

[charles@srv ~]$ passwd

人事档案——Linux 用户及组管理 第

151

5Changing password for user charles. Changing password for charles (current) UNIX password: #首先要输入当前的密码。 New UNIX password: #指定新的密码。 Retype new UNIX password: #再次输入新的密码。 passwd: all authentication tokens updated successfully.

将用户“olivia”锁定。

[root@srv ~]# passwd -l olivia Locking password for user olivia. passwd: Success

5.2.3 usermod:更改用户信息

usermod 命令用于更改用户的信息,该命令语法如下。

usermod [-LUa] [-e <日期>] [-l <用户名称>] [-u <UID>] [-d <目录>] [-g <用户组>] [-G <用户组…>] [-c <说明信息>] [-s <Shell>] 用户名

常用指数:

常用选项:

用户名:要更改信息的用户名。

-c <说明信息>:更改用户的说明信息,这个就是“/etc/passwd”文件中第 5 列的说

明内容。

-d <目录>:更改用户家目录。

-e <日期>:更改用户失效日期。指定日期的格式是“YYYY-MM-DD”,这个就是

“/etc/shadow”文件中第 8 列的内容。

-g <用户组>:用户组可以指定为一个已存在用户组的名称或 GID,用于更改用户的

初始组。

-G <用户组…>:用户组可以指定为一个或多个已存在用户组的名称或 GID,用于指

定用户的额外组。如果指定多个额外组时,每个组之前使用“,”分隔。该选项会首

先将指定用户原先的额外组全部删除。

-a:追加该用户新的额外组,该选项使用时必须与“-G”选项一起使用。

-l <用户名称>:修改指定用户的用户名。

-s <Shell>:更改用户的登录 Shell。

-u <UID>:更改用户的 UID。

-L:锁定用户。

-U:将锁定用户解锁。

usermod 命令可以修改用户的相关信息,该命令只有 root 用户可以使用。在使用 usermod

命令时要注意修改后可能造成一个系统使用的问题。下面看几个 usermod 命令的例子。

将用户“jack”的说明信息修改为“24”。

Linux 从初学到精通

152

[root@srv ~]# usermod -c 24 jack

将用户“olivia”原有的额外组删除并为其增加一个名为“fringe”的额外组。

[root@srv ~]# usermod -G fringe olivia

为“claire”用户增加一个名为“heroes”的新额外组。

[root@srv ~]# usermod -aG heroes claire

5.2.4 userdel:删除用户

userdel 命令用于删除用户,该命令语法如下。

userdel [-r] 用户名

常用指数:

常用选项:

用户名:要删除的用户名。

-r:删除用户家目录。

userdel 命令用户删除用户,该命令只有 root 用户可以使用。如果不使用“-r”选项时,

删除用户后会保留该用户家目录。下面看几个 userdel 命令的例子。

删除名为“nina”的用户,但保留其家目录。

[root@srv ~]# userdel nina

删除名为“claire”的用户,同时删除其家目录。

[root@srv ~]# userdel -r claire

5.2.5 groupadd:建立用户组

groupadd 命令用于建立用户组,该命令语法如下。

groupadd [-g <GID>] 用户组

常用指数:

常用选项:

用户组:要建立用户组的名称。

-g <GID>:GID 是一个整数,直接指定用户组的 GID。在 RHEL 5.x 中如果不使用

该选项时,用户组的 GID 会从 500 开始,每建立一个用户组该用户组的 GID 会增

加 1。

groupadd 用于建立用户组。该命令执行完成后,信息将会保存在“/etc/group”文件中。

该命令默认只有 root 用户可以使用。下面看几个 groupadd 命令的例子。

人事档案——Linux 用户及组管理 第

153

5

建立一个名为了“gossipgirl”的组。

[root@srv ~]# groupadd gossipgirl

建立一个名为了“weeds”的组,并指定 GID 为“999”。

[root@srv ~]# groupadd -g 999 weeds

5.2.6 groupmod:更改 GID 及组名称

groupmod 命令用于更改 GID 及组名称,该命令语法如下。

groupmod [-g <GID>] [-n <用户组名称>] 用户组

常用指数:

常用选项:

用户组:要更改用户组的名称。

-n <用户组名称>:修改指定用户组的名称。

- g <GID>:更改用户组的 GID。

groupmod 用于更改 GID 及用户组名称。下面看几个 groupmod 命令的例子。

将一个名为“olivia”的用户组名称改为“fringe”。

[root@srv ~]# groupmod olivia -n fringe

5.2.7 groupdel:删除用户组

groupdel 命令用于删除用户组,该命令语法如下。

groupdel 用户组

常用指数:

常用选项:

用户组:要删除的用户组名称。

groupdel 命令用于删除用户组,如果某些用户的初始组是删除的用户组时,该用户组无

法删除。下面看几个 groupdel 命令的例子。

删除一个名为“jack”的组,但用户组“jack”还是用户“jack”的初始组,而用户

“jack”还存在所以不能删除该组。

[root@srv ~]# groupdel jack groupdel: cannot remove user's primary group.

删除一个名为“gossipgirl”的组。

[root@srv ~]# groupdel gossipgirl

Linux 从初学到精通

154

5.2.8 chage:修改用户密码策略

chage 命令用于修改用户密码策略,该命令语法如下。

chage 用户名

常用指数:

常用选项:

用户名:要修改用户密码策略的用户名称。

chage 命令用于修改用户密码策略。下面看几个 chage 命令的例子。

修改名为“charles”用户的密码策略。

[root@srv ~]# chage charles Changing the aging information for charles Enter the new value, or press ENTER for the default Minimum Password Age [0]: #密码最短更改时间,“0”表示不限制。 Maximum Password Age [99999]: #密码最长使用时间,“99999”表示不限制。 Last Password Change (YYYY-MM-DD) [2010-02-14]: #最近更动密码的日期。 Password Expiration Warning [7]: #密码更改警告时间。 Password Inactive [-1]: #密码过期的时间。 Account Expiration Date (YYYY-MM-DD) [1969-12-31]: #用户失效日期。

5.2.9 finger:查找并显示用户信息

finger 命令用于查找并显示用户信息,该命令语法如下。

finger [-lmsp][用户名...]

常用指数:

常用选项:

用户名...:要查找并显示信息的用户名。

-l:显示该用户的名称、用户说明信息、用户家目录、登录的 Shell、登录时间、邮

件地址、电子邮件状态、计划文件和方案文件内容。

-m:不显示查找用户的用户说明信息。

-s:显示该用户名称、用户说明信息、登录终端、闲置时间、登录时间及地址和电话。

-p:显示该用户名称、用户说明信息、用户家目录、登录的 Shell、登录时间、邮件

地址、电子邮件状态,但不显示该用户的计划文件和方案文件内容。

finger 命令会查找,并显示指定用户相关信息,如果不显示用户则会显示当前登录的所

有用户的信息。下面看几个 finger 命令的例子。

查找并显示 root 用户的信息。

[root@srv ~]# finger root

人事档案——Linux 用户及组管理 第

155

5Login: root Name: root Directory: /root Shell: /bin/bash On since Sun Feb 14 09:51 (CST) on pts/1 from 192.168.159.159 On since Sun Feb 14 16:36 (CST) on pts/3 from 192.168.159.159 10 minutes 31 seconds idle New mail received Sun Feb 14 10:38 2010 (CST) Unread since Wed Feb 10 02:12 2010 (CST) No Plan.

5.2.10 w:显示当前登录系统的用户及用户进程信息

w 命令用于显示当前登录系统的用户及用户进程信息,该命令语法如下。

w [-fhlsu] [用户名]

常用指数:

常用选项:

用户名:需要显示登录信息的用户名。

-f:显示用户从何处登录,在 RHEL 5.x 中默认会使用该选项。

-h:不显示各列标题行。

-l:使用详细格式列表,在 RHEL 5.x 中默认会使用该选项。

-s:使用简洁格式,不显示用户登录时间等信息。

-u:忽略执行程序的名称,以及该程序使用 CPU 时间的信息。

w 命令可以显示当前登录系统的用户及这些用户正在执行的程序。不指定用户名时会显

示所有用户的信息,指定用户名后只显示指定用户的相关信息。下面看几个 w 命令的例子。

[root@srv ~]# w

该行显示的内容分别表示:当前时间、系统启动到现在的时间、登录用户的数目、

系统在最近 1 秒、5 秒和 15 秒的平均负载。

16:08:25 up 6:37, 2 users, load average: 0.00, 0.00, 0.00

该行是标题行,从下一行开始才是显示的数据。其中每列分别表示:登录账号、终

端名称、远程主机名、登录时间、空闲时间、JCPU、PCPU、当前正在运行进程的

命令行。

USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/1 192.168.159.159 09:51 0.00s 0.59s 0.01s w charles pts/2 192.168.159.159 09:51 1:33m 0.06s 0.06s -bash

JCPU 时间指的是和该终端(TTY)连接的所有进程占用的时间。这个时间里并不包

括过去的后台作业时间,但却包括当前正在运行的后台作业所占用的时间。而 PCPU 时间

则是指当前进程(即在 WHAT 项中显示的进程)所占用的时间。

提 示

Linux 从初学到精通

156

5.2.11 who:显示当前登录系统的用户信息

who 命令用于显示当前登录系统的用户信息,该命令语法如下。

who [ami] [-bdHlpqru]

常用指数:

常用选项:

ami:只显示与自己相关的登录信息。

-b:显示系统最后一次启动的时间。

-d:显示死进程。

-H:各列标题行。

-l:显示登录进程号。

-p:显示由 init 生成子进程。

-q:显示登录的用户数。

-r:当前的运行级别(有关运行级别见第 10 章 )。

-u:显示当前登录的用户。

who 命令用于显示当前登录系统的用户信息。who 命令不使用任何选项时会显示登录用

户、使用的终端、登录时间、从何处登录。下面看几个 who 命令的例子。

显示当前登录系统的用户信息。

[root@srv ~]# who root pts/1 2010-02-14 09:51 (192.168.159.159) charles pts/2 2010-02-14 09:51 (192.168.159.159)

只显示与自己相关的登录信息。

[root@srv ~]# whoami root

显示当前的运行级别。

[root@srv ~]# who -r run-level 5 2010-02-14 09:31 last=S

5.2.12 last:显示当前及过去登录系统的用户信息

last 命令用于显示当前及过去登录系统的用户信息,该命令语法如下。

last [-adRx] [- <显示列数>][用户名...][终端编号...]

常用指数:

常用选项:

终端编号...:只显示指定终端的登录信息。

人事档案——Linux 用户及组管理 第

157

5

用户名...:只显示指定用户的登录信息。

-a:将从何处登录系统的主机名称或 IP 地址,显示在最后一行。

-d:将 IP 地址转换成主机名称。

-<显示列数>:设置列出名单的显示列数。

-R:不显示登录系统的主机名称或 IP 地址。

-x:显示系统关机,重新开机,以及执行等级的改变等信息。

last 命令在默认情况下,会读取位于“/var/log”目录下的“wtmp”文件,并把该文件的

内容记录的登录系统的用户信息显示。下面看几个 last 命令的例子。

显示当前及过去登录系统的用户信息,但只显示 5 行。

root@srv ~]# last -5 tonyzhan tty1 Sun Feb 14 16:53 still logged in root tty1 Sun Feb 14 16:52 - 16:52 (00:00) root pts/3 192.168.159.159 Sun Feb 14 16:36 still logged in root pts/3 192.168.159.159 Sun Feb 14 15:50 - 15:50 (00:00) tonyzhan pts/2 192.168.159.159 Sun Feb 14 09:51 still logged in wtmp begins Fri Jan 29 19:35:41 2010

显示终端“tty1”的登录信息。

[root@srv ~]# last tty1 tonyzhan tty1 Sun Feb 14 16:53 still logged in root tty1 Sun Feb 14 16:52 - 16:52 (00:00) wtmp begins Fri Jan 29 19:35:41 2010

用户切换

很多 Linux 的发行版中默认情况下不允许使用 root 用户登录系统,这主要是出于安全的

考虑,虽然在 RHEL 5.x 中并没有这样的限制,但推荐在平时使用时还是可以使用一个非 root

的用户,只有在需要完成一些只有 root 用户可以用的操作时才使用 root 用户。不过每次要使

用 root 用户时都重新注销再登录就比较麻烦,下面就介绍两种在不注销当前用户的情况下临

时使用其他用户进行操作的方法。

5.3.1 su:切换用户

su 命令可以在不重新登录系统的情况下临时改变用户的身份,该命令语法如下。

su [-][-c <命令>][-s][用户名]

常用指数:

常用选项:

用户名:指定要切换到的用户,如果不指定,则切换到 root 用户。

Linux 从初学到精通

158

-c <命令>:执行完指定的命令后,恢复原来的用户身份。

-:切换用户身份时,也同时变更工作目录以及各种环境变量。

su 可让用户暂时切换用户的身份。如果原用户是 root 时,在使用 su 命令切换为任何其

他用户时都不需要输入用户的密码,但一般用在使用 su 命令切换为任何其他用户时需要输入

要切换用户的密码。在使用 su 命令切换到其他用户后可以使用“exit”命令恢复原来的用户

身份。如果在使用 su 命令时希望切换后完全拥有新用户的身份、权限必须使用“-”选项。

下面看几个 su 命令的例子。

当前用户是 root。

[root@srv ~]# id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

切换到用户“charles”,同时变更工作目录及各种环境变量。

[root@srv ~]# su - charles

已经切换到用户“charles”。

[charles@srv ~]$ id uid=500(charles) gid=500(charles) groups=500(charles)

恢复原来的 root 用户。

[charles@srv ~]$ exit

当前用户是 root。

[root@srv ~]# id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

使用用户“charles”的身份执行“id”命令。

[root@srv ~]# su - -c id charles uid=500(charles) gid=500(charles) groups=500(charles)

当前用户是“charles”。

[charles@srv ~]$ id uid=500(charles) gid=500(charles) groups=500(charles)

切换到用户 root,同时变更工作目录以及各种环境变量。

[charles@srv ~]$ su - root

由于当前用户是一般用户,所以切换用户时需要输入欲切换用户的密码。

Password: #输入 root用户的密码。

当前用户是 root。

[root@srv ~]# id

uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

人事档案——Linux 用户及组管理 第

159

5

5.3.2 sudo:以其他用户身份执行命令

使用 su 命令切换用户时,有一个明显的安全问题就是一般用户必须知道欲切换用户的密

码时才可以成功执行 su 命令。假设有这样一种情况,管理员希望系统中的某些用户可以使用

部分只有管理员才可以使用的命令,这时如果使用 su 命令管理员就必须将自己的密码告诉这

些用户,这样显然是不安全的。这时可以通过 sudo 命令解决这个问题,sudo 命令的工作流

程如下:

(1)当用户执行 sudo 命令时,系统会检查/etc/sudoers 文件,判断该用户是否有执行 sudo

命令的权限。

(2)如果用户具有可执行 sudo 的权限,系统会提示用户“输入用户自己的密码”来确认。

(3)如果密码输入成功,则开始 sudo 使用指定的用户执行指定的命令。

要注意的是使用 sudo 命令时用户输入的是自己的密码,而不是欲切换用户的密码。sudo

命令可以使用户通过自己的密码、其他用户的身份执行工作,而不必知道其他用户的密码。

和 su 命令一样如果 sudo 命令的是 root 用户则不需要输入任何密码。

1./etc/sudoers 文件 在RHEL 5.x 中默认只有 root 用户可以使用 sudo 命令,如果希望其他用户也可以使用 sudo 命

令,必须由 root 用户使用“visudo”命令修改/etc/sudoers 文件或直接使用 vim 编辑/etc/sudoers 文件。

由于 root 用户对/etc/sudoers 文件的权限是只读,所以如果使用 vim 编辑/etc/sudoers 文

件后,保存时需要使用“!”强制保存。

/etc/sudoers 文件默认的内容如下,在该文件中有一行“root ALL=(ALL) ALL”就是表示

root 用户可以使用 sudo 命令切换为任何用户。

[root@srv ~]# grep -v ^# /etc/sudoers | grep -v ^$ Cmnd_Alias NETWORKING=/sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient,

/usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool

Cmnd_Alias SOFTWARE=/bin/rpm, /usr/bin/up2date, /usr/bin/yum Cmnd_Alias SERVICES=/sbin/service, /sbin/chkconfig Cmnd_Alias LOCATE =/usr/bin/updatedb Cmnd_Alias STORAGE=/sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe,

/bin/mount, /bin/umount Cmnd_Alias DELEGATING=/usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp Cmnd_Alias PROCESSES=/bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall Cmnd_Alias DRIVERS=/sbin/modprobe Defaults requiretty Defaults env_reset Defaults env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR \ LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \ LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \ LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \ _XKB_CHARSET XAUTHORITY" root ALL=(ALL) ALL

提 示

Linux 从初学到精通

160

如果希望其他用户也可以使用 sudo 命令可在/etc/sudoers 文件中进行配置,配置格式如下。

用户或用户组可登录的主机 =(可变换的身份)表示可执行的命令

下面看几个配置/etc/sudoers 文件以使用指定用户可以使用 sudo 命令的例子。

#在/etc/sudoers文件中增加如下内容后,用户“charles”就可以以 root用户的身份执行 #“chkconfig”命令。 charles ALL=(root) /sbin/chkconfig #在/etc/sudoers文件中增加如下内容后,用户“charles”就可以以 root用户的身份 #执行所有命令,而且不需要输入用户“charles”的密码。“NOPASSWD:”选项表示不 #需要输入密码。 charles ALL=(root) NOPASSWD:ALL #在/etc/sudoers文件中增加如下内容后,用户组“gossipgirl”的所有成员就可以以 root #用户的身份执行所有命令。在指定用户组时必须使用“%”开头。 %gossipgirl ALL=(root) ALL

在/etc/sudoers 文件中还包括以下几个常用选项:

(1)User_Alias,在上面的例子中已经看到可以在/etc/sudoers 文件中通过“%”使用系统

中已存在的用户组。如果有几个不属于同一个用户组的用户需要使用 sudo 命令执行一些操作

可以通过“User_Alias”选项在/etc/sudoers 文件中定义一个组(这个组只在/etc/sudoers 文件

中有效)。如在/etc/sudoers 文件中增加如下内容后,用户“charles”和“jack”都可以使用 root

用户的身份执行“chkconfig”命令。

#定义一个名为“TSTGRP”的组,在该组中包括用户“charles”和“jack”。 User_Alias TSTGRP= charles,jack #“TSTGRP”的组用户可以使用 root用户的身份执行“chkconfig”命令。 TSTGRP ALL=(root) /sbin/chkconfig

(2)Cmnd_Alias,如果需要在/etc/sudoers 文件多次定义一组命令时可以使用 Cmnd_Alias

选项。如在/etc/sudoers 文件中增加如下内容后,“TSTCMD”就可以表示“/sbin/chkconfig”

和“/sbin/iptables”命令。

#定义一个名为“TSTCMD”的命令别名,该命令别名中包括“/sbin/chkconfig”和 #“/sbin/iptables”命令。 Cmnd_Alias TSTCMD=/sbin/chkconfig, /sbin/iptables #用户“charles”就可以以 root用户的身份执行“TSTCMD”中定义的命令。 charles ALL=(root) TSTCMD

(3)拒绝命令选项,系统在读取/etc/sudoers 文件时会严格匹配命令。可以使用这个特性

只允许用户使用 sudo 命令执行命令的某些选项。如在/etc/sudoers 文件中增加如下内容。

#在/etc/sudoers 文件中增加如下内容后,用户“charles”就可以以 root 用户的身份#执行“iptables”命令,但不允许使用“-nL”选项。

jack ALL=(root) NOPASSWD:/sbin/iptables,!/sbin/iptables -nL #在/etc/sudoers文件中增加如下内容后,用户“olivia”就可以以 root用户的身份执行 #“passwd 用户名”命令修改其他用户的密码,但不允许使用“passwd”和“passwd root” #命令。 olivia ALL = NOPASSWD:!/usr/bin/passwd,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root

2.sudo 命令 在完成/etc/sudoers 文件的配置后,用户就可以使用 sudo 命令以其他用户身份执行命令,

人事档案——Linux 用户及组管理 第

161

5

该命令语法如下。

sudo [-u [<用户名>|#<UID>]] 命令

常用指数:

常用选项:

命令:指定要执行的命令。

-u [<用户名>|#<UID>]:指定执行指定命令的用户,如不指定则表示希望使 root 用

户执行指定命令。

在第一执行 sudo 命令输入密码后,该密码会保存 5 分钟,在 5 分钟内再使用 sudo 命令

是可不需要输入密码的。下面看几个 sudo 命令的例子。

当前用户是“charles”。

[charles@srv ~]$ id uid=500(charles) gid=500(charles) groups=500(charles)

使用 root 用户的身份执行“/sbin/iptables -L”命令。

[charles@srv ~]$ sudo -u root /sbin/iptables -L Password: #输入密码,注意输入的是用户“charles”的密码,而不是用户 root的密码。 target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [charles@srv ~]$ sudo -u root /sbin/iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination

实验任务

在一台安装了 RHEL 5.x 的计算机上完成以下任务。

(1)建立一个名为“lost”的用户组。

(2)建立一个名为“kate”的用户并指定该用户 UID 为 1000。

(3)设置用户“kate”的密码为“redhat”。

(4)建立一个名为“shannon”的用户并指定其初始组为“lost”。

(5)为用户“kate”指定一个名为“lost”的额外组。

(6)建立一个名为“charlie”的用户指定其家目录为“/home/lost”。

(7)删除用户“shannon”。

(8)使用“kate”登录到系统后,切换到 root 用户。

Linux 从初学到精通

162

(9)使用户“shannon”可以使用 sudo 命令执行 root 用户的所有命令。

(10)使用“kate”登录到系统后,使用 root 用户的身份执行“chkconfig nfs on”命令。

本章测试

(1)下列命令中( )可删除用户“nina”并删除其家目录。

A.userrm nina B.userdel -r nina

C.userrm -r nina D.userdel nina

(2)( )最有可能是用户组 weeds 的 GID。

A.100 B.600

C.400 D.300

(3)( )文件中保存用户信息。

A./etc/passwd B./etc/passwd.dat

C./etc/users D./etc/user.dat

(4)使用“charles”用户登录后,( )命令是肯定可以执行的。

A.useradd B.passwd jack

C.useradd jack D.passwd

(5)( )可以在不改变用户“jack”现有额外组的情况下,将用户“jack”加一个名

为“ctu”的额外组。

A.usermod jack -g ctu B.usermod jack -aG ctu

C.usermod jack -ag ctu D.usermod jack -G ctu

(6)下列命令中( )可以将用户组“gossipgirl”的 GID 修改为 1000。

A.groupmod gossipgirl -g 1000 B.groupmod gossipgirl -G 1000

C.groupmod gossipgirl -gid 1000 D.groupmod gossipgirl -GID 1000

(7)在 RHEL 5.x 中保存在/etc/shadow 文件中的用户密码使用( )加密。

A.des B.sha

C.md5 D.3des

(8)为了一般用户可以使用 sudo 命令,需要修改( )文件的内容。

A./etc/sudoers B./etc/passwd

C./etc/sudo D./etc/allowsudo

(9)使用 useradd 新建用户时,如果需要指定其家目录应该使用( )选项。

A.-d B.-D

C.-h D.-H

(10)当一个用户“jack”由于出差等原因而长期不使用其用户时,出于安全考虑可以将

其账户禁用。为了实现这个目的应该使用( )命令。

A.usermod -l jack B.usermod -L jack

C.usermod -U jack D.usermod -u jack

在 Windows 系统中使用 NTFS 文件系统时,可以对目录及文

件配置权限使得只有有权限的用户才可以操作目录及文件。在

Linux 中 ext3 文件系统同样也支持这样的文件系统权限。在本章

中将讲述 Linux 文件系统权限管理的相关操作。

第6章

看家护院︱︱Lin

ux

目录及文件权限管理

Linux 从初学到精通

164

Linux 目录及文件权限管理方式

Linux 系统是一个多用户环境,所以在同一时间可能有多个用户在使用同一个目录或文

件。但对每个用户不一定都有相同的权限,也许有的用户可以查看文件、有的用户可以修改

文件等,为了满足这样的要求就必须对目录或文件配置权限。

6.1.1 目录及文件的所有者及拥有组

如下所示的内容中有两个“root”,第一个“root”是表明文件的所有者是 root 用户;第

二个“root”是表明文件的拥有组是名为 root 的用户组。

[root@srv ~]# ll /etc/fstab -rw-r--r-- 1 root root 912 Jan 29 11:46 /etc/fstab

在默认情况下安装系统时复制到硬盘的系统文件的所有者一般是 root 用户,拥有组一般

是 root 组。在系统使用过程中文件的所有者是建立文件的用户、拥有组是建立文件用户的初

始组。

[charles@srv ~]$ id uid=500(charles) gid=500(charles) groups=500(charles) [charles@srv ~]$ touch test [charles@srv ~]$ ll test -rw-rw-r-- 1 charles charles 0 Feb 15 04:26 test

6.1.2 目录及文件权限类型

在 Linux 系统中权限分为可读(r)、可写入(w)、可执行(x)三种。对于文件来说,可

读权限表示允许对文件进行浏览;可写入权限表示允许修改文件;可执行表示可以将文件作

为命令使用。对于目录来说,可读权限表示允许显示目录列表;可写入表示可以在目录中建

立、删除、移动文件或子目录;可执行表示可以切换到目录。

每个目录或文件都有三组不同的读、写、执行权限,分别适用于目录或文件所有者权限、

目录或文件拥有组权限、目录或文件其他用户(除了目录或文件所有者以外的用户)权限。

当使用“ll”或“ls -l”命令时,第一列会显示目录及文件的权限,该列由 10 个字母表示。

如图 6-1 所示,这 10 位中第 1 位表示文件类型(有关每种文件类型的表示方法见 4.2.4 );

第 2~4 位表示文件所有者的权限;第 5~7 位表示文件拥有组的权限;第 7~10 位表示其他

用户权限。如图 6-1 中名为“jack.docx”的文件其类型为普通文件;文件所有者(root 用户)

权限为可读、可写入(因为第 2~4 位是“rw-”,“r”表示有可读权限、“w”表示有可写入权

限、“-”表示没有执行权限);文件拥有组(root 用户组)权限为可读;其他用户(除了 root

用户以外的所有用户)权限为可读。

看家护院——Linux 目录及文件权限管理 第

165

6

图 6-1 目录及文件权限

在 Linux 系统中除了可以使用 r、w、x 表示权限以外,也可通过 4、2、1 三个整数表示

权限,其中 4 表示可读权限、2 表示可写入权限、1 表示可执行权限。一个用户对目录或文件

的权限可用这三个整数相加的值表示,如用户对目录或文件的权限是可读、可执行,那么用

数字表示就是 5(可读是 4、可执行是 1)。

在图 6-1 中“jack.docx”文件的所有者的权限是可读、可写入用数字表示就是 6;拥有组

的权限是可读、可写入用数字表示就是 6;其他用户的权限是可读用数字表示就是 4,所以对

于“jack.docx”文件整个权限用数字表示就是“664”。

6.1.3 目录及文件权限特性

每一种文件系统在处理自己的目录及文件权限时都会有自己的一些特性,只有充分地了

解这些特性后才可以更好地使用权限功能。在 Linux 使用的 ext3 文件系统中对目录及文件权

限的特性主要包括以下几个。

1.用户有效权限 一个用户对某个目录的有效权限,是该用户自己的权限、用户初始组权限、用户额外组

权限之和。在如下内容中,可以发现用户“charles”属于 2 个组,一个是他的初始组“charles”;

一个是他的额外组“test”,文件“lost”拥有组是“test”;文件拥有组权限是可读(r)、可写

(w)。用户“charles”对文件“lost”的权限应该就是可读、可写。

[root@srv tmp]# ll total 0 -rw-rw-r-- 1 root test 0 Feb 15 13:57 lost [root@srv tmp]# groups charles charles : charles test

2.新建目录默认权限 在 RHEL 5.x 中默认情况下 root 用户新建的目录权限是“755”,也就是说目录的所有者

root 用户权限是可读(r=4)、可写入(w=2)、可执行(r=1);目录的拥有组 root 用户组权限

是可读(r=4)、可执行(r=1);其他用户的权限是可读(r=4)、可执行(r=1)。一般用户新

建的目录权限是“775”,也就是说目录的所有者权限是可读(r=4)、可写入(w=2)、可执行

(r=1);目录的拥有组权限是可读(r=4)、可写入(w=2)、可执行(r=1);其他用户的权限是

可读(r=4)、可执行(r=1)。

Linux 从初学到精通

166

当前使用 root 用户。

[root@srv tmp]# id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

建立一个名为“house”的目录。

[root@srv tmp]# mkdir house

root 用户新建的目录权限是“755”。

[root@srv tmp]# ll total 4 drwxr-xr-x 2 root root 4096 Feb 15 13:36 house

切换到 charles 用户。

[root@srv tmp]# su - charles [charles@srv ~]$ cd /tmp

建立一个名为“olivia”的目录。

[charles@srv tmp]$ mkdir olivia

一般用户新建目录权限是“775”。

[charles@srv tmp]$ ll total 8 drwxr-xr-x 2 root root 4096 Feb 15 13:36 house drwxrwxr-x 2 charles charles 4096 Feb 15 13:36 olivia

3.新建文件默认权限 在 RHEL 5.x 中默认情况下 root 用户新建的文件权限是“644”,也就是说文件的所有者

root 用户权限是可读(r=4)、可写入(w=2);文件的拥有组 root 用户组权限是可读(r=4);

其他用户的权限是可读(r=4)。一般用户新建的文件权限是“664”,也就是说文件的所有者

权限是可读(r=4)、可写入(w=2);文件的拥有组权限是可读(r=4)、可写入(w=2);其他

用户的权限是可读(r=4)。

当前使用 root 用户。

[root@srv tmp]# id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

建立一个名为“weeds”的文件。

[root@srv tmp]# touch weeds

root 用户新建的文件权限是“644”。

[root@srv tmp]# ll total 0 -rw-r--r-- 1 root root 0 Feb 15 13:50 weeds

切换到 charles 用户。

[root@srv tmp]# su - charles

看家护院——Linux 目录及文件权限管理 第

167

6[charles@srv ~]$ cd /tmp

建立一个名为“gossipgirl”的文件。

[charles@srv tmp]$ touch gossipgirl

一般用户新建文件权限是“664”。

[charles@srv tmp]$ ll total 0 -rw-rw-r-- 1 charles charles 0 Feb 15 13:50 gossipgirl -rw-r--r-- 1 root root 0 Feb 15 13:50 weeds

新建目录及文件的默认权限是可以修改的。

4.文件拥有者例外 在 Linux 即便文件的权限中所有者并没有写权限,但只要当前用户是文件所有者一样可

以写入文件,如在使用 vim 编辑这样的文件后保存时只需要使用“!”强制保存即可。在下面

的例子中文件 jack 所有者的权限是只读,但由于当前用户是 charles,所以该文件还是可以被

写入的。

[charles@srv tmp]$ id uid=500(charles) gid=500(charles) groups=500(charles),512(test) [charles@srv tmp]$ ll total 0 -r--r--r-- 1 charles root 0 Feb 15 17:13 jack

5.符号链接

在 RHEL 5.x 中建立的符号链接文件的权限都是“777”,也就是说文件的所有者、拥有

组、其他用户的权限都是可读(r=4)、可写入(w=2)、可执行(x=1),但符号链接文件的实

际权限最后会由其指向的文件决定。

6.用户家目录 在 RHEL 5.x 中每个用户的家目录的所有者是家目录对应的用户、拥有组是家目录对应

用户的初始组;权限是“700”,也就是说只有家目录的所有者有可读(r=4)、可写入(w=2)、

可执行(x=1)权限,其他任何用户都没有任何权限。

[root@srv ~]# ll /home total 28 drwx------ 4 jack jack 4096 Feb 14 22:50 jack drwx------ 2 root root 16384 Jan 29 19:08 lost+found drwx------ 4 oliva oliva 4096 Feb 14 14:17 oliva drwx------ 7 charles charles 4096 Feb 15 14:13 charles

7.保护子目录 很多时候用户为了让其他用户可以访问某个目录,如用户家目录。给了用户可执行权限,

但如果没有给可读权限时(对于目录没有可读权限就不能显示目录列表),其他用户必须事先

知道该目录下子目录或文件才可以访问到。因为其他用户不能使用“ls”命令浏览目录中的

内容,这样该目录还是保密的,其他用户只访问用户选择公开的部分。

提 示

Linux 从初学到精通

168

虽然给其他用户可读权限在防止其他用户浏览该目录内容上有一定作用,但这不是非常可

靠。因为尽管其他用户只有执行权限,但是其他用户可以猜到该目录中的内容。比如用户家目

录下通常会有一个名为“.bashrc”的文件,其他用户在不浏览的情况下也可以查看该文件中的

内容。所以在给予其他用户执行权限后,要充分考虑该目录中的文件和子目录的权限。

当前用户是 oliva。

[oliva@srv tmp]$ id uid=510(oliva) gid=510(oliva) groups=503(user3),504(user4),509(jack),510(oliva) [oliva@srv tmp]$ ll total 4

目录“lost”的所有者是 charles,其他用户权限是可执行。

drwxrwx--x 2 charles charles 4096 Feb 15 14:33 lost

用户 oliva 无法查看 lost 目录的列表。

[oliva@srv tmp]$ ll lost/ ls: lost/: Permission denied

但是用户 oliva 还是可以查看 lost 目录下有读取权限的文件。

[oliva@srv tmp]$ cat lost/kate.txt Hello world!!!

文件及目录所有者/拥有组/权限管理

新建立目录及文件时默认的所有者是当前用户,拥有组是当前用户的初始组,可以通过

命令修改文件的所有者和拥有组。root 用户可以修改任何文件的所有者和拥有组,一般用户

只能修改所有者是自己的目录及文件的拥有组。

6.2.1 chgrp:更改目录或文件的拥有组

c hgrp 命令用于更改目录或文件的拥有组,该命令语法如下。

chgrp [-fhRv][--help][--version][用户组] [--reference=<参考文件或目录>] 文件|目录...

常用指数:

常用选项:

文件|目录...:要更改拥有组的文件或目录。

用户组:更改以后的拥有组。

-f:不显示错误信息。

-h:更改遇到的符号链接的拥有组,而非符号链接指向的文件或目录的拥有组。当

遇到符号链接而未指定“-h”选项时,会更改符号链接指向的文件或目录的拥有组,

看家护院——Linux 目录及文件权限管理 第

169

6

而非链接本身的拥有组。

-R:递归处理,将指定目录下的所有文件及子目录一并处理。

-v:显示命令执行过程。

--reference=<参考文件或目录>:把指定文件或目录的拥有组更改成和参考文件或目

录的拥有组相同。

在使用 chgrp 命令指定用户组时,可以使用组名称或 GID。下面看几个 chgrp 命令的

例子。

[root@srv tmp]# ll total 4 drwxr-xr-x 2 root root 4096 Feb 15 14:56 lost

将目录“lost”的拥有组修改为 charles。

[root@srv tmp]# chgrp charles lost/ [root@srv tmp]# ll total 4 drwxr-xr-x 2 root charles 4096 Feb 15 14:56 lost

6.2.2 chown:更改目录或文件的所有者或拥有组

chown 命令用于更改目录或文件的所有者和拥有组,该命令语法如下。

chown [-fhRv] [--reference=<参考文件或目录>] 所有者[:拥有组] 文件|目录...

常用指数:

常用选项:

文件|目录...:要更改拥有组的文件或目录。

-f:不显示错误信息。

-v:显示命令执行过程。

-h:更改遇到的符号链接的所有者或拥有组,而非符号链接指向的文件或目录的所

有者或拥有组。当遇到符号链接而未指定“-h”选项时,会更改符号链接指向的文

件或目录的所有者或拥有组,而非链接本身的所有者或拥有组。

-R:递归处理,将指定目录下的所有文件及子目录一并处理。

--reference=<参考文件或目录>:把指定文件或目录的所有者和拥有组更改成和参考

文件或目录的拥有组相同。

在使用 chown 命令指定用户或用户组时,可以使用名称或 ID。下面看几个 chown 命令

的例子。

当前目录目前情况。

[root@srv tmp]# ll total 12 drwxr-xr-x 2 root root 4096 Feb 15 15:14 fringe

Linux 从初学到精通

170

drwxr-xr-x 2 root root 4096 Feb 15 15:11 house drwxr-xr-x 2 root root 4096 Feb 15 15:11 lost

更改目录“house”的所有者为 charles。

[root@srv tmp]# chown charles house/

更改目录“lost”的拥有组为 charles。

[root@srv tmp]# chown :charles lost

更改目录“fringe”的所有者和拥有组为 charles。

[root@srv tmp]# chown charles:charles fringe/

执行上述更改命令后当前目录的情况。

[root@srv tmp]# ll total 12 drwxr-xr-x 2 charles charles 4096 Feb 15 15:14 fringe drwxr-xr-x 2 charles root 4096 Feb 15 15:11 house drwxr-xr-x 2 root charles 4096 Feb 15 15:11 lost

6.2.3 chmod:更改目录或文件权限

在 Linux 中默认可以配置所有者、拥有组及其他用户对目录或文件的权限。可用的权限

包括可读、可写入、可执行。

chmod 命令用于更改目录或文件的权限。该命令有两种用法,一种是包含字母和操作符

表达式的文字配置方法;另一种是包含数字的数字配置方法。该命令语法如下。

chmod [-fRv] [--reference=<参考文件或目录>] [u|g|o|a] [+|-|=] 权限字符 文件|目录... chmod [-fRv] 权限数字 文件|目录...

常用指数:

常用选项:

文件|目录...:要更改权限的文件或目录。

--reference=<参考文件或目录>:把指定文件或目录的权限更改成和参考文件或目录

的拥有组相同。

-f:不显示错误信息。

-v:显示命令执行过程。

-R:递归处理,将指定目录下的所有文件及子目录一并处理。

u:更改所有者的权限。

g:更改拥有组的权限。

o:更改其他用户的权限。

a:同时更改所有者、拥有组其他用户的权限。

+:在现有权限基础上增加新的权限。

-:取消现有权限。

=:将权限改为指定值。

看家护院——Linux 目录及文件权限管理 第

171

6

权限字符:可读(r)、可写入(w)、可执行(x)三种中任意一种或多种。

权限数字:4 表示可读权限、2 表示可写入权限、1 表示可执行权限。

chmod 可以用于修改目录或文件的权限,下面看几个 chmod 命令的例子。

当前目录目前情况。

[root@srv tmp]# ll total 40 drwxr-xr-x 2 root root 4096 Feb 15 16:36 csi drwxr-xr-x 2 root root 4096 Feb 15 16:38 dexter drwxr-xr-x 2 root root 4096 Feb 15 16:38 everwood drwxr-xr-x 2 root root 4096 Feb 15 16:38 friends drwxr-xr-x 2 root root 4096 Feb 15 15:14 fringe drwxr-xr-x 2 root root 4096 Feb 15 15:11 house

将目录 csi 的权限修改为“777”,也就是说文件的所有者、拥有组、其他用户的权

限都是可读(r=4)、可写入(w=2)、可执行(x=1)。

[root@srv tmp]# chmod 777 csi/

将目录 dexter的权限修改为“644”,也就是说所有者权限是可读(r=4)、可写入(w=2);

目录的拥有组权限是可读(r=4);其他用户的权限是可读(r=4)。

[root@srv tmp]# chmod 644 dexter/

将目录 everwood 的权限修改为文件的所有者、拥有组、其他用户的权限都是可读

(r=4)、可写入(w=2)、可执行(x=1)。

[root@srv tmp]# chmod a=rwx everwood/

将目录 friends 拥有组现有权限减去只读权限。

[root@srv tmp]# chmod g-r friends/

将目录 fringe 其他用户权限在现有的基础上加入可读(r)、可写入(w)权限。

[root@srv tmp]# chmod o+rw fringe/

将目录 house 所有者权限更改为可读(r)、可写入(w)、可执行(x);拥有组权限

可读(r)、可执行(x);其他用户权限更改为可执行(x)。

[root@srv tmp]# chmod u=rwx,g=rx,o=x house/

执行上述更改命令后当前目录的情况。

[root@srv tmp]# ll total 40 drwxrwxrwx 2 root root 4096 Feb 15 16:36 csi drw-r--r-- 2 root root 4096 Feb 15 16:38 dexter drwxrwxrwx 2 root root 4096 Feb 15 16:38 everwood drwx--xr-x 2 root root 4096 Feb 15 16:38 friends drwxr-xrwx 2 root root 4096 Feb 15 15:14 fringe drwxr-x--x 2 root root 4096 Feb 15 15:11 house drwxr-xr-x 2 root root 4096 Feb 15 16:37 hustle

Linux 从初学到精通

172

目录及文件高级权限管理

对目录或文件的所有者、拥有组和其他用户配置权限只是 Linux 权限体系中最基础的内

容,下面是一些 Linux 权限体系中高级属性的配置方法。

6.3.1 权限掩码

在 Windows 中新建的目录及文件会自动继承上级目录的权限,这点与 Linux 是完全不一

样的,在 6.1.3 中已经说明新建目录及文件默认的权限。如果觉得这样的默认配置不能满足

需要,可以通过修改 umask 值(权限掩码)来改变默认行为。

在 Linux 内核级别新建文件的默认权限是 666,也就是说文件的所有者权限是可读(r=4)、

可写入(w=2);文件的拥有组权限是可读(r=4)、可写入(w=2);其他用户的权限是可读(r=4)、

可写入(w=2)。

在 Linux 内核级别新建目录的默认权限是 777,也就是说目录的所有者权限是可读(r=4)、

可写入(w=2)、可执行(x=1);目录的拥有组权限是可读(r=4)、可写入(w=2)、可执行

(x=1);其他用户的权限是可读(r=4)、可写入(w=2)、可执行(x=1)。

umask 值是一个三位的整数,其中百位是所有者权限掩码;十位是拥有组权限掩码;个

位是其他用户权限掩码。当用户在新建目录或文件时真正的权限会使用 Linux 内核级别默认

权限减去 umask 值。比如在 RHEL 5.x 中 root 用户默认的 umask 值是“022”,那么新建的文

件默认权限就应该是 666-022;一般用户默认的 umask 值是“002”,那么新建的文件默认权

限就应该是 666-002。通过“umask”命令可以查看当前用户的 umask 值。

[root@srv tmp]# id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) [root@srv tmp]# umask 0022

使用-S 选项使得在 umaks 命令在显示权限掩码时使用 r、w、x 的方法。

[root@srv ~]# umask -S u=rwx,g=rx,o=rx

在显示的 umask 值是一个四位的整数,现在先忽略开头的“0”。其意义在后续章中讲

述。

可以使用“umask 权限掩码”命令修改现有用户的 umask 值。使用 umask 命令修改的内

容在重新启动后会失效,如果希望永久生效可以将该命令放入“~/.bashrc”文件中。

[root@srv tmp]# id uid=0(root) gid=0(root)

groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) [root@srv tmp]# umask 0022

提 示

看家护院——Linux 目录及文件权限管理 第

173

6[root@srv tmp]# touch jack [root@srv tmp]# ll total 0 -rw-r--r-- 1 root root 0 Feb 15 17:13 jack [root@srv tmp]# umask 011 [root@srv tmp]# touch chloe [root@srv tmp]# ll total 0 -rw-rw-rw- 1 root root 0 Feb 15 17:15 chloe -rw-r--r-- 1 root root 0 Feb 15 17:13 jack

6.3.2 特殊权限

在生产情况中对于文件系统权限的需求是多种多样的,Linux 的文件系统完全可以满足

这样的需要,除了普通的可读、可写入、可执行权限以外还包括一些特殊的权限。

1.SUID 属性 passwd 命令可以用于更改用户的密码,一般用户可以使用这个命令修改自己的密码。但

是保存用户密码的/etc/shadow 文件的权限是 400,也就是说只有文件的所有者 root 用户可以

写入,那为什么其他用户也可以修改自己的密码呢?这就是由于 Linux 的文件系统中的文件

有 SUID 属性。

[root@srv ~]# ll /etc/shadow -r-------- 1 root root 1128 Feb 15 14:33 /etc/shadow

SUID 属性只能运用在可执行文件上,当用户执行该执行文件时,会临时拥有该执行文

件所有者的权限。passwd 命令启用了 SUID 功能,所以一般用户在使用 passwd 命令修改密码

时,会临时拥有了 passwd 命令所有者 root 用户的权限,这样一般用户才可以将自己的密码

写入/etc/shadow 文件。在使用“ls -l”或“ll”命令浏览文件时,如果可执行文件所有者权限

的第三位是一个小写的“s”就表明该执行文件拥有 SUID 属性。

[root@srv ~]# ll /usr/bin/passwd -rwsr-xr-x 1 root root 22960 Jul 17 2006 /usr/bin/passwd

如果在浏览文件时,发现所有者权限的第三位是一个大写的“S”则表明该文件的 SUID

属性无效,比如将 SUID 属性给一个没有执行权限的文件。

2.SGID 属性

SGID 与 SUID 不同,SGID 属性可以应用在目录或可执行文件上。当 SGID 属性应用在

目录上时,该目录中所有建立的文件或子目录的拥有组都会是该目录的拥有组。如“/charles”

目录的拥有组是 charles,当“/charles”目录拥有 SGID 属性时,任何用户在该目录中建立的

文件或子目录的拥有组都会是 charles;当 SGID 属性应用在可执行文件上时,其他用户在使

用该执行文件时就会临时拥有该执行文件拥有组的权限。如/sbin/apachectl 文件的拥有组是

httpd,当/sbin/apachectl 文件有 SGID 属性时,任何用户在执行该文件时都会临时拥有用户组

httpd 的权限。在使用“ls -l”或“ll”命令浏览文件或目录时,如果拥有组权限的第三位是一

个小写的“s”就表明该执行文件或目录拥有 SGID 属性。

[root@srv tmp]# ll

Linux 从初学到精通

174

total 4 drwxr-sr-x 2 root root 4096 Feb 15 22:25 fringe -r-xr-sr-x 1 root root 6144 Feb 15 22:25 jack

如果在浏览文件时,发现拥有组权限的第三位是一个大写的“S”则表明该文件的 SGID

属性无效,比如将 SGID 属性给一个没有执行权限的文件。

3.Sticky 属性

Sticky 属性只能应用在目录,当目录拥有 Sticky 属性所有在该目录中的文件或子目录无

论是什么权限只有文件或子目录所有者和 root 用户能删除。比如当用户 oliva 在“/charles”

目录中建立一个文件并将该文件权限配置为 777,当/charles 目录拥有 Sticky 属性时,只有 root

和 oliva 用户可以将该文件删除。在使用“ls -l”或“ll”命令浏览目录时,如果其他用户权

限的第三位是一个小写的“t”就表明该执行文件或目录拥有 Sticky 属性。

[root@srv tmp]# ll total 4 drwxrwxrwt 2 root root 4096 Feb 15 22:34 fringe

4.配置 SUID/SGID/Sticky 属性 配置普通权限时可以使用字符或数字,SUID、SGID、Sticky 也是一样。使用字符时 s

表示 SUID 和 SGID、t 表示 Sticky;4 表示 SUID、2 表示 SGID、1 表示 Sticky。在配置这些

属性时还是使用 chmod 命令。

当前目录目前情况。

[root@srv tmp]# ll total 52 drwxr-xr-x 2 root root 4096 Feb 15 22:47 csi drwxr-xr-x 2 root root 4096 Feb 15 22:47 dexter drwxr-xr-x 2 root root 4096 Feb 15 22:46 fringe drwxr-xr-x 2 root root 4096 Feb 15 22:46 house -r-xr-xr-x 1 root root 5120 Feb 15 22:46 jack -r-xr-xr-x 1 root root 3072 Feb 15 22:50 kate drwxr-xr-x 2 root root 4096 Feb 15 22:56 lost -r-xr-xr-x 1 root root 6144 Feb 15 22:48 oliva -r-xr-xr-x 1 root root 9216 Feb 15 22:51 shannon 为文件 jack增加 SUID属性。 [root@srv tmp]# chmod u+s jack

为文件 oliva 增加 SUID 属性。在使用数字表示时,原来的三位不变,只是增加了一

个千位专门用于 SUID、SGID、Sticky 属性。下面的 4 就是 SUID 属性。

[root@srv tmp]# chmod 4555 oliva

为目录 csi 增加 SGID 属性。

[root@srv tmp]# chmod g+s csi/

为目录 dexter 增加 SGID 属性。

[root@srv tmp]# chmod 2755 dexter/

为文件 kate 增加 SUID 和 SGID 属性,6=4(SUID)+2(SGID)。

看家护院——Linux 目录及文件权限管理 第

175

6[root@srv tmp]# chmod 6555 kate

为目录 fringe 增加 Sticky 属性。

[root@srv tmp]# chmod o+t fringe/

为目录 house 增加 Sticky 属性。

[root@srv tmp]# chmod 1755 house/

为目录 lost 增加 SGID 和 Sticky 属性,3=2(SGID)+1(Sticky)。

[root@srv tmp]# chmod 3755 lost/

执行上述更改命令后当前目录的情况。

[root@srv tmp]# ll total 52 drwxr-sr-x 2 root root 4096 Feb 15 22:47 csi drwxr-sr-x 2 root root 4096 Feb 15 22:47 dexter drwxr-xr-t 2 root root 4096 Feb 15 22:46 fringe drwxr-xr-t 2 root root 4096 Feb 15 22:46 house -r-sr-xr-x 1 root root 5120 Feb 15 22:46 jack -r-sr-sr-x 1 root root 3072 Feb 15 22:50 kate drwxr-sr-t 2 root root 4096 Feb 15 22:56 lost -r-sr-xr-x 1 root root 6144 Feb 15 22:48 oliva -r-xr-xr-x 1 root root 9216 Feb 15 22:51 shannon

取消目录 lost 的 SGID 属性。

[root@srv tmp]# chmod g-s lost/

在使用 umask 命令显示当前的权限掩码时,千位的“0”就是表示 SUID、SGID、Sticky

属性。

在有些资料上 SUID、SGID 被翻译为“强制位”,Sticky 被翻译为“冒险位”。

6.3.3 ACL

在学习了为文件或目录的所有者、拥有组、其他用户配置可读、可写入、可执行权限后,

是不是觉得 Linux 文件系统所提供的权限功能没有 Windows 中的 NTFS 权限功能强大呢?的

确如果只能对所有者、拥有组、其他用户三种对象配置权限是无法满足用户的需求的,所以

这时我们就需要使用到 Linux 文件系统中所提供的 ACL(访问控制列表)功能。利用 Linux

文件系统提供的 ACL 功能为系统中已存在的任何用户或用户组指定其对系统中文件或目录

的权限。

通过 ACL 功能配置的权限优先级高于通过 chmod 命令配置的普通权限,如某文件的所

有者和拥有组是 charles,该文件的普通权限是 755,也就是说除了 charles 和 root 用户以外的

用户是没有写入权限的,但是通过 ACL 配置了 oliva 用户对该文件有写权限,那么 oliva 用户

对该文件是有写权限的。

提 示

Linux 从初学到精通

176

在使用“ls -l”或“ll”命令浏览文件或目录时,在权限部分多了一个“+”表示该文件

或目录已经配置了 ACL 功能。

[root@srv tmp]# ll total 8 drwxrwxr-x+ 2 root root 4096 Feb 15 23:25 house

1.配置分区支持 ACL 功能 在 RHEL 5.x 中只有在安装操作系统时建立的分区才支持 ACL 功能,其他分区在默认情

况下是不支持 ACL 功能。如果希望让那些在安装操作系统完成后建立的分区支持 ACL 功能

可以使用以下几种方法。

(1)使用 tune2fs 命令。tune2fs 功能非常多,但这里重点说明与 ACL 有关的功能。使用

tune2fs 命令让一个分区永久支持 ACL 功能,该命令配置分区支持 ACL 的语法如下。

tune2fs -o acl 分区

在下面的例子中使用 tune2fs 命令使/dev/sda12 永久支持 ACL 功能,在配置完成后,可

通过“tune2fs -l 分区”命令查看。

使/dev/sda12 永久支持 ACL 功能。

[root@srv ~]# tune2fs -o acl /dev/sda12

使用-l 选项可查看分区的配置情况。

[root@srv ~]# tune2fs -l /dev/sda12 tune2fs 1.39 (29-May-2006) Filesystem volume name: <none> Last mounted on: <not available> Filesystem UUID: 8c54398d-e4c8-4777-9d09-26eed1041049 Filesystem magic number: 0xEF53 Filesystem revision #: 1 (dynamic) Filesystem features: has_journal resize_inode dir_index filetype sparse_super #在“Default mount options:”的值中包括“acl”就说明该分区支持 ACL功能。 Default mount options: acl Filesystem state: clean Errors behavior: Continue Filesystem OS type: Linux

(2)使用 mount 命令。mount 命令主要用于进行磁盘挂载的操作,该命令功能非常多,

但这里重点说明与 ACL 有关的功能,该命令其他功能见第 7 章。使用 mount 命令让一个分

区临时支持 ACL 功能(在重新启动计算机后 ACL 会失效),该命令配置分区支持 ACL 的语

法如下。

mount -o remount,acl 分区 mount -o acl 分区 挂载点

使用 mount 命令让一个分区临时支持 ACL 功能时,可以使用以上两种方式。第一种使

用在分区已经被挂载的情况,也就是说这个分区已经在使用但还不支持 ACL 功能,在不影响

分区使用的情况下重新挂载分区使其支持 ACL 功能;第二种使用在一开始挂载分区时就使其

支持 ACL 功能。在下面的例子中使用 mount 命令使分区临时支持 ACL 功能,在配置完成后,

看家护院——Linux 目录及文件权限管理 第

177

6

可通过“mount”命令查看。

使用 mount 命令使一个已经挂载的分区(/dev/sda13)支持 ACL 功能。

[root@srv ~]# mount -o remount /dev/sda13

使用 mount 命令挂载/dev/sda14 分区并支持 ACL 功能。

[root@srv ~]# mount -o acl /dev/sda14 /media/sda14 [root@srv ~]# mount #使用 mount命令查看。 /dev/sda7 on / type ext3 (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) /dev/sda8 on /tmp type ext3 (rw) /dev/sda6 on /var type ext3 (rw) /dev/sda3 on /home type ext3 (rw) /dev/sda2 on /usr type ext3 (rw) /dev/sda5 on /usr/local type ext3 (rw) /dev/sda1 on /boot type ext3 (rw) tmpfs on /dev/shm type tmpfs (rw) /dev/sda10 on /media/sda10 type ext3 (rw) /dev/sda11 on /media/sda11 type ext3 (rw,acl) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) none on /proc/fs/vmblock/mountPoint type vmblock (rw) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw) #如果分区支持 ACL功能时,在挂载信息中会显示出来。 /dev/sda13 on /media/sda13 type ext3 (rw,acl) /dev/sda14 on /media/sda14 type ext3 (rw,acl)

(3)修改/etc/fstab 文件,使分区永久支持 ACL 功能。在/etc/fstab 文件中在需要支持 ACL

功能分区的挂载选项列中加上“,acl”即可使分区永久支持 ACL 功能。在下面/etc/fstab 文件

的例子中/dev/sda10 就支持 ACL 功能。在修改/etc/fstab 文件后,为了让配置生效需要重新启

动计算机或使用“mount -o remount 分区”命令。

[root@srv ~]# cat /etc/fstab

LABEL=/ / ext3 defaults 1 1

LABEL=/tmp /tmp ext3 defaults 1 2

LABEL=/var /var ext3 defaults 1 2

LABEL=/home /home ext3 defaults 1 2

LABEL=/usr /usr ext3 defaults 1 2

LABEL=/usr/local /usr/local ext3 defaults 1 2

LABEL=/boot /boot ext3 defaults 1 2

tmpfs /dev/shm tmpfs defaults 0 0

devpts /dev/pts devpts gid=5,mode=620 0 0

sysfs /sys sysfs defaults 0 0

proc /proc proc defaults 0 0

LABEL=SWAP-sda9 swap swap defaults 0 0

Linux 从初学到精通

178

/dev/sda10 /media/sda10 ext3 defaults,acl 0 0

通过 tune2fs 命令使分区支持 ACL 功能后,通过 mount 命令是无法查看到的,通过修改

/etc/fstab 使分区支持 ACL 功能后,通过 mount 命令可以查看到分区支持 ACL 功能。

2.setfacl:配置文件或目录的 ACL 在配置了分区支持 ACL 功能后,就可以使用 setfacl 命令让文件或目录使用 ACL 功能配

置更精细的权限。在 Linux 中对文件或目录的权限是可读、可写入、可执行,ACL 功能可对

不同的用户配置这些权限,该命令语法如下。

setfacl [-bkdR] [{-m|-x} <ACL规则>] 文件|目录...

常用指数:

常用选项:

文件|目录...:需要配置 ACL 的文件或目录。

-m:更改文件或目录的 ACL 规则。

-x:删除文件或目录指定的 ACL 规则。

-b:删除文件或目录所有 ACL 规则。

-k:删除文件或目录默认的 ACL 规则。

-d:指定文件或目录默认的 ACL 规则。

--test:测试模式,不会改变任何文件或目录的 ACL 规则,操作后的 ACL 规格将被

显示。

-R:递归处理,将指定目录下的所有文件及子目录一并处理。

在该命令中指定 ACL 规则可以使用以下几种方式。

(1)[d:]u:<UID|用户>:权限:指定用户的 ACL,[d:]表示配置用户对文件或目录的默认的

ACL,权限可以使用字符或数字。

(2)[d:]g:<GID|用户组>:权限:指定用户的 ACL,[d:]表示配置用户对文件或目录的默认

的 ACL,权限可以使用字符或数字。

(3)[d:]o:权限:相关于普通权限中其他用户的权限,[d:]表示配置用户对文件或目录的

默认的 ACL,权限可以使用字符或数字。

(4)[d:] m:权限:指定有效权限,[d:]表示配置的默认的权限,权限可以使用字符或数字。

在文件或目录配置了 ACL 后,如果使用 cp 命令复制时要保留 ACL 必须使用“-p”选项,

如果使用 mv 命令移动时默认就会保留 ACL。当然前提是目标目录所有分区支持 ACL 功能。

下面看几个 setfacl 命令的例子。

(1)配置用户 ACL。

目前还没有学习如何建立分区,所以利用现有分区中的 tmp 目录。

提 示

看家护院——Linux 目录及文件权限管理 第

179

6[root@srv ~]# cd /tmp

当前目录目前情况。

[root@srv tmp]# ll total 8 drwxr-xr-x 2 root root 4096 Feb 16 17:15 fringe drwxr-xr-x 2 root root 4096 Feb 16 17:14 house

配置用户 charles 对目录 fringe 有可读、可写权限。

[root@srv tmp]# setfacl -m u:charles:rw fringe/

配置用户 charles 对目录 house 有可读、可写、可执行权限。

[root@srv tmp]# setfacl -m u:charles:7 house/

浏览目录时,在权限最后一位是一个“+”表示这两个目录配置了 ACL。

[root@srv tmp]# ll total 16 drwxrwxr-x+ 2 root root 4096 Feb 16 17:15 fringe drwxrwxr-x+ 2 root root 4096 Feb 16 17:14 house

切换到用户 charles。

[root@srv tmp]# su - charles [charles@srv ~]$ cd /tmp/house/

在目录 house 有写权限了。

[charles@srv house]$ touch Cameron

(2)配置用户默认 ACL。

目前还没有学习如何建立分区,所以利用现有分区中的 tmp 目录。

[root@srv ~]# cd /tmp

当前目录目前情况。

[root@srv tmp]# ll total 4 drwxr-xrwx 2 root root 4096 Feb 16 19:53 house

配置用户 cameron 对目录 house 的默认 ACL 有可读、可写、可执行权限,当用户

cameron 在目录 house 中建立子目录或文件时,会自动继承这个 ACL。

[root@srv tmp]# setfacl -m d:u:cameron:rwx house/

浏览目录在权限最后一位是一个“+”表示这两个目录配置了 ACL。

[root@srv tmp]# ll total 8 drwxr-xrwx+ 2 root root 4096 Feb 16 19:53 house

切换到用户 cameron。

[root@srv tmp]# su - Cameron

Linux 从初学到精通

180

[cameron@srv ~]$ cd /tmp/house/ [cameron@srv house]$ mkdir season6

建立的子目录自动继承了 ACL。

[cameron@srv house]$ ll total 8 drwxrwxrwx+ 2 cameron cameron 4096 Feb 16 20:03 season6

(3)配置用户组 ACL。

目前还没有学习如何建立分区,所以利用现有分区中的 tmp 目录。

[root@srv ~]# cd /tmp

当前目录目前情况。

[root@srv tmp]# ll total 8 drwxr-xr-x 2 root root 4096 Feb 16 17:24 24 drwxr-xr-x 2 root root 4096 Feb 16 17:24 csi

配置用户组 ctu 对目录 24 有可读、可写、可执行权限。

[root@srv tmp]# setfacl -m g:ctu:rwx 24

配置用户组 ctu 对目录 csi 没有任何权限。

[root@srv tmp]# setfacl -m g:ctu:--- csi

浏览目录时,在权限最后一位是一个“+”表示这两个目录配置了 ACL。

[root@srv tmp]# ll total 16 drwxrwxr-x+ 2 root root 4096 Feb 16 17:24 24 drwxr-xr-x+ 2 root root 4096 Feb 16 17:24 csi

切换到用户 jack。

[root@srv tmp]# su - jack [jack@srv ~]$ id

用户 jack 属于用户组 ctu。

uid=509(jack) gid=509(jack) groups=503(user3),504(user4),509(jack),513(ctu)

对目录没有执行权限,所以用户 jack 无法进入目录 csi。

[jack@srv ~]$ cd /tmp/csi -bash: cd: /tmp/csi: Permission denied

(4)配置用户组默认 ACL。

目前还没有学习如何建立分区,所以利用现有分区中的 tmp 目录。

[root@srv ~]# cd /tmp

当前目录目前情况。

[root@srv tmp]# ll

看家护院——Linux 目录及文件权限管理 第

181

6total 4 drwxr-xrwx 2 root root 4096 Feb 16 20:12 24

配置用户组 ctu 对目录 24 的默认 ACL 有可执行权限,当属于用户组 ctu 的用户在目

录 24 中建立子目录或文件时,会自动继承这个 ACL。

[root@srv tmp]# setfacl -m d:g:ctu:x 24

浏览目录时,在权限最后一位是一个“+”表示这两个目录配置了 ACL。

[root@srv tmp]# ll total 8 drwxr-xrwx+ 2 root root 4096 Feb 16 20:12 24

切换到用户 jack。

[root@srv tmp]# su - jack

用户 jack 属于用户组 ctu。

[jack@srv ~]$ id uid=509(jack) gid=509(jack) groups=503(user3),504(user4),509(jack),513(ctu) [jack@srv ~]$ cd /tmp/24 [jack@srv 24]$ mkdir season8

建立的子目录自动继承了 ACL。

[jack@srv 24]$ ll total 8 drwxr-xr-x+ 2 jack jack 4096 Feb 16 20:15 season8

(5)删除指定 ACL。

目前还没有学习如何建立分区,所以利用现有分区中的 tmp 目录。

[root@srv ~]# cd /tmp

使用 getfacl 命令查看 house 目录的 ACL,可以发现用户 cameron 对该目录有可读、

可写、可执行权限。

[root@srv tmp]# getfacl house # file: house # owner: root # group: root user::rwx user:jack:--- user:cameron:rwx group::r-x mask::rwx other::r-x

取消用户 cameron 在目录 house 上的 ACL。

[root@srv tmp]# setfacl -x u:cameron house

再次查看目录 house 的 ACL 时,已经没有用户 cameron。

[root@srv tmp]# getfacl house/

Linux 从初学到精通

182

# file: house # owner: root # group: root user::rwx user:jack:--- group::r-x mask::r-x other::r-x

(6)删除所有 ACL。

目前还没有学习如何建立分区,所以利用现有分区中的 tmp 目录。

[root@srv ~]# cd /tmp

使用 getfacl 命令查看 house 目录的 ACL,可以发现用户 cameron 对该目录有可读、

可写、可执行权限;用户 jack 对该目录没有任何权限。

[root@srv tmp]# getfacl house # file: house # owner: root # group: root user::rwx user:jack:--- user:cameron:rwx group::r-x mask::rwx other::r-x

删除目录 house 上的所有权限。

[root@srv tmp]# setfacl -b house

再次查看目录 house 的 ACL 时,已经没有任何 ACL。

[root@srv tmp]# getfacl house/ # file: house # owner: root # group: root user::rwx group::r-x other::r-x

(7)配置 ACL 有效权限。

目前还没有学习如何建立分区,所以利用现有分区中的 tmp 目录。

[root@srv ~]# cd /tmp

用户 jack 对目录 24 的权限是可读、可写、可执行。

[root@srv tmp]# getfacl 24 # file: 24 # owner: root # group: root user::rwx user:jack:rwx

看家护院——Linux 目录及文件权限管理 第

183

6group::r-x mask::rwx other::r-x

切换到用户 jack 后,可进入目录 24,也可以浏览和写入。

[root@srv tmp]# su - jack [jack@srv ~]$ cd /tmp/24 [jack@srv 24]$ mkdir Season8 [jack@srv 24]$ ll total 4 drwxrwxr-x 2 jack jack 4096 Feb 16 20:30 Season8

回到 root 用户。

[jack@srv 24]$ exit

指定目录 24 有效权限为可读、可执行。

[root@srv tmp]# setfacl -m m:rx 24

切换到用户 jack 后,可进入目录 24,也可以浏览。

[root@srv tmp]# su - jack [jack@srv ~]$ cd /tmp/24 [jack@srv 24]$ ll total 4 drwxrwxr-x 2 jack jack 4096 Feb 16 20:30 Season8

但是已经没有了写入权限。

[jack@srv 24]$ mkdir Season7 mkdir: cannot create directory `Season7': Permission denied

明明配置了用户 jack 的 ACL 中有写入权限,为什么这里没有权限写了呢?这是因为目

录 24 上配置的有效 ACL 为可读、可权限,Linux 会将有效权限于用户或用户组的 ACL 中进

行“AND”运行,也就是说只有在有效 ACL 中有的权限用户或用户组才可能得到。目录 24

的有效权限是可读、可执行,所以对该目录配置 ACL 时,最多可以得到这两个权限。即使

jack 有写入权限也是没有意义的。

3.getfacl:查看文件或目录的 ACL 通过“ls -l”或“ll”命令浏览文件或目录时,只能知道文件或目录是否已配置了 ACL

功能,但具体配置的内容必须使用 getfacl 命令查看,该命令语法如下。

getfacl [-dR] [--omit-header] [--no-effective] 文件|目录...

常用指数:

常用选项:

文件|目录...:需要显示 ACL 的文件或目录。

-d:显示默认的 ACL。

-R:显示目录及其子目录和文件的 ACL。

Linux 从初学到精通

184

--omit-header:不显示文件或目录的基本信息。

--no-effective:不显示有效权限。

getfacl 命令可以显示配置了 ACL 的文件或目录的准确权限,下面看几个 getfacl 命令的

例子。

目录 fringe 权限部分以“+”结尾,说明该目录配置了 ACL。

[root@srv tmp]# ll total 15 drwxr-xr-x+ 2 root root 1024 Feb 16 15:05 fringe drwx------ 2 root root 12288 Feb 16 12:47 lost+found drwxr-xr-x 2 root root 1024 Feb 16 15:09 weeds

显示目录 fringe 的默认权限。

[root@srv tmp]# getfacl fringe/ # file: fringe #文件或目录的名称。 # owner: root #文件或目录的所有者。 # group: root #文件或目录的拥有组。 user::rwx #文件或目录的所有者权限。

用户 charles的权限,后面的“#effective”显示的是该用户有效权限。root 用户为 charles

配置的该目录权限是 rwx,但由于该目录的有效权限是 rx,所以最后该用户实际的

权限只有 rx。

user:charles:rwx #effective:r-x group::r-x #文件或目录的拥有组权限。 mask::r-x #文件或目录的最大权限。 other::r-x #其他用户权限。

在为文件和目录配置了 ACL 功能后,通过“ls -l”或“ll”命令浏览文件或目录时,

拥有组权限位显示的不再是该文件或目录拥有组权限,而是 ACL 的最大权限,所以要查看

文件的准确权限应该使用 getfacl 命令。

实验任务

在一台安装了 RHEL 5.x 的计算机上完成以下任务。

(1)建立“/tmp/lost/kate”、“/tmp/lost/shannon”、“/tmp/lost/charlie”目录。

(2)将“/tmp/lost”目录及其下所有目录及文件拥有组改为用户组 lost。

(3)将“/tmp/lost/kate”目录的所有者和拥有组改为用户组 kate。

(4)将“/tmp/lost/shannon”目录的所有者和拥有组改为用户组 shannon。

(5)将“/tmp/lost/charlie”目录的所有者和拥有组改为用户组 charlie。

提 示

看家护院——Linux 目录及文件权限管理 第

185

6

(6)在“/tmp/lost”目录中建立的目录及文件只有建立者和 root 用户可以删除。

(7)将“/tmp/lost/kate”目录的权限配置为所有者可读、可写、可执行;拥有组可读、可

执行;其他用户可读。

(8)将“/tmp/lost”目录的权限配置为用户 house 可读,用户 jack 可读、可执行,用户

组 fringe 可读、可执行。

(9)保证在“/tmp/lost/kate”目录中建立的目录或文件的默认权限为用户 oliva 可读、可

执行。

(10)保证在“/tmp/lost/shannon”目录中其他用户可以得到的最大权限是可读、可执行。

本章测试

(1)一般用户可以修改自己的密码,是否 Linux 文件系统权限中有( )功能。

A.SUID B.Sticky

C.SGID D.ACL

(2)在目录 house 中用户 cameron 的权限是( )。

[root@srv tmp]# getfacl --no-effective house/ # file: house # owner: root # group: root user::rwx user:cameron:rwx group::r-x mask::r-x other::r-x

A.rw B.r

C.rx D.rwx

(3)下列( )肯定配置了有效的 SUID 功能。

[root@srv tmp]# ll total 36 -rwSr--r-- 1 root root 9216 Feb 16 23:15 house.docx -rwxr-sr-x 1 root root 10240 Feb 16 23:15 house.exe -rwsr-xr-x 1 root root 4096 Feb 16 23:16 house.sh -rwSr--r-- 1 root root 5120 Feb 16 23:15 house.xlsx

A.house.docx B.house.sh

C.house.exe D.house.xlsx

(4)用户 root 执行了“umask 222”后,其新建的目录默认权限为( )。

A.777 B.555

C.444 D.111

(5)( )命令可以将目录/house 的拥有组设为用户组 house。

A.chmod house /house B.chown :house /house

Linux 从初学到精通

186

C.chown house /house D.chmod :house /house

(6)数字 2 可以表示( )。

A.SGID B.ACL

C.SUID D.Sticky

(7)下列数字中( )不可能用于表示权限。

A.7 B.5

C.9 D.4

(8)( )可以使得目录/house 中的内容只有建立者和 root 用户可以删除。

A.chmod 755 /house B.chmod u+s /house

C.chmod g+s /house D.chmod o+t /house

(9)执行了“chmod –R o=rwx/house”后,其他用户对目录/house/cameron 的权限是( )。

A.Rw B.rwx

C.R D.不确定

(10)下列目录中( )肯定配置了 ACL 功能。

[root@srv tmp]# ll total 24 dr-xr-sr-x 2 root root 4096 Feb 16 22:58 24 drwxrwxrwx 2 root root 4096 Feb 16 23:12 csi drwsr-xr-x 2 root root 4096 Feb 16 23:13 dexter drwxr-xr-t 2 root root 4096 Feb 16 23:12 fringe drwxr-xr-x+ 3 root root 4096 Feb 16 20:30 house

A.house B.dexter

C.fringe D.csi

日常操作系统的使用几乎都是围绕着文件系统而展开的,一

块新的硬盘安装到计算机上后并不是马上就可以使用,我们需对

其进行分区、格式化后才可以使用。每种操作系统都是自己特有

的文件系统,在本章主要讲解如何在 Linux 系统中对硬盘进行分

区和格式化。

第7章

我的地盘我做主︱︱Linux

磁盘及文件系统管理

Linux 从初学到精通

188

Linux 磁盘分区

和大多数操作系统一样 Linux 允许将磁盘分割为多个分区,每个分区实际上被当做一个

独立的磁盘。创建分区的过程叫做磁盘分区。

7.1.1 Linux 硬盘管理方式

不同的操作系统都有其固定的记录磁盘分区信息的方式。因为传统上 Linux 可以与以

DOS 为基础的系统间互相操作,所以常见的分区方案是 DOS 分区。DOS 分区方案特征如下,

如图 7-1 所示。

图 7-1 /dev/sda

(1)MBR:每个磁盘的第一个数据块(512 字节)为其主引导记录(Master Boot Record,

MBR)。在 MBR 中主要包括以下内容。

引导程序(Bootloader):在可引导磁盘上,MBR 中有一个低层可执行文件叫引导程

序,引导时 BIOS 将控制权交给引导程序,引导程序负责装载然后将控制权交给合

适的操作系统。

分区表(Partiton Table):在每个磁盘上,引导记录中的 64 个字节被保留为磁盘分

区表。在这个空间中 多可以记录 4 个分区。

(2)主分区:每个磁盘 多可以划分 4 个主分区,其属性记录在 MBR 的分区表中。Linux

将主分区命名为 1~4。在图 7-1 中第一个主分区是/dev/sda1、第二个主分区是/dev/sda2。

(3)扩展分区:为了解决一块磁盘只能划分 4 个分区而引入了扩展分区,只有在主分区

小于 4 个时才可以划分扩展分区,在一块磁盘上 多只能有一个扩展分区。扩展分区本身并

不能保存用户数据,必须在扩展分区中进一步划分成多个逻辑分区。扩展分区并不是必需的,

如果一个磁盘上的 4 个分区够用就不必再使用扩展分区。

(4)逻辑分区:在扩展分区中可以建立多个逻辑分区。逻辑分区的分区信息作为一个链

表存在,所以在理论上讲可以建立的逻辑分区的数目不受限制。在实际工作中,设备驱动程

序会限制这个数目,如果在 IDE 硬盘 多可以划分 63 个分区、SCSI 硬盘 多可以划分 15

个分区。Linux 总是把第一个逻辑分区标记为 5,即使没有使用所有的 4 个分区,逻辑分区也

是从 5 开始。

我的地盘我做主——Linux 磁盘及文件系统管理 第

189

7

7.1.2 通过命令对磁盘进行分区

在 Linux 中 常用的分区工具是 fdisk。这个命令行工具可以在 基本的环境中选择,但

是只有 root 用户可以使用。该命令语法如下。

fdisk [-l] [设备号]

常用指数:

常用选项:

设备号:需要进行配置的磁盘。

-l:显示指定磁盘的分区情况。

fdisk 命令的选项并不多,主要的操作是进入 fdisk 环境的相关操作,下面看几个 fdisk 命

令的例子。

1.显示所有硬盘的分区情况

在 fdisk -l 显示的信息中,该计算机共有两块非 IDE 硬盘,其中/dev/sda 已经有分区,

/dev/sda 还没有进行分区。

[root@srv ~]# fdisk -l Disk /dev/sda: 214.7 GB, 214748364800 bytes 255 heads, 63 sectors/track, 26108 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 * 1 25 200781 83 Linux /dev/sda2 26 6399 51199155 83 Linux /dev/sda3 6400 12773 51199155 83 Linux /dev/sda4 12774 26108 107113387+ 5 Extended /dev/sda5 12774 15323 20482843+ 83 Linux /dev/sda6 15324 17873 20482843+ 83 Linux /dev/sda7 17874 20423 20482843+ 83 Linux /dev/sda8 20424 21698 10241406 83 Linux /dev/sda9 21699 21829 1052226 82 Linux swap / Solaris Disk /dev/sdb: 225.4 GB, 225485783040 bytes 255 heads, 63 sectors/track, 27413 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Disk /dev/sdb doesn't contain a valid partition table

2.显示指定硬盘的分区情况 显示第一块非 IDE 硬盘的分区情况。

[root@srv ~]# fdisk -l /dev/sda Disk /dev/sda: 214.7 GB, 214748364800 bytes 255 heads, 63 sectors/track, 26108 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 * 1 25 200781 83 Linux /dev/sda2 26 6399 51199155 83 Linux /dev/sda3 6400 12773 51199155 83 Linux /dev/sda4 12774 26108 107113387+ 5 Extended

Linux 从初学到精通

190

/dev/sda5 12774 15323 20482843+ 83 Linux /dev/sda6 15324 17873 20482843+ 83 Linux /dev/sda7 17874 20423 20482843+ 83 Linux /dev/sda8 20424 21698 10241406 83 Linux /dev/sda9 21699 21829 1052226 82 Linux swap / Solaris

3.使用 fdisk 创建及管理硬盘分区 使用 fdisk 命令进行分区时,直接使用“fdisk 设备号”即可进入 fdisk 命令环境,比如要

对第二块非 IDE 硬盘进行分区,可使用“fdisk /dev/sdb”。

[root@srv ~]# fdisk /dev/sdb Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) Command (m for help):

在进入 fdisk 环境后,需要使用一系统指令进行分区操作。可以通过“m”查看这些指令

的帮助信息。下面是几个在 fdisk 环境中常用的指令。

(1)p:显示当前磁盘分区情况。在显示内容中“Disk /dev/sdb: 225.4 GB, 225485783040

bytes”表示第二块非 IDE 硬盘的容量为 210G;“255 heads, 63 sectors/track, 27413 cylinders”

是 fdisk 计算的柱面数等信息;“Units = cylinders of 16065 * 512 = 8225280 bytes”是每个柱面

的大小为 8M 多一点;接下来是磁盘的分区表信息每列含义如下:

Device:指向这个设备节点,通常作为这个分区的名称使用。

Boot:如果在该表有“*”表示所在行的分区是可引导的,每个磁盘上可以有一个主

分区被标为可引导。

Start、End:分区开始和结束的柱面。

Blocks:以 1024 字节的块为计算单位的分区大小。

Id:一个 2 位的十六进制数,代表分区类型。

System:Id 定义的分区类型的文本名称。

Command (m for help): p Disk /dev/sdb: 225.4 GB, 225485783040 bytes 255 heads, 63 sectors/track, 27413 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System

(2)n:建立新的分区、w 保存 fdisk 的修改并退出、q 不保存 fdisk 的修改并退出。

使用 fdisk 命令为/dev/sdb 管理分区。

[root@srv ~]# fdisk /dev/sdb Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel. Changes will remain in memory only, until you decide to write them. After that, of course, the previous

我的地盘我做主——Linux 磁盘及文件系统管理 第

191

7content won't be recoverable. 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) 创建分区。 Command (m for help): n Command action

输入“e”表示要建立扩展分区;输入“p”表示要建立主分区。

e extended p primary partition (1-4) p

输入分区编号。

Partition number (1-4): 1

输入新建分区的起始柱面数,一般不输入直接按回车键。

First cylinder (1-27413, default 1): Using default value 1

输入新建分区的结束柱面数。输入柱面数虽然可以精确地进行分区,但计算起来比

较麻烦。一般这里都直接输入新建分区的大小让 fdisk 自己计算,这样实际分区的大

小可能与输入的大小有一点差别,但这个差别并不大,不会影响正确使用。直接输

入大小时使用“+”接分区大小及单位,如下面输入的就是希望新建分区的大小是

10G。还可以使用 M、T 等其他一些单位。

Last cylinder or +size or +sizeM or +sizeK (1-27413, default 27413): +10G 创建分区。 Command (m for help): n Command action e extended p primary partition (1-4)

输入 e,建立扩展分区。

e

输入分区编号。

Partition number (1-4): 2 First cylinder (1218-27413, default 1218): Using default value 1218

直接按回车键表示把磁盘所有的剩余空间都给这个分区。

Last cylinder or +size or +sizeM or +sizeK (1218-27413, default 27413): Using default value 27413

创建分区。

Command (m for help): n Command action

Linux 从初学到精通

192

输入“l”表示要建立逻辑分区,由于一块磁盘只能有一个扩展分区,上一步已经建

立了一个扩展分区,所以这里只能建立主分区或在扩展分区建立逻辑分区。

l logical (5 or over) p primary partition (1-4) l First cylinder (1218-27413, default 1218): Using default value 1218

输入分区大小。

Last cylinder or +size or +sizeM or +sizeK (1218-27413, default 27413): +10G

显示目录的分区情况,注意这里显示的内容只是一个计算值目前并没有写入磁盘分

区表。如果不想保存本次的修改内容可使用“q”退出。

Command (m for help): p Disk /dev/sdb: 225.4 GB, 225485783040 bytes 255 heads, 63 sectors/track, 27413 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdb1 1 1217 9775521 83 Linux /dev/sdb2 1218 27413 210419370 5 Extended

第一个扩展分区的编号总是从 5 开始的。

/dev/sdb5 1218 2434 9775521 83 Linux

保存 fdisk 的修改并退出。

Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.

对于已有分区并在使用的硬盘使用 fdisk 改变分区保存退出时,fdisk 命令会出现磁盘

分区表无法写的错误提示,这时可以重新启动计算机或使用如下命令使改变的分区信息写

入磁盘分区表。

Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. #无法写磁盘分区表。 WARNING: Re-reading the partition table failed with error 16: Device or resource busy. The kernel still uses the old table. The new table will be used at the next reboot. [root@srv ~]# partprobe #使用 partprobe命令使新建的分区信息写入磁盘分区表。

(3)d:删除分区。

使用 fdisk 命令为/dev/sdb 管理分区。

[root@srv ~]# fdisk /dev/sdb The number of cylinders for this disk is set to 27413. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with:

我的地盘我做主——Linux 磁盘及文件系统管理 第

193

71) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK)

显示当前磁盘分区情况。

Command (m for help): p Disk /dev/sdb: 225.4 GB, 225485783040 bytes 255 heads, 63 sectors/track, 27413 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdb1 1 1217 9775521 83 Linux /dev/sdb2 1218 27413 210419370 5 Extended /dev/sdb5 1218 2434 9775521 83 Linux

删除分区。

Command (m for help): d

输入要删除的分区编号,这里输入“5”表示要删除第 2 个分区。

Partition number (1-5): 5

再次查看分区情况,第 5 个分区已经删除。

Command (m for help): p Disk /dev/sdb: 225.4 GB, 225485783040 bytes 255 heads, 63 sectors/track, 27413 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdb1 1 1217 9775521 83 Linux /dev/sdb2 1218 27413 210419370 5 Extended Command (m for help): w #保存 fdisk的修改并退出。 The partition table has been altered! Calling ioctl() to re-read partition table. WARNING: Re-reading the partition table failed with error 16: Device or resource busy. The kernel still uses the old table. The new table will be used at the next reboot. Syncing disks.

使用 partprobe 命令使新建的分区信息写入磁盘分区表。

[root@srv ~]# partprobe

(4)a:指定分区为引导分区。

使用 fdisk 命令为/dev/sdb 管理分区。

[root@srv ~]# fdisk /dev/sdb The number of cylinders for this disk is set to 27413. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK)

显示当前磁盘分区情况。

Linux 从初学到精通

194

Command (m for help): p Disk /dev/sdb: 225.4 GB, 225485783040 bytes 255 heads, 63 sectors/track, 27413 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdb1 1 1217 9775521 83 Linux /dev/sdb2 1218 27413 210419370 5 Extended /dev/sdb5 1218 3650 19543041 83 Linux /dev/sdb6 3651 7298 29302528+ 83 Linux /dev/sdb7 7299 12162 39070048+ 83 Linux /dev/sdb8 12163 12187 200781 83 Linux

指定引导分区。

Command (m for help): a

输入要指定引导分区的分区编号,这里输入“1”表示要指定的引导分区第 1 个分区。

Partition number (1-8): 1 Command (m for help): p Disk /dev/sdb: 225.4 GB, 225485783040 bytes 255 heads, 63 sectors/track, 27413 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System #第 1个分区在“Boot”列有一个“*”,表明该分区已是引导分区。 /dev/sdb1 * 1 1217 9775521 83 Linux /dev/sdb2 1218 27413 210419370 5 Extended /dev/sdb5 1218 3650 19543041 83 Linux /dev/sdb6 3651 7298 29302528+ 83 Linux /dev/sdb7 7299 12162 39070048+ 83 Linux /dev/sdb8 12163 12187 200781 83 Linux

保存 fdisk 的修改并退出。

Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. WARNING: Re-reading the partition table failed with error 16: Device or resource busy. The kernel still uses the old table. The new table will be used at the next reboot. Syncing disks.

使用 partprobe 命令使新建的分区信息写入磁盘分区表。

[root@srv ~]# partprobe

(5)t:改变分区类型、l:查看可用的分区类型。分区类型决定分区是一什么样的分区,

默认情况下 fdisk 会自动将分区的类型指定为“Linux”(可能是主分区或逻辑分区)或

“Extended”(扩展分区)。在一些情况下需要手动修改分区的类型以满足特殊应用的需求,如

配置 RAID 或 LVM。

[root@srv ~]# fdisk /dev/sdb The number of cylinders for this disk is set to 27413. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO)

我的地盘我做主——Linux 磁盘及文件系统管理 第

195

72) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Command (m for help): l 0 Empty 1e Hidden W95 FAT1 80 Old Minix bf Solaris 1 FAT12 24 NEC DOS 81 Minix / old Lin c1 DRDOS/sec (FAT- 2 XENIX root 39 Plan 9 82 Linux swap / So c4 DRDOS/sec (FAT- 3 XENIX usr 3c PartitionMagic 83 Linux c6 DRDOS/sec (FAT- 4 FAT16 <32M 40 Venix 80286 84 OS/2 hidden C: c7 Syrinx 5 Extended 41 PPC PReP Boot 85 Linux extended da Non-FS data 6 FAT16 42 SFS 86 NTFS volume set db CP/M/ CTOS / . 7 HPFS/NTFS 4d QNX4.x 87 NTFS volume set de Dell Utility 8 AIX 4e QNX4.x 2nd part 88 Linux plaintext df BootIt 9 AIX bootable 4f QNX4.x 3rd part 8e Linux LVM e1 DOS access a OS/2 Boot Manag 50 OnTrack DM 93 Amoeba e3 DOS R/O b W95 FAT32 51 OnTrack DM6 Aux 94 Amoeba BBT e4 SpeedStor c W95 FAT32 (LBA) 52 CP/M 9f BSD/OS eb BeOS fs e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a0 IBM Thinkpad hi ee EFI GPT f W95 Ext'd (LBA) 54 OnTrackDM6 a5 FreeBSD ef EFI (FAT-12/16/ 10 OPUS 55 EZ-Drive a6 OpenBSD f0 Linux/PA-RISC b 11 Hidden FAT12 56 Golden Bow a7 NeXTSTEP f1 SpeedStor 12 Compaq diagnost 5c Priam Edisk a8 Darwin UFS f4 SpeedStor 14 Hidden FAT16 <3 61 SpeedStor a9 NetBSD f2 DOS secondary 16 Hidden FAT16 63 GNU HURD or Sys ab Darwin boot fb VMware VMFS 17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fc VMware VMKCORE 18 AST SmartSleep 65 Novell Netware b8 BSDI swap fd Linux raid auto 1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fe LANstep 1c Hidden W95 FAT3 75 PC/IX be Solaris boot ff BBT

这些分类类型中并不是每一种都会经常使用到,在本书中主要会使用到“Linux LVM”、

“Linux raid auto”、“Linux swap / Solaris”三种,下面将/dev/sdb5 的分区类型转换为“Linux

LVM”。

使用 fdisk 命令为/dev/sdb 管理分区。

[root@srv ~]# fdisk /dev/sdb The number of cylinders for this disk is set to 27413. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK)

显示当前磁盘分区情况。

Command (m for help): p Disk /dev/sdb: 225.4 GB, 225485783040 bytes 255 heads, 63 sectors/track, 27413 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdb1 1 1217 9775521 83 Linux /dev/sdb2 1218 27413 210419370 5 Extended /dev/sdb5 1218 2434 9775521 83 Linux /dev/sdb6 2435 3651 9775521 83 Linux

转换分区类型。

Linux 从初学到精通

196

Command (m for help): t

输入要转换的分区编号。

Partition number (1-6): 6

将分区转换为“Linux LVM”。转换时输入分区类型的编号,分区类型编号是一个十

六进制数,上面已经说明可以使用“l”查看。在这里也可以通过“L”查看。

Hex code (type L to list codes): 8e Changed system type of partition 6 to 8e (Linux LVM) Command (m for help): p Disk /dev/sdb: 225.4 GB, 225485783040 bytes 255 heads, 63 sectors/track, 27413 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdb1 1 1217 9775521 83 Linux /dev/sdb2 1218 27413 210419370 5 Extended /dev/sdb5 1218 2434 9775521 83 Linux

分区类型已经转换为“Linux LVM”。

/dev/sdb6 2435 3651 9775521 8e Linux LVM

保存 fdisk 的修改并退出。

Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. WARNING: Re-reading the partition table failed with error 16: Device or resource busy. The kernel still uses the old table. The new table will be used at the next reboot. Syncing disks.

使用 partprobe 命令使新建的分区信息写入磁盘分区表。

[root@srv ~]# partprobe

Linux 文件系统

对磁盘完成分区后,并不能马上使用,还需要将分区格式化为指定的文件系统后才能使

用。计算机的文件系统是一种存储和组织计算机文件和数据的方法,文件系统使得对文件和

数据访问和查找变得容易。文件系统通常使用硬盘和光盘这样的存储设备,并维护文件在设

备中的物理位置。

7.2.1 Linux 支持的文件系统

随着 Linux 的不断发展,它所支持的文件格式系统也在迅速扩充。Linux 系统内核可以支持

十多种文件系统类型:Btrfs、JFS、ReiserFS、ext、ext2、ext3、ext4、ISO9660、XFS、Minx、

我的地盘我做主——Linux 磁盘及文件系统管理 第

197

7

msdos、UMSDOS、vfat、NTFS、HPFS 等。下面简单介绍一下几个比较常见的文件系统。

1.msdos 文件系统 FAT(File Allocation Table,文件配置表)是一种由微软开发并拥有部分专利的文件系统,

供 MSDOS 使用。FAT 文件系统考虑当时计算机性能有限,所以未被复杂化,因此几乎所有

个人计算机的操作系统都支持。这一特性使它成为理想的软盘和存储卡文件系统,也适合用

做不同操作系统中的数据交流。但 FAT 有一个严重的缺点:当文件删除后写入新数据,FAT

不会将文件整理成完整片段再写入,长期使用后会使文件数据变得逐渐分散,而减慢了读写

速度。磁盘整理是一种解决方法,但必须经常整理来保持 FAT 文档系统的效率。

2.vfat 文件系统

Windows 95 设计人员的一个用户体验目标就是:除了传统的 8.3 文件名以外,在新操作

系统中使用长文件名。长文件名通过在目录条目排列时,使用一个工作区来实现。按照

Windows 95VxD 设备驱动程序的命名规则,这个新扩充的文件系统通常称为 vfat 或 fat32。

3.NTFS 文件系统 NTFS 是 Windows NT 及之后的 Windows 2000、Windows XP、Windows Server 2003、

Windows Server 2008、Windows Vista 和 Windows 7 的标准文件系统。NTFS 取代了文件分配

表(FAT)文件系统,为 Microsoft 的 Windows 系列操作系统提供文件系统。NTFS 文件系统

的详细定义属于商业秘密,但 Microsoft 已经将其注册为知识产权产品。V3.0 支持磁盘限额、

加密、稀疏文件、重解析点、更新序列数(USN)日志、$Extend 文件夹及其中的文件,并

改进了安全描述符,以便于使用相同安全设置的多个文件共享一个安全描述符。V3.1 使用冗

余 MFT 记录数(用于恢复受损的 MFT 文件)扩展了主文件表(MFT)项。Windows Vista 提

供了事务 NTFS、NTFS 符号链接、收缩卷以及自我恢复功能,但这些附加功能由操作系统提

供,而非文件系统自身的功能。

4.ISO 9660 文件系统 ISO 9660,也被一些硬件和软件供应商称为 CDFS(光盘文件系统),是一个由国际标准

化组织(ISO)为光盘媒介发布的文件系统。其目标是能够在不同的操作系统,如 Windows,

Mac OS 以及类 UNIX 系统上交换数据。

ISO 9660 源于 High Sierra 文件系统。High Sierra 通过使用一种分层树(共八层)文件系

统,以一种密集的、顺序的布局来组织文件信息,类似于 UNIX 和 FAT。为了增强跨平台兼

容性,定义了一个常用文件属性(目录或原始文件以及记录时间)和名称属性(文件名、扩

展名、版本)的 小子集,并且使用一个单独的系统区域来兼容未来的扩展属性。

High Sierra 在 1986 年 12 月被 Ecma 国际采用(做了一些改动)而成为了国际标准,即

ECMA-119,并提交给国际标准化组织而成为 ISO 9660:1988。目前 ISO 9660 文件系统正在被

行业广泛使用。

5.UDF 文件系统 UDF(Universal Disk Format,通用光盘格式)是一个使用在光学存储媒体的文件系统的

规格。UDF 实行了 ISO/IEC 13346 标准。UDF 也用于取代 ISO9660,现时已经广泛地用于可

Linux 从初学到精通

198

写光学存储媒体上。UDF 是由光学存储技术协会(Optical Storage Technology Association,

OSTA)开发并维护的。

7.2.2 ext3 文件系统

第一个被 Linux 支持的文件系统是 Minix 文件系统。这个文件系统有严重的性能问题,

因此出现了另一个针对 Linux 的文件系统,即扩展文件系统。第 1 个扩展文件系统(ext1)

由 Remy Card 设计,并于 1992 年 4 月引入 Linux 中。ext1 文件系统是第一个使用虚拟文件系

统(VFS)交换的文件系统。虚拟文件系统交换是在 0.96c 内核中实现的,支持的 大文件

系统为 2 GB。第 2 个扩展文件系统(ext2)也是由 Remy Card 实现的,并于 1993 年 1 月引

入 Linux 中。ext2 借鉴了当时文件系统的先进思想。ext2 支持的 大文件系统为 2TB,但是

2.6 内核将该文件系统支持的 大容量提升到 32TB。第 3 个扩展文件系统(ext3)是 Linux

文件系统的重大改进,由 Stephen Tweedie 实现,并于 2001 年 11 月引入。尽管 ext3 在性能方

面逊色于某些竞争对手,但是 ext3 文件系统引入了日志概念,以在系统突然停止时提高文件

系统的可靠性。虽然某些文件系统的性能更好,如 Silicon Graphics 的 XFS、IBM Journaled File

System,但 ext3 支持从使用 ext2 的系统进行就地升级。

在 Linux 系统当中,每个文件不光有文件内容的数据,还包括文件的其他属性,如所有

者、拥有组、文件建立时间等。标准的 ext2 文件系统当中,每个文件的内容分为两个部分来

保存,一个是文件的元数据,另一个则是文件的内容。所以 ext2 划分了 inode(i 节点)和

Block(块)。inode 保存文件的元数据,Block(块)保存文件的内容。

一个 ext2 文件系统上的每个 block 都是一样大小的,但是对于不同的 ext2文件系统,block

的大小可以有区别。典型的 block 大小是 1024 bytes 或 4096 bytes。这个大小在创建 ext2 文件

系统的时候被决定,block 大小可以由用户指定,也可以由文件系统的创建程序根据硬盘分区

的大小,自动选择一个较合理的值。这些 block 被聚在一起分成几个大的 block group。每个

block group 中有多少个 block 是固定的。在硬盘分区开头(开头的第一个 byte 是 byte 0)从

byte1024 开始往后的一部分数据是 super block。由于 block 大小 小是 1024 bytes,所以 super

block 可能是在 block 1 中(此时 block 的大小正好是 1024 bytes),也可能是在 block0 中。

在读取文件时,首先要读的是文件系统的根目录,根据根目录的相关信息得到文件的

inode 号数。在 super block 中有一个字段 s_inodes_per_group 记载了每个 block group 中有多

少个 inode。用得到的 inode 号数除以 s_inodes_per_group,就知道了要的 inode 是在哪一个

block group,这个除法的余数就是这个 inode 是这个 block group 里面的第几个 inode;然后,

先找到这个 block group 的 group descriptor,从这个中找到这个 group 的 inode table,再从 inode

table 找到要的第几个 inode,再以后就可以开始读取 inode 中的用户数据了。

这里所谓的根目录,是相对于这一个文件系统或者说硬盘分区而言的,并不一定是整

个 Linux 操作系统上的根目录。这里的这个根目录存放在一个固定的 inode 中,这就是文

件系统上的 inode 2(inode 计数是从 1 开始的,而 block 计数是从 0 开始)。

ext3 和 ext2 文件系统在功能和特性上完全一样。ext3 文件系统是 RHEL 5.x 默认的文件

提 示

我的地盘我做主——Linux 磁盘及文件系统管理 第

199

7

系统。

7.2.3 ext4 文件系统

ext4(第四扩展文件系统)文件系统是 Linux 系统下的日志文件系统,ext3 文件系统的

后继版本。ext4 原始的开发目标是一系列的向下兼容 ext3、移除其 64 位限制与提升其效能的

延伸包。然而某些 Linux 开发者因稳定性原因而拒绝将这些延伸包应用在 ext3 上,并要求其

作为 ext3 的分支,改名为 ext4 并另行开发,以免影响到目前的 ext3 用户。该要求被接受以

后,ext3 维护者 Theodore Ts'o 在 2006 年 6 月 28 日公开了 ext4 的开发计划。ext4 文件系统的

主要特点如下:

(1)大型文件系统。ext4 文件系统可支持 大 16TB 的文件。

(2)Extents。ext4 引进了 Extent 文件存储方式,以取代 ext2/3 使用的 block mapping 方

式。Extent 指的是一连串的连续实体 block,这种方式可以增加大型文件的效率并减少分裂文

件。ext4 支持的单一 Extent,在单一 block 为 4KB 的系统中 高可达 128MB。单一 inode 中

可存储 4 笔 Extent;超过 4 笔的 Extent 会以 Htree 方式被索引。

(3)向下兼容。ext4 向下兼容于 ext3 与 ext2,因此可以将 ext3 和 ext2 的文件系统挂载

为 ext4 分区。由于某些 ext4 的新功能可以直接运用在 ext3 和 ext2 上,直接挂载即可提升少

许效能。 ext3 文件系统可以部分向上兼容于 ext4(也就是说 ext4 文件系统可以被挂载为 ext3

分区)。然而若是使用到 Extent 技术的 ext4 将无法被挂载为 ext3。

(4)预留空间。ext4 允许对一文件预先保留磁盘空间。目前大多数文件系统做到这点的

方式是直接产生一个填满“0”的文件;ext4 和 XFS 可以使用 Linux 内核中的一个新的系统

调用“fallocate()”取得足够的预留空间。

(5)延迟取得空间。ext4 使用一种称为 allocate-on-flush 的方式,可以在数据将被写入磁

盘(sync)前才开始取得空间;大多数文件系统会在之前便取得需要的空间。这种方式可以

增加效能并减少文件分散程度。

(6)突破 32000 子目录限制。ext3 的一个目录下 多只能有 32000 个子目录。ext4 的子

目录 高可达 64000,且使用“dir_nlink”功能后可以达到更高。为了避免效能受到大量目录

的影响,ext4 默认打开 Htree(一种特殊的 B-tree)索引功能。该功能已经实现于 Linux 内核

2.6.23 版。

(7)日志校验和。ext4 使用校验和特性来提高文件系统可靠性,因为日志是磁盘上被读

取 频繁的部分之一。这个特性还有一个好处,就是可以安全地避免日志处理时磁盘 I/O 的

等待,而稍微提高一些性能。

(8)在线磁盘整理。对于在线磁盘整理工具有许多草案,但是这些草案都没有被包含在

主流的内核当中。尽管 ext4 包含许多避免磁盘碎片的技术,磁盘碎片还是难免会在一个长时

间使用过的文件系统中存在。ext4 将会有一个具有磁盘整理功能的工具。

(9)快速文件系统检查。ext4 将未使用的区块标记在 inode 当中,这样可以使诸如 e2fsck

之类的工具在磁盘检查时将这些区块完全跳过,而节约大量的文件系统检查的时间。这个特

性已经在 2.6.24 版本的 Linux 内核中实现。

在 RHEL 5.x 中并没有提供将分区格式为 ext4 文件系统的功能,不过在 Fedoa 12 中已经

Linux 从初学到精通

200

可以将分区格式为 ext4,并且 Fedoa 12 默认也使用 ext4。

创建文件系统

Linux 系统支持的文件系统非常多,在本章中主要讲述几种常见文件系统的创建方面。

这部分内容假设已经对一块硬盘进行了分区,其分区结构如下。

[root@srv ~]# fdisk /dev/sdb The number of cylinders for this disk is set to 27413. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Command (m for help): p Disk /dev/sdb: 225.4 GB, 225485783040 bytes 255 heads, 63 sectors/track, 27413 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdb1 1 1217 9775521 83 Linux /dev/sdb2 1218 27413 210419370 5 Extended /dev/sdb5 1218 3650 19543041 83 Linux /dev/sdb6 3651 7298 29302528+ 83 Linux /dev/sdb7 7299 12162 39070048+ 83 Linux /dev/sdb8 12163 12187 200781 83 Linux

7.3.1 创建 msdos 文件系统

在 Linux 中使用 mkfs.msdos 将分区格式化为 msdos 文件系统,该命令语法如下。

mkfs.msdos [ -c] [ -n <卷标>] 分区号

常用指数:

常用选项:

分区号:需要进行配置的分区。

-c:格式化前先检查是否有坏道。

-n <卷标>:指定卷标。

下面将分区/dev/sdb8 格式为 msdos 文件系统的具体操作步骤。

将分区/dev/sdb8 格式为 msdos 文件系统并指定卷标为“msdos”。

[root@srv ~]# mkfs.msdos -n msdos /dev/sdb8 mkfs.msdos 2.11 (12 Mar 2005)

通过 parted 命令可以查看磁盘分区及文件系统情况。

[root@srv ~]# parted

我的地盘我做主——Linux 磁盘及文件系统管理 第

201

7GNU Parted 1.8.1 Using /dev/hdc Welcome to GNU Parted! Type 'help' to view a list of commands.

选择查看/dev/sdb。

(parted) select /dev/sdb Using /dev/sdb

使用“p”查看。

(parted) p Model: VMware, VMware Virtual S (scsi) Disk /dev/sdb: 225GB Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 32.3kB 10.0GB 10.0GB primary ext3 2 10.0GB 225GB 215GB extended 5 10.0GB 30.0GB 20.0GB logical 6 30.0GB 60.0GB 30.0GB logical 7 60.0GB 100GB 40.0GB logical #/dev/sdb8已被格式为 msdos文件系统。 8 100GB 100GB 206MB logical fat16

使用“q”退出 parted。

(parted) q

7.3.2 创建 vfat 文件系统

在 Linux 中使用 mkfs.vfat 将分区格式化为 vfat 文件系统,该命令语法如下。

mkfs.vfat [ -c] [ -n <卷标>] 分区号

常用指数:

常用选项:

分区号:需要进行配置的分区。

c:格式化前先检查是否有坏道。

-n <卷标>:指定卷标。

下面将分区/dev/sdb7 格式为 vfat 文件系统的具体操作步骤。

将分区/dev/sdb7 格式为 vfat 文件系统。

[root@srv ~]# mkfs.vfat /dev/sdb7 mkfs.vfat 2.11 (12 Mar 2005)

通过 parted 命令可以查看磁盘分区及文件系统情况。

[root@srv ~]# parted GNU Parted 1.8.1 Using /dev/hdc

Linux 从初学到精通

202

Welcome to GNU Parted! Type 'help' to view a list of commands.

选择查看/dev/sdb。

(parted) select /dev/sdb Using /dev/sdb

使用“p”查看。

(parted) p Model: VMware, VMware Virtual S (scsi) Disk /dev/sdb: 225GB Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 32.3kB 10.0GB 10.0GB primary ext3 2 10.0GB 225GB 215GB extended 5 10.0GB 30.0GB 20.0GB logical 6 30.0GB 60.0GB 30.0GB logical #/dev/sdb7已被格式为 vfat文件系统。 7 60.0GB 100GB 40.0GB logical fat32 8 100GB 100GB 206MB logical fat16

使用“q”退出 parted。

(parted) q

7.3.3 创建 ext3 文件系统

ext3 是目前大多数 Linux 发行版默认的文件系统,在 Linux 中使用 mkfs.ext3 将分区格式

化为 ext3 文件系统,该命令语法如下。

mkfs.ext3 [ -c] [ -L <卷标>] 分区号

常用指数:

常用选项:

分区号:需要进行配置的分区。

-c:格式化前先检查是否有坏道。

-L <卷标>:指定卷标。

下面将分区/dev/sdb6 格式为 ext3 文件系统的具体操作步骤。

[root@srv ~]# mkfs.ext3 /dev/sdb6 mke2fs 1.39 (29-May-2006) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 3662848 inodes, 7325632 blocks 366281 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=0

我的地盘我做主——Linux 磁盘及文件系统管理 第

203

7224 block groups 32768 blocks per group, 32768 fragments per group 16352 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000 Writing inode tables: done Creating journal (32768 blocks): done

7.3.4 更改分区卷标

格式化命令是可通过选项指定分区的卷标,在不格式化的情况下,可以通过 e2label 查看

及更改分区的卷标,该命令语法如下。

e2label分区号 [<卷标>]

常用指数:

常用选项:

分区号:需要进行配置的分区。

卷标:指定卷标。

e2label 在不指定卷标时表示查看指定分区的卷标。下面看几个 e2label 命令的例子。

查看/dev/sdb6 的卷标。

[root@srv ~]# e2label /dev/sdb6 ext3

更改/dev/sdb6 的卷标为“ctu”。

[root@srv ~]# e2label /dev/sdb6 ctu

挂载设备

在 Linux 系统中使用一块磁盘的顺序是:分区、格式化、挂载分区。所有已格式化的分

区只有在挂载后才可以给用户使用。在 Linux 中提供了很多方法用于挂载分区,下面是几种

比较常见的挂载分区的方法。

7.4.1 挂载及卸载设备

mount 命令主要用于挂载设备及显示系统的挂载情况,该命令语法如下。

mount [-afFnrvw] [-L<标签>] [-o<选项>] [-t<文件系统类型>] [设备名] [挂载点]

Linux 从初学到精通

204

常用指数:

常用选项:

设备名:需要进行挂载的设备。

挂载点:将设备挂载到的目录。

-a:加载文件/etc/fstab 中设置的所有设备。

-f:不实际加载设备,与“-v”等选项同时使用以查看 mount 的执行过程。

-F:需与-a 选项同时使用。所有在/etc/fstab 中设置的设备会被同时加载,可加快执

行速度。

-L <卷标>:加载文件系统标签为指定卷标的设备。

-n:不将加载信息记录在/etc/mtab 文件中。

-o <选项>:指定加载文件系统时的选项。

-r:以只读方式加载设备。

-t <文件系统类型>:指定设备的文件系统类型。常用的选项说明有:ext3、msdos、

vfat、nfs、iso9660、auto。其中 auto(自动检测文件系统)是 mount 命令的默认选

项。

-v:执行时显示详细的信息。

-w:以可读写模式加载设备,这也是 mount 命令的默认选项。

--bind:将已挂载设备再次挂载。

其中“-o”选项可以指定的有以下几个:

async:以非同步的方式执行文件系统的输入输出动作。

atime:每次存取都更新 inode 的存取时间,这也是 mount 命令的默认选项。

defaults:使用默认的选项。默认选项为 rw、suid、dev、exec、anto nouser 与 async。

dev:可读文件系统上的字符或块设备,取消选项为 nodev。

exec:可执行二进制文件,取消选项为 noexec。

noatime:每次存取时不更新 inode 的存取时间。

nodev:不读文件系统上的字符或块设备。

noexec:无法执行二进制文件。

remount:重新加载设备,通常用于改变设备的设置状态。

ro:以只读模式加载。

rw:以可读写模式加载。

sync:以同步方式执行文件系统的输入输出动作。

acl:支持 ACL 功能。

mount 命令是 Linux 系统使用过程中常用的命令之一,下面看几个 mount 命令的例子。

1.挂载磁盘分区 使用 mount 命令挂载磁盘分区时,挂载点必须是一个已经存在的目录,在下面的例子中

我的地盘我做主——Linux 磁盘及文件系统管理 第

205

7

“/mnt/sdb6”就必须已经存在。在挂载完成后,所有对“/mnt/sdb6”中内容的操作都会被保存

到“/dev/sdb6”的分区中。

[root@srv ~]# mount /dev/sdb6 /mnt/sdb6

mount 命令用于将一个设备挂载到一个目录上,如果使用“--bind”选项将一个挂载点再

次挂载到另一个目录。在下面的例子中“/mnt/sdb6”已经是一个挂载点,使用“--bind”选项

后可以对其再次进行挂载。

[root@srv ~]# mount --bind /mnt/sdb6 /mnt/sdb6bind

2.挂载光驱

在 Linux 中光驱和硬盘采用相同的命令方法,比如说有一个 IDE 接口的光驱,其设备编

号就是 /dev/hda。在 RHEL 5.x 中为 /dev/hdc 建立了两个符号链接分区是 /dev/cdrom 和

/dev/cdrom-hdc,所有在只有一个 IDE 接口的光驱时,可采用下列三种方法中任意一种挂载。

[root@srv ~]# mount /dev/cdrom /mnt/cdrom [root@srv ~]# mount /dev/hdc /mnt/cdrom [root@srv ~]# mount /dev/cdrom-hdc /mnt/cdrom

3.挂载 U 盘

U 盘和 USB 硬盘在 Linux 中被认为是一个非 IDE 的设备,其设备名和一般硬盘的设备名

相同。如当计算机上有两个 SCSI 硬盘时,插入 U 盘后,U 盘的设备名就是/dev/sdc。在下面

的例子中将名为/dev/sdc 的 U 盘的第一个分区挂载到/mnt/sdc1 目录。

[root@srv ~]# mount /dev/sdc1 /mnt/sdc1

4.挂载 ISO 映像文件

在 Windows 中使用 ISO 映像文件时,只能将其解压或使用虚拟光驱软件,而在 Linux 中

可直接将一个 ISO 映像文件挂载到一个目录后,目录中的内容就是 ISO 映像文件中的内容。

在下面的例子中将/iso/RHEL.iso 文件挂载到/mnt/cdimage 目录。

[root@srv ~]# mount -o loop /iso/RHEL.iso /mnt/cdimage

5.指定挂载选项

mount 命令的“-o”选项可以对挂载的动作进行配置,指定挂载的各种方式。

挂载后该分区所有文件的所有者指定为 UID 是 500 的用户,拥有组指定为 GID 是

500 的用户组。该功能只能应用在 vfat 文件系统。

[root@srv ~]# mount -o uid=500,gid=500 /dev/sdb8 /mnt/vfat

挂载后让分区支持 ACL 功能。

[root@srv ~]# mount -o acl /dev/sdb5 /mnt/sdb5

将已经挂载的/dev/sdb9,重新挂载一次并加上 acl 选项。

[root@srv ~]# mount -o remount,acl /dev/sdb9

Linux 从初学到精通

206

6.查看系统挂载情况 直接使用 mount 命令,可以查看系统中已经挂载的所有设备及挂载选项。其显示内容中

除了直接使用 mount 命令挂载的设备以外,还包括在/etc/fstab 文件中的内容。在显示内容的

格式为“设备名 on 挂载点 type 文件系统(挂载选项)”。

[root@srv ~]# mount /dev/sda7 on / type ext3 (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) /dev/sda8 on /tmp type ext3 (rw) /dev/sda6 on /var type ext3 (rw) /dev/sda3 on /home type ext3 (rw) /dev/sda2 on /usr type ext3 (rw) /dev/sda5 on /usr/local type ext3 (rw) /dev/sda1 on /boot type ext3 (rw) tmpfs on /dev/shm type tmpfs (rw) /dev/sda10 on /media/sda10 type ext3 (rw,acl) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) none on /proc/fs/vmblock/mountPoint type vmblock (rw) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)

对于已经挂载的设备,如果不需要再使用可以使用 umount 命令卸载设备。该使用挂载

时可以指定卸载点或设备名。

通过指定设备名进行卸载。

umount /dev/sdb5

通过指定挂载点名进行卸载。

umount /mnt/sdb9

7.4.2 /etc/fstab 配置文件挂载文件设备

使用 mount 命令挂载的所有设备在重新启动后就会失效,如果希望每次启动计算机后挂

载信息还是有效的,就需要修改/etc/fstab 文件。

[root@srv ~]# head -2 /etc/fstab LABEL=/ / ext3 defaults 1 1 LABEL=/tmp /tmp ext3 defaults 1 2

/etc/fstab 文件中默认的内容是在安装系统时划分的分区信息。/etc/fstab 文件每一行一条

挂载信息,每一行分为 6 列,每列作用如下:

(1)第 1 列:指定要挂载的设备,可以使用设备名或分区的卷标。如果指定卷标时要保

证卷标是唯一的。

(2)第 2 列:指定挂载点。

(3)第 3 列:指定文件系统。

(4)第 4 列:指定挂载选项,该列就是使用 mount 命令通过-o 指定的内容。

(5)第 5 列:是否使用 dump 进行备份,“0”表示不备份,“1”表示进行 dump 备份,“2”

我的地盘我做主——Linux 磁盘及文件系统管理 第

207

7

也是表示备份,但没有 1 重要。

(6)第 6 列:是否以 fsck 检查分区,“0”表示不检查,“1”表示检查,“2”表示检查,

不过 1 会较早被检查。挂载点为“/”的(即根分区),必须在这里填写 1,其他的都不能填

写 1。如果有分区填写大于 1 的话,则在检查完根分区后,接着按填写的数字从小到大依次

检查下去。同数字的同时检查。

在挂载用户使用的分区时,一般第 4 列直接指定为“defaults”使用默认挂载选项即可;

第 5、6 列直接指定为“0”即可。如果将下面三行加入/etc/fstab 文件后,每次开机时/dev/sdb5、

/dev/sdb6 会分别被挂载到/mnt/sdb5、/mnt/sdb6 目录;光驱会被挂载到//mnt/cdrom 目录。

/dev/sdb5 /mnt/sdb5 ext3 defaults 0 0 #在挂载选项列增加“,acl”表示挂载的分区要支持 ACL功能。 /dev/sdb6 /mnt/sdb6 ext3 defaults,acl 0 0 #光盘的文件系统是“iso9660” /dev/cdrom /mnt/cdrom iso9660 defaults 0 0

修改/etc/fstab 文件后,需要重新启动计算机或使用如下命令使其配置生效。

mount -a

7.4.3 自动挂载

使用 mount 命令或通过/etc/fstab 进行挂载时,不管使用还是不使用都会将设备挂载在系

统里,而通过自动挂载是只有在访问时系统才会去挂载,不使用一段时间后系统会自动取消

挂载。配置自动挂载的具体步骤如下。

自动取消的时间可以通过/etc/sysconfig/autofs 文件中的“DEFAULT_TIMEOUT”进行

配置。

(1)修改/etc/auto.master 文件。该文件是自动挂载服务的主配置文件,在文件中每行一

个可以指定多个自动挂载的目录。每行中需要指定一个已存在的目录作为自动挂载的主目录,

以及该主目录中所有自动挂载子目录的配置文件。在下面的例子中就指定了个自动挂载的主

目录“/ctu”及配置文件“/etc/ctu.misc”。

[root@srv ~]# grep -v ^# /etc/auto.master /misc /etc/auto.misc /ctu /etc/ctu.misc #指定了一个主目录“/ctu”,该目录必须是存在的。 /net -hosts +auto.master

( 2 )建立自动挂载的子配置文件。子配置文件的名称必须是在主配置文件

(/etc/auto.master)中已定义,如上面的主配置文件中定义了一个子配置文件为“/etc/ctu.misc”,

那么这里建立的子配置文件名必须是“/etc/ctu.misc”。在子配置文件中就是定义在主目录下

有多少可自动挂载的目录(这个挂载目录必须不存在)以及每个目录上需要挂载的设备。在

RHEL 5.x 中已经有一个子配置文件的例子名为“/etc/auto.misc”,可以先复制该文件后进行修

改。在下面的例子中增加了两个目录,这两个目录的实际路径是“/ctu/jack”、“/ctu/chloe”,

其中“/ctu”是在主配置文件中定义的一个已存在的目录,“jack”、“chloe”是两个不存在的

提 示

Linux 从初学到精通

208

目录,当用户浏览或进入这两个目录时,系统自己根据这里的配置进行挂载。

[root@srv ~]# cat /etc/ctu.misc #-fstype=ext3是指定挂载,可以用“,”分隔增加挂载选项。 jack -fstype=ext3 :/dev/sdb10 chloe -fstype=ext3,ro :/dev/sdb11

(3)使用如下命令重新启动自动挂载服务。

[root@srv ~]# service autofs restart Stopping automount: [ OK ] Starting automount: [ OK ]

自动挂载的配置每次开机都会生效,但只有在用户使用的时候才会被挂载。

[root@srv ~]# cd /ctu

在没有使用前是看不到自动挂载的子目录的。

[root@srv ctu]# ll total 0

一但开始使用系统就会进行挂载。

[root@srv ctu]# cd jack [root@srv jack]# ll total 16 drwx------ 2 root root 16384 Feb 19 15:25 lost+found

查看文件系统

使用“fdisk -l”命令可以查看磁盘的分区情况、使用“mount”命令可以查看系统挂载设

备的情况,但是一般在使用过程中还可能需要查看分区中空闲空间等情况,下面是几种比较

常见的查看分区及文件占用空间情况的方法。

7.5.1 df:显示分区的使用情况

df 命令用于显示已挂载分区的使用情况,该命令语法如下。

df [-ahT] [-x <文件系统>] [-t <文件系统>] [文件|目录]

常用指数:

常用选项:

文件|目录:显示指定文件或目录所有分区的使用情况。

-h:使用 k(KB)、M(MB)、G(GB)为单位,提高信息可读性。

-a:显示所有已挂载分区的使用情况。

-T:显示已挂载分区的文件系统。

我的地盘我做主——Linux 磁盘及文件系统管理 第

209

7

-t <文件系统>:显示所有是指定文件系统的分区。

-x <文件系统>:显示所有不是指定文件系统的分区。

df 命令可以显示目前所有分区的 大可用空间及使用情况等信息,显示信息共六列分别

表示:“Filesystem”设备名;“1k-blocks”显示内容的单位是 1KB;“Used”已经使用的空间;

“Available”剩余的空间;“Use%”已使用空间的比率;“Mounted on”设备的挂载点。如果

使用了“-T”选项时会多一列“Type”显示文件系统。下面看几个 df 命令的例子。

显示所有已挂载分区的使用情况,并显示其文件系统。

[root@srv ~]# df -aT Filesystem Type 1K-blocks Used Available Use% Mounted on /dev/sda7 ext3 19840892 3626640 15190112 20% / proc proc 0 0 0 - /proc sysfs sysfs 0 0 0 - /sys devpts devpts 0 0 0 - /dev/pts /dev/sda8 ext3 9920592 154044 9254480 2% /tmp /dev/sda6 ext3 19840892 221188 18595564 2% /var /dev/sda3 ext3 49594228 184600 46849672 1% /home /dev/sda2 ext3 49594228 2204200 44830072 5% /usr /dev/sda5 ext3 19840892 176344 18640408 1% /usr/local /dev/sda1 ext3 194442 11408 172995 7% /boot tmpfs tmpfs 257668 0 257668 0% /dev/shm none binfmt_misc 0 0 0 - /proc/sys/fs/binfmt_misc none vmblock 0 0 0 - /proc/fs/vmblock/mountPoint sunrpc rpc_pipefs 0 0 0 - /var/lib/nfs/rpc_pipefs /dev/sdb10 ext3 9621848 152688 8980384 2% /ctu/jack

显示所有已挂载的 ext3 文件系统分区的使用情况。

[root@srv ~]# df -t ext3 Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda7 19840892 3626640 15190112 20% / /dev/sda8 9920592 154044 9254480 2% /tmp /dev/sda6 19840892 221188 18595564 2% /var /dev/sda3 49594228 184600 46849672 1% /home /dev/sda2 49594228 2204200 44830072 5% /usr /dev/sda5 19840892 176344 18640408 1% /usr/local /dev/sda1 194442 11408 172995 7% /boot

7.5.2 du:显示文件或目录占用空间

du 命令用于显示文件或目录占用空间,该命令语法如下。

du [-acDhH] [-L <符号链接文件>] [-X <文件>] [--max-depth <目录层数>] [目录|文件]

常用指数:

常用选项:

目录|文件:指定要统计的文件或目录,如果不指定则统计当前目录。

-a:显示目录中个别文件的大小。

Linux 从初学到精通

210

-c:除了显示个别目录或文件的大小,同时也显示所有目录或文件的总和。

-D:显示指定符号链接来源文件的大小。

-h:使用 k(KB)、M(MB)、G(GB)为单位,提高信息可读性。

-H:与-h 选项作用相同,但使用 1000 为单位进位。

-L <符号链接文件>:显示选项中指定的软连接的来源文件大小。

-X <文件>:统计时忽略指定的目录或文件。

--max-depth <目录层数>:忽略超过指定层次后的目录。

du 命令能以指定的目录下的子目录为单位,显示每个目录内所有文件所占用的磁盘空

间,如果不指定文件或目录则显示当前目录的占用情况。下面看几个 du 命令的例子。

显示/boot 目录的空间占用情况。

[root@srv ~]# du /boot/ 236 /boot/grub 12 /boot/lost+found 5779 /boot/

显示/home 目录的空间占用情况,使用 k(KB)、M(MB)、G(GB)为单位,提高

信息可读性。

[root@srv ~]# du -h /home/ 40K /home/charles 16K /home/lost+found 64K /home/

显示/home 下 1 层目录的空间占用情况。

[root@srv ~]# du -h --max-depth 1 /home/ 40K /home/charles 16K /home/lost+found 64K /home/

交换分区

Linux 中的交换分区(swap 分区)是在物理内存耗尽后使用。如果系统需要更多的内存

资源,而物理内存已经耗尽,内存中不活跃的页就会被移到交换空间去。虽然交换空间可以

为带有少量内存的机器提供帮助,但是这种方法不应该被当做是对内存的取代。交换空间位

于硬盘驱动器上,其读写速度要比物理内存慢。交换空间可以是一个专用的交换分区(推荐

的方法)也可以是一个交换文件,或两者的组合。交换分区的总大小应该相当于你的计算机

内存的 1.5~2 倍,在安装系统时如果选择的是自动分区,安装程序会根据物理内存的情况配

置。一般在使用过程中不需要调整交换分区,不过有时增加了物理内存时就需要手动增加交

换分区的大小。

我的地盘我做主——Linux 磁盘及文件系统管理 第

211

7

7.6.1 建立专用的交换分区

使用专用的分区作为交换分区是比较推荐的方法,具体步骤如下。

(1)使用 fdisk 命令建立一个新的分区,并将分区类型更新为“swap”。

使用 fdisk 命令为/dev/sdb 管理分区。

[root@srv ~]# fdisk /dev/sdb The number of cylinders for this disk is set to 27413. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) 创建分区。 Command (m for help):n Command action l logical (5 or over) p primary partition (1-4)

建立一个逻辑分区。

l First cylinder (19485-27413, default 19485): Using default value 19485

定义大小为 4GB。

Last cylinder or +size or +sizeM or +sizeK (19485-27413, default 27413): +4G

更改分区类型。

Command (m for help): t

更改第 11 个分区。

Partition number (1-11): 11

将分区类型转换为 swap 分区。

Hex code (type L to list codes): 82 Changed system type of partition 11 to 82 (Linux swap / Solaris) Command (m for help): p Disk /dev/sdb: 225.4 GB, 225485783040 bytes 255 heads, 63 sectors/track, 27413 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdb1 1 1217 9775521 83 Linux /dev/sdb2 1218 27413 210419370 5 Extended /dev/sdb5 1218 3650 19543041 83 Linux /dev/sdb6 3651 7298 29302528+ 83 Linux /dev/sdb7 7299 12162 39070048+ 83 Linux /dev/sdb8 12163 12187 200781 83 Linux /dev/sdb9 12188 18267 48837568+ 83 Linux /dev/sdb10 18268 19484 9775521 83 Linux /dev/sdb11 19485 19971 3911796 82 Linux swap / Solaris

Linux 从初学到精通

212

保存 fdisk 的修改并退出。

Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. WARNING: Re-reading the partition table failed with error 16: Device or resource busy. The kernel still uses the old table. The new table will be used at the next reboot. Syncing disks.

使用 partprobe 命令使新建的分区信息写入磁盘分区表。

[root@srv ~]# partprobe

(2)通过 mkswap 命令将分区格式为 swap 格式。

[root@srv ~]# mkswap /dev/sdb11 Setting up swapspace version 1, size = 4005675 kB

(3)使交换分区生效。可以通过“swapon <分区>”(如 swapon /dev/sdb11)的方式让新

建的交换分区生效;使用“swapoff <分区>”(如 swapoff /dev/sdb11)的方式取消一个交换

分区,但是这两个命令都是临时生效的,重新启动后就失效了。只有将分区信息加入/etc/fstab

文件后,才可以永久生效。如在/etc/fstab 文件中加入下列行后,/dev/sdb11 就会永久成为一

个被系统使用的交换分区。

/dev/sdb11 swap swap defaults 0 0

7.6.2 使用交换文件

使用专用的交换分区是一种推荐的做法,但有时系统中已经无法再建立新的分区时,就

可以使用交换文件的方式增加交换分区,具体步骤如下。

(1)建立一个文件。在下面的例子中建立了一个“/swap.file”的文件,大小为 2GB。

[root@srv ~]# dd if=/dev/zero of=/swap.file bs=1G count=2 2+0 records in 2+0 records out 2147483648 bytes (2.1 GB) copied, 104.15 seconds, 20.6 MB/s

(2)通过 mkswap 命令将文件格式为 swap 格式。

[root@srv ~]# mkswap /swap.file Setting up swapspace version 1, size = 2147479 kB

(3)使 swap 分区生效。可以通过“swapon <交换文件>”(如 swapon /swap.file)的方式

让新建的交换文件生效;使用“swapoff <交换文件>”(如 swapoff /swap.file)的方式取消一

个交换文件,但是这两个命令都是临时生效的,重新启动后就失效了。只有将分区信息加入

/etc/fstab 文件后,才可以永久生效。如在/etc/fstab 文件中加入下列行后,交换文件就会永久

成为一个被系统使用的 swap 分区。

/swap.file swap swap defaults 0 0

我的地盘我做主——Linux 磁盘及文件系统管理 第

213

7

读写 NTFS 分区

Linux 系统可以正常地对 FAT 分区进行读写操作,但由于版权等一些原因 RHEL 5.x 在默

认情况下并不能使用 NTFS 分区,但是目前大多数 Windows 系统中都是使用的 NTFS 格式。

如果希望 RHEL 5.x 可以使用 NTFS 分区就需要安装第三方的软件包。

NTFS-3G(NTFS-3G 官方网站:http://www.ntfs-3g.org)是一个开源软件,支持在 Linux、

FreeBSD、Mac OS X、NetBSD 等操作系统下读、写 NTFS 格式的分区。NTFS-3G 的目的是

为那些用户需要与 NTFS 可靠互通的硬件平台和操作系统提供可信任的、功能丰富的高性能

解决方案。NTFS-3G 能快速且安全地操作 Windows 2000、Windows XP、Windows Server 2003、

Windows Vista、Windows Server 2008、Windows Server 2008 的 NTFS 文件系统。在 RHEL 5.x

中安装 NTFS-3G 并读、写 NTFS 分区的具体操作步骤如下。

(1)下载 NTFS-3G 源码包后,编译安装(有关源码包的编译方法见 8.4)。

[root@srv ~]# cd /usr/src [root@srv src]# wget http://tuxera.com/opensource/ntfs-3g-2010.3.6.tgz [root@srv src]# tar -xvzf ntfs-3g-2010.3.6.tgz [root@srv src]# cd ntfs-3g-2010.3.6 [root@srv ntfs-3g-2010.3.6]# ./configure [root@srv ntfs-3g-2010.3.6]# make && make install

(2)使用 mount 命令挂载 NTFS 分区。在使用 mount 命令时需要使用“-t ntfs-3g”指定

分区所使用的文件系统。挂载完成后就可以读、写 NTFS。

[root@srv ~]# mount -t ntfs-3g /dev/sdc1 /mnt/ntfs/ The disk contains an unclean file system (0, 0). The file system wasn't safely closed on Windows. Fixing.

RAID 管理

RAID(Redundant Array of Independent Disks,独立磁盘冗余陈列)的基本思想就是把多

个相对便宜的硬盘组合起来,成为一个磁盘阵列,使性能达到甚至超过一个价格昂贵、容量

较大的硬盘。根据选择的版本不同,RAID 比单块硬盘有以下一个或多个方面的好处:增强

数据集成度、增强容错功能、增加处理量或容量。RAID 磁盘阵列对于计算机来说,看起来

就像一个单独的硬盘或逻辑存储单元。

7.8.1 RAID 等级

RAID 分成了不同的等级,每种等级都有其理论上的优缺点,其中常见的 RAID 等级包

括以下几种:

Linux 从初学到精通

214

1.RAID 0 RAID 0 将多个磁盘合并成一个大的磁盘,不具有冗余,但读写速度 快。在存放数据时,

其将数据按磁盘的个数来进行分段,然后同时将这些数据写进这些盘中(如图 7-2 所示)。在

所有的级别中,RAID 0 的速度是 快的。但是 RAID 0 没有冗余功能,如果一个磁盘(物理)

损坏,则所有的数据都会丢失。理论上越多的磁盘效能就等于“单一磁盘效能”ד磁盘数”,

但实际上受限于总线 I/O 瓶颈及其他因素的影响,如一个磁盘的效能是 50MB/秒,两个磁盘

的 RAID 0 效率约 96MB/秒,三个磁盘的 RAID 0 也许是 130MB/秒而不是 150MB/秒。所以,

两个磁盘的 RAID 0 能明显感受到效能的提升。

图 7-2 RAID 0

图 7-3 RAID 1

2.RAID 1 两组以上的 N 个磁盘相互做镜像,在一些多线程操作系统中能有很好的读取速度,另外

写入速度有微小的降低。除非拥有相同数据的主磁盘与镜像同时损坏,否则 高可坏剩 N-1

个磁盘,可靠性 高。RAID 1 就是镜像,其原理为在主硬盘上存放数据的同时也在镜像硬盘

上写一样的数据(如图 7-3 所示)。当主硬盘(物理)损坏时,镜像硬盘则代替主硬盘的工作。

因为有镜像硬盘做数据备份,所以 RAID 1 的数据安全性在所有的 RAID 级别上来说是 好

的。但无论用多少磁盘做 RAID 1,仅算一个磁盘的容量,是所有 RAID 上磁盘利用率 低的

一个级别。

3.RAID 5 RAID 5 是一种存储性能、数据安全和存储成本兼顾的存储解决方案。RAID 5 使用的是

Disk Striping(硬盘分割)技术。RAID 5 至少需要三块硬盘,RAID 5 不对存储的数据进行备

份,而是把数据和相对应的奇偶校验信息存储到组成 RAID5 的各个磁盘上,并且奇偶校验信

息和相对应的数据分别存储于不同的磁盘上(如图 7-4 所示)。当 RAID5 的一个磁盘数据发

生损坏后,利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。RAID 5 可以理解为

是 RAID 0 和 RAID 1 的折中方案。RAID 5 可以为系统提供数据安全保障,但保障程度要比

镜像低而磁盘空间利用率要比镜像高。RAID 5 具有和 RAID 0 相近似的数据读取速度,只是

多了一个奇偶校验信息,写入数据的速度相当的慢,若使用“回写高速缓存”可以让效能改

善不少。同时由于多个数据对应一个奇偶校验信息,RAID 5 的磁盘空间利用率要比 RAID 1

我的地盘我做主——Linux 磁盘及文件系统管理 第

215

7

高,存储成本相对较便宜。

图 7-4 RAID 5

图 7-5 RAID 6

4.RAID 6 与 RAID 5 相比,RAID 6 增加了第二个独立的奇偶校验信息块。两个独立的奇偶系统

使用不同的算法,数据的可靠性非常高,即使两块磁盘同时失效也不会影响数据的使用(如

图 7-5 所示)。但 RAID 6 需要分配给奇偶校验信息更大的磁盘空间,相对于 RAID 5 有更大

的“写损失”,因此“写性能”非常差。较差的性能和复杂的实施方式使得 RAID 6 很少得

到实际应用。

同一数组中容许两个硬盘同时失效(或是当一个失效后还来不及更换便有第二个失效)

后,更换新硬盘时再由另两个正常硬盘将备份的数据建立在新的硬盘中,所以必须具备四个

或四个以上硬盘才能生效。

5.RAID 10/01 RAID 10/01其实可细分为RAID 1+0或RAID 0+1。RAID 1+0是先镜射再分割数据。RAID

1+0 是将所有硬盘分为两组,视为是 RAID 0 的 低组合,然后将这两组各自视为 RAID 1 运

作。RAID 1+0 有着不错的读取速度,而且拥有比 RAID 0 更高的数据保护性。RAID 0+1 则

是跟 RAID 1+0 的程序相反,是先分割再将数据镜射到两组硬盘。RAID 0+1 将所有的硬盘分

为两组,变成 RAID 1 的 低组合,而将两组硬盘各自视为 RAID 0 运作。RAID 0+1 比起 RAID

1+0 有着更快的读写速度,不过也多了一些会让整个硬盘组停止运转的概率;因为只要同一

组的硬盘全部损毁,RAID 0+1 就会停止运作,而 RAID 1+0 则可以在牺牲 RAID 0 的优势下

正常运作。RAID 10 巧妙地利用了 RAID 0 的速度以及 RAID 1 的保护两种特性,不过 RAID

10 的缺点是需要的硬盘数较多,因为至少必须拥有四个以上的偶数硬盘才能使用。

6.RAID 50 RAID50 至少由六块硬盘组成,RAID50 像 RAID0 一样,数据被分割成条带,在同一时

间内向多块磁盘写入;像 RAID5 一样,也是以数据的校验位来保证数据的安全,且校验条带

均匀分布在各个磁盘上,其目的在于提高 RAID5 的读写性能。

在计算机上实现 RAID 功能,可以通过硬件的 RAID 卡,或通过操作系统提供的软件实

现软件 RAID。可以通过 RHEL 5.x 提供的软件 RAID 功能实现 RAID0、RAID1、RAID5、

RAID10、RAID6。在本章中主要讲述如何通过 RHEL 5.x 配置软件 RAID。

Linux 从初学到精通

216

7.8.2 在安装时创建 RAID 阵列

在 RHEL 5.x 安装过程中,安装程序在建立磁盘分区时就提供了创建 RAID 阵列的功能,

具体操作步骤如下。

(1)在建立分区时,将“File System Type”文件系统选择为“software RAID”(如图 7-6

所示)。根据要建立的 RAID 创建多个分区,如果创建 RAID0 时至少需要 2 个相同大小的分

区;创建 RAID1 时只能使用 2 个相同大小的分区;创建 RAID5 时至少需要 3 个相同大小的

分区。本章中创建的是 RAID5,所以建立了 3 个 20GB 的分区。

图 7-6 文件系统选择

(2)在分区建立完成后单击“RAID”按钮,在弹出窗口中选择“Create a RAID device”

后单击“OK”按钮(如图 7-7 所示)。在 RHEL 5.x 中使用软件 RAID 阵列时,首先需要创建

一个 RAID 的设备。

(3)输入或选择一个“Mount Point”挂载点、“RAID Level”RAID 等级及“RAID Memebers”

RAID 阵列中的分区后单击“OK”按钮(如图 7-8 所示)后,一个 RAID 阵列就创建完成。

我的地盘我做主——Linux 磁盘及文件系统管理 第

217

7

图 7-7 创建 RAID设备

图 7-8 建立 RAID

7.8.3 使用 mdadm 命令创建 RAID 阵列

在 RHEL 5.x 的使用过程中可以通过 mdadm 命令创建和维护 RAID 阵列。mdadm 命令将

与 RAID 阵列相关的所有功能都集成到一起,下面通过一个实例讲解该命令的使用方法。

(1)根据要创建的 RAID 等级的要求建立分区。本章中创建的是 RAID5,所以建立了 4

Linux 从初学到精通

218

个 40GB 的分区,RAID5 少三个分区就可以配置,这里多的 1 个分区是用于热备分区。当

定义一些具有容错功能的 RAID 级别(比如 RAID1、RAID5)时,可多定义一个热备分区,

这样当 RAID 阵列中有 1 个分区损坏时,这个热备分区会自动补上去开始工作。

(2)在 fdisk 使用“t”将分区类型转换为“Linux raid auto”(“fd”)。

[root@srv ~]# fdisk /dev/sdc The number of cylinders for this disk is set to 27413. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Command (m for help): p Disk /dev/sdc: 225.4 GB, 225485783040 bytes 255 heads, 63 sectors/track, 27413 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdc1 1 27413 220194891 5 Extended /dev/sdc5 1 4864 39070017 fd Linux raid autodetect /dev/sdc6 4865 9728 39070048+ fd Linux raid autodetect /dev/sdc7 9729 14592 39070048+ fd Linux raid autodetect /dev/sdc8 14593 19456 39070048+ fd Linux raid autodetect

(3)使用如下命令创建 RAID 阵列。其中“-C /dev/md0”表示创建一个 RAID 设备名为

“ /dev/md0”,这是本机的第一个设备,如果需要创建多个 RAID 阵列时可使用“md1、md2…”;

“-a yes”表示同意创建 RAID 设备;“-l 5”表示创建的 RAID 等级是 5,;“-n 3”表示使用三

个分区创建这个 RAID 阵列;“-x 1”表示使用一个分区作为热备分区;“/dev/sdc{5,6,7,8}”

表示 RAID 阵列中的分区(3 个分区用于创建 RAID5,另 1 个作为热备分区)。

[root@srv ~]# mdadm -C /dev/md0 -a yes -l 5 -n 3 -x 1 /dev/sdc{5,6,7,8} mdadm: array /dev/md0 started.

(4)格式化 RAID 阵列,其中“/dev/md0”是 RAID 阵列的设备名。

[root@srv ~]# mkfs.ext3 /dev/md0 mke2fs 1.39 (29-May-2006) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 9781248 inodes, 19534976 blocks 976748 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=0 597 block groups 32768 blocks per group, 32768 fragments per group 16384 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424 Writing inode tables: done Creating journal (32768 blocks): done

我的地盘我做主——Linux 磁盘及文件系统管理 第

219

7Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 33 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.

(5)格式化完成后,使用如下命令让 RAID 阵列永久生效。每次创建 RAID 阵列后都需

要通过该命令让 RAID 阵列永久生效,否则重新启动后 RAID 阵列会失效。

[root@srv ~]# mdadm -D -s > /etc/mdadm.conf

(6)完成上述配置后,这个 RAID 阵列就可以像普通分区一样挂载、使用。下面是将刚

创建的 RAID 阵列挂载到目录/ctu 上。

[root@srv ~]# mount /dev/md0 /ctu

mdadm 命令除了用于创建 RAID 阵列以外,还可以用于进行 RAID 阵列的维护。常用的

维护方式主要有以下几种。

(1)使用“--detail”选项查看 RAID 阵列。

[root@srv ~]# mdadm --detail /dev/md0 /dev/md0: Version : 0.90 Creation Time : Sat Feb 20 10:11:52 2010 Raid Level : raid5 #RAID阵列等级。 Array Size : 78139904 (74.52 GiB 80.02 GB) #RAID阵列的总空间。 Used Dev Size : 39069952 (37.26 GiB 40.01 GB) #RAID阵列中用户可用 大空间。 Raid Devices : 3 #组成 RAID阵列的分区数。 Total Devices : 4 #RAID阵列总分区数,这里多的一个分区是在做热备分区。 Preferred Minor : 0 Persistence : Superblock is persistent Update Time : Sat Feb 20 10:20:54 2010 State : clean #RAID阵列状态可用。 Active Devices : 3 #RAID阵列活动的分区数。 Working Devices : 4 #RAID阵列工作的分区数。 Failed Devices : 0 #RAID阵列损坏的分区数。 Spare Devices : 1 #RAID阵列热备份分区数。 Layout : left-symmetric Chunk Size : 64K UUID : 6f5987c5:fc8a8449:f1416c96:01bf9f6e Events : 0.8 Number Major Minor RaidDevice State #该 RAID阵列中的分区。 0 8 37 0 active sync /dev/sdc5 1 8 38 1 active sync /dev/sdc6 2 8 39 2 active sync /dev/sdc7 #该 RAID阵列中的热备分区。 3 8 40 - spare /dev/sdc8

(2)使用“-a”选项向已存在的 RAID 阵列中增加新的分区。

[root@srv ~]# mdadm /dev/md0 -a /dev/sdc9 #将/dev/sdc9加入/dev/md0中。 mdadm: added /dev/sdc9

(3)使用“-r”选项移除 RAID 阵列中已有的分区。

[root@srv ~]# mdadm /dev/md0 -r /dev/sdc9 #将/dev/sdc9从/dev/md0中移除。 mdadm: hot removed /dev/sdc9

Linux 从初学到精通

220

LVM管理

LVM 是 Logical Volume Manager 的缩写, 早是 IBM 在 AIX 系统上提供的一种机制,

可以让 AIX 的管理者更弹性地使用磁盘空间。后来 IBM 把 LVM 技术移植到 Linux 系统上。

从 RedHat 9.0 开始,RedHat 就在自己的产品中提供 LVM 的功能。

7.9.1 LVM 创建流程

使用 LVM 时会将分区转换为物理卷(Physical Volumes)。物理卷被合并成逻辑卷组

(Logical Volume Group),逻辑卷组被分成逻辑卷(Logical Volumes)。当某个新的硬盘被添加

到系统上,也可以被添加到逻辑卷组中,逻辑卷是可以扩展的分区(如图 7-9 所示)。由于

LVM 允许在机器的物理存储资源以外创建逻辑卷,并且逻辑卷可以在系统仍处于运行状态时

扩充和缩减,因此为系统管理员提供了存储器灵活性。

图 7-9 LVM

(1)物理卷:PV(Physical Volume),物理卷在逻辑卷管理中处于 底层,物理卷可以是

实际物理硬盘上的分区,也可以是整个物理硬盘。

(2)逻辑卷组:VG(Volumne Group),逻辑卷组建立在物理卷之上,一个卷组中至少要

包括一个物理卷,在逻辑卷组建立之后可动态添加物理卷到逻辑卷组中。一个逻辑卷管理系

统工程中可以有一个逻辑卷组,也可以拥有多个逻辑卷组。

(3)逻辑卷:LV(Logical Volume),逻辑卷建立在逻辑卷组之上,逻辑卷组中的未分配

空间可以用于建立新的逻辑卷,逻辑卷建立后可以动态地扩展和缩小空间。系统中的多个逻

我的地盘我做主——Linux 磁盘及文件系统管理 第

221

7

辑卷可以属于同一个逻辑卷组,也可以属于不同的多个逻辑卷组。

配置 LVM 后有一些本所熟悉的硬盘存储方面的概念会有一些变化,PE、LE 就是两个在

LVM 中存储方面的概念。

(1)物理区域:PE(Physical Extent),物理区域是物理卷中可用于分配的 小存储单元,

物理区域的大小可根据实际情况在建立物理卷时指定。物理区域大小一旦确定将不能更改,

同一逻辑卷组中的所有物理卷的物理区域大小必须一致。

(2)逻辑区域:LE(Logical Extent):逻辑区域是逻辑卷中可用于分配的 小存储单元,

逻辑区域的大小取决于逻辑卷所在逻辑卷组中的物理区域的大小。

7.9.2 在安装时创建 LVM

在 RHEL 5.x 安装过程中,安装程序在建立磁盘分区时就提供了创建 LVM 的功能,具体

操作步骤如下。

(1)在建立分区时,将“File System Type”文件系统选择为“physical volume(LVM)”(如

图 7-10 所示)创建物理卷。本章创建了一个 40GB 的分区。

图 7-10 文件系统选择

(2)在分区建立完成后单击“LVM”按钮,在弹出窗口中输入“Volume Group Name”

逻辑卷组名称后,可在“Logical Volumes”中单击“Add”按钮建立逻辑卷。在建立逻辑卷时,

需要输入“Mount Point”挂载点、“Logical Volume Name”逻辑卷名称、“Size(MB)”逻辑卷

大小。完成后单击“OK”按钮(如图 7-11 所示),一个 LVM 就创建完成。

Linux 从初学到精通

222

图 7-11 创建 LVM

7.9.3 LVM 相关命令

创建和维护 LVM 和 RAID 阵列不一样,RAID 阵列只需要通过 mdadm 一个命令,而 LVM

需要使用到一组命令,下面是建立和维护 LVM 时常用的命令。

1.物理卷相关命令 (1)pvcreate:将普通物理分区转换为物理卷。

pvcreate [-yf] 物理分区…

常用指数:

常用选项:

物理分区:要转换为物理卷的物理分区。

-y:命令执行过程中所有提示均回答“yes”。

-f:强制转换。

(2)pvdisplay:显示物理卷的属性。

pvdisplay [-s] [物理卷]

常用指数:

常用选项:

物理卷:要显示属性的物理卷,如不选择则显示所有物理卷。

-s:只显示物理卷的基本信息。

我的地盘我做主——Linux 磁盘及文件系统管理 第

223

7

(3)pvremove:删除物理卷。

pvremove [-yf] 物理卷…

常用指数:

常用选项:

物理卷:要删除的物理卷。

-y:命令执行过程中所有提示均回答“yes”。

-f:强制删除。

2.逻辑卷组相关命令 (1)vgcreate:建立逻辑卷组。

vgcreate 逻辑卷组名 物理卷…

常用指数:

常用选项:

逻辑卷组名:建立的逻辑卷组名。

物理卷:要加入逻辑卷组的物理卷。

(2)vgdispaly:显示逻辑卷组的属性。

vgdispaly [-s] [逻辑卷组]

常用指数:

常用选项:

逻辑卷组:要显示属性的逻辑卷组,如不选择则显示所有逻辑卷组。

-s:只显示逻辑卷组的基本信息。

(3)vgremove:删除逻辑卷组。

vgremove [-f] 逻辑卷组…

常用指数:

常用选项:

逻辑卷组:要删除的逻辑卷组。

-f:强制删除。

(4)vgrename:重命名逻辑卷组。

vgremove 原逻辑卷组名 新逻辑卷组名

Linux 从初学到精通

224

常用指数:

常用选项:

原逻辑卷组名:要重命名的逻辑卷组。

新逻辑卷组名:重命名后的逻辑卷组。

(5)vgextend:扩展逻辑卷组。

vgextend 逻辑卷组名 物理卷…

常用指数:

常用选项:

逻辑卷组名:要扩展逻辑卷组。

物理卷:要加入逻辑卷组的物理卷。

(6)vgreduce:缩小逻辑卷组。

vgreduce逻辑卷组物理卷…

常用指数:

常用选项:

逻辑卷组:要缩小逻辑卷组。

物理卷:要从逻辑卷组中移除的物理卷。

3.逻辑卷相关命令 (1)lvcreate:建立逻辑卷。

lvcreate -L <逻辑卷大小> -n <逻辑卷名称> 逻辑卷组

常用指数:

常用选项:

逻辑卷组:要建立的逻辑卷属于逻辑卷组名称。

-n <逻辑卷名称>:要建立的逻辑卷名称。

-L <逻辑卷大小>:要建立的逻辑卷大小,逻辑卷的容量不能超过所属的逻辑卷组,

可使用 MB、GB 作为单位。

(2)lvdisplay:显示逻辑卷属性。

lvdisplay [-s] [逻辑卷]

常用指数:

我的地盘我做主——Linux 磁盘及文件系统管理 第

225

7

常用选项:

逻辑卷:要显示属性的逻辑卷,如不选择则显示所有逻辑卷。逻辑卷被建立后,其

设备名为“/dev/逻辑卷组/逻辑卷”。

-s:只显示逻辑卷组的基本信息。

(3)lvremove:删除逻辑卷。

lvremove [-f] 逻辑卷…

常用指数:

常用选项:

逻辑卷:要删除的逻辑卷。

-f:强制删除。

(4)lvrename:重命名逻辑卷。

lvrename原逻辑卷名 新逻辑卷名

常用指数:

常用选项:

原逻辑卷名:要重命名的逻辑卷。

新逻辑卷名:重命名后的逻辑卷。

(5)lvextend:扩展逻辑卷。

lvextend -L <[+]大小> 逻辑卷

常用指数:

常用选项:

逻辑名:要扩展逻辑卷。

-L [+]大小:要扩展的大小。使用“+”时表示在现有的基础上增加,不使用“+”

表示扩展到多大。但总容量不能操作所在逻辑卷组的容量。

(6)lvredue:缩小逻辑卷。

lvredue -L <[-]大小> 逻辑卷

常用指数:

常用选项:

逻辑卷:要缩小逻辑卷。

Linux 从初学到精通

226

-L [-]大小:要缩小的大小。使用“-”时表示在现有的基础上缩小,不使用“-”表

示缩小到多少。

7.9.4 LVM 建立与维护

LVM 的创建过程是先将物理分区转换为物理卷,再利用物理卷创建逻辑卷组, 后在逻

辑卷组中建立逻辑卷。一个逻辑卷组可以由多个物理卷组成,同样的也可以在一个逻辑卷组

中创建多个逻辑卷。当逻辑卷空间不够用时,可以在不影响正常使用、不丢失原有数据的情

况下动态地增加逻辑卷的大小,当然前提条件是逻辑卷所在的逻辑卷组还有多余的空间。如

果逻辑卷组没有多余的空间时,可以再将其他物理卷加入到逻辑卷组中。

1.建立 LVM 下面将在通过本机硬盘/dev/sdd 创建一个逻辑卷,具体操作步骤如下。

(1)本章中在硬盘/dev/sdd 创建了两个分区,容量分别为 40GB 和 80GB。

(2)在 fdisk 使用“t”将分区类型转换为“Linux LVM”(“8e”)。

[root@srv ~]# fdisk /dev/sdd The number of cylinders for this disk is set to 27413. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Command (m for help): p Disk /dev/sdd: 225.4 GB, 225485783040 bytes 255 heads, 63 sectors/track, 27413 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sdd1 1 27413 220194891 5 Extended /dev/sdd5 1 4864 39070017 8e Linux LVM /dev/sdd6 4865 14591 78132096 8e Linux LVM

(3)使用“pvcreate”命令将“/dev/sdd5”、“/dev/sdd6”两个物理分区转换为物理卷。

[root@srv ~]# pvcreate /dev/sdd5 /dev/sdd6 Physical volume "/dev/sdd5" successfully created Physical volume "/dev/sdd6" successfully created [root@srv ~]# pvdisplay --- Physical volume --- PV Name /dev/sdc6 VG Name vg0 PV Size 9.32 GB / not usable 2.41 MB Allocatable yes PE Size (KByte) 4096 Total PE 2386 Free PE 2373 Allocated PE 13 PV UUID 20j8QY-61Cn-xSIC-LACc-9f5p-TF8a-Tbcf6c "/dev/sdc5" is a new physical volume of "9.32 GB" --- NEW Physical volume --- PV Name /dev/sdc5

我的地盘我做主——Linux 磁盘及文件系统管理 第

227

7 VG Name PV Size 9.32 GB Allocatable NO PE Size (KByte) 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID Cv2c3V-fpCs-sSZT-yJqr-OPm8-spfG-1JwKtv "/dev/sdd5" is a new physical volume of "37.26 GB" --- NEW Physical volume --- PV Name /dev/sdd5 VG Name PV Size 37.26 GB Allocatable NO PE Size (KByte) 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID GIhT1n-1YJ1-s0PQ-1j99-0C4F-SLqK-jBr7ui "/dev/sdd6" is a new physical volume of "74.51 GB" --- NEW Physical volume --- PV Name /dev/sdd6 VG Name PV Size 74.51 GB Allocatable NO PE Size (KByte) 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID BwohJ2-UKq9-Nd5O-c3fp-uh0m-ISe8-GRcBUu

(4)使用“vgcreate”命令将“/dev/sdd5”、“/dev/sdd6”两个物理卷加入一个新建的名为

“vg0”的逻辑卷组。如果在一台计算机上创建多个逻辑卷组时,只要逻辑卷组的名称不重复

即可。

[root@srv ~]# vgcreate vg0 /dev/sdd5 /dev/sdd6 /dev/cdrom: open failed: Read-only file system /dev/cdrom: open failed: Read-only file system Volume group "vg0" successfully created [root@srv ~]# vgdisplay --- Volume group --- VG Name vg0 System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 1 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 2 Act PV 2

Linux 从初学到精通

228

VG Size 111.77 GB PE Size 4.00 MB Total PE 28613 Alloc PE / Size 0 / 0 Free PE / Size 28613 / 111.77 GB VG UUID N0Q10f-P666-Bhwv-chHA-cWR8-z0dQ-zi9lyw

(5)使用“lvcreate”命令在名为“vg0”的逻辑卷组中创建名为“lvm0”的逻辑卷。如

果在一个逻辑卷组中创建多个逻辑卷时,只要逻辑卷的名称不重复即可。

[root@srv ~]# lvcreate -L 50G -n lvm0 vg0 Logical volume "lvm0" created [root@srv ~]# lvdisplay --- Logical volume --- LV Name /dev/vg0/lvm0 VG Name vg0 LV UUID Pn0REw-faec-RTOI-aO22-0Nu9-E8QO-2OZmNe LV Write Access read/write LV Status available # open 0 LV Size 50.00 GB Current LE 12800 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0

(6)将逻辑卷组 lvm0 格式化。

[root@srv ~]# mkfs.ext3 /dev/vg0/lvm0 mke2fs 1.39 (29-May-2006) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 6553600 inodes, 13107200 blocks 655360 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=0 400 block groups 32768 blocks per group, 32768 fragments per group 16384 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424 Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 23 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.

(7)在格式化完成后,就可以像使用一般分区一样挂载使用。

我的地盘我做主——Linux 磁盘及文件系统管理 第

229

7

2.调整逻辑卷组 当逻辑卷空间不足时只要所属逻辑卷组还有多余的空间就可以扩展,如果逻辑卷组已没

有空间时,就需要扩展逻辑卷组。扩展逻辑卷组的具体操作步骤如下。

(1)将物理分区的分类类型改为“Linux LVM”后,使用“pvcreate”命令将物理分区转

换为物理卷。本章中已经将大小为 100GB 的物理分区“/dev/sdd7”转换为物理卷。

(2)使用“vgextend”命令将物理卷加入到现有的逻辑卷组中。

目前逻辑卷组的容量是 111.77GB。

[root@srv ~]# vgdisplay -s "vg0" 111.77 GB [0 used / 111.77 GB free]

将物理卷“/dev/sdd7”加入逻辑卷组“vg0”。

[root@srv ~]# vgextend vg0 /dev/sdd7 Attempt to close device '/dev/cdrom' which is not open. Volume group "vg0" successfully extended

逻辑卷组空间已增大到 204.91GB。

[root@srv ~]# vgdisplay -s "vg0" 204.91 GB [0 used / 204.91 GB free]

3.调整逻辑卷 只要逻辑卷组中还有多余的空间,就可以在不影响正常使用、不丢失原有数据的情况扩

展逻辑卷。扩展逻辑卷使用“lvextend”命令。

[root@srv ~]# lvdisplay /dev/vg0/lvm0 --- Logical volume --- LV Name /dev/vg0/lvm0 VG Name vg0 LV UUID Pn0REw-faec-RTOI-aO22-0Nu9-E8QO-2OZmNe LV Write Access read/write LV Status available # open 0 LV Size 50.00 GB #目前逻辑卷的容量。 Current LE 12800 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0

使用“lvextend”命令将逻辑卷“/dev/vg0/lvm0”增加了 10GB 空间。

[root@srv ~]# lvextend -L +10G /dev/vg0/lvm0 Extending logical volume lvm0 to 60.00 GB Logical volume lvm0 successfully resized [root@srv ~]# lvdisplay /dev/vg0/lvm0 --- Logical volume --- LV Name /dev/vg0/lvm0 VG Name vg0 LV UUID Pn0REw-faec-RTOI-aO22-0Nu9-E8QO-2OZmNe

Linux 从初学到精通

230

LV Write Access read/write LV Status available # open 0 LV Size 60.00 GB #逻辑卷空间已增大。 Current LE 15360 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0

磁盘配额管理

在多用户时,作为计算机管理员可以设置不同用户拥有不同的磁盘配额,无论硬盘还剩

多少空间,用户都只能在这个限额下使用磁盘。如管理员将用户 jack 在/dev/sdb1 的磁盘配额

设为 100MB,那么 jack 用户在使用时就 多只能使用/dev/sdb1 的 100MB 空间。在 Linux 中

磁盘配额分为以下两种:

(1)soft:软配额,这是 低限制容量,用户在宽限期间的容量可以超过 soft(但不能超

过 hard)的硬盘空间,但必须在宽限时间内将磁盘容量降低到 soft 的容量限制下。

(2)hard:硬配额,这是绝对不能超过的容量。跟 soft 相比,通常 hard 的限度会比 soft

的限度高。soft 到 hard 之间的容量就是宽限的容量,可以起到警告作用。

宽限时间就是用户使用的空间超过了 soft,但还没有到达 hard 的时限。在这个宽限时间

内,用户需要将使用的磁盘容量降低到 soft 之下。当用户的磁盘容量使用情况超过 soft 时,

宽限时间就会自动启动,而在用户将容量降低至 soft 之下,宽限时间就会自动取消。

7.10.1 磁盘配额相关命令

在默认情况下分区并不支持磁盘配额功能,为了使分区永久支持磁盘配额功能需要在

“/etc/fstab”文件的挂载选项列增加“usrquota”和“grpquota”选项使用分区支持针对用户的

磁盘配额和针对用户组的磁盘配额,使用时这两个选项也可以只增加一个表示只支持一种磁

盘配额功能,在下面的/etc/fstab 文件中/dev/sdb1 就是既支持针对用户也支持针对用户组的磁

盘配额。

[root@srv ~]# tail -1 /etc/fstab /dev/sdb1 /ctu ext3 defaults,usrquota,grpquota 0 0

使用 mount 命令查看时,/dev/sdb1 已支持针对用户和针对用户组的磁盘配额。

[root@srv ~]# mount /dev/sda7 on / type ext3 (rw) proc on /proc type proc (rw) sysfs on /sys type sysfs (rw) devpts on /dev/pts type devpts (rw,gid=5,mode=620) /dev/sda8 on /tmp type ext3 (rw) /dev/sda6 on /var type ext3 (rw)

我的地盘我做主——Linux 磁盘及文件系统管理 第

231

7/dev/sda3 on /home type ext3 (rw) /dev/sda2 on /usr type ext3 (rw) /dev/sda5 on /usr/local type ext3 (rw) /dev/sda1 on /boot type ext3 (rw) tmpfs on /dev/shm type tmpfs (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) none on /proc/fs/vmblock/mountPoint type vmblock (rw) sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw) /dev/sdb1 on /ctu type ext3 (rw,usrquota,grpquota)

修改/etc/fstab 文件后,为了使其生效,需要重新启动计算机或使用“mount -o remount

分区”命令。

在分区支持磁盘配额功能后,Linux 提供了一系列的命令用于定义及管理用户的磁盘配

额,下面是建立和维护磁盘配额时常用的命令。

(1)quotacheck:扫描支持磁盘配额的分区,并建立磁盘配额所需文件。

quotacheck [-afvug] [挂载点]

常用指数:

常用选项:

挂载点:扫描挂载点所挂载的分区。

-a:扫描所有支持的磁盘配额的分区,使用此选项后不必再使用“挂载点”。

-u:针对用户扫描文件与目录的使用情况,会建立 aquota.user 文件。

-g:针对用户组扫描文件与目录的使用情况,会建立 aquota.group 文件。

-v:显示扫描过程的信息。

-f:强制扫描。

这个命令主要的目的在扫描分区,如果是初次扫描,扫描完毕之后会在分区中建立

“aquota.user”和“aquota.group”两个文件用户记录该分区的用户和用户组的配额信息。在执

行这个命令过程中,磁盘将自动被设置成为只读。

(2)edquota:更改指定用户或用户组的磁盘配额。

edquota [-u <用户>] [-g <用户组>] edquota [-t] edquota -p <参考用户> -u <用户>

常用指数:

常用选项:

-u <用户>:指定要编辑磁盘配额的用户。

-g <用户组>:指定要编辑磁盘配额的用户组。

-t:修改宽限期间。

提 示

Linux 从初学到精通

232

-p <参考用户>:将指定用户的磁盘配额更改为和参考用户相同。

使用 edquota 命令后,会进入一个类型 vi 的界面进行相关选项的更改。以下是使用

“edquota -t”修改宽限期间。“Filesystem”是支持磁盘配额的分区;“Block grace period”针对

容量的宽限期间;“Inode grace period”针对 i 节点的宽限期间。默认的宽限期间是 7 天,目

前一般都是通过容量指定,所以只需要修改“Block grace period”中的宽限期间。

Grace period before enforcing soft limits for users: Time units may be: days, hours, minutes, or seconds Filesystem Block grace period Inode grace period /dev/sdb1 7days 7days

(3)quotaon:开启磁盘配额功能。

quotaon [-avug] [挂载点]

常用指数:

常用选项:

挂载点:开启磁盘配额的分区。

-a:扫描所有支持的磁盘配额的分区,使用此选项后不必再使用“挂载点”。

-u:针对用户开启磁盘配额。

-g:针对用户组开启磁盘配额。

-v:显示开启过程的信息。

使用该命令前必须已经使用“quotacheck”命令扫描过分区。

(4)quotaoff:关闭磁盘配额功能,该命令选项与“quotaon”命令相同。

(5)repquota:查看指定分区磁盘配额的使用情况。

repquota -a|挂载点 [-vug]

常用指数:

常用选项:

挂载点:查看磁盘配额使用情况的分区。

-a:显示所有支持的磁盘配额分区的使用情况,使用此选项后不必再使用“挂载点”。

-u:显示用户的磁盘配额。

-g:显示用户组的磁盘配额。

-v:输出所有的磁盘配额使用情况,而当前用户自己的磁盘配额使用情况。

(6)quota:查看指定用户或用户组磁盘配额的使用情况。

quota [-v] [-u <用户>] [-g <用户组>]

常用指数:

我的地盘我做主——Linux 磁盘及文件系统管理 第

233

7

常用选项:

-u <用户>:显示指定用户磁盘配额使用情况,若不指定用户则显示所有用户。

-g <用户组>:显示指定用户的磁盘配额使用情况,若不指定用户则显示所有用户组。

-v:显示每个分区的磁盘配额。

7.10.2 磁盘配额步骤

一般使用磁盘配额的步骤是:先使用“quotacheck”命令扫描分区,再使用“edquota”

命令编辑指定用户或用户组的磁盘配额, 后使用“quotaon”命令开户指定用户或用户组的

磁盘配额。下面将在/dev/sdb1 上开户磁盘配额,并指定用户组 ctu 的软配额为 1.5GB、硬配

额为 2GB、宽限期间为 3 天。

(1)更改/etc/fstab 文件,使用/dev/sdb2 支持用户、用户组磁盘配额。

[root@srv ~]# tail -1 /etc/fstab /dev/sdb1 /ctu ext3 defaults,usrquota,grpquota 0 0

(2)使用“quotacheck”命令扫描磁盘。

[root@srv ~]# quotacheck -avug quotacheck: Scanning /dev/sdb1 [/ctu] quotacheck: Cannot stat old user quota file: No

such file or directory quotacheck: Cannot stat old group quota file: No such file or directory quotacheck: Cannot stat old user quota file: No such file or directory quotacheck: Cannot stat old group quota file: No such file or directory done quotacheck: Checked 2 directories and 2 files quotacheck: Old file not found. quotacheck: Old file not found.

(3)使用“edquota -g ctu”编辑用户组 CTU 的磁盘配置。该命令与 vim 操作键相同,第

1 列“Filessystem”是显示的是分区;第 2 列“blocks”是显示该分区当前已使用的容量,不

需要修改该列;第 3 列“soft”是以容量方式指定软配额,以 KB 为单位;第 4 列“hard”以

容量方式指定硬配额,以 KB 为单位;第 5 列“inodes”以 i 节点方式显示已使用容量;第 3

列“soft”是以 i 节点方式指定软配额;第 4 列“hard”以 i 节点方式指定硬配额。一般修改

第 3、4 列以容量方式指定配额。

Disk quotas for group ctu (gid 501): Filesystem blocks soft hard inodes soft hard /dev/sdb1 0 1500000 2000000 0 0 0

(4)使用“edquota -t”编辑宽限时间。

Grace period before enforcing soft limits for users: Time units may be: days, hours, minutes, or seconds Filesystem Block grace period Inode grace period /dev/sdb1 3days 7days

(5)使用“quotaon -avg”启用针对用户组的磁盘配额。

[root@srv ~]# quotaon -avg

Linux 从初学到精通

234

/dev/sdb1 [/ctu]: group quotas turned on

实验任务

在一台安装了 RHEL 5.x 有三块硬盘的计算机上完成以下任务。

(1)在/dev/sdb 上划分三个分区,并将其分区格式为 msdos、vfat、ext3。

(2)将 RHEL 5.x 的光盘挂载到/rhel 目录。

(3)将/dev/sdb 上的三个分区永久挂载到/mnt/sdb1、/mnt/sdb2、/mnt/sdb3 目录,并使第

二个分区支持 ACL 功能。

(4)在/dev/sdb 上再划分一个分区,使用自动挂载功能,将其挂载到/mnt/sdb5。

(5)在/dev/sdb 上划分一个 2GB 的分区永久用于交换空间。

(6)在/dev/sdc 上建立一个 RAID5 阵列,并有一个热备分区。

(7)在/dev/sdc 上建立一个 10GB 的逻辑卷。

(8)将 10GB 的逻辑卷扩展到 21GB。

本章测试

(1)在一台 Linux 服务器上安装了两块 SCSI 硬盘,其中第二块硬盘的第一个逻辑分区的

设备号是( )。

A./dev/sdb1 B./dev/sdb2

C./dev/sdb4 D./dev/sdb5

(2)以下 RAID 等级中,( )不能通过 RHEL 5.x 提供的软 RAID 功能实现。

A.RAID0 B.RAID0

C.RAID5 D.RAID7

(3)以下功能中,( )是 LVM 所不具备的。

A.配置为 SWAP 分区 B.动态扩展

C.动态缩小 D.热拔插

(4)在( )文件中配置的挂载信息在系统重新启动后依然有效。

A./etc/mount B./etc/sysconfig/mount

C./etc/fstab D./etc/sysconfig/fstab

(5)以下命令中,( )可以将一个 ISO 映像文件挂载到/iso 目录。

A.mount -o loop /mnt/cdrom/RHEL.iso /iso

B.mount /mnt/cdrom/RHEL.iso /iso

C.mount --bind /mnt/cdrom/RHEL.iso /iso

D.mount /iso /mnt/cdrom/RHEL.iso

我的地盘我做主——Linux 磁盘及文件系统管理 第

235

7

(6)使用( )可以将分区格式为 SWAP 分区。

A.mkfs.swap B.mkswap

C.mkfs.ext3 D.mkswap.ext3

(7)( )服务用于管理自动挂载功能。

A.autofs B.automount

C.atd D.atfs

(8)使用( )选项可以使分区支持磁盘配额功能。

A.usrquota,grpquota B.userquotagroupquota

C.uquota,gquota D.ugquota

(9)在 RHEL 5.x 推荐将 SWAP 分区配置为物理内存的( )倍。

A.3 B.1.5

C.4 D.5.5

(10)以下文件系统中,( )RHEL 5.x 默认不支持。

A.fat B.ext2

C.ext3 D.ext4

一个完整的应用系统平台中,直接与用户打交道的并不只是

操作系统,还包括能够运行于这个操作系统平台之上的一系列应

用程序,这些应用程序能够利用操作系统所提供的运行接口完成

各种特定的任务,如办公软件、下载工具、聊天软件等。

在 Linux 系统中,大多数应用程序都可以通过在 Shell 提供的

命令行环境中输入命令启动,因此在很多情况下,把此应用程序

称为命令。从严格意义上来讲,只有 Shell 的内部命令才可以称

为命令,而其他的都属于应用程序一类,因为这些应用程序都可

以在硬盘上找到对应的一个程序实体,如 cd 命令在硬盘上找不到

对应的程序实体,因为 cd 命令是由 Shell 提供的内部命令,而 tar

命令就是一个应用程序,因为 tar 命令的程序实体在/bin 目录中。

tar 命令是由操作系统所提供的应用程序,因而不需要额外进

行安装,但是操作系统并不能提供所有的应用程序,这时就需要

用户根据自己的需要采用正确的方法安装各种应用程序。在本章

中将讲述 Linux 常见软件安装的相关操作。

第8章

不只是下一步︱︱Linux

软件安装及管理

不只是下一步——Linux 软件安装及管理 第

237

8

Linux 软件常见安装方式

在 Windows 系统中的应用程序大多是闭源软件,这些软件的开发商在发行软件前会将软

件编译为二进制文件,用户一般只能通过软件提供的安装程序进行安装使用。由于 Linux 系

统中大多数应用程序都是开源软件,所以在安装方式上也给了用户最大的选择,其中比较常

见的几种安装方式包括以下几种:

(1)绿色软件:这是一个在 Windows 平台也有的概念,这样的软件不需要任何安装直接

就可以使用,如在 3.1.4 中讲到的 Thunderbird 就属于绿色软件。

(2)提供了安装程序的软件包:在软件包内提供了 install.sh、setup.sh 等安装程序或以.bin

格式单个执行文件提供,如在 3.1.5 中讲到的永中 Office。

(3)deb 方式:deb 是 Debian 软件包格式,文件扩展名为.deb,跟 Debian 的命名一样,

deb 也是因 Debra Murdock 而得名。deb 经过 gzip 和 tar 打包而成,处理这些包的经典程序是

dpkg,经常是通过 apt 来运行。通过 Alien 工具,可以将 deb 包转换成其他形式的软件包。

(4)RPM 方式:RPM 是在 Linux 下广泛使用的软件包管理器,最早由 Red Hat 开发,现

在也由开源社区开发。RPM 通常随附于 Linux 发行版,但也有单独将 RPM 作为应用软件发

行的发行版。RPM 仅适用于安装用 RPM 来打包的软件,目前是 GNU/Linux 下软件包资源最

丰富的软件包类型。

(5)源码方式:使用源码自己通过编译生成二进制文件的软件安装方式是最活动也是难

度最大的方式,通过源码编译最大的好处就是可以根据自己的需要最大限度地定制软件。

RPM方式安装软件

在 RHEL 5.x 中默认使用 RPM(Red Hat Package Management,Red Hat 软件包管理器)

管理软件包。使用 RPM 不但可以安装、卸载、升级软件包,还可以校验软件来源是否可靠、

校验软件包是否被破坏等。虽然 RPM 是由 Red Hat 开发,但目前很多 Linux 发行版都支持

RPM 包,如 Fedora、CentOS、SuSE/openSuSE、Turbo Linux、PCLinuxOS、Mandriva Linux、

红旗 Linux 等。

RPM 将要安装的软件事先编译并且打包好了,编译好的 RPM 会在其中记录这个软件在

安装的时候必须要依赖的其他软件包。当安装 RPM 包时,系统会先依照 RPM 包中的记录数

据查看其所依赖的其他软件包是否已安装,如果满足则安装,如果不满足则不安装。RPM 唯

一的不足是软件包之间的依赖关系处理,但是这个可以通过 YUM 很好地弥补。

8.2.1 RPM 命名规则

RPM 包可以自己制作,也可以从 Internet 上下载,http://rpmfind.net/和 http://rpm.pbone.net/

就是两个非常著名的 RPM 包下载网站,在这两个网站上几乎可以找到需要的任何 RPM 包。

Linux 从初学到精通

238

在这样的网站找到自己需要的软件包后,往往会发现同一个软件有很多个可以选择,那应该

怎么样选择适合自己使用的 RPM 包呢?一般可以通过 RPM 包的名称进行判断。RPM 包文

件名一般使用如下格式。

packagename-version-arch.rpm packagename-version-arch.src.rpm

其中“packagename”是软件包名称;“version”是带有主、次和修订号的软件包版本;

“arch”是指软件包要求的硬件平台;“src”表示这是一个源码包。如“zlib-1.2.3-3.i386.rpm”

中“zlib”是软件名称;“1.2.3-3”是软件版本;“i386”是体系结构。有很多 RPM 包名称中

还包括以下几种特殊的名称:

(1)devel:这样的 RPM 一般是软件的开发包,如“zlib-devel-1.2.3-3.i386.rpm”就是“zlib”

这个软件的开发包,如果只单纯地使用软件的话一般不需要安装。

( 2 ) noarch : 这 样 的 软 件 包 一 般 是 不 需 要 特 定 的 硬 件 平 台 , 如

“xml-common-0.6.3-18.noarch.rpm”就说明“xml-common”这个软件包在任何硬件平台下都

可以运行。

( 3 ) elX 、 fcX :这样的软件包一般是说明这个软件包的发行商版本,如

“ ypbind-1.19-12.el5.i386.rpm ” 就 说 明 这 个 软 件 包 是 RHEL 5.x 下 使 用 的 ;

“xorg-x11-xsm-1.0.2-4.fc6.i386.rpm”就说明这个软件包是 Fedora 6 下使用的,不过并不是说

这个软件包只能在 Fedora 6 下使用,这就好像在某些 Windows 系统中的软件的发行平台是

Windows XP,并不能说明该软件不能在 Windows 7 下运行。

8.2.2 管理 RPM 软件包

如果在图形环境下安装 RPM 包,可以就像在 Windows 下安装软件一样直接通过双击软

件包安装,如果是在字符环境中就需要使用 rpm 命令安装,rpm 命令的选项非常多,下面将

讲解在使用 rpm 命令时常用的组合方式。

1.校验 RPM 包 rpm 命令提供了对 RPM 文件的校验功能用于检查 rpm 文件的完整性及在发行后是否被

修改。校验主要使用“-V”选项,配合以下几个选项进行。

(1)使用“rpm -Va”的方式显示目前系统上面所有可能被更动过的文件。

[root@srv ~]# rpm -Va .......T c /etc/mail/sendmail.cf SM5....T /usr/lib/xorg/modules/drivers/vmware_drv.so SM5....T /usr/lib/xorg/modules/input/vmmouse_drv.so S.5....T c /etc/printcap ....L... c /etc/pam.d/system-auth .......T c /etc/audit/auditd.conf ..5....T c /etc/inittab S.5....T c /etc/xml/catalog S.5....T c /usr/share/sgml/docbook/xmlcatalog ..5....T c /usr/lib/security/classpath.security .M...... /mnt SM5....T c /etc/sysconfig/iptables-config

不只是下一步——Linux 软件安装及管理 第

239

8S.5....T c /etc/sysconfig/system-config-securitylevel

(2)使用“rpm -V 已安装 RPM 包”的方式显示指定软件包在安装后被改动的文件。

[root@srv ~]# rpm -V sendmail .......T c /etc/mail/sendmail.cf S.5....T c /var/log/mail/statistics

(3)使用“rpm -Vf 系统中的文件”的方式显示指定文件在被安装后是否改动过。在下

面的全局中是显示文件/etc/mail/sendmail.mc 在安装后是否改动过。

[root@srv ~]# rpm -Vf /etc/mail/sendmail.mc .......T c /etc/mail/sendmail.cf S.5....T c /var/log/mail/statistics

(4)使用“rpm -Vp RPM 文件”的方式显示指定软件包文件中被改动的文件。

[root@srv ~]# rpm -Vp /mnt/Server/sendmail-8.13.8-2.el5.i386.rpm .......T c /etc/mail/sendmail.cf S.5....T c /var/log/mail/statistics

rpm 命令中上述选项进行校验时还可以结合以下选项执行:

(1)--noscripts:不执行校验脚本程序,有些 RPM 软件包中内置有校验脚本程序,用于

执行一些特殊的检查。当用户不想执行这类脚本程序时,可以使用该选项。

(2)--nodeps:不检查依赖关系,校验软件包时,默认情况是会检查依赖关系,因为依赖

是否正常关系到一个软件能否可靠运行。校验时选用该选项,用于指示 rpm 命令不检查依赖

关系。本选项主要针对软件包制作者,除非必要,不要使用此选项。一般可以通过校验时用

“-vv”选项输出调试信息,从而可以看到是否检查依赖关系的区别。

(3)--nofiles:忽略丢失文件的错误,默认情况下,rpm 命令校验时如果发现文件丢失,

会显示“missing 文件名”的错误。如果用户想忽略这方面的错误,可使用该选项。

(4)--nomd5:忽略 MD5 检查和的错误,本选项用于指示 rpm 命令忽略文件内容的改变,

即忽略 MD5 检查和错误。

在使用 rpm 命令进行校验时会输出相关的信息,输出格式为“SM5DLUGT c 文件名”。

其中“SM5DLUGT”用于显示校验文件是哪些部分发生了改变,这些字母含义如下:

(1)S:表示文件大小发生改变。

(2)M:表示权限发生改变。

(3)5:表示 MD5 值发生改变。

(4)D:表示主从设备号发生改变。

(5)L:表示符号连接发生改变。

(6)U:表示所有者发生改变。

(7)G:表示所有组发生改变。

(8)T:表示最后修改时间发生改变。

(9)missing:某些文件丢失、“.”没有发生改变。

2.安装 RPM 包

使用“rpm -i”命令的安装 RPM 包,在安装时一般会结合使用“v”查看详细安装信息、

Linux 从初学到精通

240

“h”安装时输出“#”用以提供安装进度两个选项。在下面的例子中就是使用 rpm 命令安装

在 RHEL 5.x 光盘中提供的 telnet-server 软件包。

[root@srv mnt]# rpm -ivh Server/telnet-server-0.17-39.el5.i386.rpm warning: Server/telnet-server-0.17-39.el5.i386.rpm: Header V3 DSA signature: NOKEY, key

ID 37017186 Preparing... ######################################## [100%] 1:telnet-server ######################################## [100%]

telnet-server 软件包在安装时并不需要其他依赖软件包,所以安装也非常容易。但是如果

一些需要其他依赖软件包,而这些依赖软件包又没有安装时 rpm 命令会提示系统中还差的内

容。

[root@srv ~]# rpm -ivh Server/httpd-2.2.3-31.el5.i386.rpm warning: Server/httpd-2.2.3-31.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID

37017186 error: Failed dependencies: #缺 2个有依赖关系的软件包。 libapr-1.so.0 is needed by httpd-2.2.3-31.el5.i386 libaprutil-1.so.0 is needed by httpd-2.2.3-31.el5.i386

在安装过程中出现“warning:...NOKEY...”的警告信息是因为没有导入 RedHat 提供的

公钥,这个不会影响安装效果可以忽略。如果希望导入公钥可以使用“rpm --import

/mnt/RPM-GPG-KEY-redhat-release”(/mnt 是光盘挂载点)。

上面的例子中在安装软件 httpd 时就因为缺少 2 个依赖的软件包而无法安装,这时正确的解

决方法应该是找到依赖的软件包并将其安装后,再安装软件 httpd。有时因为一些原因希望可以

强制将软件包安装,而不去进行安装时必要的检查,rpm 命令提供了以下选项可用于强制安装。

(1)--nodeps:如果安装某个软件包时,rpm 命令提供有依赖软件包没有安装,而你又想

要直接强制安装时,可以使用该选项 rpm 命令在安装时就不会去检查依赖关系,不过使用该

选项后并不能保证软件包安装后的正常使用。

(2)--nomd5:在使用 rpm 命令安装时,默认情况下 rpm 命令会检查软件包的 MD5,使

用该选项 rpm 命令在安装时就不会去检查 MD5 值。

(3)--noscripts:使用该选项后将不会执行任何与 RPM 安装有关的脚本。

(4)--replacefiles:当使用 rpm 命令在安装过程中出现某个文件已被安装或版本冲突时,

使用该选项可以直接覆盖已被安装的文件。

(5)--replacepkgs:当使用 rpm 命令安装一个已经被安装过的软件包时需要使用该选项。

(6)--force:相关于同时使用--replacefiles、--replacepkgs 两个选项。

(7)--test:使用该选项后 rpm 命令不会真的将软件包安装,而是测试整个安装过程。

有一些 Linux 软件的官方网站会将软件及其所有依赖的软件同时发布,这样的情况下可

以将这些软件包全部下载到一个目录后,使用“rpm -ivh *.rpm”命令进行安装。这样 rpm 命

令会自动检查这样的软件包,然后根据依赖关系的先后顺序进行安装。

rpm 命令也支持直接使用 URL 引用的方式安装软件包,如下面的例子中就是直接安装一

个 FTP 服务器上的软件包。

提 示

不只是下一步——Linux 软件安装及管理 第

241

8[root@srv ~]# rpm -ivh \ ftp://rpmfind.net/linux/dag/redhat/el5/i386/dag/RPMS/tftp-server-0.34-0.2.el5.rf.i386.rpm

3.RPM 包签名 RedHat 对于用 GPG 私钥发布的每个 RPM 包文件进行加密签名。通过加密校验签名用户

可以确保所获得的 RPM 文件没有被非法修改。rpm 命令在安装时会自动校验签名,如果不符

合签名,在安装过程中就会出现“warning:...NOKEY...”警告信息。

签名校验的安全性取决于公钥的完整性,可以通过三种文件获得 RedHat 的公钥:从

“ https://www.redat.com/security/team/key ”中下载公钥、从 RHEL 5.x 光盘根目录中

“RPM-GPG-KEY-REDHAT-RELEASE”文件中获得、从“/etc/pki/rpm-gpg/RPM-GPG-KEY-

redhat-release*”文件中获得。获得公钥后使用“--import”选项导入公钥。下面的命令就是从

RHEL 5.x 光盘中导入公钥,其中/mnt 是 RHEL 5.x 光盘挂载点。

[root@srv ~]# rpm --import /mnt/RPM-GPG-KEY-redhat-release

4.查询 RPM 包

rpm 命令提供了查询已安装或未安装 RPM 包信息的功能。校验主要使用“-q”选项,配

合以下几个选项进行。

(1)使用“rpm -q <软件名称>”的方式查询指定软件是否已安装。

查询 wget 是否安装,如果已经安装则会显示该软件包的版本信息。

[root@srv ~]# rpm -q wget wget-1.11.4-2.el5

查询 wget 是否安装,如果没有安装则会显示“package XXX is not installed”。

[root@srv ~]# rpm -q httpd package httpd is not installed

(2)使用“rpm -qa”的方式显示系统中已安装的所有软件包。

查询系统中已安装的所有软件包。

[root@srv ~]# rpm -qa tzdata-2009k-1.el5 nash-5.1.19.6-54 gnome-mime-data-2.4.2-3.1

使用“--last”选项后,会根据软件包安装到系统的时候显示。

[root@srv ~]# rpm -qa --last gpg-pubkey-37017186-45761324 Mon 22 Feb 2010 02:01:52 AM CST stardict-2.4.5-5 Fri 29 Jan 2010 07:31:14 PM CST fonts-chinese-3.02-12.el5 Fri 29 Jan 2010 07:31:02 PM CST

(3)使用“rpm -qi <软件名称>”的方式显示指定已安装软件包的详细信息,下面的例子

就是显示 tar 软件包的详细信息。

[root@srv ~]# rpm -qi tar Name : tar Relocations: (not relocatable) Version : 1.15.1 Vendor: Red Hat, Inc.

Linux 从初学到精通

242

Release : 23.0.1.el5 Build Date: Fri 17 Aug 2007 07:54:34 PM CST Install Date: Fri 29 Jan 2010 07:16:05 PM CST Build Host:

hs20-bc2-3.build.redhat.com Group : Applications/Archiving Source RPM: tar-1.15.1-23.0.1.el5.src.rpm Size : 1669541 License: GPL Signature : DSA/SHA1, Tue 21 Aug 2007 05:49:44 PM CST, Key ID 5326810137017186 Packager : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla> URL : http://www.gnu.org/software/tar/ Summary : A GNU file archiving program. Description : The GNU tar program saves many files together in one archive and can restore individual files (or all of the files) from that archive. Tar can also be used to add supplemental files to an archive and to update or list files in the archive. Tar includes multivolume support, automatic archive compression/decompression, the ability to perform remote archives, and the ability to perform incremental and full backups. If you want to us

(4)使用“rpm -ql <软件名称>”的方式显示指定已安装软件包所有文件及目录,下面的

例子就是显示 tar 软件包所有文件及目录。

[root@srv ~]# rpm -ql tar /bin/gtar /bin/tar /usr/share/doc/tar-1.15.1

(5)使用“rpm -qc <软件名称>”的方式显示指定已安装软件包配置文件信息。

[root@srv ~]# rpm -qc yum #显示 yum软件包配置文件信息。 /etc/logrotate.d/yum /etc/yum.conf

(6)使用“rpm -qd <软件名称>”的方式显示指定已安装软件包帮助文件信息,下面的

例子就是显示 yum 软件包帮助文件信息。

[root@srv ~]# rpm -qd yum /usr/share/doc/yum-3.2.22/AUTHORS /usr/share/doc/yum-3.2.22/COPYING /usr/share/doc/yum-3.2.22/ChangeLog /usr/share/doc/yum-3.2.22/INSTALL /usr/share/doc/yum-3.2.22/PLUGINS

(7)使用“rpm -qR <软件名称>”的方式显示指定已安装软件包的依赖关系,下面的例

子就是显示 tar 软件包的依赖关系。

[root@srv ~]# rpm -qR tar /bin/sh /bin/sh info libacl.so.1 libacl.so.1(ACL_1.0) libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1)

不只是下一步——Linux 软件安装及管理 第

243

8libc.so.6(GLIBC_2.1.1) libc.so.6(GLIBC_2.2) libc.so.6(GLIBC_2.2.3) libc.so.6(GLIBC_2.3) libc.so.6(GLIBC_2.3.4) libc.so.6(GLIBC_2.4) librt.so.1 librt.so.1(GLIBC_2.2) libselinux.so.1 rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rtld(GNU_HASH)

(8)使用“rpm -qf <文件>”的方式查询系统中指定文件是哪个软件包安装的,下面的例

子就是查询文件/etc/yum.conf 是由哪个软件包安装的。

[root@srv ~]# rpm -qf /etc/yum.conf yum-3.2.22-20.el5

在使用“-qi”、“-qc”、“-qd”、“-ql”、“-qR”选项时增加一个“p”选项可以指定一个 RPM

文件执行相同的查询功能。如下面的例子中就是查询“”RPM 文件在安装好后其帮助文件所

在的目录。

[root@srv mnt]# rpm -qdp Server/httpd-2.2.3-31.el5.i386.rpm /usr/share/doc/httpd-2.2.3/ABOUT_APACHE /usr/share/doc/httpd-2.2.3/CHANGES /usr/share/doc/httpd-2.2.3/LICENSE /usr/share/doc/httpd-2.2.3/NOTICE /usr/share/doc/httpd-2.2.3/README /usr/share/doc/httpd-2.2.3/VERSIONING /usr/share/doc/httpd-2.2.3/migration.css /usr/share/doc/httpd-2.2.3/migration.html /usr/share/man/man1/ab.1.gz

5.升级 RPM 包 在 rpm 命令中提供了“-U”和“-F”两个选项用于升级已经安装的软件包,其中使用“-U”

选项表示如果系统已安装指定的软件包则进行升级,如果系统中未安装指定的软件则进行安

装;使用“-F”选项表示如果系统已安装指定的软件包则进行升级,如果系统中未安装指定

的软件则不做任何处理。在使用“-U”或“-F”时还可能使用“-i”选项中提到的所有软件

包,下面的例子就是升级 telnet-server 软件包。

[root@srv ~]# rpm -Uvh telnet-server-0.17-42.fc9.i386.rpm warning: telnet-server-0.17-42.fc9.i386.rpm: Header V3 DSA signature: NOKEY, key ID 4f2a6fd2 Preparing... ######################################## [100%] 1:telnet-server ######################################## [100%]

6.卸载 RPM 包 使用“-e”选项可以卸载已经安装的 RPM 包,在指定要卸载的 RPM 包时只需要指定软

件名称,不需要软件的版本号等其他信息,下面的例子就是可以卸载 telnet-server 软件包。

[root@srv ~]# rpm -e telnet-server

Linux 从初学到精通

244

有时在删除一些软件包时,由于依赖关系原因无法删除,下面的例子就是由于依赖关系

无法删除 tar 软件包,当前使用“--nodeps”可以在不检查依赖的情况下删除软件包。

[root@srv ~]# rpm -e tar error: Failed dependencies: tar is needed by (installed) sos-1.7-9.27.el5.noarch tar is needed by (installed) mkinitrd-5.1.19.6-54.i386 /bin/tar is needed by (installed) redhat-lsb-3.1-12.3.EL.i386 [root@srv ~]# rpm -e --nodeps tar

8.2.3 维护 RPM 数据库

RPM 数据库是整个 RPM 包管理系统的核心,RPM 安装软件时会在数据库中记录软件安

装时创建的每个文件,在删除软件时会在这个数据库查找到该软件所有的文件并将其删除。

另外,数据库维护一个不同软件包的依赖关系,如果要安装的软件首先会在该数据库中查找

依赖关系是否已安装。RPM 数据库位于“/var/lib/rpm”目录中,一般用户并不需要访问该数

据库。如果这个数据库损坏时,可以使用“rpm --rebuilddb”或“rpm --initdb”使用重建或重

新生成该数据库。

RPM 数据库通常每次只允许一个待处理的事务,也就是说同时只有一个 rpm 命令在工

作。但在 RHEL 5.x 中这方面得到了改进,只要多个 rpm 命令在执行时,所读写的数据库内

容不一样还是可以同时操作的。不过有时 rpm 命令因为意外终止或其他一些原因并未告诉

RPM 数据库其操作已经结束,这时可能导致其他 rpm 命令无法执行,为了解决这个问题可以

重新启动计算机或使用以下两个步骤。

终止所有 rpm 命令。

[root@srv ~]# killall -9 rpm

删除所有__db*文件。

[root@srv ~]# rm -f /var/lib/rpm/__db*

YUM方式安装软件

在 Linux 系统中安装软件一直是一个比较麻烦的工作,RPM 方式的确可以从一定程度上

解决这个问题,但是 RPM 包一般都是将软件先编译(也有未经编译的 RPM 包)并且打包好,

通过打包的 RPM 包中默认有一个数据库记录,记录这个软件要安装的时候必须要依赖的其

他软件,当安装在 Linux 系统时,RPM 会先根据软件里记录的数据查询 Linux 系统中依赖的

其他软件是否满足,如果满足则安装,不满足则不安装。如果有过 RPM 安装经验,碰到这

样的问题时会比较麻烦。而YUM等一些RPM包管理方式的出现让RPM包的安装与Windows

平台软件安装几乎一样方便。本章主要介绍在 RHEL 5.x 中默认提供的 YUM 方式。

不只是下一步——Linux 软件安装及管理 第

245

8

YUM 是 Yellow dog Updater Modified 的缩写,是由 Duke University 所发起的计划,目的

就是解决 RPM 的依赖关系的问题,方便使用者进行软件的安装、升级等工作(YUM 只是为

了解决 RPM 的依赖关系的问题,而不是一种其他的软件安装模式)。YUM 的工作原理并不

复杂,每一个 RPM 软件的头里都会记录该软件的依赖关系,那么如果可以将该头的内容记

录下来并且进行分析,可以知道每个软件在安装之前需要额外安装哪些基础软件。也就是说,

在服务器上面先以分析工具将所有的 RPM 文件进行分析,然后将该分析记录下来,只要在

进行安装或升级时先查询该记录的文件,就可以知道所有相关联的软件。所以 YUM 的基本

工作流程如下。

(1)服务器端(YUM 源、YUM 仓库):在服务器上面存放了所有的 RPM 软件包,然后

通过命令分析每个 RPM 文件的依赖性关系,将这些数据记录成文件存放在服务器上(可通

过 HTTP、FTP 等方式)。

(2)客户端:如果需要安装某个软件时,通过 YUM 服务器上记录的依赖性关系文件,

下载依赖关系需要所有相关的软件,自动全部下载下来进行安装。

8.3.1 YUM 仓库配置

目前有很多企业或组织都在 Internet 上提供了 YUM 源,这样也大大方便了 Linux 下软件

的安装。但是如果企业中访问 Internet 的速度比较慢时,使用 Internet 上的 YUM 就比较麻烦,

这里可以自己在企业内部配置一个 YUM 仓库。

下面讲解三种配置 YUM 仓库的方法,实际上不管采用 FTP、HTTP、光盘或 ISO 文件方式,

这些都只是提供一个供 YUM 客户端下载 RPM 的地点。使用光盘或 ISO 文件作为 YUM 源一般

给本机使用,如果有多台主机需要使用 YUM 仓库时最好使用 FTP 或 HTTP 方式作为 YUM 源。

1.光盘作为 YUM 源 在 RHEL 5.x 光盘默认就可以作为一个 YUM 源,Red Hat 在制作光盘时,默认已将 YUM

仓库需要的所有配置完成,所有如果使用 RHEL 5.x 光盘作为 YUM 源,只需要将光盘挂载到

一个目录即可。

2.ISO 文件作为 YUM 源 如果不希望总是将RHEL 5.x光盘放在光驱中,可以使用以下方式将RHEL 5.x光盘的 ISO

镜像文件挂载到一个目录即可。

[root@srv ~]# mount -o loop rhel.iso /mnt/cdrom

3.FTP 服务器作为 YUM 源

下面以使用 FTP 方式将 RHEL 5.x 光盘中默认提供的 RPM 包制作为一个 YUM 仓库。

(1)安装并配置 vsftpd(具体见第 14 章 )。

(2)使用如下命令安装 createrepo,该软件包用于生成 RPM 依赖关系及分组信息。在使

用不同版本 RHEL 时,createrepo 的版本可能会有小的区别,但并不影响其后的配置;“/mnt”

目录是 RHEL 5.x 光盘的挂载点。

[root@srv ~]# rpm -ivh /mnt/Server/createrepo-0.4.11-3.el5.noarch.rpm

Linux 从初学到精通

246

(3)将 RHEL 5.x 光盘中部分内容使用如下命令复制到/var/ftp/pub 目录下(如果不使用

虚拟化可不复制 VT,如果不使用群集可不复制 Cluster、ClusterStorage)。

[root@srv ~]# cp -rv Server /var/ftp/pub [root@srv ~]# cp -rv VT /var/ftp/pub [root@srv ~]# cp -rv Cluster /var/ftp/pub [root@srv ~]# cp -rv ClusterStorage /var/ftp/pub

(4)生成 RPM 包依赖关系。在 Server、VT、Cluster、ClusterStorage 目录下,都有一个名为

的 repodata 目录,在该目录有一个名为 repomd.xml 的文件,该文件中就记录了所在目录所有 RPM

包的依赖关系,还有一个 comps-rhel5-*.xml 文件,该文件主要记录分组信息,分组信息可以使

用户更方便地安装一组相关的软件(在 GNOME 中使用“Add/RemoveSoftware”就是以分组方

式显示的 RPM 包信息如图 8-1 所示)。该文件不能删除,因为分组信息是 Red Hat 定义的,在

RPM 包中并没有记录。在生成依赖关系可以直接使用 createrepo /var/ftp/pub/Server 即可,而使用

下述命令使用-g 选项主要有两个作用:一是生成依赖关系,二是可以更新分组文件信息。

图 8-1 分组信息

[root@srv ~]# createrepo -g /var/ftp/pub/Server/repodata/comp5-rhel5-server-core.xml \ /var/ftp/pub/Server [root@srv ~]# createrepo -g /var/ftp/pub/VT/repodata/comp5-rhel5-vt.xml /var/ftp/pub/VT [root@srv ~]# createrepo -g /var/ftp/pub/Cluster/repodata/comp5-rhel5-cluster.xml \ /var/ftp/pub/Cluster [root@srv ~]# createrepo -g /var/ftp/pub/ClusterStorage/repodata/comp5-rhel5-cluster-st.xml \ /var/ftp/pub/ClusterStorage

在 RHEL 5.x 中 GNOME 中的“Add/RemoveSoftware”功能必须在配置好 YUM 之后

才可以使用。

8.3.2 YUM 客户端配置

YUM 仓库配置完成后,需要配置 YUM 客户端才可以在 YUM 客户端使用 YUM 方式安

装 RPM 软件包。YUM 客户端可以和 YUM 仓库在同一台主机,也可以是任何能通过网络访

问到 YUM 仓库的主机。

提 示

不只是下一步——Linux 软件安装及管理 第

247

8

在 RHEL 5.x 中 YUM 客户端的配置文件是/etc/yum.repos.d/*.repo 文件,*.repo 文件可以

有多个,也就是说一个 YUM 客户端可以同时使用多个 YUM 仓库中的 YUM 源。在

/etc/yum.repos.d 目录已有一个 RHN 作为源的配置文件,在配置 YUM 客户端可直接将其复制

一份修改其内容即可,具体操作步骤如下。

复制原有的 YUM 客户端的配置文件。

[root@srv ~]# cp /etc/yum.repos.d/rhel-debuginfo.repo /etc/yum.repos.d/my.repo

修改 my.repo 文件配置自己的 YUM 仓库信息,内容如下。

[root@srv ~]# cat /etc/yum/repos.d/my.repo [ftp] ① name=FTPServer ② baseurl=ftp://192.168.159.3/pub/VT ③ enabled=1 ④ gpgcheck=1 ⑤ gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release ⑥ [cdrom] ⑦ name=cdrom baseurl=file:///mnt/Server ⑧ enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

在该配置文件中各行参数作用如下:

①:指定 YUM 源的标签,这个标签只要在本机定义的所有 YUM 源中不重复即可。

②:指定 YUM 源的名称,这个名称主要是用于 YUM 客户端在查看可用 RPM 包的一个

分类信息,只要在本机定义的所有 YUM 源中不重复即可。

③:指定 YUM 源,这里定义的 YUM 源是 ftp://192.168.159.3/pub/VT,也可以根据 YUM

仓库的配置指定为其他方式。

④:当 enabled=1 时该 YUM 源可用,当 enabled=0 时该 YUM 源不可用。

⑤:当 gpgcheck =1 时进行数字签名检查,没有数字签名不允许安装,当 gpgcheck=0 时

不进行数字签名检查。

⑥:指定 Red Hat 发行版数字签名公钥文件。

⑦:指定第二个 YUM 源。

⑧:指定 YUM 仓库在本机的“/mnt/Server”目录中。

8.3.3 YUM 客户端使用

在 YUM 客户端配置完成后可通过 yum 命令进行相关操作。该命令语法如下。

yum [-y] install|update|check-update|info|groupinfo|list|grouplist|search|clean all|localinstall|groupinstall|remove|groupremove [软件名称]

常用指数:

常用选项:

Linux 从初学到精通

248

-y:不需要用户确认要发生的操作。

install <软件名称>:安装指定的软件包。

update:升级所有已安装软件。

update <软件名称>:升级指定的软件包。

check-update:检查是否有需要升级的软件。

info <软件名称>:显示指定的软件包相关信息。

info updates:显示所有可以更新的软件包的信息。

info installed:显示所有已经安装的软件包的信息。

groupinfo <分组名称>:显示指定的分组信息。

list:显示所有已经安装和可以安装的软件。

list <软件名称>:显示指定的软件包安装情况。

list installed:显示已经安装的软件包。

grouplist:显示所有 YUM 服务器定义的分组。

search <关键字>:在 YUM 源中查找指定关键字。

clean packages:清除缓存中 RPM 包文件。

clearn headers:清除缓存中 RPM 头文件。

clean all:清除所有 YUM 缓存。

localinstall <RPM 包文件>:使用 YUM 方式安装本地 RPM 包。

groupinstall <分组名称>:安装指定的分组所有软件。

remove <软件名称>:删除指定的软件包。

groupremove packagegroup <分组名称>:删除指定的分组所有软件。

install 和 localinstall 的区别:使用 install 时,指定的软件包将从 YUM 服务器下载并安装,

而 localinstall 指定的软件使用 RPM 包安装,而依赖关系所需的包在 YUM 服务器下载安装。

下面看几个 yum 命令的例子。

显示名为“gcc-c++”的软件包情况。

[root@srv ~]# yum info gcc-c++ Loaded plugins: rhnplugin, security Repository rhel-debuginfo is listed more than once in the configuration This system is not registered with RHN. RHN support will be disabled. Available Packages Name : gcc-c++ Arch : i386 Version : 4.1.2 Release : 46.el5 Size : 3.4 M Repo : cdrom Summary : C++ support for GCC URL : http://gcc.gnu.org License : GPL Description: This package adds C++ support to the GNU Compiler Collection. : It includes support for most of the current C++ specification,

不只是下一步——Linux 软件安装及管理 第

249

8 : including templates and exception handling.

安装名为“gcc-c++”的软件包,在安装时 yum 会自动将所有依赖软件包一起安装。

[root@srv ~]# yum -y install gcc-c++

源码包方式安装软件

在 Linux 平台使用源码包的方式安装软件是最灵活的一种方式,很多 Linux 下运行的开

源软件其官方网站上提供的都是源码包。使用源码包安装不但可以指定其执行文件、配置文

件、帮助文件、库文件的存放目录,还可以指定开启或关闭软件的部分功能。下面介绍两种

在 Linux 平台比较常见的源码包的安装方式 RPMs 包和 tar 包。

无论使用这两种方式的哪一种都需要安装支持 C/C++程序语言的编译器及其他一些软件

包,这些软件包的依赖关系都比较多,推荐使用 YUM 方式安装。具体操作步骤如下。

[root@srv ~]# yum -y install gcc-c++ automake autoconf [root@srv ~]# yum -y install rpm-build #如果是编译 RPMs包还需要安装这个软件包。

8.4.1 编译 RPMs 包

在 8.2 中讲到的 RPM 包是已经将源码编译为二进制文件的形式,RPM 包还有一种被称

为 RPMs 的类型,这样的 RPM 包名称一般为“*.src.rpm”。RPMs 包虽然提供的是源码,但

是 RPMs 包中仍然包括该软件所需要的依赖关系说明、以及所有 RPM 包中所提供的其他数

据,同时 RPMs 与 RPM 不同的是,RPMs 也提供了编译选项可以根据需要开启或关闭软件的

部分功能。编译和安装 RPMs 包是需要一系列的操作才能完成,下面通过编译

tar-1.20-6.fc10.src.rpm 包来讲述 RPMs 包的编译安装过程。

(1)下载“tar-1.20-6.fc10.src.rpm”软件包。

(2)使用 rpm 命令安装该软件包。

[root@srv ~]# rpm -ivh tar-1.20-6.fc10.src.rpm

(3)安装完成后进入“/usr/src/redhat/SPECS”目录,在该目录是会有一个与软件名称相

同的 spac 文件,如本章中安装的是 tar,那么在该目录中就会有一个“tar.spac”文件。使用

“rpmbuild -bb”命令编译 RPMs 包,具体操作步骤如下。

进入/usr/src/redhat/SPECS 目录。

[root@srv ~]# cd /usr/src/redhat/SPECS [root@srv SPECS]# ll total 16 -rw-r--r-- 1 root root 15673 Jul 10 2009 tar.spec

进行编译,但由于缺少依赖关系无法完成编译。

Linux 从初学到精通

250

[root@srv SPECS]# rpmbuild -bb tar.spec error: Failed build dependencies: texinfo is needed by tar-1.20-6.i386 libacl-devel is needed by tar-1.20-6.i386 libselinux-devel is needed by tar-1.20-6.i386

为了可以编译 tar,必须先将这些需要的软件包安装。

[root@srv SPECS]# yum -y install texinfo libacl-devel libselinux-devel

再次编译软件包。

[root@srv SPECS]# rpmbuild -bb tar.spec

(4)编译完成后,在“/usr/src/redhat/RPMS/i386”(根据具体软件包的硬件平台不同,也

可能是 i686、noarch 目录)目录下,有一个新的 rpm 包,这个是编译好的二进制文件。直接

使用“rpm -ivh”命令安装该软件包,具体操作步骤如下。

由于 tar 软件包在系统上已经安装,所以这里要先卸载。

[root@srv i386]# rpm -e --nodeps tar

进入目录/usr/src/redhat/RPMS/i386 后,安装软件包。

[root@srv SPECS]# cd /usr/src/redhat/RPMS/i386 [root@srv i386]# ll total 960 -rw-r--r-- 1 root root 976059 Feb 22 16:04 tar-1.20-6.i386.rpm [root@srv i386]# rpm -ivh tar-1.20-6.i386.rpm

8.4.2 编译 tar 包

不是所有的 Linux 发行版都支持 RPM 包的安装方式,因此很多软件的源码包都采用 tar

包的形式,也是将源码使用 tar 命令打包过的。比较常见的包括:“*.tar”只使用 tar 命令打包

的源码包;“*.tar.gz”、“*.tgz”使用 tar 命令打包同时使用了 gzip 方式压缩的源码包;“*.tar.bz2”

使用 tar 命令打包同时使用了 bzip2 方式压缩的源码包。

获取软件的源码包可以到软件的官方网站下载,也可以到一些专门提供源码包下载的网

站,如 http://sourceforge.net。得到源码包后一般的编译过程是:使用中 4.5.3 讲述的 tar 命令

将其解压后;使用“./configure”脚本针对当前系统、软件环境,配置好安装选项;使用“make”

命令将源代码文件编译为二进制的可执行程序;最后使用“make install”命令安装软件。下

面通过编译 tar 1.22 的源码包来讲述源码包的编译安装过程。

(1)下载 tar 1.22 的源码包。

[root@srv ~]# wget ftp://ftp.ntu.edu.tw/pub/gnu/gnu/tar/tar-1.22.tar.bz2

(2)解压 tar 1.22 的源码包。从源码包的名称可以发现该源码包使用 tar 命令打包同时使

用了 bzip2 方式压缩,因此解压时应该使用选项“j”。

[root@srv ~]# tar -xjvf tar-1.22.tar.bz2

(3)通过 YUM 方式安装 tar 所需的软件包。这里是通过 8.4.1 得知要安装这几个软件包,

不只是下一步——Linux 软件安装及管理 第

251

8

如果是编译其他软件包时,在使用“./configure”检查编译环境时会提示系统中缺的软件包。

[root@srv ~]# yum -y install texinfo libacl-devel libselinux-devel

(4)通过“./configure”检查编译环境,该文件是一个脚本,一般在以源码包运行的软件

中都会包括,这个脚本会显示系统是否满足安装源码包的要求,同时可以通过该脚本定制软

件的各种选项,如一般可以通过“--prefix”指定软件包的安装路径等。每个软件源码包提供

的选项都不太相同,不过可以使用“./configure --help”查看软件所提供的安装选项。

[root@srv ~]# cd tar-1.22 [root@srv tar-1.22]# ./configure

(5)通过“make”命令编译源码包并使用“make install”命令安装软件。

[root@srv tar-1.22]# make [root@srv tar-1.22]# make install

(6)大多数使用源码安装的软件在不指定安装路径时,默认会安装到“/usr/local”目录

中,如 tar 编译安装后就会将执行文件放到“/usr/local”目录中。

[root@srv tar-1.22]# cd /usr/local/bin/ [root@srv bin]# ./tar --version tar (GNU tar) 1.22 Copyright (C) 2009 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

Written by John Gilmore and Jay Fenlason.

实验任务

在一台安装了 RHEL 5.x 的计算机上完成以下任务。

(1)使用 rpm 命令安装 telnet-server 软件包。

(2)将 RHEL 5.x 的光盘配置为一个 YUM 仓库。

(3)安装 C/C++程序语言的编译器。

(4)查询 gcc-c++软件包的信息。

(5)查询 sendmail 服务安装所发生过改变的文件。

(6)下载并编译安装 telnet-server 最新版本。

Linux 从初学到精通

252

本章测试

(1)在使用源码包编译软件的操作中,“./configure”检查编译时一般可以使用( )

指定软件的安装路径。

A.--prefix B.--path

C.--setuppath D.--setupprefix

(2)RHEL 5.x 支持( )软件包的安装。

A.rpm B.wim

C.deb D.cab

(3)在 RHEL 5.x 中一般软件的配置文件位于( )目录。

A./usr/src B./var

C./etc/ D./usr/local

(4)在 rpm 命令中,( )选项用于安装 RPM 包。

A.-i B.--install

C.-s D.--setup

(5)安装 RPMs 包后,( )是 RHEL 5.x 中默认的源码目录。

A./usr/src B./usr/src/rhel/SPECS

C./usr/src/redhat/SPECS D./usr/rhel

(6)( )不能用于配置一个 YUM 仓库。

A.FTP B.Mail

C.HTTP D.Samba

(7)使用( )可以显示已安装 RPM 包在安装后被改动的文件。

A.rpm -V B.rpm -Vq

C.rpm -Va D.rpm -Vi

(8)以下软件包中( )不是源码包。

A.RPM 包 B.RPMs 包

C.tar.gz D.tar.bz2

(9)在 rpm 命令中使用( )选项表示如果系统已安装指定的软件包则进行升级。

A.-U B.--force

C.-F D.-Ui

(10)使用( )可以导入 redhat 公钥。

A.rpm --import B.rpm --pki

C.rpm -pgp D.rpm -gpg

在类 UNIX 系统中,Shell 是 常使用的程序。Shell 是用户登录或

打开终端时所看到的东西,也是用户启动几乎所有命令所用的东西。虽

然 Shell 的种类繁多,但提供的功能基本相同:侦听用户指令、启动这

些命令所指定的进程、并将结果反馈给用户,如图 9-1 所示。

图 9-1 Shell

Shell 也是类 UNIX 系统 重要的软件之一,Shell 提供了用户与操

作系统之间通信的方式。这种通信可以交互方式,也可以 Shell 脚本(非

交互)方式执行。Shell 脚本是存放在文件中的一串 Shell 和操作系统命

令,Shell 脚本可以被重复使用。

第9章

事半功倍︱︱S

hell

脚本

Linux 从初学到精通

254

Shell 等待用户输入,并且执行用户提交的命令。这种模式被称为交互式。这种模式也是

大多数用户非常熟悉的各种命令。当命令执行完成后,Shell 就终止。Shell 也可以运行在另

外一种模式:非交互式模式,在这种模式下,Shell 不与用户进行交互,而是读取存放在文件

中的语句,并且执行这些语句。当读到文件的结束,Shell 也就终止。

常见的 Shell

Linux 提供几种 Shell 程序以供用户选择,常用的有 Bourne(bsh)、C(csh)和 Korn(ksh)。

各个 Shell 都能提供基本的功能,又有其各自的特点。

(1)Bourne Shell 是由 Steven Bourne 编写的,是 UNIX 的默认的 Shell。Bourne Shell

的 Shell 编程能力很强,但不能处理基于命令的用户交互模式。bash Shell 是 Bourne Shell

的增强版。

(2)C shell 是由加利福尼亚大学伯克利分校的 Bill Joy 编写,能提供 Bourne Shell 所不能

处理的用户交互模式,如命令补全、命令别名、历史命令替换等。C Shell 的编程能力不如

Bourne Shell,但其语法和 C 语言类似,所以 C 程序员将发现 C Shell 很顺手。

(3)Korn Shell 是由 Dave Korn 编写的。Korn Shell 融合了 C Shell 和 Bourne Shell 的优

点,并和 Bourne Shell 完全兼容。Korn Shell 的效率很高,其命令交互界面和编程交互界面都

很不错。

bash Shell

bash Shell 是一个为 GNU 项目编写的 Shell。bash Shell 是“Bourne-Again Shell”的缩写,

1987 年由 Brian Fox 开发,在 1990 年 Chet Ramey 成为了主要的维护者。

bash Shell 是大多数 Linux 系统默认的 Shell,bash Shell 能运行于大多数类 UNIX 的操作

系统上,bash Shell 的一些特点,如 Tab 键自动补齐、命令历史在前面的章节中已经介绍过了,

下面是 bash Shell 其他的一些特点。

9.2.1 命令列表

在前面的章节中,每次执行命令时都是输入一个命令后按回车键执行,再输入第二个命

令执行。在 bash Shell 中支持在交互模式中一次提交多个命令执行。可以使用以下三种方法

实现这样的功能。

1.使用分号隔开 在 bash Shell 使用;(分号)隔开多个独立的语句,这样可以一次提交多个语句执行。在

下面的例子中使用分号后,bash Shell 会先执行“cd /boot”命令,再执行“ll”命令。

事半功倍——Shell 脚本 第

255

9[root@srv ~]# cd /boot;ll total 5541 -rw-r--r-- 1 root root 68663 Aug 19 2009 config-2.6.18-164.el5 drwxr-xr-x 2 root root 1024 Jan 29 19:31 grub -rw------- 1 root root 2636467 Jan 29 19:46 initrd-2.6.18-164.el5.img drwx------ 2 root root 12288 Jan 29 19:09 lost+found -rw-r--r-- 1 root root 107405 Aug 19 2009 symvers-2.6.18-164.el5.gz -rw-r--r-- 1 root root 954947 Aug 19 2009 System.map-2.6.18-164.el5 -rw-r--r-- 1 root root 1855956 Aug 19 2009 vmlinuz-2.6.18-164.el5 [root@srv boot]# pwd /boot

使用分号时 bash Shell 不管前面一个命令是否成功执行,都会执行后面的命令。如在下

面的使用中“cd /bot”命令无法执行,后面的“ll”命令还是会执行。

[root@srv ~]# pwd /root [root@srv ~]# cd /bot;ll -bash: cd: /bot: No such file or directory total 60 -rw------- 1 root root 1304 Jan 29 19:31 anaconda-ks.cfg drwxr-xr-x 2 root root 4096 Jan 29 19:40 Desktop -rw-r--r-- 1 root root 30146 Jan 29 19:31 install.log -rw-r--r-- 1 root root 3738 Jan 29 19:30 install.log.syslog drwxr-xr-x 7 root root 4096 Oct 22 15:30 vmware-tools-distrib [root@srv ~]# pwd /root

2.使用&&条件隔开 使用&&隔开多个命令时,只有当前一个命令成功执行后,bash Shell 才会去执行后一个

命令。在下面的例子中只有在“service atd restart”命令执行成功后,才会执行“chkconfig atd

on”命令。

[root@srv ~]# service atd restart && chkconfig atd on Stopping atd: [ OK ] Starting atd: [ OK ]

在下面的例子中由于“service adt restart”命令执行不成功,所以不会执行“chkconfig adt

on”命令。

[root@srv ~]# service adt restart && chkconfig adt on adt: unrecognized service

3.使用||条件隔开 使用||隔开多个命令时,只有当前一个命令不成功执行后,bash Shell 才会去执行后一个

命令。在下面的例子中只有在“cd /bot”执行失败后,才会执行“mkdir /bot”命令。

[root@srv ~]# cd /bot || mkdir /bot

9.2.2 在子 Shell 中运行命令

bash Shell 中可以将命令放在括号里,这表示用户在子 Shell 中执行命令。在下面的例子

中当命令使用带括号的方式执行时,Shell 的当前目录没有发生变化。这是因为使用括号后

Linux 从初学到精通

256

Shell 会生成一个全新的子 Shell 进程并在子 Shell 中执行命令。命令执行完毕后子 Shell 退出,

不会影响到用户当前 Shell 的环境。子 Shell 的好处就在于不会影响父 Shell 的环境避免命令

执行后的一些副作用。

[root@srv ~]# pwd /root [root@srv ~]# (cd /boot; ll) total 5541 -rw-r--r-- 1 root root 68663 Aug 19 2009 config-2.6.18-164.el5 drwxr-xr-x 2 root root 1024 Jan 29 19:31 grub -rw------- 1 root root 2636467 Jan 29 19:46 initrd-2.6.18-164.el5.img drwx------ 2 root root 12288 Jan 29 19:09 lost+found -rw-r--r-- 1 root root 107405 Aug 19 2009 symvers-2.6.18-164.el5.gz -rw-r--r-- 1 root root 954947 Aug 19 2009 System.map-2.6.18-164.el5 -rw-r--r-- 1 root root 1855956 Aug 19 2009 vmlinuz-2.6.18-164.el5 [root@srv ~]# pwd /root

9.2.3 命令别名

别名允许自定义命令名,或者把命令和常用的参数或选项结合在一起。一旦创建,别名

就可以像其他任何命令一样被使用。别名使用 alias 命令定义,其定义格式如下。

alias [别名=命令]

在使用 alias 命令时如果不带使用选项,则会显示当前已经定义的别名,下面看几个 alias

命令的例子。

为 head 命令定义一个名为 h 的别名。

[root@srv ~]# alias h=head

定义后使用 h 命令时,Shell 会执行 head 命令。

[root@srv ~]# h /var/log/messages Jan 29 19:36:05 srv syslogd 1.4.1: restart. Jan 29 19:36:05 srv kernel: klogd 1.4.1, log source = /proc/kmsg started. Jan 29 19:36:05 srv kernel: Linux version 2.6.18-164.el5

([email protected]) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)) #1 SMP Tue Aug 18 15:51:54 EDT 2009

Jan 29 19:36:05 srv kernel: BIOS-provided physical RAM map: Jan 29 19:36:05 srv kernel: BIOS-e820: 0000000000010000 - 000000000009f800 Jan 29 19:36:05 srv kernel: BIOS-e820: 000000000009f800 - 00000000000a0000 Jan 29 19:36:05 srv kernel: BIOS-e820: 00000000000ca000 - 00000000000cc000 Jan 29 19:36:05 srv kernel: BIOS-e820: 00000000000dc000 - 00000000000e4000 Jan 29 19:36:05 srv kernel: BIOS-e820: 00000000000e8000 - 0000000000100000 Jan 29 19:36:05 srv kernel: BIOS-e820: 0000000000100000 - 000000001fef0000

定义带选项的别名时,需要使用双引号。

[root@srv35 ~]# alias h3="head -3" [root@srv35 ~]# h3 /var/log/messages Jan 29 19:36:05 srv syslogd 1.4.1: restart. Jan 29 19:36:05 srv kernel: klogd 1.4.1, log source = /proc/kmsg started.

事半功倍——Shell 脚本 第

257

9Jan 29 19:36:05 srv kernel: Linux version 2.6.18-164.el5

([email protected]) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)) #1 SMP Tue Aug 18 15:51:54 EDT 2009

定义的别名也可以和原命令使用相同名称。

[root@srv ~]# alias ps="ps -aux"

查看已经定义的别名。

[root@srv ~]# alias alias cp='cp -i' alias h3='head -3' alias l.='ls -d .* --color=tty' alias ll='ls -l --color=tty' alias ls='ls --color=tty' alias mv='mv -i' alias ps='ps -aux' alias rm='rm -i' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

使用 unalias 命令可以取消已定义的别名。

[root@srv ~]# unalias h

9.2.4 命令替换

bash Shell 在执行命令前会对命令进行一些替换,也就是说如果在命令中包括一些特殊字

符时,bash Shell 会认为其代表一些特定的含义。有几种类型的替换在前面的章节中已经讲述

过,如“~”表示当前用户家目录这样的被称为路径替换;“!”可以执行历史命令这样的被称

为历史替换,下面将讲述 bash Shell 中其他几种常见的命令替换。

1.大括号替换 大括号替换可以把一个字符串展开为多个字符串,循环替换大括号中的内容。如 sdb{5,6,7}

会被替换为 sdb5、sdb6、sdb7 三个单词。这样的替换方式经常用于引用文件名、目录名、设

备名,这些文件、目录、设备都有共同的前缀、后缀。下面看几个使用大括号的例子。

使用 sdc5、sdc6、sdc7、sdc8 创建一个由三个分区和一个热备分区组成的 RAID 阵

列。

[root@srv ~]# mdadm -C /dev/md0 -a yes -l 5 -n 3 -x 1 /dev/sdc{5,6,7,8} mdadm: array /dev/md0 started.

在当前目录下建立一个名为 24 的目录,并在该目录下建立名称分别为

Season1~Season8 的目录。

[root@srv ~]# mkdir -p 24/Season{1,2,3,4,5,6,7,8} [root@srv ~]# ll 24 total 32 drwxr-xr-x 2 root root 4096 Mar 8 20:03 Season1 drwxr-xr-x 2 root root 4096 Mar 8 20:03 Season2 drwxr-xr-x 2 root root 4096 Mar 8 20:03 Season3 drwxr-xr-x 2 root root 4096 Mar 8 20:03 Season4

Linux 从初学到精通

258

drwxr-xr-x 2 root root 4096 Mar 8 20:03 Season5 drwxr-xr-x 2 root root 4096 Mar 8 20:03 Season6 drwxr-xr-x 2 root root 4096 Mar 8 20:03 Season7 drwxr-xr-x 2 root root 4096 Mar 8 20:03 Season8

2.变量替换 bash Shell 会把“$变量名”或“$(变量名)”格式的表示式替换为 Shell 变量或环境变量。

3.算术替换 bash Shell 可以对“$((…))”内的内容进行整数运算。

[root@srv ~]# PRICE=10 [root@srv ~]# NUMBER=15 [root@srv ~]# echo $(( $PRICE * NUMBER )) 150

4.命令替换 用户可以通过命令替换在子 Shell 中运行任意的命令,并把结果合并在命令行中。在 bash

Shell 中可以通过“$(子 Shell 命令)”实现命令替换。在下面的例子中将在子 Shell 中执行“date

+%d%b%y”命令,并将结果返回当前 Shell。

[root@srv ~]# mkdir reports.$(date +%d%b%y) [root@srv ~]# ll total 96 -rw------- 1 root root 1304 Jan 29 19:31 anaconda-ks.cfg drwxr-xr-x 2 root root 4096 Jan 29 19:40 Desktop -rw-r--r-- 1 root root 30146 Jan 29 19:31 install.log -rw-r--r-- 1 root root 3738 Jan 29 19:30 install.log.syslog drwxr-xr-x 2 root root 4096 Mar 8 20:23 reports.08Mar10

9.2.5 转义字符

bash Shell 中可以使用很多特殊的字符来执行很多不同类型的操作,如替换、重定向等。

这些特殊字符在功能中满足了用户的需求,然而有时间用户只想使用这些字符本身的意义,

而不是其特殊的含义,如用户就是希望使用“~”,但当用户在路径中使用时,bash Shell 会认

为该字符代表当前用户的家目录。bash Shell 提供了三种方法对这些特殊字符进行转义。\可

以避免下一个字符被 bash Shell 解释;"…"避免双引号内除了$、!、`字符以外的其他字符被

bash Shell 解释;’…’避免单引号内的字符被 bash Shell 解释。

在不进行转义时,~被认为是当前用户的家目录,所以 bash Shell 在执行以下命令报

错提示/root 目录已经存在。

[root@srv ~]# mkdir ~ mkdir: cannot create directory `/root': File exists

使用转义符后,就可以建立一个名为~的目录。

[root@srv ~]# mkdir \~

事半功倍——Shell 脚本 第

259

9

9.2.6 标准输入/输出及管道

在 Linux 系统中,通常把程序分为三类:

(1)图形程序:图形程序是为在图形环境运行设计的,这种程序希望用户使用鼠标,并

且使用常用的图形组件,比如弹出窗口和按键作为用户输入。

(2)屏幕程序:基于屏幕的程序使用文本控制台,这种程序利用整个屏幕处理文本定位

和屏幕刷新,不需要使用鼠标,因此也适用于终端和虚拟控制台,如 vi 就属于这类程序。

(3)终端程序:终端程序以流的形式聚集输入和显示输入,很少刷新屏幕,终端程序以

其简明的特点经常被称为命令。

在本书中学习的大多数都是命令,也就是终端程序。终端程序一般从一个单一源以流的

形式读取信息,如键盘。同样也会把流写入单一目的地,如显示器。在 Linux 系统中,输入

流被称做标准输入(STDIN,文件编号 0);输出流有二种,标准输出(STDOUT,文件编号

1)、标准错误(STDERR,文件编号 2),标准输出是终端程序执行后输出的正确结果,比如

执行 ls 命令时,显示当前目录的内容就属于标准输出,标准错误通常用于显示终端程序执行

的错误信息。

标准输入和标准输出一般与运行命令的终端相连,有时为了自动执行一些命令或将命令

输出的信息包含在报告或邮件中,bash Shell 也可以通过系统的重定向命令改变标准输入、标

准输出的默认设备。

1.标准输出重定向 当终于程序生成输出时,一般会将输出写入其标准输出流中,但并不关心与流的接收端

相连的是什么设备。标准输出流通常与启动这个进程的终端相连,因此输出被写入终端的显

示器中。bash Shell 可以使用以下两种方式将命令标准输出的途径由默认的显示器改为指定的

文件。

(1)使用“>”将输出写入文件,如果指定的文件已存在将会删除文件中原有的内容。

在下面的例子中将“ls /boot/”命令的输出内容写入文件 boot.txt 中。

[root@srv ~]# ls /boot/ > boot.txt [root@srv ~]# cat boot.txt config-2.6.18-164.el5 grub initrd-2.6.18-164.el5.img lost+found symvers-2.6.18-164.el5.gz System.map-2.6.18-164.el5 vmlinuz-2.6.18-164.el5

(2)使用“>>”将输出追加到文件,如果指定的文件已存在将会把输出附加到文件中。

在下面的例子中将标准输出追加到文件 boot.txt 中。

[root@srv ~]# cat boot.txt config-2.6.18-164.el5 grub initrd-2.6.18-164.el5.img lost+found

Linux 从初学到精通

260

symvers-2.6.18-164.el5.gz System.map-2.6.18-164.el5 vmlinuz-2.6.18-164.el5 [root@srv ~]# ls /boot/grub/ >> boot.txt [root@srv ~]# cat boot.txt config-2.6.18-164.el5 grub initrd-2.6.18-164.el5.img lost+found symvers-2.6.18-164.el5.gz System.map-2.6.18-164.el5 vmlinuz-2.6.18-164.el5 device.map e2fs_stage1_5 fat_stage1_5 ffs_stage1_5 grub.conf iso9660_stage1_5 jfs_stage1_5 menu.lst minix_stage1_5 reiserfs_stage1_5 splash.xpm.gz stage1 stage2 ufs2_stage1_5 vstafs_stage1_5 xfs_stage1_5

2.标准错误重定向 bash Shell 可以使用以下两种方式将命令标准输出的途径由默认的显示器改为指定的文

件。

(1)使用“2>”将输出写入文件,如果指定的文件已存在将会删除文件中原有的内容。

在下面的例子中将错误重定向到文件 err.txt 中。

[root@srv ~]# ll /bot ls: /bot: No such file or directory [root@srv ~]# ll /bot 2> err.txt [root@srv ~]# cat err.txt ls: /bot: No such file or directory

(2)使用“2>>”将输出追加到文件,如果指定的文件已存在将会把输出附加到文件中。

在下面的例子中将标准错误追加到文件 boot.txt 中。

[root@srv ~]# cat err.txt ls: /bot: No such file or directory [root@srv ~]# mkdir /bot/abc mkdir: cannot create directory `/bot/abc': No such file or directory [root@srv ~]# mkdir /bot/abc 2>> err.txt [root@srv ~]# cat err.txt ls: /bot: No such file or directory mkdir: cannot create directory `/bot/abc': No such file or directory

事半功倍——Shell 脚本 第

261

93.标准输入重定向 bash Shell 可以使用“<”将命令中接收标准输入的途径由默认的键盘改为指定的文件。

使用如下方式可以将输入的内容保存到文件 ctu.txt 中。

[root@srv ~]# cat > ctu.txt Counter Terrorist Unit [root@srv ~]# cat ctu.txt Counter Terrorist Unit

使用输入重定向将原来需要输入的内容改为从 ctu.txt 文件中获取。

[root@srv ~]# cat > dod.txt < ctu.txt [root@srv ~]# cat dod.txt Counter Terrorist Unit

标准输入、标准输出、标准错误的重定向既可以单独使用,也可以组合在一起使用。下

面看几个例子。

将正确的输出内容写入 testok.txt,将错误的内容写入 testerr.txt。

[root@srv ~]# ll /etc >testok.txt 2>testerr.txt

将正确的输出内容写入 testok.txt,将错误的内容写入黑洞。

[root@srv ~]# ll > testok.txt 2>/dev/null

将错误导入标准输出并写到 test.txt。

[root@srv ~]# ll >test.txt 2>&1

将正确及错误的输出内容写到 test.txt。

[root@srv ~]# ll &> test.txt

4.管道

在 Linux 中不但可以实现将输出的内容可以被重定向到终端显示器以外的地方或让终端

从键盘以外的地方读取输入,还可以将二者结合起来,在这就是 bash Shell 中的管道(Pipe)

功能。管道功能只需在前一个命令和后一个命令中间使用“|”分隔,这样前一个命令的输出

就会成为后一个命令的输入。管道是一个非常有用的功能,Linux 中有很多命令会输出大量

的信息,为了方便阅读就可以通过管道对显示的内容过滤。

netstat 命令的输出结果被作为 grep 命令的输入内容,这样就可以过滤出指定的服务。

[root@srv ~]# netstat -tunlp | grep httpd tcp 0 0 :::80 :::* LISTEN 4416/httpd [root@srv ~]# chkconfig --list | grep atd atd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

Linux 从初学到精通

262

使用管道可以对一个需要显示的内容进行多次过滤,在下面的例子中第一个 grep 命

令过滤了所有以“#”开头的行;第二个 grep 命令过滤了所有的空行。

[root@srv ~]# grep -v ^# /boot/grub/grub.conf | grep -v ^$

default=0

timeout=5

splashimage=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title Red Hat Enterprise Linux Server (2.6.18-164.el5)

root (hd0,0)

kernel /vmlinuz-2.6.18-164.el5 ro root=LABEL=/ rhgb quiet

initrd /initrd-2.6.18-164.el5.img

可以将 hand 和 tail 命令组合管道使用以满足一些复杂的需求。下面的例子将显示 ll

输出结果的第 3 行到第 10 行。

[root@srv ~]# ll | head -n 10 | tail -n 3

lost+found

symvers-2.6.18-164.el5.gz

System.map-2.6.18-164.el5

vmlinuz-2.6.18-164.el5

device.map

e2fs_stage1_5

在上述有关输入、管道的例子中都是单一的,也就是说只能将结果导向一个目标,而 tee

命令可以将结果复制一份到另一个目标。在下面的例子中就是一个使用 tee 命令的例子,当

ll 执行时其结果会被复制一份在 test.txt 文件中。在使用 tee 时可以使用“-a”选项将内容累加

到文件中。

[root@srv ~]# ls /boot/ | tee boot.dir

abc

config-2.6.18-164.el5

grub

initrd-2.6.18-164.el5.img

lost+found

symvers-2.6.18-164.el5.gz

System.map-2.6.18-164.el5

vmlinuz-2.6.18-164.el5

[root@srv ~]# cat boot.dir

abc

config-2.6.18-164.el5

grub

initrd-2.6.18-164.el5.img

lost+found

symvers-2.6.18-164.el5.gz

System.map-2.6.18-164.el5

vmlinuz-2.6.18-164.el5

事半功倍——Shell 脚本 第

263

9

正则表达式

正则表达式是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符

串。在 Linux 中很多命令及参数都可以使用正则表达式,很多程序设计语言都支持利用正则

表达式进行字符串操作,如在 Perl 中就内建了一个功能强大的正则表达式引擎。

初的正则表达式出现于理论计算机科学的自动控制理论和形式语言理论中。在这些领

域中有对计算(自动控制)的模型和对形式语言描述与分类的研究。1940 年 Warren McCulloch

与 Walter Pitts 将神经系统中的神经元描述成小而简单的自动控制单元。在 1950 年数学家斯

蒂芬·科尔·克莱尼利用称为正则集合的数学符号来描述此模型。肯·汤普逊将此符号系统

引入编辑器 QED,然后是 UNIX 上的编辑器 ed,并 终引入 grep。自此正则表达式被广泛

地使用于各种 UNIX 或者类似 UNIX 的工具。对于 Linux 系统的使用,掌握正则表达式的使

用可以极大地方便日常的管理工作。

9.3.1 正则表达式基本概念

一个正则表达式通常被称为一个模式,为用来描述或者匹配一系列符合某个句法规则的

字符串。如 Hand、Head 这两个字符串,都可以由“H(an|ea)d”这个模式来描述。大部分正

则表达式的形式都有如下的结构。

(1)使用“|”表示替换,如“jack|charles”可以匹配 jack 或 charles。

(2)数量限定,某个字符后的数量限定符用来限定前面这个字符允许出现的个数。 常

见的数量限定符包括以下几种(不加数量限定则代表出现一次且仅出现一次)。

+:加号表示前面的字符必须至少出现一次(大于等于 1 次)。如“goo+gle”可以匹

配 google、gooogle、goooogle 等。

?:问号表示前面的字符 多只可以出现一次(小于等于 1 次)。如“colou?r”可以

匹配 colour 或 color。

*:星号表示前面的字符可以不出现,也可以出现一次或者多次。如“jack*bauer”

可以匹配 jackbauer、jack.bauer、jackjackbauer 等。

(3)匹配,圆括号可以用来定义操作符的范围和优先度,如“to(n|m)y”等价于“tony|tomy”,

“(tony)?zhang”匹配 tonyzhang 和 zhang。

9.3.2 表达式全集

正则表达式有多种不同的风格。表 9-1 是在 PCRE 中元字符及其在正则表达式上下文中

的行为的一个完整列表。

Linux 从初学到精通

264

表 9-1 正则表达式

字符 扫描

\  将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。如“n”匹配

字符“n”。“\n”匹配一个换行符。序列“\\”匹配“\”而“\(”则匹配“(”。

^  匹配输入字符串的开始位置。

$  匹配输入字符串的结束位置。

*  匹配前面的子表达式零次或多次。如“jack*”能匹配“jack”以及“jackbauer”。*等价于{0,}。

+  匹配前面的子表达式一次或多次。如 “zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。

?  匹配前面的子表达式零次或一次。如“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。

{n}  n 是一个非负整数。匹配确定的 n 次。如“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个 o。

{n,}  n 是一个非负整数。至少匹配 n 次。如“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有 o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。

{n,m}  m 和 n 均为非负整数,其中 n<=m。 少匹配 n 次且 多匹配 m 次。如“o{1,3}”将匹配“fooooood”中的前

三个 o。“o{0,1}”等价于“o?”(在逗号和两个数之间不能有空格)。

?  当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少

地匹配所搜索的字符串,而默认的贪婪模式则尽可能多地匹配所搜索的字符串。如对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。

.  匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,使用“[.\n]”的模式。

(pattern)  匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在 VBScript 中使用 SubMatches集合,在 JScript 中则使用$0…$9 属性。要匹配圆括号字符,请使用“\(”或“\)”。

(?:pattern)  匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用“或”字符

(|)来组合一个模式的各个部分时很有用。如“industr(?:y|ies) ”就是一个比“industry|industries”更简略的表达

式。

(?=pattern)  正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需

要获取供以后使用。如“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配

“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在 后一次匹配之后立

即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?!pattern)  负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不

需要获取供以后使用。比如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹

配“Windows2000”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在 后一次匹配之

后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

x|y  匹配 x 或 y。如“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。

[xyz]  字符集合。匹配所包含的任意一个字符。如“[abc]”可以匹配“plain”中的“a”。

[^xyz]  负值字符集合。匹配未包含的任意字符。如“[^abc]”可以匹配“plain”中的“p”。

[a‐z]  字符范围。匹配指定范围内的任意字符。如“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。

[^a‐z]  负值字符范围。匹配任何不在指定范围内的任意字符。如“[^a-z]”可以匹配任何不在“a”到“z”范围内的任

意字符。

\b  匹配一个单词边界,也就是指单词和空格间的位置。如“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。

\B  匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。

\cx  匹配由 x 指明的控制字符。如“\cM”匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将

c 视为一个原义的“c”字符。

事半功倍——Shell 脚本 第

265

9(续表)

字符 扫描

\d  匹配一个数字字符。等价于[0-9]。

\D  匹配一个非数字字符。等价于[^0-9]。

\f  匹配一个换页符。等价于\x0c 和\cL。

\n  匹配一个换行符。等价于\x0a 和\cJ。

\r  匹配一个回车符。等价于\x0d 和\cM。

\s  匹配任何空白字符,包括空格、制表符、换页符等。等价于[\f\n\r\t\v]。

\S  匹配任何非空白字符。等价于[^\f\n\r\t\v]。

\t  匹配一个制表符。等价于\x09 和\cI。

\v  匹配一个垂直制表符。等价于\x0b 和\cK。

\w  匹配包括下画线的任何单词字符。等价于“[A-Za-z0-9_]”。

\W  匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。

\xn  匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。如,“\x41”匹配“A”。“\x041”则等价于“\x04”&“1”。正则表达式中可以使用 ASCII 编码。

\num  匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。如,“(.)\1”匹配两个连续的相同字符。

\n  标识一个八进制转义值或一个向后引用。如果\n 之前至少有 n 个获取的子表达式,则 n 为向后引用。否则,如

果 n 为八进制数字(0-7),则 n 为一个八进制转义值。

\nm  标识一个八进制转义值或一个向后引用。如果\nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果\nm之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制

数字(0-7),则\nm 将匹配八进制转义值 nm。

\nml  如果 n 为八进制数字(0-3),且 m 和 l 均为八进制数字(0-7),则匹配八进制转义值 nml。

\un  匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。如\u00A9 匹配版权符号(©)。

9.3.3 正则表达式实例

正则表达式采用模式匹配的方式几乎可以描述出任何类型的字符串,下面是一些常见正

则表达式的示例。

(1)匹配字符串是否只含数字与英文,且字串长度在 4~16 个字符之间。

^[a-zA-Z0-9]{4,16}$"

(2)匹配开头字符是“B”、第二个字母是一个小写字母、后面紧跟“0”个或多个重复

的“b”或“p”、 后跟一个“y”,并且这个字符串位于行的末尾。

/B[a-z][bp]*y$/

(3)匹配以“tonyzhang”开头,后面跟任意个数的任意字符,然后以“all”结尾的字符

串。“*”在 Shell 里表示任意个数的任意字符,而在正则表达式里表示任意个数的前一字符。

与“.”配合使用表示任意个数(包括零个)的任意字符。“*”也可以表示重复零次或任意次

它前面的一组字符。

/\<tonyzhang.*all\>/

Linux 从初学到精通

266

(4)匹配中文字符。

[\u4e00-\u9fa5]

(5)匹配双字节字符(包括汉字在内)。

[^\x00-\xff]

(6)匹配空白行。

\n\s*\r

(7)匹配 HTML 标记。

<(\S*?)[^>]*>.*?</\1>|<.*? />

(8)匹配首尾空白字符。

^\s*|\s*$

(9)匹配 E-mail 地址。

\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

(10)匹配网址 URL。

[a-zA-z]+://[^\s]*

(11)匹配账户是否合法(字母开头、允许 5-16 字节、允许字母数字下画线)。

^[a-zA-Z][a-zA-Z0-9_]{4,15}$

(12)匹配国内电话号码。

\d{3}-\d{8}|\d{4}-\d{7}

(13)匹配腾讯 QQ 号。

[1-9][0-9]{4,}

(14)匹配中国邮政编码。

[1-9]\d{5}(?!\d)

(15)匹配身份证(15 位或 18 位)。

\d{15}|\d{18}

(16)匹配 IP 地址。

\d+\.\d+\.\d+\.\d+

(17)匹配正整数。

^[1-9]\d*$

(18)匹配整数。

^-?[1-9]\d*$

(19)匹配由 26 个英文字母组成的字符串。

事半功倍——Shell 脚本 第

267

9^[A-Za-z]+$

(20)匹配由 26 个英文字母的大写组成的字符串。

^[A-Z]+$

(21)匹配由 26 个英文字母的小写组成的字符串。

^[a-z]+$

(22)匹配由数字和 26 个英文字母组成的字符串。

^[A-Za-z0-9]+$

(23)匹配由数字、26 个英文字母或者下画线组成的字符串。

^\w+$

高级文本处理命令

在 4.6 中已经学习了一些 bash Shell 提供的基本的文本处理命令,这些命令在一般的交

互模式下基本可以满足用户的需求。在编写 Shell 脚本时还需要了解以下一些高级的文本处

理命令。

9.4.1 tr:转换或删除指定内容

tr 命令用于转换或删除指定内容,该命令语法如下。

tr [-cds] [第一字符集] [第二字符集]

常用指数:

常用选项:

-c:取代所有不属于第一字符集的字符。

-d:删除所有属于第一字符集的字符。

-s:把连续重复的字符以单独一个字符表示。

tr 命令从标准输入中读取数据,经过字符转换后,输出到标准输出。在指定字符集时除

了可以使用普通字符串以外,还可以使用下列特殊字符:“\<字符字码>” 表示使用 1~3 位

八进制字码指定字符;“\\”表示反斜线字符;“\b”表示倒退字符;“\r”表示 CR 控制字符;

“<第 1 字符>-<第 2 字符>”表示包含在第 1 字符到第 2 字符间的所有字符;“<字符>*<重复

次数>”表示重复指定的字符达到指定的次数;“[:alnum:]”表示所有字母和数字;“[:alpha:]”

表示所有的字符;“[:cntrl:]”表示所有的控制字符;“[:digit:]”表示所有数字;“[:graph:]”表

示除空格以外的所有可打印字符;“[:lower:]”表示所有小写字母;“[:print:]”表示包括空格

Linux 从初学到精通

268

在内的所有可打印字符;“[:punct:]”表示所有标点符号。下面看几个 tr 命令的例子。

显示文件 ctu.txt 中的内容。

[root@srv ~]# cat ctu.txt 123:456:789 abc:def:ghi Jkl:Mno:pqr @@@:###:$$$

将所有小写字母转换为大写字母。

[root@srv ~]# cat ctu.txt | tr '[a-z]' '[A-Z]' 123:456:789 ABC:DEF:GHI JKL:MNO:PQR @@@:###:$$$

将所有不是@的字符转换为*。

[root@srv ~]# cat ctu.txt | tr -c '@' '*' ************************************@@@*********

将所有连续的@转换为*。

[root@srv ~]# cat ctu.txt | tr -s '@' '*' 123:456:789 abc:def:ghi Jkl:Mno:pqr *:###:$$$

将所有的字母和数据转换为%。

[root@srv ~]# cat ctu.txt | tr [:alnum:] '%' %%%:%%%:%%% %%%:%%%:%%% %%%:%%%:%%% @@@:###:$$$

9.4.2 sort:将显示内容排序

sort 命令用于将显示内容排序,该命令语法如下。

sort [-fbMnruk] [文件名]

常用指数:

常用选项:

-f:忽略大小写。

-b:忽略 前面的空格。

-M:以月份的名称来排序。

-n:使用“纯数字”排序,默认以文字类型排序。

-r:反向排序。

事半功倍——Shell 脚本 第

269

9 -u:相同的只显示一行。

-k:指定排序字段。

9.4.3 cut:显示指定的内容

cut 命令用于显示指定的内容,该命令语法如下。

cut [-b <输出范围>] [文件…] cut [-d <分界字符>] [-f <输出范围>] [-s] [文件…]

常用指数:

常用选项:

文件…:指定要显示的文件。

-b <输出范围>:指定需要输出的范围,以 Bytes 为单位。范围以每行的列为准。如

指定的输出范围为“7”,就会显示(以显示器为标准输出设备)每行第 7 列的字符;

指定的输出范围为“7-”,就会显示每行从第 7 列到 后一列的内容;指定的输出范

围为“-7”,就会显示每行第 1 列到第 7 列的内容;指定的输出范围为“5-7”,就会

显示每行第 3 列到第 7 列的内容;指定输出范围为“4,7”,就会显示每行第 4 列和

第 7 列的内容。

-d <分界字符>:指定列的分界字符。默认值以制表符当做列分界字符,可以通过该

选项指定其他列分界字符,该选项只在使用“-f”时有效。

-f <输出范围>:指定欲输出到标准输出设备的范围,以列为单位。

-s:如果该列没有分界字符存在,则不输出该列内容,该选项只在使用“-f”时有效。

cut 命令会一行行地读入文件内容,然后把符合条件的内容输出到标准输出设备,如显示

器。下面看几个 cut 命令的例子。在文件 charles.txt 中,第 1 行使用“:”作为列分界符;第 2

行使用制表符作为列分界符;第 3 行使用普通空格作为列分界符;第 4 行使用制表符作为列

分界符。

[root@srv ~]# cat charles.txt 123:456:abc:def 123 456 abc def ABC DEF GHI JKL 123 456 ABC DEF

显示文件“charles”中第 3~5 列及第 7 列内容,在第 2 行中制表符当做一列处理,

第 3 行中每个空格当做一列处理。

[root@srv ~]# cut -b 3-5,7 charles 3:46 3 46 C 3 46

Linux 从初学到精通

270

9.4.4 split:拆分文件

split 命令用于拆分文件,该命令语法如下。

split [-b <字节>] [-l <行数>] 要拆分的文件名 拆分后的文件名

常用指数:

常用选项:

-b <字节>:指定按多少字节进行文件拆分,在<字节>后可再加到单位:b=512bytes、

k=1024bytes、m=1048576bytes。

-l <行数>:指定按多少行数进行文件拆分。

split 可将文件拆分成较小的文件,默认每 1000 行拆分成一个小文件,小文件会根据选项

或自动命名。下面看几个 split 命令的例子。

显示文件 ctu.txt 的内容。

[root@srv ~]# cat ctu.txt 123:456:789 abc:def:ghi Jkl:Mno:pqr stu:vwx:xyz @@@:###:$$$ %%%:^^^:&&& ***:(((:)))

将 ctu.txt 第 3 行拆分为一个文件,文件以 dod 开头。

[root@srv ~]# split -l 3 ctu.txt dod [root@srv ~]# ll dod* -rw-r--r-- 1 root root 36 Mar 10 21:50 dodaa -rw-r--r-- 1 root root 36 Mar 10 21:50 dodab -rw-r--r-- 1 root root 12 Mar 10 21:50 dodac

显示拆分后的文件内容。

[root@srv ~]# cat dodaa 123:456:789 abc:def:ghi Jkl:Mno:pqr [root@srv ~]# cat dodab stu:vwx:xyz @@@:###:$$$ %%%:^^^:&&& [root@srv ~]# cat dodac ***:(((:)))

事半功倍——Shell 脚本 第

271

9

Shell 脚本

脚本是为了缩短传统的“编写->编译->链接->运行”过程而创建的计算机编程语言。此

命名起源于一个脚本“screenplay”,每次运行都会使对话框逐字重复。早期的脚本语言经常

被称为批次处理语言或工作控制语言。一个脚本通常是解释运行而非编译。脚本语言通常都

有简单、易学、易用的特性,目的就是希望能让程序设计师快速完成程序的编写工作。

虽然许多脚本语言都超越了计算机简单任务自动化的领域,成熟到可以编写精巧的程序,

但仍然还是被称为脚本。几乎所有计算机系统的各个层次都有一种脚本语言。目前在许多方

面,高级编程语言和脚本语言之间互相交叉,二者之间没有明确的界限。bash Shell 提供了很

强大的脚本功能,在脚本中可以执行命令或通过特定的语法完成指定的工作。在开始学习

Shell 脚本前首先要了解以下内容。

(1)Shell 脚本并不是一个复杂的程序语言,其是按行解释的。每个 Shell 脚本对于文件

系统来说就是一个文本文件,在有相应权限的情况下可以使用文本编辑器建立修改 Shell 脚

本文件;使用文本查看命令显示 Shell 脚本的内容。

(2)虽然在 Linux 中扩展名并没有实际的作用但一般为了方便阅读,bash Shell 的脚本文

件一般使用“sh”作为扩展名。

(3)一行中“#”之后的内容表示是注释,注释在执行过程中将被忽略。

(4)在 Shell 脚本文件的第一行应该指定向哪个解释器发送指令,目前在 RHEL 5.x 中默

认使用 bash Shell,所以第一行应该是“#!/bin/sh”。

(5)在执行已编写好的脚本时可以使用两种方式:对于有执行权限的脚本文件可以使用“./<

文件名>”的方式执行;对于没有执行权限的脚本文件可以使用“sh <文件名>”的方式执行。

(6)Linux 系统中每个进程都是有寿命的。所有进程应另一个进程的请求而启动,发出

请求的进程被称为父进程,新启动的进程被称为子进程。在子进程完成自身的任务后退出。

子进程退出后会返回一个信息给父进程,叫做返回值或退出状态。返回值是一个 0~244 之间

的整数,进程返回 0 表示其执行成功,如果返回任何非 0 的值表示有某种形式的失败。在 bash

shell 中把上一个命令的返回值保存在一个名为“$?” 的特殊变量中,可以使用“echo $?”

显示上一个命令是否执行成功。

[root@srv ~]# touch ctu.txt

返回值为 0 表示上一个命令“touch ctu.txt”执行成功。

[root@srv ~]# echo $? 0 [root@srv ~]# ll /dod ls: /dod: No such file or directory

返回值非 0 表示上一个命令“ll /dod”执行失败。

[root@srv ~]# echo $? 2

Linux 从初学到精通

272

为什么再次使用“echo $?”时又显示执行成功呢?这是因为$?只保存了上一个命令

的返回值,对于$?目前的值是上一个“echo $?” 的返回值,所以显示执行成功。

[root@srv ~]# echo $? 0

9.5.1 变量

变量简单地说就是会变化的量。变量根据脚本确定自己的值。变量可以理解为一个盒子,

其根本特点就是“装载”特定的数值或字符。bash Shell 允许用户设置和引用 Shell 变量。Shell

变量可以用在命令、脚本中,也可以被其他程序作为配置选项而引用。

Shell 变量有两种类型:环境变量和局部变量。其中环境变量由子 Shell 继承,局部变量

只存在于创建的 Shell 中。每个变量都是一个名称,Shell 变量的名称可以字母字符及下画线

组成(变量名不能用数字开头)。和大多数脚本语言一样,bash Shell 在使用变量前并不需专

门的语句进行定义也不对变量区分数据类型。本质上 bash Shell 所有变量都是字符串。当然

在 bash Shell 也允许比较操作和算术操作,这取决于变量中的值是否只有数字。

1.局部变量 Shell 的局部变量建立和赋值直接使用“变量名=变量值”的方式,如下面的例子中定义

了一个局部变量名称为 strA,其值为 ctu。

定义一个名为 strA 的变量,并为其赋值“ctu”。

[root@srv ~]# strA=ctu

定义一个名为 strB 的变量,并为其赋值“dod”。在为变量赋值时可以使用双引号,

但不是必需的。

[root@srv ~]# strB="dod"

在变量定义后,当前用户在不注销的情况下任何时间都可以使用已定义的变量。在

使用时必须在变量名前加一个$。显示局部变量 strA 的值。

[root@srv ~]# echo $strA ctu

已定义的变量可以在命令行或 Shell 脚本中使用,下面的命令将“Counter Terrorist

Unit”输入到一个名为 ctu.txt 的文件中。

[root@srv ~]# echo "Counter Terrorist Unit" > $strA.txt [root@srv ~]# cat ctu.txt Counter Terrorist Unit

在下面的例子中用户的本意是将“Counter Terrorist Unit” 输入到一个名为 ctu_.txt 的文

件中,但执行命令时 bash Shell 会认为用户是要输入一个文件名为变量 strA_1,扩展名为.txt

的文件,所以在执行后输入的文件成了“.txt”(因为变量 strA_1 并没有被赋值)。为了解决

这个问题可以使用大括号{}标出变量名。

[root@srv ~]# echo "Counter Terrorist Unit_1" > $strA_1.txt [root@srv ~]# ll *.txt

事半功倍——Shell 脚本 第

273

9-rw-r--r-- 1 root root 23 Mar 11 00:45 ctu.txt [root@srv ~]# cat .txt Counter Terrorist Unit_1 [root@srv ~]# echo "Counter Terrorist Unit_1" > ${strA}_1.txt [root@srv ~]# ll *.txt -rw-r--r-- 1 root root 25 Mar 11 00:46 ctu_1.txt -rw-r--r-- 1 root root 23 Mar 11 00:45 ctu.txt

在 bash Shell 中会自动设置一些变量为用户提供信息,这些变量是只读的,用户可以读

取但不能修改。这样由 bash Shell 自动设置的变量主要包括以下几个。

(1)?: 后一个命令的返回值。 (2)$:当前 Shell 的进程 id。

(3)!: 新后台命令的进程 id。 (4)_:前一个命令 后的标记。

(5)PPID:Shell 父进程的进程 id。 (6)UID:当前用户的用户 id。

(7)BASH_VERSION:当前 bash 的版本。 (8)HOSTNAME:当前计算机制主机名。

(9)OLDPWD:上一次的工作目录。 (10)PWD:当前工作目录。

(11)RANDOM:在 0~32767 之间随机整数。(12)SECONDS:Shell 启动以来的秒数。

执行“ls -a”命令。

[root@srv ~]# ls -a ~ anaconda-ks.cfg .bashrc .gnome2 install.log .redhat Desktop install.log.syslog reports. .bash_history

显示 后一个命令 后的标记。

[root@srv ~]# echo $_ -a

显示当前工作目录。

[root@srv35 ~]# echo $PWD /root

显示当前 bash 的版本。

[root@srv35 ~]# echo $BASH_VERSION 3.2.25(1)-release

2.环境变量 在 bash Shell 中允许用户使用“变量名=变量值”的方式定义局部变量,而在 Linux 的内

核中也允许全体进程使用“变量名=变量值”的方式定义被称做环境变量的变量。环境变量

是保存在内核进程中的一部分,无论何时一个进程启动另一个进程时,子进程都会继承环境

变量。用户也可以创建环境变量,然后所有被 Shell 启动的命令将会沿用这个变量。环境变

量创建分为两步:定义一个局部变量;使用“export”命令将局部变量提升为环境变量。

脚本 sh1.sh 的功能就是将“variable strA=”和变量 strA 合并后显示。

[root@srv ~]# cat sh1.sh #!/bin/sh echo "variable strA="$strA

Linux 从初学到精通

274

定义变量 strA 的值。

[root@srv ~]# strA="ctu" [root@srv ~]# echo $strA ctu

运行脚本 sh1.sh。

[root@srv ~]# ./sh1.sh

这时变量 strA 的值并没有被显示,这是因为变量 strA 目前是一个局部变量。

variable strA=

将变量 strA 提升为环境变量。

[root@srv ~]# export strA

再次运行脚本 sh1.sh 时,变量 strA 的值就可以被显示。

[root@srv ~]# ./sh1.sh variable strA=ctu

3.显示已定义的变量 在 bash Shell 中可以通过 set 命令显示已定义的变量,env 命令用于显示已定义的环境变量。

4.清除变量 对于已经定义的变量可以使用“unset <变量名>”的方式清除。

定义变量 strB。

[root@srv ~]# strB="dod"

显示变量 strB 的内容。

[root@srv ~]# echo $strB dod

清除变量 strB。

[root@srv ~]# unset strB

再次显示时,变量 strB 已经没有内容。

[root@srv ~]# echo $strB

5.向脚本传递参数

就像在执行 Shell 命令时经常会使用参数一样,很多时候编写的脚本需要接受传递给脚

本的参数。在脚本中可以使用“$1”接受传递给脚本的第一个参数、使用“$2”接受传递给

脚本的第二个参数,除了可以获得每个参数值以外,还可以使用“$*”接受所有的参数、使

用“$0”获取当前脚本的名称、使用“$#”获取传递给脚本的参数个数、使用“$$”获取当

前脚本运行的 PID。

显示脚本 sh2.sh 的内容。

[root@srv ~]# cat sh2.sh

事半功倍——Shell 脚本 第

275

9#!/bin/sh echo "Script Name Is:"$0 echo "First Variable:"$1 echo "Second Variable:"$2 echo "Tertiary Variable:"$3 echo "All Variable:"$*

执行脚本并传递三个参数。

[root@srv ~]# ./sh2.sh ctu dod cia Script Name Is:./sh2.sh First Variable:ctu Second Variable:dod Tertiary Variable:cia All Variable:ctu dod cia

9.5.2 条件测试

在用户将参数传递给脚本或因为一些原因需要对一个对象进行测试,看是否满足某种条

件。在 bash Shell 中提供了一些条件测试的语句,这些语句既可以在命令行中使用,也可能

在脚本中使用。

在下面的使用都是在交互模式中使用这些测试命令,在后面的章节中再讲述在 Shell

脚本中通过流程控制语句使用条件测试。

1.字符串测试

字符串测试经常用于检查用户输入的参数是否正确,字符串测试的方法如下。

test "字符串" test <条件> "字符串" test "字符串" <条件> "字符串" [ <条件> "字符串" ] [ "字符串" <条件> "字符串" ]

其中条件可以是以下内容:

=:两个字符串是否相等。

!=:两个字符串是否不相等。

-z:是否是空字符串。

-n:是否是非空字符串。

下面看几个字符串测试的例子。

定义两个变量。

[root@srv ~]# strA="ctu" [root@srv ~]# strB="dod"

测试变量 strA 和 strB 的值是否相等。在使用[]时,要注意[、]、变量及条件之间要

提 示

Linux 从初学到精通

276

使用空格分隔。

[root@srv ~]# [ $strA = $strB ]

显示上一个命令的返回值,非 0 表示不相等。

[root@srv ~]# echo $? 1

测试环境变量 PPID 是否为空。

[root@srv ~]# [ -z $PPID ]

显示上一个命令的返回值,非 0 表示为空。

[root@srv ~]# echo $? 1

2.数值测试 虽然在 bash Shell 中所有变量都是字符串,但如果变量值为字数还是可以进行数学运算

的。对于数值进行测试的方法如下。

test 数值 <条件>数值 [ 数值 <条件> 数值 ]

其中条件可以是以下内容:

-eq:数值相等。

-ne:数据不相等。

-gt:第一个数值大于第二个。

-lt:第一个数值小于第二个。

-ge:第一个数值大于等于第二个。

-le:第一个数值小于等于第二个。

下面看几个数值测试的例子。

定义两个变量。

[root@srv ~]# numA=10 [root@srv ~]# numB=20

测试变量 numA 和 numB 的值是否相等。在使用[]时,要注意[、]、变量及条件之间

要使用空格分隔。

[root@srv ~]# [ $numA -eq $numB ]

显示上一个命令的返回值,非 0 表示不相等。

[root@srv ~]# echo $? 1

3.文件状态测试 在编写 Shell 脚本时经常需要对文件、目录进行特定属性的测试,对于文件、目录进行

测试的方法如下。

事半功倍——Shell 脚本 第

277

9test <条件> [ <条件> ]

其中条件可以是以下内容:

-d:测试是否是目录。

-e:测试文件或目录是否存在。

-f:测试是否是文件。

-L:测试是否是符号链接。

-r:测试是否可读。

-w:测试文件是否可写。

-x:测试文件是否可以执行。

-u:测试文件是否有 SUID。

-g:测试文件是否有 SGID。

-s:测试文件长度大于 0。

下面看几个文件测试的例子。

测试“/etc”是否是一个目录。

[root@srv ~]# [ -d /etc ]

结果为 0 表示是一个目录。

[root@srv ~]# echo $? 0

测试当前用户对/etc/fstab 文件是否有写权限。

[root@srv ~]# [ -w /etc/fstab ]

结果为 0 表示是可写。

[root@srv ~]# echo $? 0

测试文件/etc/grub.conf 是否是一个符号链接文件。

[root@srv ~]# [ -L /etc/grub.conf ]

结果为 0 表示一个符号链接文件。

[root@srv ~]# echo $? 0

4.逻辑操作符 在进行测试时经常会使用多个测试条件,这时可以使用逻辑操作符对多个测试条件进行

逻辑运算,在 bash Shell 中逻辑操作符包括:“-a”逻辑与,指两边的条件都为真时结果才会

真;“-o”逻辑或,两边条件任何一个为真时结果为真;“!”逻辑否,条件为真时结果为假条

件为假时结果为真。下面看几个逻辑操作符的例子。

定义 4 个变量。

Linux 从初学到精通

278

[root@srv ~]# strA="ctu" [root@srv ~]# strB="CTU" [root@srv ~]# strC="dod" [root@srv ~]# strD="dod"

测试条件$strA = $strB 的结果是假(在 bash Shell 中是区分大小写的)而测试条件

$strC = $strD 的结果是真。对两个测试条件进行逻辑与。

[root@srv ~]# [ $strA = $strB -a $strC = $strD ]

测试结果为假。

[root@srv ~]# echo $? 1

对两个测试条件进行逻辑或。

[root@srv ~]# [ $strA = $strB -o $strC = $strD ]

测试结果为真。

[root@srv ~]# echo $? 0

9.5.3 流程控制

在一般情况下任何一种程序语言都是从上至下的顺序执行程序代码,bash Shell 也不例

外。同样,在 bash Shell 中也可以通过判断和循环改变脚本的顺序执行。

1.判断结构 if、then、else 语句提供条件测试,测试条件返回真(0)或假(1)后,可相应执行一系

列语句,其语法如下。

if <条件>; then

#当条件为真时执行的内容。

fi

if <条件>; then

#当条件为真时执行的内容。

else

#当条件为假时执行的内容。

fi

if <条件 1>; then

#当条件 1为真时执行的内容。

elif <条件 2>; then

#当条件 2为真时执行的内容。

else

#当条件 1和条件 2为假时执行的内容。

fi

if 语句必须以 fi 终止,elif 和 else 为可选项,如果语句中没有否则部分,那么就不需要

elif 和 else 部分。if 语句可以有许多 elif 部分,也可以嵌套使用。下面看一个在脚本中使用 if、

then、else 语句的例子,sh3.sh 的作用是:用户传一个目录名,当目录不存在进行则建立该目

事半功倍——Shell 脚本 第

279

9录,其中各行使用如下。

①:将传入脚本的参数个数值赋给变量 numN。

②:如果 numN 为 0,即没有传入参数,则显示“Please Input Direcotry Name!”。

③:如果传入参数不止 1 个,则显示“Too Many Parameter!”。

④:将传入脚本的第一个参数值赋给变量 strI。

⑤:如果变量 strI 所指的目录不存在,则建立一个目录。

[root@srv ~]# cat sh3.sh #!/bin/sh numN=$# ① if [ $numN -eq 0 ]; then ② echo "Please Input Direcotry Name!" elif [ $numN -gt 1 ]; then ③ echo "Too Many Parameter!" else strI=$1 ④ if [ ! -e $strI ]; then ⑤ mkdir -p $strI fi fi

执行脚本 sh3.sh。

[root@srv ~]# ./sh3.sh

Please Input Direcotry Name!

[root@srv ~]# ./sh3.sh /usa/ctu dod

Too Many Parameter!

[root@srv ~]# ./sh3.sh /usa/ctu

[root@srv ~]# ll /usa/ctu/

total 0

在 bash Shell 中除了 if 判断结构以外还有 case 判断结构,case 语句为多选择语句,可以

使用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令,其语法如下。

case 值 in

模式 1)

#当符合模式 1时执行的内容。

; ;

模式 2)

#当符合模式 2时执行的内容。

; ;

. . .

; ;

esac

case 在匹配发现取值符合某一模式后,其间所有命令开始执行直至“;;”。取值将检测匹

配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无

一匹配模式,使用星号*捕获该值,再接受其他输入。模式部分可能包括元字符,与在命令行

Linux 从初学到精通

280

文件扩展名例子中使用过的匹配模式类型相同,即:“*”表示任意字符、“?”表示任意单字

符、“[..]”表示范围中任意字符。下面看一个在脚本中使用 case 语句的例子,sh4.sh 的作用:

要求用户输入一个 1~3 之间的数,如果输入正确则显示“you Input”及用户输入的内容,如

果输入不正确则显示“you Input "$numI":This is not between 1 and 3.”并退出,其中各行使用

如下。

①:echo 语句默认情况下在显示内容后加自动加上换行,使用“-n”参数则不换行。

②:read 语句可以将用户输入的内容读取到指定的变量中。

[root@srv ~]# cat sh4.sh

#!/bin/sh

echo -n "Input Number from 1 to 3:" ①

read numI ②

case $numI in

1)

echo "you Input 1."

;;

2)

echo "you Input 2."

;;

3)

echo "you Input 2."

;;

*)

echo "you Input "$numI":This is not between 1 and 3."

exit 1

;;

esac

执行脚本 sh4.sh。

[root@srv ~]# ./sh4.sh

Input Number from 1 to 3:1

you Input 1.

[root@srv ~]# ./sh4.sh

Input Number from 1 to 3:5

you Input 5:This is not between 1 and 3.

2.循环结构 循环是一系列命令的重复执行过程,在 bash Shell 中支持三种类型的循环:for 循环每次

处理依次执行循环体内的内容,直至循环耗尽;until 循环直至条件为真前依次执行循环体内

的内容;while 循环直至条件为假前依次执行循环体内的内容。任何循环均可嵌套使用,如可

以在一个 for 循环中嵌入另一个 for 循环。

while [条件]

do

循环体

事半功倍——Shell 脚本 第

281

9done

until [条件]

do

循环体

done

for ((初始值;限制值;步长))

do

循环体

done

for var in con1 con2 con3

do

循环体

done

在使用这些循环时,有时需要根据某些条件退出或路过循环,bash Shell 中提供了两种方

法实现这样的功能。

(1)break 用于跳出循环,在循环体中使用 break 后将直接跳出循环执行循环后面的语句,

如果是一个嵌套的循环中使用 break 默认是跳出当前循环,也可以指定跳出循环的个数,如

break 2 就是指定跳出二套的循环。

(2)continue 用于跳过本次循环后面的语句开始新一轮的循环。

下面看几个循环语句的例子。

sh5.sh 的作用:执行一个循环让变量 strI 的值依次等于 1~6,在循环体的内容是显

示变量 strI 的值。

[root@srv ~]# cat sh5.sh #!/bin/sh for strI in 1 2 3 4 5 6 do echo "strI:"$strI done [root@srv ~]# ./sh5.sh strI:1 strI:2 strI:3 strI:4 strI:5 strI:6

sh6.sh 的作用:执行一个循环变量 numI 的值会从 1 到 10,在循环体的内容是显示

变量 numI 的值。

[root@srv ~]# cat sh6.sh #!/bin/sh for numI in $(seq 1 10) do echo "numI:"$numI done [root@srv ~]# ./sh6.sh numI:1

Linux 从初学到精通

282

numI:2 numI:3 numI:4 numI:5 numI:6 numI:7 numI:8 numI:9 numI:10

sh7.sh 的作用:执行一个循环让变量 strName 的值依次等于 ls 命令的结果,在循环

体的内容是显示变量 strName 的值。

[root@srv ~]# cat sh7.sh #!/bin/sh for strName in `ls` do echo $strName done [root@srv ~]# ./sh7.sh anaconda-ks.cfg Desktop install.log install.log.syslog sh1.sh sh2.sh sh3.sh sh4.sh sh5.sh sh6.sh sh7.sh

sh8.sh 的作用:要求用户输入一个文本文件的名称,首先检查文件是否存在,如果

不存在则显示文件不存在,如果文件存在则一行一行地显示文件的内容。如果有一

行的内容等于“Jack Bauer”时,则循环。

[root@srv ~]# cat sh8.sh

#!/bin/sh

echo -n "Input TXT FileName:"

read strFn

if [ -e $strFn ]; then

while read strLine

do

if [ "$strLine" = "Jack Bauer" ]; then

break

fi

echo $strLine

done < $strFn

else

echo "TXT File "$strFn"not exist!"

fi

[root@srv ~]# ./sh8.sh

事半功倍——Shell 脚本 第

283

9Input TXT FileName:af

TXT File afnot exist!

[root@srv ~]# ./sh8.sh

Input TXT FileName:/etc/fstab

LABEL=/ / ext3 defaults 1 1

LABEL=/tmp /tmp ext3 defaults 1 2

LABEL=/var /var ext3 defaults 1 2

LABEL=/home /home ext3 defaults 1 2

LABEL=/usr /usr ext3 defaults 1 2

LABEL=/usr/local /usr/local ext3 defaults 1 2

LABEL=/boot /boot ext3 defaults 1 2

tmpfs /dev/shm tmpfs defaults 0 0

devpts /dev/pts devpts gid=5,mode=620 0 0

sysfs /sys sysfs defaults 0 0

proc /proc proc defaults 0 0

LABEL=SWAP-sda9 swap swap defaults 0 0

[root@srv ~]# cat ctu.txt

Kimberly Bauer

David Palmer

Nina Myers

Jack Bauer #在该文件中第 4行为“Jack Bauer”。

Tony Almedia

Bill Buchanan

Michelle Dessler

[root@srv ~]# ./sh8.sh

Input TXT FileName:ctu.txt

Kimberly Bauer

David Palmer

Nina Myers

9.5.4 函数

在编写 Shell 脚本时,经常会碰到这样的情况:实现某一功能的一段代码会被经常使用

到,这时就可以使用 bash Shell 提供的函数功能简化代码。

可以将函数看做是脚本中的一段代码,但是有一个主要区别。执行函数时,其保留当前

Shell 和内存信息。此外如果执行或调用一个脚本文件中的另一段代码,将创建一个单独的

Shell,因而去除所有原脚本中定义的存在变量。定义函数的格式如下。

function 函数名 { #函数内容。 }

函数可以放在同一个文件中作为一段代码,也可以放在只包含函数的单独文件中。在使

用函数时也可以像执行脚本一样传入参数,在函数体内容也使用$1、$2 的方式读取传入的参

数。下面看几个在脚本中使用函数的例子。

sh9.sh 的作用:定义一个名为 showdate 的函数,并调用该函数,其中各行使用如下。

Linux 从初学到精通

284

①:定义名为 showdate 的函数。

②:函数中要执行的内容。

③:调用函数。

[root@srv ~]# cat sh9.sh #!/bin/sh function showdate ① { echo "today's date is `date`" ② } showdate ③ [root@srv ~]# ./sh9.sh today's date is Fri Mar 12 08:52:36 CST 2010

sh10.sh 的作用:定义一个名为 echopara 的函数,并调用该函数。

①:定义名为 echopara 的函数,该函数用于显示传入的两个参数。

②、③:要求用户输入两个参数。

④:调用函数,将用户输入的内容传递给函数。

[root@srv ~]# cat sh10.sh

#!/bin/sh

function echopara ①

{

echo "First Parameter:"$1

echo "Second Parameter:"$2

}

echo -n "Please Input First Parameter:" ②

read strF

echo -n "Please Input Second Parameter:" ③

read strS

echopara $strF $strS ④

[root@srv ~]# ./sh10.sh

Please Input First Parameter:ctu

Please Input Second Parameter:dod

First Parameter:ctu

Second Parameter:dod

9.5.5 脚本实例

对于简单的任务,Shell 是非常容易使用的工具,同时它也是具有非常强大的功能,可以

简化复杂的工作。前面已经讲述了 Shell 脚本的一些基础知识,下面通过一些例子了解 Shell

脚本是如何在实际工作中运用的。

事半功倍——Shell 脚本 第

285

91.将文件名改为小写字母 #!/bin/sh

file="$1"

if [ $# -eq 0 ]

then

echo "$(basename $0) file"

exit 1

fi

if [ ! $file ]

then

echo "$file not a file"

exit 2

fi

lowercase=$(echo $file | tr '[A-Z]' '[a-z]'])

if [ -f $lowercase ]

then

echo "Error - File already exists!"

exit 3

fi

/bin/mv $file $lowercase

2.显示指定文件的访问、修改、修改内容日期 #!/bin/sh

FILE="$1"

if [ $# -eq 0 ]

then

echo "$0 file-name"

exit 1

fi

which stat > /dev/null

if [ $? -eq 1 ]

then

echo "stat command not found!"

exit 2

fi

if [ ! -e $FILE ]

then

echo "$FILE not a file"

exit 3

Linux 从初学到精通

286

fi

echo "Time of last access : $(stat -c %x $FILE)"

echo "Time of last modification : $(stat -c %y $FILE)"

echo "Time of last change : $(stat -c %z $FILE)"

3.将一个文本文件空格删除 #!/bin/sh

out="output.$$"

echo -n "Emter a file name : "

read file

if [ ! -f $file ]

then

echo "$file not a file!"

exit 1

fi

sed -e 's/[\t ]//g;/^$/d' $file > $out

echo "Output written to $out file"

4.比较两个目录,如果第一个目录的文件在第二个目录中存在则删除 #!/bin/sh

SRC="$1"

DST="$2"

if [ $# -ne 2 ]

then

echo "$(basename $0) dir1 dir2"

exit 1

fi

if [ ! -d $SRC ]

then

echo "Directory $SRC does not exists!"

exit 2

fi

if [ ! -d $DST ]

then

echo "Directory $DST does not exists!"

exit 2

fi

for f in $DST/*

do

if [ -f $f ]

then

tFile="$SRC/$(basename $f)"

if [ -f $tFile ]

then

事半功倍——Shell 脚本 第

287

9 echo -n "Deleting $tFile..."

/bin/rm $tFile

[ $? -eq 0 ] && echo "done" || echo "failed"

fi

fi

done

5.显示所有包含 SUID 属性的文件 该脚本不使用任何选项时显示当前目录,使用“-v”可以显示所有。

#!/bin/sh

if [ "$1" = "-v" ] ; then

verbose=1

fi

for match in $(find /bin /usr/bin -type f -perm +4000 -print)

do

if [ -x $match ] ; then

owner="$(ls -ld $match | awk '{print $3}')"

perms="$(ls -ld $match | cut -c5-10 | grep 'w')"

if [ ! -z $perms ] ; then

echo "**** $match (writeable and setuid $owner)"

elif [ ! -z $(find $match -mtime -$mtime -print) ] ; then

echo "**** $match (modified within $mtime days and setuid $owner)"

elif [ $verbose -eq 1 ] ; then

lastmod="$(ls -ld $match | awk '{print $6, $7, $8}')"

echo " $match (setuid $owner, last modified $lastmod)"

fi

fi

done

6.拥有回收站功能的删除脚本 该脚本可以使用 rm 命令的所有选项,但是并没有真正删除文件或目录,而是将其移动

到用户家目录下的.deleted-files 目录中。

#!/bin/sh

mydir="$HOME/.deleted-files"

realrm="/bin/rm "

copy="/bin/cp -R"

if [ $# -eq 0 ] ; then

exec $realrm

fi

Linux 从初学到精通

288

flags=""

while getopts "dfiPRrvW" opt

do

case $opt in

f ) exec $realrm "$@" ;;

* ) flags="$flags -$opt" ;;

esac

done

shift $(( $OPTIND - 1 ))

# make sure that the $mydir exists

if [ ! -d $mydir ] ; then

if [ ! -w $HOME ] ; then

echo "$0 failed: can't create $mydir in $HOME" >&2

exit 1

fi

mkdir $mydir

chmod 700 $mydir # a little bit of privacy, please

fi

for arg

do

newname="$mydir/$(date "+%S.%M.%H.%d.%m").$(basename "$arg")"

if [ -f "$arg" ] ; then

$copy "$arg" "$newname"

elif [ -d "$arg" ] ; then

$copy "$arg" "$newname"

fi

done

exec $realrm $flags "$@"

7.遍历目录及其下子目录 #!/bin/sh

function listdir(){

local cur_dir parent_dir workdir

workdir=$1

cd ${workdir}

if [ ${workdir} = "/" ];then

cur_dir=""

else

cur_dir=$(pwd)

fi

for dirlist in $(ls ${cur_dir})

do

事半功倍——Shell 脚本 第

289

9 if test -d ${dirlist};then

cd ${dirlist}

listdir ${cur_dir}/${dirlist}

cd ..

else

echo ${cur_dir}/${dirlist}

fi

done

}

if test -d $1;then

listdir $1

elif test -f $1;then

echo "you input a file but not a directory."

exit 1

else

echo "the Directory isn't exist."

exit 1

fi

实验任务

在一台安装了 RHEL 5.x 的计算机上完成以下任务。

(1)练习重定向及管理功能。

(2)练习 tr、sort、cut 命令功能。

(3)练习变量操作。

(4)编写一个脚本,要求 root 用户输入一个用户名后将该用户家目录内容使用 tar 打包

到指定目录后,删除该用户。

本章测试

(1)“cut -b 3-5 ctu.txt”命令的作用是( )。

A.显示文件 ctu.txt 中第 3~5 列内容 B.复制文件 ctu.txt 中第 3~5 行内容

C.显示文件 ctu.txt 中第 3~5 行内容 D.复制文件 ctu.txt 中第 3~5 行内容

(2)( )语句可以用于立即终止当前循环。

A.break B.end

C.continue D.endfor

(3)在下列命令中,( ) 有可能创建文件 err.txt。

Linux 从初学到精通

290

A.chmod a+x ctu.sh > err.txt B.chmod a+x ctu.sh 2> err.txt

C.chmod a+x >> err.txt D.chmod a+x ctu.sh e>err.txt

(4)下列标点符号中,( )与命令命令替换无关。

A.{} B.$

C.* D.~

(5)使用( )命令可以将局部变量提升为环境变量。

A.set B.test

C.export D.public

(6)在下列命令中,只有( )无论在任何情况都会执行 chmod 命令。

A.mkdir ctu && chmod 777 ctu B.mkdir ctu ! chmod 777 ctu

C.mkdir ctu;chmod 777 ctu D.mkdir ctu || chmod 777 ctu

(7)在下列语句中,( )会被认为是注释。

A.#ctu B.//ctu

C./*ctu*/ D.--ctu

(8)使用( )可以获得上一个命令的返回值。

A.echo $! B.echo $$

C.echo $? D.echo $-$

(9)在 RHEL 5.x 是使用( )作为用户的默认 Shell。

A.Bourne Shell B.bash Shell

C.Korn Shell D.C shell

深入地了解 Linux 系统初始化及服务启动的过程及运行过程

中进程的管理方式,对于日常使用 Linux 系统及排除系统错误都

有很大的帮助。在本章中将讲述 Linux 引导过程、内核模块、进

程管理、自动化任务等相关内容。

第10章

识骨寻踪︱︱Lin

ux

引导及进程管理

Linux 从初学到精通

292

Linux 引导过程

从打开计算机电源到用户登录的这段时间里,Linux 系统经历了如图 10-1 所示的初始化

阶段。下面详细介绍 Linux 系统每个阶段中的相关内容。

图 10-1 Linux引导过程

10.1.1 开机自检

每台计算机开机时都会启动一个叫做 BIOS(Basic Input/Output System,基本输入/输出

系统)的小操作系统。BIOS 通常会执行以下操作:

(1)系统检测,BIOS 对计算机进行整体检测,确保核心组件,如 CPU、内存可以正常

运行。

(2)设备初始化,BIOS 为键盘、鼠标等设备初始化并分配合适的系统资源。

(3)引导设备选择,BIOS 会查找合适的引导设备(用户可以在 BIOS 中配置,如从光驱、

硬盘、PXE 启动)。

PXE(Pre-boot Execution Environment,远程预启动执行环境)是由 Intel 设计的协议,

PXE 可以使计算机通过网络启动。协议分为客户端和服务器端,PXE 客户端在网卡的 ROM

中,当计算机引导时,BIOS 把 PXE 客户端调入内存执行,并显示出命令菜单,经用户选

择后,PXE 客户端将放置在远端的操作系统通过网络下载到本地运行。

(4)移交执行区域,如果是从硬盘启动,BIOS 把磁盘的第一个数据块(Master Boot

Record,MBR)装入内存,并把执行传递到这个区域。任何引导盘的第一个数据块(512 字

提 示

识骨寻踪——Linux 引导及进程管理 第

293

10

节)都必须包含有一个小的可执行文件,即引导程序。

10.1.2 加载引导程序

在 BIOS 自检的 后一步中 BIOS 把磁盘的第一个数据块(Master Boot Record,MBR)

装入内存,并把执行传递到这个区域。这个过程被设计为以下两个阶段执行。

(1)第一阶段,引导程序的第一阶段通常很小,唯一的任务就是定位、装载并把控制权

传递给第二阶段的引导程序。由于第一阶段引导程序位于 MBR 中,因此这个文件一般在文

件系统中找不到。

(2)第二阶段,引导程序的第二阶段通常就是引导程序自身,其在启动时运行了某种形

式的应用程序,能够读取有关默认设备的配置信息。第二阶段引导程序通常是文件系统中可

识别的二进制文件。这个可识别的二进制文件会完成以下几个任务:编写合适内核命令行,

用于引用正确的根分区;装载合适的初始虚拟磁盘(intial ram disk,initrd);装载合适的 Linux

内核并将控制权移交给内核。

目前在 RHEL 5.x 使用的引导程序是 GRUB。GRUB 是一个来自 GNU 项目的多操作系统

引导程序。GRUB 允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择

希望运行的操作系统。GRUB 可用于选择操作系统分区上的不同内核,也可用于向这些内核

传递启动参数。 GRUB 引导程序的内容在 /boot/grub 目录中,其主配置文件是

/boot/grub/grub.conf 文件,该文件中各行作用如下。

一般在/etc 目录下有一个名为 grub.conf 的符号链接是指向/boot/grub/grub.conf 文件。

[root@srv ~]# ls /boot/grub/ device.map grub.conf minix_stage1_5 stage2 e2fs_stage1_5 iso9660_stage1_5 reiserfs_stage1_5 ufs2_stage1_5 fat_stage1_5 jfs_stage1_5 splash.xpm.gz vstafs_stage1_5 ffs_stage1_5 menu.lst stage1 xfs_stage1_5 [root@srv ~]# grep -v ^# /boot/grub/grub.conf default=0 ① timeout=5 ② splashimage=(hd0,0)/grub/splash.xpm.gz ③ hiddenmenu ④ title Red Hat Enterprise Linux Server (2.6.18-164.el5) ⑤ root (hd0,0) ⑥ kernel /vmlinuz-2.6.18-164.el5 ro root=LABEL=/ rhgb quiet ⑦ initrd /initrd-2.6.18-164.el5.img ⑧

①:如果用户不选择默认引导的菜单项,从 0 开始。

②:等待用户选择的时间为 5 秒。

③:指定 GRUB 菜单的背景图片。

④:不在启动时显示 GRUB 菜单。

⑤:GRUB 在引导时会给用户提供一个选择合适配置的菜单,这个菜单由“title”开关

提 示

Linux 从初学到精通

294

的行作为起始。如计算机中有两个操作系统时,这里可以使用两个“title”。用户在选择时看

到的是“title”后面接的内容,当用户选择某个“title”后面接的内容后,GRUB 会根据“title”

中的内容启动系统。

⑥:在随后的所有文件引用上挂载并隐性使用指定的硬盘。

⑦:加载 Linux 内核。

⑧:读取初始虚拟磁盘文件。

在 grub.conf 文件中标明硬盘或文件的方法是“(驱动器,分区)[文件路径]”,其中分区和驱

动器第一个标识为 0、第二个为 1,依此类推。如上面的 grub.conf 文件中“splashimage”参

数在指明 GRUB 背景图片路径的值“(hd0,0)/grub/splash.xpm.gz”的意思就是第一块硬盘上第

一分区下 grub 目录是文件 splash.xpm.gz;“root”参数中的“(hd0,0)”表示第一块硬盘上第一

分区,因此下面的“kernel”、“initrd”参数中指定文件的实际路径应该是第一块硬盘上第一

分 区 下 的 “ vmlinuz-2.6.18-164.el5 ” 文 件 、 第 一 块 硬 盘 上 第 一 分 区 下 的

“initrd-2.6.18-164.el5.img”文件。

在 grub.conf 文件中“kernel”参数用于指定加载的 Linux 内核以及加载的参数,其中

“/vmlinuz-2.6.18-164.el5”用于指定内核文件所在的路径;“ro”表示把根分区使用只读方式

挂载(这个参数是必需的,因为目前 Linux 系统在刚刚开始加载对于文件系统没有任何保护,

为了提供安全性就将根分区以只读方式挂载,在后面的启动过程中会重新将根分区的挂载方

式改为可读写);“root=LABEL=/”指定根分区所在的硬盘分区(这里的 root 并不是 Linux 管

理员的意思,这个 root 表示根分区),这里使用“LABEL=/”表示根分区在硬盘中一个卷标

为“/”的分区中(RHEL 5.x 的安装会自动将根分区所在的硬盘分区的卷标指定为“/”),如

果明确地知道根分区所在硬盘分区是哪个,这里也可以直接写硬盘分区的设备号,如根分区

在/dev/sda5 上,这里也可以写成/dev/sda5;“rhgb”表示启动时显示加载进度条,为了提高启

动速度可以将此参数删除;“quiet”不在启动时显示内核信息,将该参数删除后可以查看到可

靠的内核信息流。

加载内核的参数除了可以在 /boot/grub/grub.conf 文件中查看,也可以查看

“/proc/cmdline”文件。

RedHat 有时选择将内核的某些部分编译为内核模块,如文件系统支持部分,因此在内核

引导是会需要使用到这些内核模块。这些内核模块会通过引导程序从被装入内存中的初始虚

拟磁盘中获得,在 RHEL 5.x 中初始虚拟磁盘的内容在“/boot/initrd-$(uname -r).img”文件中。

uname 命令是用于显示系统信息,该命令语法如下。

uname [-amnrsv]

常用指数:

常用选项:

-a:显示所有系统相关的信息。

提 示

识骨寻踪——Linux 引导及进程管理 第

295

10

-m:显示计算机硬件平台。

-n:显示主机名。

-r:显示内核版本。

-s:显示操作系统名称,在使用 uname 不加任何选项时,则默认会执行“uname -s”。

-v:显示操作系统版本。

初始虚拟磁盘文件的路径“/boot/$(uname -r).img”的意思就是/boot/initrd-内核版本.img

文件。

[root@srv ~]# echo "/boot/initrd-$(uname -r).img" /boot/initrd-2.6.18-164.el5.img

在 Linux 启动时可以临时改变 GRUB 的内容,从而实现修改 Linux 内核的启动参数,这

虽然可以提供启动的灵活性,但是也带来很大的安全隐患,在后面的章节中将讲到通过提供

正确的参数,可以把系统引导到一个维护模式中,在那里可以在不需要知道 root 用户以前密

码的情况下为 root 用户配置一个新密码。因此强烈推荐在 grub.conf 文件中增加一个密码用以

保存 GRUB。为 GRUB 增加密码的具体操作步骤如下。

(1)使用以下命令生成一个使用 MD5 加密的 GRUB 密码。

[root@srv ~]# grub-md5-crypt Password: #再次输入密码。 Retype password: #指定密码。 $1$SOPTS/$0FNO2vGy86DFot.qcA9PL1 #使用 MD5加密的 GRUB密码值。

(2)修改/boot/grub/grub.conf 文件,内容如下。主要增加一个“password”参数,“--md5”

表示指定的密码是使用 MD5 加密,“$1$SOPTS/$0FNO2vGy86DFot.qcA9PL1”是上一步中使

用的 MD5 值。

[root@srv ~]# grep -v ^# /boot/grub/grub.conf default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu password --md5 $1$SOPTS/$0FNO2vGy86DFot.qcA9PL1 title Red Hat Enterprise Linux Server (2.6.18-164.el5) root (hd0,0) kernel /vmlinuz-2.6.18-164.el5 ro root=LABEL=/ rhgb quiet initrd /initrd-2.6.18-164.el5.img

完成上述配置后,在启动时如果要修改 GRUB 的参数,必须先输入“grub-md5-crypt”

命令中指定的密码。

10.1.3 加载内核

在通过 GRUB 指定加载内核的参数并把控制权移交给内核后,Linux 内核将完成以下

操作。

1.运行 init 进程 Linux 内核启动的第一个进程就是/sbin/init,这个命令是在系统启动时直接由内核执行

Linux 从初学到精通

296

的,因此其进程 ID(PID)永远是 1。只要系统还在运行 init 进程就会一直运行,而且 init

进程也是系统中 后一个被终止的进程。Linux 为了确保 init 进程不会被意外终止,该进程不

接收 SIGKILL 信号。

init 进程像一个 Linux 的总管,其功能只有一个就是启动、停止及监控其他进程。init 在

启动时会读取其配置文件/etc/inittab。

[root@srv ~]# grep -v ^# /etc/inittab | grep -v ^$ id:5:initdefault: si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 ca::ctrlaltdel:/sbin/shutdown -t3 -r now pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled" 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 x:5:respawn:/etc/X11/prefdm -nodaemon

在/etc/inittab 文件中第一个非注释行(不是以“#”开头)“id:5:initdefault:”是指定了系

统默认的运行级别,默认使用的运行级别是 5,在 Linux 可用的运行级别包括以下几个:

(1)运行级别 0:表示关机,如果将系统默认运行级别改为“id:0:initdefault:”,那么每次

开机后就自动关机。

(2)运行级别 1:表示单用户模式,这是一个维护使用的运行级别。在运行级别 1 时,

只有 root 用户可以登录系统,而且必须在控制台上登录(不能远程登录),网络接口通常不

激活,大多数守护进程都关闭。这个级别有点类似于 Windows 中的安全模式。

(3)运行级别 2:没有网络文件系统(NFS),在 RHEL 5.x 中运行级别 2 是有网络连接,

但没有 NFS 相关的文件系统的多用户模式。

(4)运行级别 3:完整的多用户模式,运行级别 3 会启动一个完整的 Linux 系统,但不

会进入图形界面。也就是说将系统默认运行级别改为“id:3:initdefault:”后,每次开机后就进

入字符界面。

(5)运行级别 4:保留的运行级别,目前没有使用。

(6)运行级别 5:完整的多用户模式,运行级别 3 会启动一个完整的 Linux 系统,也会

进入图形界面。也就是说将系统默认运行级别改为“id:5:initdefault:”后,每次开机后就进入

图形界面。

(7)运行级别 6:重新启动,如果将系统默认运行级别改为“id:6:initdefault:”,那么每次

开机后就自动重新启动。

识骨寻踪——Linux 引导及进程管理 第

297

10

在 Linux 系统启动后就不会再读取/etc/inttab 文件,如果改变了该文件只有重新启动或使

用“init q”命令使其生效。在 Linux 使用过程中可以使用“runlevel”命令查看系统当前的运

行级别,也可以通过“init”命令改变系统的运行级别。

使用“runlevel”命令时第一位显示的是系统以前的运行级别,如果是“N”则表示是新

引导的系统;第二位是当前的运行级别。

[root@srv ~]# runlevel N 5

使用“init”命令可直接加入希望改变到的运行级别。在下面的使用中将系统运行级别更

改为“0”,系统会立即关机。

[root@srv ~]# init 0

在 2.3.3 中讲到可以使用“poweroff”命令关闭系统、使用“reboot”命令重新启动系统,

也可以使用“init 0”命令关闭系统、使用“init 6”命令重新启动系统。Linux 还提供了一个

shutdown 命令实现关闭和重新启动系统的功能,该命令语法如下。

shutdown [-hPrc] [-t <秒数>] <时间> [<警告消息>]

常用指数:

常用选项:

-t <秒数>:发出警告消息和删除信号之间要延迟的时间。

<时间>:指定 shutdown 命令执行的时间,指定时间可以使用“hh:mm”指定一具体

的时间;“+n”指定在距离现在 n 分钟;“Now”马上执行。

<警告消息>:系统在执行 shutdown 命令时会显示的信息。

-h:关闭系统并切断电源。

-P:关闭电源。

-r:重新启动系统。

-c:取消任务排列中的关机任务。

在/etc/inittab 文件中第二个非注释行“si::sysinit:/etc/rc.d/rc.sysinit”开始每行所有内容都

含有几个被冒号分隔的字段,其中第一个字段没有实际意义;第二个字段表示与本行相关的

运行级别列表;第三个字段含有一个预定义的动作,该字段会告诉 init 如何或何时运行第四

个字段中指定的命令;第四个字段要运行的命令。下面根据/etc/inittab 文件中已有的内容讲

解其每行的使用。

(1)si::sysinit:/etc/rc.d/rc.sysinit,系统在启动时会在任何运行级别执行/etc/rc.d/rc.sysinit

这个初始化脚本。

(2)l0:0:wait:/etc/rc.d/rc 0~ l6:6:wait:/etc/rc.d/rc 6,系统在改变运行级别(包括引导时的

默认级别和运行中改变运行级别)时都会执行 rc 目录中的内容。如“l5:5:wait:/etc/rc.d/rc 5”

这行中第一个字段“l5”只是一个标示没有任何意义;第二个字段“5”表示在运行级别 5 时

会被执行;第三个字段“wait”表示 init 在进入相应运行级别时要等第四个字段指定的命令

Linux 从初学到精通

298

运行完成后才做其他工作;第四个字段“/etc/rc.d/rc 6”表示要执行这个目录中的所有脚本。

(3)ca::ctrlaltdel:/sbin/shutdown -t3 -r now,当用户在控制台键盘按入“Ctrl+Alt+Del”组

合键 3 秒钟后重新启动系统。

(4)pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down":收到 UPS

电池快没电的信息后,2 分钟后发出“Power Failure; System Shutting Down”信息并关机。

(5)pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled":如果

在 1、2、3、4、5 中任何一个运行级别发现 UPS 又有电后,发出“Power Restored; Shutdown

Cancelled”信息并取消关机。

(6)1:2345:respawn:/sbin/mingetty tty1~6:2345:respawn:/sbin/mingetty tty6,配置了 6 个虚

拟控制台并在每个控制台启动登录进程。

(7)x:5:respawn:/etc/X11/prefdm -nodaemon:在运行级别 5 时会执行“/etc/X11/prefdm”

脚本,该脚本启动“首选的显示管理器”,即允许用户使用图形界面登录。

2./etc/rc.d/rc.sysinit 脚本

在配置文件/etc/inittab 中定义了会执行“/etc/rc.d/rc.sysinit”这个初始化的脚本。在该脚

本的主要任务如下:

(1)激活 udev 和 selinux。

(2)在/etc/sysctl.conf 中设定内核参数。

(3)将 proc 文件系统挂载到目录/proc。

(4)设定系统时钟。

(5)装载按键设置。

(6)启用交换分区。

(7)通过/etc/sysconfig/netowrk 确定主机名。

(8)检查并重新挂载根文件系统。

(9)激活 RAID 和 LVM 设备。

(10)启用磁盘配额。

(11)挂载/etc/fstab 文件中定义的分区。

(12)清理过时的锁和 PID 文件。

3./etc/rc.d 目录 在/etc/rcld/rc.sysinit 文件中“l0:0:wait:/etc/rc.d/rc 0~ l6:6:wait:/etc/rc.d/rc 6”会根据系统启

动的级别运行不同目录的脚本。在每个级别中会有一些符号链接指向/etc/rc.d/init.d 目录中的

System V 服务(有关 System V 服务见 10.5.1 )启动脚本,用于在进入对应运行级别时启动

指定服务。下面是在运行级别 5 的目录中的内容。

[root@srv ~]# ll /etc/rc.d/rc5.d/ total 292 lrwxrwxrwx 1 root root 17 Feb 23 02:16 K00ipmievd -> ../init.d/ipmievd lrwxrwxrwx 1 root root 17 Feb 23 01:59 K01dnsmasq -> ../init.d/dnsmasq lrwxrwxrwx 1 root root 24 Feb 23 02:03 K02avahi-dnsconfd -> ../init.d/avahi-dnsconfd lrwxrwxrwx 1 root root 24 Feb 23 02:06 K02NetworkManager -> ../init.d/NetworkManager lrwxrwxrwx 1 root root 16 Feb 23 02:00 K05conman -> ../init.d/conman

识骨寻踪——Linux 引导及进程管理 第

299

10lrwxrwxrwx 1 root root 19 Feb 23 01:59 K05saslauthd -> ../init.d/saslauthd lrwxrwxrwx 1 root root 17 Feb 23 01:59 K05wdaemon -> ../init.d/wdaemon lrwxrwxrwx 1 root root 16 Feb 23 02:00 K10psacct -> ../init.d/psacct lrwxrwxrwx 1 root root 13 Feb 23 02:04 K20nfs -> ../init.d/nfs lrwxrwxrwx 1 root root 14 Feb 23 02:04 K24irda -> ../init.d/irda lrwxrwxrwx 1 root root 15 Mar 22 10:33 K35dhcpd -> ../init.d/dhcpd lrwxrwxrwx 1 root root 18 Mar 22 10:33 K35dhcrelay -> ../init.d/dhcrelay lrwxrwxrwx 1 root root 19 Feb 23 02:11 K35vncserver -> ../init.d/vncserver lrwxrwxrwx 1 root root 17 Feb 23 02:16 K35winbind -> ../init.d/winbind lrwxrwxrwx 1 root root 20 Feb 23 01:59 K50netconsole -> ../init.d/netconsole lrwxrwxrwx 1 root root 20 Feb 23 02:04 K69rpcsvcgssd -> ../init.d/rpcsvcgssd lrwxrwxrwx 1 root root 16 Feb 23 02:16 K73ypbind -> ../init.d/ypbind lrwxrwxrwx 1 root root 14 Mar 22 10:33 K74ipmi -> ../init.d/ipmi lrwxrwxrwx 1 root root 14 Feb 23 01:59 K74nscd -> ../init.d/nscd lrwxrwxrwx 1 root root 14 Feb 23 03:40 K74ntpd -> ../init.d/ntpd lrwxrwxrwx 1 root root 15 Feb 23 02:08 K80kdump -> ../init.d/kdump lrwxrwxrwx 1 root root 15 Feb 23 01:59 K85mdmpd -> ../init.d/mdmpd lrwxrwxrwx 1 root root 20 Feb 23 01:59 K87multipathd -> ../init.d/multipathd lrwxrwxrwx 1 root root 24 Feb 23 02:03 K88wpa_supplicant -> ../init.d/wpa_supplicant lrwxrwxrwx 1 root root 14 Feb 23 02:03 K89dund -> ../init.d/dund lrwxrwxrwx 1 root root 18 Feb 23 01:59 K89netplugd -> ../init.d/netplugd lrwxrwxrwx 1 root root 14 Feb 23 02:03 K89pand -> ../init.d/pand lrwxrwxrwx 1 root root 15 Feb 23 01:57 K89rdisc -> ../init.d/rdisc lrwxrwxrwx 1 root root 14 Feb 23 02:16 K91capi -> ../init.d/capi lrwxrwxrwx 1 root root 23 Feb 23 02:00 S00microcode_ctl -> ../init.d/microcode_ctl lrwxrwxrwx 1 root root 22 Feb 23 01:59 S02lvm2-monitor -> ../init.d/lvm2-monitor lrwxrwxrwx 1 root root 22 Feb 23 05:40 S03vmware-tools -> ../init.d/vmware-tools lrwxrwxrwx 1 root root 25 Feb 23 02:00 S04readahead_early -> ../init.d/readahead_early lrwxrwxrwx 1 root root 15 Feb 23 02:07 S05kudzu -> ../init.d/kudzu lrwxrwxrwx 1 root root 18 Feb 23 01:57 S06cpuspeed -> ../init.d/cpuspeed lrwxrwxrwx 1 root root 19 Feb 23 01:56 S08ip6tables -> ../init.d/ip6tables lrwxrwxrwx 1 root root 18 Feb 23 01:56 S08iptables -> ../init.d/iptables lrwxrwxrwx 1 root root 18 Feb 23 01:59 S08mcstrans -> ../init.d/mcstrans lrwxrwxrwx 1 root root 14 Feb 23 02:16 S09isdn -> ../init.d/isdn lrwxrwxrwx 1 root root 17 Feb 23 01:59 S10network -> ../init.d/network lrwxrwxrwx 1 root root 16 Feb 23 01:59 S11auditd -> ../init.d/auditd lrwxrwxrwx 1 root root 21 Feb 23 02:02 S12restorecond -> ../init.d/restorecond lrwxrwxrwx 1 root root 16 Feb 23 01:59 S12syslog -> ../init.d/syslog lrwxrwxrwx 1 root root 20 Feb 23 02:00 S13irqbalance -> ../init.d/irqbalance lrwxrwxrwx 1 root root 17 Feb 23 01:59 S13portmap -> ../init.d/portmap lrwxrwxrwx 1 root root 17 Feb 23 02:04 S14nfslock -> ../init.d/nfslock lrwxrwxrwx 1 root root 19 Feb 23 01:59 S15mdmonitor -> ../init.d/mdmonitor lrwxrwxrwx 1 root root 19 Feb 23 02:04 S18rpcidmapd -> ../init.d/rpcidmapd lrwxrwxrwx 1 root root 17 Feb 23 02:04 S19rpcgssd -> ../init.d/rpcgssd lrwxrwxrwx 1 root root 20 Feb 23 02:02 S22messagebus -> ../init.d/messagebus lrwxrwxrwx 1 root root 24 Feb 23 02:11 S23setroubleshoot -> ../init.d/setroubleshoot lrwxrwxrwx 1 root root 19 Feb 23 02:03 S25bluetooth -> ../init.d/bluetooth lrwxrwxrwx 1 root root 15 Feb 23 01:59 S25netfs -> ../init.d/netfs lrwxrwxrwx 1 root root 15 Feb 23 02:03 S25pcscd -> ../init.d/pcscd lrwxrwxrwx 1 root root 15 Feb 23 02:00 S26acpid -> ../init.d/acpid lrwxrwxrwx 1 root root 14 Feb 23 02:07 S26apmd -> ../init.d/apmd lrwxrwxrwx 1 root root 19 Feb 23 02:06 S26haldaemon -> ../init.d/haldaemon lrwxrwxrwx 1 root root 14 Feb 23 02:03 S26hidd -> ../init.d/hidd lrwxrwxrwx 1 root root 16 Feb 23 02:00 S28autofs -> ../init.d/autofs lrwxrwxrwx 1 root root 15 Feb 23 02:00 S50hplip -> ../init.d/hplip

Linux 从初学到精通

300

lrwxrwxrwx 1 root root 14 Feb 23 02:04 S55sshd -> ../init.d/sshd lrwxrwxrwx 1 root root 14 Feb 23 02:03 S56cups -> ../init.d/cups lrwxrwxrwx 1 root root 20 Feb 23 01:59 S56rawdevices -> ../init.d/rawdevices lrwxrwxrwx 1 root root 16 Feb 23 02:00 S56xinetd -> ../init.d/xinetd lrwxrwxrwx 1 root root 18 Feb 23 01:59 S80sendmail -> ../init.d/sendmail lrwxrwxrwx 1 root root 13 Feb 23 01:57 S85gpm -> ../init.d/gpm lrwxrwxrwx 1 root root 15 Feb 23 01:59 S90crond -> ../init.d/crond lrwxrwxrwx 1 root root 13 Feb 23 02:10 S90xfs -> ../init.d/xfs lrwxrwxrwx 1 root root 17 Feb 23 01:58 S95anacron -> ../init.d/anacron lrwxrwxrwx 1 root root 13 Feb 23 01:59 S95atd -> ../init.d/atd lrwxrwxrwx 1 root root 25 Feb 23 02:00 S96readahead_later -> ../init.d/readahead_later lrwxrwxrwx 1 root root 15 Feb 23 02:07 S97rhnsd -> ../init.d/rhnsd lrwxrwxrwx 1 root root 22 Feb 23 02:06 S97yum-updatesd -> ../init.d/yum-updatesd lrwxrwxrwx 1 root root 22 Feb 23 02:03 S98avahi-daemon -> ../init.d/avahi-daemon lrwxrwxrwx 1 root root 19 Feb 23 02:07 S99firstboot -> ../init.d/firstboot lrwxrwxrwx 1 root root 11 Feb 23 01:59 S99local -> ../rc.local lrwxrwxrwx 1 root root 16 Feb 23 02:00 S99smartd -> ../init.d/smartd

这些符号链接文件的名称由三部分组成:第一部分是文件名的第一个字母,以“K”或

“S”开头的,“K”开头表示要停用链接的这个服务、“S”开头表示要启用链接的这个服务;

第二部分是第 2 位和第 3 位的两个数字,表示执行的先后顺序,数字越小的越先执行,但是

在“K”与“S”执行的先后顺序是先执行“K”停用链接的服务,再执行“S”启用链接的

服务,这是因为要先将所有服务停用类似归零的意思,然后再启用服务,所以执行完这些链

接的程序,就初始化了系统上的服务; 后一部分是链接的 System V 服务名称。

4./etc/rc.d/rc.local 在每个运行级别的执行脚本目录都有一个符号链接指向“/etc/rc.d/rc.local”文件,也就是

说在这些运行级别都会执行“/etc/rc.d/rc.local”文件中的内容。“/etc/rc.d/rc.local”文件是一个

本地定制脚本,在默认情况下该文件中没有任何内容,任何本地定制都可以添加到这个脚本

中。在该脚本中的内容都会在其他所有服务启动之后被执行。

[root@srv ~]# ll /etc/rc.d/rc2.d/S99l* lrwxrwxrwx 1 root root 11 Jan 29 19:16 /etc/rc.d/rc2.d/S99local -> ../rc.local [root@srv ~]# ll /etc/rc.d/rc3.d/S99l* lrwxrwxrwx 1 root root 11 Jan 29 19:16 /etc/rc.d/rc3.d/S99local -> ../rc.local [root@srv ~]# ll /etc/rc.d/rc4.d/S99l* lrwxrwxrwx 1 root root 11 Jan 29 19:16 /etc/rc.d/rc4.d/S99local -> ../rc.local [root@srv ~]# ll /etc/rc.d/rc5.d/S99l* lrwxrwxrwx 1 root root 11 Jan 29 19:16 /etc/rc.d/rc5.d/S99local -> ../rc.local

10.1.4 root 用户密码丢失

在 Linux 启动时可以临时改变 GRUB 的内容,从而实现修改 Linux 内核的启动参数,如

在 root 用户密码丢失时,可以进入单用户模式重新配置 root 用户的密码,具体操作步骤如下。

(1)在启动时出现 GRUB 启动菜单时(如图 10-2 所示)按空格键。

识骨寻踪——Linux 引导及进程管理 第

301

10图 10-2 进入启动选择

(2)在图 10-3 所示的界面输入“e”,如果为 GRUB 配置为保护密码,这里首先需要使

用“p”输入密码。

图 10-3 编辑 grub.conf

图 10-4 修改内核载入方式

(3)在图 10-4 所示的界面选择第 2 行(kernel 所在行),再次输入“e”(该界面中实际

显示的就是 grub.conf 文件中的内容)。

(4)在图 10-5 所示的界面输入空格“1”(进入单用户模式)后按回车键。

图 10-5 进入单用户模式

(5)输入“b”后系统会重新启动,并进入单用户模式,这时使用 passwd 命令修改 root

用户密码,完成后使用 exit,即可使用新设置的 root 密码登录,如图 10-6 所示。

图 10-6 重新设置 root登录密码

10.1.5 修复损坏的/boot 分区

如果由于误操作或其他一些原因造成/boot 分区损坏时,Linux 将无法正常启动。这里如

Linux 从初学到精通

302

果重新安装系统会比较费时费力,因此可以在 Linux 提供的修复模式中将/boot 分区修复后重

新使用,具体操作步骤如下。

(1)从光盘启动,输入“linux rescue”进入修复模式,如图 10-7 所示。

图 10-7 进入修复模式

(2)在选择语言及键盘布局后,选择不从网络启动。因为本章是使用光盘修复,如果配

置了网络安装后,也可从网络启动,如图 10-8 所示。

图 10-8 启动方式

图 10-9 进入修复模式

(3)选择“continue”进入修复模式,如图 10-9 所示。

(4)手工查找根分区并挂载。一般在安装系统时 Linux 会将根分区的卷标设置为“/”,

所以首先建立一个目录然后将根分区挂载,如图 10-10 所示(如果/etc/fstab 以正常工作可跳

过此步)。

识骨寻踪——Linux 引导及进程管理 第

303

10

图 10-10 挂载根分区

在上述操作中:①用于在根目录上建立一个目录后,通过“fdisk –l”命令查找出所有设

备;②用于通过“e2label”命令查看卷标;③用于将找到的根分区挂载到新建立的目录(不

能是/mnt 目录)。

完成后通过以下命令可查看挂载已成功,如图 10-11 所示。

图 10-11 挂载根分区成功

(5)进入/test/etc(因为根分区已被挂载到/test 下,所以 etc 目录也在其下)目录将/fstab

文件修复,通过 exit 重新启动系统。使用和上述相同的方法进入修复模式(如果/etc/fstab 以

正常工作可跳过此步)。

(6)在选择完“continue”后会出现系统根分区(如图 10-12 所示)。要注意其中的

/mnt/sysimage。因为进入修复模式后,系统的根是模拟出来的,这里所做的所有修复工作实

际是对这个模拟的根,而非本机系统的根。而/mnt/sysimage 是本机系统根所在的路径。

图 10-12 系统根分区

(7)由于系统现在找不到光驱设备,所以需要在本机的系统中去新建一个光驱设备,并

Linux 从初学到精通

304

将其挂载到一个目录,如图 10-13 所示。

图 10-13 挂载光驱

在上述操作中:①用于新建光驱设备,其中/dev/tmpcd 目录不能是一个已存在的目录,

在本章中的光驱是一个 CDROM,其他常见光驱的设备建立方法如下;②用于将光驱挂载。

mknod /dev/tmpcd b 22 0 #CDROM mknod /dev/tmpcd b 11 0 #DVDROW mknod /dev/tmpcd b 3 0 #DVD+CDRW mknod /dev/tmpcd b 8 0 #DVDRW

(8)为本机系统强制安装内核。其中“--root=/mnt/sysimage”作用是使用 root 身份在本

机系统的根安装内核,如图 10-14 所示。

图 10-14 安装内核

(9)使用如下命令切换到本机系统的根。

chroot /mnt/sysimage

(10)安装 GRUB,其中/dev/sda 是安装系统的硬盘,如图 10-15 所示。

图 10-15 安装 GRUB

(11)重新生成/initrd-$(uname -r).img 文件($(uname -r)返回当前内核版本)。重新生成文

件主要是因为该文件是根据模拟系统的内核模块生成的,与真实系统不一样,如果这样直接

使用可能会造成一些问题(如驱动)。运行 mkinitrd 命令时,需要到/lib/modules 目录下运行,

如图 10-16 所示。

图 10-16 重新生成 initrd文件

识骨寻踪——Linux 引导及进程管理 第

305

10

(12)编写/boot/grub/grub.conf 文件。在编写时需要输入内核文件的版本号,如果担心输

入错误可以使用如下文件先将文件信息导入到/boot/grub/grub.conf 文件,如图 10-17 所示。

图 10-17 boot目录内容

default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title RHEL root (hd0,0) kernel /vmlinuz-2.6.18-92.el ro root=LABEL=/ rhgb quiet initrd /initrd-2.6.18-92.el5.img

(13)输入两次“exit”重新启动系统即可修复/boot 分区。

Shell 初始化

当 Linux 启动成功出现用户登录界面后,使用者输入用户名和密码登录会根据/etc/passwd

文件中的定义启动指定的 Shell。如果是使用 bash Shell 时,bash Shell 会进行一个初始化。bash

Shell 的初始化会根据用户不同的登录方式而不同:

(1)登录 Shell,用户在登录到一个虚拟控制台、登录一台远程计算机或使用图形界面登

录时看到的第一个 Shell。

(2)非登录 Shell,除登录 Shell 以外所有其他的 Shell,如手动启动一个子 Shell 时,这

个子 Shell 就是非登录 Shell;每次在图形界面打一个新的终端时,这个 Shell 就是一个非登录

Shell。

除此以外,Shell 也可以是交互式 Shell 或非交互式 Shell。通常手动启动的子 Shell 就是

一个交互式 Shell。由于命令替换而被调用的 Shell 就是非交互式 Shell。

登录 Shell、非登录 Shell 以及交互式 Shell、非交互式 Shell 主要的区别是启动时获得初

始化脚本的不同,在 RHEL 5.x 中 bash Shell 初始化时这些不同 Shell 获得初始化脚本的内容

如下。

1.登录 Shell 启动时登录 Shell 首先读取脚本文件/etc/profile,该脚本文件初始化各种环境变量,如

PATH、HOSTNAME 等。

接下来该脚本还会获取与模板/etc/profile.d/*.sh 相匹配的文件。完成后 bash Shell 还会在

用户家目录下查找一系列脚本文件,并获得了存在的第一个文件。在 RHEL 5.x 中默认的文

件是~/.bash_profile,该文件的默认内容只会将路径$HOME/bin 添加到用户的环境变量 PATH

中,寻找并获得~/.bashrc 文件。

Linux 从初学到精通

306

/etc/profile.d 中一般存放一些软件包自定义的环境变量。

2.非登录 Shell(交互式)

只要涉及 bash 程序,用于自定义非登录 Shell 的唯一文件是~/.bashrc。在 RHEL 5.x 中默

认情况下该文件只会寻找并获得/etc/bashrc 文件。

/etc/bashrc 文件会执行几个用户化的内容,如设置用户默认的 umask 等。

3.非登录 Shell(非交互式) 在默认情况下,非交互式 Shell 与非登录 Shell 不获得任何启动文件。

通过设置环境变量 BASH_ENV 可以改变这个行为。

区分多种类型的 Shell 的主要目的是:启动时登录 Shell 在花很多时间定义环境变量的同

时也获得了各种启动脚本。然而当子 Shell 启动时,没有必要重复这些操作。无论什么时候

登录 Shell 生成子进程时,不管是子 Shell 还是其他的,环境变量由 Linux 内核被自动复制到

这个子进程上。如果这个子 Shell 还接着获得了与父登录 Shell 一样的层脚本,就无须再花力

气初始化环境变量了。其他的 Shell 定义,如别名,这是 bash Shell 特有的概念,不是内核层

概念,因此在每次启动新的 Shell 时必须重新初始化。

在启动脚本中,只有登录 Shell 可以获得文件/etc/profile 和~/.bash_profile,而~/.bashrc 和

/etc/bashrc 文件能被所有 Shell 获得。根据一般习惯前两个文件用于配置环境变量,因为这两

个文件只会被初始化一次;后两个文件一般习惯用于 Shell 特有的自定义,如别名。

对于环境变量的配置/etc/profile 可以被 root 用于配置系统范围的,~/.bash_profile 可以被

用户自定义自己的环境。/etc/bashrc 和~/.bashrc 也有类似的情况。

当用户退出时,登录 Shell 会获得文件~/.bash_logout,在 RHEL 5.x 中该文件只会执行命

令 clear,以便退出时从屏幕上清除可能的敏感信息。

Linux 内核模块

内核是操作系统的核心组成部分,内核主要有两个功能:第一个功能是充当资源管理器,

向进程透明地分配内存、CPU 访问等资源;第二个功能就是充当解释器,在进程与硬件之间

转递信息。作为资源管理器的内核执行了许多对计算机系统操作重要的功能,但却不需要用

户有什么特别的干预。这些功能包括:管理请求使用处理器的进程队列、身进程分配内存,

并确保不让一个进程访问属于另一个进程的内存部分。由于这些功能极其复杂,而且由于用

户极少或根本不去影响这些功能,这样一般用户不用花大量的时间精力来学习内核的内容。

作为解释器的内核,计算机中每个硬件会对一定的电信号执行一定的动作,内核就管理着与

硬件设备的所有交流。应用程序一般不与硬件直接交流,而是将请求传送给内核。

提 示

提 示

识骨寻踪——Linux 引导及进程管理 第

307

10

内核一般使用模块与硬件设备交流,每个模块的代码都保存在一个单独的目标文件中。

使用内核模块可以提高 Linux 的灵活性,在使用过程可以根据需要加载或删除内核模块。内

核模块都是为特定的 Linux 版本而设计,内核的版本使用版本号表示,每发布一个新的内核

都会创建新的一套模块,内核模块位于“/lib/modules/$(uname -r)”目录中。在 Linux 中提供

了如下命令用于查看和管理内核模块。

[root@srv ~]# ls /lib/modules/$(uname -r) build kernel modules.alias modules.dep modules.inputmap modules.ofmap

modules.seriomap modules.usbmap updates extra misc modules.ccwmap modules.ieee1394map modules.isapnpmap modules.pcimap modules.symbols source weak-updates

1.lsmod:显示当前装载到内核的模块 lsmod 命令用于显示当前装载到内核的模块,该命令不需要使用选项,而且只有 root 用

户可以使用。

[root@srv ~]# lsmod Module Size Used by nls_utf8 6209 0 autofs4 29253 3 hidp 23105 2 rfcomm 42457 0 l2cap 29505 10 hidp,rfcomm bluetooth 53925 5 hidp,rfcomm,l2cap lockd 63081 0 sunrpc 145405 2 lockd vmblock 20512 4 vsock 54432 0 vmmemctl 16956 0 acpiphp 27089 0 ipv6 267361 16 xfrm_nalgo 13381 1 ipv6 crypto_api 12609 1 xfrm_nalgo dm_mirror 24393 0 dm_multipath 24909 0 scsi_dh 11713 1 dm_multipath video 21193 0 hwmon 7365 0 backlight 10049 1 video sbs 18533 0 i2c_ec 9025 1 sbs button 10705 0 battery 13637 0 asus_acpi 19289 0 ac 9157 0 lp 15849 0 sg 36573 0 floppy 57124 0 i2c_piix4 13133 0 pcspkr 7105 0 i2c_core 23745 2 i2c_ec,i2c_piix4 vmci 38308 1 vsock mii 9409 0 serio_raw 10693 0

Linux 从初学到精通

308

parport_pc 29157 1 parport 37513 2 lp,parport_pc ide_cd 40161 0 cdrom 36577 1 ide_cd pvscsi 20772 0 vmxnet3 37764 0 vmxnet 24836 0 dm_raid45 67145 0 dm_message 6977 1 dm_raid45 dm_region_hash 15681 1 dm_raid45 dm_log 14657 3 dm_mirror,dm_raid45,dm_region_hash dm_mod 63225 4 dm_mirror,dm_multipath,dm_raid45,dm_log dm_mem_cache 9537 1 dm_raid45 ata_piix 23621 0 libata 157317 1 ata_piix mptspi 23625 8 mptscsih 37313 1 mptspi mptbase 80229 2 mptspi,mptscsih scsi_transport_spi 26305 1 mptspi sd_mod 25281 9 scsi_mod 141717 8 scsi_dh,sg,pvscsi,libata,mptspi,mptscsih,scsi_transport_spi,sd_mod ext3 125001 7 jbd 57065 1 ext3 uhci_hcd 25421 0 ohci_hcd 24553 0 ehci_hcd 33869 0

2.modprobe:装载内核模块 modprobe 命令用于装载模块,如果指定的模块依赖于一个不存在于内存中的模块时,该

命令会先装被依赖的模块,然后装被请求的模块,内核模块的依赖关系是保存在

“/lib/modules/$(uname -r)/modules.dep”文件中。通过 modprobe 命令装载的模块在重新启动后

必须再次手动装载,所以为了保证每次重新启动后模块可以被装载,可以将装载模块的命令

放入“modprobe”文件中。

[root@srv ~]# modprobe ip_nat_ftp #装载名为“ip_nat_ftp”的内核模块。

3.rmmod:从内存中删除内核模块

使用 rmmod 命令从内存中删除内核模块时,不带选项只指定模块名称时只会删除指定的

模块,使用“-r”选项后会删除指定模块及任何不使用的依赖模块。

/proc 目录详解

proc 文件系统是一个伪文件系统,只存在内存当中,而不占用硬盘的空间。proc 以文件

系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过 proc 得到系统的

信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或

应用程序读取 proc 文件时,proc 文件系统是动态从系统内核读出所需信息并提交的。proc 文

识骨寻踪——Linux 引导及进程管理 第

309

10

件系统在/etc/fstab 文件中被挂载到/proc 目录,该目录中常见的子目录中内容如下:

apm:高级电源管理信息。 cmdline:内核命令行。

cpuinfo:关于 cpu 信息。 evices:可以用到的设备信息。

dma:使用的 DMA 通道。 ilesystems:支持的文件系统。

interrupts:中断的使用信息。 ioports:I/O 端口的使用信息。

kmsg:内核消息。 ksyms:内核符号表。

loadavg:负载均衡信息。 locks:内核锁。

meminfo:内存信息。 misc:杂项信息。

modules:加载模块列表。 mounts:加载的文件系统。

partitions:系统识别的分区表信息。 rtc:实时时钟信息。

slabinfo:slab 池信息。 stat:全面统计状态表。

swaps:对换空间的利用情况。 version:内核版本信息。

uptime:系统正常运行时间。

在/proc 目录中并不是所有在系统中都有,这取决于内核配置和装载的模块。另外在/proc

下还有三个很重要的目录 net、scsi 和 sys。sys 目录是可写的,可以通过该目录中的内容来访

问或修改内核的参数,而 net 和 scsi 则依赖于内核配置。除了上述目录以外,还有的是一些

以数字命名的目录,是进程目录。系统中当前运行的每一个进程都有对应的一个目录在/proc

下,以进程的 PID 号为目录名,这些目录是读取进程信息的接口。而 self 目录是一符号链接,

用于读取进程本身的信息接口。

在/proc/sys/net/ipv4/目录下每一个文件是一个和 TCP/IP 协议相关的各种参数,其中常见

的文件含义如下:

(1)ip_forward:在网络本地接口之间转发数据报,“0”表示关闭该功能;非“0”表示

开启该功能,默认是“0”。

(2)ip_default_ttl:指定 IP 数据报的 Time To Live 值,默认为 64。

(3)ip_no_pmtu_disc:关闭路径 MTU 探测,默认是“0”。

(4)ipfrag_high_thresh:指定用于组装分段的 IP 包的 大内存量。当 ipfrag_high_thresh

数量的内存被分配用来组装 IP 包,则 IP 分片处理器将丢弃数据报直到 ipfrag_low_thresh 数

量的内存被用来组装 IP 包。

(5)ipfrag_time:指定保存一个 IP 分片在内存中的时间。

(6)inet_peer_minttl:指定条目的 低存活期。在重组端必须要有足够的碎片(fragment)

存活期。这个 低存活期必须保证缓冲池容积是否少于 inet_peer_threshold。该值以 jiffies

为单位测量。

(7)inet_peer_maxttl 参数类型:指定条目的 大存活期。在此期限到达之后,如果缓冲

池没有耗尽压力的话不使用的条目将会超时。该值以 jiffies 为单位测量。

(8)inet_peer_gc_mintime:指定废物收集(GC)通过的 短间隔。这个间隔会影响到缓

冲池中内存的高压力。该值以 jiffies 为单位测量。

(9)inet_peer_gc_maxtime:指定废物收集(GC)通过的 大间隔,这个间隔会影响到

Linux 从初学到精通

310

缓冲池中内存的低压力。该值以 jiffies 为单位测量。

(10)tcp_syn_retrie:对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。

该参数值不应该大于 255,默认值是 5,对应于 180 秒左右。

(11)tcp_synack_retries:对于远端的连接请求 SYN,内核会发送 SYN+ACK 数据报,

以确认收到上一个 SYN 连接请求包。这就是所谓的三次握手机制的第二个步骤。这里决定内

核在放弃连接之前所送出的 SYN+ACK 数目。

(12)tcp_keepalive_time:当 keepalive 打开的情况下,TCP 发送 keepalive 消息的频率,

默认值是 2 个小时。

(13)tcp_keepalive_probes:TCP 发送 keepalive 探测以确定该连接已经断开的次数,默

认值是 9。

(14)tcp_keepalive_interval:指定探测消息发送的频率,乘以 tcp_keepalive_probes 就得

到对于从开始探测以来没有响应的连接杀除的时间。默认值为 75 秒,也就是没有活动的连接

将在大约 11 分钟以后将被丢弃。

(15)tcp_retries1:当出现可疑情况而必须向网络层报告这个可疑状况之前,需要进行多

少次重试。 低的 RFC 数值是 3,这也是默认值,根据 RTO 的值在 3 秒至 8 分钟之间。

(16)tcp_retries2:在丢弃激活的 TCP 连接之前,需要进行多少次重试。RFC1122 规定,

该值必须大于 100 秒。默认值为 15,根据 RTO 的值来决定,相当于 13~30 分钟。

(17)tcp_orphan_retries:在近端丢弃 TCP 连接之前,要进行多少次重试。默认值是 7 个,

相当于 50 秒至 16 分钟,视 RTO 而定。如果系统是负载很大的 Web 服务器,那么需要降低

该值,这类 sockets 可能会耗费大量的资源。

(18)tcp_fin_timeout:对于本端断开的 socket 连接,TCP 保持在 FIN-WAIT-2 状态的时

间。对方可能会断开连接或一直不结束连接或不可预料的进程死亡。默认值为 60 秒。

(19)tcp_max_tw_buckets:系统在同时所处理的 大 timewait sockets 数目。如果超过此

数,time-wait socket 会被立即砍除并且显示警告信息。之所以要设定这个限制,纯粹为了抵

御那些简单的 DoS 攻击,一般不需要人为地降低这个限制。

(20)tcp_tw_recycle:打开快速 TIME-WAIT sockets 回收,默认值是 1。一般不需要人为

修改这个值。

(21)tcp_max_orphans :系统所能处理不属于任何进程的 TCP sockets 大数量。如超

过这个数量,那么不属于任何进程的连接会被立即 reset,并同时显示警告信息。之所以要设

定这个限制,纯粹为了抵御那些简单的 DoS 攻击,一般不需要人为地降低这个限制。

(22)tcp_abort_on_overflow:当守护进程太忙而不能接受新的连接,就向对方发送 reset

消息,默认值是 false。这意味着当溢出的原因是因为一个偶然的猝发,那么连接将恢复

状态。只有在确信守护进程真的不能完成连接请求时才打开该选项,该选项会影响客户的

使用。

(23)tcp_syncookies:只有在内核编译时选择了 CONFIG_SYNCOOKIES 时才会发生作用。

当出现 SYN 等候队列溢出时向对方发送 syncookies。目的是防止 syn flood 攻击,默认值是 false。

(24)tcp_fack:是否打开 FACK 拥塞避免和快速重传功能。

(25)tcp_dsack:是否允许 TCP 发送两个完全相同的 SACK。

识骨寻踪——Linux 引导及进程管理 第

311

10

(26)tcp_ecn:是否打开 TCP 的直接拥塞通告功能。

(27)tcp_reordering:TCP 流中重排序的数据报 大数量,默认值是 3 。

(28)icmp_echo_ignore_all:是否忽略 ICMP 数据报。

可以通过改变目录中文件的内容来改变内核的某些参数,目录中的文件都是普通的文本

文件可以直接使用 vim 编辑,但是由于 proc 文件系统只存在于内存中所以重新启动后这些配

置会还原,如果希望永久地保存改变有以下两种方法。

(1)将改变保存到/etc/rc.d/rc.local 文件。由于每次开机后/etc/rc.d/rc.local 文件的内容都会

被执行,所以可以将对 proc 文件系统的修改命令放入该文件中。如运行下面的命令后,

/proc/sys/net/ipv4/ip_forward 文件的内容都会被修改为“1”。

[root@srv ~]# echo "echo '1' > /proc/sys/net/ipv4/ip_forward" >> /etc/rc.d/rc.local

(2)修改/etc/sysctl.conf 文件。该文件中的配置内容在每次开机后会被系统读取,可以直

接使用 vim 编译该文件。编辑完成后可以重新启动计算机或使用“sysctl -p”使配置生效。在

/etc/sysctl.conf 文件中参数名称是/proc 下文件的相对路径将“/”换成“.”后加上文件名,如

“net.ipv4.ip_forward”参数就是对应/proc/net/ipv4 目录中的 ip_forward 文件。

Linux 服务类型

在讲述 Linux 的服务类型之前先了解一下一个 Linux 中的概念:守护进程(daemon)。守

护进程是那些在后台运行的进程、脱离控制终端、执行时通常与键盘输入无关的任务。守护

进程通常与某个服务相关联,如 FTP 服务、DNS 服务。这些服务在运行时必须有相应的守护

进程来进行服务需求的侦听。

作为一个操作系统 Linux 运行着各种各样的服务,这些服务有的是为了满足本机管理需

要、有的是为了给其他客户机提供相应的功能。这些服务可以为分以下几种类型。

10.5.1 Standalone 服务

Standalone 服务即独立服务,这种服务在启动之后会常驻内存。Standalone 服务 大的优

势是由于其常驻内存在响应请求时速度比较快。Standalone 服务分为两种类型:

1.由 init 控制的服务 这类服务一般都是一些系统级别的服务,配置文件是/etc/inittab。该文件被修改后可以使

用“init q”命令或重新启动计算机使其配置生效。

2.System V 服务 目前 Linux 大多数服务属于这种类型服务,System V 服务的启动脚本一般位于

/etc/rc.d/init.d 目录。在每个运行级别对应的目录(/etc/rc.d/rc0.d~/etc/rc.d/rc6.d)中会有一个

符号链接指向/etc/rc.d/init.d 目录中的 System V 服务启动脚本,用于在进入对应运行级别时启

动指定服务。/etc/rc.d/init.d 目录在 RHEL 5.x 中发挥着特殊的作用,该目录只包括共享一个相

Linux 从初学到精通

312

似接口的脚本。

[root@srv ~]# cd /etc/rc.d/init.d/ [root@srv init.d]# ls acpid bluetooth firstboot ipmi kudzu netconsole ntpd readahead_later setroubleshoot winbind anacron conman functions ipmievd lvm2-monitor netfs pand restorecond single wpa_supplicant apmd cpuspeed gpm iptables mcstrans netplugd pcscd rhnsd smartd xfs atd crond haldaemon irda mdmonitor network portmap rpcgssd sshd xinetd auditd cups halt irqbalance mdmpd NetworkManager psacct rpcidmapd syslog ypbind autofs cups-config-daemon hidd kdump messagebus nfs rawdevices rpcsvcgssd vmware-tools yum-updatesd avahi-daemon dnsmasq hplip killall microcode_ctl nfslock rdisc saslauthd vncserver avahi-dnsconfd dund ip6tables krb524 multipathd nscd readahead_early sendmail wdaemon [root@srv init.d]# ./atd Usage: ./atd {start|stop|restart|condrestart|status}

这些脚本被称为服务脚本,每个脚本都有单个选项调用, 常见的选项包括:start、stop、

restart、reload、status。一般服务脚本的名称就是服务的执行文件名称加一个字母“d”,如

/etc/rc.d.init.d/atd 服务脚本就是用于管理/usr/bin/at 守护进程,该守护进程是管理一次性任务

的服务。下面/etc/rc.d.init.d/atd 使用选项管理/usr/bin/at 守护进程。

查看/usr/bin/at 守护进程当前的状态。

[root@srv init.d]# ./atd status

/usr/bin/at 守护进程目前正在运行。

atd (pid 3434) is running... [root@srv init.d]# ps aux | grep atd root 3052 0.0 0.1 1868 732 ? Ss 16:09 0:00 rpc.statd root 3434 0.0 0.0 2276 432 ? Ss 16:10 0:00 /usr/sbin/atd root 15211 0.0 0.1 3920 664 pts/1 R+ 18:29 0:00 grep atd

停止/usr/bin/at 守护进程。

[root@srv init.d]# ./atd stop Stopping atd: [ OK ]

/usr/bin/at 守护进程目前已停止。

[root@srv init.d]# ./atd status atd is stopped [root@srv init.d]# ps aux | grep atd root 3052 0.0 0.1 1868 732 ? Ss 16:09 0:00 rpc.statd root 15232 0.0 0.1 3920 664 pts/1 R+ 18:30 0:00 grep atd

启动/usr/bin/at 守护进程。

[root@srv init.d]# ./atd start

识骨寻踪——Linux 引导及进程管理 第

313

10Starting atd: [ OK ]

/usr/bin/at 守护进程目前正在运行。

[root@srv init.d]# ./atd status atd (pid 15259) is running...

重新启动(先停止再运行)/usr/bin/at 守护进程。

[root@srv init.d]# ./atd restart Stopping atd: [ OK ] Starting atd: [ OK ]

在服务脚本中有一个 reload 选项用于在不停止服务的情况下重新载入服务的配置文件,

对于那些必须长期运行的服务,在修改配置文件后可使用该选项。

在 RHEL 5.x 中提供一个“service”快捷命令,该命令把 Linux 服务的名称作为第一个选

项,把单个字的命令,如 stop、restart 作为第二个选项。在下面的例子中的 2 条命令都是重

新启动 atd 服务。

[root@srv init.d]# ./atd restart [root@srv init.d]# service atd restart

Linux 引导时,会运行/etc/rc.d/目录下对应运行级别的目录是启动服务的脚本,这些脚本

会将某些服务自动运行,在 RHEL 5.x 中可以通过以下几种方法实现服务在开机时自动加载。

(1)使用 ntsysv 命令,该命令可以在一个伪图形界面中配置服务在指定级别中下次开机

时是否自动加载。该命令语法如下。

ntsysv [--level <运行级别,...>]

常用指数:

常用选项:

--level <运行级别,...>:指定配置的运行级别,如不指定则表示配置的是运行级别。

运行 ntsysv 后可以出现的窗口中通过“↑”、“↓”选择服务;使用空格键勾选服务,被

勾选的服务在下次启动时会被自动加载;配置完成后使用 Tab 键切换到“OK”按钮,使用空

格键保存配置(如图 10-18 所示)。如使用“ntsysv --level 3,5”表示配置运行级别 3 和 5 下哪

些服务需要自动加载。

(2)使用“system-config-services”,这是一个 RedHat 提供的图形工具(如图 10-19 所示),

可以配置服务在指定级别中下次启动时是否自动加载。打开该工具后默认配置的是运行级别

5,可以在“Edit Runlevel”中选择需要配置的运行级别。勾选服务名称后,指定服务在下次

开机时会自动运行,也可以选择服务后通过单击“Start”、“Stop”、“Restart”按钮实现服务

的运行、停止、重新启动。

Linux 从初学到精通

314

图 10-18 ntsysv

图 10-19 system-config-services

(3)使用 chkconfig 命令,该命令可以在字符模式下配置服务在指定运行级别中下次启动

时是否自动加载。使用“chkconfig --list”可以查看所有服务在每个运行级别自动加载的情况;

也可以使用“chkconfig --list <服务名>”查看指定服务在每个运行级别自动加载的情况,如

“chkconfig --list atd”就是表示查看“atd”服务在每个运行级别自动加载的情况。在显示内容

中每行一个服务,第一列是服务名,后面每列中第一个字符表示运行级别,冒号后面是“on”

表示在该运行级别下次启动时服务会自动加载;冒号后面是“off”表示在该运行级别下次启

动时服务不会自动加载。

[root@srv ~]# chkconfig --list NetworkManager 0:off 1:off 2:off 3:off 4:off 5:off 6:off acpid 0:off 1:off 2:on 3:on 4:on 5:on 6:off anacron 0:off 1:off 2:on 3:on 4:on 5:on 6:off apmd 0:off 1:off 2:on 3:on 4:on 5:on 6:off atd 0:off 1:off 2:off 3:on 4:on 5:on 6:off auditd 0:off 1:off 2:on 3:on 4:on 5:on 6:off autofs 0:off 1:off 2:off 3:on 4:on 5:on 6:off avahi-daemon 0:off 1:off 2:off 3:on 4:on 5:on 6:off avahi-dnsconfd 0:off 1:off 2:off 3:off 4:off 5:off 6:off bluetooth 0:off 1:off 2:on 3:on 4:on 5:on 6:off conman 0:off 1:off 2:off 3:off 4:off 5:off 6:off cpuspeed 0:off 1:on 2:on 3:on 4:on 5:on 6:off crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off cups 0:off 1:off 2:on 3:on 4:on 5:on 6:off dnsmasq 0:off 1:off 2:off 3:off 4:off 5:off 6:off dund 0:off 1:off 2:off 3:off 4:off 5:off 6:off firstboot 0:off 1:off 2:off 3:on 4:off 5:on 6:off gpm 0:off 1:off 2:on 3:on 4:on 5:on 6:off haldaemon 0:off 1:off 2:off 3:on 4:on 5:on 6:off hidd 0:off 1:off 2:on 3:on 4:on 5:on 6:off hplip 0:off 1:off 2:on 3:on 4:on 5:on 6:off ip6tables 0:off 1:off 2:on 3:on 4:on 5:on 6:off ipmi 0:off 1:off 2:off 3:off 4:off 5:off 6:off ipmievd 0:off 1:off 2:off 3:off 4:off 5:off 6:off iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off irda 0:off 1:off 2:off 3:off 4:off 5:off 6:off

识骨寻踪——Linux 引导及进程管理 第

315

10irqbalance 0:off 1:off 2:on 3:on 4:on 5:on 6:off kdump 0:off 1:off 2:off 3:off 4:off 5:off 6:off kudzu 0:off 1:off 2:off 3:on 4:on 5:on 6:off lvm2-monitor 0:off 1:on 2:on 3:on 4:on 5:on 6:off mcstrans 0:off 1:off 2:on 3:on 4:on 5:on 6:off mdmonitor 0:off 1:off 2:on 3:on 4:on 5:on 6:off mdmpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off messagebus 0:off 1:off 2:off 3:on 4:on 5:on 6:off microcode_ctl 0:off 1:off 2:on 3:on 4:on 5:on 6:off multipathd 0:off 1:off 2:off 3:off 4:off 5:off 6:off netconsole 0:off 1:off 2:off 3:off 4:off 5:off 6:off netfs 0:off 1:off 2:off 3:on 4:on 5:on 6:off netplugd 0:off 1:off 2:off 3:off 4:off 5:off 6:off network 0:off 1:off 2:on 3:on 4:on 5:on 6:off nfs 0:off 1:off 2:off 3:off 4:off 5:off 6:off nfslock 0:off 1:off 2:off 3:on 4:on 5:on 6:off nscd 0:off 1:off 2:off 3:off 4:off 5:off 6:off ntpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off pand 0:off 1:off 2:off 3:off 4:off 5:off 6:off pcscd 0:off 1:off 2:on 3:on 4:on 5:on 6:off portmap 0:off 1:off 2:off 3:on 4:on 5:on 6:off psacct 0:off 1:off 2:off 3:off 4:off 5:off 6:off rawdevices 0:off 1:off 2:off 3:on 4:on 5:on 6:off rdisc 0:off 1:off 2:off 3:off 4:off 5:off 6:off readahead_early 0:off 1:off 2:on 3:on 4:on 5:on 6:off readahead_later 0:off 1:off 2:off 3:off 4:off 5:on 6:off restorecond 0:off 1:off 2:on 3:on 4:on 5:on 6:off rhnsd 0:off 1:off 2:off 3:on 4:on 5:on 6:off rpcgssd 0:off 1:off 2:off 3:on 4:on 5:on 6:off rpcidmapd 0:off 1:off 2:off 3:on 4:on 5:on 6:off rpcsvcgssd 0:off 1:off 2:off 3:off 4:off 5:off 6:off saslauthd 0:off 1:off 2:off 3:off 4:off 5:off 6:off sendmail 0:off 1:off 2:on 3:on 4:on 5:on 6:off setroubleshoot 0:off 1:off 2:off 3:on 4:on 5:on 6:off smartd 0:off 1:off 2:on 3:on 4:on 5:on 6:off sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off syslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off vmware-tools 0:off 1:off 2:on 3:on 4:off 5:on 6:off vncserver 0:off 1:off 2:off 3:off 4:off 5:off 6:off wdaemon 0:off 1:off 2:off 3:off 4:off 5:off 6:off winbind 0:off 1:off 2:off 3:off 4:off 5:off 6:off wpa_supplicant 0:off 1:off 2:off 3:off 4:off 5:off 6:off xfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off xinetd 0:off 1:off 2:off 3:on 4:on 5:on 6:off ypbind 0:off 1:off 2:off 3:off 4:off 5:off 6:off yum-updatesd 0:off 1:off 2:on 3:on 4:on 5:on 6:off xinetd based services: #这行以后显示的是 Transient服务的情况。 chargen-dgram: off chargen-stream: off daytime-dgram: off daytime-stream: off discard-dgram: off discard-stream: off echo-dgram: off

Linux 从初学到精通

316

echo-stream: off eklogin: off ekrb5-telnet: off gssftp: off klogin: off krb5-telnet: off kshell: off rmcp: off rsync: off tcpmux-server: off tftp: off time-dgram: off time-stream: o ff

使用“chkconfig [--level <运行级别>] <服务名> <on|off>”的方式配置服务在指定级别是

否自动加载。

指定服务 atd 在运行级别 3 上设置为下次开机时自动运行。

[root@srv ~]# chkconfig --level 3 atd on

指定服务 atd 在运行级别 3 上设置为下次开机时不自动运行。

[root@srv ~]# chkconfig --level 3 atd off

指定服务 atd 在运行级别 2、3、4、5 上设置为下次开机时自动运行。

[root@srv ~]# chkconfig atd on

指定服务 atd 在运行级别 2、3、4、5 上设置为下次开机时不自动运行。

[root@srv ~]# chkconfig atd off

10.5.2 Transient 服务

Transient 服务即超级服务,这种服务在启动后并不会常驻内存,而是由一个名为“xinetd”

的 System V 服务管理,当有用户请求使用超级服务时,会有“xinetd”服务去唤醒这些超级服务。

超级服务的优势就是在无人使用时不会占用系统资源,但是超级服务的响应速度没有 System V

服务快,原因很简单,当有人使用超级服务时这个服务会有一个被“xinetd”服务唤醒的过程。

xinetd 服务自身是一个 System V 服务,可通过“service”和“chkconfig”命令配置其启

动和自动加载。在 RHEL 5.x 中所有安装的超级服务配置文件都在/etc/xinetd.d 目录中,每个

配置文件的名称与服务名相同,如 telnet 服务的配置文件名称就是/etc/xinetd.d/telnet。这些超

级服务的配置文件都会继承/etc/xinetd.conf 文件的内容,也就是每一个超级服务的配置文件中

内容由两部分组成:第一部分是/etc/xinetd.conf 文件的内容;第二部分是/etc/xinetd.d 目录中

对应配置文件的内容,当两部分的内容发生冲突的,会使用/etc/xinetd.d 目录中对应配置文件

的内容。下面先安装 telnet 服务后,通过其讲解超级服务的配置方法。

挂载 RHEL 5.4 光盘,并安装 telnet-server。

[root@srv ~]# mount /dev/cdrom /mnt [root@srv ~]# rpm -ivh /mnt/Server/telnet-server-0.17-39.el5.i386.rpm

识骨寻踪——Linux 引导及进程管理 第

317

10

/etc/xinetd.conf 文件是超级服务的全局配置文件,其中各行作用如下。

①:定义日志等级是 info。

②、③、⑧:该选项在后述内容中讲解。

④:超过 50 个连接,暂停该服务 10 秒。

⑤:指定同时运行的 大进程为 50。

⑥:同一个 IP 地址上 多可以建立的实例数目为 10。

⑦:不启用支持 IPv6。

⑨:指定服务所继承的 umask。

⑩:该目录下所有脚本会继承该文件的内容。

[root@srv ~]# grep -v ^# /etc/xinetd.conf | grep -v ^$ defaults { log_type = SYSLOG daemon info ① log_on_failure = HOST ② log_on_success = PID HOST DURATION EXIT ③ cps = 50 10 ④ instances = 50 ⑤ per_source = 10 ⑥ v6only = no ⑦ groups = yes ⑧ umask = 002 ⑨ } includedir /etc/xinetd.d ⑩

/etc/xinetd.d/telnet 文件是 telnet 的配置文件,其中各行作用如下。

①:表示这是定义的 telnet 服务的选项值。

②、③、④、⑦:该选项在后述内容中讲解。

⑤:设置服务进程的用户,但是如果 xinetd 的有效 UID 不是 0,该属性无效。

⑥:要激活的进程,必须指定完整路径。

⑧:禁止启用该服务。

[root@srv ~]# grep -v ^# /etc/xinetd.d/telnet service telnet ①

{ flags = REUSE ② socket_type = stream ③ wait = no ④ user = root ⑤ server = /usr/sbin/in.telnetd ⑥ log_on_failure += USERID ⑦ disable = yes ⑧ }

对于/etc/xinetd.conf 文件的配置还有以下几点需要说明:

(1)log_on_success:当客户端访问服务成功时在日志中记录的内容,该选项值可以使用

以下一个或多个的任意组合:PID(服务进程的 PID)、HOST(客户端 IP 地址)、USERID(通

Linux 从初学到精通

318

过 RFC1413 调用捕获客户机用户的 UID,只可用于多线程流服务)、EXIT(登记进程终止和

状态)、DURATION(登记会话持续期)。

(2)log_on_failure:当客户端访问服务失败时在日志中记录的内容,该选项值可以使用

以下一个或多个的任意组合:ATTEMPT(记录一次失败的尝试,所有其他值隐含为这个值)、

HOST(客户端 IP 地址)、USERID(通过 RFC1413 调用捕获客户机用户的 UID,只可用于

多线程流服务)、RECORD(记录附加的客户端信息)。在上面的/etc/xinetd.d/telnet 文件中

log_on_failure 选项值使用的是“+=”,而不是一般的“=”,“+=”表示 log_on_failure 选项所

记录的实际内容是/etc/xinetd.conf 文件中 log_on_failure 选项的内容加上/etc/xinetd.d/telnet 文

件中 log_on_failure 选项的内容,log_on_success 选项也可以采用这样的方式赋值。

(3)flags:可以是以下一个或多个选项的任意组合:

REUSE:设置TCP/IP socket可重用。也就是在该服务 socket中设置SO_REUSEADDR

标志。

INTERCEPT:截获数据报进行访问检查,以确定是否来自于允许进行连接的位置。

INTERNAL 服务和多线程服务不可使用该属性值。

NORETRY:如果 fork 失败,不重试。

IDONLY:只有在远端识别远程用户时才接受该连接(也就是远程系统必须运行 ident

服务器),该标记只适用于面向连接的服务。如没有使用 USERID 记录选项则该标

记无效,log_on_success 或 log_on_failure 属性设置 USERID 值以使该值生效,该选

择只适用于多线程的流服务。

NAMEINARGS:允许 server_args 属性中的第一个选项是进程的完全合法路径,此

时,server 属性时采用 inetd 的方式来指定。

NODELAY:如果服务为 TCP 类型的服务,并且 NODELAY 标记被设置,则

TCP_NODELAY 标记将被设置,如果服务不是 TCP 类型的服务则该标记无效

DISABLE:具有 DISABLE 标记的服务表示被禁用,该标记将覆盖 enable 的指定。

也就是说,如果即使指定了”enable=foo”,如果 foo 具有 DISABLE 标记,那么 foo

仍将被禁用。使用了该标记的服务不会被提醒。

KEEPALIVE:如果一个 TCP 服务设置了 KEEPALIVE 标记,那么该服务的 socket

将被设置 SO_KEEPALIVE 标记,对非 TCP 类型的服务设置该标记无任何作用。

NOLIBWRAP:禁用 TCP Wrappers 库来决定一个服务的请求访问控制。xinetd 服务

是需要长时间的运行,一直调用 libwrap 函数库是不可取的,这种类型的服务就需

要设置该标记,这样可以直接调用而无须调用 libwrap 函数库来控制访问请求。

(4)disable:可以设置为 yes 或 no,设置为 yes 将禁用一个服务。

(5)socket_type:指定使用的 TCP/IP socket 类型,可以使用的值包括 stream、dgram、raw

和 seqpacket。

(6)protocol:指定该服务使用的协议,其值必须是在/etc/protocols 中定义的。如果不指

定,使用该项服务的默认协议。

(7)wait:可以设置为 yes 或 no,如果是 yes,那么 xinetd 会启动对方请求的进程并停止

识骨寻踪——Linux 引导及进程管理 第

319

10

处理该项服务的其他请求直到该进程终止,适合于单线程服务;如果是 no,那 xinetd 会为每

个请求启动一个进程,而不管先前启动的进程的状态,适合于多线程服务。

(8)group:设置进程的 GID,但是如果 xinetd 的有效 UID 不是 0,该属性无效。

(9)instances:接受一个大于或等于 1 的整数或 UNLIMITED,指定可同时运行的 大进

程数。UNLIMITED 意味着 xinetd 对该数没有限制。

(10)nice:指定进程的 nice 值,nice 值决定了服务的优先级,选项值是一个整数数字,

也可以为负数。

(11)access_time:设置服务的可用时段,也就是说,在哪一段时间里可以使用本服务。

格式是 hh:mm_hh:mm,如 09:00-17:00 意味着从早上 9 点到下午 5 点之间的时间段可使用

这项服务。

(12)redirect:该选项语法为“redirect=<IP 地址> <端口>”,该选项可以把 TCP 服务重

定向到另一个系统。如果使用该选项,就忽略 server 属性。

(13)bind:把一项服务绑定到一个网络接口。语法是 bind=“IP 地址|网络接口”。这意

味着所配置的超级服务可以监听一个本地的安全的网络接口,而不是一个外部的网络接口。

(14)banner:无论该连接是否被允许,将该选项指定的文件内容显示给客户端。

(15)banner_success:当连接被允许通过时,将该选项指定的文件内容显示给客户端。

(16)banner_fail:当连接被禁止通过时,将该选项指定的文件内容显示给客户端。

(17)per_source:参数值可以为整数或者 UNLIMITED 关键字,表示同一个 IP 地址上

多可以建立的实例数目。本属性也可以定义在 default 部分。

(18)max_load:用一个浮点数作为负载系数,当负载达到这个数目的时候,该服务将停

止处理后续的连接。

(19)groups:可以设置为 yes 或 no。如果设置为 yes,将允许对该服务起作用的组中包

含的用户来访问,如果设置为 no,将没有这个补充。

(20)umask:指定服务所继承的 umask。参数值应该是一个八进制数字,该选项也可以

设置到 defaults 项中。xinetd 自己的 umask 默认是 022,如果没有设置 umask 属性,那么所有

xinetd 的子进程(超级服务)的 umask 也将是 022。

(21)only_from:用空格分开的允许访问服务的客户机列表。

(22)no_access:用空格分开的拒绝访问服务的客户机列表。

在 only_from、no_access 选项中指定客户端时可以使用表 10-1 中的方式,当 no_access

与 only_from 配置发生冲突时以 no_access 为准。

表 10-1 超级服务访问控制客户端指定方法

客户端指定方法 示例 满足示例的客户端

单一主机 192.168.0.30 IP 地址为 192.168.0.30

指定网段 192.168.0.0/24 IP 地址包括在 192.168.0.0/24 的网段

指定 DNS 后缀 .example.com 所有 DNS 后缀为.example.com 的主机

指定 FQDN client1.example.com FQDN 为 client1.example.com 的主机

Linux 从初学到精通

320

如果只是简单的需要使用一个超级服务,如 telnet,在安装完成后只需要将

/etc/xinetd.d/telnet 文件中 disable 选项值改为 no,然后重新启动 xinetd 服务即可。为什么不是

启动 telnet 服务呢?因为所有超级服务都是由 xinetd 服务管理,所有需要重新启动 xinetd 服

务让 telnet 服务的配置文件生效。

[root@srv ~]# service xinetd restart Stopping xinetd: [ OK ] Starting xinetd: [ OK ]

这里的 telnet 服务的 23 端口是被 xinetd 服务侦听,当有客户端访问 telnet 服务时,xinetd

服务会唤醒 telnet 服务。

[root@srv ~]# netstat -tunlp | grep 23 tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN 6614/xinetd

Linux 进程管理

Linux 系统中几乎任何操作都会以进程的形式进行,如浏览网页浏览器就作为进程运行,

使用每个命令都会作为进程运行。Linux 是一个多进程操作系统,每个程序启动时,可以创

建一个或几个进程,与其他程序创建的进程共同运行在 Linux 内核空间中。每个进程都是一

个独立的任务,进程依照操作系统内核制定的规则,轮换着被 CPU 执行。每个单独的进程运

行在自己的虚拟地址空间中,并且只能通过安全的内核管理机制与其他进程交互。

在进程的生存期内,将使用许多系统资源。进程使用系统 CPU 运行自己的指令,并使用

系统的物理内存保存自己的数据;进程打开和使用文件系统中的文件,并直接或间接地使用

系统中的物理设备。Linux 必须跟踪进程本身及其拥有的系统资源,来保证能公平地管理该

进程和系统中其他的进程。Linux 系统与其他操作系统不同,进程创建和命令执行是两个不

同的概念。虽然一般创建一个新的进程是为了运行一个指定的命令,但是不运行新命令也可

以创建进程,不创建新进程也可以运行新命令。

当进程在运行时总是会处于以下 5 种状态中的一种,进程的状态决定了进程如何以及何

时有权访问 CPU。

(1)可运行,处于该状态的进程,一旦有机会就会访问 CPU。系统中一般会有多个进程

处理这样的状态,但是由于在同一时间内只有一个进程可以在 CPU 中运行,所以实际上这些

进程中只有一个在运行。然而由于可运行的进程进出 CPU 切换速度非常快,所以看上去好像

有很多进程在同时运行。

(2)自愿(可中断)休眠,当一个进程在没有可处理的内容时,则进入该状态。一旦该

进程有需要处理的内容时,会切换到可运行的状态。

(3)非自愿(不可中断)休眠,在一些时候多个进程试图同时访问某一个资源,而该资

源又不允许同时访问时,内核会将这多个进程只保留一个运行,其他进程会强制进入非自愿

(不可中断)休眠状态,直到内核唤醒后就切换到可运行状态。

识骨寻踪——Linux 引导及进程管理 第

321

10

(4)挂起的进程,用户可以通过“Ctrl+Z”将进程挂起,被挂起的进程在用户唤醒前不

会执行任何操作。

(5)僵尸进程,每个即将终止的进程会经历一个短暂的僵尸状态,然而有时有些进程会

一直停留在僵尸状态。僵尸进程已经结束了执行,并且已经释放了几乎所有资源。

Linux 除了用内核自身管理这些进程调度以外,还将这些信息通过工具程序传递给用户,

并通过工具程序接受用户对某个进程的处理。

10.6.1 Linux 进程查看

在 Windows 中一般是通过任务管理器查看系统中的进程,在 Linux 的 GNOME 环境中也

有一个类似的工具,通过在图形界面中执行“gnome-system-monitor”命令或通过“System”

→“Administration”→“System Monitor”(如图 10-20 所示)打开该工具。

图 10-20 启动 System Monitor

图 10-21 System Monitor

“System Monitor”工具的“Process”进程选项页显示本地上运行的进程列表,每隔几秒

刷新一次。在默认配置下,“System Monitor”只显示启动应用程序的用户所拥有的进程,并

且只列出“Process Name”进程名、“Status”状态、“Nice”优先级、“ID”进程 ID,以及对

进程“Memory”内存和“% CPU”CPU 使用的简单衡量(如图 10-21 所示)。可以单击列表

头设置权限,在这些项目中进行排序。在“View”查看菜单中可以选择只查看我的进程“My

Processes”、所有进程“All Processes”和活动的进程“Active Processes”(如图 10-23 所示)。

在“Edit” →“Preferences”首选项中可以选择更改主“Process”选项页的显示内容(如图

10-22 所示)。用鼠标右键单击进程时,在弹出菜单中用户可以执行允许的任务(如图 10-24

所示),如更改优先级、结束进程等。

Linux 从初学到精通

322

图 10-22 更改显示项

图 10-23 选择查看方式

图 10-24 管理进程

“System Monitor”工具的“Resources”资源选项页用于显示 CPU、内存和交换以及网络

统计图(如图 10-25 所示)。“File Systems”文件系统选项页提供磁盘使用信息,如图 10-26

所示。

识骨寻踪——Linux 引导及进程管理 第

323

10

图 10-25 资源选项页

图 10-26 文件系统选项页

在 RHEL 5.x 中除了提供“System Monitor”工具用于查看和管理进程以外,还提供了以

下命令实现相同的功能。

1.free:查看内存状态 free 命令用于查看内存状态,该命令语法如下。

free [-b|-k|-m|-g] [-to] [-s <间隔秒数>]

常用指数:

常用选项:

-b:使用 free 命令时,显示的单位是 Kbytes,可以使用-b(bytes)、-k(KB)、-m(MB)、

-g(GB)改变显示单位。

-t:显示内存的总和行。

-o:不显示缓存区调节行。

-s <间隔秒数>:持续观察内存使用情况。比如间隔秒数指定为 5,free 命令每 5 秒

查看内存状态一次。

free 命令会显示内存的使用情况,包括物理内存、虚拟的交换文件内存、共享内存区段,

以及系统核心使用的缓冲区等。下面看几个 free 命令的例子。

以 MB 为单位显示内存使用情况。

[root@srv ~]# free -m total used free shared buffers cached Mem: 503 486 17 0 27 331

Linux 从初学到精通

324

-/+ buffers/cache: 126 376 Swap: 1027 0 1027

每 4 秒查看内存状态一次,使用“Ctrl+C”停止查看。

[root@srv ~]# free -s 4 total used free shared buffers cached Mem: 515340 497892 17448 0 28044 339820 -/+ buffers/cache: 130028 385312 Swap: 1052216 0 1052216 #4秒后又自动查看一次。 total used free shared buffers cached Mem: 515340 498016 17324 0 28052 339820 -/+ buffers/cache: 130144 385196 Swap: 1052216 0 1052216

2.ps:查看进程 ps 命令用于查看进程,该命令的选项非常多。下面分类介绍一些常用的选项。

(1)进程选择,在 ps 命令用于选择显示进程的选项包括:“-A”显示所有进程、“-a”显

示除了虚拟终端以外的进程、“-C <命令>”显示所有与<命令>有关的进程、“-U <用户 1>[,

用户 2]”显示与指定用户相关的进程、“-u”显示所有有效用户相关的进程、“-t <虚拟终端>”

显示与指定虚拟终端相关的进程、-p <PID>显示指定 PID(进程 ID)相关的进程、“x”不以

虚拟终端区分显示所有程序,通常与“-a”一起使用,可列出较完整信息。

(2)输出选择,在 ps 命令用于改变输入内容的选项包括:“-f”显示详细列表、“-l”使

用长格式显示、“-j”使用作业格式显示、“-o <字符串>”用户自定义格式,使用<字符串>指

定字段。<字符串>中可用的字段可以使用“ps -L”命令显示。

ps 命令是用来显示程序执行情况的命令,可以配合 kill 命令随时中断、删除不必要的程

序。下面看几个 ps 命令的例子。

aux 是 ps 命令常用的选项组合。

[root@srv ~]# ps -aux Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 2072 624 ? Ss 10:36 0:02 init [5] root 2 0.0 0.0 0 0 ? S< 10:36 0:00 [migration/0] root 3 0.0 0.0 0 0 ? SN 10:36 0:00 [ksoftirqd/0] root 4 0.0 0.0 0 0 ? S< 10:36 0:00 [watchdog/0] root 5 0.0 0.0 0 0 ? S< 10:36 0:00 [events/0] root 6 0.0 0.0 0 0 ? S< 10:36 0:00 [khelper] root 7 0.0 0.0 0 0 ? S< 10:36 0:00 [kthread] root 10 0.0 0.0 0 0 ? S< 10:36 0:00 [kblockd/0]

al 也是 ps 命令常用的选项组合。

[root@srv ~]# ps -al # F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 T 0 7427 4970 8 77 0 - 2355 finish pts/2 00:00:00 vim 4 R 0 7428 4970 0 77 0 - 1054 - pts/2 00:00:00 ps

在 ps 命令显示的信息中第 1 行是标题行,从第 2 行开始都是进程的信息。每列为一个信

识骨寻踪——Linux 引导及进程管理 第

325

10

息,其中常见的列包括以下几种:

(1)F:这个进程的标志其中“4”表示用户为 root。

(2)S、STAT:这个进程的状态。状态包括“R”表示该进程目前正在运行、“S”表示

该进程目前正在休眠当中但可被某些信号唤醒、“T”表示该进程目前正被挂起、“Z”表示该

进程是僵尸进程、“D”表示该进程不可中断休眠。

(3)PID:这个进程的进程 ID。

(4)PPID:这个进程的父进程 ID。

(5)C、%CPU:这个进程使用的 CPU 资源百分比。

(6)PRI:这个进程的优先执行序。

(7)NI:这个进程的 Nice 值。

(8)ADDR:这个进程在内存的哪个部分。

(9)SZ:这个进程使用的内存大小。

(10)WCHAN:目前这个进程是否正在运行,如果显示“-”表示正在运行。

(11)TTY:用户登录的虚拟终端,如果显示“?”表示该进程是一个守护进程。

(12)TIME:这个进程使用 CPU 的时间。

(13)CMD、COMMAND:这个进程是由哪个命令引发的。

(14)USER:这个进程属于哪个用户。

(15)%MEM:这个进程所占用的物理内存百分比。

(16)VSZ:这个进程使用的虚拟内存量,单位是 KB。

(17)RSS:这个进程占用的固定的内存量,单位是 KB。

(18)TTY:这个进程是在哪个虚拟终端上面运行。如果与虚拟终端无关则显示“?”;如

果显示“tty1”~“tty6”是本机的用户进程;如果显示“pts/0”等是由网络连接的其他计算

机的进程。

(19)START:这个进程被触发启动的时间。

(20)TIME:这个进程实际使用 CPU 运行的时间。

3.pstree:以树状查看进程 pstree 命令用于以树状查看进程,该命令语法如下。

pstree [-ahlup]

常用指数:

常用选项:

-a:显示每个程序完整的命令,包括路径、选项等。

-h:显示树状图时,标明现在执行的程序。

-l:采用长列格式显示树状图。

-p:显示树状图的同时,显示进程的 PID。

-u:显示树状图的同时,显示该进程所属用户。

Linux 从初学到精通

326

pstree命令用ASCII字符显示树状结构,清楚地表达程序之间相互关系。下面看几个 pstree

命令的例子。

[root@srv ~]# pstree init─┬─acpid ├─anacron ├─atd ├─crond ├─cupsd ├─2*[dbus-daemon] ├─dbus-launch ├─dhclient ├─gdm-binary───gdm-binary─┬─Xorg │ └─gnome-session─┬─Xsession │ └─ssh-agent ├─ksoftirqd/0 ├─pam-panel-icon───

4.top:显示、管理执行中的程序 top 命令用于显示、管理执行中的程序,该命令语法如下。

top [-d <间隔秒数>] [-n <执行次数>] [-p <PID>] [-bci]

常用指数:

常用选项:

-d <间隔秒数>:指定 top 监控程序执行情况的间隔时间。

-n <执行次数>:指定监控信息的更新次数。当达到指定的次数后,top 命令就会自

动结束并回到命令行。

-p <PID>:监控指定的进程。

-b:使用批处理模式。在该模式下 top 将不接受任何热键输入命令,除非达到选项

“n”所指定的执行次数或被强行中止。

-c:显示每个程序完整的命令,包括路径、选项等。

-i:执行 top 时忽略闲置或已成僵尸的进程。

top 命令和 ps 命令的 大区别在于 ps 命令显示的进程是在执行 ps 命令那一时刻系统进

程的情况,而 top 命令会实时地显示系统中进行的情况并提供了对进程的管理功能。在执行

top 命令后,系统就进入了 top 命令的情况。在 top 命令情况中可以使用以下热键进行操作:

(1)?:显示在 top 命令中可用的热键。

(2)c:切换显示命令名称和完整命令行。

(3)P:在显示时以 CPU 占用情况排序。

(4)M:在显示时以内存占用情况排序。

(5)N:在显示时以进程 PID 排序。

(6)T:在显示时以进程累计使用 CPU 时间的情况排序。

(7)t:切换显示进程和 CPU 状态信息。

识骨寻踪——Linux 引导及进程管理 第

327

10

(8)k:给予进程一个信号。

(9)r:更改进程的 nice 值(有关 nice 值见 10.6.2 )。

(10)q:退出 top 命令。

(11)i:忽略闲置和僵死进程。

下面是执行 top 命令后的情况。

显示“up”系统已启动的时间;“users”目前使用系统的人数;“load average”系统

在 1、5、10 分钟的负载。

top - 17:06:54 up 57 min, 3 users, load average: 0.00, 0.00, 0.04

显示目前系统的进程信息。“totlal”总进程数;“running”目前在运行的进程数;

“sleeping”目前休眠的进程数;“stopped”目前停止的进程数;“zombie”目前的僵

尸进程数。

Tasks: 124 total, 2 running, 121 sleeping, 0 stopped, 1 zombie

显示 CPU 的整体负载。“us”用户占用 CPU 百分比;“sy”系统占用 CPU 百分比;

“ni”用户进程空间内改变过优先级的进程占用 CPU 百分比;“id”空闲 CPU 百分比;

“wa”等待输入输出的 CPU 时间百分比。

Cpu(s): 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

显示目前物理内存的使用情况。“total”总物理内存;“used”已使用的内存;“free”

空闲内存;“buffers”缓冲区占用的内存。

Mem: 515340k total, 492976k used, 22364k free, 47684k buffers

显示目前交换分区的使用情况。“total”总交换分区;“used”已使用的交换分区;“free”

空闲交换分区;“cached”用于高速缓存的大小。

Swap: 1052216k total, 0k used, 1052216k free, 324028k cached

目前系统中的进程,第一行是标题行,每行一个进程。每列一个信息:“PID”进程

编号;“USER”启动进程的用户;“PR”程序的优先执行顺序,越小越早被执行;

“NI”目前的 nice 值,越小越早被执行;“VIRT”进程占用的虚拟内存值;“RES”

进程占用的物理内存值;“SHR”进程使用的共享内存值;“S”进程的状态,其中 S

表示休眠、R 表示正在运行、Z 表示全局进程、N 表示该进程优先值是负数、D 表

示不可中断的休眠状态;“%CPU”该进程占用的 CPU 使用率;“%MEM”该进程占

用的物理内存和总内存的百分比;“TIME+”进程启动后占用的总的 CPU 时间;

“COMMAND” 进程启动的命令名称。

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 5576 root 15 0 2336 1056 816 R 0.2 0.2 0:00.01 top 1 root 15 0 2072 620 532 S 0.0 0.1 0:01.27 init 2 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/0 3 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0 4 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/0 5 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 events/0

Linux 从初学到精通

328

6 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 khelper

5.pgrep:根据命令、用户、虚拟终端显示进程 pgrep 命令用于根据命令、用户、虚拟终端显示进程,该命令语法如下。

pgrep [-l] [-u <用户>] [-t <虚拟终端>] [-d <分隔符>] [命令]

常用指数:

常用选项:

命令:显示指定命令的进程情况。在指定命令时可以使用“*”之类的范本样式。

-u <用户>:显示指定用户拥有的进程情况。

-t <虚拟终端>:显示由指定虚拟终端控制的进程情况。

-d <分隔符>:用指定分隔符分隔每个进程,默认情况下使用新行。

-l:显示进程名称及 PID。

在使用 Linux 过程中经常利用进程运行的用户名或命令寻找进程信息,一般的操作是显

示所有进程再通过管道使用 grep 命令筛选信息。有时这样并不能完整地得到所需的信息,不

过通过 pgrep 命令可以实现这样的功能。下面看几个 pgrep 命令的例子。

显示所有 ssh 开头的进程。

[root@srv ~]# pgrep ssh* 3433 3917 4104

显示所有 sshd 进程的程名称及 PID。

[root@srv ~]# pgrep -l sshd 3433 sshd 4104 sshd

显示所有 root 用户拥有进程的程名称及 PID。

[root@srv ~]# pgrep -lu root 1 init 2 migration/0 3 ksoftirqd/0 10 kblockd/0 11 kacpid

6.netstat:显示网络及进程状态 netstat 命令用于显示网络及进程状态,该命令语法如下。

netstat [-acCegilMnNoprstuvwx] [-A<网络类型>] [--ip]

常用指数:

常用选项:

识骨寻踪——Linux 引导及进程管理 第

329

10

-A <网络类型>:显示该网络类型连线中的相关地址。

-a:显示所有连线中的 Socket。

-c:持续列出网络状态。

-C:显示路由器配置的快取信息。

-e:显示网络其他相关信息。

-g:显示多重广播功能群组组员名单。

-i:显示网络接口信息。

-l:显示监控中的服务器的 Socket。

-M:显示伪装的网络连线。

-n:直接使用 IP 地址,而不通过域名服务器。

-N:显示网络硬件外围设备的符号连接名称。

-o:显示计时器。

-p:显示正在使用 Socket 的程序 ID 和程序名称。

-r:显示路由表。

-s:显示网络工作信息统计表。

-t:显示 TCP 传输协议的连接状况。

-u:显示 UDP 传输协议的连接状况。

-v:显示指令执行过程。

-w:显示 RAW 传输协议的连接状况。

-x:此选项的效果和指定“-A unix”选项相同。

--ip:此选项的效果和指定“-A inet”选项相同。

netstat 用于显示与 IP、TCP、UDP 和 ICMP 协议相关的统计数据,一般用于检验本机各

端口的网络连接情况。下面看几个 netstat 命令的例子。

使用“tunlp”选项结合 grep 命令过滤出指定程序或端口的统计数据,是 netstat 命令

一种比较常见的选项组合。

[root@srv ~]# netstat -tunlp | grep 22 tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN 3402/hpiod tcp 0 0 127.0.0.1:2207 0.0.0.0:* LISTEN 3420/python tcp 0 0 :::22 :::* LISTEN 3433/sshd

显示 TCP 传输协议的连接情况。

[root@srv ~]# netstat -t Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State getnameinfo failed getnameinfo failed tcp 0 132 [UNKNOWN]:ssh [UNKNOWN]:54739 ESTABLISHED

7.lsof:查找进程使用的文件或设备

lsof 命令用于查找进程使用的文件或设备,该命令语法如下。

Linux 从初学到精通

330

lsof [-an] [-u <用户名>] [-c <字符串>] [+d|+D <目录>] [文件名] [-i[46] [协议][@主机名|IPv4地址][:服务|端口]]

常用指数:

常用选项:

文件名:显示打开指定文件的所有进程。

-a:表示两个选项都必须满足时才显示结果。

-n:不将 IP 转换为主机名。

-c <字符串>:显示 COMMAND 列中包含指定字符的进程所有打开的文件。

-u <用户名>:显示属于指定用户进程打开的文件。

+d <目录>:显示指定目录下被进程打开的文件。

+D <目录>:显示指定目录及其下所有子目录下被进程打开的文件。

-i:显示符合条件的的进程,其中“4”、“6”表示 IPv4 和 IPv6;“协议”用于指定

是 TCP 还是 UDP;主机名用于指定 FQDN;“服务”可以是“/etc/service”文件中

已有服务名称。

lsof 常用于查找应用程序打开的文件名称和数目。可用于查找出某个特定应用程序将日

志数据记录到何处,或者正在跟踪某个问题。下面看几个 lsof 命令的例子。

显示 root 用户进程所打开的文件类型为 txt 的文件。在显示的目前系统进程中,第

一行是标题行,每行一个进程。每列一个信息:“COMMAND”进程的名称;“PID”

进程编号;“USER”进程所有者;“FD”文件描述符,应用程序通过文件描述符识

别该文件,如 cwd、txt 等;“TYPE”文件类型;“DEVICE”指定磁盘的名称;“SIZE”

文件的大小;“NODE”;i 节点“NAME”打开文件的确切名称。

[root@srv ~]# lsof -a -u root -d txt COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME init 1 root txt REG 8,7 38652 4047597 /sbin/init migration 2 root txt unknown /proc/2/exe ksoftirqd 3 root txt unknown /proc/3/exe watchdog/ 4 root txt unknown /proc/4/exe events/0 5 root txt unknown /proc/5/exe khelper 6 root txt unknown /proc/6/exe kthread 7 root txt unknown /proc/7/exe kblockd/0 10 root txt unknown /proc/10/exe kacpid 11 root txt unknown /proc/11/exe udevd 575 root txt REG 8,7 71924 4047504 /sbin/udevd

查看 25 端口现在运行的情况。

[root@srv ~]# lsof -i :25 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME sendmail 3461 root 4u IPv4 10692 TCP srv.example.zqin:smtp (LISTEN)

识骨寻踪——Linux 引导及进程管理 第

331

10

10.6.2 Linux 进程管理

查看进程只能了解系统中目前进程的运行情况,Linux 还提供了一些方法给用户调整进

程执行的顺序、终止进程等。下面是 Linux 中一些常见的进程管理方法。

1.进程调度

Linux 内核的一个基本任务就是确保所有的进程有效地共享系统资源,要共享的一个

基本的资源就是 CPU,内核决定哪个进程何时在 CPU 上可执行被称为调度。每个进程都会

进入 CPU 的任务分配中并等待 CPU 执行,而 CPU 会根据每个进程的优先级来判定哪个进程

比较重要。在 CPU 执行时会先执行那些优先级比较高的进程。

每个进程都有两个影响其调度的值:优先顺序(priority),这是一个动态值,Linux 内核

会经常改变这个值;优先级(niceness),这是一个固定值,用户可能调整。在下面的 ps 命令

中“PRI”列就是优先顺序,“NI”列就是优先级。

[root@srv ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 3996 3994 0 75 0 - 1135 wait pts/1 00:00:00 bash 4 R 0 5445 3996 0 77 0 - 1054 - pts/1 00:00:00 ps

将优先顺序和优先级相加的值就是目录的优先顺序。优先顺序越小时,该进程就可以被

CPU 优先执行。由于优先顺序是由内核动态产生用户不能修改,所以用户只能去修改优先级,

优先级可以是正数,也可以是负数。优先级可以影响优先顺序的值,基本上新的优先顺序是

等于老的优先顺序加上优先级产生。但是并不能说老的优先顺序是 20,将优先级修改为 10

后,新的优先顺序就是 30,这是因为优先顺序是由内核动态产生的。也就是说优生级可以影

响优先顺序,不过 终优先顺序还是要经过内核分析后产生的。

在 Linux 中,一般用户只能属于自己进程的优生级且只能将优先级调大,只有 root 才可

以任意调整优生级。调整进程优先组的命令主要有以下两个。

(1)nice:启动进程时调整优先级

当进程启动时 nice 命令用于指定进程的优先级,比如下面的例子中 tar 在执行时就可以

带一个+10 的优先级。

这里指定优先级为“-10”是因为优先顺序越小的越有可能被先执行,所以指定为

“-10”实际上是给了一个比一般进程更有可能被先执行的值。

[root@srv ~]# nice -10 tar -cvjf etcbak.tar.bz2 /etc/

以下是使用 top 命令查看进程的结果,tar 命令的优先级被配置为 10。。

top - 17:11:39 up 3:19, 2 users, load average: 0.57, 0.14, 0.05 Tasks: 89 total, 2 running, 87 sleeping, 0 stopped, 0 zombie Cpu(s): 0.2%us, 12.4%sy, 85.9%ni, 0.0%id, 0.5%wa, 0.0%hi, 1.0%si, 0.0%st Mem: 515340k total, 509576k used, 5764k free, 67900k buffers Swap: 1052216k total, 0k used, 1052216k free, 363732k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 9559 root 35 10 9056 6908 364 R 51.0 1.3 0:34.97 bzip2 9558 root 26 10 4108 948 792 S 5.9 0.2 0:03.29 tar

Linux 从初学到精通

332

(2)renice:调整正在运行中进程的优先级

renice 命令用于调整正在运行中进程的优先级。如下面的例子中 tar 在执行时就可以带一

个+10 的优先级。

tar 命令的进程号是 9918。

[root@srv ~]# ps -lu root | grep tar 0 S 0 9918 3996 6 78 0 - 1027 pipe_w pts/1 00:00:00 tar

将进程 9918 的优先级配置为“-10”。

[root@srv ~]# renice -10 9918 9918: old priority 0, new priority -10

再次查看时优先级已修改。

[root@srv ~]# ps -lu root | grep tar 0 S 0 9918 3996 4 68 -10 - 1027 pipe_w pts/1 00:00:00 tar

2.向进程发送信号

Linux 系统中通过信号通知进程发生的异常事件,并且把信号作为进程间通信的原始机

制。Linux 内核通过信号通知进程出了异常行为。Linux 中信号有不同种类,不同种类的信号

有不同的符号名和整数标识。可以通过“kill -l”列出所有的信号名称及整数标识。kill 命令

可以用于向其他进程发送自定义信号。该命令语法如下。

kill -<信号名称或信号标识> PID

常用指数:

常用选项:

-<信号名称或信号标识>:需要发送给进程的信号。

PID:进程的 PID。

在发送的信号中比较常见的包括:SIGHUP(信号标识为 1)重新读取进程的选项;SIGINT

(信号标识为 2)请求进程中断,“Ctrl+C”也可生成该信号;SIGKILL(信号标识为 9)强制

进程中断;SIGTERM(信号标识为 15)请求进程终止,与 SIGKILL 的差别在于 15 是以正

常的方式关闭程序;SIGTSTP(信号标识为 20)挂起进程,“Ctrl+Z”也可生成该信号。下面

看几个 kill 命令的例子。

vim 命令的进程号是 10992。

[root@srv ~]# ps -lu root | grep vim 0 S 0 10992 3996 0 75 0 - 2366 - pts/1 00:00:00 vim

强制中断 vim 的进程。

[root@srv ~]# kill -9 10992

vim 命令已被关闭。

[root@srv ~]# ps -lu root | grep vim

识骨寻踪——Linux 引导及进程管理 第

333

10

top 的进程号是 11053。

[root@srv ~]# ps -lu root | grep top 4 S 0 11053 3996 0 84 0 - 576 - pts/1 00:00:00 top

使用正常方式退出 top 命令。

[root@srv ~]# kill -SIGTERM 11053 [root@srv ~]# ps -lu root | grep top

用 kill 命令发送信号控制进程是 Linux 中一个很常见的操作,除了 kill 命令以外 Linux

还提供了一个 pkill 命令。在使用 kill 命令时用户必须知道进程的 PID,而 pkill 命令可以根据

条件向进程发送信号。该命令语法如下。

pkill -<信号名称或信号标识> [-n] [-u <用户>] [-t <虚拟终端>] [进程匹配条件]

常用指数:

常用选项:

-<信号名称或信号标识>:需要发送给进程的信号。

-n:只选择 新启动匹配进程。

-u <用户>:选择指定用户的进程。

-t <虚拟终端>:只选择由指定虚拟终端控制的进程。

进程匹配条件:使用正则表达式匹配进程名称。

pkill 命令可以发送的信号与 kill 相同,下面看几个 pkill 命令的例子。

查看用户 jack 的所有进程。

[root@srv ~]# ps -lu jack F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 5 S 500 12724 12722 0 75 0 - 2481 - ? 00:00:00 sshd 0 S 500 12725 12724 0 75 0 - 1135 wait pts/3 00:00:00 bash 0 S 500 12845 12725 0 76 0 - 2366 - pts/3 00:00:00 vim

向用户 jack 所属进程中进程名以“v”开头的发送 SIGKILL 信号。

[root@srv ~]# pkill -9 -u jack ^v

“v”开头的已经被中断。

[root@srv ~]# ps -lu jack F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 5 S 500 12724 12722 0 75 0 - 2481 - ? 00:00:00 sshd 0 S 500 12725 12724 0 75 0 - 1135 - pts/3 00:00:00 bash

向用户 jack 所属的所有进程发送 SIGKILL 信号。

[root@srv ~]# pkill -9 -u jack

用户 jack 所属的所有进程已经被中断。

[root@srv ~]# ps -lu jack

Linux 从初学到精通

334

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

Linux 还提供一个 killall 命令,该命令可以将信号发由命令名指定的进程。killall 命令在

指定命令名时默认是区分大小写的,可以使用“-I”选项让该命令忽略大小写。如下面的例

子中使用该命令中断所有 vim 的进程。

查看用户 jack 的所有进程。

[root@srv ~]# ps -lu jack F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 5 S 500 4043 4041 0 75 0 - 2481 - ? 00:00:00 sshd 0 S 500 4044 4043 0 75 0 - 1135 wait pts/2 00:00:00 bash 5 S 500 4082 4080 0 75 0 - 2481 - ? 00:00:00 sshd 0 S 500 4083 4082 0 75 0 - 1135 wait pts/3 00:00:00 bash 0 S 500 4125 4044 0 77 0 - 2366 - pts/2 00:00:00 vim 0 S 500 4126 4083 1 77 0 - 2366 - pts/3 00:00:00 vim

中断所有 vim 命令的进程。

[root@srv ~]# killall vim [root@srv ~]# ps -lu jack F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 5 S 500 4043 4041 0 82 0 - 2481 - ? 00:00:00 sshd 0 S 500 4044 4043 0 82 0 - 1135 - pts/2 00:00:00 bash 5 S 500 4082 4080 0 75 0 - 2481 - ? 00:00:00 sshd 0 S 500 4083 4082 0 75 0 - 1135 - pts/3 00:00:00 bash

Linux 作业管理

Linux 是一个多任务的操作系统,但是在 bash Shell 中如果不特别指定,命令会在前台执

行。也就是说当开始执行一个命令时,必须要等待该命令执行完成后才可以输入下一个要执

行的命令。通过给命令附加一个“&”,可以将命令放入后台执行。通常只有那些不需要输入

且不会生成大量输出的长时间的命令才适合在后台运行,如复制一个比较大的文件。在下面

的例子中将一个打包/etc 目录的命令放入后台运行,但是由于 tar 命令会产生一些输出信息,

为了不影响正常的使用将这些信息导入到/dev/null 中。

/dev/null 是 Linux 中的一个黑洞,被放入的任何东西都会消失。

[root@srv ~]# tar -cvjf etcbak.tar.bz2 /etc &>/dev/null & [1] 4465 #作业号和进程 ID。

使用“&”将命令放入后台执行后会显示两个信息:作业号和进程 ID。在上面的例子中

作业号是“1”、进程 ID 是“4465”。

提 示

识骨寻踪——Linux 引导及进程管理 第

335

10

使用【Ctrl+Z】组合键可以将正在运行的程序挂起并放入后台,同时也会显示作业号和

进程 ID。如打开 vim 后使用“Ctrl+Z”可以将 vim 挂起并放入后台。

在使用“&”或“Ctrl+Z”方式将有多个进程放入后台运行时,可以通过“jobs”命令查

看。默认情况下 jobs 命令只显示作业号,使用“-l”后会连同 PID 一起显示。

[root@srv ~]# jobs -l [1]- 4566 Stopped (tty output) vim [2]+ 4580 Stopped (tty output) top [3] 4581 Done tar -cvjf etcbak.tar.bz2 /etc >&/dev/null

如果希望将后台的作业置于前台可以使用“fg <作业号>”命令。在下面的使用中使用 fg

命令将作业叫为 1 的进程置于前台运行。

[root@srv ~]# fg 1

如果希望取消作业可以使用“kill %<作业号>”命令。在下面的例子中使用 kill 命令取消

作业号为 1 的作业。

[root@srv ~]# jobs -l [1]- 5029 Running tar -cvjf etcbak.tar.bz2 /etc >&/dev/null & [2]+ 5044 Stopped (tty output) vim [root@srv ~]# kill %1 [root@srv ~]# jobs -l [2]+ 5044 Stopped (tty output) vim

自动化任务管理

在日常服务器的维护过程中经常会有一些重复的工作需要在指定的时间内完成,如备份

等,如果每次做这样的工作时都需要用户进行操作就比较麻烦,在 Windows 中可以通过任务

计划完成这样一些周期性的工作,在 Linux 中也有类似的功能,下面将讲述在 Linux 中两种

实现在指定时间完成指定任务的方法。

10.8.1 一次性任务管理

一次性任务是指在未来某个时间需要执行一次的一个或多个命令,在 Linux 中可以通过

at 命令定义这样的任务,使用该命令将要确保“atd”服务是运行状态,该命令语法如下。

at [-lm] [-d <任务编号>] [-f <文件>] [-q <队列>] [日期时间]

常用指数:

常用选项:

日期时间:指定执行任务的日期时间。

-d <任务编号>:将要执行的任务删除,与直接执行 atrm 命令作用相同。

-f <文件>:从指定的文件中读取要执行的任务,而不是输入要执行的任务。

Linux 从初学到精通

336

-q <队列>:使用指定的队列,队列是以单一英文字符给分,其顺序是从小写 a 到 z,

再从大写 A 到 Z。顺序越后的表示工作优先级越高,at 命令默认的队列是 a 队列。

-l:显示已定义的任务,与直接执行 atq 命令作用相同。

-m:工作完成后,将结果以 E-mail 返回。

在 at 命令中表示日期时间可以采用以下几种形式:

(1)HH:MM:在今天的 HH:MM 执行任务,如果该时间已超过现在的时间,则表示是明

天的 HH:MM 执行任务。如目前是 15:30,使用“at 16:00”表示定义的任务将在明天 16:00

执行。

(2)HH:MM YYYY-MM-DD:指定某年某月的某天执行任务,如使用“at 21:30

2012-12-31”表示定义的任务将在 2012 年 12 月 31 日 21:30 执行。

(3)HH:MM[am|pm] + 数字 [minutes|hours|days|weeks]:在某个时间点再过指定时间后

执行,如使用“at now + 3 days 表示定义的任务在从今天算起过 3 天后执行,使用“at 04pm +

4 hours”表示定义的任务在 20 点执行。

在 RHEL 5.x 中默认情况下所有用户都可以使用 at 命令,但可以通过/etc/at.allow(默认

不存在,需要手动建立)和/etc/at.deny 文件定义允许或禁止使用 at 命令的用户,在这两个文

件中定义用户时,每行一个用户名。当用户使用 at 命令时,如果/etc/at.allow 文件存在,且用

户名在该文件中时(不论该用户名是否在/etc/at.deny 中)用户就可以使用 at 命令;如果

/etc/at.allow 文件不存在,系统会检查/etc/at.deny 文件,如果用户名在该文件中用户就不能使

用 at 命令;如果两个文件都不存在只有 root 用户可以使用 at 命令。

在使用 at 命令时,系统会进入该命令的输入界面,用户每输入完成一个要执行的命令后

按回车键,当定义完成后可使用“Ctrl+D”组合键保存退出,下面看几个 at 命令的例子。

当前用户是 root。

[root@srv ~]# id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

定义一个在今天 21:30 分执行的任务。

[root@srv ~]# at 21:30 #以下二句是定义的任务内容。 at> service httpd restart at> service mysqld restart at> <EOT> #定义完成后使用“Ctrl+D”保存退出。 job 2 at 2010-03-01 21:30

显示当前的一次性任务,第一列是任务编号;第二、三列是任务执行的日期时间;

第四列是任务队列;第五列是定义任务的用户。在显示的内容中任务 2 是上一句 at

命令定义的任务,由于当前用户是 root 所以在显示任务时会显示所有用户定义的任

务,如果是一般用户只能查看到自己的任务。

[root@srv ~]# at -l 2 2010-03-01 21:30 a root 1 2010-03-01 15:44 a jack

识骨寻踪——Linux 引导及进程管理 第

337

10

删除任务编号为 1 的任务,由于当前用户是 root 所以可以删除其他用户定义的任务,

如果是一般用户只能删除自己定义的任务。

[root@srv ~]# at -d 1 [root@srv ~]# at -l 2 2010-03-01 21:30 a root

10.8.2 周期性任务管理

at 命令只能定义在未来执行一次的任务,而 crontab 可以定义一个周期性的任务,如每月

10 号执行,使用该命令将要确保“crond”服务是运行状态,该命令语法如下。

crontab [-u <用户>] [配置文件] [-elr]

常用指数:

常用选项:

配置文件:指定执行任务的日期时间。

-u <用户>:为指定用户定义周期性的任务,只有 root 用户才可以为其他用户定义,

而一般用户只能定义自己的周期性的任务。

-e:编辑指定用户的周期性的任务。

-l:显示指定用户的周期性的任务。

-r:删除指定用户的周期性的任务。

在 RHEL 5.x 中默认情况下所有用户都可以使用 crontab 命令,但可以通过/etc/cron.allow

(默认不存在,需要手动建立)和/etc/cron.deny 文件定义允许或禁止使用 crontab 命令的用户,

在这两个文件中定义用户时,每行一个用户名。当用户使用 crontab 命令时,如果/etc/cron.allow

文件存在,且用户名在该文件中时(不论该用户名是否在/etc/cron.deny 中)用户就可以 crontab

命令;如果/etc/cron.allow 文件不存在,系统会检查/etc/cron.deny 文件,如果用户名在该文件

中用户就不能使用 crontab 命令;如果两个文件都不存在只有 root 用户可以使用 crontab 命令。

所有用户可以使用“crontab -e”命令编辑自己周期性的任务;root 用户可以“crontab -e -u <

用户>”编辑其他用户的的周期性的任务。在使用“crontab -e”后系统会进入一个类似 vim

的编辑环境,使用“i”开始编辑。每一行是一个任务,一行必须包括 6 列,每列之间至少使

用一个空格分隔。每列分别表示“分钟 小时 日期 月份 星期 要执行的命令”,分钟可用值

包括 0~59、小时可用值包括 0~24、日期可用值包括 1~31、月份可用值包括 1~12、星期

可用值包括 0~7,其中 0 和 7 都表示星期天,在这些表示时间的列中还可以使用“*”表示

任何时间、使用“,”分隔多个时间、使用“-”表示时间段、使用“*/n”表示每隔多少时间,

下面看几个使用“crontab -e”命令编辑的例子。

每周 1 执行“/bin/cp -r /boot/grub /bootbak”命令。

* * * * 1 /bin/cp -r /boot/grub /bootbak

每隔 10 分钟执行“/bin/updatedb”命令。

Linux 从初学到精通

338

*/10 * * * * /bin/updatedb

9 月到 12 月的 12 点、17 点、20 点执行“/sbin/reboot”命令。

* 12,17,20 * 9-12 * /sbin/reboot

使用“crontab -e”命令编辑周期性的任务后,还可以使用 crontab 命令的其他选项进行

周期性的任务的管理,下面看几个 crontab 命令的例子。

当前用户是 root。

[root@srv ~]# id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

查看当前用户周期性的任务。

[root@srv ~]# crontab -l * 23 * * 1-5 /sbin/reboot

查看用户 jack 周期性的任务。

[root@srv ~]# crontab -l -u jack * * * * 2 clear

删除用户 jack 周期性的任务。

[root@srv ~]# crontab -r -u jack [root@srv ~]# crontab -l -u jack no crontab for jack

在 Linux 系统中除了用户定义的周期性任务以外,系统自身也定义了很多周期性任务。

这些系统自身的周期性任务定义在/etc/crontab 文件中,其中各行作用如下。

①:定义使用的 Shell。

②:定义命令的搜索路径。

③:定义当以下的周期性任务有需要输出的内容时,将信息发送给 root 用户。

④:定义根目录。

⑤:定义每小时需执行的任务是/etc/cron.hourly 目录中的脚本。

⑥:定义每天需执行的任务是/etc/cron.daily 目录中的脚本。

⑦:定义每周需执行的任务是/etc/cron.weekly 目录中的脚本。

⑧:定义每月需执行的任务是/etc/cron.monthly 目录中的脚本。

[root@srv ~]# cat /etc/crontab SHELL=/bin/bash ① PATH=/sbin:/bin:/usr/sbin:/usr/bin ② MAILTO=root ③ HOME=/ ④ # run-parts 01 * * * * root run-parts /etc/cron.hourly ⑤ 02 4 * * * root run-parts /etc/cron.daily ⑥ 22 4 * * 0 root run-parts /etc/cron.weekly ⑦ 42 4 1 * * root run-parts /etc/cron.monthly ⑧

识骨寻踪——Linux 引导及进程管理 第

339

10

系统默认在这些目录会有一些脚本,用户也可以将自己的脚本放到对应目录中,这样到

了指定的时间也会被执行。如果到了指定的时间这些脚本因为一些原因未执行,如当时未开

机,系统会根据/etc/anacrontab 文件中的定义重新尝试执行。

[root@srv ~]# cat /etc/anacrontab SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root 1 65 cron.daily run-parts /etc/cron.daily 7 70 cron.weekly run-parts /etc/cron.weekly 30 75 cron.monthly run-parts /etc/cron.monthly

在“MAILTO=root”之后的行就是定义重新尝试执行的方式,每行是一种方式。每行中

第一列表示重新尝试执行的 长时间;第二列表示重新尝试执行的延时时间;第三列是描述

信息;第四列表示要执行的内容。如“1 65 cron.daily run-parts /etc/cron.daily”表示

每 65 分钟重试一次每天要执行的任务,重试 1 天后就不执行了。

Linux 系统日志

Linux 中有很多系统应用程序都充当守护进程,用于基本的操作系统任务,使用“ps -aux”

查看进程时,“TTY”列显示“?”的都是守护进程,这主要是因为守护进程与终端是无关的。

也是因为这个原因守护进程的标准输出、错误不会显示到屏幕上,用户只能通过日志查看这

些信息。

大多数守护进程把消息附加到系统中的一个文件中,该文件是一个文本文件,用户可以

使用文本查看工作。守护进程可以选择使用中央日志机制,该机制通常由操作系统执行,称

为 syslog 服务;也可以使用守护进程自己的日志文件。

10.9.1 Linux 日志等级及设施

在 Linux 中日志使用设施和等级将每个日志消息联系起来。日志的等级按严重性从高到

低分别为:emerg(系统不稳定)、alert(应该立即采取动作)、crit(临界状态)、error(错误

状态)、warn(警告状态)、notice(正常但值得注意的行为)、info(信息性的消息)、debug

(调试信息)、none(不需登录等级)。常见的日志设施包括以下几个。

auth:用户授权。 authpriv:包含敏感信息的授权和安全。

cron:与时钟有关的服务。 daemon:没有单独设施的系统守护进程。

ftp:ftpd 守护进程。 kern:与内核有关的消息。

local0~local7:用于定义本地策略。 lpr:与打印系统有关的消息。

mail:与邮件有关的消息。 syslog:与 syslogd 有关的消息。

user:默认设施。

Linux 从初学到精通

340

10.9.2 syslog 服务

syslog 服务是生成日志的应用程序及把日志传递给合适目的地的管理程序,提供一个集

中管理机制。应用程序会将产生的日志消息传递给 syslogd 守护进程,该守护进程在 RHEL 5.x

中日志的服务,可以使用 service 和 chkconfig 命令控制。syslogd 守护进程根据/etc/syslog.conf

文件中的配置处理接收到的消息。

[root@srv ~]# grep -v ^# /etc/syslog.conf | grep -v ^$ *.info;mail.none;authpriv.none;cron.none /var/log/messages authpriv.* /var/log/secure mail.* -/var/log/maillog cron.* /var/log/cron *.emerg * uucp,news.crit /var/log/spooler local7.* /var/log/boot.log

对/etc/syslog.conf 文件修改后只有在重新启动或使用“service syslog restart”命令后才会

生效。在/etc/syslog.conf 中每行是定义的一种日志的记录方式,一行由 2 列组成:第 1 列指

定哪些日志消息需要记录;第 2 列指定处理日志消息的动作。

第 1 列中应该包含“设施.等级”,在定义多个“设施.等级”时,使用分号分隔,通配符

“*”可以用于匹配所有设施或等级,其中“*.等级”表示大于等于指定的等级、“*.=等级”

表示等于指定的等级、“*.!等级”表示不等于指定的等级。

第 2 列处理日志消息的动作可以使用几种方法指定:直接指定文件后,日志消息就被附

加到指定的文件;指定用户名后日志消息就被显示在指定用户的控制台,如果用户当前没有

登录,则信息会丢失;指定“@IP 地址或 FQDN”后日志消息就被发送到指定的服务器(该

方式主要用于将多台计算机的日志汇总到一台专用的日志服务器上,这些日志又会根据日志

服务的/etc/syslog.conf 配置将日志消息写入对应文件中,为了让其他计算机的日志可以写入

日志服务器,必须将日志服务器/etc/sysconfig/syslog 文件中的“SYSLOGD_OPTIONS”选项

值修改为"-r-x-m240");指定为“*”后日志消息会被显示到当前登录的所有用户控制台上。

如果使用指定文件作为动作时,在文件名前加一个“-”表示先将日志写入缓存,在计算机不

太忙的时候再写入硬盘。

如在 /etc/syslog.conf 文件中默认有的一行“ *.info;mail.none;authpriv.none;cron.none

/var/log/messages”就表示将所有 info 等级的日志等多个设施及等级的日志记录到

/var/log/message 文件中,这个文件也是所有 Linux 产生的常规日志记录的文件。

10.9.3 syslog 日志格式

在 RHEL 5.x 中默认情况下除了 mail、autopriv、cron 以外的所有设施 info 等级的日志消

息默认都记录到/var/log/messages 文件中,该文件中每行是一条日志消息,以下面的日志内容

第一行为例,“Jan 29 11:56:29”表示产生日志的日期时间;“srv”表示产生消息的主机名;

“tpvmlpd[3829]”表示生成该日志的应用程序名称或设施名,中括号内的是应用程序的 PID(应

用程序的 PID 并不是每条日志都会有);“device type not supported”是日志的内容。

[root@srv ~]# tail /var/log/messages

识骨寻踪——Linux 引导及进程管理 第

341

10Jan 29 11:56:29 srv tpvmlpd[3829]: device type not supported Mar 1 23:30:19 srv tpvmlpd[3872]: device type not supported Mar 1 23:30:34 srv tpvmlpd[3911]: device type not supported Mar 1 23:30:49 srv tpvmlpd[3951]: device type not supported

10.9.4 循环日志

循环日志功能主要是为了防止日志文件占用过多的硬盘空间。该功能通过 logrotate 程序

实现。logrotate 程序是一个日志文件管理工具,该工具可以实现转存的功能,也就是将旧的

日志文件删除,并创建新的日志文件。可以根据日志文件的大小,也可以根据天数来转存,

这个过程一般通过周期性任务 crontab 实现。 logrotate 程序还可以用于压缩日志文件,以及

发送日志到指定的邮箱。logrotate 的配置文件是 /etc/logrotate.conf,其主要选项如下。

(1)compress:通过 gzip 压缩转存以后的日志。 (2)nocompress :不需要压缩时,用这个选项。 (3)create [<转存文件权限>] [<转存文件所有者>] [<转存文件拥有组>]:使用指定的文

件模式创建新的日志文件。

(4)nocreate:不建立新的日志文件。 (5)delaycompress 和 compress 一起使用时,转存的日志文件到下一次转存时才压缩

nodelaycompress 覆盖 delaycompress 选项,转存同时压缩。

(6)errors <邮箱地址>:转存时的错误信息发送到指定的邮箱地址。

(7)missingok:如果找不到需要转存的文件就忽略,继续执行下面的内容。

(8)ifempty:即使是空文件也转存,这是 logrotate 的默认选项。

(9)notifempty:如果是空文件的话,则不转存。 (10)mail <邮箱地址>:把转存的日志文件发送到指定的邮箱地址。 (11)nomail:转存时不发送日志文件。

(12)olddir <目录>:转存后的日志文件放入指定的目录,必须和当前日志文件在同一个

文件系统。

(13)noolddir :转存后的日志文件和当前日志文件放在同一个目录下。

(14)daily:指定转存周期为每天。 (15)weekly:指定转存周期为每周。 (16)monthly:指定转存周期为每月。 (17)rotate <次数>:指定日志文件删除之前转存的次数,“0”指不转存。如指定为“3” 指

保留 3 个备份。

(18)size <容量>:当日志文件到达指定的大小时才转存,容量可以指定 bytes(默认值

缺省)、KB(sizek)或 MB(sizem)。

在 RHEL 5.x 中/etc/logrotate.conf 文件默认内容如下,其中“weekly”表示所有的日志文

件每周转存一次;“rotate 4”日志文件删除之前转存 4 次;“create”指定 logrotate 自动建立新

的日志文件,新的日志文件具有和原来的文件保持一样的权限;“/var/log/wtmp{…}”括号中

是对指定的日志使用特殊的配置则不使用上面定义的所有日志的配置;“ include

/etc/logrotate.d”表示读取“/etc/logrotate.d”目录其他配置文件。

Linux 从初学到精通

342

[root@srv ~]# grep -v ^# /etc/logrotate.conf | grep -v ^$ weekly rotate 4 create include /etc/logrotate.d /var/log/wtmp { monthly minsize 1M create 0664 root utmp rotate 1 }

10.9.5 内核日志

在使用“service syslog restart”命令重新启动 syslog 服务时,会发现有“kernel logger”

(klogd)和“system logger”(syslogd)两个守护进程被重启。其中“syslogd”是用于 syslog

服务的守护进程,而“klogd”是内核日志记录器。

[root@srv ~]# service syslog restart Shutting down kernel logger: [ OK ] Shutting down system logger: [ OK ] Starting system logger: [ OK ] Starting kernel logger: [ OK ]

和一般应用程序一样,内核也会创建自己的日志消息。内核既不访问文件系统,也不访

问 syslogd 守护进程,内核将日志消息写入一个内部具有固定长度的 dmesg 缓冲区中。这些

内核产生的日志可以使用“dmesg”命令查看,也可以直接查看/var/log/message 文件。那么

内核日志是怎么被写入/var/log/message 文件中的呢?“klogd”守护进程会充当 syslog 消息的

代理服务,该守护进程会读取文件/proc/kmesg(该文件可以读取所有内核消息),无论何时内

核发出一条消息后,“klogd”守护进程都会将消息重新处理后使用 kern 设施发送给内核,因

此/var/log/message 也会记录内核的消息日志。

10.9.6 自定义日志

并不是所有 Linux 下的应用程序都使用 syslog 服务,有一些应用程序执行自己将日志保

存到特定的日志文件中。应用程序有的日志文件的文件名和日志消息格式完全取决于该应用

程序,但一般情况下这些日志文件都存放在/var/log 目录中,下面是一些常用的日志及用途。

(1)/var/log/message:系统默认的日志文件。

(2)/var/log/secure:可能是敏感信息的系统日志文件。

(3)/var/log/up2date: 新的日志文件。

(4)/var/log/xferlog:FTP 服务的事物处理日志。

(5)/var/log/httpd/access_log:Web 服务器的事务处理日志。

(6)/var/log/httpd/error_log:Web 服务器的出错信息日志。

(7)/var/log/samba:Samba 文件服务器的各种日志文件。

识骨寻踪——Linux 引导及进程管理 第

343

10

实验任务

在一台安装了 RHEL 5.x 的计算机上完成以下任务。

(1)将系统默认的运行级别改为 3。

(2)在下次启动时不自动加载 bluetooth 服务。

(3)查看 atd 进程的 PID。

(4)查看目前系统 SWAP 分区的大小。

(5)查看目前内核的版本。

(6)查看系统目前已装载的内核模块。

(7)保证每次开机时系统装载“ip_conntrack-ftp”、“ip_nat_ftp”两个内核模块。

(8)使用 tar 命令在后台打包/etc/目录的所有内容。

(9)使系统在每周六 23:30 重新启动。

(10)安装 telnet 服务,并满足以下要求。

只有 192.168.159.0/24 网段的客户端可以访问。

只能在 8:30~17:30 之间访问。

本章测试

(1)修改/etc/inittab 文件后,( )命令会使 init 重新读取该文件。

A.telinit r B.init 0

C.init r D.init q

(2)执行( )命令后所有 crontab 作业将停止执行。

A.crontab –x B.service crond stop

C.chkconfig cron off D.rm -rf /etc/cron.d

(3)Linux 的内核模块位于( )目录中。

A./lib/$(uname -r) B./usr/share

C./lib/modules/$(uname -r) D./bot/modules

(4)BIOS 通常把控制权传递给( )。

A.Linux 内核 B./sbin/init 进程

C.引导程序 D./bin/login 进程

(5)( )是 GRUB 的配置文件。

A./boot/grub/grub.conf B./etc/sysconfig/grub

Linux 从初学到精通

344

C./etc/grub/grub.conf D./boot/grub.conf

(6)在命令 后使用( )可以将使用放入后台执行。

A.& B.&&

C.| D.||

(7)( )是 Linux 内核启动的第一个进程。

A./sbin/init B.BIOS

C.引导程序 D./sbin/login

(8)用于指定 crontab 作业执行频率的 小解决方案是( )。

A.分钟 B.天

C.小时 D.秒

(9)下列命令中,( )不能用于关闭系统。

A.poweroff B.shutdown -h now

C.init 0 D.init 6

(10)下列运行级别中( )被称为单用户模式。

A.0 B.1

C.2 D.3

Linux 系统一般都是网络中重要的组成部分,在 Linux 的安

装过程一般都提供了 IP 地址、DNS 服务器等相关网络参数的配

置功能。在使用过程中经常会需要修改这些网络参数或测试网络,

这里就需要使用一些命令或修改配置文件实现这样的功能,下面

讲述在 RHEL 5.x 中如何修改网络参数及如何测试网络。

第11章

开山铺路︱︱Lin

ux

网络管理

Linux 从初学到精通

346

网络接口配置

目前几乎所有的计算机上都安装了网络接口卡(NIC,一般也称为网卡),Linux 的内核

一般都可以检测出所有连接的 PCI 设备,可以使用 lspci 命令验证计算机上的 PCI 设备是否被

内核检测到。

[root@srv ~]# lspci 00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (rev 01) 00:01.0 PCI bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge (rev 01) 00:07.0 ISA bridge: Intel Corporation 82371AB/EB/MB PIIX4 ISA (rev 08) 00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01) 00:07.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08) 00:07.7 System peripheral: VMware Virtual Machine Communication Interface (rev 10) 00:0f.0 VGA compatible controller: VMware SVGA II Adapter 00:10.0 SCSI storage controller: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual

Ultra320 SCSI (rev 01) 00:11.0 PCI bridge: VMware PCI bridge (rev 02) 00:15.0 PCI bridge: VMware PCI Express Root Port (rev 01) 00:15.1 PCI bridge: VMware PCI Express Root Port (rev 01) 00:15.2 PCI bridge: VMware PCI Express Root Port (rev 01) #以下二个就是内核检测到的网卡信息。 02:00.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev

10) 02:03.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev

10)

11.1.1 网络接口

和大多数设备不同,Linux 内核不允许用户以文件的形式访问网卡。也就是说,在/dev

目录下没有直接关联网卡的设备节点。

Linux 是通过网络接口访问网卡的,每一个被识别的网卡内核都会为其生成一个网络接

口,并以类似 eth0 的方式命名,其中字母部分表示数据连接技术。目前比较常见的数据连接

技术包括:eth(以太网)、ppp(使用 PPP 协议的串口设备)、fddi(光纤);数据部分用于区

分检测到的多个网络接口,如内核检测到主机上安装了两块以太网卡就会分别使用 eth0 和

eth1 命名。使用“ifconfig”命令可以检验所有已识别的网络接口命令。

显示所有已识别并已激活的网络接口,使用“-a”选项后可以显示所有已识别的网

络接口(包括未激活的)。其中“eth0”开始的行是第一个以太网接口的信息,其中

比较常用的有“inet addr:”IPv4 地址;“Mask” 子网掩码;inet6 addr”IPv6 地址;

“HWaddr”MAC 地址;“eth1”开始的行是第二个以太网接口的信息。

[root@srv ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:18:D1:C0 inet addr:192.168.159.35 Bcast:192.168.159.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe18:d1c0/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:382 errors:0 dropped:0 overruns:0 frame:0

开山铺路——Linux 网络管理 第

347

11 TX packets:349 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:36093 (35.2 KiB) TX bytes:47993 (46.8 KiB) Interrupt:59 Base address:0x2024 eth1 Link encap:Ethernet HWaddr 00:0C:29:18:D1:CA inet addr:192.168.56.132 Bcast:192.168.56.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe18:d1ca/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:87 errors:0 dropped:0 overruns:0 frame:0 TX packets:335 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:14296 (13.9 KiB) TX bytes:32258 (31.5 KiB) Interrupt:51 Base address:0x20a4 lo Link encap:Local Loopback #回环地址的信息。 inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:1585 errors:0 dropped:0 overruns:0 frame:0 TX packets:1585 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:4418312 (4.2 MiB) TX bytes:4418312 (4.2 MiB)

使用 ifconfig 接网络接口名字,可以只显示指定网络接口的信息。

[root@srv ~]# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:0C:29:18:D1:C0 inet addr:192.168.159.35 Bcast:192.168.159.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe18:d1c0/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:402 errors:0 dropped:0 overruns:0 frame:0 TX packets:368 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:37982 (37.0 KiB) TX bytes:52551 (51.3 KiB) Interrupt:59 Base address:0x2024

ifconfig 命令还可以使用禁用或启用一个指定的网络接口,禁用网络接口时使用“ifconfig

<网络接口> down”;启用网络接口时使用“ifconfig <网络接口> up”。

目前识别到 eth0、eth1 两个已激活的网络接口。

[root@srv ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:18:D1:C0 inet addr:192.168.159.35 Bcast:192.168.159.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe18:d1c0/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:563 errors:0 dropped:0 overruns:0 frame:0 TX packets:499 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:52437 (51.2 KiB) TX bytes:74477 (72.7 KiB) Interrupt:59 Base address:0x2024 eth1 Link encap:Ethernet HWaddr 00:0C:29:18:D1:CA inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe18:d1ca/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:91 errors:0 dropped:0 overruns:0 frame:0

Linux 从初学到精通

348

TX packets:374 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:15196 (14.8 KiB) TX bytes:42717 (41.7 KiB) Interrupt:51 Base address:0x20a4 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:1585 errors:0 dropped:0 overruns:0 frame:0 TX packets:1585 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:4418312 (4.2 MiB) TX bytes:4418312 (4.2 MiB)

禁用网络接口 eth1。

[root@srv ~]# ifconfig eth1 down

只有一个网络接着 eth0 被激活。

[root@srv ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:18:D1:C0 inet addr:192.168.159.35 Bcast:192.168.159.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe18:d1c0/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:606 errors:0 dropped:0 overruns:0 frame:0 TX packets:535 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:56580 (55.2 KiB) TX bytes:81089 (79.1 KiB) Interrupt:59 Base address:0x2024 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:1585 errors:0 dropped:0 overruns:0 frame:0 TX packets:1585 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:4418312 (4.2 MiB) TX bytes:4418312 (4.2 MiB)

启用网络接口 eth1。

[root@srv ~]# ifconfig eth1 up

11.1.2 配置网络接口

每一个网络接口都需要至少指定一个 IP 地址后,才可以接入 TCP/IP 的网络中与其他计

算机进入通信。下面介绍两种为网络接口指定 IP 地址的方法。

1.临时指定 IP 地址 可以使用“ifconfig <网络接口> IP 地址 netmask <子网掩码>”命令临时为网络接口指定

一个 IP 地址,如果计算机重新启动这个指定的 IP 地址将会失效。

网络接口 eth1 的 IP 地址为 192.168.56.132。

[root@srv ~]# ifconfig eth1 eth1 Link encap:Ethernet HWaddr 00:0C:29:18:D1:CA

开山铺路——Linux 网络管理 第

349

11 inet addr:192.168.56.132 Bcast:192.168.56.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe18:d1ca/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:93 errors:0 dropped:0 overruns:0 frame:0 TX packets:427 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:15781 (15.4 KiB) TX bytes:57581 (56.2 KiB) Interrupt:51 Base address:0x20a4

使用 ifconfig 命令改变网络接口 eth1 的 IP 地址。

[root@srv ~]# ifconfig eth1 192.168.159.100 netmask 255.255.255.0 [root@srv ~]# ifconfig eth1 eth1 Link encap:Ethernet HWaddr 00:0C:29:18:D1:CA inet addr:192.168.159.100 Bcast:192.168.159.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe18:d1ca/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:93 errors:0 dropped:0 overruns:0 frame:0 TX packets:436 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:15781 (15.4 KiB) TX bytes:59621 (58.2 KiB) Interrupt:51 Base address:0x20a4

2.永久改变 IP 地址 使用 ifconfig 命令是直接保存在内核中,为了在重新启动后可以使用以前的配置,必须

在文件系统中保存相关的信息。大多数 Linux 系统都是根据目录/etc/sysconfig/network-scripts

中以“ifcfg-<网络接口>”形式命名的配置文件来配置网络接口的 IP 地址,如网络接口 eth0

的配置文件就是/etc/sysconfig/network-scripts/ifcfg-eth0。在安装 RHEL 5.x 过程中配置的 IP 地

址信息就是保存在这些网络接口的配置文件中。

[root@srv ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 # Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] DEVICE=eth0 BOOTPROTO=static BROADCAST=192.168.159.255 HWADDR=00:0C:29:18:D1:C0 IPADDR=192.168.159.10 NETMASK=255.255.255.0 NETWORK=192.168.159.0 ONBOOT=yes

在网络接口的配置文件中可用的参数主要包括以下几个。

(1)DEVICE =<设备名>:指定该网络接口的设备名。

(2)BOOTPROTO =<dhcp|static>:指定 IP 地址获取方式,static 表示手动分配 IP 地址;

dhcp 表示自动获取 IP 地址。

(3)BROADCAST=<IP 地址>:指定该网络接口的广播地址,在使用 DHCP 获取 IP 地址

时该参数不是必需的。

(4)HWADDR=<MAC 地址>:指定该网络接口的 MAC 地址。

(5)IPADDR=<IP 地址>:指定该网络接口的 IP 地址,在使用 DHCP 获取 IP 地址时该参

数不是必需的。

Linux 从初学到精通

350

(6)NETMASK=<子网掩码>:指定该网络接口的子网掩码,在使用 DHCP 获取 IP 地址

时该参数不是必需的。

(7)NETWORK=<网络号>:指定该网络接口的网络号,该参数不是必需的。

(8)ONBOOT=<yes|no>:指定该网络接口在主机启动时,是否自动启用。

(9)USERCTL=<yes|no>:指定该网络接口是否允许普通用户启用或禁用,默认为 no,

该参数不是必需的。

(10)TYPE=<网络接口类型>:指定该网络接口的网络接口类型。

(11)GATEWAY=<网关>:将数据包路由出本地网络所使用的网关,该参数不是必需的。

在修改网络接口配置文件后,需要重新启动计算机或使用以下两种命令中的一种使用配

置文件生效。

(1)ifup 和 ifdown,首先使用“ifdown <网络接口>”禁用指定的网络接口,再使用“ifup

<网络接口>”启用网络接口,在启用时 Linux 会重新读取指定网络接口的配置文件。

[root@srv ~]# ifdown eth0;ifup eth0

(2)使用“service network restart”,重新启动网络服务会重新读取所有网络接口配置

文件。

[root@srv ~]# service network restart Shutting down interface eth0: [ OK ] Shutting down interface eth1: [ OK ] Shutting down loopback interface: [ OK ] Bringing up loopback interface: [ OK ] Bringing up interface eth0: [ OK ] Bringing up interface eth1: #显示以下信息表示网络接口 eth1是采用 DHCP动态获取 IP地址。 Determining IP information for eth1... done. [ OK ]

使用 ifup 和 ifdown 命令时,只会暂时停止某一个网络接口的工作,不会影响到其他网络

接口,而 service network restart 会使所有的网络接口暂时停止。因此在一台有多个网络接口

的计算机只需要改变一个网络接口的配置时推荐使用 ifup 和 ifdown 命令。

11.1.3 IP 别名

Linux 内核允许使用 IP 别名的概念,也就是为一个网络接口指定多个 IP 地址,同一个网

络接口 多可以支持 255 个额外的别名。别名接口的通过实际网络接口名称附加“:数字”指

定。如需要为 eth0 建立两个别名时可以采用以下两种方法中的任意一种。

1.临时指定 IP 别名 和一般网络接口相同,可以使用“ifconfig <IP 别名> IP 地址 netmask <子网掩码>”命令

临时指定一个 IP 别名。

在 eth0 上增加一个名为 eth0:1 的网络接口,并指定 IP 地址为 192.168.158.35。

[root@srv ~]# ifconfig eth0:1 192.168.158.35 netmask 255.255.255.0

开山铺路——Linux 网络管理 第

351

11

在 eth0 上增加一个名为 eth0:2 的网络接口,并指定 IP 地址为 192.168.157.35。

[root@srv ~]# ifconfig eth0:2 192.168.157.35 netmask 255.255.255.0 [root@srv ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:18:D1:C0 inet addr:192.168.159.35 Bcast:192.168.159.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe18:d1c0/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1427 errors:0 dropped:0 overruns:0 frame:0 TX packets:1354 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:133815 (130.6 KiB) TX bytes:208107 (203.2 KiB) Interrupt:59 Base address:0x2024 eth0:1 Link encap:Ethernet HWaddr 00:0C:29:18:D1:C0 inet addr:192.168.158.35 Bcast:192.168.158.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:59 Base address:0x2024 eth0:2 Link encap:Ethernet HWaddr 00:0C:29:18:D1:C0 inet addr:192.168.157.35 Bcast:192.168.157.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:59 Base address:0x2024 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:1595 errors:0 dropped:0 overruns:0 frame:0 TX packets:1595 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:4419420 (4.2 MiB) TX bytes:4419420 (4.2 MiB)

2.永久指定 IP 别名 可以网络接口的配置文件复制两份,分别命名为“eth0:1”、“eth0:2”,然后编辑 IP 别名

配置文件指定 IP 地址,具体操作步骤如下。

复制网络接口的配置文件。

[root@srv ~]# cp /etc/sysconfig/network-scripts/ifcfg-eth0 \ /etc/sysconfig/network-scripts/ifcfg-eth0:1 [root@srv ~]# cp /etc/sysconfig/network-scripts/ifcfg-eth0 \ /etc/sysconfig/network-scripts/ifcfg-eth0:2

修改以上两个文件的内容。

[root@srv ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0:1 DEVICE=eth0:1 BOOTPROTO=static IPADDR=192.168.157.35 NETMASK=255.255.255.0 ONBOOT=yes [root@srv ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0:2 DEVICE=eth0:2 BOOTPROTO=static IPADDR=192.168.158.35 NETMASK=255.255.255.0 ONBOOT=yes

Linux 从初学到精通

352

重新启动 network 服务。

[root@srv ~]# service network restart Shutting down interface eth0: [ OK ] Shutting down loopback interface: [ OK ] Bringing up loopback interface: [ OK ] Bringing up interface eth0: [ OK ]

主机名配置

Linux 内核在内存中保留了计算机的主机名,可以使用 hostname 命令查看。hostname 命

令也可以临时更改计算机的主机名。

查看主机名。

[root@srv ~]# hostname srv.example.zqin

将主机名临时改为 ctu.example.zqin。

[root@srv ~]# hostname ctu.example.zqin [root@srv ~]# hostname jack.example.zqin

使用 hostname 命令更改主机名后,Shell 提示符不会改变。

如果希望永久改变主机名就需要修改/etc/sysconfig/network 文件,该文件中可用的参数主

要包括以下几个。

(1)NETWORKING=<yes|no>:是否支持 IPv4 网络。

(2)NETWORKING_IPV6=<yes|no>:是否支持 IPv6 网络。

( 3 ) HOSTNAME=< 主 机 名 > : 指 定 主 机 名 , 如 果 没 有 指 定 主 机 名 将 为

“localhost.localdomain”。

(4)GATEWAY=<IP 地址>:在启动时 IP 地址将会增加到路由表中作为默认网关。

在/etc/sysconfig/network 文件中修改了 HOSTNAME 参数后,为了保证主机上所有服务可

以正常运行,还需要对应修改/etc/hosts 文件中“127.0.0.1”所在行的内容(有关/etc/hosts 文

件作用具体见 13.4 )。

提 示

开山铺路——Linux 网络管理 第

353

11

静态路由配置

IP 协议以使用路由器连接在一起的机器构成的独立网络为基础。所有连接到单一 IP 网

络上的机器都有相似的 IP 地址,并通常使用相同的网络交换机。下面讲述一些 Linux 和路由

有关的内容。

1.路由表 在每个 Linux 内核都会有一个路由表。路由表是用来确定对于一个发送出的数据包来说,

内核应该使用哪种方法传递数据包,路由表定义了哪个网络接口与本地网络关系,以及本地

网络上充当连接外面网络的机器的身份标识。可以使用 route 命令查看路由表。

查看路由表,在“Flags”列含有 G 表示这个路由表条目指的是网关。

[root@srv5 ~]# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.159.0 * 255.255.255.0 U 0 0 0 eth0 192.168.158.0 * 255.255.255.0 U 0 0 0 eth0 192.168.56.0 * 255.255.255.0 U 0 0 0 eth1 192.168.157.0 * 255.255.255.0 U 0 0 0 eth0 169.254.0.0 * 255.255.0.0 U 0 0 0 eth1 default 192.168.56.2 0.0.0.0 UG 0 0 0 eth1

参数“-n”可以使路由表按 IP 地址显示。

[root@srv ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.159.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 192.168.158.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 192.168.56.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 192.168.157.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1 0.0.0.0 192.168.56.2 0.0.0.0 UG 0 0 0 eth1

2.编辑静态路由 在 Linux 的使用过程中用户一般很少会直接编辑路由表,这是因为在增加或删除一个网

络接口,以及网络接口 IP 地址发生变化时,Linux 内核会自动增加或删除适当的条目来指定

本地网络。不过可以使用“route add default gw <IP 地址>”增加新网关;使用“route del default

gw <IP 地址>”从路由表中删除网关。

查看系统目前路由表。

[root@srv ~]# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.159.0 * 255.255.255.0 U 0 0 0 eth0 192.168.158.0 * 255.255.255.0 U 0 0 0 eth0 192.168.56.0 * 255.255.255.0 U 0 0 0 eth1

Linux 从初学到精通

354

192.168.157.0 * 255.255.255.0 U 0 0 0 eth0 169.254.0.0 * 255.255.0.0 U 0 0 0 eth1 default 192.168.56.2 0.0.0.0 UG 0 0 0 eth1

增加一个网关。

[root@srv ~]# route add default gw 192.168.159.1 [root@srv ~]# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.159.0 * 255.255.255.0 U 0 0 0 eth0 192.168.158.0 * 255.255.255.0 U 0 0 0 eth0 192.168.56.0 * 255.255.255.0 U 0 0 0 eth1 192.168.157.0 * 255.255.255.0 U 0 0 0 eth0 169.254.0.0 * 255.255.0.0 U 0 0 0 eth1 default 192.168.159.1 0.0.0.0 UG 0 0 0 eth0 default 192.168.56.2 0.0.0.0 UG 0 0 0 eth1

删除网关。

[root@srv ~]# route del default gw 192.168.159.1 [root@srv ~]# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.159.0 * 255.255.255.0 U 0 0 0 eth0 192.168.158.0 * 255.255.255.0 U 0 0 0 eth0 192.168.56.0 * 255.255.255.0 U 0 0 0 eth1 192.168.157.0 * 255.255.255.0 U 0 0 0 eth0 169.254.0.0 * 255.255.0.0 U 0 0 0 eth1 default 192.168.56.2 0.0.0.0 UG 0 0 0 eth1

使用 route 命令增加的网关和使用 ifconfig 命令配置 IP 地址一样是临时的,如果希望配

置的网关永久生效,还是要编辑对应网络接口配置文件中的“GATEWAY”参数。

route 命令也可以使用“route add -net <网段地址> gw <IP 地址>”命令向路由表中增加路

由条目;使用“route del -net <网段地址>”命令删除路由表中已经存在的路由条目。

ARP 配置

ARP 协议(Address Resolution Protocol),或称地址解析协议。ARP 协议的基本功能就是

通过目标设备的 IP 地址,查询目标设备的 MAC 地址,以保证通信的顺利进行。ARP 是 IPv4

中网络层必不可少的协议,不过在 IPv6 中已不再适用,并被 icmp v6 所替代。在 Linux 可以

使用“arp”命令查看、增加、删除本机的 ARP 记录。

显示本机的 ARP 记录。

[root@srv ~]# arp Address HWtype HWaddress Flags Mask Iface 192.168.159.159 ether 00:50:56:C0:00:01 C eth0 192.168.56.2 ether 00:50:56:ED:83:C0 C eth1

开山铺路——Linux 网络管理 第

355

11

使用“arp -s <IP 地址> <MAC 地址>”可以增加 ARP 记录。

[root@srv ~]# arp -s 192.168.159.10 00:50:56:D1:03:04 [root@srv ~]# arp Address HWtype HWaddress Flags Mask Iface 192.168.159.10 ether 00:50:56:D1:03:04 CM eth0 192.168.56.2 ether 00:50:56:ED:83:C0 C eth1 192.168.159.159 ether 00:50:56:C0:00:01 C eth0

使用“arp -d <IP 地址>”可以删除 ARP 记录。

[root@srv ~]# arp -d 192.168.159.10 [root@srv ~]# arp Address HWtype HWaddress Flags Mask Iface 192.168.159.10 (incomplete) eth0 192.168.56.2 ether 00:50:56:ED:83:C0 C eth1 192.168.159.159 ether 00:50:56:C0:00:01 C eth0

在 RHEL 5.x 中可以通过/etc/ethers 文件(需要建立)实现 IP 地址与 MAC 地址绑定的功

能,在配置完成后需要重新启动或使用“arp -f”命令使其生效。在下面的例子中配置该文件

后,这两个 IP 地址就与对应的 MAC 地址绑定。

[root@srv ~]# cat /etc/ethers 192.168.159.10 00:0D:30:98:22:3D 192.168.159.11 00:0D:30:98:22:45

网络测试

在日常使用过程中配置好网络接口的各种属性后都需要通过一些命令测试网络是否连

通、查看网络通信的数据的工作,下面讲述一些 Linux 系统中常用的网络测试工具。

11.5.1 ping:测试网络连通性

ping 命令用于测试两台主机之间底层 IP 连通性, 简单的情况是 ping 命令接一个 IP

地址或主机名作为其单一参数,接着 ping 会向指定的主机发送一个底层(ICMP)回应请求,

如果与目标主机之间是连通的,目标主机会回应一个底层(ICMP)回应应答。该命令语法

如下。

ping [-fnqrRv] [-c <次数>] [-i <间隔秒数>] [-I <网络接口>] [-s <包大小>] [-t <TTL值>]

常用指数:

常用选项:

-c <次数>:指定发出数据包的次数。

-i <间隔秒数>:指定发出数据包的间隔时间,单位为秒,默认为 1 秒。

Linux 从初学到精通

356

-I <网络接口>:指定网络接口送出数据包。在默认情况下该命令使用“ 小数值的”

的活跃接口送出数据包,如“eth0”。

-s <包大小>:指定送出数据包的大小,默认为 64Bytes。

-t <TTL 值>:指定送出数据包的存活数值。

-f:权限侦测,ping 命令会不等待回应就全副发出要求信息,每秒 高可达数百个。

-n:只输入数值,ping 命令将不会尝试去寻找主机地址的符号名称。

-q:不显示命令执行过程,开头和结尾的相关信息除外。

-r:忽略普通的路由表,直接将数据包判定以远程主机。

-R:记录路由过程,在要求信息的数据包中加入 RECORD_ROUTE 的功能,显示数

据包经过的路由过程。

-v:详细显示命令的执行过程。

ping 命令默认以每秒一个回应请求的速度继续连接目标主机,直到用户使用“Ctrl+C”

组合键终止这个操作,同时显示数据包简要统计结果。下面看几个 ping 命令的例子。

[root@srv ~]# ping -c 3 192.168.159.159 PING 192.168.159.159 (192.168.159.159) 56(84) bytes of data. 64 bytes from 192.168.159.159: icmp_seq=1 ttl=128 time=0.330 ms 64 bytes from 192.168.159.159: icmp_seq=2 ttl=128 time=0.228 ms 64 bytes from 192.168.159.159: icmp_seq=3 ttl=128 time=0.235 ms --- 192.168.159.159 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 3698ms rtt min/avg/max/mdev = 0.228/0.264/0.330/0.048 ms [root@srv ~]# ping 192.168.159.100 PING 192.168.159.100 (192.168.159.100) 56(84) bytes of data. From 192.168.159.35 icmp_seq=2 Destination Host Unreachable From 192.168.159.35 icmp_seq=3 Destination Host Unreachable From 192.168.159.35 icmp_seq=4 Destination Host Unreachable --- 192.168.159.100 ping statistics --- 4 packets transmitted, 0 received, +3 errors, 100% packet loss, time 5484ms [root@srv ~]# ping 192.168.158.100 connect: Network is unreachable #无法路由到目标主机。

11.5.2 nslookup:检查 DNS 查询结果

nslookup 是 早且 常被使用来做检查 DNS 查询结果的工具。nslookup 命令在查询时不

会读取本机 DNS 缓存中的数据,而是直接向 DNS 服务器查询。输入该命令后会进入其运行

环境,该命令使用方法如下。

[root@srv ~]# nslookup > www.ptpress.com.cn #输入要查询的主机名。 Server: 192.168.56.2 #显示 DNS服务器的信息。 Address: 192.168.56.2#53 Non-authoritative answer: Name: www.ptpress.com.cn Address: 218.241.142.150 #解析的 IP地址。 >exit #退出 nslookup命令。

开山铺路——Linux 网络管理 第

357

11

11.5.3 traceroute:显示数据包到达目标的路径

traceroute 命令为数据包在路由器之间穿行并 终到达目标的路径提供了详细的说明。该

命令语法如下。

traceroute [-dFlnrvx][-f <存活数值>][-g <网关>...][-i <网络接口>][-m <存活数值>][-p <端口

>][-s <来源地址>][-t <服务类型>][-w <超时秒数>][主机名称或 IP地址][数据包大小]

常用指数:

常用选项:

数据包大小:指定数据包的大小,默认为 40Bytes。

主机名称或 IP 地址:指定目标的主机名或 IP 地址。

-d:使用 Socket 层级的排错功能。

-f <存活数值>:指定第一个检测数据包的存活数值 TTL 的大小。

-F:指定勿离断位。

-g <网关>:指定来源路由网关, 多可设置 8 个。

-i <网络接口>:使用指定的网络界面送出数据包。

-I:使用 ICMP 回应取代 UDP 信息。

-m <存活数值>:指定检测数据包的 大存活数值 TTL 的大小。

-n:直接使用 IP 地址而非主机名称。

-p <端口>:指定 UDP 传输协议的通信端口。

-r:忽略普通路由表,直接将数据包送到远端主机上。

-s <来源地址>:指定本地主机送出数据包的 IP 地址。

-t <服务类型>:指定检测数据包的 TOS 数值。

-v:详细显示命令的执行过程。

-w <超时秒数>:指定等待远端主机回报的时间。

-x:开启或关闭数据包的正确性检验。

traceroute 命令会显示在路径中遇到的每个路由器,并估算访问路由器往返所需的时间。

下面看几个 traceroute 命令的例子。

[root@srv ~]# traceroute nis.nsf.net. traceroute to nis.nsf.net (35.1.1.48), 30 hops max, 38 byte packet 1 helios.ee.lbl.gov (128.3.112.1) 19 ms 19 ms 0 ms 2 lilac-dmc.Berkeley.EDU (128.32.216.1) 39 ms 39 ms 19 ms 3 lilac-dmc.Berkeley.EDU (128.32.216.1) 39 ms 39 ms 19 ms 4 ccngw-ner-cc.Berkeley.EDU (128.32.136.23) 39 ms 40 ms 39 ms 5 ccn-nerif22.Berkeley.EDU (128.32.168.22) 39 ms 39 ms 39 ms 6 128.32.197.4 (128.32.197.4) 40 ms 59 ms 59 ms 7 131.119.2.5 (131.119.2.5) 59 ms 59 ms 59 ms 8 129.140.70.13 (129.140.70.13) 99 ms 99 ms 80 ms 9 129.140.71.6 (129.140.71.6) 139 ms 239 ms 319 ms 10 129.140.81.7 (129.140.81.7) 220 ms 199 ms 199 ms 11 nic.merit.edu (35.1.1.48) 239 ms 239 ms 239 ms

Linux 从初学到精通

358

11.5.4 tcpdump:监视网络传输数据

tcpdump 命令允许用户直接监视网络,显示独立的数据包的信息。该命令语法如下。

tcpdump [-entq] [-v|-vv|-vvv] [-i <网络接口>] [-c <次数>] [-w <文件名>] [-r <文件名>] [-s <包大小>] [过滤表达式]

常用指数:

常用选项:

-i <网络接口>:侦听指定网络接口的数据包。在默认情况下该命令“ 小数值的”

的活跃接口,如“eth0”。使用“-i any”可侦听所有网络接口。

-c <次数>:侦听指定次数的数据包后退出。

-w <文件名>:将输入出结果以二进制格式保存在指定文件中。

-r <文件名>:查看指定文件中的数据,该文件是使用“-w”参数保存的文件。

-s <包大小>:指定每个数据包的大小,单位为 Byte,默认值为 68。

-e:在输出中显示数据链接标题信息。

-n:按数据顺序,而不是主机名顺序显示 IP 地址。

-q:快速显示每个数据包 基本的信息。

-t:禁止显示时戳标志。

-v|-vv|-vvv:“详述”、“非常详述”、“非常非常详细”在数据包概述中包括的信息。

每次运行 tcpdump 命令后该命令会一直执行(除非使用“-c”参数),直到使用“Ctrl+C”

组合键取消这个命令。tcpdump 命令的过滤表达式使用如下格式。

[[类型]|[方向]|[协议]] 标识

过滤表达式由一个或多个原语组成,原语通常由一个标识(名称或数字)和标识前面的

一个或多个修饰字符组成。修饰字符有三种不同的类型。

(1)类型,指出标识名称或标识数字代表的是什么内容,可以使用的类型有 host、net

和 port,如“host srv”、“net 192.168”、“port 80”。如果不指定类型修饰字符,默认为 host。

(2)方向,指出相对于标识的传输方向(数据是传入还是传出标识),可以使用的方向包

括 src、dst、src or dst 和 src and dst,如“dst net 192.168”、“src or dst port ftp-data”。如果不

指定方向修饰字符,默认为 src or dst。

(3)协议,要求匹配指定的协议,可以使用的协议包括 ether、fddi、ip、arp、rarp、decnet、

lat、sca、moprc、mopdl、tcp 和 udp,如“arp net 192.168”、“tcp port 80”。如果不指定协议

修饰字符,就使用所有符合类型的协议。

下面看几个 tcpdump 命令的例子。

显示 3 个端口 22 的数据包。

[root@srv ~]# tcpdump -c 3 port 22 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

开山铺路——Linux 网络管理 第

359

1110:55:15.242203 IP 192.168.159.35.ssh > 192.168.159.159.50877: P

3738863473:3738863589(116) ack 2228367830 win 125 10:55:15.245381 IP 192.168.159.159.50877 > 192.168.159.35.ssh: . ack 116 win 16125 10:55:15.24629IP192.168.159.35.ssh>192.168.159.159.50877:P116:232(116)ack1win12

显示 3 个 UDP 端口 53 的数据包。

[root@srv ~]# tcpdump -c 3 udp port 53 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

11.5.5 wireshark

Wireshark(Wireshark 官方网站:http://www.wireshark.org/)是一个网络数据采集分析软

件。Wireshark 在 GPL 通用许可证的保障范围下,使用者可以免费取得软件与其源代码。

Wireshark的前身是Ethereal,2006年6月因为商标的问题,Ethereal更名为Wireshark。Wireshark

是目前全世界 广泛的网络数据采集分析软件之一。

1.wireshark 安装 在 RHEL 5.x 中包含有 Wireshark 的软件包,可直接使用以下命令安装 Wireshark(由于

该软件的依赖关系比较多,所以推荐使用 YUM 方式安装)。

yum -y install wireshark-gnome

安装完成后,使用如下命令即可启动 Wireshark,如图 11-1 所示为 Wireshark 主界面。

[root@srv ~]# wireshark

图 11-1 Wireshark主界面

图 11-2 选择网络接口

2.wireshark 使用 使用 Wireshark 简单的方法就是直接选择需要进行捕获的网络接口,选择时只需单击

“Interfaces”按钮,在弹出窗口中选择需要的网络接口即可,如图 11-2 所示。

Wireshark 提供了一个功能强大的 GUI 界面,用来整理网络数据的捕获及随后的网络通

信浏览。主窗口包括一组菜单项,界面结构,许多菜单从名字上看一目了然。在报文摘要窗

口包含所有捕获报文的摘要,该面板包含报文号、时间戳、源、目的、协议及信息域(如图

Linux 从初学到精通

360

11-3 所示,①是显示过滤器、②是报文摘要窗口、③是报文细节窗口)。这些域是可定制的,

并且可删除或加入其他的报文字段信息。

图 11-3 Wireshark捕获数据

3.统计工具

Wireshark 提供了大量不同的统计工具给用户使用和参考,所有的统计工具在“statistics”

菜单项中,其中常用的包括“Summary”(综合统计)、“Protocol Hierarchy”(协议层统计)、

“Conversations”(会话统计)、“Endpoints”(节点统计)(一个网络端点是在特定的协议层的

通信的逻辑端点)、“IO Graphs”(输入/输出统计图)、“Conversation List”(会话列表)、“Endpoint

List”(节点列表)、“Service Response Time”(服务响应时间)等。

(1)“Summary”(综合统计)。在综合窗口里可以查看全局的统计信息包括保存捕捉结果

的文件、捕捉时间、捕捉过滤器的信息、显示过滤器的信息,如图 11-4 所示。

(2)“Protocol Hierarchy”(协议层统计)。显示按照 OSI 七层分类后的统计数据(如图 11-5

所示)。

(3)“IO Graphs”(输入/输出统计图)。以生成一些简单的输入输出图,也可以通过添加

显示过滤器而生成新的图表,并将绘制在一起进行比较,如图 11-6 所示是同时生成了“tcp”

和“http”数据的图表。

开山铺路——Linux 网络管理 第

361

11

图 11-4 综合统计

图 11-5 协议层统计

4.过滤器 一般在使用 Wireshark 截获数据包之前,应该为其设置相应的过滤规则,这样可以只捕

获感兴趣的数据包。Wireshark 使用与 Tcpdump 相似的过滤规则,并且可以很方便地存储已

经设置好的过滤规则。要为 Wireshark 配置过滤规则,首先单击“Capture”→“Capture Filters...”

菜单项,打开“Wireshark:Capture Filter”窗口。在该窗口中默认已经建立很多过滤器。如果

需要添加过滤器时,指定该过滤器的名称及规则。如在“Filter name”中输入过滤器名称(该

名称可根据需要定义),在“Filter string”中输入过滤规则“ip src host 192.168.159.159”,然

后单击“New”按钮(如图 11-7 所示),那么应用该过滤器时将只捕获来源 IP 地址是

192.168.159.159 的数据包。

图 11-6 输入/输出统计图

图 11-7 配置过滤规则

过滤规则定义完成后,可以在选择侦听网络接口窗口中单击“Options”按钮,在弹出窗

口中单击“Capture Filter”按钮后选择合适的过渡规则,也可以直接在“Capture Filter”的输

入框中输入一个临时使用的过滤规则(图 11-8 是应用了“ip src host 192.168.159.159”规则后

Wireshark 所捕获的数据包)。

Linux 从初学到精通

362

图 11-8 捕获感兴趣的数据包

图 11-9 Wireshark支持的协议类型

Wireshark 过滤器可分为捕捉过滤器和显示过滤器两种。捕捉过滤器用于决定将什么样的

数据包信息记录在捕捉结果中,需要在开始捕捉前设置(前面定义的“ ip src host

192.168.159.159”就是捕捉过滤器);显示过滤器在捕捉结果中进行详细查找,可以在得到捕

捉结果后随意修改。这两种过滤器的目的各有不同,捕捉过滤器是数据经过的第一层过滤器,

捕捉过滤器用于控制捕捉数据的数量,以避免产生过大的日志文件。显示过滤器是一种更为

强大(复杂)的过滤器,允许在日志文件中迅速准确地找到所需要的记录。两种过滤器使用

的语法是完全不同的。

(1)捕捉过滤器。捕捉过滤器的语法与其他使用 Lipcap 或 Winpcap 库开发的软件一样。

捕捉过滤器必须在开始捕捉前设置完毕(如图 11-10 所示),捕捉过滤器定义规则的语法如下。

协议 方向 类型 值 逻辑关系 其他规则

图 11-10 捕捉过滤器

其中“协议”用于定义捕捉哪种协议的数据包,可能的值包括 ether、fddi、ip、arp、rarp、

开山铺路——Linux 网络管理 第

363

11

decnet、lat、sca、moprc、mopdl、tcp and udp 等(如图 11-9 所示当前版本的 Wireshark 支持

的协议类型可以通过“Help”→“Supported Protocols”查看),默认捕捉所有协议;“方向”

用于定义捕捉数据包的来源或目的地,可能的值包括 src、dst、src and dst、src or dst,默认

值是 src or dst;“类型”用于定义后继参数“值”所表示的内容,可能的值包括 net、port、host、

portrange,默认值是 host;“逻辑关系”用于定义多个规则之间的关系,可能的值包括 not、

and、or,否(“not”)具有 高的优先级。或(“or”)和与(“and”)具有相同的优先级,运

算时从左至右进行。下面是几个捕捉过滤器的例子。

显示目的 TCP 端口为 3128 的数据包。

tcp dst port 8080

显示来源 IP 地址为 192.168.159.100 的数据包。

ip src host 192.168.159.100

显示目的或来源 IP 地址为 192.168.159.200 的数据包。

host 192.168.159.200

显示主机名为 www.example.com 并且端口不是 80 或 25 的数据包。

host www.example.com and not (port 80 or port 25)

显示来源为 UDP 或 TCP 且端口号在 2000 至 2100 范围内的数据包。

src portrange 2000-2100

显示除了 icmp 以外的所有数据包。

not imcp

显示来源 IP地址为 192.168.159.20,但是目的地不是 192.168.158.0/24网段的数据包。

src host 192.168.159.20 and not dst net 192.168.158.0/24

显示来源 IP 为 192.168.159.20 或来源网络为 192.168.158.0/24,目的地 TCP 端口号

在 2000 至 4000 之间,并且目的位于网络 192.168.157.0/24 内的所有数据包。

(src host 192.168.159.20 or src net 192.168.158.0/24) and tcp dst portrange 2000-4000 and dst net 192.168.157.0/24

当使用关键字作为值时,需要使用反斜杠“\”进行转义。如“ether proto \ip”(与关键

字“ip”相同),这样写将会以 IP 协议作为目标。在规则中可以在“ip”或“ether”后面使

用“multicast”及“broadcast”关键字。当需要排除广播请求时,“no broadcast”就会非常

有用。

(2)显示过滤器。通常经过捕捉过滤器过滤后的数据还是很复杂。此时可以使用显示过

滤器进行更加细致的查找。显示过滤器的功能比捕捉过滤器更为强大,而且在修改过滤器条

件时(如图 11-11 所示),并不需要重新捕捉一次。显示过滤器定义规则的语法如下。

提 示

Linux 从初学到精通

364

图 11-11 显示过滤器

协议 字符串 1 字符串 2 比较运算符 值 逻辑关系其他规则

其中,“协议”用于指定过滤的协议类型;“字符串 1 字符串 2”属于可选项,用于定义

协议的子类(协议子类定义方法可通过“Help”→“Supported Protocols”的“Display Filter Fields”

选项页查看);“比较运算符”可能的值包括==(等于)、!=(不等于)、>(大于)、<(小于)、

>=(大于等于)、<=(小于等于);逻辑运行符可能的值包括&&(逻辑与)、||(逻辑或)、^^

(逻辑异或)、!(逻辑非)。下面是几个显示过滤器的例子。

显示 SNMP 或 DNS 或 ICMP 数据包。

snmp || dns || icmp

显示来源或目的 IP 地址为 192.168.159.200 的数据包。

ip.addr == 192.168.159.200

显示来源不为 192.168.159.200 或者目的 IP 不为 192.168.159.100 的数据包。

ip.src != 192.168.159.200 || ip.dst != 192.168.159.100

显示来源不为 192.168.159.200 并且目的 IP 不为 192.168.159.100 的数据包。

ip.src != 192.168.159.200 && ip.dst != 192.168.159.100

显示来源或目的 TCP 端口号为 53 的数据包。

tcp.port == 53

显示目的 TCP 端口号为 53 的数据包。

tcp.dstport == 53

显示包含 TCP 标志的数据包。

tcp.flags

开山铺路——Linux 网络管理 第

365

11

显示包含 TCP SYN 标志的数据包。

tcp.flags.syn == 0x02

显示 MAC 地址前三位是 00:06:5 的数据包。

eth.addr[0:3]==00:06:5B

图形化管理 Linux 网络参数

在 RHEL 5.x 中提供了一个图形界面工具用于配置网络参数,可以通过如图 11-12 所示的

方法,也可以通过 system-config-network 命令打开该工具。

在 RHEL 5.x 中还提供了一个伪图形界面的工具,该工具可以在图形界面也可以在字

符模式下使用。通过“system-config-network-tui”可以打开该工具。

在 system-config-network 中选择需要配置的网络接口后,单击“Edit”按钮(如图 11-13

所示),任何修改都需要单击“Activate”按钮使更改生效。在弹出窗口中主要有三个选项页,

在“Route”选项页可以设置静态路由,在“Hardware Device”选项页可以修改该网络接口的

MAC 地址(如图 11-14 所示),在“General”选项页中各选项含义如下。

图 11-12 system-config-network

图 11-13 配置网络接口

(1)Activate device when computer stats:指定该网络接口在主机启动时,是否自动启用。

(2)Allow all users to enable and disable the device:允许普通用户启用或禁用该网络接口。

(3)Enable IPv6 configuration for this interfac:在当前网络接口开启 IPv6 支持。

(4)Automatically obtain IP address Settings with:将该主机配置为 DHCP 客户端。

提 示

Linux 从初学到精通

366

(5)Hostname(optional):主机名。

(6)Automatically obtain DNS information from provider:动态获取 DNS 相关信息。

(7)Statically set IP addresses:将该主机配置为静态 IP(选择此项后,甚少需要输入

Address、Subnet Network 的值)。

(8)Set MTU to:设置 大传输单元。

图 11-14 Route及 Hardware Device选项页

实验任务

在一台安装了 RHEL 5.x 的计算机上完成以下任务。

(1)配置 IP 地址为:192.168.159.200。

(2)配置网关为:192.168.159.1。

(3)配置主机名为:cli.example.zqin。

(4)增加一条针对 192.168.159.100 的 ARP 记录。

(5)增加两个 IP 别名并配置 IPod 地址为:192.168.159.201、192.168.159.202。

(6)显示从本机访问“www.ptpress.com.cn”要经过多少个路由器。

本章测试

(1)使用( )可以使修改过的网络接口配置文件内容生效。

A.ifup eth0 B.ifdown eth0

开山铺路——Linux 网络管理 第

367

11

C.ifdown eth0;ifup eth0 D.restart eth0

(2)在下列命令中,( )可以使用 eth0 的 IP 地址配置为 192.168.159.10。

A.netcfg eth0 192.168.159.10/255.255.255.0

B.ifconfig eth0 192.168.159.10/255.255.255.0

C.ifconfig eth0 192.168.159.10 netmask 255.255.255.0

D.netcfg eth0 192.168.159.10 netmask 255.255.255.0

(3)使用( )命令可以查看系统当前的主机名。

A.host B.hostname

C.ifconfig D.ipname

(4)网络接口 eth2 的配置内容在( )文件中。

A./etc/sysconfig/network

B./etc/sysconfig/network-script/ifcfg-eth

C./etc/sysconfig/network-script/ifcfg-eth2

D./etc/sysconfig/network-script/ifcfg

(5)使用( )命令可以打开 RHEL 5.x 所提供的图形界面网络配置工具。

A.system-config-network B.sysconfig-network

C.system-config-interface D.sysconfig-interface

(6)以下网络接口名中( )是以太网接口。

A.eth0 B.net0

C.tr1 D.net

(7)在网络接口配置文件中,( )应该是使用了 DHCP 配置的接口。

A.DHCP=yes B.IPADDR=DHCP

C.BOOTPROTO=DHCP D.ONBOOT=DHCP

(8)使用( )命令可以测试 DNS 名称解析。

A.tcpdump B.hostname

C.nslookup D.netstat

(9)在( )文件中可以定义 MAC 地址与 IP 地址的对应关系。

A./etc/resolv.conf B./etc/hosts

C./etc/network D./etc/ethers

(10)使用( )命令可以测试两台主机之间的连通性。

A.host B.ping

C.ifconfig D.arp

对于小型企业的网络管理员来说,手动设置每台计算机的 IP

地址,并不是一件很困难的工作,但对于大中型网络而言,管理

员手动设置每一台计算机的 IP 地址不但工作量大,而且容易出

错。所以一般在大中型网络中会采用 DHCP 服务为客户端自动分

配 IP 地址。

第12章

IP

由我定︱︱D

HCP

服务配置

IP 由我定——DHCP 服务配置 第

369

12

DHCP 基础

动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)是一种使网络管理员

能够集中管理和自动分配 IP 网络地址的通信协议。在 IP 网络中,每个设备都需要分配唯一

的 IP 地址。DHCP 使网络管理员能从中心节点监控和分配 IP 地址。当某台设备接入网络时,

能自动收到新的 IP 地址。

DHCP 使服务器能够动态地为网络中的其他设备提供 IP 地址,通过使用 DHCP,就可以

不需要为网络中除少数服务器以外的任何设备配置和维护静态 IP 地址。使用 DHCP 可以大

大简化配置客户机的 TCP/IP 的工作,尤其是当某些 TCP/IP 参数改变时,如网络的大规模重

建而引起的 IP 地址和子网掩码的更改。

DHCP 服务器除可以为网络中的设备分配 IP 地址外,还可以分配子网掩码、默认网关

DNS 服务器等其他 TCP/IP 信息。一般这些信息并非永久地使用,而是有一个使用的时限,

这个时限被称为租约。

如果网络中存在 DHCP 服务器,当某台需要 IP 地址的客户机接入网络时,这台设备通

过以下 4 个步骤获得 IP 地址,如图 12-1 所示。

图 12-1 DHCP工作原理

(1)客户端请求 IP 租约。DHCP 客户端在网络中广播一个 DHCP Discover 包,该数据包

使用 UDP 的 67 端口,以源 IP 地址为 0.0.0.0、目的 IP 地址为 255.255.255.255,该数据包还

包含客户端的 MAC 地址和计算机名,以使 DHCP 服务器能够确定是哪个客户端发出的请求。

(2)服务器响应。当 DHCP 服务器接收到客户端请求 IP 地址的信息时,就在自己的 IP

地址库中查找是否有可用 IP 地址,如果有 DHCP 服务器广播一个 DHCP Offer 包。该数据包

使用 UDP 的 68 端口,源 IP 地址为 DHCP 服务器 IP 地址、目的 IP 地址为 255.255.255.255,

该数据包还包含 DHCP 客户端的 MAC 地址(用来正确标识客户端)、DHCP 服务器提供的合

法 IP 地址、子网掩码、租约期限、服务器 IP 地址。

(3)客户端选择。DHCP 客户端从接收到的第一个 DHCP Offer 包中选择 IP 地址,并发

送 DHCP Request 包广播,表明客户端使用 IP 地址提供的服务器。该数据包使用 UDP 的 67

端口,以源 IP 地址为 0.0.0.0、目的 IP 地址为 255.255.255.255。

Linux 从初学到精通

370

(4)服务器确认。DHCP 服务器在收到 DHCP Request 包后,会以 DHCP ACK 包向客户

端广播确认成功,该数据包使用 UDP 的 68 端口,源 IP 地址为 DHCP 服务器 IP 地址、目的

IP 地址为 255.255.255.255。当客户端收到 DHCP ACK 包后,就会使用得到的 IP 地址。完成

了整个租约产生的过程。

当客户端得到 IP 地址后会发送一个 ARP 请求,如果有回应则表示得到的 IP 地址已被其

他客户端使用,这时该客户端会放弃已得到的 IP 地址,重新开始新一轮的 IP 地址申请。如

果是 Windows 客户端当发出的所有 DHCP Discover 包都没有得到回应时,默认情况下会随机

选择一个 169.254.0.0/16 网段的 IP 地址,然后每隔 5 分钟再次发出 DHCP Discover 包。

当已得到 IP 地址的客户端重新启动或租约到达 50%时,就需要重新更新租约,客户端直

接向提供租约的 DHCP 服务器发送 DHCP Request 包,要求更新现有地址租约。如果 DHCP

服务器收到请求,它将发送 DHCP ACK 给客户端,用于更新客户端租约。如果客户端无法与

提供租约的 DHCP 服务器通信,则客户端会再次等到租约到达 87.5%时,重新进行租约更新,

但这时客户端会向网络上所有的 DHCP 服务器广播以更新现有租约。如果 DHCP 服务器响应

客户端请求,那客户端会使用该服务器提供的地址信息更新现有的租约。如果租约终止或无

法与其他 DHCP 服务器通信,客户端将无法使用现有的地址租约。

DHCP 服务安装

几乎在所有的 Linux 发行版中都包括了 DHCP 服务的软件包,RHEL 5.x 中 DHCP 服务

包括以下几个软件包。

(1)dhcp:DHCP 服务器端软件。

(2)dhcp-devel:DHCP 服务器开发工具,为 DHCP 开发提供库文件支持。

(3)dhcpv6:DHCP 的 IPv6 扩展工具,使 DHCP 服务器支持 IPv6。

(4)dhcpv6_client:DHCP 客户端 IPv6 支持软件。

DHCP 服务在安装时并没有太多依赖软件包,可以直接使用如下命令安装 DHCP 服务软

件包。在使用不同版本 RHEL 时,DHCP 服务的版本可能会有小的区别,但并不影响其后的

配置;“/mnt”目录是 RHEL 5.x 光盘的挂载点。

rpm -ivh /mnt/Server/dhcp-3.0.5-21.el5.i386.rpm

和其他 Linux 下的 System V 服务一样安装完成后,可以使用“service”命令启动、停止、

重新启动服务;使用“chkconfig”命令调整在指定运行级别是否自动加载。

service dhcpd start #启动服务。 service dhcpd stop #停止服务。 service dhcpd restart #重新启动服务。 service dhcpd status #查看服务当前运行状态。 chkconfig dhcpd on #在运行级别 2、3、4、5上设置为下次开机时自动运行。 chkconfig dhcpd off #在运行级别 2、3、4、5上设置为下次开机时不自动运行。

如果不需要再使用 DHCP 服务,可通过以下命令现在卸载 DHCP 服务。

IP 由我定——DHCP 服务配置 第

371

12rpm -e dhcp

DHCP 服务配置

在通过 rpm 包将 dhcpd 安装完成后,其配置文件为/etc/dhcpd.conf 文件。在修改该文件时

应注意以下几点。

(1)以“#”开始的是注释行(在执行时将被忽略)。

(2)关键字对大小写不敏感。

(3)除块标识(大括号)以外每行必须以分号作为行结束符。

在 RHEL 5.x 提供的 dhcpd 软件包中,包括一个 dhcpd 服务配置文件的模板,在 dhcpd

配置文件/etc/dhcpd.conf 的默认内容中记录了模板文件的存放路径(如下所示)。对于初学者

可以将模板文件的内容复制到/etc/dhcpd.conf 文件中进行修改,这样可以有效地降低配置的难

度,同时也避免出错。

[root@ds ~]# tail -1 /etc/dhcpd.conf # see /usr/share/doc/dhcp*/dhcpd.conf.sample [root@ds ~]# cp /usr/share/doc/dhcp*/dhcpd.conf.sample /etc/dhcpd.conf cp: overwrite `/etc/dhcpd.conf'? y #输入“y”覆盖原有配置文件。

以下为覆盖后/etc/dhcpd.conf 文件内容,该文件主要分为全局配置、作用域配置两个部分。

全局配置中的参数对整个 DHCP 服务器的所有作用域生效,而作用域中的参数只对当前作用

域生效。

[root@ds ~]# grep -v ^$ /etc/dhcpd.conf #以下为全局配置。 ddns-update-style interim; ignore client-updates; #以下为作用域配置。 subnet 192.168.0.0 netmask 255.255.255.0 { # --- default gateway option routers 192.168.0.1; option subnet-mask 255.255.255.0; option nis-domain "domain.org"; option domain-name "domain.org"; option domain-name-servers 192.168.1.1; option time-offset -18000; # Eastern Standard Time # option ntp-servers 192.168.1.1; # option netbios-name-servers 192.168.1.1; # --- Selects point-to-point node (default is hybrid). Don't change this unless # -- you understand Netbios very well # option netbios-node-type 2; range dynamic-bootp 192.168.0.128 192.168.0.254; default-lease-time 21600; max-lease-time 43200; # we want the nameserver to appear at a fixed address

Linux 从初学到精通

372

host ns { next-server marvin.redhat.com; hardware ethernet 12:34:56:78:AB:CD; fixed-address 207.175.42.254; } }

当 dhcpd 所在服务器有多个网络接口,如果只需要其中某一个网络接口接收来自客户端

的 DHCP 请求时,可以将/etc/sysconfig/dhcpd 中的“DHCPDARGS”参数指定为可以接收请

求的网络接口名,下面的例子会使 dhcpd 所在服务器只接收 eth0 收到的请求。

DHCPDARGS="eth0"

如果希望多个网络接口自客户端的 DHCP 请求时,可以将/etc/sysconfig/dhcpd 中的

“DHCPDARGS”参数指定为如下内容。

DHCPDARGS="eth0 eth1"

dhcpd 除了上述配置文件以外,还会使用/var/lib/dhcpd/dhcpd.leases 记录租约信息,即已

经分配给客户端的 IP 地址信息。该文件默认是一个空白文件,只有在 dhcpd 成功为客户端分

配 IP 地址后才会有内容。

12.3.1 作用域配置

DHCP 作用域是本地逻辑子网中可以使用的 IP 地址的集合。DHCP 服务器只能使用作用

域中定义过的 IP 地址来分配给 DHCP 客户端,因此,首先必须创建作用域才能让 DHCP 服

务器分配 IP 地址给 DHCP 客户端。另外,DHCP 服务器会根据接收到 DHCP 客户端租约请

求的网络接口来决定哪个 DHCP 作用域为 DHCP 客户端分配 IP 地址租约,决定的方式如下:

DHCP 服务器将接收到租约请求的网络接口的主 IP 地址和 DHCP 作用域的子网掩码相与,如

果得到的网络 ID 和 DHCP 作用域的网络 ID 一致,则使用此 DHCP 作用域来为 DHCP 客户

端分配 IP 地址租约,如果没有匹配的 DHCP 作用域则不对 DHCP 客户端的租约请求进行应

答。这确保了 DHCP 服务器只是分配匹配自己接收到 DHCP 客户端租约请求的网络接口网络

ID 的 IP 地址租约给 DHCP 客户,从而 DHCP 客户可以直接和 DHCP 服务器进行通信(如果

配置了 DHCP 中继代理则不一定,有关 DHCP 中继代理参见 12.3.4)。如 DHCP 服务器从自

己的网络接口 192.168.159.10/24 接收到 DHCP 客户端的租约请求,如果 DHCP 服务器具有一

个子网掩码为 255.255.255.0、网络 ID 为 192.168.159.0 的 DHCP 作用域,则使用此作用域中

的 IP 地址为 DHCP 客户端提供租约;如果没有匹配上述条件的 DHCP 作用域,则此 DHCP

服务器不应答 DHCP 客户端的租约请求。在 dhcpd 中配置作用域采用如下格式。

subnet <网络 ID> netmask <子网掩码> { option subnet-mask <子网掩码>;:指定客户端子网掩码。 range <起始 IP地址> <结束 IP地址>;:指定地址池,即可分配的 IP地址范围。 default-lease-time <时间>;:指定默认租约时间,单位是秒。 max-lease-time <时间>;:指定最长租赁时间,单位是秒。 }

在如图 12-2所示的网络拓扑中DHCP服务器 ds.example.zqin需要为网络中的客户端分配

IP 由我定——DHCP 服务配置 第

373

12

IP 地址,应将/etc/dhcpd.conf 中配置为如下内容。

图 12-2 作用域配置

ddns-update-style interim; ignore client-updates; subnet 192.168.159.0 netmask 255.255.255.0 { option subnet-mask 255.255.255.0; #可以分配给客户端的 IP地址为 192.168.159.20/24到 192.168.159.200/24。 range dynamic-bootp 192.168.159.20 192.168.159.200; default-lease-time 21600; max-lease-time 43200; }

在上述修改完成后,应使用如下命令重新启动 dhcpd 服务,使配置文件生效并将 DHCP

服务设置为下次开机时自动运行。

[root@ds ~]# service dhcpd restart [root@ds ~]# chkconfig dhcpd on

如果可以分配给客户端的 IP 地址不连续,如 192.168.159.20/24 到 192.168.159.100、

192.168.159.120/24 到 192.168.159.200 时,可以使用如下配置。

ddns-update-style interim; ignore client-updates; subnet 192.168.159.0 netmask 255.255.255.0 { option subnet-mask 255.255.255.0; range dynamic-bootp 192.168.159.20 192.168.0.100; range dynamic-bootp 192.168.159.120 192.168.0.200; default-lease-time 21600; max-lease-time 43200; }

Linux 从初学到精通

374

在同一台 DHCP 服务器,一个子网只能够有一个作用域。

当客户端成功向该 DHCP 服务器申请 IP 地址后,其记录租约信息的文件就会记录 IP 地

址的出租情况,下面的/var/lib/dhcpd/dhcpd.leases 文件就是 DHCP 服务器已经为一个网络接口

MAC 地址为“00:0c:29:ce:b4:df”的客户端分配了 192.168.159.200 的 IP 地址。

[root@ds ~]# grep -v ^# /var/lib/dhcpd/dhcpd.leases lease 192.168.159.200 { starts 0 2010/01/03 03:52:40; #租约起始时间。 ends 0 2010/01/03 09:52:40; #租约结束时间。 binding state active; next binding state free; hardware ethernet 00:0c:29:ce:b4:df; #客户端网络接口 MAC地址。 uid "\001\000\014)\316\264\337"; client-hostname "client100"; #客户端计算机名称。 }

12.3.2 选项配置

DHCP 服务除了可以为客户端分配 IP 地址、子网掩码以外,还可以为客户端提供其他的

TCP/IP 信息,如网关、DNS 服务器等,这些信息需要通过 DHCP 选项的配置实现。在 DHCP

配置文件中常用的选项有以下几个。

(1)指定客户端获得 IP 地址的子网掩码。

option subnet-mask <子网掩码>

(2)指定客户端获得的默认网关。

option routers <IP地址>

(3)指定客户端获得的广播地址。

option broadcast-address <IP地址>;

(4)指定客户端获得的 NIS 域名。

option nis-domain <"域名">;

(5)指定客户端获得的 DNS 后缀。

option domain-name <"域名">;

(6)指定客户端获得的 DNS 服务器 IP 地址。

option domain-name-servers <IP地址>;

(7)指定 DHCP 客户端获得的网络时间服务器 IP 地址。

option ntp-server <IP地址>;

(8)指定客户端时间与格林威治时间的偏移时间量,单位是秒。

option time-offset <时间>;

提 示

IP 由我定——DHCP 服务配置 第

375

12

在如图 12-2所示的网络拓扑中DHCP服务器 ds.example.zqin需要为网络中的客户端分配

IP 地址,并将客户端的默认网关指向 192.168.159.1、DNS 服务器指向 192.168.159.15、DNS

后缀指定为 example.zqin,应将/etc/dhcpd.conf 中配置为如下内容。

ddns-update-style interim; ignore client-updates; subnet 192.168.159.0 netmask 255.255.255.0 { option routers 192.168.159.1; option domain-name "example.zqin"; option domain-name-servers 192.168.159.15; option subnet-mask 255.255.255.0; range dynamic-bootp 192.168.159.20 192.168.159.200; default-lease-time 21600; max-lease-time 43200; }

DHCP 服务的选项出现在作用域时,只会被从当前获取 IP 地址的客户端得到;DHCP 服

务的选项出现在全局配置中时,只要是从当前 DHCP 服务器获取 IP 地址的客户端都会得到。

在如图 12-3 所示的网络拓扑中,/etc/dhcpd.conf 文件配置为如下内容时,192.168.159.0/24、

192.168.158.0/24 两个网段的所有客户端都会得到 DNS 后缀及 DNS 服务器 IP 地址的信息。

图 12-3 多作用域

ddns-update-style interim; ignore client-updates; #全局配置。 option domain-name "example.zqin"; option domain-name-servers 192.168.159.15; subnet 192.168.159.0 netmask 255.255.255.0 { option subnet-mask 255.255.255.0; range dynamic-bootp 192.168.159.20 192.168.159.200; default-lease-time 21600; max-lease-time 43200; } subnet 192.168.158.0 netmask 255.255.255.0 { option subnet-mask 255.255.255.0; range dynamic-bootp 192.168.158.20 192.168.158.200;

Linux 从初学到精通

376

default-lease-time 21600; max-lease-time 43200; }

如果全局配置中的选项、作用域选项及保留选项(有关保留选项参见 12.3.3 )发生冲突

时,范围越小的优先级越高,如在如下配置中 192.168.158.0/24 网段的客户端会得到的 DNS

服务器 IP 地址为 192.168.159.15、192.168.158.15。

ddns-update-style interim; ignore client-updates; option domain-name "example.zqin"; option domain-name-servers 192.168.159.15; subnet 192.168.159.0 netmask 255.255.255.0 { option subnet-mask 255.255.255.0; range dynamic-bootp 192.168.159.20 192.168.159.200; default-lease-time 21600; max-lease-time 43200; } subnet 192.168.158.0 netmask 255.255.255.0 { option domain-name-servers 192.168.159.15,192.168.158.15; option subnet-mask 255.255.255.0; range dynamic-bootp 192.168.158.20 192.168.158.200; default-lease-time 21600; max-lease-time 43200; }

12.3.3 保留配置

DHCP 服务器每次在有 DHCP 客户端向其申请 IP 地址时,DHCP 服务器会从自己可用 IP

地址中选择一个,但这个选择管理员无法控制。在有些网络环境中管理员可能希望让某些特

定客户端得到一个特定的 IP地址,这时就需要使用DHCP服务器的保留功能。保留是指DHCP

服务器在作用域中保留某一特定的 IP 地址给特定的客户端,让这个客户端永远会分配到同 IP

地址。

在 DHCP 服务器选择可用 IP 地址时,如果使用的 DHCP 服务器是 Windows 系统的

DHCP 服务时,Windows 会从可用 IP 地址中第一个开始分配,类 UNIX 系统的 DHCP 服

务器会从可用 IP 地址中最后一个开始分配。

配置 DHCP 保留时,首先需要知道客户端网络接口的 MAC 地址,然后在/etc/dhcpd.conf

文件中,使用声明“host <名称> {……}”进行配置。在如图 12-4 所示的网络拓扑中,DHCP

服务器 ds.example.zqin 需要为网络中的客户端分配 IP 地址,需要确保将每次为打印服务器分

配的 IP 地址为 192.168.159.11,应将/etc/dhcpd.conf 中配置为如下内容。

提 示

IP 由我定——DHCP 服务配置 第

377

12

图 12-4 保留配置

ddns-update-style interim; ignore client-updates; subnet 192.168.159.0 netmask 255.255.255.0 { option subnet-mask 255.255.255.0; range dynamic-bootp 192.168.159.20 192.168.159.200; default-lease-time 21600; max-lease-time 43200; host ps { hardware ethernet 00:17:31:22:2E:DE; fixed-address 192.168.159.11; } }

在上述修改完成后,重新启动 dhcpd 服务,当打印服务器向 ds.example.zqin 申请 IP 地址

时,每次都会得到 192.168.159.11。

在保留配置完成后,也可以通过保留选项为某台特定的客户指定其他 TCP/IP 参数,在下

面的例子中,只有网络接口 MAC 地址为“00-17-31-22-2E-DE”的客户端才会得到 NTP 服务

器的 IP 地址。

ddns-update-style interim; ignore client-updates; subnet 192.168.159.0 netmask 255.255.255.0 { option subnet-mask 255.255.255.0; range dynamic-bootp 192.168.159.20 192.168.159.200; default-lease-time 21600; max-lease-time 43200; host ps { option ntp-server 192.168.159.100; hardware ethernet 00:17:31:22:2E:DE; fixed-address 192.168.159.11; } }

Linux 从初学到精通

378

12.3.4 中继代理配置

伴随着局域网规模的逐步扩大,一个网络常常会被划分成多个不同的子网,以便根据不

同子网的工作要求来实现个性化的管理要求。考虑到规模较大的局域网一般会使用 DHCP 服

务器来为各个工作站分配 IP 地址,不过一旦局域网被划分成多个不同子网时,那么是不是也

必须在各个不同的子网中分别创建 DHCP 服务器,来为每一子网中的工作站提供 IP 地址分

配服务呢?如果是这样的话,不但操作增大了工作难度,而且还不利于局域网网络的高效管

理。这时可以通过 DHCP 中继代理功能,使 DHCP 服务器可以为多个不同子网提供 IP 地址

分配服务。在如图 12-5 所示的网络拓扑中 DHCP 服务器(ds.example.zqin)就可以通过中继

代理(dr.example.zqin)为 192.168.158.0/24 网段的客户端分配 IP 地址。

图 12-5 DHCP中继代理

(1)DHCP 客户端广播 DHCP Discover 包。

(2)DHCP 中继代理(dr.example.zqin)将 DHCP Discover 以单播转发到 DHCP 服务器

(ds.example.com)。

(3)DHCP 服务器以单播发送 DHCP Offer 包给 DHCP 中继代理。

(4)DHCP 中继代理广播 DHCP Offer 包。

(5)DHCP 客户端广播 DHCP Request 包。

(6)DHCP 中继代理以单播转发 DHCP Request 包给 DHCP 服务器。

(7)DHCP 服务器以单播发送 DHCP ACK 包给 DHCP 中继代理。

(8)DHCP 中继代理广播 DHCP ACK 包。

配置 DHCP 中继代理时,首先需要将作为中继代理的服务器配置为一个固定的 IP 地址。

在如图 12-5 所示的网络拓扑中 DHCP 服务器 ds.example.zqin 需要为网络中 192.168.159.0/24、

192.168.158.0/24 网段的客户端分配 IP 地址,具体操作步骤如下。

(1)将 dr.example.zqin 的 IP 地址配置为 192.168.158.10/24。

(2)在 ds.example.com 修改/etc/sysconfig/dhcpd 文件,内容如下。

#指定接收 DHCP客户端 DHCP Discover包的网络接口。 DHCPDARGS = "eth0"

IP 由我定——DHCP 服务配置 第

379

12

(3)在 ds.example.com 修改/etc/dhcpd.conf 文件,内容如下。

ddns-update-style interim; ignore client-updates; shared-network sc { #定义一个超级作用域。 #此处超级作用域选项,会对 192.168.159.0/24、192.168.158.0/24两个网段的客户端生效。 option domain-name "example.zqin"; option domain-name-servers 192.168.159.15; subnet 192.168.159.0 netmask 255.255.255.0 { option routers 192.168.159.1; option subnet-mask 255.255.255.0; option time-offset -18000; range dynamic-bootp 192.168.159.20 192.168.159.200; default-lease-time 21600; max-lease-time 43200; } subnet 192.168.158.0 netmask 255.255.255.0 { option routers 192.168.158.1; option subnet-mask 255.255.255.0; option time-offset -18000; range dynamic-bootp 192.168.158.20 192.168.158.200; default-lease-time 21600; max-lease-time 43200; } }

(4)在 ds.example.com 上使用如下命令重新启动 DHCP 服务。

[root@ds ~]# service dhcpd restart

(5)在 dr.example.com 上安装 DHCP 服务,使用如下命令前,RHEL5.4 的光盘已使用

mount 命令挂载到/mnt 目录。

[root@ds ~]# rpm -ivh /mnt/Server/dhcp-3.0.5-21.el5.i386.rpm

(6)在 dr.example.com 上修改/etc/sysctl.conf 文件,内容如下。

net.ipv4.ip_forward = 1

(7)在 dr.example.com 上执行如下命令,使对/etc/sysctl.conf 文件的修改立即生效。

sysctl -p

(8)在 dr.example.com 上修改/etc/sysconfig/dhcrelay 文件,内容如下。

INTERFACES=eth1 #指定接收 DHCP客户端 DHCPDiscover包的网络接口。 DHCPSERVERS="192.168.159.10" #指定 DHCP服务器。

(9)在 dr.example.com 上执行如下命令启用中继代理,并设置为下次启动自动加载。

[root@ds ~]# service dhcrelay start [root@ds ~]# chkconfig dhcrelay on

上述配置完成后,DHCP 服务器 ds.example.zqin 将可以为 192.168.159.0/24、192.168.158.0/24

网段的客户端分配 IP 地址。

Linux 从初学到精通

380

12.3.5 其他配置

在/etc/dhcpd.conf 文件中,以“option”开头的都属于选项,除了选项以外在该文件中还

有声明及参数两种类型的配置。

1. 声明

在/etc/dhcpd.conf 文件中声明的格式如下。

声明 { 参数或选项; }

在本章前面内容的讲解过程中使用的“subnet”就是一种最常用的声明,除了“subnet”

外还可以使用以下几种声明。

(1)share-network:指定超级作用域。

share-network <名字> { …… }

(2)subnet:指定作用域。

subnet <网络号> netmask <子网掩码> { …… }

(3)range:指定地址池范围,即可分配的 IP 地址范围。

range <起始 IP地址> <结束 IP地址>

(4)host:指定客户端保留。

host <名称> { hardware <网络类型> <MAC地址>; fixed-address <IP地址>; }

(5)group:为特定范围指定参数。

group { …… }

声明“group”主要用于在一些大型网络中为某几个特定的作用域分配选项。在如图 12-6

所示的网络中,如果只需要为 192.168.158.0/24、192.168.157.0/24 两个网段的客户配置 DNS

服务器 IP 地址为 192.168.158.15,如果使用作用域选项需要同时修改两个作用域的配置,而

使用全局配置选项时 192.168.159.0/24 网段的客户端也会受影响,这里可以使用“group”为

192.168.158.0/24、192.168.157.0/24 两个作用域同时指定,具体配置如下。

IP 由我定——DHCP 服务配置 第

381

12

图 12-6 声明“group”

ddns-update-style interim; ignore client-updates; option domain-name "example.zqin"; option domain-name-servers 192.168.159.15; subnet 192.168.159.0 netmask 255.255.255.0 { option routers 192.168.159.1; option subnet-mask 255.255.255.0; option time-offset -18000; range dynamic-bootp 192.168.159.20 192.168.159.200; default-lease-time 21600; max-lease-time 43200; } group { #定义一个作用域组。 #这里配置的选项只会对该组的作用域生效。 #虽然全局配置中指定了 DNS服务器的 IP地址,但在该组中的作用域会作用这里的选项值。 option domain-name-servers 192.168.158.15; subnet 192.168.158.0 netmask 255.255.255.0 { option routers 192.168.158.1; option subnet-mask 255.255.255.0; option time-offset -18000; range dynamic-bootp 192.168.158.20 192.168.158.200; default-lease-time 21600; max-lease-time 43200; } subnet 192.168.157.0 netmask 255.255.255.0 { option routers 192.168.157.1; option subnet-mask 255.255.255.0; option time-offset -18000; range dynamic-bootp 192.168.157.20 192.168.157.200; default-lease-time 21600; max-lease-time 43200; } }

Linux 从初学到精通

382

2.参数 参数一般用于设置 DHCP 客户端与 DHCP 服务器之间的动作及需要执行的任务,在本章

前面内容的讲解过程中使用的“ddns-update-style interim”就是一种常用的参数,除了

“ddns-update-style interim”外还可以使用以下几种声明。

( 1 ) lease-file-name : 指 定 DHCP 服 务 器 存 放 租 约 的 文 件 名 。 默 认 是

“/var/lib/dhcp/dhcpd.leases”。该参数必须出现在配置文件的顶部,出现在其他位置无效。

lease-file-name <文件名>;

(2)default-lease-time:指定默认租约时间,单位是秒。

default-lease-time <时间>;

(3)max-lease-time:指定最长租赁时间,单位是秒。

max-lease-time <时间>;

(4)hardware:指定 DHCP 客户端保留时网卡类型和 MAC 地址。

hardware <网卡类型> <MAC地址>

(5)fixed-address:指定 DHCP 客户端保留时指定固定的地址。

fixed-address <IP地址>;

(6)local-port port:指定 DHCP 服务器侦听 DHCP 请求的 UDP 端口。

local-port port <端口>;

(7)ping-check:如果设置为 true 当 DHCP 服务器准备动态分配 IP 地址给一个客户端时,

会先发送一个 ICMP Echo 请求(ping)给这个要分配的地址,然后等待 1 秒种(默认情况),

如果没有 ICMP Echo 信息返回,就分配这个地址。如果有返回信息,就把这个地址放弃,服

务器不会给客户端回应。这样会导致在回应 DHCPDISCOVER 信息时默认有 1 秒钟的延迟,

这样有些客户端可能会误以为 DHCP 服务器无法响应。

ping-check <true|false>;

(8)ping-timeout:如果 DHCP 服务器决定发送 ICMP ECHO 检查(ping),ping-timeout

允许配置 DHCP 服务器应该等多长时间。默认值是 1 秒。

ping-timeout <时间>;

客户端配置

DHCP 服务器端配置完成后,客户端通过其获得 TCP/IP 相关信息。在本章中将分别讲述

通过 Windows 客户端及 Linux 客户端如何配置为 DHCP 客户端的方法。

IP 由我定——DHCP 服务配置 第

383

12

12.4.1 Linux 平台

Linux 平台配置 DHCP 客户端可以通过直接修改网络接口配置文件实现。在 RHEL 5.x

中网络接口配置文件位于/etc/sysconfig/network-scripts/目录下,每个网络接口一个配置文件,

其中第一个网络接口配置文件名 ifcfg-eth0,第二个网络接口配置文件名 ifcfg-eth1,以此类推。

下面是将一个使用静态 IP 地址的 Linux 修改为通过 DHCP 服务器动态获取 IP 地址。

# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] DEVICE=eth0 BOOTPROTO=dhcp HWADDR=00:0C:29:3D:38:B8 ONBOOT=yes #以下指定广播地址、IP地址、子网掩码、网络号的参数可以删除或注释。 #BROADCAST=192.168.159.255 #IPADDR=192.168.159.32 #NETMASK=255.255.255.0 #NETWORK=192.168.159.0

修改完成后使用“service network restart”命令重新启动网络服务,也可以使用“ifdown 网

络接口名;ifup 网络接口名”命令只重新启动对应网络接口。

12.4.2 Windows 平台

Windows 平台配置 DHCP 客户端方法非常简单,具体操作步骤如下。

(1)在“控制面板”→“网络和 Internet”→“网络和共享中心”中选择“更改适配器

设置”,如图 12-7 所示。

图 12-7 更改网络配置

(2)选择对应网络接口,单击鼠标右键,在弹出的快捷菜单中选择“属性”命令,如图

12-8 所示。

Linux 从初学到精通

384

图 12-8 选择网络接口

(3)在弹出窗口中选择“Internet 协议版本 4 (TCP/IPv4)”后,单击“属性”按钮,并选

择“自动获得 IP 地址(O)”、“自动获得 DNS 服务器地址(B)”后,单击“确定”按钮即可,

如图 12-9 所示。

图 12-9 配置自动获取 IP地址

实验任务

在如图 12-10 所示的网络拓扑中,通过 RHEL 5.x 自带的 dhcpd 软件实现 DHCP 服务,

完成以下实验任务。

IP 由我定——DHCP 服务配置 第

385

12

图 12-10 DHCP实验任务

(1)保证 DHCP 服务器每次开机后,相关网络参数配置为如下内容。

配置 IP 地址:192.168.159.10

配置默认网关:192.168.159.1

配置 DNS 服务器:192.168.159.15

配置主机名:dhcp.example.zqin

配置默认搜索域:example.zqin

(2)在 DHCP 服务器上安装并配置 dhcpd,实现如下功能。

为 192.168.159.0/24 网段的客户端自动分配 IP 地址,其 IP 地址范围为 192.168.159.20

到 192.168.159.80 及 192.168.159.100 到 192.168.159.180。

为 192.168.158.0/24 网段的客户端自动分配 IP 地址,其 IP 地址范围为 192.168.159.20

到 192.168.159.180。

将 192.168.159.0/24 客户端默认网关指向 192.168.159.1。

将 192.168.158.0/24 客户端默认网关指向 192.168.158.1。

为所有客户端配置 DNS 服务器为 192.168.159.15。

为所有客户端配置 DNS 后缀为 example.zqin。

保证打印服务器(网络接口 MAC 地址:00-50-56-C0-00-01)每次获取的 IP 地址为

192.168.159.25。

本章测试

(1)在 DHCP 服务器的配置中,指定 IP 地址范围的配置选项是( )。

A.IPADDR B.fixed-address

C.range D.host

(2)将 RHEL 5.x 光盘挂载到/media 目录后,应使用( )命令安装 DHCP 服务。

Linux 从初学到精通

386

A.rpm -ivh /media/dhcp-3.0.5-21.el5.i386.rpm

B.rpm -ivh /media/Server/dhcp-3.0.5-21.el5.i386.rpm

C.rpm -ivh /media/Server/dhcpd-3.0.5-21.el5.i386.rpm

D.rpm -e dhcp-3.0.5-21.el5.i386.rpm

(3)对 Linux 主机的 DHCP 服务器进行配置,希望修改配置文件中的参数使得客户端获

得的网关地址为 192.168.159.1,应该在 dhcpd.conf 文件中进行( )配置。

A.option subnet B.range routers

C.option routers D.option gateway

(4)在配置 DHCP 保留时,需要先知道客户端的( )。

A.网络接口 MAC 地址 B.计算机名称及网络接口 MAC 地址

C.计算机名称 D.所在 VLAN

(5)在 RHEL5.x 系统中,默认情况下保存租约的文件是( )。

A./var/lib/dhcp/dhcpd.lib B./etc/dhcpd.leases

C./etc/dhcp.mdb D./var/lib/dhcp/dhcpd.leases

(6)使用 DHCP 客户端进行网卡的配置工作后,还必须自己手工配置的有( )。

A.默认网关 IP 地址 B.DNS 服务器 IP 地址

C.子网掩码 D.什么都不需要

(7)在 RHEL5.x 系统中,通过 DHCP 服务器的 host 声明为特定主机分配保留 IP 地址时,

使用( )配置关键字指定相应的 MAC 地址。

A.mac-adress B.fixed-address

C.hardware ethernet D.match-physical-address

(8)主机通过 DHCP 协议动态获得的 IP 地址是有租期限制的,租期过半时主机应再次

发出请求,在 Linux 服务器上缺省情况下,下面( )文件中存放着 DHCP 服务器的客户

租期数据信息。

A./etc/dhcpd.conf B./var/lib/dhcp/dhcpd.leases

C./etc/sysconfig/dhcp D./var/lib/dhcp/dhcpd.db

(9)如果在一台 IP 地址为 192.168.159.10 的 DHCP 服务器全局配置中将网关配置为:

192.168.159.1,在作用域选项中配置网关选项为:192.168.159.2。当 DHCP 客户端获得 IP 地

址时会使用( )作为网关地址。

A.192.168.159.2 B.192.168.159.10

C.192.168.159.1 D.dhcpd 服务将因为配置错误无法启动

(10)在 RHEL5.x 系统中,DHCP 服务默认的配置文件是( )。

A.dhcp.conf B./etc/dhcp.cf

C./etc/dhcpd.conf D./etc/dhcp.conf

在 Internet 中使用 IP 地址来确定某台计算机的唯一地址,而

IP 地址不太容易记忆。为了方便网络中计算机的访问,人们采用

为计算机分配了一个名称,通过将每台计算机名称与 IP 地址建立

一个映射关系,在访问计算机时可直接利用计算机名称。将计算

机名称与 IP 地址的映射关系保存并提供相关查询功能的系统就

被称为名称解析系统。名称解析系统有很多类型,但目前在

Internet 上普通使用的是 DNS。

第13章

王者风范︱︱B

IND

服务配置

Linux 从初学到精通

388

DNS 基础

DNS 早于 1983 年由保罗·莫卡派乔斯(Paul Mockapetris)提出原始的技术规范在

RFC882 中发布。1987 年发布的 RFC1034 和 RFC1035 修正了 DNS 技术规范,并废除了之前

的 RFC882 和 RFC883 号草案。在此之后对 Internet 标准草案的修改基本上没有涉及 DNS 技

术规范部分的改动。DNS 将巨大信息按层次划分成多个较小的部分,将每部分存储在不同的

服务器上,形成层次性、分布式的特点。早期的域名必须以英文句号“.”结尾,当用户访问

“www.kernel.org”的 Web 服务时必须在浏览器地址栏中输入“http:// www.kernel.org.”,这样

DNS 才能够进行域名解析。如今 DNS 服务器已经可以自动补上结尾的句号。

13.1.1 DNS 结构

目前 DNS 是 Internet 的一项核心服务,在 DNS 中采用分层结构,包括:根域、顶级域、

二级域及主机名称。域名空间的层次结构类似一个倒置的树,其中根作为 高级别,大树枝

处于下一级级别,树叶处于 低级别。每个区域都是 DNS 域名空间中的一部分,维护该域名

空间的数据记录。在域名层次结构中,每一层称为一个域,每个域用一个点号“.”分开。域

又可以进一步划分成子域,每个域都有一个域名, 底层就是主机(如图 13-1 所示)。

图 13-1 域名层次空间

1.根

根(root)域就是“.”,是由 Internet 名称注册授权机构管理,该机构把域名空间各部分

的管理责任分配给 Internet 的各个组织。目前全球共有 13 台服务器负责维护根域。

2.顶级域 DNS 根域下一级是顶级域,是由 Internet 名字授权机构管理。顶级域有三种类型:组织

域(组织域相关情况见表 13-1)、国家或地区域(国家或地区域相关情况见表 13-2)、反向域

王者风范——BIND 服务配置 第

389

13

(名字为 in-addr.arpa)。

表 13-1 组织域

组织域 说明

com 商业部门

gov 政府部门

org 民间团体组织

net 网络服务机构

edu 教育部门

mil 军事部门

表 13-2 国家或地区域

国家或地区域 说明

cn 中国

de 德国

it 意大利

uk 英国

jp 日本

kr 韩国

3.二级域 注册到个人、公司或组织的名称。这些名称基于相关的顶级域,如“kernel.org”,就是

基于顶级域“.org”。二级域下可以包括主机或子域,如“test.kernel.org”这样的子域,而该

子域还可以包含如“netfilter.test.kernel.org”这样的主机。

4.主机名 主机名在域名空间中是 底层,主机名和域名(DNS 后缀)共同组成 FQDN(Fully

Qualified Domain Name,完全合格的域名。每个 FQDN 多可以由 255 个字节组成)。主机

名是 FQDN 左端的部分。如 www.kernel.org 中 www 是主机名,kernle.org 是 DNS 后缀。

13.1.2 DNS 查询过程

DNS的查询过程是指在客户端是如何通过DNS服务器将一个 IP地址转化为一个FQDN、

将一个 FQDN 转化为一个 IP 地址或查询一个区域的邮件服务器等。

1.按查询方式分类 DNS 查询 DNS 查询按查询方式分为以下两种。

(1)递归查询(Recursive Query):当 DNS 服务器接收到查询请求时,要么作出查询成

功的响应,要么作出查询失败的响应。递归查询一般发生在 DNS 客户端与 DNS 服务器之间。

(2)迭代查询(Iterative Query):DNS 服务器根据自己的高速缓存或区域的数据,以

佳结果响应。如果 DNS 服务器无法解析,它可能返回一个指针。指针指向有下级域名的 DNS

服务器,继续该过程,直到找到拥有所查询名字的 DNS 服务器,或直到出错、超时为止。迭

代查询一般发生在 DNS 服务器之间。

2.按查询内容分类 DNS 查询 DNS 查询按查询内容分为以下两种。

(1)正向查询:由域名查找 IP 地址。

(2)反向查询:由 IP 地址查找域名。

下面通过一个查询 www.kernel.org 的例子来了解 DNS 查询的基本工作原理,如图 13-2

所示。

Linux 从初学到精通

390

图 13-2 DNS查询过程

(1)客户端将 www.kernel.org 的查询提交给本地 DNS 服务器(递归查询)。

(2)本地 DNS 服务器检查区域数据库,由于此服务器没有 kernel.org 的授权,因此,它

将查询传递到根服务器,请求解析主机名称。根名称服务器把“org”DNS 服务器 IP 地址返

回给地本 DNS 服务器(迭代查询)。

DNS 服务器中可以保存一个或多个区域的信息,这时这台 DNS 服务器称为这些区域

的授权服务器,授权服务器将 DNS 客户端所查询的记录提供给 DNS 客户端。

(3)本地 DNS 服务器将请求发送给“org”DNS 服务器,此服务器根据请求将“kernel.org”

DNS 服务器 IP 地址返回给本地 DNS 服务器(迭代查询)。

(4)本地 DNS 服务器向“kernel.org”DNS 服务器发送请求,由于该服务器具有“www.

kernel.org”记录,因此该服务器将“www. kernel.org”的 IP 地址返回给本地 DNS 服务器。

(5)本地 DNS 服务器将“www.kernel.org”的 IP 地址发送给客户端。

13.1.3 DNS 记录

DNS 服务器在提供名称解析服务时,它会查询自己的数据库。在该数据库中包含 DNS

区域资源信息的资源记录(Resource Record,简称 RR)。在 DNS 区域资源信息中常见的资源

记录有以下几种。

(1)SOA 记录。SOA 起始授权记录(Start of Authority Record)在一个区域必须是唯一

的,定义了区域的全局参数,进行整个区域的管理设置。

(2)NS 记录。NS 名称服务器记录(Name Server)在一个区域至少有一条,记录了某个

区域的授权服务器。

(3)A 地址记录。地址记录(Address),把 FQDN 映射到 IP 地址。

(4)CNAME 别名记录。别名记录(Canonical Name)也被称为规范名字,可以帮助用

户隐藏网络实现细节。

提 示

王者风范——BIND 服务配置 第

391

13

(5)PTR 反向地址记录。反向地址记录(domian name PoinTeR),把 IP 地址映射到

FQDN。

(6)MX 邮件交换记录。邮件交换记录(Mail eXchanger),指向一个邮件服务器,用于

电子邮件系统发邮件时根据收信人的地址后缀来定位邮件服务器。

目前可以提供 DNS 服务的软件在各种平台下都非常多,但 BIND 无疑是这些 DNS 软件

中 出色的一款,90%以上的 DNS 服务器都是使用 BIND。20 世纪 80 年代,柏克莱加州大

学计算机系统研究小组的四个研究生 Douglas B Terry、Mark Painter、David W. Riggle 和周松

年(Songnian Zhou)共同编写了 BIND(Berkeley Internet Name Domain)的第一个版本,并

随 BSD 4.3 发布。BIND 是 Internet 上 常用的 DNS 服务器软件(不管是哪种 DNS 服务器都

使用 UDP 端口 53 进行名称解析,TCP 端口 53 进行区域传输),在 Internet 上使用 BIND 作

为服务器软件的 DNS 服务器几乎占到所有 DNS 服务器的九成。BIND 现在由互联网系统协

会(Internet Systems Consortium)负责开发与维护。BIND 主要有三个版本:BIND 4、BIND 8、

BIND 9。在 RHEL 5.x 中默认提供的是 BIND 9。

BIND 服务安装

BIND 服务在安装时并没有太多依赖软件包,可以直接使用如下命令安装 BIND 服务软

件包。在使用不同版本 RHEL 时,BIND 服务的版本可能会有小的区别,但并不影响其后的

配置;“/mnt”目录是 RHEL 5.x 光盘的挂载点。

rpm -ivh /mnt/Server/bind-9.3.6-4.P1.el5.i386.rpm

在 RHEL 5.x 中使用 BIND 时,推荐将以下两个软件包一起安装,其中 bind-chroot 为 BIND

提供 chroot 机制的软件包,caching-nameserver 是 BIND 配置文件例子。

rpm -ivh /mnt/Server/bind-chroot-9.3.6-4.P1.el5.i386.rpm rpm -ivh /mnt/Server/caching-nameserver-9.3.6-4.P1.el5.i386.rpm

为了进一步提高系统安全性,Linux 内核引入了 chroot 机制。chroot 是内核中的一个系统

调用,软件可以通过调用库函数 chroot,来更改某个进程所能见到的根目录。如 BIND 全局配

置文件在/etc 目录下,以 root 用户(或具有相同权限的其他账号)启动 BIND,这个 root 权限

的父进程会派生数个以 nobody 权限运行的子进程(具体情况取决于个人设置)。父进程监听请

求自 53 端口的 TCP 数据流,然后根据内部算法将这个请求分配给某个子进程来处理。这时

BIND 子进程所处的目录继承自父进程,即/etc。但是,一旦目录权限设定失误,被攻击的 BIND

子进程甚至可以访问整个文件系统,因为 BIND 进程所处的根目录仍是整个文件系统的根。如

果能够利用 chroot 将 BIND 限制在某个非根的目录,如/var/named/chroot,那么 BIND 所能存

取的文件都是/var/named/chroot 下的文件或其子目录下的文件。创建 chroot“监牢”的作用就

是将进程权限限制在文件系统目录树中的某一子树中。

提 示

Linux 从初学到精通

392

和其他 Linux 下的 System V 服务一样安装完成后,可以使用“service”命令启动、停止、

重新启动服务;使用“chkconfig”命令调整在指定运行级别是否自动加载。

service named start #启动服务。 service named stop #停止服务。 service named restart #重新启动服务。 service named reload #在不重新启动的情况下,重新载入配置文件。 service named status #查看服务当前运行状态。 chkconfig named on #在运行级别 2、3、4、5上设置为下次开机时自动运行。 chkconfig named off #在运行级别 2、3、4、5上设置为下次开机时不自动运行。

如果不需要再使用 BIND 服务,可通过以下命令现在卸载 BIND 服务。

rpm -e bind

BIND 服务配置

在安装 bind-chroot 软件包后,其配置文件是/etc/sysconfig/named,内容如下。其中

“ROOTDIR”参数定义了 BIND 使用了 Chroot 机制后的根目录,默认为“/var/named/chroot”。

如果需要可以进行修改,也可以使用默认的路径。

[root@dns ~]# grep -v ^# /etc/sysconfig/named ROOTDIR=/var/named/chroot

13.3.1 BIND 配置文件结构

BIND 全局配置文件为 named.conf,如果没有使用 chroot 机制时,该文件位于/etc 目录下;

如果使用 chroot 机制,该文件位于/var/named/chroot/etc 目录下。不管有没有使用 chroot 机制,

BIND 的配置方法都是相同的,在使用 chroot 机制时,只是配置文件的路径不一样。

BIND 除了全局配置文件 named.conf 以外,还根据所管理的区域数量有若干个主配置文

件及区域配置文件。当 BIND 启动时,首先读取全局配置文件中 BIND 的相关配置信息(其

中会指定主配置文件的存放路径名称),然后通过读取主配置得到所管辖区域的相关信息(其

中会指定区域配置文件的存放路径名称), 后读取区域配置文件中的 DNS 记录,如图 13-3

所示。

1.全局配置文件 caching-nameserver 软件包提供了 BIND 全局配置文件的一个模板,内容如下。

王者风范——BIND 服务配置 第

393

13

图 13-3 BIND配置文件

#安装了 bind-chroot后,对于 BIND来说根目录应该是/var/named/chroot。 [root@ dns ~]# cd /var/named/chroot/ [root@ dns chroot]# grep -v // etc/named.caching-nameserver.conf options { listen-on port 53 { 127.0.0.1; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { localhost; }; allow-query-cache { localhost; }; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; view localhost_resolver { match-clients { localhost; }; match-destinations { localhost; }; recursion yes; include "/etc/named.rfc1912.zones"; };

caching-nameserver 的全局配置文件模板中,由以下三个部分组成。

(1)options 部分。用于指定 BIND 服务的参数,常用的参数包括以下几个。

listen-on:指定 BIND 侦听的 DNS 查询请求的本机 IP 地址及端口。如果不定义此参

数表示侦听本机所有 IP 地址收到的 DNS 查询请求。

Linux 从初学到精通

394

listen-on <端口>;

下面的例子中,BIND 服务将侦听本机 192.168.159.10 的 53 端口。

listen-on port 53 { 192.168.159.10; };

directory:指定区域配置文件所在的路径。其默认值是/var/named,如果使用了 chroot

该路径会是一个相对路径,对应绝对路径/var/named/chroot/var/named。

directory <目录>;

query-source:指定客户端在提交 DNS 查询时必须使用的源端口。

query-source <端口>;

allow-query:指定接受 DNS 查询请求的客户端。

allow-query <客户端集合>;

比如下面的例子中,只允许 192.168.159.150、192.168.159.155、192.168.159.157 三个客

户端提交 DNS 查询请求。不定义此选项表示接受所有客户端的 DNS 查询请求。

allow-query { 192.168.159.150;192.168.159.155;192.168.159.157; };

allow-query-cache:指定允许缓存查询结果的客户端。

allow-query-cache <客户端集合>;

allow-recursion:指定允许提交递归查询的客户端,如不定义此参数表示允许所有客

户端提交递归查询。allow-query 与 allow-recursion 的区别在于,allow-recursion 不负

责提交的迭代查询。

allow-recursion <客户端集合>;

forwarders:指定转发服务器,当转发服务器指定多个 DNS 服务器时,则会依次尝

试,直到获得查询信息为止。

forwarders <IP地址>;

forward:指定转发模式。first 表示快速转发,首先转发到 forwarders 参数中指定的

服务器,然后通过本机查询,only 则仅转发到 forwarders 参数中指定的服务器,不

再通过本机查询。如果不定义此参数表示使用 first 转发方式。

forward <only|first>;

allow-transfer:指定允许区域传输的辅助区域服务器。

allow-transfer <服务器集合>;

recursion:指定 BIND 回应客户端的方式。如果是 yes,DNS 客户端提交一个递归查

询,那么 DNS 服务器将会做所有能够回答查询请求的工作。如果是 off,并且服务

器不知道答案,将会返回一个推荐(referral)响应。如果 recursion 是 no,不会阻止

客户端从 DNS 服务器的缓存中得到数据,BIND 仅仅阻止新数据作为查询的结果被

缓存。

王者风范——BIND 服务配置 第

395

13recursion <yes|no|off>;

dump-file:当执行 rndc dumpdb 命令时,DNS 服务器存放数据库文件的路径名。

dump-file <文件名>;

statistics-file:当执行 rndc stats 命令时,服务器会将统计信息追加到的文件路径名。

statistics-file <文件名>;

memstatistics-file:DNS 服务器输出的内存使用统计文件的路径名。

memstatistics-file <文件名>;

(2)logging 部分。用于指定 BIND 服务的日志参数。

BIND 在默认情况下,把日志写到/var/log/messages 文件中,而记录的内容非常少,主要

就是启动、关闭的日志记录和一些严重错误的消息。如果需要详细记录服务器的运行状况,

需要对全局配置文件的 logging 块中进行配置。logging 部分主要有 channel(通道)、category

(类别)两种定义,格式如下。

logging { channel <string>; { file log_file [versions number|unlimited] [size sizespec]; \ |syslog optional_facility;|null;|stderr; severity <logseverity>;; print-time < yes|no >;; print-severity <yes|no>;; print-category <yes|no>;; }; category <string>; { <string>;; ... }; };

channel 用于指定日志发送目标,其中 channel <string>用于指定通道名称,其他参数含义

如下。

file:用于指定日志发送的目标。将日志输入到<logfile>中指定的文件中,这里所指

定的路径是一个相对路径,实际路径需要权限全局配置文件 options 块中 direcotry

决定,不管指定什么路径 named 用户(BIND 服务默认用户)必须有写权限。versions

指定允许同时存在多少个版本的日志文件,如指定 3 个版本(version 3),就会保存

logfile.log、logfile.log0、logfile.log1 和 logfile.log2,然后建立一个新的 log_file.log

进行写入,unlimited 表示无限制写入(默认值)。size 指定文件大小的上限,如果只

指定了 size 而没有指定 versions,当文件达到指定的上限时,BIND 将停止写入该日

志文件。syslog optional_facility 将日志输入到 syslog,其中 optional_facility 是 syslog

的设备名。null 将日志输入到空设备(/dev/zero)。stderr 将日志输入到标准错误输

出,默认为屏幕。

severity :用于指定日志的级别。

print-time:用于指定在日志中是否需要写入时间。

print-severity:用于指定在日志中是否需要写入消息级别。

print-category:用于指定在日志中是否需要写入日志类别。

Linux 从初学到精通

396

category 用于指定需要记录的内容,其他参数含义如下。

client:处理客户端请求。

config:配置文件分析和处理。

database:同 BIND 内部数据库相关的消息,用来存储区数据和缓存记录。

default:匹配所有未明确指定通道的类别。

general:包括所有未明确分类的 BIND 消息。

lame-servers:发现错误授权。

network:网络操作。

notify:更新通知消息。

queries:查询日志。

resolver:名字解析,包括对来自解析器的递归查询信息。

security:批准/非批准的请求。

xfer-in:从远程名字服务器到本地名字服务器的区传送。

xfer-out:从本地名字服务器到远程名字服务器的区传送。

在 caching-nameserver 的全局配置文件模板中 logging 块定义的作用是将错误级别为

dynamic 的日志记录在 data/named.run 中,对该日志文件大小不作限制,而在下面的例子的作

用是:定义一个名为 bind_log 的通道目标为 bind.log 文件,其文件大小上限为 50MB,保存

三个版本,记录等级为 notice 的日志,同时记录时间及日志类型,并将所有查询日志发送到

该通道。

(3)view 块用于指定主配置文件存放路径及名称,常用的包括以下几个。

match-clients:指定提交 DNS 客户端的源 IP 地址范围。

match-clients <客户端集合>;

match-destinations:指定提交 DNS 客户端的目标 IP 地址范围。

match-destinations <客户端集合>;

match-recursive-only:指定是否只允许递归查询。

match-recursive-only <yes|no>;

include:指定主配置文件。如下面的例子中,指定主配置文件为/etc/name.zones,如

果使用了 chroot 该路径会是一个相对路径。

include “/etc/name.zones”;

在主配置文件中,可以指定多个 view。如果 DNS 客户端所提交的查询满足第一个 view

的条件时,就会使用第一个 view 来进行解析,否则就判断下一个 view,然后再进行解析。

如果所有的 view 都不满足条件时,BIND 将返回 Query refused 的消息。设置多个 view 的作

用在于可以根据不同的 DNS 客户端返回不同的解析结果,在如图 13-4 所示的网络拓扑中,

如果希望 BIND 在解析 www.example.zqin 时,如果客户端属于 192.168.159.0/24,则返回 IP

地址 192.168.159.9,如果客户端属于 192.168.158.0/24 时,则返回 IP 地址 192.168.158.9,可

王者风范——BIND 服务配置 第

397

13

以使用以下方式配置多个 view,并指定不同的主配置文件。

图 13-4 view作用

view from0 { match-clients { 192.168.159.0/24; }; match-destinations { any; }; include "/etc/named0.zones"; } view from1 { match-clients { 192.168.158.0/24; }; match-destinations { any; }; include "/etc/named1.zones"; }

对于全局配置文件中涉及范围的参数(如 listen-on、match-clients 等),可采用表 13-3 中

的方式定义。

表 13-3 BIND 范围定义

客户端指定方法 示例 满足示例的客户端

单一主机 192.168.159.130 IP 地址为 192.168.159.130

指定网段 192.168.159.

指定网段 192.168.159.0/24

IP 地址包括在 192.168.159.0/24 的网段

指定多个 192.168.159.130;192.168.159.140 IP 地址为 192.168.159.130 或 192.168.159.140

使用!表示不包括 !192.168.159.30 IP 地址不包括在 192.168.159.30

不匹配所有 none 不包含 IP 地址

匹配所有 any 任何 IP 地址

本地主机 localhost BIND 本机

同网段 localnet 与 BIND 主机同网段的所有 IP 地址

2.主配置文件

caching-nameserver 软件包提供了 BIND 主配置文件的一个模板。主配置文件中通过 zone

定义当前 BIND 可管辖的所有区域,定义方法如下。

Linux 从初学到精通

398

zone “区域名称” IN { 参数 };

其中参数中主要包括 type(指定区域类型)、file(指定区域配置文件)、allow-update(指

定可动态更新的客户端)。

在 BIND 中的区域会根据作用划分为以下几种类型(BIND 和其他 DNS 服务器所提供的

区域类型基本一样,只是在不同的 DNS 服务器中区域类型的名称不太一样)。

(1)master:主要区域,拥有该区域数据文件,并对此区域提供管理数据。

(2)slave:辅助区域,拥有主要区域数据文件的完全只读副本,辅助区域从主要区域同

步所有区域数据,同步过程被称为区域传输。

(3)stub:存根区域,与辅助区域类似,但是 stub 区域只复制主要区域的 NS 记录及 NS

记录对应的 A 记录。

(4)forward:转发区域,用于转发 DNS 客户端的递归查询。

(5)hint:当 BIND 启动时,它使用 hint 区域中的信息来查找根域名服务器,并找到

近的根域名服务器列表。如果没有,服务器使用编译时默认的根服务器信息。

3.区域配置文件

caching-nameserver 软件包提供了 BIND 区域配置文件的模板。这些模板中包括正向解析

文件的模板及反向解析文件的模板。

BIND 参数解析什么 IP 地址或 FQDN 都是根据区域配置文件中的资源记录配置决定。在

BIND 中定义资源记录的基本格式如下。

[名称] [TTL] [网络类型] 资源记录类型 数据

其中各字段作用如下。

(1)名称字段指定资源记录引用的对象名,可以是主机也可以是域名。对象名可以是相

对名称或完整名称,完整名称必须使用“.”结束。如果几条连续的资源记录是同一个对象名,

则第一条资源记录后的资源记录可以省略对象名。

(2)TTL 字段指定资源记录在存放在高速缓存中的时间,单位是秒。ttl(time to live)字

段是一个寿命字段。通常省略该字段,而使用位于文件开始处的$TTL 所指定值。

(3)网络类型指定网络类型,可选的值包括 IN、CH、HS。目前 IN(Internet)是 广

泛使用的一种也是默认值,但推荐明确地指定为 IN。

(4)资源记录类型字段:说明资源记录的类型。

在定义资源记录时,一般 SOA 记录应为整个区域配置文件的第一行,NS 记录第二行,

其他记录可任意排列。在一条资源记录各个字段之间由空格或 Tab 分隔,字段可以包含如下

的特殊字符。

(1);:注释内容。

(2)@:表示当前域,这里的当前域是根据主配置文件中 zone 定义的区域名称。

(3)():允许数据跨行,通常用于 SOA 记录。

(4)*:只能用于名称字段的通配符。

王者风范——BIND 服务配置 第

399

13

在 DNS 服务器中有很多可用的资源记录,BIND 支持所有的资源记录,但是目前常用资

源记录包括以下几种。

(1)SOA 资源记录

区域名称 记录类型 SOA 主域名服务器(FQDN) 管理员邮件地址 (序列号 刷新间隔 重试间隔 过期间隔 TTL)

主域名服务器:区域中 DNS 服务器的 FQDN。

管理员:管理员的邮件地址中“@”用“.”代替。

序列号:区域复制依据。

刷新间隔:辅助 DNS 服务器请求与源服务器同步的等待时间。当刷新间隔到期时,

辅助 DNS 服务器请求源服务器的 SOA 记录副本。然后,辅助 DNS 服务器将源服务

器的 SOA 记录的序列号与其本地 SOA 记录的序列号比较,如果不同,则辅助 DNS

服务器从主要 DNS 服务器请求区域传输。

重试时间:辅助 DNS 服务器在请求失败后,等待多长时间重试。通常这个应该短于

刷新时间。

过期时间:当这个时间到期时,如辅助 DNS 服务器还无法与源服务器进行比赛区域

传输,则辅助 DNS 服务器会把它的本地数据当做不可靠数据。

TTL:区域的默认生存时间和缓存否定应答名称查询的 大间隔。

(2)NS 记录

区域名称 IN NS FQDN

(3)A 记录

FQDN IN A IP地址

(4)CNAME 资源记录

别名 IN CNAME 对应 A记录

(5)MX 资源记录

区域名 IN MX 优先级(数字) 邮件服务器 A记录

(6)PTR 资源记录

IP地址 IN PTR FQDN

13.3.2 主 DNS 服务器配置

由于 caching-nameserver 软件包提供了各种配置文件的模板,大大降低了 BIND 的配置难

度,初学者可以将模板文件的内容进行复制后再修改,这样可以有效地降低配置的难度,同

时也避免出错。

下面使用 BIND 在一台安装了 RHEL 5.x、IP 地址为 192.168.159.15 的主机上实现主 DNS

服务器,具体操作步骤如下。

(1)使用如下命令安装 BIND 及相关软件包。

[root@ dns ~]# mount /dev/cdrom /mnt

Linux 从初学到精通

400

[root@ dns ~]# rpm -ivh /mnt/Server/bind-9.3.6-4.P1.el5.i386.rpm [root@ dns ~]# rpm -ivh /mnt/Server/bind-chroot-9.3.6-4.P1.el5.i386.rpm [root@ dns ~]# rpm -ivh /mnt/Server/caching-nameserver-9.3.6-4.P1.el5.i386.rpm

(2)在 etc 目录下有一个名为 named.caching-nameserver.conf 的全局配置文件模板,首先

使用如下命令复制为 named.conf(必须是这个文件名)。注意在复制时一定要使用-p 参数以

保留该文件原有的权限,因为 named.caching-nameserver.conf 的拥有组是 named(如果在复制

没有加-p 参数,在复制也可以使用 chown 命令修改拥有组)。

[root@ dns ~]# cd /var/named/chroot/etc [root@ dns ~]# cp -p named.caching-nameserver.conf named.conf

(3)修改 named.conf 文件,内容如下。

options { #指定侦听本机所有网络接口 53端口收到的 DNS查询请求。 listen-on port 53 { any; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; query-source port 53; query-source-v6 port 53; allow-query { any; }; #接受任何客户端的 DNS查询请求 allow-query-cache { any; }; #将所有客户端的 DNS查询结果进行缓存 }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; #这里修改 view的名称不是必需的,在配置时只需要保证 view的名称不重复,但是推荐还 #是使用一定的命名规范便于维护 view my_resolver { match-clients { any; }; #指定当前 view处理源和目标任意的查询请求 match-destinations { any; }; recursion yes; include "/etc/named.zones"; #指定主配置文件的存放路径及名称 };

本章中只讲述基本功能的实现,没有考虑安全性的问题,从安全角度来说在指定 IP 地址

集合时 好还是可以明确指定 IP 地址或网段,而不要使用“any”。

(4)在 etc 目录下有一个名为 named.rfc1912.zones 的主配置文件模板,首先使用如下命

令复制为 named.zones(该名称全局配置文件中“include”参数定义)。注意在复制时一定要

使用-p 参数以保留该文件原有的权限,因为 named.rfc1912.zones 的拥有组是 named(如果在

复制没有加-p 参数,在复制也可以使用 chown 命令修改拥有组)。

[root@ dns ~]# cd /var/named/chroot/etc [root@ dns ~]# cp -p named.rfc1912.zones named.zones

(5)修改/var/named/chroot/etc/named. zones 文件,内容如下。

王者风范——BIND 服务配置 第

401

13zone "example.zqin" IN { #定义一个名为 example.com的正向查询区域 type master; #指定区域类型为主要区域 #指定区域配置文件名为 example.zqin.zero。该文件存放路径由全局配置文件中“directory” #参数指定 file "example.zqin.zero"; allow-update { none; }; }; #定义一个名为 159.168.192.in-addr.arpa的反向解析区域,此区域存放 192.168.159.0/24 #中的 PTR记录,“.in-addr.arpa”是固定写法 zone "159.168.192.in-addr.arpa" IN { type master; #指定区域类型为主要区域 #指定区域配置文件名为 159.168.192.local。该文件存放路径由全局配置文件中“directory” #参数指定 file "159.168.192.local"; allow-update { none; }; };

(6)全局配置文件中的“directory”参数值为/var/named,默认在该目录下有正向解析区

域及反向解析区域的模板文件分别为 named.zero、named.local,将模板文件各复制一份为

example.zqin.zero、159.168.192.local。注意在复制时一定要使用-p 参数以保留该文件原有的

权限,因为 named.zero、named.local 的拥有组是 named(如果在复制没有加-p 参数,在复制

也可以使用 chown 命令修改拥有组)。

[root@ dns ~]# cd /var/named/chroot/var/named/ [root@ dns ~]# cp -p named.zero example.zqin.zero [root@ dns ~]# cp -p named.local 159.168.192.local

(7)修改/var/named/chroot/var/named/example.com.zero 文件,内容如下。

$TTL 86400 #指定默认的 TTL值。 #指定 SOA记录,因为在主配置文件中定义的域名为 example.zqin,所以这里@表示 #example.zqin,dns.example.zqin是 BIND服务所在的主机的 FQDN @ IN SOA dns.example.zqin. root.example.zqin. ( 42 ; serial (d. adams) 3H ; refresh 15M ; retry 1W ; expiry 1D ) ; minimum #指定该区域的 NS记录,这里没有指定区域名称,表示直接使用上一条记录的区域名称 IN NS dns.example.zqin. IN MX 10 mail.example.zqin. #指定当前区域的 MX记录 mail IN A 192.168.159.9 #指定名为 mail.example.zqin的 A记录 dns IN A 192.168.159.15 #指定名为 dns.example.zqin的 A记录 #指定一条名为 www.example.com(对应 A记录为 mail.example.zqin)的别名记录 webmail IN CNAME mail.example.zqin.

(8)修改/var/named/chroot/var/named/159.168.192.local 文件,内容如下。

$TTL 86400 @ IN SOA dns.example.zqin. root.example.zqin. ( 1997022700 ; Serial 28800 ; Refresh 14400 ; Retry 3600000 ; Expire

Linux 从初学到精通

402

86400 ) ; Minimum IN NS dns.example.zqin. #指定两条反向解析记录 9 IN PTR mail.example.zqin. 15 IN PTR dns.example.zqin.

(9)使用如下命令重新启动 named 服务后主要区域配置完成。

service named restart

13.3.3 从 DNS 服务器配置

在大型网络通过从 DNS 服务器配置辅助区域可以提高 DNS 解析的速度,在 BIND 中配

置辅助区域时,其主要区域服务器可以是任何操作系统上其他的 DNS 服务器。下面在如图

13-5 所示的网络中使用 BIND 在一台安装了 RHEL 5.x、IP 地址为 192.168.158.15 的主机上实

现从 DNS 服务器配置,具体操作步骤如下。

图 13-5 从 DNS服务器配置

( 1 ) 在 IP 地 址 为 192.168.159.15 的 主 DNS 上 修 改 全 局 配 置 文 件 。

(/var/named/chroot/etc/named.conf)的 options 块中增加如下参数后,主要区域允许将 DNS 数

据传输到 192.168.158.15(在全局配置文件中指定 allow-transfer 表示当前 DNS 服务器的所有

主要区域都可以将数据传输到指定的 DNS 服务器,如果只希望某个区域将数据传输到指定

DNS 服务器,可将以下参数放到主配置文件对应的区域中)。

allow-transfer {192.168.158.15; };

(2)在 IP 地址为 192.168.158.15 的从 DNS 服务器上使用如下命令安装 BIND。

[root@ dns ~]# mount /dev/cdrom /mnt [root@ dns ~]# rpm -ivh /mnt/Server/bind-9.3.6-4.P1.el5.i386.rpm [root@ dns ~]# rpm -ivh /mnt/Server/bind-chroot-9.3.6-4.P1.el5.i386.rpm [root@ dns ~]# rpm -ivh /mnt/Server/caching-nameserver-9.3.6-4.P1.el5.i386.rpm

(3)在 IP 地址为 192.168.158.15 的从 DNS 服务器上 etc 目录下有一个名为

named.caching-nameserver.conf的全局配置文件模板,首先使用如下命令复制为 named.conf(必

王者风范——BIND 服务配置 第

403

13

须是这个文件名)。注意在复制时一定要使用-p 参数以保留该文件原有的权限,因为

named.caching-nameserver.conf 的拥有组是 named(如果在复制时没有加-p 参数,也可以使用

chown 命令修改拥有组)。

[root@ dns ~]# cd /var/named/chroot/etc [root@ dns ~]# cp -p named.caching-nameserver.conf named.conf

(4)在 IP 地址为 192.168.158.15 的从 DNS 服务器上修改/var/named/chroot/etc/named.conf

文件,内容如下。

options { listen-on port 53 { any; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; query-source port 53; query-source-v6 port 53; allow-query { any; }; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; view example_resolver { match-clients { any; }; match-destinations { any; }; recursion yes; include "/etc/named.zones"; };

(5)在 IP 地址为 192.168.158.15 的从 DNS 服务器上的 etc 目录下有一个名为

named.rfc1912.zones 的主配置文件模板,首先使用如下命令复制为 named.zones。注意在复制

时一定要使用-p 参数以保留该文件原有的权限,因为 named.rfc1912.zones 的拥有组是 named

(如果在复制时没有加-p 参数,也可以使用 chown 命令修改拥有组)。

[root@ dns ~]# cd /var/named/chroot/etc [root@ dns ~]# cp -p named.rfc1912.zones named.zones

(6)在 IP地址为192.168.158.15的从DNS服务器上修改/var/named/chroot/etc/named. zones

文件,内容如下。

zone "example.zqin" IN { type slave; #指定区域类型为辅助区域 #指定该辅助区域对应的主要区域 DNS服务器 IP地址为 192.168.159.15 masters { 192.168.159.15; }; #指定区域配置文件名为 example.zqin.zero,存放路径为 slaves目录下,该路径只是一个 #相对路径,其实际是在全局配置文件中 directory参数指定 file "slaves/example.zqin.zero"; };

Linux 从初学到精通

404

zone "159.168.192.in-addr.arpa" IN { type slave; masters { 192.168.159.10; }; file "slaves/159.168.192.local"; };

将辅助区域的配置文件存放在 slaves 目录下不是必需的,也可以存放在其他目录中,但

必须保证存放的目录的所有者和拥有组是 named,否则 BIND 将无法将从主要区域传输的

DNS 信息写入文件中。

(7)在 IP 地址为 192.168.158.15 的从 DNS 服务器上不需要建立区域配置文件,因为辅

助区域的数量是从主要区域传输过来的,使用如下命令重新启动 named 服务后辅助区域配置

完成。可以在 slaves 目录中查看到系统建立的正向及反向区域配置文件。

[root@ dns ~]# service named restart

如果存在辅助区域时,主要区域每次修改完其中数据后,需要将 SOA 记录中的序列号

增大,否则辅助区域将无法得知主要区域中记录已发生改变。

13.3.4 缓存 DNS 服务器配置

缓存 DNS 服务器也称为高速缓存服务器,主要用于将网络中客户端的 DNS 查询请求转

发到外部 DNS 服务器,在将查询结果返回给客户端的同时会在本地进行缓存,这样可以提高

网络中其他客户端 DNS 查询的速度,这种 DNS 服务器工作方式也是在生产情况中经常使用

的一种。

下面在如图 13-6 所示的网络中使用 BIND 在一台安装了 RHEL 5.x、IP 地址为

192.168.158.15 的主机上实现缓存 DNS 服务器配置,具体操作步骤如下。

图 13-6 缓存 DNS服务器配置

(1)在 IP 地址为 192.168.158.15 的缓存 DNS 服务器上使用如下命令安装 BIND。

提 示

王者风范——BIND 服务配置 第

405

13[root@ dns ~]# mount /dev/cdrom /mnt [root@ dns ~]# rpm -ivh /mnt/Server/bind-9.3.6-4.P1.el5.i386.rpm [root@ dns ~]# rpm -ivh /mnt/Server/bind-chroot-9.3.6-4.P1.el5.i386.rpm [root@ dns ~]# rpm -ivh /mnt/Server/caching-nameserver-9.3.6-4.P1.el5.i386.rpm

(2)在 IP 地址为 192.168.158.15 的缓存 DNS 服务器上 etc 目录下有一个名为

named.caching-nameserver.conf的全局配置文件模板,首先使用如下命令复制为 named.conf(必

须是这个文件名)。注意在复制时一定要使用-p 参数以保留该文件原有的权限,因为

named.caching-nameserver.conf 的拥有组是 named(如果在复制时没有加-p 参数,也可以使用

chown 命令修改拥有组)。

[root@ dns ~]# cd /var/named/chroot/etc [root@ dns ~]# cp -p named.caching-nameserver.conf named.conf

(3)在 IP 地址为 192.168.158.15 的缓存 DNS 服务器上修改/var/named/chroot/etc/named.conf

文件,内容如下。

options { listen-on port 53 { any; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; query-source port 53; query-source-v6 port 53; allow-query { any; }; allow-query-cache { any; }; recursion yes; forwarders {202.103.24.68; }; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; };

(4)在 IP 地址为 192.168.158.15 的缓存 DNS 服务器上不需要建立其他配置文件,使用

如下命令重新启动 named 服务后辅助区域配置完成。

[root@ dns ~]# service named restart

在配置完成后,可以在 DNS 客户端配置“nslookup”命令测试缓存 DNS 服务器是否配

置成功。

[root@client ~]# nslookup > onlyzq.cublog.cn Server: 192.168.159.32 Address: 192.168.159.32#53 Non-authoritative answer: #有该提示表示非官方提供的解析结果。 Name: onlyzq.cublog.cn Address: 61.55.167.132

Linux 从初学到精通

406

客户端名称解析顺序

在Linux或Windows中输入一个 FQDN后两种平台会采用不同的顺序尝试将其解析为一

个 IP 地址。

13.4.1 Linux 平台名称解析顺序

Linux 中名称解析顺序由 /etc/host.conf 、 /etc/nsswitch.conf 两个配置文件决定。

/etc/nsswitch.conf 文件是由 SUN 公司开发,用于管理系统中多个配置文件查找的顺序,

/etc/nsswitch.conf 文件比/etc/host.conf 文件提供了更多的功能(目前比较老的系统中才使用

/etc/host.conf 文件判断名称解析顺序)。/etc/nsswitch.conf 中的每一行是一个参数后跟冒号和

一系列要试用的有顺序的方法(以#号开头是注释),其中的 hosts 参数负责 FQDN 解析顺序。

在 RHEL 5.x 中/etc/nsswitch.conf 的 hosts 参数默认值如下,其含义是先尝试通过/etc/hosts 文

件进行名称解析,再尝试将查询请求发送到指定的 DNS 服务器。

[root@dns ~]# grep hosts /etc/nsswitch.conf #hosts: db files nisplus nis dns hosts: files dns

13.4.2 Windows 平台名称解析顺序

由于 Windows 中除了使用 FQDN 名,还包括一个 NetBIOS 名(如图 13-7 所示),所以

名称解析顺序更复杂一些。

Windows 2000 及以后系统中已经不再使用 NetBIOS 名,只是为了向下兼容老版本的

Windows,所以保留了对 NetBIOS 的支持。

(1)检查所解析名称是否是本机。

(2)尝试通过 DNS 缓存(可通过 ipconfig /displaydns 查看 DNS 缓存内容,也可通过 ipcnfig

/flushdns 清空 DNS 缓存,如图 13-8 所示)进行名称解析。

(3)尝试通过%systemroot%\system32\drivers\etc\hosts 文件进行名称解析。

(4)尝试将查询请求发送到指定的 DNS 服务器。

(5)尝试通过 NetBIOS 名称缓存(可通过 nbtstat -c 查看 NetBIOS 名称缓存内容,每隔

10 分钟 NetBIOS 名称缓存将自动清空)进行名称解析。

(6)尝试将查询请求发送到指定的 WINS 服务器。

(7)尝试通过广播进行名称解析。

(8)尝试通过%systemroot%\system32\drivers\etc\lmhosts 文件(lmhosts 格式和 hosts 相同,

只在 lmhosts 文件中记录的是 NetBIOS 名称与 IP 地址对应关系)进行名称解析。

提 示

王者风范——BIND 服务配置 第

407

13

图 13-7 NetBIOS名

图 13-8 ipconfig

Linux 和 Windows 中 hosts 文件所在的目录虽然不一样,但作用和语法都是相同的。在配

置时对语法的要求如下。

(1)每一项信息必须独立一行。

(2)IP 地址必须放在一行的第 1 列,其后对应 FQDN。

(3)IP 地址与 FQDN 之间至少间隔一个空格。

客户端配置

在配置 DNS 客户端时,无论是 Linux 还是 Windows 都可以通过在 DHCP 服务器配置选

项的方法实现,如果是使用静态 IP 地址,可采取以下方法配置。

13.5.1 Linux 平台

通过/etc/resolv.conf 文件指定 DNS 服务器,其中“search”用于补全 DNS 后缀,在如下的

/etc/resolv.conf 文件中“search”的值为 example.zqin,那么在解析 www 的 IP 地址时,Linux

会自动改为解析 www.example.zqin,nameserver 参数用于指定 DNS 服务器 IP 地址, 多可同

时指定 3 个,无论什么原因造成第一个 DNS 服务器不可用时,就会查询第二个 DNS 服务器。

[root@dns ~]# cat /etc/resolv.conf search example.zqin nameserver 192.168.159.15 nameserver 202.103.24.68 nameserver 202.103.0.117

13.5.2 Windows 平台

Windows 平台配置 DNS 服务器 IP 地址的方法非常简单,具体操作步骤如下。

Linux 从初学到精通

408

(1)在“控制面板”→“网络和 Internet”→“网络和共享中心”中选择“更改适配器

设置”,如图 13-9 所示。

图 13-9 更改网络配置

(2)选择对应网络接口,单击鼠标右键选择“属性”按钮,如图 13-10 所示。

图 13-10 选择网络接口

(3)在弹出窗口中选择“Internet 协议版本 4 (TCP/IPv4)”后,单击“属性”按钮,并在

“首选 DNS 服务器”、“备用 DNS 服务器”输入 DNS 服务器 IP 地址,单击“确定”按钮即可,

如图 13-11 所示。

王者风范——BIND 服务配置 第

409

13

图 13-11 配置自动获取 IP地址

实验任务

在如图 13-12 所示的网络拓扑中,通过 RHEL5.x 自带的 BIND 软件实现 DNS 服务,完

成以下实验任务。

图 13-12 DNS实验任务

(1)在 FQDN 为 dns.example.zqin 的服务器上安装并配置 BIND,实现如下功能。

配置名为 example.zqin的正向区域及192.168.159.0/24、192.168.158.0/24的反向区域。

正向区域应可以解析 A 记录:web.example.zqin、mail.example.zqin、db.example.zqin。

DNS 客户端可以通过 www.example.zqin 访问到 web.example.zqin。

(2)在 FQDN 为 dns1.example.zqin 的服务器上安装 BIND 并配置为 dns.example.zqin 上

Linux 从初学到精通

410

example.zqin 的辅助区域。

本章测试

(1)Linux 中通过( )文件定义其名称解析的顺序。

A./etc/resolv.conf B./etc/dns.conf

C./etc/nsswitch.conf D./etc/named.conf

(2)DNS 服务使用( )进程名称解析。

A.TCP 80 B.TCP 53

C.UDP 80 D.UDP 53

(3)BIND 在使用了 Chroot 机制后其主配置文件 named.conf 默认在( )目录。

A./etc B./var/named

C./var/named/etc D./var/name/chroot/etc

(4)在 BIND 通过( )参数指定主要区域所在 DNS 服务 IP 地址。

A.dns { ...; }; B.mdns { ...; };

C.masters { ...; }; D.bind { ...; };

(5)将 FQDN 解析为 IP 地址的是 DNS 的( )记录。

A.A B.PTR

C.FQDN D.SA

(6)Linux 中在( )文件中指定 DNS 服务器 IP 地址。

A./etc/hosts B./etc/sysconfig/network

C./etc/dns D./etc/resolv.conf

(7)在( )软件包中包含了 BIND 配置文件的例子。

A.chroot B.example

C.caching-nameserver D.dnsconfig

(8)在( )文件中可以定义 FQDN 和 IP 地址之间的转换。

A./etc/resolv.conf B./etc/ip.config

C./etc/sysconfig/dns D./etc/hosts

(9)当用户在客户端向 DNS 服务器发的 DNS 解析请求时,使用的是( )查询。

A.迭代 B.DNS 客户端

C.递归 D.DNS 服务器

(10)在 RHEL 5.x 中( )是 BIND 服务的守护进程。

A.named B.bindd

C.dnsd D.bind

网络文件系统(Network File System,NFS)是 1980 年由 Sun

所发展出来在类 UNIX 系统间实现磁盘文件共享的一种方法,

NFS支持应用程序在客户端通过网络存取位于服务器磁盘中数据

的一种文件系统协议。NFS 的基本原则是让不同的客户端及服务

器通过一组 RPCs 共享相同的文件系统,NFS 是独立于操作系统,

允许不同硬件及操作系统的系统共同进行文件的共享。目前 NFS

包括三个版本 NFSv2、NFSv3、NFSv4。Sun 在设计 NFS 服务之

初最主要的目的是在类 UNIX 平台之间共享目录,但由于 UNIX

及 Linux 在企业级服务器上巨大的优势使得微软在 Windows 系统

中也提供了 NFS 的支持。

第14章

太阳光辉︱︱N

FS

服务配置

Linux 从初学到精通

412

NFS 服务配置

和其他 Linux 下的 System V 服务一样安装完成后,可以使用以下几个命令操纵 NFS

服务。

service nfs start #启动服务。

service nfs stop #停止服务。

service nfs restart #重新启动服务。

service nfs reload #在不重新启动的情况下,重新载入配置文件。

service nfs status #查看服务当前运行状态。

chkconfig nfs on #在运行级别 2、3、4、5上设置为下次开机时自动运行。

chkconfig nfs off #在运行级别 2、3、4、5上设置为下次开机时不自动运行。

在启动 NFS 服务前应该确认“portmap”服务已处于启动状态。

在启动 NFS 服务后,可使用如下命令查看 NFS 服务是否已注册成功,如果未注册成功,

可重新启动 portmap、nfs 服务,直到 NFS 注册成功。

[root@nfs ~]# rpcinfo -p localhost

program vers proto port

100000 2 tcp 111 portmapper

100000 2 udp 111 portmapper

#在显示中包含 nfs说明注册成功。

100003 2 udp 2049 nfs

100003 3 udp 2049 nfs

100003 4 udp 2049 nfs

100003 2 tcp 2049 nfs

100003 3 tcp 2049 nfs

100003 4 tcp 2049 nfs

在 RHEL 5.x 中,NFS 主配置文件为/etc/exports 文件,在该文件中定义需要共享的目录

方法如下。

共享目录 [客户端 1(参数)] [客户端 2(参数)] ….

(1)共享目录:需要共享目录,指定目录是要使用绝对路径。

(2)客户端:指定允许访问共享客户端的匹配条件,如果不指定,则表示所有客户端都

可以访问。在定义客户端匹配条件时可以使用 FQDN、IP 地址、网段、DNS 后缀。客户端指

定方法见表 14-1。

提 示

太阳光辉——NFS 服务配置 第

413

14表 14-1 NFS 客户端匹配

客户端指定方法 示例 满足示例的客户端

IP 指定单一主机 192.168.0.30 客户端 IP 地址为 192.168.0.30

指定网段 192.168.0.0/255.255.255.0

指定网段 192.168.0.*

指定网段 192.168.0.0/24

客户端所在网段为 192.168.0.0/24

域名单一主机 nfs.example.com 客户端 FQDN 为 nfs.example.com

域名指定范围 *.example.com 客户端 FQDN 的 DNS 后缀为 example.com

所有主机 * 任何访问 NFS 服务器的客户端

(3)参数:对客户端访问共享的权限进行相关配置。在 NFS 中包括以下可用参数(在这

些参数中匿名用户指的是 nfsnobody 用户)。

ro:指定匹配的客户在可以以只读方式访问共享,这是 NFS 默认选项。

rw:指定匹配的客户在可以对共享进行读写操作。

root_squash:指定当客户端的当前用户是 root 时,将被映射为本机(NFS 服务器)

的匿名用户。

no_root_squash:指定当客户端的当前用户是 root 时,将被映射为本机(NFS 服务

器)的 root 用户。

all_squash:将所有用户映射为本机(NFS 服务器)的匿名用户,这是 NFS 默认选项。

anonuid:指定匿名用户的 UID。

anongid:指定匿名用户的 GID。

sync:指定 NFS 服务保持数据同步,即同时将数据写入内存和硬盘,这是默认选项。

async:指定 NFS 服务先将数据保存在内存,再回写入硬盘。这样可以提高效率,

但有可能造成数据丢失。

NFS 服务的配置参数没有像 Linux 其他服务一样非常多,但完全可以满足类 UNIX 系统

之间文件共享的需要,下面来看一下通过 NFS 服务配置文件共享的几种常见方法。

14.1.1 NFS 只读共享

配置 NFS 共享目录可直接编辑/etc/exports 文件。下面的例子中将/home/charles 目录通过

NFS 共享,但只有 192.168.159.0/24、192.168.158.0/24 网段的客户端以只读方式访问。

/home/charles 192.168.159.*(ro) 192.168.158.*(ro)

在定义客户端匹配条件及参数时,一定要注意在多个客户端匹配条件之间必须有空格分

隔,而在客户端匹配条件与参数之间不能有空格。下面的例子中在*和(之间有空格,这样定

义的结果就是192.168.159.*及所有客户端均可以通过NFS访问。这主要是因为以下两个原因。

(1)参数中 ro 是默认值,NFS 会认为客户端匹配条件 192.168.159.*的参数是 ro。

(2)客户端匹配条件是*,NFS 会认为(ro)这个参数的客户端匹配条件为*。

Linux 从初学到精通

414

/home/charles 192.168.159.* (ro)

在配置 NFS 共享目录完成后,需要重新启动 nfs 服务使配置生效。最后可以通过

showmount 查看配置情况,该命令也可以在客户端使用。showmount 基本语法如下。

showmount {-e | -a | -d} [服务器名]

常用指数:

常用选项:

服务器名:显示指定的服务器,如不输入则显示本机 NFS 服务配置情况。

-e:显示服务器上导出的所有文件系统。

-a:显示服务器上所有已装入的网络文件系统(NFS)客户端和目录。

-d:显示服务器上当前由 NFS 客户端装入的所有目录。

使用 showmount 可以很好地帮助管理员检查 NFS 服务是否配置正确,以及所共享的目录

对不同客户端的权限。

[root@nfs ~]# cat /etc/exports /home/charles 192.168.159.*(ro) [root@ nfs ~]# showmount -e #查看本机的 NFS共享。 Export list for nfs.example.zqin: /home/charles 192.168.159.*

14.1.2 NFS 可写共享

下面的例子将/home/charles 目录共享,192.168.159.*网段的客户端只写,而其他所有客

户端以只读方式访问。

/home/charles 192.168.159.*(rw) *(ro)

在 NFS 中配置可写权限后,能否写入还必须根据实际目录的系统权限才能最后决定是否

可写。如果确定通过 NFS 访问共享时需要可写权限最简单的方法就是将该目录的其他用户权

限中加入可写,在上面的例子中,推荐运行以下命令后,192.168.159.0/24 网段的客户端才真

正具有可写权限。

chmod o+w /home/charles

14.1.3 用户访问权限

NFS 没有 Samba 中对访问用户控制的功能强大,但是基本也可满足日常工作对 NFS 的

需要,与访问用户配置相关的参数主要有 root_squash、no_root_squash、all_squash、anonuid、

anongid。下面是几个使用这些参数配置 NFS 用户访问权限的例子。

(1)当 192.168.159.0/24 网段的客户端通过 NFS 访问/home/charles 时,不管客户端是以

什么身份登录到自己的系统,NFS 服务器会认为其拥有其本机 nsfnobody 对该目录的权限(因

为 all_squash 是默认选项)。

/home/charles 192.168.159.*(ro)

太阳光辉——NFS 服务配置 第

415

14

(2)当 192.168.159.0/24 网段的客户端通过 NFS 访问/home/charles 时,如果有客户端是

以 root 身份登录到自己的系统,那么 NFS 服务器会认为其拥有本机 root 对该目录的权限。

/home/charles 192.168.159.*(ro, no_root_squash)

(3)当 192.168.159.0/24 网段的客户端通过 NFS 访问/home/charles 时,如果有客户端是

以 root 身份登录到自己的系统,那么 NFS 服务器会认为其拥有其本机 nsfnobody 对该目录的

权限。all_squash 与 root_squash 的区别在于,all_squash 会将客户端所有用户映射为 nfsnobody,

而 root_squash 只将客户端 root 映射为 nfsnobody。

/home/charles 192.168.159.*(ro, root_squash)

(4)当 192.168.159.0/24 网段的客户端通过 NFS 访问/home/charles 时,不管客户端是以

什么身份登录到自己的系统,那么 NFS 服务器会认为其拥有其本机 UID 为 509 的用户及 GID

为 510 的用户对该目录的权限。anonuid、anongid 不一定要同时出现在参数里。

/home/charles 192.168.159.*(ro, anonuid=509,anongid=510)

(5)当 192.168.159.0/24 网段的客户端通过 NFS 访问/home/charles 时,如果有客户端是

以 root 身份登录到自己的系统,那么 NFS 服务器会认为其拥有其本机 root 对该目录的权限,

如果客户端是以其他非 root 身份登录到自己系统的,那么 NFS 服务器会认为其拥有其本机

UID 为 509 的用户及 GID 为 510 的用户对该目录的权限。

/home/charles 192.168.159.*(ro, no_root_squash,anonuid=509,anongid=510)

(6)当 192.168.159.0/24 网段的客户端通过 NFS 访问/home/charles 时,不管客户端是以

什么身份登录到自己的系统(包括 root),那么 NFS 服务器会认为其拥有其本机 UID 为 509

的用户及 GID 为 510 的用户对该目录的权限。

/home/charles 192.168.159.*(ro, root_squash,anonuid=509,anongid=510)

客户端访问

NFS 服务配置完成后,客户端就可以访问其共享的资源。在本章中将分别讲述通过

Windows 客户端及 Linux 客户端访问 Samba 服务共享资源的方法。

14.2.1 Linux 平台

通过 Linux 平台访问 NFS 服务端方法有以下两种(在访问前推荐通过“showmount -e NFS

服务器 IP”的方式查看是否用可用的共享目录)。

(1)使用 mount 命令,下面的例子是使用 mount 将 NFS 服务器(IP 地址:192.168。159.14)

上的共享目录“/home/charles”挂载到本地的“/mnt”目录。

[root@nfs ~]# mount -t nfs 192.168.159.14:/home/charles /mnt

Linux 从初学到精通

416

在 RHEL 5.x 中“-t nfs”可以省略。

如果希望永久使用 NFS 服务器共享资源,可将挂载信息写入/etc/fstab 文件中。在/etc/fstab

中加入以下内容即可:

192.168.159.14:/home/charles /mnt nfs defaults 0 0

如果是通过修改/etc/fstab 文件时,NFS 的共享目录最好不要在本机,这样会因为服务启

动顺序的原因造成目录挂载失败(非常影响系统启动速度)。

(2)使用自动挂载方式,将 NFS 服务器(IP 地址:192.168。159.14)上的共享目录

“/home/charles”通过自动挂载的方式挂载到本地的“/mnt/nfs”目录,具体操作步骤如下。

在/etc/auto.master 文件中加入以下内容。

/mnt /etc/nfs.misc

在/etc 下新建 nfs.misc 文件,并加入以下内容。

nfs -fstype=nfs 192.168.159.14:/home/charles

使用如下命令重新启动 autofs 服务。

[root@nfs ~]# service autofs restart

14.2.2 Windows 平台

在使用 Linux/UNIX 访问 NFS 共享目录时,可直接使用 mount 命令,但如果使用 Windows

访问 NFS 共享目录则要分以下几种情况。

1.Windows Server 2003/Windows XP 如果 Windows Server 2003/Windows XP 作为客户端需要访问 NFS 共享目录时,可以在微

软网站下载 SFU(下载地址:http://download.microsoft.com/download/a/1/c/a1ca7af1-a6e3-46e7

-874a-4c5d8c0fb3b7/SFU35SEL_EN.exe)。SFU 配置 NFS 客户端操作步骤如下。

SFU(Services For UNIX)是一个免费工具,SFU 可以在 Windows 平台下搭建 NFS 服

务器,也可以通过 Windows 平台访问 NFS 共享目录。

(1)将 NFS 所在主机的/etc/passwd、/etc/group 文件复制到 Windows 的任意目录(本章

中将 2 个文件复制到 e:\nfs 目录中)。

(2)开始安装 SFU,下载的 SFU35SEL_EN.exe 是一个压缩文件,解压后双击运行其中

的 SfuSetup.msi 文件开始安装(下面只讲述需要修改的安装界面,其他界面的选择与 Windows

其他安装程序相同)。

(3)选择自定义安装,如图 14-1 所示。

(4)由于只需要 Windows 访问 NFS 共享目录,所以这里没必要安装 Server for NFS,如

图 14-2 所示。

提 示

提 示

太阳光辉——NFS 服务配置 第

417

14

图 14-1 自定义安装

图 14-2 client for NFS

(5)在用户映射处选择使用 passwd 及 group 文件。

(6)输入 passwd 及 group 文件路径,盘符要使用大写字母,如图 14-3 所示。

(7)安装完成后,打开“网络邻居”→“NFS Network”→“Default LAN”即可查看到

已配置 NFS 服务的 Linux 主机,双击即可进行 NFS 共享目录。

2.Windows Server 2008 如果使用 Windows Server 2008 作为客户端需要访问 NFS 共享目录时,可以打开“服务

器管理器”→“角色”后,单击“添加角色”,在弹出向导中勾选“文件服务器”(如图 14-4

所示),并在文件服务器角色选择中勾选“网络文件系统服务”(如图 14-5 所示),安装完成

后可以在命令行中使用如下命令访问 NFS 共享目录,其中“挂载驱动器号”指的是分配给装

载的共享资源的驱动器号,星号(*)表示使用下一个可用的驱动器号。

图 14-3 用户映射路径

图 14-4 安装文件服务器

mount NFS服务器 FQDN或 IP地址:共享名 挂载驱动器号|* #挂载 NFS共享目录 umount已挂载驱动器号 #卸载 NFS共享目录

Linux 从初学到精通

418

图 14-5 安装 NFS

3.Windows Vista/7

如果使用 Windows Vista/7 作为客户端需要访问 NFS 共享目录时,可以通过“控制面板”

→“程序”→“打开或关闭 Windows 功能”中勾选“NFS 客户端”(如图 14-6 所示)后,使

用与 Windows Server 2008 相同的方法访问 NFS 共享目录。

图 14-6 NFS客户端

实验任务

在如图 14-7 所示的网络拓扑中,通过 RHEL 5.x 自带的 NFS 服务实现目录共享,完成以

下实验任务。

太阳光辉——NFS 服务配置 第

419

14

图 14-7 NFS服务实验任务

(1)创建 2 个目录:/share/fringe、/share/house。

(2)将“/share/house”目录共享,并满足如下要求。

只允许 192.168.159.0/24、192.168.158.0/24 网段的客户端访问。

所有员工只允许读取文件,不允许修改文件。

(3)将“/share/fringe”目录共享,并满足如下要求。

只允许 192.168.157.0/24 网段的客户端访问可以读写该目录。

只允许 192.168.159.0/24 网段的客户端访问可以只读该目录。

“fringe”组的员工可以读取及修改该目录上的内容。

本章测试

(1)在使用 NFS 服务时,( )服务必须已运行。

A.iptables B.httpd

C.atd D.portmap

(2)使用如下配置后,192.168.159.100 可以( )共享目录“/home/charles”。 /home/charles 192.168.159.*(rw)*(ro)

A.读 B.写

C.读、写 D.不能访问

(3)NFS 服务在默认情况下使用( )端口。

A.23 B.80

C.21 D.随机

(4)如果有客户端是以 root 身份登录到自己的系统,( )参数可以使用 NFS 服务器

Linux 从初学到精通

420

会认为其拥有本机 root 对该目录的权限。

A.isroot B.no_root_squash

C.root_squash D.isroot_squash

(5)在 Linux 使用( )命令可以访问 NFS 服务已共享的目录。

A.mount B.showmount

C.ftp D.wget

(6)下列关于 NFS 服务说法错误的是( )。

A.NFS 服务可以实现类 UNIX 平台之间的文件共享

B.NFS 服务可以实现类 UNIX 平台之间的打印机共享

C.NFS 服务共享的目录 Windows 客户端可以访问

D.NFS 服务由 Sun 公司开发

(7)默认情况下 NFS 客户端访问 NFS 服务器时,拥有( )用户的权限。

A.root B.nobody

C.nfsnobody D.nfs

(8)( )是 NFS 服务的配置文件。

A./etc/nfs B./etc/nfs.conf

C./etc/nfs/exports D./etc/exports

(9)showmount -e 命令可以查看( )NFS 服务已共享的目录。

A.本机 B.已指定远程服务上

C.Windows 服务器 D.不确定

(10)下列 Windows 版本中( )内置提供了访问 NFS 服务的支持。

A.Windows 2000 Server B.Windows Server 2003

C.Windows Vista D.Windows NT Server

文件传输协议(File Transfer Protocol,FTP)是 Internet 文件

传送的基础,FTP 由一系列规格说明文档组成,目标是提高文件

的共享性,提供非直接使用远程计算机,使存储介质对用户透明

和可靠高效地传送数据。简单地说,FTP 就是完成两台计算机之

间的文件复制,从远程计算机复制文件至本地的计算机上,称之

为“下载”文件。如果文件从本地计算机中复制至远程计算机上,

则称之为“上传”文件。

第15章

固若金汤︱︱vsftpd

服务配置

Linux 从初学到精通

422

FTP 基础

FTP 协议的任务是从一台计算机将文件传送到另一台计算机,FTP 与这两台计算机所处

的位置、连接的方式甚至是否使用相同的操作系统无关(每种操作系统使用上有某一些细微

差别,但是每种协议基本的命令结构是相同的)。FTP 可以工作在以下两种方式下。

(1)Port 模式(主动模式):FTP 客户端首先和 FTP 服务器的 TCP 的 21 端口建立连接,

通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送 PORT 命令。PORT

命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的 TCP 的

20 端口连接至客户端的指定端口发送数据。

(2)Passive 模式(被动模式):在建立控制通道的时候和 Port 模式类似,但建立连接后

发送的不是 PORT 命令,而是 PASV 命令。FTP 服务器收到 PASV 命令后,随机打开一个 TCP

的端口(端口号大于 1024)并且通知客户端在这个端口上传送数据的请求,客户端连接 FTP

服务器此端口,然后 FTP 服务器将通过这个端口进行数据的传送。

FTP 服务器属于 Internet 上比较常见的服务器,目前在各种操作系统平台下实现 FTP 服

务的软件非常多,在 Windows 平台下 IIS 可以提供 FTP 服务、Serv-U 是一种比较常见的 FTP

服务器,在类 UNIX 平台下也有 ProFTPd、vsftpd 等。

vsftpd 是 Very Secure FTP(非常安全的 FTP)的缩写,是一个基于 GPL 发布的类 UNIX

系统上使用的 FTP 服务器软件。vsftpd(vsftpd 官方网站:http://vsftpd.beasts.org/)目前已经

被许多大型 FTP 站点所采用(如 Red Hat、Suse、Debian、OpenBSD)。

vsftpd 除了这与生俱来的安全特性以外,高速与高稳定性也是 vsftpd 的两个重要特点。

在速度方面,千兆以太网上的下载速度可达 86MB/S。在稳定性方面 vsftpd 更加出色,vsftpd

在单机上支持 4000 个以上的并发用户同时连接。很多著名的网站都采用 vsftpd 提供 FTP 服

务,根据 Red Hat 的 FTP 服务器(ftp.redhat.com)的数据,vsftpd 服务器可以支持 15000 个

并发用户,vsftpd 也是 RHEL5.x 默认提供的 FTP 服务。

vsftpd 服务安装

很多的 Linux 发行版中都包括了 vsftpd 的软件包,vsftpd 在安装时并没有太多依赖软件

包,可以直接使用如下命令安装 vsftpd 软件包。在使用不同版本 RHEL 时,vsftpd 服务的版

本可能会有小的区别,但并不影响其后的配置;“/mnt”目录是 RHEL 5.x 光盘的挂载点。

rpm -ivh /mnt/Server/vsftpd-2.0.5-16.el5.i386.rpm

和其他 Linux 下的 System V 服务一样安装完成后,可以使用“service”命令启动、停止、

重新启动服务;使用“chkconfig”命令调整在指定运行级别是否自动加载。

固若金汤——vsftpd 服务配置 第

423

15service vsftpd start #启动服务。 service vsftpd stop #停止服务。 service vsftpd restart #重新启动服务。 service vsftpd reload #在不重新启动的情况下,重新载入配置文件。 service vsftpd status #查看服务当前运行状态。 chkconfig vsftpd on #在运行级别 2、3、4、5上设置为下次开机时自动运行。 chkconfig vsftpd off #在运行级别 2、3、4、5上设置为下次开机时不自动运行。

如果不需要再使用 vsftpd,可通过以下命令现在卸载 vsftpd 服务。

rpm -e vsftpd

vsftpd 服务配置

在通过 rpm 包将 vsftpd 安装完成后,其配置文件为/etc/vsftpd/vsftpd.conf 文件。在修改该

文件时应注意以下几点:

(1)以“#”开始的是注释行(在执行时将被忽略)。

(2)关键字对大小写敏感。

(3)所有参数的配置形式均为“参数=值”的方式。

vsftpd 几乎提供了 FTP 服务器所应该具有的所有功能,为了实现这个功能一般是通过修

改/etc/vsftpd/vsftpd.conf 文件实现,以下是在该文件比较常用的一些参数。

(1)listen_address:指定 vsftpd 侦听的 IP 地址,当 vsftpd 有多个 IP 地址时,可通过该设

置让 vsftpd 只接受某个 IP 地址侦听到的 FTP 请求。

listen_address=<IP地址>

(2)listen_port:指定 vsftpd 侦听的端口,默认 TCP 的 21 端口。

listen_port=<端口>

(3)max_clients:指定 vsftpd 允许的最大连接数。

max_clients=<最大连接数>

(4)max_per_ip:指定 vsftpd 允许相同 IP 的最大连接数。

max_per_ip=<最大连接数>

(5)use_localtime:指定 vsftpd 是否在显示目录列表时使用本地时间。

use_localtime=<YES|NO>

(6)ftpd_banner:指定登录到 FTP 服务时显示的欢迎信息(并不是所有访问 FTP 服务器

的方式都支持欢迎信息的,如通过 IE 浏览器访问时就不会显示这些信息),可以指定一个文

件名,vsftpd 会显示文件中的内容。

ftpd_banner=<欢迎信息>

Linux 从初学到精通

424

(7)dirmessage_enable:指定 vsftpd 是否当用户在 FTP 服务器切换目录时显示的欢迎信

息,当 dirmessage_enable=YES 时,可以在每个目录下建立一个名为.message 的文件,在该文

件中写入欢迎信息。

dirmessage_enable=<YES|NO>

(8)banner_fail:指定当连接失败时 vsftpd 显示的信息,可以指定一个文件名,vsftpd 会

显示文件中的内容。

banner_fail=<显示信息>

(9)xferlog_enable:指定 vsftpd 是否在用户上传/下载文件时记录日志。

xferlog_enable=<YES|NO>

(10)nopriv_user:指定 vsftpd 服务的运行账户,默认为 ftp。

nopriv_user=<用户名>

(11)xferlog_file:指定 vsftpd 使用的日志文件。

xferlog_file=<文件名>

(12)xferlog_std_format:指定 vsftpd 是否使用标准日志文件来记录日志。

xferlog_std_format=<YES|NO>

(13)listen:指定 vsftpd 开启 IPv4 支持。

listen=<YES|NO>

(14)listen_ipv6:指定 vsftpd 开启 IPv6 支持。

listen_ipv6=<YES|NO>

(15)tcp_wrappers:指定 vsftpd 是否允许 tcp_wrappers 管理。

tcp_wrappers=<YES|NO>

(16)connect_from_port_20:指定 vsftpd 是否使用 20 端口传输数据。

connect_from_port_20=<YES|NO>

(17)pasv_min_port、pasv_max_port:指定 vsftpd 在被动模式时,客户端的数据连接端

口范围。 pasv_min_port=<端口最小值> pasv_max_port=<端口最大值>

15.3.1 身份验证

当客户端访问到 vsftpd 搭建的 FTP 服务器时,vsftpd 会对客户端的用户身份进行验证,

在 vsftpd 中提供了以下几种验证方式。

1.匿名方式 当客户端访问到 FTP 服务器时,不需要输入任何用户名和密码即可通过 vsftpd 的身份验

证,这也是 vsftpd 默认允许的方式(vsftpd 默认只允许匿名用户下载数据,不允许匿名用户

固若金汤——vsftpd 服务配置 第

425

15上传数据)。

2.授权方式 当客户端访问到 FTP 服务器时,必须输入有效的用户名及密码。vsftpd 在默认情况除了

匿名用户以外,还允许本地系统用户(/etc/passwd 文件中记录的用户)访问。

除了可以使用匿名用户或本地系统用户作为 vsftpd 的有效用户以外,还可以将 vsfptd 配

置为支持虚拟用户,相对于本地系统用户形式来说,虚拟用户只是 FTP 服务的专有用户,虚

拟用户只能访问 FTP 服务器所提供的资源,不能访问 FTP 服务所在主机,这样可以增强系统

本身的安全性。相对于匿名用户而言,虚拟用户需要用户名和密码才能获取 FTP 服务器中的

文件,增加了对用户和下载的可管理性。对于需要提供下载服务,但又不希望所有人都可以

匿名下载又考虑到主机安全和管理方便的 FTP 站点来说,虚拟用户是一种很好的解决方案。

vsftpd 支持多种虚拟用户来源,本章中介绍通过本地数据文件实现虚拟用户访问,这种方法

主要适用在用户比较少及变化不频繁的情况下,具体操作步骤如下。

(1)使用如下命令安装用于生成数据库的软件包 db4-utils。在使用不同版本 RHEL 时,

db4-utils 的版本可能会有小的区别,但并不影响其后的配置;“/mnt”目录是 RHEL 5.x 光盘

的挂载点。

[root@ftp ~]# rpm -ivh /mnt/Server/db4-utils-4.3.29-9.fc6.i386.rpm

(2)使用如下命令创建本地映射用户,修改本地映射用户家目录权限。当 FTP 客户端通

过虚拟用户访问 vsftpd 时,vsftpd 所在主机的 Linux 系统会认为是这个本地映射用户在访问

Linux 系统,具体操作步骤如下。

增加一个名为 vuser 的用户,并将其家目录指向/var/ftp/vuserdir、登录脚本指定为

/sbin/nologin。

[root@ftp ~]# useradd -d /var/ftp/vuserdir -s /sbin/nologin vuser

修改/var/ftp/vuserdir 目录的权限,将其他用户的权限修改为可读、可写、可执行。

[root@ftp ~]# chmod o=rwx /var/ftp/vuserdir

(3)修改/etc/vsfptd/vsftpd.conf 文件,内容如下。 guest_enable=YES #允许虚拟用户登陆 guest_username=vuser #将虚拟用户映射为本地的 vuser用户

( 4 )生成虚拟用户文件,在该文件中用户及密码各一行。本章中是建立

/etc/vsftpd/vftpuser.txt 文件,内容如下。

charles #虚拟用户 1。 111 #虚拟用户 1密码。 jack #虚拟用户 2。 222 #虚拟用户 2密码。

(5)生成虚拟用户数据文件。

[root@ftp ~]# db_load -T -t hash -f /etc/vsftpd/vftpuser.txt /etc/vsftpd/vftpuser.db

(6)处于安全考虑应修改生成的用户数据文件权限。

Linux 从初学到精通

426

[root@ftp ~]# chmod 600 /etc/vsftpd/vftpuser.db

(7)修改 PAM 认证文件/etc/pam.d/vsftpd,将原有内容注释并加入以下内容。通过以下

两行的配置可以将认证用户及用户其他检查的工作的数据来源改变为本地数据文件

(/etc/vsftpd/vftpuser)。

auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vftpuser account required /lib/security/pam_userdb.so db=/etc/vsftpd/vftpuser

(8)使用如下命令重新启动 vsftpd 后,即可使用 charles、jack 登录 FTP 服务器。

[root@ftp ~]# service vsftpd restart

15.3.2 其他配置

当用户登录到 vsftpd 服务器时,如果是使用系统用户则被引导到用户的家目录,如果是

匿名用户则被引导到/var/ftp 目录,如果是使用虚拟用户则被引导到所映射的系统用户的家目

录。在 vsftpd 中对用户使用 FTP 服务器时的行为进行控制的参数主要有以下几个。

(1)anonymous_enable:指定 vsftpd 是否允许使用匿名用户登录。

anonymous_enable=<YES|NO>

(2)allow_anon_ssl:指定 vsftpd 是否允许匿名账户通过 SSL 连接。

allow_anon_ssl=<YES|NO>

(3)local_enable:指定 vsftpd 是否允许本地用户登录。

local_enable=<YES|NO>

(4)write_enable:指定 vsftpd 是否允许用户上传文件到 FTP 服务器,该参数只对非匿名

用户有效。

write_enable=<YES|NO>

(5)anon_upload_enable:指定 vsftpd 是否允许匿名用户上传文件到 FTP 服务器。

anon_upload_enable=<YES|NO>

(6)anon_mkdir_write_enable:指定 vsftpd 是否允许匿名用户在 FTP 服务器上建立目录。

anon_mkdir_write_enable=<YES|NO>

(7)anon_other_write_enable:指定 vsftpd 是否允许匿名用户执行创建目录之外的写操作

(如删除、重命名)。

anon_other_write_enable=<YES|NO>

(8)download_enable:指定 vsftpd 是否允许用户下载文件。

download_enable=<YES|NO>

(9)local_umask:指定在 vsftpd 中,授权用户上传文件的 umask 值。

local_umask=<umask值>

固若金汤——vsftpd 服务配置 第

427

15(10)anon_umask:指定在 vsftpd 中,匿名用户上传文件的 umask。

anon_umask=<umask值>

(11)chown_uploads、chown_username:指定在 vsftpd 中,修改匿名用户上传文件的所

有者,当 chown_uploads=YES 时,可通过 chown_username 指定一个系统用户,这样用户上

传的所有文件所有者都被自动改为该系统用户。当然前提是 anonymous_enable=YES、

anon_upload_enable= YES。 chown_uploads=<YES|NO> chown_username=<系统用户>

(12)ls_recurse_enable:指定 vsftpd 是否允许用户在登录到 FTP 服务器后使用“ls -R” 之

类比较占用系统资源的命令。

ls_recurse_enable=<YES|NO>

(13)dirlist_enable:指定 vsftpd 是否允许使用“dir”之类的列目录内容的命令。

dirlist_enable=<YES|NO>

(14)userlist_file:指定在 vsftpd 中,记录被允许或禁止登录用户的文件名。在文件中一

行一个用户名。

userlist_file=<文件名>

(15)userlist_enable:该参数为 YES 时,vsftpd 将读取 userlist_file 参数所指定的文件中

的用户列表,当列表中的用户登录 FTP 服务器时,该用户在提示输入密码之前就被禁止了(即

该用户名输入后,vsftpd 检查到所输入的用户名在列表中,vsftpd 就直接禁止该用户,不会再

进行询问密码等后续步聚)。

userlist_enable=<YES|NO>

(16)userlist_deny:该参数决定禁止还是只允许由 userlist_file 指定文件中的用户登录 FTP

服务器(该参数只有在 userlist_enable=YES 时才生效)。当 userlist_deny= YES(默认值),禁

止文件中的用户登录,同时也不向这些用户发出输入密码的提示,当 userlist_deny= NO 时只

允许在文件中的用户登录 FTP 服务器。

userlist_deny=<YES|NO>

(17)chroot_local_user:指定 vsftpd 是否允许所有用户登录到 FTP 服务器离开自己的家

目录。

chroot_local_user=<YES|NO>

( 18 ) chroot_list_enable : 是 否 允 许 指 定 不 能 离 开 家 目 录 的 用 户 , 只 有 当

chroot_local_user=YES 时,chroot_list_enable=YES 才有效。

chroot_list_enable=<YES|NO>

( 19 ) chroot_list_file : 指 定 在 vsftpd 中 , 不 能 离 开 家 目 录 的 用 户 , 如 果

chroot_list_file=/etc/vsftpd/chroot_list ,可将用户名一个一行写在该文件里,只有当

Linux 从初学到精通

428

chroot_list_enable=YES 时,该参数才有效。

chroot_list_file=<文件名>

当用户通过 FTP 方式连接到服务器 vsftpd 在默认情况下,允许用户离开自己的家目录,

甚至允许用户进入“/etc/”这样一些重要的系统目录(如图 15-1 所示),强烈推荐使用

chroot_local_user=NO禁止用户离开家目录或使用 chroot_list_enable只允许特定用户离开家

目录。

图 15-1 chroot_list_enable

(20)local_root:指定在 vsftpd 中所有用户的根目录。默认情况下 vsftpd 会根据登录用

户的不同,引导到各自的家目录,通过 local_root 参数指定一个目录,如“local_root=/home/ftp”

后,所有登录的用户将被引导到/home/ftp 目录,该参数对匿名用户无效。

local_root=<目录>

(21)anon_root:指定在 vsftpd 中匿名用户的根目录。默认情况下 vsftpd 会将匿名用户

引导到 ftp 用户的家目录,通过 anon_root 参数指定一个目录,如“local_root=/ftp”后,匿名

用户登录后将被引导到/ftp 目录。

anon_root=<目录>

(22)anon_max_rate:指定在 vsftpd 中,匿名用户的最大传输速度,单位:Byts/秒。

anon_max_rate=<最大传输速度>

(23)local_max_rate:指定在 vsftpd 中,授权用户的最大传输速度,单位:Byts/秒。

local_max_rate=<最大传输速度>

(24)async_abor_enable:指定 vsftpd 是否允许客户端使用 sync 等命令。

async_abor_enable=<YES|NO>

提 示

固若金汤——vsftpd 服务配置 第

429

15(25)ascii_upload_enable:指定 vsftpd 是否在上传文件时使用 ASCII 传输模式。

ascii_upload_enable=<YES|NO>

(26)ascii_download_enable:指定 vsftpd 是否在下载文件时使用 ASCII 传输模式。

ascii_download_enable=<YES|NO>

(27)idle_session_timeout:指定在 vsftpd 中,会话超时的时间(客户端连接到 FTP 但未

操作),单位:秒。

idle_session_timeout=<超时时间>

(28)data_connection_timeout:指定在 vsftpd 中,数据传输超时的时间,单位:秒。

data_connection_timeout=<超时时间>

(29)deny_file:指定在 vsftpd 中,不允许上传的文件类型,如 deny_file={*.exe,*.dll}。

deny_file=<文件类型>

(30)pam_service_name:指定 vsftpd 使用 PAM 模块的配置文件。

pam_service_name=<PAM模块配置文件>

当用户登录到 FTP 服务器后能否上传文件,除了在 vsftpd 的配置文件中允许相应的上传

操作外,该用户对目录的系统权限也必须是可写。如当“write_enable=YES”时,用户以 charles

的用户名登录到 FTP 服务器后进入/home/charles/test 目录,但/home/charles/test 目录的所有者

及拥有组均为 root,系统权限为 700,这时 charles 无法上传文件。

客户端访问

FTP 服务器端配置完成后,客户端就可以访问其共享的资源。客户端访问 FTP 服务器时

可以通过以下三种方式。

15.4.1 使用浏览器

使用浏览器方式在 Linux 及 Windows 平台下除使用的浏览器不同以外,操作基本相同,

直接在浏览器地址栏输入如下内容即可,如图 15-2 所示。

ftp://FTP服务器 IP地址或 FQDN ftp://用户名:密码@FTP服务器 IP地址或 FQDN

Linux 从初学到精通

430

图 15-2 浏览器访问 FTP

15.4.2 使用命令

命令方式最常用的是 ftp 命令,该命令在 Linux 及 Windows 平台使用基本相同。在 Linux

平台还可以使用 wget、lftp 命令访问 FTP 服务器。本章中主要讲解 ftp、lftp 命令。

(1)ftp 命令语法如下。

ftp [-vdg] [用户名:密码@<FQDN>|<IP地址>]

常用指数:

常用选项:

<主机名> <IP 地址>:需要连接的 FTP 服务器的 IP 地址 FQDN。

-v:显示远程服务器的所有响应信息。

-d:使用调试方式访问 FTP 服务器。

-g:取消全局文件名。

在进行 ftp 命令模式后可通过 help 命令查看所有可操作的命令,在这些命令中常用的主

要包括如下。

![命令[参数]]:在 FTP 客户端中执行命令。

open <FQDN>|<IP 地址>:打开指定的 FTP 服务器。

bye:退出 ftp 会话过程。

cd 目录:切换 FTP 服务器的当前目录。

dir[目录][本地文件]:显示 FTP 服务器目录,并将结果存入本地文件。

put 文件:将单个文件上传至 FTP 服务器。

mput:将多个文件上传至 FTP 服务器。

get 文件:从 FTP 服务器下载单个文件到本地当前目录。

固若金汤——vsftpd 服务配置 第

431

15 mget 文件:从 FTP 服务器下载多个文件到本地当前目录。

delete 文件名:FTP 服务器上的文件。

case:在使用 mget 时,将远程主机文件名中的大写转为小写字母。

pwd:显示远程主机的当前工作目录。

rmdir 目录名:删除 FTP 服务器上的目录。

以下是使用 FTP 命令访问 IP 地址为 192.168.159.15 的 FTP 服务器,进行常见操作的例子。

[root@ftp ~]# ftp 192.168.159.15 Connected to 192.168.159.15. 220 (vsFTPd 2.0.5) 530 Please login with USER and PASS. 530 Please login with USER and PASS. KERBEROS_V4 rejected as an authentication type Name (192.168.159.15:root): anonymous #使用匿名方式访问 FTP服务器 331 Please specify the password. Password: #使用匿名方式时不需输入密码,直接按回车键 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> dir #查看 FTP服务器文件内容 227 Entering Passive Mode (192,168,159,15,220,232) 150 Here comes the directory listing. -rw-r--r-- 1 0 0 2097152 Jan 04 08:58 book.xls -rw-r--r-- 1 0 0 4194304 Jan 04 08:59 jack.pptx drwxr-xr-x 2 0 0 4096 May 13 2009 pub -rw-r--r-- 1 0 0 4194304 Jan 04 09:00 cameron.pdf -rw-r--r-- 1 0 0 28794 Jan 04 08:58 oliva.doc 226 Directory send OK. ftp> get jack.pptx #下载名为 jack.pptx的文件 local: jack.pptx remote: jack.pptx 227 Entering Passive Mode (192,168,159,15,140,218) 150 Opening BINARY mode data connection for jack.pptx (4194304 bytes). 226 File send OK. 4194304 bytes received in 0.1 seconds (4e+04 Kbytes/s) ftp> quit #退出 ftp命令 221 Goodbye.

(2)lftp 命令

该命令是一个 Linux 平台专用的连接 FTP 服务器的命令,lftp 支持访问文件的协议包括

FTP、FTPS、HTTP、HTTPS 等,与 ftp 命令相比 lftp 更符合 Linux 用户的习惯(可以使用 Tab

键自动补全、历史记录等功能)。

lftp ftp://[用户名:密码@] <FQDN>|<IP地址>[:端口] lftp ftp://<FQDN>|<IP地址> -p port -u用户名,密码

在进行 lftp 命令模式后可通过 help 命令查看所有可操作的命令,在这些命令中常用的主

要包括:

ls:显示 FTP 服务器文件列表(!ls 显示本地文件列表)。

cd:切换远端目录(!cd 切换本地目录)。

Linux 从初学到精通

432

get:从 FTP 服务器下载单个文件到本地当前目录。

mget:从 FTP 服务器下载多个文件到本地当前目录。

pget:使用多个线程来下载远端文件。

put:将单个文件上传至 FTP 服务器。

mput:将多个文件上传至 FTP 服务器。

mv:移动 FTP 服务器上的文件。

rm:删除 FTP 服务器上的文件(使用参数-r 递归删除文件夹)。

mrm:删除 FTP 服务器上的多个文件。

mkdir:在 FTP 服务器上建立目录。

pwd:显示目前 FTP 服务器所在目录(lpwd 显示本地目录)。

exit:退出 ftp 会话过程。

15.4.3 使用 FTP 客户端工具软件

FTP 客户端工具主要指的是一些第三方的软件,这些工具软件一般需要单独安装后才可

以使用,但这些工具软件往往提供了比浏览器或命令更丰富的功能,如 CuteFTP、FlashFXP、

gftp、kftpgrabber 等。本章中以 FlashFXP 为例子讲解 FTP 客户端工具软件的使用。将 FlashFXP

安装完成后,通过“开始”→“所有程序”打开“FlashFXP”后单击“FlashFXP”即可启动

该软件。使用 FlashFXP 连接到 FTP 服务器的具体操作步骤如下。

(1)选择“会话”→“快速连接”,如图 15-3 所示。

(2)在弹出窗口中输入 FTP 服务器 IP 地址并输入访问的用户名及密码,如果希望使用匿

名用户访问 FTP 服务器,可勾选“匿名”。输入完成后,单击“连接”按钮,如图 15-4 所示。

图 15-3 FlashFXP快速连接

图 15-4 连接 FTP

(3)连接成功后,FlashFXP 左侧显示的是本地目录,右侧显示的是 FTP 服务器的内容(如

图 15-5 所示),将右侧文件或目录拖到左侧可下载 FTP 服务器中的内容到本地,将左侧或目

录拖到右侧可上传文件到 FTP 服务器。

固若金汤——vsftpd 服务配置 第

433

15

图 15-5 上传下载文件

实验任务

在一台安装了 RHEL 5.x、IP 地址为 192.168.159.11 的计算机上安装 vsftpd 实现 FTP 服务,

并配置 vsftpd 满足以下要求。

(1)添加名为 jack、house、oliva、gilbert 的虚拟用户。

(2)所有上传的文件,均去除其他用户的写(w)权限。

(3)对服务器中没有明确授权的其他目录,均禁止以上用户访问。

(4)最多允许 100 个并发用户连接,每 IP 并发连接数不超过 3 个。

本章测试

(1)在 RHEL 5.x 中( )是 vsftpd 的守护进程。

A.Ftpd B.ftp

C.Vsftpd D.vsftp

(2)在 vsftpd 中参数“ls_recurse_enable”的作用是( )。

A.确定用户是否可以使用“ls -R”之类的命令

B.确定用户是否可以访问 vsftpd

Linux 从初学到精通

434

C.指定 FTP 服务的欢迎消息

D.确定用户是否可以上传文件

(3)vsftpd 默认情况下( )可以访问。

A.匿名用户 B.虚拟用户

C.root 用户 D.ftpadmin 用户

(4)以下可以搭建 FTP 服务的软件包括( )。

A.cuteftp B.BIND

C.vsftpd D.Samba

(5)下面关于 FTP 协议正确的说法包括( )。

A.ftp 使用不同的端口进行上传和下载,以提高传输效率

B.ftp 将控制和数据传输分开以获得较大的性能

C.占用了 20,21 两个端口

D.客户端和服务端都可以发起连接要求和发送数据

(6)在 RHEL 5.x 系统中,若要设置允许匿名 FTP 用户上传文件,应在 vsftpd.conf 文件

中添加( )配置参数。

A.upload_enable=YES B.anon_upload_enable=YES

C.write_enable=YES D.local_enable=YES

(7)vsftpd 服务器中提供了灵活的访问控制设置方法,在文件 vsftpd.user_list 中可以设置

允许或拒绝访问 FTP 服务器的用户,当只允许 vsftpd.user_list 文件中的用户登录 vsftpd 服务

器时,在 vsftpd.conf 配置文件中应同时设置( )。

A.userlist_deny=NO B.userlist_deny=YES

C.userlist_enable=YES D.userlist_enable=NO

(8)在一台通过 vsftpd 实现 FTP 服务的 RHEL 5.x 上,vsftpd 配置为允许匿名用户访问,

那么当客户端访问时可以使用( )用户名。

A.bin B.root

C.IUSR_RHEL D.anonymous

(9)ftp 命令在 Linux 和 Windows 系统中都可以使用,在使用 ftp 命令访问 FTP 服务器后,

使用( )命令可以将 FTP 服务器中的多个文件同时下载。

A.get B.mget

C.mput D.put

(10)在 RHEL 5.x 中 vsftpd 默认使用( )。

A.主动模式 B.被动模式

C.安全模式 D.超级模式

1991 年,Andrew Tridgwell 通过对数据包的分析了解 SMB 协议的

工作方式,而编写了 Samba 这个自由软件(Samba 官方网站:

http://www.samba.org),只要在类 UNIX 上启用 Samba 服务,类 UNIX

系统就好像成了一台 Windows 系统,可利用 SMB/CIFS 协议与 Windows

系统之间实现资源共享等相关功能。

Samba 是开放源代码的 GPL 自由软件,可以说是自由软件界的又一

个重大贡献。Samba 的出现彻底解决了类 Unit 与 Windows 之间的资源

共享与访问,Samba 以其简洁、实用、灵活配置、功能强大的特点受到

越来越广泛的关注。也是因为这个原因,现在几乎所有的类 UNIX 都可

以使用 Samba 服务。Samba 服务主要提供以下功能。

(1)共享类 Unit 系统上的资源(目录、打印机)。

(2)使用 Windows 上的共享资源(目录、打印机)。

(3)通过 Windows 对使用 Samba 资源的用户进行认证。

(4)使用 WINS 服务进行名称解析及浏览。

(5)通过 SSL 实现安全的数据传输。

第16章

桑巴起舞︱︱S

amba

服务配置

Linux 从初学到精通

436

Samba 服务包括 Smbd 和 Nmbd 两个后台应用程序。Smbd 是 Samba 的核心,主要负责建立

Samba 服务器与 Samba 客户机之间的对话,验证用户身份并提供对文件和打印机的访问。Nmbd

主要负责对外发布 Samba 服务器可以提供的 NetBIOS 名称和浏览服务,使 Windows 用户可以在

“网上邻居”中浏览Samba服务器中共享的资源。另外,Samba还包括一些管理工具,如 smb-client、

testparm、Smbpasswd 等。

Samba 服务安装

几乎在所有的 Linux 发行版中都包括了 Samba 服务的软件包,RHEL5.x 中 Samba 服务包

括以下几个软件包。

(1)samba-common:包括 Samba 服务器端及 Samba 客户端需要的通用工具及相关的库

文件。

(2)samba:Samba 服务器端软件。

(3)samba-client:Samba 客户端软件。

(4)system-config-samba:Red Hat 公司专门为 Samba 服务器管理编写的图形界面的管理

工具,该工具是 Red Hat 系统管理工具中的一部分。

(5)samba-swat:安装后提供通过浏览器对 Samba 服务器进行图形化管理(Web 方式)

的功能。

其中 samba-common、samba-client 默认已安装,system-config-samba 及 samba-swat 都是

使用图形化方式管理。Samba 服务在安装时并没有太多依赖软件包,可以直接使用如下命令

安装 Samba 服务软件包。在使用不同版本 RHEL 时,Samba 服务的版本可能会有小的区别,

但并不影响其后的配置;“/mnt”目录是 RHEL 5.x 光盘的挂载点。

rpm -ivh /mnt/Server/perl-Convert-ASN1-0.20-1.1.noarch.rpm rpm -ivh /mnt/Server/samba-3.0.33-3.14.el5.i386.rpm

perl-Convert-ASN1 是 Samba 的依赖包。

和其他 Linux 下的 System V 服务一样,安装完成后,可以使用“service”命令启动、停

止、重新启动服务;使用“chkconfig”命令调整在指定运行级别是否自动加载。

service smb start #启动服务。 service smb stop #停止服务。 service smb restart #重新启动服务。 service smb reload #在不重新启动的情况下,重新载入配置文件。 service smb status #查看服务当前运行状态。 chkconfig smb on #在运行级别 2、3、4、5上设置为下次开机时自动运行。 chkconfig smb off #在运行级别 2、3、4、5上设置为下次开机时不自动运行。

如果不需要再使用 Samba 服务,可通过以下命令现在卸载 Samba 服务。

rpm -e samba

提 示

桑巴起舞——Samba 服务配置 第

437

16

Samba 服务配置

在通过 rpm 包将 Samba 安装完成后,其主配置文件为/etc/samba/smb.conf 文件。在修改

该文件时应注意以下几点。

(1)对参数进行配置时基本都采用“参数=值”的方式,如参数有多个值时,多个值之

间用空格分隔。

(2)当可以使用用户和组作为参数值时,值为组时需在组名前加@。

(3)以分号“;”或井号“#”开始的是注释行(在执行时将被忽略)。

(4)方括号标识表示标志,如“[global]”为全局配置标识。

(5)一般当全局配置与某个共享资源配置发生冲突时,共享资源配置优先。

(6)关键字对大小写不敏感。

Samba 服务功能非常丰富,有很多功能 Windows 在默认情况下都无法实现,因此其主配

置文件(/etc/samba/smb.conf)中内容自然也非常庞大,这些内容主要由全局配置、共享配置

组成。全局配置以“[global]”标识开始,该部分主要对 Samba 服务运行的方式、身份验证等

等内容进行配置。共享配置该部分标识可根据需要定义,主要用于共享资源。

在 RHEL 5.x 中使用默认的 rpm 包安装后,在/etc/samba/smb.conf 文件中包含如下内容,

主要用于共享用户家目录,如果不需要使用这样的共享可以将其删除或注释。

[homes] comment=Home Directories browseable=no writable=yes ; valid users=%S ; valid users=MYDOMAIN\%S

16.2.1 资源共享配置

Samba 服务的功能主要是实现资源共享,在配置共享时至少需要使用如下参数,当然这

里只是简单地实现一个目录的共享。其中“[共享名]”用于定义客户端访问 Samba 服务器时

浏览到的目录名,该名称不发展与本地目录名相同,但在当前 Samba 服务器必须唯一;

“comment”用于定义客户端访问 Samba 服务器时浏览到的目录描述信息;“path”用于定义

需要共享的本地目录,必须使用绝对路径。

[共享名] comment=描述 path=本地目录路径

在 Samba 中共享目录的参数需要放在“[global]”标识所有参数的后面,在配置时推荐将

定义的共享参数放在/etc/samba/smb.conf 文件的最尾处。在下面的例子中 Samba 会将“/ctu”

目录共享,其共享名为“usactu”;描述信息为“company document”。

Linux 从初学到精通

438

[usactu] comment= Counter Terrorist Unit path=/ctu

在使用 Samba 服务时,硬盘中的目录都可以使用上述方法共享,但如果需要共享光驱应

使用如下方式。

[cdrom] comment=this is cdrom path=/mnt/cdrom root preexec=/bin/mount -t iso9660 /dev/cdrom /mnt/cdrom root postexec=/bin/umount /mnt/cdrom

在修改了 Samba 服务的配置文件后,需要重新启动 Samba 服务,使其配置生效,不过在

重新启动 Samba 服务前,推荐使用 testparm 命令检查文件是否正确,testparm 可以测试 Samba

配置文件是否正确,执行该命令可以简单测试 Samba 的配置文件。如果测试结果正确,Samba

就可以正确载入配置文件的参数值,但该命令并不保证其后的操作如预期一样正确。testparm

命令基本语法如下。

testparm [-sv] [配置文件] [<FQDN> <IP地址>]

常用指数:

常用选项:

-s:不显示提示符号等待用户按回车键,直接列出 Samba 服务定义信息。

-v:显示 Samba 服务器的当前配置。

配置文件:指定需要测试的配置文件名,如果不指定默认为/etc/samba/smb.conf。

<FQDN > <IP 地址>:必须成对出现,用来测试配置文件内的“hosts allow”及“hosts

deny”是否正常操作。

在下面的例子中使用 testparm 命令测试 Samba 配置文件。

[root@smb ~]# testparm Load smb config files from /etc/samba/smb.conf Processing section "[printers]" Processing section "[usactu]" Loaded services file OK. Server role: ROLE_STANDALONE Press enter to see a dump of your service definitions #此处需要按回车键 [global] workgroup=MYGROUP server string=Samba Server Version %v passdb backend=tdbsam cups options=raw [printers] comment=All Printers path=/var/spool/samba printable=Yes browseable=No [ctu]

桑巴起舞——Samba 服务配置 第

439

16 comment=Counter Terrorist Unit path=/usactu

在使用 Windows 系统时,除了可以简单地将目录共享以外,还可以对共享目录进行很多

配置,Samba 也可以通过以下参数对所共享的目录进行配置。

16.2.2 用户认证

客户端在访问 Samba 服务时,首先 Samba 会根据全局配置中的“security”参数选择合

适的认证方式及认证用户来源进行认证。“security”可能的值包括“user”(RHEL 5.x 默认为

该项)、“share”、“domain”、“ads”,本书中主要介绍比较前两种,后面两种主要用于 Windows

的活动目录环境。

1.security=share

当“security=share”时,客户端可以使用匿名方式访问 Samba 服务,即不需要任何用户

及密码,这并不是一种推荐的方式。在这种方式下,客户只能访问被指定为允许匿名用户访

问的共享,即在共享中指定了“public=yes”。如以下两个共享中,匿名用户只能访问共享“ctu”。 [ctu] comment= Counter Terrorist Unit path=/ctu public=yes [dod] comment= Department of Defense path=/dod

2.security=user

当“security=user”时,客户端访问 Samba 服务时需要输入合法的用户及密码。虽然 Samba

服务运行在 Linux 平台,但是 Samba 服务认证用户来源并不能直接使用系统中的用户及密码

信息,需要通过 smbpasswd 命令为系统用户在 Samba 中设置独立的密码。通过 smbpasswd

命令设置密码只能在用户访问 Samba 服务器的共享资源时使用,与用户登录系统密码无关。

smbpasswd 命令基本语法如下。

smbpasswd [-a] [-d] [-e] [-n] [-r remote_machine] 用户名

常用指数:

常用选项:

-a:通过在这个选项后接用户名来实现将系统用户增加到 Samba 服务,并且同时提

供新的密码。如果 Samba 服务已经存在该用户时,命令就变成修改密码模式。所有

加入 Samba 服务的用户必须是在系统中存在的用户,否则加入操作将会失败。

-d:用这个选项后接用户名用于禁止存在与禁用这个账号。一旦账号被禁止,所有

使用这个用户访问 Samba 服务的尝试都将失败。只有 root 运行 smbpasswd 时才可以

使用这个选项。

-e:用这个选项后接用户名用于将被禁止的用户时用来重新启用。只有 root 运行

smbpasswd 时才可以使用这个选项。

Linux 从初学到精通

440

-n:用这个选项后接用户名用于把这个用户的密码设为空。如果希望用户以空密码登

录到 Samba 服务,管理员必须在/etc/samba/smb.conf 配置文件的“[global]”中设置“null

passwords=true”参数。只有 root 运行 smbpasswd 程序时才可以使用这个选项。

下面的例子是使用 smbpasswd 命令将系统中已经存在的用户 charles 增加到 Samba 服务

并配置独立的密码。

[root@smb ~]# smbpasswd -a charles New SMB password: #设置独立密码。 Retype new SMB password: #确认独立密码。 Added user charles.

使用 smbpasswd 命令只是专门为访问 Samba 服务设置了一个独立的密码,但用户名还是

使用系统中已经存在的用户,从安全的角度来说这样并不好,因为网络中访问 Samba 服务的

客户至少已经知道了一个 Linux 系统中的用户名。Samba 服务的设计者也考虑到了这一点,

为了解决这个问题可以通过 Samba 服务提供的用户映射功能。用户映射功能实际就是给系统

用户在 Samba 服务器中起一个别名,当访问 Samba 服务器时用户输入的实际上是一个别名,

这样就无法得知 Linux 系统中的用户名。配置 Samba 服务的用户映射功能具体步骤如下。

(1)通过/etc/samba/smbusers 文件设置用户映射关系。/etc/samba/smbusers 文件在安装

Samba 服务器端时已默认配置了 root、nobody 的用户映射关系,在该文件第一行的注释中已

标明该文件的语法。假设已有两个系统用户 charles 及 jack 通过 smbpasswd 添加到 Samba 服

务,希望将 charles 映射为 charleslogan 或 president,将 jack 映射为 jackbauer,则在 smbusers

文件中加入以下两行。

charles=charleslogan president jack=jackbauer

(2)修改 Samba 主配置文件。在“[global]”标签下加入如下参数。

username map=/etc/samba/smbusers

16.2.3 权限控制

在实际的生产情况中,使用 Samba 服务共享目的目录都需配置相应的权限以满足安全的

需要。Samba 服务与权限相关的参数主要包括以下几个。

1.用户读写权限 用户通过网络访问 Samba 服务器资源时,能否读写是通过文件或目录自身在文件系统中

的权限与该文件或目录在 Samba 服务配置的权限共同决定。如果希望某用户可以读或者写

Samba 服务的共享资源,首先要正确配置该用户对文件或目录自身文件系统中的权限。在下

面讲述有关用户读写权限的参数时,假定访问 Samba 中共享目录的用户在文件系统中都拥有

读、写权限。

(1)readonly:是否将共享资源设置为只读。当“readonly=yes”时表示只读共享,“readonly=

no”时表示不使用只读方式共享。

(2)read list:设置只读的用户或组(如果使用组时,需要在组名称前加@)。

桑巴起舞——Samba 服务配置 第

441

16[ctu] comment=Counter Terrorist Unit path=/ctu read list=charles jack #允许 charles及 jack用户访问该共享目录时只读。 read list=@ctu #允许 ctu组的所有用户访问该共享时只读。

(3)writable:是否允许共享资源设置为可写。当“writable=yes”时表示可写,“writable=no”

时表示不可写。

(4)write list:设置可写的用户或组(如果使用组时,需要在组名称前加@)。

[ctu] comment=Counter Terrorist Unit path=/ctu write list=charles jack #允许 charles及 jack用户访问该共享目录时可写。 write list=@ctu #允许 ctu组的所有用户访问该共享时可写。

(5)force user:指定通过 Samba 服务器访问共享资源建立的文件或目录时的所有者和拥

有组。下面的例子中任何有写权限的用户在通过 Samba 服务器访问共享资源时,建立的文件

或目录的拥有组均为 jack。

[ctu] comment=Counter Terrorist Unit path=/ctu writable=yes force user=jack

(6)force group:指定通过 Samba 服务器访问共享资源建立的文件或目录时的拥有组。

下面的例子中任何有写权限的用户在通过 Samba 服务器访问共享资源时,建立的文件或目录

的拥有组均为 ctu。

[ctu] comment=Counter Terrorist Unit path=/ctu writable=yes force group=ctu

当 readonly、read list、writable 及 write users 在对某一共享资源的设置发生冲突时,使用

以下规则。

(1)readonly、writeable 发生冲突时,在后面的参数优先。

(2)readonly、write list 发生冲突时,除 write list 指定用户可写外,其他用户只读。

(3)read list、writable 发生冲突时,除 read list 指定用户只读外,其他用户可写。

(4)read list、write list 发生冲突时,write list 优先。

(5)writeable=no 时,write list 的配置无效。

(6)同时配置了 writeable=yes 和 write list 时,writeable=yes 无效。

2.用户访问权限控制 (1)public:设置是否允许匿名用户访问共享资源,当“public=yes”时表示允许,“public=no”

时表示不允许,默认为“public=no”(在 Samba 服务中“guest ok”与“public”功能相同)。

当在一个共享目录中“guest ok”与“public”参数发生冲突时,在后面出现的参数优先。

Linux 从初学到精通

442

(2)valid users:设置允许访问共享目录的用户或组(如果使用组时,需要在组名称前加

@)。如果在共享目录中设置了该参数,那么未指定的所有用户将不能访问共享资源。

[ctu] comment= Counter Terrorist Unit path=/ctu valid users=jack #允许 jack用户访问该共享目录 valid users=@charles #允许 charles组的所有用户访问该共享目录

3.用户浏览权限 通过 browseable 参数可控制用户浏览权限,当“browseable=yes”时,将显示共享资源;

当“browseable=no”时,将隐藏共享资源,默认为“browseable=yes”。该参数的功能与 Windows

中创建共享文件夹时在共享名后加“$”创建隐藏共享类似。共享资源被隐藏后只是在浏览

Samba 服务时不可见,并不能禁止没有权限的用户访问。如下面的例子中“ctu”配置为隐藏

共享,在通过 Windows 客户端访问时“ctu”共享不可见,但是直接使用 UNC 路径还是可以

访问到。

[ctu] comment= Counter Terrorist Unit path=/ctu browseable=no

4.共享资源可用性 通过 available 参数定义共享资源是否可用,当“available=yes”时,客户端可以正常访

问;当“available=no”时,客户端无法访问,默认为“available=yes”。下面例子中共享“ctu”

客户端可以正常访问,但是共享“dod”客户端无法访问。 [ctu] comment= Counter Terrorist Unit path=/ctu available=yes [dod] comment= Department of Defense path=/dod available=no

5.文件及目录默认权限 “create mask”、“directory mask”分别用于设置客户端在访问 Samba 服务时建立文件及目

录默认的基于文件系统的权限。客户端通过网络访问 Samba 服务共享资源时建立的文件或目

录默认的基于文件系统的权限必须比通过本机访问时建立的文件或目录默认的基于文件系统

的权限要低。在下面的两个例子中,非 root 用户通过本机访问“/ctu”及“/dod”时建立的文

件默认的基于文件系统的权限是 664,那么在共享“ctu”中配置的“create mask”是有效的,

而在共享“dod”中配置的“directory mask”则无效。

[ctu] comment=Counter Terrorist Unit path=/ctu writable=yes create mask=444 [dod]

桑巴起舞——Samba 服务配置 第

443

16 comment=Department of Defense path=/dod writable=yes create mask=777

6.上传文件类型 Samba 服务可以通过“veto files”参数阻止客户端将含有特定关键字的文件或目录复制

到 Samba 服务共享资源。在参数值中可以使用“*”或“?”作为通配符,不过需要使用“/”

进行转义。当参数放在“[global]”标签时,是一个全局配置,对 Samba 服务所有共享目录有

效,如果该参数位于定义某共享目录的标识中时,只会对这一个共享目录有效。如果全局设

置与某一共享资源在该参数发生冲突时,共享资源内的该参数值优先。在下面的例子中,客

户端不允许在共享“ctu”中上传含有“root”关键字的文件或目录,在“dod”中则是不允许

上传含有“.exe”或“.bat”关键字的文件或目录。

[global] veto files=/*root*/ [ctu] comment= Counter Terrorist Unit path=/ctu writable=yes [dod] comment= Department of Defense path=/dod writable=yes veto files=/*.exe/*.bat*/

16.2.4 访问控制

Samba 服务可以通过 hosts allow(配置允许访问的客户端)、hosts deny(配置拒绝访问的

客户端)两个参数实现对客户端的访问控制。

在 Samba 服务中使用“hosts allow”、“hosts deny”参数时,该参数可以出现在全局配置

部分,用于允许或拒绝可连接到 Samba 服务器的客户端,也可以出现在具体的共享目录配置

中,用于允许或拒绝可访问该共享目录的客户端。如果在全局配置部分的“hosts allow”、“hosts

deny”与具体共享目录的配置发生冲突时会怎么样呢?客户端首先要可以连接到 Samba服务,

才能访问其共享目录,所以全局配置部分的“hosts allow”、“hosts deny”优先级与具体共享

目录的配置。发生冲突时使用以下规则。

(1)全局配置中“hosts deny”指定客户端无法访问 Samba 服务器任何共享资源。

(2)全局配置中“hosts allow”指定客户端,如果具体共享目录中只指定了“hosts deny”

且与全局配置不冲突时,客户端可以访问具体共享资源。

(3)如果具体共享目录中只指定了“hosts allow”且是全局配置的子集时,只有具体共

享目录中指定的客户端可以访问。如果具体共享目录中既指定了“hosts allow”又指定了“hosts

deny”时,首先根据下面有关“hosts allow”、“hosts deny”生效规则得出具体共享资源允许

或拒绝的客户端,再根据上面两条规则得出最终的结果。

如果全局配置或具体共享目录中的“hosts allow”、“hosts deny”发生冲突时会使用以下

规则。

Linux 从初学到精通

444

(1)如果“hosts allow”、“hosts deny”发生冲突时,hosts allow 优先。

(2)如果只有“hosts allow”,除了“hosts allow”中指定的客户端外其他所有客户端都

不能访问。

(3)如果只有“hosts deny”,除了“hosts deny”中指定的客户端外其他所有客户端都可

以访问。

在使用“hosts allow”、“hosts deny”参数时,可以使用以下几种方式表示客户端。

1.使用 IP 地址控制

通过使用 IP 地址精确允许或拒绝特定客户端访问 Samba 服务或具体共享目录。

[ctu] comment= Counter Terrorist Unit path=/ctu hosts deny=192.168.159.20 #不允许 192.168.159.20的客户端访问共享“ctu” [dod] comment= Department of Defense path=/dod hosts allow=192.168.159.25 #只允许 192.168.159.25的客户端访问共享“dod” [cia] comment=Central Intelligence Agency path=/cia #由于在 Samba服务中“hosts allow”比“hosts deny”优先级要高,所以 IP地址为 #192.168.159.99的客户端可以访问共享“cia” hosts allow=192.168.159.99 hosts deny=192.168.159.99

2.使用网段控制 通过使用子网允许或拒绝特定客户端访问 Samba 服务,在表示子网时可以使用

192.168.159.0/24、192.168.159.或 192.168.159.0/255.255.255.0 表示 192.168.159.0 子网掩码 24

位的子网。

[ctu] comment= Counter Terrorist Unit path=/ctu hosts deny=192.168.0. #不允许 192.168.159.0/24的所有客户端访问共享“ctu” [dod] comment= Department of Defense path=/dod hosts allow=192.168.159. #只允许 192.168.159.0/24的所有客户端访问共享“dod” [cia] comment=Central Intelligence Agency path=/cia #不允许 192.168.159.0/24但不包括 IP地址为 192.168.159.99的所有客户端访问共享“cia” hosts deny=192.168.159. hosts allow=192.168.159.99 [fbi] comment=Federal Bureau of Investigation path=/fbi #只允许 192.168.159.0/24但不包括 192.168.159.99的所有客户端访问共享 fbi hosts allow=192.168.159. EXCEPT 192.168.159.99 # EXCEPT参数表示不包括

桑巴起舞——Samba 服务配置 第

445

16

3.使用域名控制 通过使用域名允许或拒绝特定客户端访问 Samba 服务,在表示域名时可以使用 FQDN 表

示某个具体的客户端或用域名表示某个域的所有客户端。

[ctu] comment= Counter Terrorist Unit path=/ctu #不允许 FQDN为 client1.example.zqin的客户端访问共享“ctu” hosts deny=client1.example.zqin. [dod] comment= Department of Defense path=/dod #只允许 DNS后缀是 example.zqin的客户端访问共享“dod hosts allow =.example.zqin [cia] comment=Central Intelligence Agency path=/cia #不允许 DNS后缀是 example.zqin但不包括 IP地址为 192.168.159.99的客户端访问共享 #“cia” hosts deny=.example.zqin hosts allow=192.168.159.99

4.使用通配符控制

通过使用通配符代表特定客户端。可以使用的通配符主要有:“ALL”表示所有客户端;

“*”表示任何个字符;“?”表示一个字符;“LOCAL”表示本地计算机。

[ctu] comment= Counter Terrorist Unit path=/ctu #拒绝除了 IP地址为 192.168.159.99、192.168.159.100以外的客户端访问共享 #“ctu” hosts deny=ALL hosts allow=192.168.159.99 192.168.159.100 #多个匹配条件区用空格分隔

对于使用“hosts allow”、“hosts deny”的各种形式,看一个综合例子:只允许

192.168.159.0/24 、 192.168.158.0/24 及 192.168.157.0/24 连 接 到 Samba 服 务 , 只 允

许.example.zqin 域,但不包括 192.168.159.99 的客户端访问共享“ctu”,只允许 192.168.158.0/24

的客户端访问共享“dod”。

(1)在“[global]”标签下加入如下参数。

hosts allow=lo 192.168.159. 192.168.158. 192.168.157.

(2)在具体共享目录中加入如下参数。

[ctu] comment= Counter Terrorist Unit path=/ctu hosts allow=.example.zqin EXCEPT 192.168.159.99 [dod] comment= Department of Defense path=/dod hosts allow=192.168.158.

Linux 从初学到精通

446

16.2.5 其他配置

Samba 服务提供了非常丰富的功能,用于对本机资源的共享,除了前面的参数以外,下

列参数也是在使用 Samba 服务时经常会使用到的。

1.常用全局配置

在前面已经说明所有可以出现在“[global]”标签中的参数都是对 Samba 服务的全局配置,

这些参数会影响到 Samba 服务的运行状态、客户端访问的方式、客户端显示的信息等等,常

用的全局配置参数有以下几个。

(1)max connections,设置同时允许访问 Samba 服务或 Samba 服务某一共享目录的客户

端数量,该参数放在“[global]”标签中是一个全局配置,对 Samba 服务所有共享目录有效,

如果该参数位于定义某共享目录的标识内时,只对这一个共享目录有效。如果全局设置与某

一共享目录在该参数发生冲突时,共享目录内的该参数值优先。在下面的例子中,共享“ctu”

同时允许 10 个客户端连接,而共享“dod”则同时允许 20 个客户端连接。

[global] max connections=10 [ctu] comment= Counter Terrorist Unit path=/ctu [dod] comment= Department of Defense path=/dod max connections=20

(2)workgroup:设置 Samba 服务所在的工作组名称,默认设置工作组名称为

“MYGROUP”,该参数在“[global]”标签中定义。

workgroup=<工作组>

(3)server string:设置 Samba 服务器的说明文字,用于描述 Samba 服务器,该参数在

“[global]”标签中定义。

server string=<说明文字>

(4)netbios name:设置 Samba 服务器的 NetBIOS 名,该参数在“[global]”标签中定义。

netbios name=<NetBIOS名>

(5)interface:设置允许 Samba 服务侦听的本地网络接口,该参数在“[global]”标签中

定义。如果 Samba 服务有多个网络接口时可通过此参数指定只接收指定接口的 SMB/CIFS 请

求,该参数默认没有启用,即允许本机所有网络接口接收 SMB/CIFS 请求。在编辑该参数时

当使用 interface 时推荐保留 lo(表示本地回环地址)。在指定网络接口时,除了通过 IP 地址

指定外,也可直接通过网络接口名指定。在下面的例子中 eth0 就表示侦听该网络接口接收到

的请求,不考虑该网络接口的 IP 地址及请求客户端的 IP 地址是多少。

interface=eth0 lo

(6)fstype:自定义 Windows 客户端显示文件系统。如果 Windows 客户端将一个 Samba

桑巴起舞——Samba 服务配置 第

447

16

服务共享的目录映射一个网络驱动器,当查看其文件系统时显示为 NTFS,通过“fstype”参

数可以修改显示的内容,该参数在“[global]”标签中定义。在通过如下的修改后,Windows

客户端显示为“Linux Samba FileSystem”,如图 16-1 所示。

fstype=Linux Samba FileSystem

图 16-1 自定义文件系统

2.回收站配置 在 Windows 中用户删除文件,默认情况下文件会被放到回收站中以防止用户误删除文

件,但如果用户是通过网络访问 Windows 共享目录时,删除的文件是不会放到回收站中。

Samba 服务提供的回收站,可以解决这样的问题,当用户访问通过 Samba 服务配置的共享目

录时,可以将用户删除的文件放到回收站中防止误操作。为 Samba 服务配置回收站时,需要

针对每个共享资源进行配置。在下面的例子中将为 Samba 服务的共享“ctu”配置一个回收站。

[ctu] comment= Counter Terrorist Unit path=/ctu writable=yes #以下参数用于配置回收站。 vfs object=recycle recycle:repository=.deleted/%U recycle:keeptree=Yes recycle:versions=Yes recycle:maxsixe=0 recycle:exclude=*.tmp|*.mp3 recycle:noversions=*.doc

在 Samba 配置回收站功能中各参数作用如下。

(1)vfs object=recycle:载入 Samba 用于回收站功能的模块 recycle.so。

(2)recycle:repository=. recycle/%U:回收站的相对路径,这个选项指定删除的文件将被

储存在什么目录,即回收站的路径,该路径与共享资源的实际路径有关。在上面的例子中,

Linux 从初学到精通

448

共享“ctu”的实际路径是“/ctu”,因此任何被删除的内容都被移动到这个目录下的. recycle

目录下,%U 变量表示当前浏览共享用户的用户名,因此每个用户删除的文件都会存放在以

其用户名命名的目录下。如当用户“ charles”访问该共享删除的文件将被保存到

“/doc/.recycle/charles”目录中。此参数只能使用相对路径。所配置的目录其他用户必须有写

权限。当有文件需要放入此目录时,如果出现问题 Samba 服务器会将相关情况写入日志,并

继续对文件的删除操作。

(3)recycle:keeptree=Yes:在将文件移入回收站时,要建立相对应的目录结构。

(4)recycle:versions=Yes:如果在回收站所在目录中存在同名文件,则以“Copy #x of”

文件名的形式加以区分。

(5)recycle:maxsixe=0:回收站的最大使用空间,单位为字节。“0”表示没有最大使用

空间的限制。

(6)recycle:exclude=*.tmp|*.mp3:不放入回收站的文件类型。

(7)recycle:noversions=*.doc:如果在回收站所在目录中存在同名文件,覆盖原有文件的

文件类型。

3.共享资源管理员 “admin users”参数用于设置共享资源管理员,通过“admin users”参数指定的用户或组

连接到 Samba 服务共享目录操作时会忽略系统自身权限。当参数放在“[global]”标签时,是

一个全局配置,对 Samba 服务所有共享资源有效;如果该参数位于定义某共享目录的标识内

时,只对这一个共享资源有效。如果全局设置与某一共享资源在该参数发生冲突时,共享目

录内的该参数值优先。下面例子中当客户端使用 jack 用户连接到共享“ctu”时,即使 jack

对“/ctu”目录系统自身权限不允许写入,仍然可进行修改及删除操作;当客户端使用 dod

组的用户连接到共享“dod”时,即使 dod 组的用户对“/dod”目录系统自身权限不允许写入,

仍然可进行修改及删除操作。

[global] admin users=jack [ctu] comment= Counter Terrorist Unit path=/ctu writable=yes [dod] comment= Department of Defense path=/dod writable=yes admin users=@dod

客户端访问

Samba 服务配置完成后,客户端就可以访问其共享的资源。访问 Samba 服务配置的共享

桑巴起舞——Samba 服务配置 第

449

16

资源与访问 Windows 配置的共享资源采用相同的方法。在本章中将分别讲述通过 Windows

客户端及 Linux 客户端访问 Samba 服务共享资源的方法。

16.3.1 Linux 平台

通过 Linux 平台访问 Samba 服务方法有以下三种(以下三种方法同样适用于 Linux 平台

访问 Windows 平台的共享资源)。

1.使用 smbclient 命令 smbclient 可以用于浏览 Samba 服务上所有共享资源,也可用于直接访问 Samba 服务指

定共享资源。smbclient 基本语法如下。

smbclient [网络资源][-ELN][-B][-d<排错层级>][-i<范围>][-I ][-l<记录文件>][-n ][-O<连接选

项>][-p ][-R<名称解析顺序>][-s<目录>][-t<服务器字符集>][-T ][-U<用户名称>][-W<工作组>]

常用指数:

常用选项:

网络资源:格式为//服务器名称/共享资源名称。

-B:传送广播数据包时所用的 IP 地址。

-d<排错层级>:指定记录文件所记载事件的详细程度。

-E:将信息送到标准错误输出设备。

-i<范围>:设置 NetBIOS 名称范围。

-I:指定服务器的 IP 地址。

-l<记录文件>:指定记录文件的名称。

-L:显示服务器端所共享出来的所有资源。

-n:指定用户端所要使用的 NetBIOS 名称。

-N:不用询问密码。

-O<连接选项>:设置用户端 TCP 连接槽的选项。

-p:指定服务器端 TCP 连接端口编号。

-R<名称解析顺序>:设置 NetBIOS 名称解析的顺序。

-s<目录>:指定 smb.conf 所在的目录。

-t<服务器字符集>:设置用何种字符集来解析服务器端的文件名称。

-T:备份服务器端分享的全部文件,并打包成 tar 格式的文件。

-U<用户名称>:指定用户名称。

-W<工作组>:指定工作组名称。

smbclient 命令的参数比较,但在实际使用中一般有以下两种形式。

(1)浏览 Samba 服务所有共享资源使用如下命令。

[root@smb ~]# smbclient -L 192.168.159.12 -U charles

Password: #输入 charles在 Samba中的密码。

Domain=[SMB] OS=[UNIX] Server=[Samba 3.0.33-3.14.el5]

Linux 从初学到精通

450

Sharename Type Comment

--------- ---- -------

ctu Disk Counter Terrorist Unit

IPC$ IPC IPC Service (Samba Server Version 3.0.33-3.14.el5)

Domain=[SMB] OS=[UNIX] Server=[Samba 3.0.33-3.14.el5]

Server Comment

--------- -------

Workgroup Master

--------- -------

MYGROUP SMB

WORKGROUP TONYCOMPUTER

使用上述命令时会提示输入用户 charles 的密码,而使用下述命令可以一次指定访问的用

户及密码(用户 charles 在 Samba 中的密码为 111)。

[root@smb ~]# smbclient -L 192.168.159.12 -U charles%111

Domain=[SMB] OS=[UNIX] Server=[Samba 3.0.33-3.14.el5]

Sharename Type Comment

--------- ---- -------

ctu Disk Counter Terrorist Unit

IPC$ IPC IPC Service (Samba Server Version 3.0.33-3.14.el5)

Domain=[SMB] OS=[UNIX] Server=[Samba 3.0.33-3.14.el5]

Server Comment

--------- -------

Workgroup Master

--------- -------

MYGROUP SMB

WORKGROUP TONYCOMPUTER

(2)直接访问 Samba 服务指定共享资源。

[root@smb ~]# smbclient //192.168.159.12/ctu -U charles Password: #输入 charles在 Samba中的密码。 Domain=[SMB] OS=[UNIX] Server=[Samba 3.0.33-3.14.el5] smb: \>

使用 smbclient 直接进入共享资源后,对文件及目录的操作与 FTP 命令类似,在这里就

不一一讲述了。

2.使用 mount 命令 如果习惯使用 Linux 命令操作文件及目录,可使用如下命令将 Samba 服务的共享资源挂

载到系统中。

[root@smb ~]# mount //192.168.159.12/ctu /media/ -o username=charles Password: #输入 charles在 Samba中的密码。 [root@smb ~]# ll /media/ total 248 -rw-r--r-- 1 root root 81920 Jan 17 12:40 charles.docx -rw-r--r-- 1 root root 61440 Jan 17 12:40 nina.docx -rw-r--r-- 1 root root 20480 Jan 17 12:38 jack.docx -rw-r--r-- 1 root root 61440 Jan 17 12:39 chloe.docx

桑巴起舞——Samba 服务配置 第

451

16

如果希望永久使用 Samba 服务共享资源,可将挂载信息写入/etc/fstab 文件中。在/etc/fstab

中加入以下内容即可。

//192.168.159.12/ctu /media cifs defaults,username=charles%111 0 0

在 Linux 系统中/etc/fstab 文件默认的权限为 644,也就是说系统中所有用户都可以读取,

这样一个普通用户通过查看该文件就可以知道访问 Samba 服务共享资源的用户及密码。如果

不希望普通用户查看到 Samba 访问 Samba 服务共享资源的用户及密码,可改变加入/etc/fstab

的内容为。

//192.168.159.12/ctu /media cifs defaults,credentials=/etc/samba/pwd.conf 0 0

然后在/etc/samba/pwd.conf 文件中加入以下内容,并使用 chmod 命令将该文件的权限改

为 400 即可。

username=charles password=111

3.使用自动挂载方式

使用/etc/fstab 文件挂载 Samba 服务的共享资源时,Linux 每次启动都会自动地进行挂载,

但如果 Samba 服务所有主机没有开机或由于其他原因无法访问时,会影响 Linux 的启动速度,

通过自动挂载可以很好地解决这个问题,自动挂载 Samba 共享目录的具体操作步骤如下。

(1)在/etc/auto.master 文件中加入以下内容。

/mnt /etc/samba.misc --timeout=30 #timeout可根据实际网络情况设置。

(2)在/etc 下新建 samba.misc 文件,并加入以下内容。

samba -fstype=cifs,username=user1,password=111://192.168.159.12/ctu

(3)使用如下命令重新启动 autofs 服务。

service autofs restart

16.3.2 Windows 平台

通过 Windows 平台访问 Samba 服务共享目录时,可使用以下三种方法。

1.使用 UNC 路径方式 在 Windows“运行”对话框或资源管理器(或 IE 浏览器)地址栏输入 UNC 路径直接访

问 Samba 服务器共享资源,UNC 路径有以下四种方法。

(1)\\Samba 服务器名称。

(2)\\Samba 服务器名称共享目录名。

(3)\\Samba 服务器 IP。

(4)\\Samba 服务器 IP\共享目录名。

2.使用映射网络驱动器方式 对于需要经常访问的 Samba 服务共享目录,如果每次都使用 UNC 路径访问就比较麻烦,

这时可使用 Windows 中提供的映射网络驱动器功能,具体操作步骤如下。

Linux 从初学到精通

452

(1)右击“计算机”图标后,选择“映射网络驱动器”,如图 16-2 所示。

(2)打开映射网络驱动器操作界面后,输入共享资源的 UNC 路径,选择希望映射的盘

符后单击“完成”,如图 16-3 所示。

图 16-2 使用映射网络驱动器

图 16-3 输入共享资源 UNC路径

3.使用命令行方式 在命令行中输入以下命令可将共享目录“\\192.168.159.12\ctu”映射为 Z 盘。

net use z: \\192.168.0.12\ctu

实验任务

在如图 16-4 所示的网络拓扑中,通过 RHEL 5.x 自带的 Samba 软件实现目录共享,完成

以下实验任务。

图 16-4 Samba服务实验任务

桑巴起舞——Samba 服务配置 第

453

16

(1)创建 4 个目录:/share/csi、/share/fringe、/share/24、/share/house。

(2)将“/share/csi”目录共享,共享名为“csilv”,并满足如下要求。

只允许 192.168.159.0/24、192.168.158.0/24 网段的客户端访问。

所有员工可匿名访问,但是只允许读取文件,不允许修改文件。

(3)将“/share/fringe”目录共享,共享名为“fringe”,并满足如下要求。

只允许 192.168.157.0/24 网段的客户端访问。

所有员工必须输入正确的用户名及密码后,才可以读取文件。

“fringe”组的员工可以读取及修改该目录上的内容。

(4)将“/share/24/”目录共享,共享名为“24”,并满足如下要求。

“ctu”组的员工可以读取该目录中的文件。

只有用户“jack”有写入权限。

(5)将“/share/house”目录共享,共享名为“house”,并满足如下要求。

该目录必须是隐藏共享。

所有员工必须输入正确的用户名及密码后,才可以读取文件。

本章测试

(1)下列关于 Samba 服务说法错误的是( )。

A.Samba 可以将 Windows 加入类 UNIX 系统的网络中

B.Samba 可以将类 UNIX 加入 Windows 系统的网络中

C.Samba 可以实现目录的共享

D.Samba 可以实现打印机的共享

(2)Linux 通过 Samba 向 Windows 提供资源共享服务时,使用用户认证来保证合法访问,

而下面关于 Samba 用户的描述正确的是( )。

A.Samba 用户必须是 Windows 用户

B.Samba 用户必须和系统用户同名

C.可以使用 smbadduser 添加 Samba 用户

D.Samba 用户不需要是系统用户

(3)在 RHEL 5.x 中( )是 Samba 的主配置文件。

A./etc/smb.conf B./etc/samba/smb.conf

C./etc/samba.conf D./etc/samba/samba.conf

(4)Samba 服务器可以在 Linux 系统中提供 Windows 文件共享服务,在 RHEL 5.x 系统

中默认安装了 Samba 服务器和客户机所需的软件包,在与 Samba 服务器相关的软件包中,

Linux 从初学到精通

454

( )是 Red Hat 公司专门为 Samba 服务器提供的配置工具。

A.samba-common B.system-config-samba

C.samba D.samba-client

(5)在启动 Samba 服务后,为了确保 Samba 服务在下次 Linux 系统启动后能够自动启动,

则应该进行( )操作。

A.执行命令“/etc/rc.d/init.d/smb start”

B.执行命令“chkconfig - -level 2345 smb on”

C.执行命令“/etc/rc.d/init.d/smbd start”

D.执行命令“chkconfig –level 2345 smbd on”

(6)Samba 服务中需要独立维护用户账号,但是 Samba 的用户账号需要具有同名的系统

用户账号,在使用 adduser 命令添加某系统账号后,可以使用 smbpasswd 命令添加与系统账

号同名的 Samba 用户账号,添加 Samba 用户账号的 smbpasswd 命令需要使用( )命令

选项。

A.-d B.-e

C.-a D.-x

(7)Samba 服务的配置文件是 smb.conf,在该配置文件中可以进行共享目录的配置,如

果该文件中包括如下内容,关于共享“ctu”的配置描述正确的是( )。

[ctu] path=/ctu public=yes only guest=yes writable=yes

A.共享目录的名称是“ctu”

B.共享目录在 Linux 系统中的路径是“/ctu”

C.只允许名为“guest”的用户访问该共享目录

D.共享目录在 Samba 服务器中的属性是“可写”的

(8)Samba 服务的配置文件是 smb.conf,在该配置文件中可以进行共享目录的配置,如

果该文件中包括如下内容,用户 charles 对( )有写权限。

[ctu] comment= Counter Terrorist Unit path=/ctu public=yes writable=yes readonly=yes [dod] comment= Department of Defense path=/dod readonly=yes writable=yes

A.共享“ctu” B.都有

C.共享“dod” D.都没有

桑巴起舞——Samba 服务配置 第

455

16

(9)testparm 命令是 Samba 服务器维护命令,可以对 Samba 服务器实现多种维护功能,

其中包括( )。

A.测试 smb.conf 配置文件语法的正确性

B.测试 smb 启动脚本中使用的参数

C.自动生成指定名称共享目录的配置内容

D.显示 smb.conf 配置文件中的有效配置清单

(10)下列命令中( )不可以访问通过 Samba 已共享的目录。

A.smbclient B.showsamba

C.mount D.showmount

Web 服务器是指驻留于网络中某种类型计算机的程序,当

Web 浏览器(客户端)连到服务器上并请求文件时,服务器将处

理该请求并将文件发送到该浏览器上,附带的信息会告诉浏览器

如何查看该文件(即文件类型)。服务器使用 HTTP(超文本传输

协议)进行信息交流。Web 服务器不仅能够存储信息,还能在用

户通过 Web 浏览器提供信息的基础上运行脚本和程序。Web 服务

器可以解析 HTTP 协议。当 Web 服务器接收到一个 HTTP 请求,

返回一个 HTTP 响应,如送回 HTML 页面。为了处理一个请求,

Web 服务器可以响应一个静态页面或图片、进行页面跳转或者把

动态响应的产生委托给一些其他的程序,如 CGI 脚本、PHP 脚本、

JSP 脚本、ASP 脚本、ASP.NET 脚本或一些其他的服务器端技术。

无论脚本的目的如何,这些服务器端的程序通常产生一个 HTML

的响应来让浏览器可以浏览。

第17章

最流行的W

eb

服务器︱︱A

pache

服务配置

最流行的Web 服务器——Apache 服务配置 第

457

17

Apache HTTP Server(以下简称 Apache)是 Apache 软件基金会(Apache 软件基金会官

方网站:http://www.apache.org/)的一个开源的 Web 服务器,可以在大多数操作系统中运行,

由于其多平台和安全性被广泛使用,是目前 流行的 Web 服务器端软件之一。Apache 起初

由伊利诺伊大学香槟分校的国家超级电脑应用中心(NCSA)开发。此后 Apache 被开放源代

码团体的成员不断地发展和加强。1996 年 4 月以来 Apache 一直是 Internet 上 流行的 Web

服务器,不过随着拥有大量域名数量的主机域名商转换为微软 IIS 平台,再加上 Google 推出

自己的 Web 服务器平台 GWS 及 Lighttpd、Nginx 等一些轻量级 Web 服务器的推出,Apache

市场占有率近年来呈现出一些下滑的趋势,尽管如此,Apache 仍然是现阶段 Internet 市场上,

市场占有率 高的 Web 服务器软件。

Apache 服务安装

几乎在所有的 Linux 发行版中都包括了 Apache 服务的软件包,Apache 在安装上有一些

依赖软件包,使用如下命令安装 Apache 服务软件包。在使用不同版本 RHEL 时,Apache

服务的版本可能会有小的区别,但并不影响其后的配置;“/mnt”目录是 RHEL 5.x 光盘的

挂载点。

rpm -ivh /mnt/Server/apr-1.2.7-11.el5_3.1.i386.rpm rpm -ivh /mnt/Server/postgresql-libs-8.1.11-1.el5_1.1.i386.rpm rpm -ivh /mnt/Server/apr-util-1.2.7-7.el5_3.2.i386.rpm rpm -ivh /mnt/Server/httpd-2.2.3-31.el5.i386.rpm

和其他 Linux 下的 System V 服务一样安装完成后,可以使用“service”命令启动、停止、

重新启动服务;使用“chkconfig”命令调整在指定运行级别是否自动加载。

service httpd start #启动服务。 service httpd stop #停止服务。 service httpd restart #重新启动服务。 service httpd reload #在不重新启动的情况下,重新载入配置文件。 service httpd status #查看服务当前运行状态。 chkconfig httpd on #在运行级别 2、3、4、5上设置为下次开机时自动运行。 chkconfig httpd off #在运行级别 2、3、4、5上设置为下次开机时不自动运行。

如果不需要再使用 Apache 服务,可通过以下命令现在卸载 Apache 服务。

rpm -e httpd

Apache 服务配置

在通过 rpm 包将 Apache 安装完成后,其主配置文件为/etc/httpd/conf/httpd.conf 文件。在

Linux 从初学到精通

458

修改该文件时应注意以下几点。

(1)以“#”开始的是注释行(在执行时将被忽略)。

(2)关键字对大小写不敏感。

(3)大多数参数都使用“参数 值”的方式配置。

(4)大多数参数在有多个值时,使用空格分隔。

在 Apache 的配置文件分为以下三个部分。

[root@web ~]# grep "Section" /etc/httpd/conf/httpd.conf ### Section 1: Global Environment ### Section 2: 'Main' server configuration ### Section 3: Virtual Hosts

(1)Global Environment:全局配置。该部分参数主要对 Apache 运行环境及状态进行设置。

(2)Main server configuration:主服务配置。该部分实际也是对 Apache 运行网站的参数

设置,如果在使用了虚拟主机的情况下,也会成为虚拟主机配置中未定义参数的默认值。

(3)Virtual Hosts:虚拟主机配置,如果主服务配置中的参数位于某个虚拟主机的配置中,

那么这些参数只对该虚拟主机生效。

在使用 Apache 配置网站前,一般需要根据实际情况调整其运行情况以满足实际应用的

需要。对 Apache 常见的调整包括以下几个参数。

(1)StartServers:指定启动 Apache 时启动的 httpd 进程个数。

StartServers <进程数>

(2)ServerLimit:指定 Apache 允许配置同时处理的客户端请求的 大值。

ServerLimit < 大值>

(3)MaxClients:指定 Apache 可以同时处理的客户端请求,这是对 Apache 性能影响

大的参数。如果请求总数已达到这个值,那么下面的请求就要排队,直到某个已处理请求完

毕。可以根据硬件配置和负载情况来动态调整这个值。256 也是 Apache 默认情况 大的值,

如果希望配置为大于 256 时,需要首先将 ServerLimit 参数的值配置为大于 MaxClients 的值。

MaxClients <请求数>

(4)MinSpareThreads:指定 Apache 保持的 小空闲线程数。

MinSpareThreads <线程数>

(5)MaxSpareThreads:指定 Apache 保持的 大空闲线程数。如果空闲进程数大于这个

值,Apache 会自动 kill 某些多余进程。这个值一般不要设得过大,但如果设得比

MinSpareServers 小,Apache 会自动把它调整为 MinSpareServers+1。

MaxSpareThreads <线程数>

(6)MaxRequestsPerChild:指定 Apache 每个子进程被请求服务多少次后被终止,0 表示

不限制。

MaxRequestsPerChild <请求数>

最流行的Web 服务器——Apache 服务配置 第

459

17

(7)KeepAlive:指定 Apache 是否支持持久连接。KeepAlive 参数决定当处理完客户发

起的 HTTP 请求后是否立即关闭 TCP 连接,如果 KeepAlive 设置为 On,那么用户完成一次

访问后,不会立即断开连接,当后续有请求时,会继续在这一次 TCP 连接中完成,而不用重

复建立新的 TCP 连接和关闭 TCP 连接,可以提高用户访问速度。如果使用了代理服务器推

荐配置为 on。

KeepAlive <YES|NO>

(8)MaxKeepAliveRequests:指定 Apache 在持久连接期间,所允许的 大请求数量。指

定为 0 时表示不作限制。

MaxKeepAliveRequests <请求数>

(9)KeepAliveTimeout:指定 Apache 在同一个客户端连接中,下一个请求的等待时间。

KeepAliveTimeout <时间>

(10)Listen:侦听 IP 及端口配置,Apache 在默认情况下,会侦听本机所有 IP 地址的 80

端口。可通过修改 Listen 参数改变侦听的 IP 或端口。Listen 参数语法如下。

Listen [IP地址]:端口

在配置 Listen 参数时至少需要端口,如果不指定 IP 地址,默认为本机所有 IP 地址。可

以指定多个 Listen 参数指定侦听本机的某几个 IP 地址的端口。在下面的例子中尽管本机有两

个 IP 地址指定,但将“Listen”参数修改为“Listen 192.168.0.17:80”后,Apache 只会处理

192.168.0.17 的 80 端口收到的客户端请求。

[root@web ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:3D:38:B8 inet addr:192.168.159.17 Bcast:192.168.159.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe3d:38b8/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1813 errors:0 dropped:0 overruns:0 frame:0 TX packets:1726 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:174898 (170.7 KiB) TX bytes:360392 (351.9 KiB) Interrupt:59 Base address:0x2024 eth0:0 Link encap:Ethernet HWaddr 00:0C:29:3D:38:B8 inet addr:192.168.159.18 Bcast:192.168.159.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:59 Base address:0x2024 [root@web ~]# netstat -tunlp | grep httpd tcp 0 0 192.168.159.17:80 0.0.0.0:* LISTEN 15356/httpd

17.2.1 基本 Web 服务

Apache 服务通过“DocumentRoot”参数指定网站文件所在目录,在 RHEL 5.x 中通过默

认的 rpm 包安装 Apache 后,如下所示该参数指向“/var/www/html”,也就是说只需将网站内

容复制到该目录即可。

[root@web ~]# grep "DocumentRoot" /etc/httpd/conf/httpd.conf | grep -v ^# DocumentRoot "/var/www/html"

Linux 从初学到精通

460

如果因为一些原因不能将网站内容存放在“/var/www/html”下,可以修改“DocumentRoot”

参数,指定网站内容所在的目录。

一般在访问网站时,只需要输入网站的 FQDN 或 IP 地址,并没有输入需要浏览的页面,

Apache 会显示“DirectoryIndex”参数所指定的页面,如果该参数指定了多个页面,Apache

会从第一个名称找起。在 RHEL 5.x 中通过默认的 rpm 包安装 Apache 后,如下所示该参数的

值为“index.html index.html.var”,也就是说网站默认首页的文件名必须是这两个中任何一个。

如果网站的首页不是这个名字,可以修改该参数,如“default.html default.php”。

[root@web ~]# grep "DirectoryIndex" /etc/httpd/conf/httpd.conf | grep -v ^# DirectoryIndex index.html index.html.var

在上述两个参数配置完成后,一个基本的 Web 服务器就可以完成了,但是推荐

“ServerName”参数,该参数可以帮助 Apache 识别 IP 地址及端口,如果不配置该参数在启动

Apache 时会收到一个警告提示。在“ServerName”参数时,只需要指定访问网站的 FQDN

及端口,如果没有使用 DNS 也可以直接指定 IP 地址及端口。

ServerName www.example.zqin:80

17.2.2 虚拟主机

虚拟主机是服务器采用的节省服务器硬件成本的技术,虚拟主机技术主要应用于 HTTP、

FTP、邮件等多种服务,将一台服务器的某项或者全部服务内容逻辑划分为多个服务单位,

对外表现为多个服务器,从而充分利用服务器硬件资源。如果划分是系统级别的,则称为虚

拟服务器。

由于多台虚拟服务器共享一台真实服务器的资源,每个用户承受的硬件费用、网络维护

费用、通信线路的费用均大幅度降低。现在,几乎所有的公司(包括一些个人)均在网络上

设立了自己的 Web 服务器,其中有相当部分采用的是虚拟主机。

1.基于 IP 地址的虚拟主机 如果希望使用 192.168.159.10 可以访问到/var/site/walter.example.zqin 目录的内容、使用

192.168.159.11 可 以 访 问 到 /var/site/william.example.zqin 目 录 的 内 容 , 需 要 在

/etc/httpd/conf/httpd.conf 文件中加入如下内容。

NameVirtualHost *:80 <VirtualHost 192.168.159.10:80> #指定在 192.168.159.10的 80端口建立虚拟主机 ServerAdmin [email protected] #指定该虚拟主机管理员邮箱(该参数不是必需的) #指定使用 192.168.159.10的 IP地址访问时网站内容的存放目录 DocumentRoot /var/site/walter.example.zqin #帮助 Apache识别该虚拟主机的 IP地址及端口号为 192.168.159.10:80 ServerName 192.168.159.10:80 #指定使用 192.168.159.10的 IP地址访问时网站错误日志的存放目录(该参数不是必需的) Errorlog logs/walter.err.log #指定使用 192.168.159.10的 IP地址访问时网站访问日志的存放目录(该参数不是必需的) CustomLog logs/walter.access.log common </VirtualHost> <VirtualHost 192.168.159.11:80> ServerAdmin [email protected]

最流行的Web 服务器——Apache 服务配置 第

461

17 DocumentRoot /var/site/william.example.zqin ServerName 192.168.159.11:80 Errorlog logs/william.err.log CustomLog logs/william.access.log common </VirtualHost>

有关虚拟主机的配置内容推荐放在“/etc/httpd/conf/httpd.conf”文件的最后。

2.基于端口的虚拟主机 如果希望使用 192.168.159.10的 80端口可以访问到/var/site/bbs.example.com目录的内容,

使用 192.168.0.10 的 8080 端口可以访问到/var/site/blog.example.com 目录的内容。

#让 Apache侦听 8080端口(侦听 80端口的参数默认就有,不需要再次配置) Listen 8080 NameVirtualHost 192.168.159.10:* <VirtualHost 192.168.159.10:80> #指定在 192.168.0.10的 80端口建立虚拟主机 ServerAdmin [email protected] #指定该虚拟主机管理员邮箱(该参数不是必需的) #指定使用 192.168.159.10:80时网站内容的存放目录 DocumentRoot /var/site/walter.example.zqin #帮助 Apache识别该虚拟主机的 IP地址及端口号为 192.168.159.10:80 ServerName 192.168.159.10:80 #指定使用 192.168.159.10的 80端口访问时网站错误日志的存放目录(该参数不是必需的) Errorlog logs/walter.err.log #指定使用 192.168.159.10的 80端口访问时网站访问日志的存放目录(该参数不是必需的) CustomLog logs/walter.access.log common </VirtualHost> <VirtualHost 192.168.159.10:8080> ServerAdmin [email protected] DocumentRoot /var/site/william.example.zqin ServerName 192.168.159.10:8080 Errorlog logs/william.err.log CustomLog logs/william.access.log common </VirtualHost>

3.基于主机头的虚拟主机 如果希望使用 walter.example.zqin 可以访问到/var/site/walter.example.zqin 目录的内容,而

使用 william.demo.zqin 可以访问到/var/site/william.demo.zqin 目录的内容(使用主机头,只有

在客户端可以通过 DNS 解析到网站对应的主机头值时才有效)。

NameVirtualHost 192.168.159.10:80 #指定虚拟主机位于 192.168.159.10的 80端口 <VirtualHost 192.168.159.10:80> #指定在 192.168.159.10的 80端口建立虚拟主机 ServerAdmin [email protected] #指定该虚拟主机管理员邮箱(该参数不是必需的) #指定使用 walter.example.zqin访问时网站内容的存放目录 DocumentRoot /var/site/walter.example.zqin ServerName walter.example.zqin #帮助 Apache识别该虚拟主机的 FQDN #指定使用 walter.example.zqin访问时网站错误日志的存放目录(该参数不是必需的) Errorlog logs/walter.err.log #指定使用 walter.example.zqin访问时网站访问日志的存放目录(该参数不是必需的) CustomLog logs/walter.access.log common </VirtualHost> <VirtualHost 192.168.159.10:80> ServerAdmin [email protected]

提 示

Linux 从初学到精通

462

DocumentRoot /var/site/william.demo.zqin ServerName william.demo.zqin Errorlog logs/william.err.log CustomLog logs/william.access.log common </VirtualHost>

基于 IP 地址的虚拟主机和基于端口的虚拟主机一般在企业内部网络中使用得比较多一

些,因为一般使用虚拟主机就是大多因为没有足够的 IP 地址,所以基于 IP 地址的虚拟主机

一般在 Internet 中并不实用;而基于端口虚拟主机对于访问者不友好(访问的时候除了输入

访问网站的 FQDN 或 IP 地址以外,还需要输入“:端口”),所以如果在 Internet 上一般都是

使用基于主机头的虚拟主机,只需要注册足够的域名即可。

17.2.3 身份验证

一般在输入网站的 FQDN 或 IP 地址后,即可在浏览器中显示网站内容,但对于企业内

部的网站或由于其他一些原因,希望只在授权的用户才可以访问网站,这时就需要 Apache

对访问者进行身份验证。Apache 可以实现基本身份验证(使用明文方式传输密码)和摘要式

身份验证(使用 Hash 算法传送密码)等多种身份验证方式。由于基本身份验证有良好的支

持、配置也比较容易,所以本章主要介绍基本身份验证。

Apache 为了避免出现安全问题,默认不使用系统中已有的用户对网站的访问者进行身份

验证。在使用 rpm 包安装了 Apache 后,提供了一个名为 htpasswd 的工具,该工具可以生成一

个独立的用户及密码文件,专门用于对网站的访问者进行身份验证,更好的是可以使用

htpasswd 生成多个用户及密码文件,为多个网站配置不同的身份验证。htpasswd 基本语法如下。

htpasswd [-c] [-m] [-D] 文件名 用户名 htpasswd -b [-c] [-m|-d|-p|-s] [-D] 文件名 用户名 密码 htpasswd -n [-m|-d|-s|-p] 用户名 htpasswd -nb [-m|-d|-s|-p] 用户名 密码

常用指数:

常用选项:

-b:直接从命令行获取密码而不进行提示。

-c:创建保存用户及密码文件。如果已经存在,那么将被清空并改写。该选项不能

和-n 同时使用。

-n:在标准输出上显示结果而不是更新文件。用于生成可以为 Apache 非文本输出存

储格式所接收的密码记录。这个选项改变了命令行语法,因为文件名参数(通常是

第一个)被忽略了。该选项不能和-c 同时使用。

-m:使用 MD5 加密密码。

-d:使用 crypt()对密码进行加密。

-s:使用 SHA 对密码进行加密。这种方法易于通过 LDAP 目录交换格式和 Netscape

server 进行交换。

-p:使用明文密码(不加密)。

最流行的Web 服务器——Apache 服务配置 第

463

17

-D:如果用户存在,则删除该用户。

文件名:包含用户名和密码的文本文件的名称。如果使用了-c 选项,若文件已存在

则更新,若不存在则创建。

用户名:在文件名中添加或更新记录。若用户名不存在则添加一条记录,若存在则

更新其密码。

密码:将被加密并存储到文件中的明文密码。必须和-b 同时使用。

下面的例子将通过 htpasswd 在/etc/httpd 目录生成一个名为“.wus”的用户及密码文件,

并增加名为 charles、jack 的两个用户。

创建一个用户及密码文件,用户密码使用 MD5 加密。

[root@web ~]# htpasswd -cm /etc/httpd/.wus charles New password: #输入密码 Re-type new password: #确认密码 Adding password for user charles

向已有的用户及密码文件中增加用户时,就不需使用“-c”参数。

[root@web ~]# htpasswd -m /etc/httpd/.wus jack New password: #输入密码 Re-type new password: #确认密码 Adding password for user jack [root@web ~]# cat /etc/httpd/.wus charles:$apr1$a5Zuc...$LWurh1pm/N/kPNEk1JQ2j/ jack:$apr1$i3ZFx/..$MBsy8i2bzutY.i1HqIq8C1

使用 htpasswd 生成了用户及密码文件后,就需要修改 Apache 配置文件,指定需要进行

身份验证的网站。

NameVirtualHost *:80 <VirtualHost 192.168.159.10:80> ServerAdmin [email protected] DocumentRoot /var/site/walter.example.zqin ServerName 192.168.159.10:80 #指定对“/var/site/walter.example.zqin”目录的访问进行身份验证 <Directory /var/site/walter.example.zqin> #指定了使用认证的域(Realm),该认证域会出现在显示给用户的密码提问对话框中 AuthName TestAuth AuthType Basic #指定使用基本身份验证 AuthUserFile /etc/httpd/.wus #指定保存用户名及密码的文件 #指定只要输入的是“/etc/httpd/.wus”文件中存在的用户而密码正确就可以访问该目录 Require valid-user </Directory> Errorlog logs/walter.err.log CustomLog logs/walter.access.log common </VirtualHost>

在指定需要进行身份验证的目录时,除了可以使用上述方法指定网站的根目录以外,

Apache 还 支 持 对 网 站 中 的 某 一 个 特 定 的 目 录 进 行 身 份 验 证 , 如 在

“/var/site/walter.example.zqin”目录有一个名为“house”的子目录,只需要对访问这个目录的

Linux 从初学到精通

464

用户进行身份验证时,可以将“Directory”参数改变为如下内容。

<Directory /var/site/walter.example.zqin/house>

如果并不是指定用户及密码文件中的所有用户都可以通过身份验证可以修改“Require”

参数,如只在该文件中的 charles 和 jack 可以通过身份验证,其他用户不行,可以将“Require”

参数修改为如下内容。

Require charles jack

17.2.4 访问控制

和其他 Web 服务一样,Apache 中默认情况下,允许所有客户端对已配置好的网站进行

访问。但是有时需要控制这种访问,也就是说只允许来自特定客户端的访问。在 Apache 中

可以通过 Order、Allow From、Deny From 三个参数允许或阻止指定客户端对网站中子目录或

文件的访问。Order 参数决定是默认动作及允许或阻止的优先级。

(1)Order Allow,Deny,默认拒绝所有访问。当 Allow From 字段与 Deny From 冲突时,

Deny From 优先。

(2)Order Deny,Allow,默认允许所有访问。当 Allow From 字段与 Deny From 冲突时,

Allow From 优先。

Order、Allow From、Deny From 三个参数组合使用可以实现灵活的客户端访问控制,下

面来看一个例子。

NameVirtualHost 192.168.159.10:80 <VirtualHost 192.168.159.10:80> DocumentRoot /var/site/walter.example.zqin ServerName walter.example.zqin #对/var/site/walter.example.zqin目录进行配置 <Directory /var/site/walter.example.zqin> #定义对客户端进行访问控制时,默认动作阻止客户端访问 Order Allow,Deny Allow From all #允许所有客户端的访问 #阻止 192.168.159.0/24的客户端访问(由于在“Order Allow,Deny”中的定义“Deny From” #的优先级更高,所以虽然该定义与“Allow From”与“Deny From”发生了冲突,“Deny From” #优先级更高,也就是说 192.168.159.0/24的客户端不能访问网站 Deny From 192.168.159.0/24 #阻止 example.zqin作为 DNS后缀的客户端访问,与上一个“Deny From”一样的原因,#“.example.zqin”

区域的客户端不能访问网站 Deny From .example.zqin </Directory> </VirtualHost> <VirtualHost 192.168.159.10:80> DocumentRoot /var/site/william.example.zqin ServerName william.example.zqin #对/var/site/william.example.zqin目录进行配置 <Directory /var/site/william.example.com> #定义对客户端进行访问控制时,默认动作为允许客户端访问 Order Deny,Allow Deny From all #阻止所有客户端的访问 #允许 192.168.159.0/24的客户端访问(由于在“Order Deny,Allow”中的定义“Allow From”#的优先

最流行的Web 服务器——Apache 服务配置 第

465

17级更高,所以虽然该定义与“Allow From”与“Deny From”发生了冲突,“Allow From”

#优先级更高,也就是说 192.168.159.0/24的客户端可以访问网站 Allow From 192.168.159.0/24 #允许 example.zqin作为 DNS后缀的客户端访问,与上一个“Allow From”一样的原因,#“.example.zqin”

区域的客户端可以访问网站 Allow From .example.zqin </Directory> </VirtualHost>

在使用 Allow From、Deny From 两个参数定义允许及阻止的客户端时,可以使用多种方

式表示客户端,具体方法见表 17-1。

表 17-1 客户端定义

客户端指定方法 示例 满足示例的客户端

IP 指定单一主机 192.168.159.200 客户端 IP 地址为 192.168.159.200

指定网段 192.168.159.0/255.255.255.0

指定网段 192.168.159.0/24

客户端所在网段为 192.168.159.0/24

域名单一主机 c1.example.zqin 客户端 FQDN 为 c1.example.zqin

域名指定范围 .example.zqin 客户端 FQDN 的 DNS 后缀为 example.zqin

所有客户端 all

在指定需要进行访问控制的目录时,除了可以使用上述方法指定网站的根目录以外,

Apache 还 支 持 对 网 站 中 的 某 一 个 特 定 的 目 录 进 行 身 份 验 证 , 如 在

“/var/site/walter.example.zqin”目录有一个名为“house”的子目录,只需要对访问这个目录的

用户进行访问控制时,可以将“Directory”参数改变为如下内容。

<Directory /var/site/walter.example.zqin/house>

17.2.5 HTTPS 配置

HTTPS 是 Hypertext Transfer Protocol over Secure Socket Layer(基于 SSL 的 HTTP 协议)

的缩写,HTTPS 使用了 HTTP 协议,但 HTTPS 使用不同于 HTTP 的默认端口及一个加密、

身份验证层(HTTP 与 TCP 之间)。这个协议的 初研发由网景公司进行,提供了身份验证

与加密通信方法,现在它被广泛用于互联网上安全敏感的通信。在访问 HTTPS 网站时,客

户端输入的 URL 路径中的“http”必须改为“https”。Apache 实现 HTTPS 需要使用 mod_ssl

模块,首先需使用如下命令安装该模块。在使用不同版本 RHEL 时,mod_ssl 的版本可能会

有小的区别,但并不影响其后的配置;“/mnt”目录是 RHEL 5.x 光盘的挂载点。

[root@web ~]# rpm -ivh /mnt/Server/distcache-1.4.5-14.1.i386.rpm [root@web ~]# rpm -ivh /mnt/Server/mod_ssl-2.2.3-31.el5.i386.rpm

配置 HTTPS 时,需要为网站生成证书。生成证书的方法有几种,本章中采用自颁发证

书,首先需要使用如下方法生成证书、私钥文件。

建立一个用于存放证书的目录。

[root@web ~]# mkdir /etc/httpd/.ssl

Linux 从初学到精通

466

建立网站私钥文件。

[root@web ~]# cd /etc/httpd/.ssl

生成网站私钥文件。

[root@web .ssl]# openssl genrsa -out server.key 1024 Generating RSA private key, 1024 bit long modulus ..........................++++++ e is 65537 (0x10001)

建立网站证书。

[root@ web.ssl]# openssl req -new -x509 -key server.key -out server.crt You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- #输入证书信息的“国家”信息 Country Name (2 letter code) [GB]:CN #输入证书信息的“省”信息,可根据需要输入 State or Province Name (full name) [Berkshire]:HuBei #输入证书信息的“市”信息,可根据需要输入 Locality Name (eg, city) [Newbury]:WuHan #输入证书信息的“组织”信息,可根据需要输入 Organization Name (eg, company) [My Company Ltd]:http://onlyzq.cublog.cn #输入证书信息的“部门”信息,可根据需要输入 Organizational Unit Name (eg, section) []:SI #输入证书信息的“公共名称”信息,推荐输入网站的 FQDN Common Name (eg, your name or your server's hostname) []:walter.example.zqin #输入证书信息的“邮箱”信息,可根据需要输入 Email Address []:[email protected] #为了保证证书文件安全,可修改证书存放目录的权限 [root@ web.ssl]# chmod -R 400 /etc/httpd/.ssl

通过命令生成了证书、私钥文件后,需要修改 Apache 配置文件中网站的配置,使其支

持 HTTPS。

NameVirtualHost 192.168.0.10:80 <VirtualHost 192.168.0.10:443> #将网站侦听端口改为 443 DocumentRoot /var/site/walter.example.zqin ServerName walter.example.zqin SSLEngine on #开启 SSL SSLCertificateFile /etc/httpd/.ssl/server.crt #指定证书文件 SSLCertificateKeyFile /etc/httpd/.ssl/server.key #指定私钥文件 </VirtualHost>

17.2.6 LAMP 配置

视频地址:光盘/Video/第 17 章/ 17.5 Apache&MySQL&PHP(Make).mp4

Linux+Apache+Mysql+Perl/PHP/Python 一组常用来搭建动态网站或者服务器的开源软

最流行的Web 服务器——Apache 服务配置 第

467

17

件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越高的兼容度,共

同组成了一个强大的 Web 应用程序平台。

随着开源潮流的蓬勃发展,开放源代码的 LAMP 已经与 J2EE 和.Net 商业软件形成三足鼎立

之势,并且该软件开发的项目在软件方面的投资成本较低,因此受到整个 IT 界的关注。从网站

的流量上来说,70%以上的访问流量是 LAMP 来提供的,LAMP 是 强大的网站解决方案。

LAMP 是基于 Linux、Apache、MySQL 和 PHP 的开放资源网络开发平台,PHP 是一种有时

候用 Perl 或 Python 可代替的编程语言。这个术语来自欧洲,在那里这些程序常用来作为一种标

准开发环境。名字来源于每个程序的第一个字母。每个程序在所有权里都符合开放源代码标准:

Linux 是开放系统;Apache 是 通用的网络服务器;MySQL 是带有基于网络管理附加工具的关

系数据库;PHP 是流行的对象脚本语言,它包含了多数其他语言的优秀特征来使得它的网络开

发更加有效。开发者在 Windows 操作系统下使用这些 Linux 环境里的工具称为使用 WAMP。

在 RHEL 5.x 中已经包含了搭建 LAMP 环境所需的所有 rpm 包,如果没有特殊的需求可

以直接使用这些 rpm 搭建 LAMP 环境,具体步骤如下。

(1)将 RHEL 5.x 光盘配置为 YUM 源。

[root@web ~]# mkdir /mnt/cdrom [root@web ~]# mount /dev/cdrom /mnt/cdrom [root@web ~]# cp /etc/yum.repos.d/rhel-debuginfo.repo /etc/yum.repos.d/cdrom.repo [root@web ~]# cat /etc/yum.repos.d/cdrom.repo [cdrom] #修改/etc/yum.repos.d/cdrom.repo文件为如下内容。 name=cdrom baseurl=file:///mnt/cdrom/Server enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

(2)使用 YUM 方式安装如下软件包。

[root@web ~]# yum -y install mysql-devel mysql-server [root@web ~]# yum -y install httpd-devel [root@web ~]# yum -y install php-devel php-mysql

(3)启动 mysqld、httpd 服务,并设置为下次启动自动加载。

[root@web ~]# service httpd restart [root@web ~]# chkconfig httpd on [root@web ~]# service mysqld restart [root@web ~]# chkconfig mysqld on

在第一次启动 MySQL 时,会有一个 MySQL 初始化的过程(如图 17-1 所示),在初始

化完成后,下次启动 MySQL 时将不再出现初始化的内容。

提 示

Linux 从初学到精通

468

图 17-1 MySQL初始化

(4)使用 mysqladmin 命令创建 MySQL 管理员及密码。

[root@web ~]# mysqladmin -u root password redhat #创建的用户名为 root,密码 redhat。

(5)建立一个测试页面检查 LAMP 环境是否搭建成功。如果配置没有问题通过浏览器访

问时应该出现如图 17-2 所示的页面。

[root@web ~]# cat /var/www/html/index.php #在/var/www/html/目录下建立 index.php并加入如下内容。 <? phpinfo(); ?>

图 17-2 测试 LAMP

最流行的Web 服务器——Apache 服务配置 第

469

17

在 RHEL 5.x 中所带的软件包一般不会是 新版,但有时一些网站可能要求使用 PHP 或

MySQL 较新一些的版本,这里就需要使用源码方式搭建 LAMP 环境。使用源码包不但可以

使用 Apache、PHP 和 MySQL 比较新一些的版本,同时灵活性也更高一些。使用源码搭建

LAMP 环境的具体步骤如下。

(1)将 RHEL 5.x 光盘配置为 YUM 源。

[root@web ~]# mkdir /mnt/cdrom [root@web ~]# mount /dev/cdrom /mnt/cdrom [root@web ~]# cp /etc/yum.repos.d/rhel-debuginfo.repo /etc/yum.repos.d/cdrom.repo [root@web ~]# cat /etc/yum.repos.d/cdrom.repo [cdrom] #修改/etc/yum.repos.d/cdrom.repo文件为如下内容。 name=cdrom baseurl=file:///mnt/cdrom/Server enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

(2)使用 YUM 方式安装如下软件包。

[root@web ~]# yum -y install gcc-c++ openssl-devel libtermcap-devel libxml2-devel \ automake autoconf

(3)下载并编译、安装 MySQL。

创建 MySQL 服务使用的用户。 [root@web ~]# useradd mysql -s /sbin/nologin [root@web ~]# cd /usr/src [root@web ~]# wget http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-5.5/mysql-5.5.1-m2.tar.gz [root@web ~]# tar -xzvf mysql-5.5.1-m2.tar.gz [root@web ~]# cd mysql-5.5.1-m2 [root@web ~]# autoreconf --force --install [root@web ~]# libtoolize --automake --force [root@web ~]# automake --force --add-missing [root@web ~]# ./configure --prefix=/usr/local/mysql --sysconfdir=/usr/local/mysql/etc \ --localstatedir=/usr/local/mysql/database --with-charset=utf8 [root@web ~]# make && make install

修改 MySQL 安装目录的所有者和拥有组。

[root@web ~]# chown -R mysql:mysql /usr/local/mysql/

安装 mysql、test 和 information_schema 数据库。

[root@web ~]# cd /usr/local/mysql [root@web ~]# ./bin/mysql_install_db --user=mysql

复制 MySQL 配置文件模板。

[root@web ~]# cp /usr/local/mysql/share/mysql/my-huge.cnf /etc/my.cnf [root@web ~]# cp /usr/local/mysql/share/mysql/mysql.server /etc/rc.d/init.d/mysqld

增加 MySQL 服务、启动服务并设置为下次启动自动加载。

[root@web ~]# chkconfig --add mysqld

Linux 从初学到精通

470

[root@web ~]# service mysqld restart [root@web ~]# chkconfig mysqld on

将 MySQL 相关命令链接到/sbin 目录。

[root@web ~]# ln -s /usr/local/mysql/bin/* /sbin/

建立名为 root 的 MySQL 管理员,并将密码设置为 redhat。

[root@web ~]# mysqladmin -u root password redhat

(4)下载并编译、安装 Apache。

[root@web ~]# cd /usr/src [root@web ~]# wget http://www.apache.org/dist/httpd/httpd-2.2.14.tar.bz2 [root@web ~]# tar -xjvf httpd-2.2.14.tar.bz2 [root@web ~]# cd httpd-2.2.14 [root@web ~]# ./configure --prefix=/usr/local/httpd/ --enable-modules=so --enable-so \ --enable-cgi --enable-ssl [root@web ~]# make && make install

将 Apache 相关命令链接到/sbin 目录。

[root@web ~]# ln -s /usr/local/httpd/bin/* /sbin/

启动 Apache。

[root@web ~]# apachectl start

每次系统启动时都会运行 Apache。

[root@web ~]# echo "/sbin/apachectl start" >> /etc/rc.d/rc.local

(5)下载并编译、安装 PHP。

[root@web ~]# cd /usr/src [root@web ~]# wget http://cn.php.net/distributions/php-5.2.12.tar.bz2 [root@web ~]# tar -xjvf php-5.2.12.tar.bz2 [root@web ~]# cd php-5.2.12 [root@web ~]#./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql \ --with-apxs2=/usr/local/httpd/bin/apxs [root@web ~]# make && make install [root@web ~]# cp php.ini-dist /usr/local/php/lib/php.ini #复制 PHP配置文件。

(6)在/usr/local/httpd/conf/httpd.conf 文件中加入以下内容。

AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps DirectoryIndex index.php

通过源码包安装的 Apache 后,其主配置文件在“/usr/local/httpd/conf/”目录,其中

“DocumentRoot”参数指定的目录是“/usr/local/httpd//htdocs”,因此做测试或是配置网站时应

该使用这个目录。

最流行的Web 服务器——Apache 服务配置 第

471

17

Web 相关命令

对于如何访问 Web 服务器大家应该都不陌生,目前有各种各样的图形界面下的 Web 浏

览器。不过有很多生产环境中的 Linux 服务器没有安装图形界面或只是为了测试 Web 服务器,

这时可以通过以下几个命令在命令行模式下访问 Web 服务器或下载文件。

17.3.1 wget:非交互式 Web 下载工具

wget 是一个命令行非交互式 Web 下载工具,支持 HTTP、HTTPS、FTP 协议,支持通过

代理下载。在使用 wget 命令时, 简单的方法直接使用如下格式将文件下载到本地。该命令

语法如下。

wget <URL>

常用指数:

常用选项:

(1)使用 wget 命令通用参数(连接到 HTTP、HTTPS、FTP 都适用)。

-b:启动后进入后台操作。

-F:以 HTML 方式处理输入文件。

-O <输出文件>:指定存放下载文件的名称。

-t=<次数>:配置重试次数,“0”表示无限次。

--retry-connrefused:即使拒绝连接也重试。

-c:继续接收已下载了一部分的文件。

--progress=方式:选择下载进度的表示方式。

-N:除非远程文件较新,否则不再取回。

-R <扩展名>:指定排除哪些文件,多个之间使用“,”分隔。

--bind-address=<地址>:使用指定地址(主机名称或 IP)进行连接。

--limit-rate=<速率>:限制下载的速率。

--dns-cache=<on|off>:指定是否禁止查找存于高速缓存中的 DNS。

(2)使用 wget 命令 HTTP 服务器相关参数。

wget http://IP地址(或 FQDN)/文件名

--http-user=<用户>:指定 HTTP 用户名。

--http-passwd=<密码>:指定 HTTP 用户密码。

-E:将所有 MIME 类型为 text/html 的文件都加上.html 扩展文件名。

--ignore-length:忽略“Content-Length”文件头字段。

Linux 从初学到精通

472

--header=<字符串>:在文件头中添加指定字符串。

--proxy-user=<用户>:指定代理服务器用户名。

--proxy-passwd=<密码>:指定代理服务器用户密码。

--cookies=on|off:指定是否使用 Cookie。

--load-cookies=<文件>:会话开始前由指定文件载入 Cookie。

--save-cookies=<文件>:会话结束后将 Cookie 保存至指定文件。

--post-data=<字符串>:使用 POST 方式,发送指定字符串。

--post-file=<文件>:使用 POST 方式,发送指定文件中的内容。

(3)使用 wget 命令 FTP 服务器相关参数。

wget ftp://IP地址(或 FQDN)/文件名

参数:

-g <on|off>:指定是否展开有通配符的文件名。

--passive-ftp:使用被动模式。

--retr-symlinks:在递归模式中,下载链接所指示的文件。

-r:递归下载。

-l=<数字>:指定 大递归深度,0 表示无限。

--delete-after:指定下载后删除文件。

-k:将绝对链接转换为相对链接。

-p:下载所有显示完整网页所需的文件,如图片、声音。

-A=<列表>:接受的文件样式列表,以逗号分隔。

-R=<列表>:排除的文件样式列表,以逗号分隔。

-D=<列表>:接受的域列表,以逗号分隔。

--exclude-domains=<列表>:排除的域列表,以逗号分隔。

--follow-ftp:跟随 HTML 文件中的 FTP 链接。

--follow-tags=<列表>:需要跟随的 HTML 标记,以逗号分隔。

-G=<列表>:需要忽略的 HTML 标记,以逗号分隔。

-H:递归时可进入其他主机。

-L:只跟随相对链接。

-I=<列表>:需要下载的目录列表。

-X=<列表>:需要排除的目录列表。

-np:不搜索上层目录。

17.3.2 links:纯文本 Web 浏览器

links 是一个纯文本 Web 浏览器,能呈现复杂的网页,支持彩色显示、表格和框架,其设

计使用许多图形界面元素,如弹出式窗口、下拉式菜单、鼠标选择链接等功能。虽然基本已

没有谁会使用 links 命令浏览网页,但使用该命令对 Web 服务器进行测试是一个不错的选择。

最流行的Web 服务器——Apache 服务配置 第

473

17

使用如下命令可通过 links 命令访问 Web 服务器,在访问成功后可通过 Esc 键调出 links 命令

的操作菜单(如图 17-3 所示的是使用 links 命令访问 http://kernel.org/的效果)。

links <URL>

图 17-3 links

实验任务

在如图 17-4 所示的网络拓扑中,通过 Apache 软件实现 Web 服务器,完成以下实验任务。

(1)创建以下 2 个目录用于存放网站。

/var/site/house.example.zqin,存放设计部使用的网站。

/var/site/csi.example.zqin,存放市场部使用的网站。

(2)“/var/site/house.example.zqin”存放的网站需要使用“desing.example.zqin”访问;

“/var/site/csi.example.zqin”存放的网站需要使用“csi.example.zqin”访问。以上两个网站均要

求使用 PHP 5.2 以上的版本及 MySQL。

(3)“/var/site/house.example.zqin”存放的网站只允许 192.168.158.0/24 网段的客户端访问;

“/var/site/csi.example.zqin”存放的网站只允许 192.168.157.0/24 网段的客户端访问。

(4)“/var/site/csi.example.zqin”存放的网站只允许通过了身份验证的用户访问。

本章测试

(1)在 Apache 中配置 HTTPS 时,必须安装( )软件包。

Linux 从初学到精通

474

A.mod_sec B.mod_https

C.mod_php D.mod_ssl

(2)使用 RHEL 5.x 中默认的 rpm 包安装 Apache 后,( )是其守护进程。

A.apache B.apached

C.http D.httpd

(3)在 Apache 配置文件中增加如下内容后,下列说法正确的是( )。

Listen 8080

A.Apache 只能侦听 8080 端口 B.Apache 可以侦听 8080 端口

C.Apache 因为配置错误无法启动 D.Apache 不能侦听 8080 端口

(4)使用 RHEL 5.x 中默认的 rpm 包安装 Apache 后,默认情况不能实现( )功能。

A.支持 ASP 的 Web 服务器 B.支持 ASP.NET 的 Web 服务器

C.提供身份验证的 Web 服务器 D.提供客户端访问控制的 Web 服务器

(5)使用 RHEL 5.x 中默认的 rpm 包安装 Apache 后,其主配置文件是( )。

A./etc/apache/apache.conf B./etc/httpd/conf/httpd.conf

C./etc/apache/conf/apache.conf D./etc/httpd/httpd.conf

(6)Apache 默认侦听的端口是( )。

A.80 B.53

C.8080 D.3128

(7)在如下配置中 IP 地址为 192.168.159.100( )访问 Web 站点 walter.example.zqin。

<VirtualHost 192.168.159.10:80> DocumentRoot /var/site/walter.example.zqin ServerName walter.example.zqin <Directory /var/site/walter.example.zqin> Order Allow,Deny Allow From all Deny From 192.168.159.0/24 Deny From .example.zqin </Directory> </VirtualHost> <VirtualHost 192.168.159.10:80>

A.一定可以 B.一定不能

C.不一定可以 D.配置有问题

(8)下列关于 htpasswd 说法正确的是( )。

A.使用该命令创建的用户必须在系统中存在

B.使用该命令创建的用户不需要在系统中存在

C.该命令可以增加新的系统用户

D.该命令可以修改系统用户的密码

(9)使用 RHEL 5.x 中默认的 rpm 包安装 Apache 后,( )是其默认的网站目录。

A./etc/ B. /etc/www/html

最流行的Web 服务器——Apache 服务配置 第

475

17

C./var D./var/www/html

(10)使用如下配置后,Apache 服务( )正常启动。

NameVirtualHost 192.168.159.10:80 <VirtualHost 192.168.159.10:80> ServerName walter.example.zqin </VirtualHost> <VirtualHost 192.168.159.10:80> ServerName william.demo.zqin </VirtualHost>

A.一定可以 B.一定不能

C.不一定可以 D.不一定不能

在一般情况下,我们使用网络浏览器直接去连接其他 Internet

站点取得网络信息时,是直接联系到目的站点服务器,然后由目

的站点服务器把信息传送回来。代理服务器是介于客户端和 Web

服务器之间的另一台服务器,有了代理服务器之后,浏览器不是

直接到 Web 服务器去取回网页,而是向代理服务器发出请求,信

号会先送到代理服务器,由代理服务器来取回浏览器所需要的信

息并传送给你的浏览器。

第18章

可爱的章鱼︱︱Squid

代理服务配置

可爱的章鱼——Squid 代理服务配置 第

477

18

大部分代理服务器都具有缓存的功能,有很大的存储空间,不断将新取得数据储存到本

机的存储器上,如果浏览器所请求的数据在本机的存储器上已经存在而且是最新的,那么代

理服务器就不重新从 Web 服务器取数据,而直接将存储器上的数据传送给用户的浏览器,这

样就能显著提高浏览速度和效率。更重要的是代理服务器是 Internet 链路级网关所提供的一

种重要的安全功能。

Squid(Squid 官方网站:http://www.squid-cache.org/)是一个流行的代理服务器和 Web

缓存服务器。Squid 有广泛的用途,从作为 Web 服务器的前置缓存服务器缓存相关请求来提

高 Web 服务器的速度,到为一组人共享网络资源而缓存 Internet、域名系统和其他网络搜索,

到通过过滤流量帮助网络安全,到局域网通过代理上网。Squid 的发展历史相当悠久,功能

也相当完善。Squid 不仅可用在 Linux 系统上,还可以用在 Windows、AIX、Digital UNIX、

FreeBSD、HP-UX、Irix、NetBSD、Nextstep、SCO 和 Solaris 等系统上。Squid 与 Linux 下其

他的代理软件相比,下载安装简单、配置简单灵活、支持缓存和多种协议。

Squid 服务安装

几乎在所有的 Linux 发行版中都包括了 Squid 服务的软件包,Squid 服务在安装时并没有太

多依赖软件包,使用如下命令安装 Squid 服务软件包。在使用不同版本 RHEL 时,Squid 服务的

版本可能会有小的区别,但并不影响其后的配置;“/mnt”目录是 RHEL 5.x 光盘的挂载点。

rpm -ivh /mnt/Server/squid-2.6.STABLE21-3.el5.i386.rpm

和其他 Linux 下的 System V 服务一样安装完成后,可以使用“service”命令启动、停止、

重新启动服务;使用“chkconfig”命令调整在指定运行级别是否自动加载。

service squid start #启动服务。 service squid stop #停止服务。 service squid restart #重新启动服务。 service squid reload #在不重新启动的情况下,重新载入配置文件。 service squid status #查看服务当前运行状态。 chkconfig squid on #在运行级别 2、3、4、5上设置为下次开机时自动运行。 chkconfig squid off #在运行级别 2、3、4、5上设置为下次开机时不自动运行。

如果不需要再使用 Squid 服务,可通过以下命令现在卸载 Squid 服务。

rpm -e squid

Squid 服务配置

在通过 rpm 包将 Squid 安装完成后,其主配置文件为/etc/squid/squid.conf 文件。在修改

Linux 从初学到精通

478

该文件时应注意以下几点。

(1)以“#”开始的是注释行(在执行时将被忽略)。

(2)对于只能指定唯一值参数,重复赋予该参数不同的值,后面的赋值将覆盖前面的值。

如在第 20 行加入“http_port 3128”后,在第 50 行再次加入“http_port 8080”,那么“http_port”

参数最后的值为“8080”。

(3)对于指定列表值的参数,每一个新增的值都有效。但对于这些基于列表的参数,通

常能在同一行中赋予多个值(以空格分隔)。

extension_methods UNGET extension_methods UNPUT extension_methods UNPOST #上下二种写法作用相同。 extension_methods UNGET UNPUT UNPOST

(4)许多参数有通用类型。如连接超时值是一个时间规范,在数字后面跟着时间单元。

connect_timeout 4 hours client_lifetime 15 days negative_ttl 50 minutes

(5)大量的参数指向文件大小或者内存额度。使用十进制数字后面接 bytes、KB、MB

或 GB。

minimum_object_size 200 bytes request_header_max_size 200 KB maximum_object_size 50 MB

(6)配置文件中参数可以以任何顺序出现,然而如果某个参数指向的值被其他参数所定

义,那么顺序就很重要。如访问控制列表是个好的例子,参数“acl”被用在参数“http_access”

规则之前必须被定义。

acl lanclient159 src 192.168.159.0/24 http_access allow lanclient159

18.2.1 正向代理服务器配置

正向代理服务器是指代理服务器被用于缓存远程主机上的数据到本地代理服务器。当

被缓存的数据被第二次访问的时候,客户端将直接从本地代理服务器获取请求数据而不再

向原远程主机请求数据。但是要想实现这种方式,必须在每一个本地客户端上明确指明代

理服务器的 IP 地址、端口号。客户端访问时,每次都把请求送给代理服务器处理,代理

服务器根据请求确定是否连接到远程主机获取数据。如果在本地缓存有目标文件,则直接

将文件传给用户即可。如果没有的话则先取回文件,先在本地保存一份缓存,然后将文件

发给本地客户端。

可爱的章鱼——Squid 代理服务配置 第

479

18

图 18-1 正向代理服务器

正向代理也是代理服务器最基本的功能之一,下面在如图 18-1 所示的网络中通过 Squid

中实现正向代理服务器功能,加速企业内部网络用户访问 Internet 的速度。为了实现这一功

能需要在 squid.example.zqin 进行如下配置。

(1)执行如下命令,并把如下命令加入“/etc/rc.d/rc.local”文件中。

[root@squid ~]# /bin/echo "1" > /proc/sys/net/ipv4/ip_forward [root@squid ~]# /bin/echo "1024 40000" > /proc/sys/net/ipv4/ip_local_port_range

(2)修改/etc/squid/squid.conf 中如下参数。

使用 8080 作为代理服务端口,该参数的修改不是必需的。Squid 默认使用 3128 作

为代理服务端口,只是目前比较流行使用 8080 作为代理服务器端口。在指定代理时

可通过多个 http_port 参数指定多个代理端口。设置 Squid 的侦听端口,也可以将该

参数写成“http_port 192.168.159.12 8080”,指定 IP 主要用在 Squid 所在主机是有一

个以上网络连接时,可根据需要为内网或外网提供代理功能。

http_port 8080

指定 DNS 服务器,设置 DNS 服务器地址,使 Squid 服务器可解析域名。

dns_nameservers 202.103.24.68 202.103.0.117

指定主机名,帮助 Squid 得知当前主机名。

visible_hostname 192.168.159.10

定义缓存机制、缓存目录。

cache_dir ufs /var/spool/squid 8000 16 256

定义高速缓存,高速缓存设置主要是指需要使用多少内存为作为调整缓存,一般设

置为所在主机物理内存的 1/3。

Linux 从初学到精通

480

cache_mem 1000MB

定义可提供代理服务的网络,Squid 默认配置只为 localhost 提供代理服务,为了让

Squid 为企业内网用户提供缓存功能至少需要定义以下内容,注意以下内容必须出

现在 http_access deny all 之前。

acl lanclient src 192.168.159.0/24 http_access allow lanclient

(3)启动 Squid 服务,并设置为下次启动自动加载。

[root@squid ~]# service squid restart [root@squid ~]# chkconfig squid on

在上述配置完成后,根据 18.3 配置 192.168.159.0/24 网段的客户端后,Squid 就可以为

这些客户端提供代理功能。下面是几个 Squid 配置中与缓存相关的参数。

(1)缓存对象大小限制:minimum_object_size、maximum_object_size

可以控制缓存对象的最大和最小体积。比 minimum_object_size 更小或者比

maximum_object_size 更大的对象不会被缓存在磁盘,但仍然是代理方式处理。下面是一些该

参数的例子。

maximum_object_size 100 KB maximum_object_size 1 MB maximum_object_size 12382 bytes maximum_object_size 2 GB

(2)内存缓存大小限制:maximum_object_size_in_memory、maximum_object_size_in_memory

可 以 控 制 Squid 所 使 用 的 内 存 中 缓 存 对 象 的 最 大 和 最 小 体 积 。 比

maximum_object_size_in_memory 更小或者比 maximum_object_size_in_memory 更大的对象不

会被放入 Squid 所占用的内存中。

(3)IP 地址缓存限制:ipcache_size、ipcache_low、ipcache_high

可以控制 Squid 对 IP 地址缓存的总量( ipcache_size)、缓存 IP 地址的最低极限

(ipcache_low)、缓存 IP 地址的最高极限(ipcache_high)。

18.2.2 反向代理服务器配置

反向代理服务器可以降低原始服务器的负载。反向代理服务器位于本地服务器和 Internet 之

间。如果 Internet 用户请求的数据在代理服务器上有缓存,代理服务器直接将缓存内容发送给用

户。如果没有缓存则先向本地服务器发出请求,取回数据,本地缓存后再发送给用户。反向代理

服务器对外表现为一个Web服务器,外部网络就可以简单把反向代理服务器当做一个标准的Web

服务器而不需要特定的配置。不同之处在于,这个服务器没有保存任何网页的真实数据,所有的

静态网页或者 CGI 程序,都保存在内部的 Web 服务器上。因此对反向代理服务器的攻击并不会

使得网页信息遭到破坏,这样就增强了 Web 服务器的安全性。反向代理方式和包过滤方式或标

准代理方式并无冲突,因此可以在防火墙设备中同时使用这两种方式,其中反向代理用于外部网

络访问内部网络时使用,正向代理或包过滤方式用于拒绝其他外部访问方式并提供内部网络对外

可爱的章鱼——Squid 代理服务配置 第

481

18

部网络的访问能力。因此可以结合这些方式提供最佳的安全访问方式。

图 18-2 反向代理服务器

反向代理其实就是实现了 NAT 的功能,下面在如图 18-2 所示的网络中通过 Squid 中实

现反向代理服务器功能,使 Internet 用户可以访问到“web.example.zqin”的内容。为了实现

这一功能需要在 squid.example.zqin 进行如下配置。

(1)执行如下命令,并把如下命令加入“/etc/rc.d/rc.local”文件中。

[root@squid ~]# /bin/echo "1" > /proc/sys/net/ipv4/ip_forward [root@squid ~]# /bin/echo "1024 40000" > /proc/sys/net/ipv4/ip_local_port_range

(2)修改/etc/squid/squid.conf 中如下参数。

监听服务器的 80 端口,支持域名和 IP 的虚拟主机。

http_port 80 vhost vport dns_nameservers 202.103.24.68 202.103.0.117 visible_hostname 192.168.159.10 cache_dir ufs /var/spool/squid 8000 16 256 cache_mem 1000MB

Web 站点位于 IP 地址为 192.168.159.12 的主机。

cache_peer 192.168.159.12 parent 80 0 no-query originserver acl ws dst 192.168.159.12 http_access allow ws

(3)启动 Squid 服务,并设置为下次启动自动加载。

[root@squid ~]# service squid restart [root@squid ~]# chkconfig squid on

如果在 IP 地址为 192.168.159.12 的 Web 服务器配置了两个基于主机头的虚拟主机时,通

过 Squid 实现反向代理服务器需要在/etc/squid/squid.conf 中进行以下参数设置。

http_port 80 vhost vport cache_peer 192.168.159.12 parent 80 0 no-query originserver name=walter cache_peer 192.168.159.12 parent 80 0 no-query originserver name=william cache_peer_domain walter walter.example.com

Linux 从初学到精通

482

cache_peer_domain william william.example.com cache_peer_access walter allow all cache_peer_access william allow all acl ws dst 192.168.159.12 http_access allow ws

在上述配置完成后,Internet 上的客户端访问“202.103.159.10”的 80 端口即可访问到

“192.168.159.12”上的 Web 服务。

18.2.3 透明代理服务器

透明代理服务和正向代理服务器的功能完全相同,但是代理操作对客户端是透明的(即

不需指明代理服务器的 IP 和端口)。透明代理服务器阻断网络通信,并且过滤出访问远程主

机的通信。如果客户端的请求在本地有缓存则将缓存的数据直接发给用户,如果在本地没有

缓存则向远程主机发出请求,其余操作和标准的代理服务器完全相同。下面用一个例子来说

明透明代理的工作过程。在一个 192.168.159.0/24 的网络中有一台 IP 地址为 192.168.159.100

的客户端,通过该网络 IP 地址为 192.168.159.10 的防火墙访问互联网,透明代理也被安装在

防火墙机器上并配置端口为 8080。客户端现访问 Internet 上 FQDN 为 www.example.zqin 的

Web 站点,其内部工作过程如下。

(1)客户端通过 DNS 得到该 Web 服务器 IP 地址为 202.103.0.73。然后客户端使用一个

随机端口(假设为 1088)与此地址建立一个链接,并向 Web 站点发出请求。

(2)当数据包由客户端(1088 端口)通过防火墙送往 example.zqin 时,数据包被重定向

到代理服务重定的 8080 端口。透明代理使用一个随机端口(假设为 1025)与 202.103.0.73

的端口 80(这是原始包的目的地址)建立一个链接。

(3)当代理服务收到从 Web 站点传来的页面后,通过已经建立的链接把页面复制给客户端。

(4)客户端显示 http://www.example.zqin 上的页面内容。

从 example.zqin 的角度来看,连接是由防火墙公网的端口 1025 到 202.103.0.73 的端口 80。

从客户端的角度来看,连接是从 192.168.159.100(客户端)的端口 1088 连接到 202.103.0.73 的

端口 80,但是客户端实际是在与透明代理服务器对话。

在如图 18-1 所示的网络中通过 Squid 为客户端实现透明代理服务器功能的操作步骤如下。

(1)修改/etc/squid/squid.conf 文件,内容如下。

http_port 8080 transparent dns_nameservers 202.103.24.68 202.103.0.117 visible_hostname 192.168.159.10 cache_dir ufs /var/spool/squid 8000 16 256 cache_mem 1000MB acl lanclient src 192.168.159.0/24 http_access allow lanclient

(2)在根目录建立一个名为“iptables.sh”的脚本文件,并加入如下内容以实现让 IPTables

(有关 IPTables 相关内容见第 19 章 )实现客户端数据包重定向的功能(以下脚本只为 Web

的透明代理,没有涉及其他保护)。

modprobe ip_tables #加载内核模块

可爱的章鱼——Squid 代理服务配置 第

483

18modprobe iptable_nat

modprobe iptable_filter

/bin/echo "1" > /proc/sys/net/ipv4/ip_forward

#定义 Internet接口名称及 IP地址

WanIP="202.103.159.12"

WanFace="eth1"

#定义内部网络 IP地址、网段和接口名称

LANIP="192.168.159.10"

LANNetID="192.168.159.0/24"

LANFace="eth0"

LoIP="127.0.0.1" #定义本地回环设备

LoFace="lo"

IPTABLES=/sbin/iptables #定义 iptables命令

$IPTABLES -t nat -F

$IPTABLES -t nat -Z

$IPTABLES -t nat -X

$IPTABLES -t filter -F

$IPTABLES -t filter -Z

$IPTABLES -t filter -X

$IPTABLES -t filter -P INPUT DROP

$IPTABLES -t filter -P OUTPUT DROP

$IPTABLES -t filter -P FORWARD ACCEPT

$IPTABLES -t filter -A INPUT -s $LoIP -j ACCEPT

$IPTABLES -t filter -A OUTPUT -d $LoIP -j ACCEPT

$IPTABLES -t filter -A INPUT -s $LANNetID -j ACCEPT

$IPTABLES -t filter -A OUTPUT -d $LANNetID -j ACCEPT

$IPTABLES -t filter -A INPUT -i $WanFace -j ACCEPT

$IPTABLES -t filter -A OUTPUT -o $WanFace -j ACCEPT

$IPTABLES -t nat -A POSTROUTING -s $LANNetID -o $WanFace -j SNAT \

--to-source $WanIP

$IPTABLES -t nat -A PREROUTING -s $LANNetID -i $LANFace -p tcp --dport 80 -j \

REDIRECT --to-ports 8080

(3)修改文件“/iptables.sh”的权限。

[root@squid ~]# chmod 744 /iptables.sh

(4)启动 Squid 服务,并设置为下次启动自动加载。

[root@squid ~]# service squid restart

[root@squid ~]# chkconfig squid on

(5)执行如下命令,并将其加入/etc/rc.d/rc.local 文件中。

[root@squid ~]# /bin/echo "1" > /proc/sys/net/ipv4/ip_forward

[root@squid ~]# /bin/echo "1024 40000" > /proc/sys/net/ipv4/ip_local_port_range

Linux 从初学到精通

484

[root@squid ~]# /bin/sh/iptables.sh

在上述配置完成后,192.168.159.0/24 网段的客户端将网关指向 192.168.159.10,Squid 就

可以为这些客户端提供代理功能。

18.2.4 访问控制列表

在配置完成基本的代理服务器功能后,一般的应用中都需要通过访问控制列表对客户端的行

为进行控制,在 Squid 中主要通过访问控制元素、访问控制规则来实现对客户端访问行为的控制。

1.访问控制元素 访问控制元素是 Squid 中实现访问控制列表(ACL)的基础。访问控制元素中可以指定

包括 IP 地址、端口号、主机名和 URL 匹配等变量。每个访问控制元素都需要指定一个名字,

在编写访问控制规则时需要引用该名称。基本的 ACL 元素语法如下。

acl name type value1 value2 ...

在多数情况下,能对一个访问控制元素列举多个值,也可以有多个访问控制元素使用同

一个名字。如在下面的例子中两种写法作用相同,都是定义了一个名为“HTTPPorts”的访

问控制列表,该列表可以匹配端口为 80、8000、8080 其中任意一个。

acl HTTPPorts port 80 8080 #上下两种写法作用相同 acl HTTPPorts port 80 acl HTTPPorts port 8080

在 Squid 中常用的访问控制元素包括以下几个。

(1)src:通过匹配源 IP 地址限制访问。

(2)dst:通过匹配目的 IP 地址限制访问。

(3)srcdomain:通过匹配源域名限制访问。

(4)dstdomain:通过匹配目的域名限制访问。

(5)port:通过匹配端口号限制通过代理服务器访问外部服务器的端口。

(6)myport:port 的 ACL 指向原始服务器的端口号,myport 指向 Squid 自己的端口号,

用以接受客户请求。假如在 http_port 指令里指定不止一个端口号,那么 Squid 就可以在不同

的端口上侦听。

(7)url_regex:通过匹配 URL 正则表达式限制访问。

(8)urlpath_regex:和 url_regex 类似,不同的是可以不包含传输协议和主机名不包含在

匹配条件里。这让某些类型的检测非常容易。

(9)srcdom_regex:使用正则表达式匹配客户域名限制访问。

(10)dstdom_regex:使用正则表达式匹配目标域名限制访问。

(11)maxconn:通过来自客户 IP 地址的最大同时连接数限制访问。

(12)time:通过时间限制访问,如在 time 中使用 S 表示限制访问的时间是星期天。除

了 S 在 time 中还可能使用:M(星期一)、T(星期二)、W(星期三)、H(星期四)、F(星

期五)、A(星期六)、S(星期天)、D(星期一至星期五)。

可爱的章鱼——Squid 代理服务配置 第

485

18

(13)method:通过 HTTP 请求方法限制访问。

(14)proto:通过 URI 访问(或传输)协议限制访问。有效值包括 HTTP、HTTPS、FTP、

gopher、urn、whois 和 cache_object。也就是说,这些是被 Squid 支持的 URL 机制名字。

(15)browser:通过匹配 User-Agent 头部限制访问。

(16)req_mime_type:通过匹配 HTTP 请求里的 Content-Type 头部限制访问。

(17)rep_mime_type:通过匹配原始服务器的 HTTP 响应里的 Content-Type 头部限制访问。

(18)arp:通过匹配 MAC 地址限制访问。

在使用这些访问控制元素时需要注意以下几点。

(1)当访问控制元素有多个值时,任何单个值能导致匹配。换句话说,Squid 在检查访

问控制元素值时使用 OR 逻辑。当找到第一个值匹配时,Squid 会停止匹配。这意味着把最可

能匹配的值放在列表开头处,能减少延时。

(2)在 Squid 的访问控制元素中指定 IP 地址时,可以使用子网、地址范围、域名等多种

形式。Squid 支持标准 IP 地址写法和无类域间路由规范。如在下面的例子中几种写法作用相

同,都是定义了一个名为“fringeclient”的访问控制列表,该列表可以匹配源 IP 地址是

192.168.159.100 的请求。

acl fringeclient src 192.168.159.100/255.255.255.0 acl fringeclient src 192.168.159.100/24 acl fringeclient src 192.168.159.100

(3)在 Squid 的访问控制元素中指定 IP 地址时,可以使用“-”列举多个相邻子网或 IP

地址。如在下面的例子中几种写法作用相同,都是定义了一个名为“fringeclient”的访问控

制列表,该列表可以匹配源 IP 地址 192.168.156.0/24 到 192.168.159.0/24 网段的所有请求。

acl fringeclient src 192.168.156.0/24-192.168.159.0/24

(4)在 Squid 的访问控制元素中指定 IP 地址时,也可以使用主机名或 DNS 后缀。Squid

在启动时会将主机名转换成 IP 地址,一旦启动 Squid 不会对主机名的地址发起第二次 DNS

查询。如果在 Squid 运行中地址已改变,Squid 不会注意到。如果主机名被解析成多个 IP 地

址,Squid 将每一个增加到 ACL 里。在基于 IP 的 ACL 里,使用主机名或 DNS 后缀并不是推

荐的做法(如果需要使用主机名或 DNS 后缀推荐使用 srcdomain、dstdomain、srcdom_regex、

dstdom_regex),因为 ACL 主机名转换到 IP 地址的过程会延缓 Squid 的启动。

(5)在 Squid 的访问控制元素中指定主机名或 DNS 后缀时,域名以“.”开头、主机名

不以“.”开头。如在下面的例子中几种写法作用相同。

#匹配源主机名为 client100.example.zqin的请求。 acl fringeclient srcdomain client100.example.zqin acl csiclient srcdomain . demo.zqin #匹配源 DNS后缀为 demo.zqin的请求。

(6)在 Squid 的 ACL 里指定 time 时,可以通过只指定时间匹配每天的时间段,也可以

只指定星期匹配整天。如下面的例子。

acl WorkTime MTWHFA 08:30-17:30 #匹配星期一至星期六的 08:30到 17:30的请求。 acl WorkTime MTWHFA #匹配星期一至星期六全天的请求。

Linux 从初学到精通

486

acl WorkTime 08:30-17:30 #匹配早上 08:30到下午 17:30的请求。

2.访问控制规则 访问控制元素是建立访问控制列表的第一步。第二步是访问控制规则,用来允许或拒绝

某些动作。当读取配置文件时 Squid 仅仅扫描一遍访问控制规则。这样在访问控制规则里引

用访问控制元素之前,必须先定义访问控制元素。如果有多个动作需要注意先后顺序,Squid

是按照顺序找且只找第一条符合的访问控制列表。Squid 中访问规则语法规则定义方法如下。

http_access allow|deny [!]ACLname ...

Squid 默认情况下会通过以下的配置拒绝所有客户端的请求(除了 localhost 以外)。因此

在使用 Squid 时,推荐将定义的访问控制列表放置在以下内容之前,而不是删除(或注释)

以下内容。

http_access allow localhost http_access deny all

3.访问控制列表实例 在 Squid 中对于访问控制列表的使用非常灵活,下面是几个使用访问控制列表的例子(为

了让这些配置生效,它们必须出现在“http_access deny all”之前)。

(1)禁止客户端通过 Squid 访问 IP 地址为 210.21.118.68 的主机。

acl badsrvip1 dst 210.21.118.68

http_access deny badsrvip1

(2)禁止 Squid 响应客户端下载*.dll、*.exe、*.bat 和*.cmd 类型的文件。

acl badfile1 urlpath_regex -i \.dll$ \.exe$ \.bat$ \.cmd$

http_access deny badfile1

(3)禁止客户端通过 Squid 访问主机名为 www.demo.zqin 的主机。

acl baddomain1 dstdomain www.demo.zqin

http_access deny baddomain1

(4)禁止客户端通过 Squid 访问域名含有 test.zqin 的主机。

acl badurl1 url_regex -i test.zqin

http_access deny badurl1

(5)禁止客户端通过 Squid 访问含有“charles”关键字的 URL。

acl badurl2 url_regex -i charles http_access deny badurl2

(6)禁止 Squid 响应 IP 地址为 192.168.159.200 客户端的请求。

acl badclientip1 src 192.168.159.200

http_access deny badclientip1

(7)禁止 Squid 响应 192.168.158.0/24 子网所有客户端在周一到周五的 9:00 到 18:00 的请求。

acl clientnet1 src 192.168.158.0/24

acl worktime time MTWHF 9:00-18:00

可爱的章鱼——Squid 代理服务配置 第

487

18http_access deny clientnet1 worktime

(8)禁止 Squid 响应子网 192.168.157.0 的所有客户端的请求。

acl badclientnet1 src 192.168.157.0/24

http_access deny badclientnet1

(9)限制 IP 地址为 192.168.159.0/24 的客户端并发最大连接数为 5。

acl clientip1 src 192.168.159.200

acl conn5 maxconn 5

http_access deny clientip1 conn5

(10)允许 Squid 响应 192.168.159.0/24、192.168.158.0/24 子网所有客户端的请求。

acl goodclient src 192.168.159.0/24 192.168.158.0/24

http_access allow goodclient

客户端访问

如果为 Squid 配置了透明代理,客户端不需要任何配置即可通过 Squid 实现代理功能,如果

没有配置透明代理,则需要在客户端使用的浏览器中配置代理服务器的 IP 地址(或 FQDN)及

端口。在下述内容中 Squid 服务器已配置完成,其 IP 地址为 192.168.159.10、端口为 8080。

18.3.1 IE 浏览器

IE 浏览器配置代理服务器的 IP 地址(或 FQDN)及端口方法如下。

(1)在 IE 浏览器中单击“工具”→“Internet 选项”,如图 18-3 所示。

(2)在“连接”选项页中单击“局域网设置”按钮,如图 18-4 所示。

图 18-3 Internet选项

图 18-4 局域网设置

(3)勾选“为 LAN 使用代理服务器(这些设置不应用于拨号或 VPN 连接(X))”并输入

Linux 从初学到精通

488

代理服务器的 IP 地址(或 FQDN)及端口后单击“确定”按钮,如图 18-5 所示。

图 18-5 输入代理服务器

18.3.2 FireFox 浏览器

FireFox 浏览器配置代理服务器的 IP 地址(或 FQDN)及端口方法如下。

(1)在 FireFox 浏览器中选择“Edit”→“Preferences”,如图 18-6 所示。

(2)在“Advanced”选项页中单击“Network”选项卡中的“Settings…”按钮,如图 18-7

所示。

图 18-6 FireFox Preferences

图 18-7 FireFox Network

(3)选择“Manual proxyconfiguration”及“User this proxy server for all protocols”并输

入代理服务器的 IP 地址(或 FQDN)及端口后单击“OK”按钮,如图 18-8 所示。

可爱的章鱼——Squid 代理服务配置 第

489

18

图 18-8 FireFox proxy configuration

18.3.3 Opera 浏览器

Opera 浏览器配置代理服务器的 IP 地址(或 FQDN)及端口方法如下。

(1)在 Opera 浏览器中选择“Edit”→“Preferences”,如图 18-9 所示。

图 18-9 Opera Preferences

(2)在“Advanced”选项页中单击“Network”选项卡中的“Proxy Servers…”按钮,如

图 18-10 所示。

(3)勾选“HTTP”并输入代理服务器的 IP 地址(或 FQDN)及端口后单击“OK”按钮,

如图 18-11 所示。

Linux 从初学到精通

490

图 18-10 Opera Network

图 18-11 代理服务器 IP及端口

实验任务

在如图 18-12 所示的网络拓扑中,通过 RHEL 5.x 自带的 Squid 软件实现代理服务,完成

以下实验任务。

图 18-12 Squid服务实验任务

(1)在“squid.example.zqin”挂载一块新的硬盘专门用户存放 Squid 的缓存数据。

(2)通过“squid.example.zqin”实现正向代理,并满足如下要求。

192.168.159.0/24 网段的用户可以在任何时间无限制地访问 Internet。

可爱的章鱼——Squid 代理服务配置 第

491

18

192.168.158.0/24 网段的用户只能在 8:30~12:00 及 13:30~17:30 访问 Internet。

192.168.158.0/24 网段的用户不能访问“www.sina.com”、“qq.com”、“www.sohu.com”。

192.168.157.0/24 网段的用户只能在 12:00~13:30 访问 Internet。

192.168.157.0/24 网段的用户不能下载“mp3”、“avi”、“wmv”、“rm”的文件。

(3)通过“ squid.example.zqin”实现反向代理,让 Internet 上的用户可以访问到

“web.example.zqin”的 Web 服务器。

本章测试

(1)( )参数是用于 Squid 配置透明代理。

A.vhost B.vport

C.transparent D.vtransparent

(2)在配置 Squid 时( )参数是必须配置的。

A.http_port B.visible_hostname

C.dns_nameservers D.cache_mem

(3)Squid 不能运行在( )平台。

A.Windows Server 2003 B.AIX

C.FreeBSD D.Windows Mobile

(4)下列代理服务器功能,( )可以实现 Internet 用户访问内部网络 Web 服务器。

A.正向代理 B.反向代理

C.透明代理 D.动态代理

(5)Squid 默认使用的代理端口是( )。

A.8080 B.3128

C.80 D.2138

(6)在 Squid 配置文件中“acl ws dst 192.168.159.12”用于指定( )。

A.客户端访问的目标 IP 地址 B.客户端访问的来源 IP 地址

C.Squid 侦听的 IP 地址 D.Squid 不侦听的 IP 地址

(7)在 RHEL 5.x 中( )是 Squid 的守护进程。

A.squid B.squid

C.cacahe D.cached

(8)Squid 不能实现( )功能。

A.HTTPS 代理服务器 B.FTP 代理服务器

C.HTTP 代理服务器 D.SMB 代理服务器

(9)使用 RHEL 5.x 中默认的 rpm 包安装 Squid 后,( )是其默认的缓存目录。

A./var/spool B./var/spool/squid

C./var/cache D./var/squid

Linux 从初学到精通

492

(10)在 Squid 中使用如下配置后,IP 地址为 192.168.159.200 的客户端( )使用 Squid

提供的代理功能。

acl badclientip1 src 192.168.159.200 http_access deny badclientip1

A.可以 B.不能

C.一定可以 D.不一定不能

Linux 因其健壮性、可靠性、灵活性及可定制性而非常受欢

迎。Linux 具有许多内置的能力,使开发人员可以根据自己的需

要定制其工具、行为和外观,而无须昂贵的第三方工具。

第19章

看家护院︱︱IP

Tables

防火墙配置

Linux 从初学到精通

494

netfilter/IPTables(netfilter/IPTables 官方网站:http://www.netfilter.org/)是在 Linux 2.4 及后继

版本的内核中集成的一种防火墙服务,工作在 OSI 七层模型的 2、3 层。如果 Linux 系统连接

到 Internet 或 Intranet、服务器或连接 Intranet 和 Internet 的代理服务器,则该服务有利于在

Linux 系统上更好地控制 IP 数据包过滤和防火墙配置。netfilter/IPTables IP 数据包过滤系统被

称为单个实体,但实际上由以下两个组件组成。

(1)netfilter 组件:集成在内核的一部分,由一些数据包过滤表组成,这些表包含内

核 用 来 控 制 数 据 包 过 滤 处 理 的 规 则 集 ( 该 模 块 位 于 /lib/modules/$(uname

-r)/kernel/net/netfilter 目录中)。

[root@fw ~]# ls /lib/modules/$(uname -r)/kernel/net/netfilter nfnetlink.ko xt_CLASSIFY.ko xt_connmark.ko xt_dccp.ko xt_length.ko xt_MARK.ko xt_physdev.ko xt_realm.ko xt_statistic.ko nfnetlink_log.ko xt_comment.ko xt_CONNMARK.ko xt_DSCP.ko xt_limit.ko xt_multiport.ko xt_pkttype.ko xt_sctp.ko xt_string.ko nfnetlink_queue.ko xt_connbytes.ko xt_CONNSECMARK.ko xt_esp.ko xt_mac.ko xt_NFQUEUE.ko xt_policy.ko xt_SECMARK.ko xt_tcpmss.ko x_tables.ko xt_connlimit.ko xt_conntrack.ko xt_helper.ko xt_mark.ko xt_NOTRACK.ko xt_quota.ko xt_state.ko xt_tcpudp.ko

(2)iptables 组件:是一种工具,也称为用户空间,iptables 组件使插入、修改和除去数

据包过滤表中的规则变得容易。

IPTables 工作流程

netfilter/iptables IP 数据包过滤系统是一种功能强大的工具,可用于添加、编辑和删除规则,

这些规则是在做数据包过滤时,决定防火墙所遵循和组成的规则。这些规则存储在专用的数据

包过滤表中,而这些表集成在 Linux 内核中。在数据包过滤表中,规则被分组放在所谓的链中。

通过使用用户空间,可以构建自己的定制规则,这些规则存储在内核空间的数据包过滤

表中。这些规则具有目标,告诉内核对来自某些源、前往某些目的地或具有某些协议类型的

数据包做些什么。如果某个数据包与规则匹配,那么使用目标 ACCEPT 允许该数据包通过,

还可以使用目标 DROP 或 REJECT 来阻塞并丢弃数据包。对于可对数据包执行的其他操作,

还有许多其他目标。

根据规则所处理的数据包的类型,可以将规则分组在链中。处理入站数据包的规则被添

加到 INPUT 链中;处理出站数据包的规则被添加到 OUTPUT 链中;处理正在转发的数据包

的规则被添加到 FORWARD 链中。这三个链是基本数据包过滤表中内置的缺省主链。另外,

还有其他许多可用的链的类型,如 PREROUTING 和 POSTROUTING。每个链都可以有一个

策略,定义“缺省目标”,也就是要执行的缺省操作,当数据包与链中的任何规则都不匹配时,

执行此操作。

建立规则并将链放在适当的位置之后,就可以开始进行真正的数据包过滤工作了。这时

内核空间从用户空间接管工作。当数据包到达防火墙时,内核先检查数据包的头信息,尤其

看家护院—IPTables 防火墙配置 第

495

19

是数据包的目的地,这个过程称为路由。

如果数据包源自外界并前往本机系统,那么内核将这些数据包传递到内核空间数据包过

滤表的 INPUT 链。如果数据包源自本机系统内部或本机系统所连接的内部网上的其他源,并

且此数据包要前往另一个外部系统,那么数据包被传递到 OUTPUT 链。如果数据包源自外部

系统并前往外部系统的数据包被传递到 FORWARD 链。 接下来,将数据包的头信息与其所

传递到的链中的每条规则进行比较,看是否与某条规则完全匹配。如果数据包与某条规则匹

配,那么内核就对该数据包执行由该规则的目标指定的操作。但是,如果数据包与这条规则

不匹配,那么它将与链中的下一条规则进行比较。 后,如果数据包与链中的任何规则都不

匹配,那么内核将参考该链的策略来决定如何处理该数据包。理想的策略应该告诉内核 DROP

(阻塞并丢弃)该数据包。

表 19-1 表与链的关系

表 链

filter nat mangle raw

INPUT

FORWARD

OUTPUT

PREROUTING

POSTROUTING

在 IPTables 中包含 4 个表:filter 表、nat 表、mangle 表及 raw 表(每个表中可用的链见

表 19-1),分别代表对经过防火墙的数据包进行筛选、转译与改写的动作。每个链都是一个

检查清单,利用预先设定的原则来对数据包内容进行判断。在 IPTables 中整个数据包过滤的

过程(如图 19-3 所示)如下。

(1)数据包到达网络接口。

(2)进入 raw 表的 PREROUTING 链,这个链的作用是赶在连接跟踪之前处理数据包。

(3)如果进行了连接跟踪,在此处理。

(4)进入 mangle 表的 PREROUTING 链,在此可以修改数据包,如 TOS 等。

(5)进入 nat 表的 PREROUTING 链,在此可以做 DNAT,但不要做过滤。

DNAT 是目标地址转换,主要用于改变数据包的是目的地址以使包能重路由到某台主

机,简单说就是发布内部网络中的服务器。在如图 19-1 所示的网络中,Internet 用户如果

希望访问 Web 服务器时,就需要在“fw.example.zqin”上配置 DNAT。

提 示

Linux 从初学到精通

496

图 19-1 DNAT

(6)路由判断,看是交给本地主机还是转发给其他主机。

(7)到了这里就得分两种不同的情况,一种情况就是数据包要转发给其他主机,这时候

数据包会依次经过:

进入 mangle 表的 FORWARD 链,这里也比较特殊,这是在第一次路由判断之后,

在进行 后的路由判断之前,这里仍然可以对数据包进行某些修改。

进入 filter 表的 FORWARD 链,在这里可以对所有转发的数据包进行过滤。

经过这里的数据包是转发的,方向是双向的。

进入 mangle 表的 POSTROUTING 链,到这里已经做完了所有的路由判断,但数据

包仍然在本地主机,这里还可以进行某些修改。

进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT,但不要在这里进

行过滤。

SNAT 是源地址转换,主要用于改变数据包的源地址,防火墙能自动地对数据包做

SNAT 以使内部网络能连接到 Internet。在如图 19-2 所示的网络中“192.168.159.0/24”网段

的客户端如果希望访问 Internet 就必须在“fw.example.zqin”上配置 SNAT。

数据包离开本机,整个过滤完毕。

(8)另一种情况是,数据包就是发给本地主机的,那么数据包会依次经过:

进入 mangle 表的 INPUT 链,这里是在路由判断之后,交由本地主机程序使用之前,

提 示

提 示

看家护院—IPTables 防火墙配置 第

497

19

也可以进行一些相应的修改。

进入 filter 表的 INPUT 链,在这里可以对流入的所有数据包进行过滤,无论数据包

来自哪个网络接口。

交给本地主机的应用程序进行处理。

处理完毕后进行路由判断,看该往哪里发出。

进入 raw 表的 OUTPUT 链,这里是在连接跟踪处理本地的数据包之前。

连接跟踪对本地的数据包进行处理。

进入 mangle 表的 OUTPUT 链,在这里可以修改数据包,但不要在这里进行过滤。

进入 nat 表的 OUTPUT 链,可以对防火墙自己发出的数据做 NAT。

再次进行路由判断。

进入 filter 表的 OUTPUT 链,可以对本地出去的数据包进行过滤。

进入 mangle 表的 POSTROUTING 链,到这里已经做完了所有的路由判断,但数据

包仍然在本地主机,还可以进行某些修改。

图 19-2 SNAT

这里不只对经过防火墙的数据包进行处理,还对防火墙自己产生的数据包进行处理。

进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT,但不要在这里进

行过滤。

数据包离开本机,整个过滤完毕。

提 示

Linux 从初学到精通

498

图 19-3 IPTables数据包流程

19.1.1 filter 表

filter表主要用于过滤数据包(对数据包是进行ACCEPT、DROP、REJECT、LOG或RETUN

等操作),IPTables 中几乎所有的过滤都在这里完成。filter 表也是默认操作的表,在一般的应

用中大部分情况都是使用该表。filter 表包含以下 3 条链。

(1)INPUT 链:过滤所有目标地址是本机的数据包。

(2)FORWARD 链:过滤所有路过本机的数据包。也就是目的地址和源地址都不是本机

的数据包。

(3)OUTPUT 链:过滤所有由本机产生的数据包。也就是源地址是本机的数据包。

看家护院—IPTables 防火墙配置 第

499

19

19.1.2 nat 表

nat 表主要用于网络地址转换,即 NAT(Network Address Translation),属于一个流的数据

包只会经过这个表一次。如果第一个包被允许进行 NAT 或 Masqueraded,那么其他的数据包都

会自动地做相同的操作,也就是说其他的数据包不会再通过这个表一个一个地被 NAT。所以任

何时候都不要在这个表里的任何一条链进行过滤。IPTables 中可以进行以下方式的 NAT。

(1)DNAT:主要用于改变数据包的是目的地址以使包能重路由到某台主机。

(2)SNAT:主要用于改变数据包的源地址,防火墙能自动地对数据包做 SNAT 以使内部

网络能连接到 Internet。

(3)MASQUERADE:和 SNAT 完全一样,只是本机在进行源地址转换时,本机有一个

可用的源地址池,当需要进行转换时 MASQUERADE 会查找可用的 IP 地址,而不像 SNAT

只有固定的 IP 地址(当使用 PPP、PPPoE 等拨号方式接入 Internet 一般使用这种方式)。

nat 表包含以下 3 条链。

(1)PREROUTING 链:可以在数据包到达防火墙的时候改变包的目标地址。

(2)OUTPUT 链:可以改变本地产生的数据包的目标地址。

(3)POSTROUTING 链:在数据包就要离开防火墙时改变数据包的源地址。

19.1.3 mangle 表

mangle 表主要用于修改数据包。通过 mangle 表可以根据需要改变包头中的内容,如 TTL、

TOS、MARK)。mangle 表主要有以下几种操作:

(1)TOS 操作:主要用于设置或改变数据包的服务类型域,常用在设置网络上的数据包

如何被路由等策略。这个操作并不完善,有时并不能达到预期的效果,其在 Internet 上还不

能使用,而且很多路由器不会注意到这个域值。换句话说,不要使用 TOS 设置发往 Internet

的包,除非打算依靠 TOS 来路由。不能在这个表配置任何过滤、SNAT(源地址转换)、DNAT

(目录地址转换)。

(2)TTL 操作:主要用于改变数据包的生存时间域。可以让所有数据包只有一个特殊的

TTL,这样可以欺骗一些 ISP(欺骗 ISP 主要目的在于有些 ISP 并不希望多台计算机共享一个

链接访问 Internet,而这些 ISP 会通过检查一台计算机所发出的数据包是否包括不同的 TTL

来判断)。

(3)MARK 操作:主要用于给数据包设置特殊的标记,通过这些标记可以配置带宽限制

和基于请求的分类。

MARK 并没有真正地改动数据包,只是在内核空间为包设了一个标记,防火墙内的其

他规则或程序可以使用这种标记对包进行过滤或高级路由。

mangle 表包含以下 5 条链。

(1)PREROUTING 链:在数据包进入防火墙之后,路由判断之前改变数据包。

(2)POSTROUTING 链:在数据包确定了目标地址后,也就是所有路由判断之后改变数

提 示

Linux 从初学到精通

500

据包。

(3)OUTPUT 链:在确定数据包的目的地之前改变数据包。

(4)INPUT 链:在数据包进入本机之后,应用程序接受之前改变数据包。

(5)FORWARD 链:第一次路由判断之后, 后一次路由判断之前改变数据包。

IPTables 的所有链里有三条链可以改变数据包的目的地址及源地址,分别是 nat 表的

PREROUTING 链、nat 表的 POSTROUTING 链和 nat 表的 OUTPUT 链。

19.1.4 raw 表

raw 表使用在 PREROUTING 链和 OUTPUT 链上,一旦用户使用了 raw 表,在某个链上

raw 表处理完后,将跳过 NAT 表和状态跟踪处理,即不再做地址转换和数据包的链接跟踪处

理。raw 表一般应用在内网访问 DMZ 区域的情况,能加速防火墙的处理速度。

IPTables 状态机制

netfilter/iptables 的 大优点是其可以配置有状态的防火墙。有状态的防火墙能够指定并

记住为发送或接收信息包所建立的连接的状态。防火墙可以从信息包的连接跟踪状态获得该

信息。在决定新的信息包过滤时,防火墙所使用的这些状态信息可以增加其效率和速度。在

IPTables 中可以识别数据包五种不同状态相关联,这五种状态分别是 NEW、ESTABLISHED、

RELATED、INVALID、UNTRACKED(除了本机产生的数据包由 nat 表的 OUTPUT 链处理

外,所有连接跟踪都是在 nat 表的 PREROUTING 链中进行处理的,也就是说 IPTables 会在

nat 表的 PREROUTING 链里重新计算所有数据包的状态。如果发送一个流的初始化数据包,

状态就会在 nat 表的 OUTPUT 链里被设置为 NEW,当收到回应的数据包时,状态就会在 nat

表的 PERROUTING 链里被设置为 ESTABLISHED,如果第一个数据包不是本机生成的,那

就会在 nat 表的 PERROUTING 链里被设置为 NEW 状态,所以所有状态的改变和计算都是在

nat 表中的表链和 OUTPUT 链里完成的)。

19.2.1 NEW 状态

NEW 状态的数据包说明这个数据包是收到的第一个数据包。如收到一个 SYN 数据包,

其是连接的第一个数据包,就会匹配 NEW 状态。第一个包也可能不是 SYN 包,但仍会被认

为是 NEW 状态(如先使用 SSH 登录远程主机,然后再开启 IPTables 防火墙,然后继续对远

程主机操作。在开启防火墙后,防火墙看到的第一个数据包就不是带 SYN 标志的数据包,这

样的数据包也是 NEW 状态的数据包)。这样的数据包是不安全的,关于这种情况在后述内容

会介绍通过策略阻止这样的数据包通过防火墙。

不管是 TCP、UDP 还是 ICMP 协议,请求被认为 NEW,应答是 ESTABLISHED。也就

是说,当防火墙看到一个请求包时,就认为连接处于 NEW 状态,当有应答时,就是

提 示

看家护院—IPTables 防火墙配置 第

501

19

ESTABLISHED 状态。

19.2.2 ESTABLISHED 状态

只要发送并接到应答,一个数据连接就从 NEW 变为 ESTABLISHED,而且该状态会继

续匹配这个连接的后继数据包(不管这个数据包是发往防火墙所在主机,还是要由防火墙转

发)。ICMP 的错误和重定向等信息包也被看做 ESTABLISHED,只要数据包是所发出的信息

的应答。

19.2.3 RELATED 状态

当一个连接和某个已处于 ESTABLISHED 状态的连接有关系时,就被认为是 RELATED,

也就是说一个连接要想是 RELATED 的,首先要有一个 ESTABLISHED 的连接,这个

ESTABLISHED 连接再产生一个主连接之外的连接,这个新的连接就是 RELATED。FTP 是

个很好的例子,FTP 的数据连接就是 FTP 控制的 RELATED 状态。再比如 ICMP 重要的作用

是告诉 UDP、TCP 连接或正在努力建立的连接发生了什么,这时 ICMP 应答被认为是

RELATED,主机不可达和网络不可达就是这样的例子,当试图连接某台机子不成功时,数据

包所到达的 后一台路由器就会返回以上的 ICMP 信息,这些 ICMP 信息就是 RELATED 的

状态,如果主机回应一个数据包,那么这时数据包的状态就是 ESTABLISHED。

19.2.4 INVALID 状态

INVALID 状态说明数据包不能被识别属于哪个连接或没有任何状态。如内存溢出,收到

不知属于哪个连接的 ICMP 错误信息,一般删除应 DROP 这个状态的任何数据。

19.2.5 UNTRACKED 状态

表示该数据的 RELATED 状态将被防火墙忽略,不会进行状态跟踪。

IPTables 配置

netfilter/iptables 作为一个防火墙并不能自己识别哪些数据包可以通过,哪些数据包不能

通过,必须通过合理的配置后,才能让 netfilter/iptables 可以发挥防火墙的功能。

19.3.1 IPTables 开启与关闭

在 RHEL 5.x 的安装过程中默认是将防火墙设置为开启状态,也可以通过

“system-config-securitylevel”命令(或“system-config-securitylevel-tui”命令)修改防火墙状

态(如图 19-4 所示)。在配置防火墙运行状态时 Disable 表示将防火墙的默认策略修改为允许

所有通信,“Enable”将防火墙默认策略修改为阻止所有通信,但在“Trusted services”中勾

选的除外(在“Trusted services”中只有一些常见的协议,也可以通过“Other port”自定义

Linux 从初学到精通

502

端口)。实际对 IPTables 策略配置不太熟悉的情况下完全可以使用该工具进行配置。

图 19-4 system-config-securitylevel

19.3.2 IPTables 策略配置

在配置 IPTables 时 主要的工作就是配置相关策略。策略就是决定如何处理一个数据包

的语句。如果一个数据包符合策略中的条件,IPTables 就会根据策略中定义的 target 或 jump

指令对数据包进行处理。在一条链上对不同的连接和数据包阻止或允许它们去向何处,插入

链的每一行都是一条策略。

IPTables 在进行策略匹配时一般会自上而下找且只找第一条满足条件的策略(LOG 及一

些跳转除外),如果没有匹配规则就会使用默认规则,因此在定义 IPTables 策略时一定要注意

策略的顺序(一般应将匹配条件越严格的策略越靠前)。定义 IPTables 策略使用 iptables 命令,

该命令格式如下。

iptables [-t 表名] 管理选项 [链名] [匹配条件] [ -j 目标动作或跳转]

因为 Linux 系统在默认情况下不允许数据包的转发,因此当 IPTables 被用来作为网络

边界节点,需要涉及数据包转发时,需要将/etc/sysct.conf 文件中的 net.ipv4.ip_forward 参数

值修改为 1,或将“echo 1 > /proc/sys/net/ipv4/ip_forward”写入/etc/rc.d/rc.local 文件后,重

新启动系统。当然如果采用第一种方法修改时,可运行“sysctl -p”,采用第二种方法修改

时,可运行“/etc/rc.d/rc.local”使参数修改在不重新启动时生效。

其中“-t 表名”用于指明需要操作的表,可以指定的表包括 filter、nat、mangle、raw,

不指定该参数时默认是操作 filter 表;“管理选项”IPTables 所做的操作,如是要增加一条规

提 示

看家护院—IPTables 防火墙配置 第

503

19

则还是要删除已存在的一条规则;匹配条件详细地描述一个数据包的特点,如指定一个数据

包的源地址、目的地址所使用的协议、端口等;“-j 目标动作或跳转”用于当数据包符合“匹

配条件”的描述时,通过的目标或跳转来处理数据包,如是丢弃还是允许。

1.管理选项 在 iptables 命令中定义其管理选项时,可使用以下管理选项。

(1)-L:显示所选链的所有策略。如果没有指定链则显示指定表中的所有链,如果没有

指定表及链则显示默认表(filter 表)所有的链。在如下内容中“Chain INPUT (policy ACCEPT)”

表示其下显示的为 INPUT 链中定义的策略,其中“(policy ACCEPT)”说明该链的默认策略

为 ACCEPT(允许)。

显示 filter 表所有的链的所有策略。

[root@fw ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination DROP all -- 192.168.159.1 anywhere DROP tcp -- 192.168.158.0/24 anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination

将 IP 地址和端口以数值的形式显示。

[root@fw ~]# iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination DROP all -- 192.168.159.1 0.0.0.0/0 DROP tcp -- 192.168.158.0/24 0.0.0.0/0 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination

显示策略时,显示序号。

[root@fw ~]# iptables -L --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP all -- 192.168.159.1 anywhere 2 DROP tcp -- 192.168.158.0/24 anywhere Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination

(2)-A <链名称>:在所选择的链 尾部添加一条新的策略。下面的例子中将在 filter 表

的 INPUT 链中 尾部添加一新的策略。

显示 filter 表所有的链的所有策略。 [root@fw ~]# iptables -L

Linux 从初学到精通

504

Chain INPUT (policy ACCEPT) target prot opt source destination DROP all -- 192.168.159.1 anywhere DROP tcp -- 192.168.158.0/24 anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination

在 filter 表的 INPUT 链中 尾部添加一新的策略。

[root@fw ~]# iptables -t filter -A INPUT -s 192.168.157.0/24 -p udp -j DROP [root@fw ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination DROP all -- 192.168.159.1 anywhere DROP tcp -- 192.168.158.0/24 anywhere DROP udp -- 192.168.157.0/24 anywhere #新增的策略。 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination

(3)-D <链名称> <策略内容|策略序号>:从所选链中删除策略。可以通过将策略的内容

完整地写出来或指定策略在所选链中序号(每条链的策略都各自从 1 被编号)的方式指定需

要删除的策略。下面的例子中将在 filter 表的 INPUT 链中序号为 3 策略删除。

显示 filter 表所有的链的所有策略。

[root@fw ~]# iptables -L --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP all -- 192.168.159.1 anywhere 2 DROP tcp -- 192.168.158.0/24 anywhere 3 DROP udp -- 192.168.157.0/24 anywhere Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination

将在 filter 表的 INPUT 链中策略 3 删除。

[root@fw ~]# iptables -t filter -D INPUT 3 [root@fw ~]# iptables -L --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP all -- 192.168.159.1 anywhere 2 DROP tcp -- 192.168.158.0/24 anywhere Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination

(4)-R<链名称> <策略序号>:替换所选中的链里指定的策略。下面的例子中将在 filter

表的 INPUT 链中序号为 3 策略替换。

看家护院—IPTables 防火墙配置 第

505

19

显示 filter 表所有的链的所有策略。

[root@fw ~]# iptables -L --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP all -- 192.168.159.1 anywhere 2 DROP tcp -- 192.168.158.0/24 anywhere Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination

在 filter 表的 INPUT 链中序号为 3 策略替换。

[root@fw ~]# iptables -t filter -R INPUT 2 -s 192.168.159.200 -j DROP [root@fw ~]# iptables -L --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP all -- 192.168.159.1 anywhere 2 DROP all -- 192.168.159.200 anywhere Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination

(5)-I<链名称> <策略序号>:从所选链中指定策略前面插入一条新的策略。下面的例子

中将在 filter 表的 INPUT 链中序号为 2 策略前面插入一条新的策略。

显示 filter 表所有的链的所有策略。

[root@fw ~]# iptables -L --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP all -- 192.168.159.1 anywhere 2 DROP all -- 192.168.159.200 anywhere Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination

在 filter 表的 INPUT 链中序号为 2 策略前面插入一条新的策略。

[root@fw ~]# iptables -t filter -I INPUT 2 -s 192.168.159.188 -j DROP [root@fw ~]# iptables -L --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP all -- 192.168.159.1 anywhere 2 DROP all -- 192.168.159.188 anywhere 3 DROP all -- 192.168.159.200 anywhere Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination

(6)-F [链名称]:清空所选链的策略,如果没有指定链,则清空指定表中的所有链。如

Linux 从初学到精通

506

果没有指定表及链则显示默认表(filter 表)所有的链。下面的例子中将在 filter 表的 INPUT

链中所有策略清除。

显示 filter 表所有的链的所有策略。

[root@fw ~]# iptables -L --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination 1 DROP all -- 192.168.159.1 anywhere 2 DROP all -- 192.168.159.188 anywhere 3 DROP all -- 192.168.159.200 anywhere Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination

在 filter 表的 INPUT 链中所有策略清除。

[root@fw ~]# iptables -F INPUT [root@fw ~]# iptables -L --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination

(7)-Z [链名称]:将所选链的所有计数器归零,如果没有指定链,则将指定表所有链中

计数器归零。下面的例子中将在 filter 表的 INPUT 链所有计数器归零。

iptables -t filter -Z INPUT

(8)-X [链名称]:删除指定的用户自定义链。在删除时这个链必须没有被引用。如果没

有指定链名称,则删除所有自定义链。如果没有指定表及链则删除默认表所有自定义链。下

面的例子中将在 filter 表的所有自定义链删除。

iptables -t filter -X

(9)-P <链名称>:为链设置默认的策略,如 ACCEPT、DROP,所有不符合策略的数据

包都被强制使用这个策略。下面的例子中将在 filter 表的 INPUT 链定义默认策略为 DROP。

在 filter 表的 INPUT 链中所有策略清除。

[root@fw ~]# iptables -L --line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination

将 filter 表的 INPUT 链默认策略设定为 DROP。

[root@fw ~]# iptables -P INPUT DROP [root@fw ~]# iptables -L --line-numbers

看家护院—IPTables 防火墙配置 第

507

19Chain INPUT (policy DROP) num target prot opt source destination Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination

2.匹配条件 在 IPTables 命令中描述一个匹配条件时,可使用以下参数。

(1)-p [!] [<tcp|udp|icmp|…>]:匹配指定的协议。在指定协议时应该注意:协议名称名字

不分大小写,但必须是在/etc/protocols 中定义过;当不使用“-p”参数指定协议时,默认为

ALL(只代表匹配 TCP、UDP、ICMP 协议);在指定协议时,可以在协议前加感叹号表示取

反(在感叹号与协议名之间必须有空格),如“-p ! tcp”表示非 TCP 协议。

阻止源 IP 地址为 192.168.159.200 到本机的所有 UDP 通信。

[root@fw ~]# iptables -t filter -A INPUT -p udp -s 192.168.159.200 -j DROP

阻止源 IP 地址为 192.168.159.201 到本机的所有非 TCP 通信。

[root@fw ~]# iptables -t filter -A INPUT -p ! tcp -s 192.168.159.201 -j DROP

(2)-s <IP 地址>:匹配指定的 IP 源地址匹配数据包,使用“-s”参数时,IP 地址可用定

义方法见表 19-2。

表 19-2 IP 地址定义方法

IP 地址定义方法 示例 满足示例的条件

IP 指定单一主机 192.168.159.10 IP 地址为 192.168.159.10

指定网段 192.168.159.0/255.255.255.0

指定网段 192.168.159.0/24

IP 地址所在网段为 192.168.159.0/24

(3)-d <IP 地址>:匹配指定的 IP 目标地址匹配数据包,使用“-d”参数其中 IP 地址可

用定义方法见表 19-2。

阻止目标 IP 地址为 192.168.159.99 的所有通信。

[root@fw ~]# iptables -t filter -A OUTPUT -d 192.168.159.99 -j DROP

阻止目标 IP 地址属于 192.168.158.0/24 网段的所有通信。

[root@fw ~]# iptables -t filter -A OUTPUT -d 192.168.158.0/24 -j DROP

(4)-i <网络接口>:以数据包进入本地所使用的网络接口来匹配数据包。这个匹配操作

只能用于 INPUT、FORWARD 和 PREROUTING 这三个链。在指定网络接口时应该注意:指

定时使用网络接口名称,如 eth0、ppp0;使用加号作为通配符时,如果直接用一个加号,如

iptables -A INPUT -i +表示匹配所有的包,而不考虑使用哪个接口,这也是用-i 参数的默认行

为。通配符还可以放在某一类接口的后面,如 eth+表示所有 Ethernet 接口;在接口前加感叹

号表示取反(注意空格),如“-i ! eth0”意思是匹配来自除 eth0 外的所有包;“lo”表示本地

Linux 从初学到精通

508

回环地址。在下面的例子中将阻止从 eth0 进入的源 IP 地址为 192.168.159.99 的所有通信。

[root@fw ~]# iptables -t filter -A INPUT -i eth0 -s 192.168.159.99 -j DROP

(5)-o <网络接口>:以数据包离开本地所使用的网络接口来匹配数据包。该参数配置方

法与“-i”参数相同。

(6)--sport <端口>:基于数据包的源端口来匹配数据包。在指定端口时应该注意:该参

数必须与-p 参数配合使用;不指定“--sport”参数时,表示所有端口;可以使用连续的端口,

如“--sport 1000:1024”表示从 1000 到 1024 的所有端口(包括 1000、1024),“--sport 1024:1000”

和“--sport 1000:1024”的效果相同;当省略第一个冒号时,默认从端口 0 开始,如“--sport :1000”

表示从 0 到 1000 的所有端口;当省略第二个冒号时,默认是 65535,如“--sport 1000:”表示

从 1000 到 65535 的所有端口;在端口号前加感叹号表示取反(在感叹号与端口号之间必须有

空格),如“--sport ! 1000”表示除 1000 号之外的所有端口,“--sport ! 1000:1024”表示从 1000

到 1024 的所有端口(包括 1000、1024)之外的所有端口。

阻止源端口为 1024 的所有 TCP 通信。

[root@fw ~]# iptables -t filter -A INPUT -p tcp --sport 1024 -j DROP

阻止源端口大于等于 1024 且小于等于 5000 的所有 TCP 通信。

[root@fw ~]# iptables -t filter -A INPUT -p tcp --sport 1024:5000 -j DROP

(7)--dport <端口>:基于数据包的目的端口来匹配包,该参数配置方法与“—sport”参

数相同。

(8)-m multiport --sport <端口>:源端口多端口匹配, 多可以指定 15 个端口,使用逗

号分隔。该参数必须与“-p”参数配合使用。在下面的例子中阻止源端口为 139 和 445 的所

有 TCP 通信。

[root@fw ~]# iptables -t filter -A INPUT -p tcp -m multiport --sport 139, 445-j DROP

(9)-m multiport --dport <端口>:目的端口多端口匹配, 多可以指定 15 个端口,以逗

号分隔。该参数必须与-p 参数配合使用。在下面的例子中阻止目标端口为 139 和 445 的所有

TCP 通信。

[root@fw ~]# iptables -t filter -A OUTPUT -p tcp -m multiport --dport 139, 445-j DROP

(10)-m --limit <匹配次数/时间>:该参数可以对指定的规则的日志数量加以限制,以免

系统记录大量重复的日志信息。如可以事先设定一个限定值,当符合条件的数据包的数量不

超过时才记录,超过就不记录。这样可以控制某条规则在一段时间内的匹配次数(也就是可

以匹配的数据包的数量),在一定程度上减少 DoS syn flood 攻击的影响。该参数的形式是一

个数值加一个时间单位,可以是“/second”、“/minute”、“/hour”、“/day”。默认值是每小时 3

次。

[root@fw ~]# iptables -A INPUT -m limit --limit 5/hour

(11)--limit-burst <次数>:定义--limit 的峰值,就是在单位时间(这个时间由上面的--limit

指定)内 多可匹配几个包(--limit-burst 的值一定要比--limit 的大),默认值是 5。这个参数

看家护院—IPTables 防火墙配置 第

509

19

定义了当前策略的峰值,也就是单位时间内匹配的数据包的 大数量,每匹配一个,数值就

减 1,直到 0 为止,新来的数据包将不被进行匹配操作,也可以将这一数值理解为允许建立

连接的阀值。

[root@fw ~]# iptables -A INPUT -m limit --limit-burst 5

(12)--limit <频率数值/时间>:这个参数定义了一个相当于频率的概念,当“--limit-burst”

定义的数值被耗尽,在单位时间内是会得到适当的补充的,这个频率和数量就是在 “--limit”

中定义的。该参数的形式是一个数值加一个时间单位,可以是“/second”、“/minute”、“/hour”、

“/day”。

[root@fw ~]# iptables -A INPUT -p tcp --dport 80 -m limit --limit 10/second \ --limit-burst 200 -j ACCEPT

上面语句的作用是将 80 端口对外开放,系统资源允许每秒新建立 250 个会话,主机通过

IPTables 设置了能够提供每秒 200 个新会话的容量(通常情况下,需要为服务器或主机本身

考虑一定的冗余),在正常情况下,这个数值完全能够满足应用的要求,但如果有某个攻击者

对主机的 80 端口进行拒绝服务攻击,每秒 200 个新会话的容量也许很快就被耗尽了。对于一

个没有保护措施的主机系统马上就会瘫痪,但由于设置了一定的保护措施,即便有攻击过来,

在 IPTables 这一关就会被丢弃。在这之后,IPTables 会每秒重新给主机 10 个新的会话额度,

使之能够处理新的连接。在新来的连接请求中,有正常的连接请求,也有一些是攻击。但无

论如何通过这种方式,保证了服务器始终不会被攻瘫掉。在更有效的应对拒绝服务攻击的新

技术出现以前,这也许是 有效的方法。

(13)-m --mac-source <MAC 地址>:基于数据包的源 MAC 地址匹配数据包,MAC 地址

格式是 XX:XX:XX:XX:XX:XX ,当然它也可以用感叹号取反,如“ --mac-source !

00:50:56:C0:00:02”,就是除此 MAC 地址以外的地址。由于 MAC 地址只用于 Ethernet 类型的

网络,所以该参数只能用于 Ethernet 网络接口,而且只能在 PREROUTING、FORWARD 和

INPUT 链中使用。

[root@fw ~]# iptables -t filter -A INPUT -m mac -mac-source 00:50:56:C0:00:02 -j DROP

上面语句的作用是阻止源 MAC 地址为“00:50:56:C0:00:02”到本机的所有通信。

“--mac-source”参数一个很好的应用就是可以进行 IP 地址和 MAC 地址的绑定,对于一些安

全要求较高的网络,这是一个非常有效的配置策略。如下面的例子将允许源 IP 地址为

“192.168.159.200”,源 MAC 地址为“00:50:56:C0:00:01”的主机发出的数据包通过 IPTables。 [root@fw ~]# iptables -A FORWARD -s 192.168.159.200 -m mac \ -mac-source 00:50:56:C0:00:01 -j DROP

(14)-m --state <状态列表>:匹配数据包的状态,多个状态使用逗号分隔。下面的例子

将允许连接本机的 FTP 服务器(使用 IPTables 对 FTP 或 TFTP 进行状态检查还需要使用

modprobe 载入 ip_conntrack-ftp、ip_conntrack_tftp、ip_nat_ftp、ip_nat_tftp 内核模块,这些内

核模块位于/lib/modules/$(uname -r)/kernel/net/ipv4/netfilter 目录中)。

[root@fw ~]# iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT [root@fw ~]# iptables -t filter -A OUTPUT -m state --state ESTABLISHED,RELATED \

Linux 从初学到精通

510

-j ACCEPT [root@fw ~]# iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED \ -j ACCEPT

(15)-m iprange:匹配一个 IP 地址范围,使用“-m iprange”结合“--src-range 源 IP 范

围”或者“--dst-range 目标 IP 范围”的形式,以“-”符号连接起始 IP 地址、结束 IP 地址。

在下面的例子中将阻止源地址为“192.168.159.20-192.168.159.200”任何一个到本机 UDP 53

端口的通信。

[root@fw ~]# iptables -t filter -A INPUT -p udp --dport 53 -m iprange --src-range \ 192.168.159.20-192.168.159.200 -j DROP

(16)--icmp-type <类型数值>:根据 ICMP 类型匹配包,类型的指定可以使用十进制数值,

这个匹配也可用感叹号取反。在下面的例子将允许其他主机与本地主机互相使用 ping 命令。

[root@fw ~]# iptables -t filter -A INPUT -p icmp --icmp-type 8 -j ACCEPT [root@fw ~]# iptables -t filter -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT [root@fw ~]# iptables -t filter -A INPUT -p icmp --icmp-type 0 -j ACCEPT [root@fw ~]# iptables -t filter -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT

(17)--ttl 根据 TTL 的值来匹配数据包,参数使用十进制数值。下面的例子将阻止 TTL

值为 127 的数据包。

[root@fw ~]# iptables -A OUTPUT -m ttl --ttl 127 -j DROP

3.目标动作或跳转

在 iptables 命令中定义其目标动作或跳转时,可使用以下目标动作或跳转。

(1)ACCEPT:没有任何选项和参数,直接使用“-j ACCEPT”表示一旦数据包满足了指

定的匹配条件,就会被允许,并且不会再去匹配当前链中的其他规则或同一个表内的其他规

则,但数据包还要通过其他表中的链。

(2)DNAT:用于进行目标网络地址转换,就是重写数据包的目标 IP 地址。如果一个数

据包被匹配,那么属于同一个流的所有的包都会被自动转换,然后就可以被路由到正确的主

机或网络。DNAT 在实际工作中非常有用。如一台 Web 服务器位于局域网,而且没有可在

Internet 上使用的真实 IP 地址,这时就可以使用 DNAT 让防火墙把所有到它自己 HTTP 端口

的包转发给局域网内部真正的 Web 服务器。目的地址也可以是一个范围,这样 DNAT 会为每

一个流随机分配一个 IP 地址(这样可以实现负载均衡)。DNAT 只能在 nat 表的 PREROUTING

和 OUTPUT 链中使用,或是在被这两条链调用的链中使用。DNAT 需要使用--to-dest 参数指

定写入 IP 包头的地址(也就是数据包要被转发到的地方)。

[root@fw ~]# iptables -t nat -A PREROUTING -p tcp -d 202.103.159.5 --dport 80 \ -j DNAT -to-dest 192.168.159.10-192.168.159.15

在上面的例子就是把所有发往地址202.103.159.5的数据包都转发到局域网使用的私有地

址中(192.168.159.10-192.168.159.15)。在这种情况下,每个数据流都会被随机分配一个要转

发到的地址,但同一个数据流总是使用同一个地址,也可以只指定一个 IP 地址作为参数,这

样所有的数据包都被转发到同一台主机。还可以在地址后指定一个或一个范围的端口,如

“--to-dest 192.168.159.10:80”或“--to-dest 192.168.159.10:80-100”(在指定端口时首先需要使

看家护院—IPTables 防火墙配置 第

511

19

用-p 参数指定协议)。

(3)SNAT:用于进行源网络地址转换,就是重写数据包的源 IP 地址。SNAT 需要使用

“--to-source”参数指定写入 IP 包头的地址,SNAT 的其他语法与 DNAT 相同。SNAT 只能有 nat

表的“POSTROUTING”链使用。在下面的例子中将内部网络的“192.168.159.0/24”网段通过

NAT 转换为“202.103.159.5”,这样内部网络的主机就可以使用一个公有 IP 地址共享上网。

[root@fw ~]# iptables -t nat -A POSTROUTING -s 192.168.159.0/24 -j SNAT \ --to-source 202.103.159.5

(4)DROP:如果数据包符合条件,这个目标就会把数据包阻止。在某些情况下,这个

目标会引起意外的结果,因为 DROP 不会向发送者返回任何信息,也不会向路由器返回信息,

这就可能会使连接的另一方的 sockets 一直等回应。解决这个问题的较好的办法是使用

REJECT(因为 REJECT 在丢弃包的同时还会向发送者返回一个错误信息,这样另一方就能

正常结束),尤其是在阻止端口扫描工具获得更多的信息时,可以隐蔽被过滤掉的端口等(因

为扫描工具扫描一个端口时,如果没有返回信息,一般会认为端口未打开或被防火墙等设备

过滤掉了)。在下面的例子中第一行将阻止所有源地址为“192.168.0.159/24”网段的通信,

而且不会返回任何消息),第二行将阻止所有源地址为“192.168.158.0/24”网段的通信,并

返回任何消息。

[root@fw ~]# iptables -t filter -A INPUT -s 192.168.159.0/24 -j DROP [root@fw ~]# iptables -t filter -A INPUT -s 192.168.158.0/24 -j REJECT

(5)MASQUERADE:该目标与 SNAT 作用相同,只是使用该目标时不需要指明

“--to-source”。MASQUERADE 是被专门设计用于那些动态获取 IP 地址的连接(如拨号上网

等),如果有固定的 IP 地址,推荐直接使用 SNAT(也可以使用 MASQUERADE),和 SNAT

一样,只能用于 nat 表的 POSTROUTING 链,MASQUERADE 只有一个参数(不是必需的),

“--to-ports”用于指定端口,使用该参数时必须配合“-p”使用。

[root@fw ~]# iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE \ --to-ports 1024-5000

(6)REDIRECT:在防火墙所在的主机内部转发数据包或流到另一个端口(比如,把所

有去往端口 HTTP 的包 REDIRECT 到 HTTP 代理),当然这都发生在主机内部。本地生成的

数据包都会被映射到 127.0.0.1,换句话说,这个目标把要转发的数据包的目的地址改写为本

机主机的 IP。在实现透明代理时就需要使用该目标(局域网内的主机不需要知道代理服务器

的存在就可以正常上网被称为透明代理)。该目标只能用在 nat 表的 PREROUTING、OUTPUT

链和被它们调用的自定义链使用。REDIRECT 只有一个选项“--to-ports”用于指定端口(可

以使用“--to-ports 8080-8888”的方式指定一个端口范围)。在下面的例子中将本机 TCP 的 80

端口收到的数据包转发到本机的 8080 端口。

[root@fw ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT \ --to-ports 8080

(7)REJECT:REJECT 和 DROP 作用相同,区别在于它除了阻止数据包之外,还向发

送者返回错误信息。该目标只能用在 INPUT、FORWARD、OUTPUT,而且包含 REJECT 的

Linux 从初学到精通

512

链也只能被它们调用,否则不能发挥作用。REJECT 只有一个选项“--reject-with”用于控制

返回的错误信息的类型。

[root@fw ~]# iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset

(8)NOTRACK:不进行状态跟踪。NOTRACK 就是用于 RAW 表中指定不进行跟踪。

[root@fw ~]# iptables -t raw -A PREROUTING -i eth0 -o eth1 -p tcp --dport 80 \ -j NOTRACK

(9)TTL:修改 IP 头中 Time To Live 字段的值。该目标只能在 mangle 表内使用,它有

以下 3 个选项。

--ttl-set:设置 TTL 的值。在下面的例子中将从“eth0”进入的数据包 TTL 值修改为

230。

[root@fw ~]# iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-set 30

--ttl-dec:设置将当前 TTL 减掉的一个值。如将--ttl-dec 设置为 3,假设一个 TTL 是

23 的数据包进入 IPTables 所在主机,那么当数据包离开时 TTL 就变为 19(为什么

不是 20 呢?因为经过主机后,TTL 本身就要减 1)。使用这个目标可以限制“使用

主机服务的用户”离主机有多远。

[root@fw ~]# iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-dec 3

--ttl-inc:设置将当前 TTL 增加的一个值。如将--ttl-inc 设置为 4,假设一个 TTL 是

23 的数据包进入 IPTables 所在主机,那么当数据包离开主机时 TTL 就变为 26。使

用这个选项可以使防火墙更加隐蔽,而不被发现,方法就是设置--ttl-inc 1(数据包

每经过一个设备,TTL 就要自动减 1,但数据包通过防火墙时被补了 1,也就是说

TTL 的值没变)。

[root@fw ~]# iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-inc 1

(10)LOG:如果数据包符合条件,这个目标是专门用来记录数据包的相关信息(这些

信息可能是非法的)。LOG 会返回数据包的有关细节(IP 头的大部分和其他有用的信息)。这

个功能是通过内核的日志工具完成的,一般是 syslogd。LOG 可用于调试策略,对生产环境

中的服务器进行调试时,可以先使用 LOG 代替 DROP 检查策略配置是否正确。LOG 可以使

用以下几个参数。

--log-level:指定记录的等级。

[root@fw ~]# iptables -t filter -A FORWARD -p tcp -j LOG --log-level debug

--log-prefix:指定在记录的信息之前加上指定的前缀(这样便于在查看日志时使用

grep 或其他工具一起使用时就容易追踪特定的问题)。前缀 多能有 29 个英文字符。

[root@fw ~]# iptables -t filter -A INPUT -p tcp -j LOG --log-prefix "fwlog"

--log-tcp-sequence:把数据包的 TCP 序列号和其他日志信息一起记录。TCP 序列号

可以唯一标识一个包,在重组时也是用它来确定每个分组在包里的位置(这个选项

看家护院—IPTables 防火墙配置 第

513

19

可能会带来潜在的危险,因为这些记录如果被未授权的用户查看,可能会使其更容

易破坏系统。其实任何 IPTables 的输出信息都增加了这种危险)。

[root@fw ~]# iptables -t filter -A INPUT -p tcp -j LOG --log-tcp-sequence

通过 LOG 相关参数灵活地记录相关日志,在下面的例子中使用 LOG 将 80、21、22、53

四个端口的访问以不同的前缀记录。

[root@fw ~]# iptables -A INPUT -p tcp --dport 80 -j LOG \ --log-prefix "iptables_80_alert" --log-level info [root@fw ~]# iptables -A INPUT -p tcp --dport 21 -j LOG \ --log-prefix "iptables_21_alert" --log-level info [root@fw ~]# iptables -A INPUT -p tcp --dport 22 -j LOG \ --log-prefix "iptables_22_alert" --log-level info [root@fw ~]# iptables -A INPUT -p tcp --dport 53 -j LOG \ --log-prefix "iptables_53_alert" --log-level info

4.配置方法 在 iptables 命令定义各种策略后,需要使用以下两种方法中的一种使策略永久生效,否

则在重新启动计算机后,配置的策略会丢失。

(1)使用命令。在使用 IPTables 修改了策略后,需要使用“service iptables save”命令让

策略永久生效,否则在下次重新启动后,策略会丢失。实际上该命令就是将所配置的策略保

存到 /etc/sysconfig/iptables 文件中(在使用如下命令后,有时需要过一会才会在

/etc/sysconfig/iptables 文件中反应)。

[root@fw ~]# service iptables save [root@fw ~]# cat /etc/sysconfig/iptables # Generated by iptables-save v1.3.5 on Fri Feb 12 20:55:48 2010 *filter :INPUT ACCEPT [264:21590] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [693:71372] -A INPUT -p tcp -m tcp --dport 21 -m iprange --src-range 192.168.1.20-192.168.1.99 -j

DROP -A INPUT -s 192.168.159.200 -p udp -j DROP -A INPUT -s 192.168.159.201 -p ! tcp -j DROP COMMIT # Completed on Fri Feb 12 20:55:48 2010

(2)使用脚本。将所有的 iptables 命令编写一个脚本,然后每次开机时运行该脚本(在

/etc/rc.d/rc.local 文件调用)。下面就是一个脚本的例子。

#!/bin/bash #清除 filter、net表所有策略及计数器。 /sbin/iptables -t filter -F /sbin/iptables -t filter -Z /sbin/iptables -t filter -X /sbin/iptables -t nat -F /sbin/iptables -t nat -Z /sbin/iptables -t nat -X

Linux 从初学到精通

514

#定义 filter、net表默认策略。 /sbin/iptables -t filter -P INPUT DROP /sbin/iptables -t filter -P OUTPUT DROP /sbin/iptables -t filter -P FORWARD ACCEPT /sbin/iptables -t nat -P OUTPUT ACCEPT /sbin/iptables -t nat -P PREROUTING ACCEPT /sbin/iptables --t nat P POSTROUTING ACCEPT /bin/echo "1" > /proc/sys/net/ipv4/ip_forward #允许 IP转发。 #装载内核模块。 modprobe ip_conntrack-ftp modprobe ip_nat_ftp #允许本机的所有通信。 /sbin/iptables -t filter -A INPUT -i lo -j ACCEPT /sbin/iptables -t filter -A OUTPUT -o lo -j ACCEPT #允许 ping。 /sbin/iptables -t filter -A INPUT -p icmp --icmp-type 8 -j ACCEPT /sbin/iptables -t filter -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT /sbin/iptables -t filter -A INPUT -p icmp --icmp-type 0 -j ACCEPT /sbin/iptables -t filter -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT #允许查询本机的 DNS服务。 /sbin/iptables -A OUTPUT -o eth0 -p udp --dport 53 -j ACCEPT /sbin/iptables -A INPUT -i eth0 -p udp --sport 53 -j ACCEPT #允许访问本机的 FTP服务。 /sbin/iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT /sbin/iptables -t filter -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT /sbin/iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

假设该脚本保存在/myscript 目录中名为 iptables.sh,为了让这些策略每次启动后都生效,

可以选择以下命令并将其加入“/etc/rc.d/rc.local”文件。

/bin/sh /myscript/iptables.sh

19.3.3 Firewall Builder

如果 RHEL 5.x 中提供的“system-config-securitylevel”功能较为简单,在配置 IPTables

策略并不能完全满足配置的需要。 Firewall Builder ( Firewall Builder 官方网站:

http://www.fwbuilder.org/)是一种与厂商无关的防火墙配置和管理软件,Firewall Builder 软件

支持 Linux、Windows 和 MacOS。Firewall Builder 支持 OpenBSD 数据包过滤、Cisco PIX 系

列安全设备及在 Linux 下使用的 IPTables 软件。Firewall Builder 中被称为策略编译器的程序

组件,能对不同的防火墙策略很容易地进行精确调整,而不需要管理员记住所有服务器防火

墙的细节。策略编译器还确保防火墙是健全的,即没有任何可能对用户正常使用网络造成影

响的冲突和错误。Firewall Builder 遵从一种双授权机制,一种是商业惯例的授权,另一种是

GNU 公共授权(GPL)。

看家护院—IPTables 防火墙配置 第

515

19

1.Firewall Builder 安装 Firewall Builder 提供了 RPM 包,可直接通过以下 rpm 包进行安装。具体步骤如下。

[root@fw ~]# cd [root@fw ~]# mkdir fb [root@fw ~]# cd fb [root@fw ~]# wget http://nchc.dl.sourceforge.net/project/fwbuilder/Current_Packages/3.0.7/fwbuilder-3

.0.7-b1516.el53.i386.rpm [root@fw ~]# wget http://nchc.dl.sourceforge.net/project/fwbuilder/Current_Packages/3.0.7/libfwbuilde

r-3.0.7-b1516.el53.i386.rpm [root@fw ~]# rpm -ivh *.rpm

2.Firewall Builder 关联 IPTables 启动 Firewall Builder 工具可以通过图形界面(如图 19-5 所示),也可通过“fwbuilder”

命令。

图 19-5 Firewall Builder主界面

Firewall Builder 并不是一个专门为 IPTables 进行策略配置的工具,Firewall Builder 还支

持其他很多种防火墙。为了让 Firewall Builder 生成 IPTables 的策略,首先需要建立与 IPTables

关联,具体步骤如下。

(1)在“Firewalls”上的右键菜单中选择“New Firewall”,如图 19-6 所示。

Linux 从初学到精通

516

图 19-6 新建防火墙

(2)根据需要输入一个名称,选择防火墙为“IPTables”、操作系统为“Linux 2.4/2.6”,

勾选“Use preconfigured template firewall objects”后,单击“Next”按钮,如图 19-7 所示。

图 19-7 选择防火墙类型及操作系统版本

(3)选择 IPTables 所在的网络环境,在此选择“host fw template 1”,单击“Next”按钮,

如图 19-8 所示。

看家护院—IPTables 防火墙配置 第

517

19

图 19-8 选择 IPTables所处网络环境

(4)在单击“Finish”按钮后,Firewall Builder 会根据上一步选择的模板将默认策略建立,

如图 19-9 所示。

图 19-9 模板中的默认策略

3.Firewall Builder 配置 IPTables 策略

在 Firewall Builder 中,通过将如图 19-9 所示内容中“User”选择为“Standard”后,可

直接将其提供的各种协议模板拖到现有策略中,也可以在编号列单击鼠标右键增加、删除现

有策略。在策略配置完成后,需要选择“File”→“Save”将配置结果保存(本章中将结果保

存在/root 目录下,文件名为 charles)。在 Firewall Builder 中保存并不代表已将配置的策略在

防火墙上执行,所以还需要完成以下工作后,这些策略才会被应用到 IPTables 上。

Linux 从初学到精通

518

(1)在防火墙名称上的右键菜单中选择“Compile”,如图 19-10 所示。

图 19-10 编译策略

(2)在弹出界面中勾选防火墙名称后,单击“Next”按钮,如图 19-11 所示,当出现如

图 19-12 所示的界面表示编译完成。

图 19-11 选择需要编译的策略

图 19-12 编译完成

(3)在编译完成后会生成一个名为防火名称加一个“charles”(本章中防火墙的名称为

“charles”,因此生成的脚本名称为“charles.fw”)的 IPTables 的脚本,执行如下命令并将其加

入/etc/rc.d/rc.local 文件中。

/bin/sh /root/charles.fw

实验任务

在如图 19-13 所示的网络拓扑中,通过 IPTables 完成以下实验任务。

看家护院—IPTables 防火墙配置 第

519

19

图 19-13 IPTables实验任务

(1)允许从 Internet 访问“web.example.zqin”上的 Web 服务。

(2)允许 IP 地址为 192.168.159.0/24、192.168.158.0/25、192.168.157.0/23 网段的客户端

访问 Internet。

(3)允许 IP 地址为 192.168.159.100~192.168.159.110 的客户端访问“fw.example.zqin”

的 SSH 服务。

本章测试

(1)在 RHEL 5.x 提供的 IPTables 中,不包括( )表。

A.filter B.mangle

C.nat D.rew

(2)执行“iptables -t filter -A INPUT -p tcp -j LOG --log-prefix "fwlog"”后,IPTables( )

继续匹配下一条策略。

A.不会 B.会

C.不一定 D.有可能

(3)当某一个请求被认为 NEW 状态后,其应答是( )状态。

A.RELATED B.ESTABLISHED

C.UNTRACKED D.INVALID

(4)将 filter 表的 INPUT 链 iptables -F INPUT 默认策略改为 DROP 应使用命令。

A.iptables -t filter -P INPUT DROP B.iptables -t filter -F INPUT DROP

C.iptables -t filter INPUT DROP D.iptables -t filter -Z INPUT DROP

(5)在 nat 表中不包括( )链。

Linux 从初学到精通

520

A.PREROUTING B.POSTROUTING

C.OUTPUT D.INPUT

(6)在 RHEL 5.x 中配置的 IPTables 策略被保存在( )文件中。

A./var/iptables B./etc/sysconfig/iptables

C./usr/iptables D./etc/iptables

(7)当数据包到达本机后,首先经过的是( )。

A.filter 表的 INPUT 链 B.filter 表的 PREROUTING 链

C.raw 表的 PREROUTING 链 D.raw 表的 INPUT 链

(8)执行“iptables -A INPUT -s 192.168.157.0/24 -p udp -j DROP”后,会在( )表增

加一条新的策略。

A.filter B.mangle

C.nat D.rew

(9)在 RHEL 5.x 提供的 IPTables 中,不包括( )状态。

A.NET B.NEW

C.INVALID D.RELATED

(10)使用( )可以保存对 IPTables 策略的修改。

A.service iptables save B.service iptables restart

C.service netfilter save D.service netfilter restart