Linux 初步 (教育部推荐教材)
Date: 2010-08-01
Publisher: 北京师范大学出版集团，北京师范大学出版社
Rights: 亚马逊

Linux　初步

主　编　李　春

北京师范大学出版社

图书在版编目（CIP）数据

Linux初步/李春主编.—北京：北京师范大学出版社，2010.7

ISBN 978-7-303-11326-2

Ⅰ.①L… Ⅱ.①李… Ⅲ.①Linux操作系统-高等学校：技术学校-教材 Ⅳ.①TP316.89

中国版本图书馆CIP数据核字（2010）第144318号

出版发行：北京师范大学出版社　www.bnup.com.cn

北京新街口外大街19号

邮政编码：100875

印　　刷：

装　　订：

经　　销：全国新华书店

开　　本：184 mm×260 mm

印　　张：

字　　数：千字

版　　次：2010年8月第1版

印　　次：2010年8月第1次印刷

定　　价：23.00元

策划编辑：周光明　　责任编辑：周光明

美术编辑：高　霞　　装帧设计：华鲁印联

责任校对：李　菡　　责任印制：李　丽

版权所有　侵权必究

反盗版、侵权举报电话：010—58800697

北京读者服务部电话：010—58808104

外埠邮购电话：010—58808083

本书如有印装质量问题，请与印制管理部联系调换。

印制管理部电话：010—58800825

前　言

在如今知识爆炸、科技迅猛发展的时代，人们对Linux操作系统的使用已不再陌生。中国有数亿网民，不仅在网络上，在各种媒体中及街头巷尾，或是办公室中，人们也会谈论着“你的电脑装的是什么系统？”“我用的是Linux。”这样的话题。Linux这样一个极其优秀的操作系统，已经越来越为那些喜欢探索，喜欢追求更好、更快、更开放的人们所接受。

Linux系统具有众多优点：

完全免费的操作系统：用户可以通过网络或其他途径免费获得，并可以任意修改其源代码。正是由于这一点，来自全世界的无数编程爱好者，参与了Linux的修改、编写工作，这让Linux吸收了无数程序员的精华，不断壮大。

对硬件的要求不高：本系统几乎可以在当前所有型号的PC机上运行。当然随着图形化的深入应用，Linux的身材和对硬件的要求也在增长。

企业级服务器的应用：我们用Windows可以做的事情Linux均可完成，不但如此，它还可以安装在企业级服务器上作为服务器操作系统运行应用。其中IBM生产的大型主机、中型机、服务器都可以安装运行Linux系统。学好Linux对希望在IT领域发展的有志之士来说是必不可少的一项技能。

强大的网络功能：互联网是在Unix的基础上繁荣起来的，Linux的网络功能当然不会逊色。对于脱胎于UNIX的Linux来说，网络支持就是操作系统的一部分。它的网络功能和其内核紧密相连，在这方面Linux要优于其他操作系统。在Linux中，用户可以轻松实现网页浏览、文件传输、远程登陆等网络工作。并且可以作为服务器提供WWW、FTP、E-Mail等服务。

绚丽美观的图形界面：Linux同时具有字符界面和图形界面。在字符界面用户可以通过键盘输入相应的指令来进行操作。图形本来是Linux的短板，但因为Windows的功能的迅速提高，Linux开始奋起直追，设计出各种新版本具有绚丽美观的图形界面。相信看腻了Windows蓝天白云的人们会有焕然一新的感觉。对于习惯了用Windows办公的人们来说也不用担心，针对Windows系统中常用的办公及娱乐软件，Linux都会有相同功能的免费软件供大家使用。囊中羞涩的人们可以体验一把免费大餐了。

多用户、多任务的操作系统：从诞生之日起Linux就是一个彻底的多用户系统，从操作系统设计角度就考虑到多用户、多任务和系统安全。多个用户对于自己的文件可以设置特殊的权利，保证了各用户之间互不影响。多任务则是现在电脑最主要的一个特点，Linux可以使多个程序同时并独立地运行。

那么该怎么学习Linux呢？这要看你的目标是什么，目标不同方法就不一样。要想尽快了解和使用Linux系统，不妨在学习的过程中把看到的每一样东西都和我们很熟悉的Windows系统对比一下，这样不但能快速记住各项系统功能的使用方法，还能比较出哪个系统做得更好；如果对Linux系统抱有浓厚兴趣，想成为一代高手，恐怕就要采用“忘了Windows”的方法，从Linux的历史开始，深入到每一条命令，再到系统结构及编程。本书第1章将对“Linux的学习方法”进行深入浅出地讲解。

本书由多位从事Linux课程教学一线的老师根据多年的教学和研究经验总结编写而成。本书的主要特点可归纳如下：

（1）理论内容通俗易懂。力求用通俗易懂的语言解释较为复杂的Linux概念，使非计算机专业的读者也能理解，并达到会应用的目的。

（2）内容循序渐进、由浅入深，达到逐步提高的目的。

（3）用实例解释概念，达到理论与实践紧密结合的目的。通过应用举例的方式加深理解，达到实践的目的。

（4）每一章均编入了练习内容，配合授课教师组织实践教学，达到教学的目的。

本书主要由李春、李罡、梁平、张兵、刘涛编写，限于编者水平有限，书中难免存在疏漏之处，欢迎广大读者发现后及时予以指正，也期望大家提出宝贵意见，在此表示感谢。希望我们共同不断努力充实自己。

编　者

2010年8月

目　录

前　言

第一章　Linux介绍

1.1　Linux的背景：UNIX

一、UNIX的发展

二、UNIX系统的特点

1.2　Linux的诞生和历史上的重要人物

1.3　自由软件（Free Software）

1.4　Linux的发展和现状

1.5　Linux的学习方法

一、忘记Windows的思维方式

二、从命令开始、从基础开始

三、了解系统结构

四、使用帮助系统

五、多操作

1.6　Linux的版本

第二章　安装Linux

2.1　安装Linux前的准备工作

2.2　安装Linux的过程

第三章　开始使用Linux

3.1　登录Linux

3.2　Linux注销与关机

3.3　Linux命令的格式

3.4　基本的Linux命令

3.5　在Linux中获得帮助

第四章　文件和目录

4.1　Linux中文件的概念

4.2　使用和管理目录

4.3　使用和管理文件

4.4　链接文件与inode

4.5　文件的权限

4.6　Linux目录结构

4.7　文件系统

第五章　文本编辑器vi

5.1　vi简介

5.2　vi基本操作

第六章　使用shell

6.1　什么是Shell

6.2　shell基本操作

一、自动补齐

二、命令行的历史记录

6.3　通配符与文件名匹配

一、通配字符（wildcards）与文件名匹配

二、引用shell的特殊字符

6.4　输入输出重定向

6.5　shell变量

一、用户自定义变量

二、系统预定义变量

6.6　shell中的其他常用转义字符

6.7　命令的别名

6.8　定制用户环境

第七章　进程管理

7.1　进程的概念

7.2　进程及作业

7.3　管理进程

7.4　任务计划

第八章　图形界面与中文处理

8.1　X-Window与Linux

一、X-Window简介

二、GNOME简介

三、KDE简介

四、使用窗口管理器

8.2　Linux与中文处理

一、字符与编码

二、英文数字编码

三、早期的汉字编码

四、国际统一编码

五、操作系统中处理汉字的方法

第九章　Linux管理任务

9.1　用户和组的管理

一、用户和组的概念

二、用户和组相关的配置文件和目录

三、用户和组相关的工具或命令

9.2　软件包管理

一、源码包软件的安装与管理

二、RPM软件包管理介绍

三、RPM的简单用法

9.3　系统引导

一、多重操作系统引导装载程序

二、GRUB介绍

三、安装GRUB

四、硬盘及分区的两种表示方法

五、GRUB的配置文件

六、通过GRUB的命令行引导Linux

七、通过GRUB引导Windows

八、GRUB丢失或损坏的应对策略

9.4　内核重编译与模块

一、为什么要编译内核

二、内核源码版本的选择

三、内核源码安装或解压

四、内核的配置

五、编译内核

六、安装内核及配置grub或lilo

9.5　系统紧急修复

一、单用户模式

二、Linux rescue修复模式

三、livecd光盘或第三方Linux系统

四、如果X不能启动了，如何才能登录机器

第十章　Linux网络基础

10.1　计算机网络基础

一、计算机网络类型和网络体系结构

二、局域网技术

三、网络互联

四、Internet简介

五、TCP/IP协议

六、IP地址与子网掩码

七、域名系统（Domain Name System DNS）

八、Internet网络安全

10.2　设置TCP/IP属性

10.3　与Windows协同工作

10.4　作为Internet服务器

附录A　Linux常用命令

附录B　Linux常用配置文件

参考文献

第一章　Linux介绍

主要内容

1.Linux的背景：UNIX

2.Linux诞生和历史上的重要人物

3.自由软件（Free Software）

4.Linux的发展和现状

5.学习Linux的方法

6.Linux的版本号

1.1　Linux的背景：UNIX

UNIX，是一个强大的多用户、多任务操作系统，支持多种处理器架构，按照操作系统的分类，属于分时操作系统。最早由Ken Thompson、Dennis Ritchie和Douglas McIIroy于1969年在AT＆T的贝尔实验室开发。经过长期的发展和完善，目前已成长为一种主流的操作系统技术和基于这种技术的产品大家族。

一、UNIX的发展

UNIX操作系统的历史漫长而曲折。1965年，AT＆T贝尔电话实验室、通用电气公司、麻省理工学院MAC课题组一起联合开发一个称为Multics的新操作系统。Multics系统的目标是要向大的用户团体提供对计算机的同时访问，支持强大的计算数据存储，以及允许用户在需要的时候容易地共享他们的数据。1969年Multics的原始版本在GE645计算机上运行了，但它没能提供预定的服务，而且，连它自己也不清楚究竟什么时刻算达到开发目标。因为这个系统非常粗糙，与现代UNIX相差很远，它只具有操作系统最基本的一些特性。在这种情况下，AT＆T贝尔电话实验室首先退出了这一项目。Multics项目中止后，AT＆T贝尔电话实验室中参加开发的主要人员开始寻找其他有趣的项目。为了满足他们的某些需要，他们把操作系统环境命名为UNIX。

Thompson和Ritchie后来开发了B语言（后来Ritchie又将其发展为C语言），并扩展了UNIX系统，UNIX系统便在AT＆T贝尔电话实验室流行起来。

1973年11月，他们用C语言彻底重写，这是UNIX操作系统迈向成功之路的关键一步。完成后，Thompson和Ritchie共同在《ACM通信》上发表了首篇UNIX论文。

1974年，加州大学Berkeley分校获得了UNIX许可证。开发了BSD UNIX。1994年，BSD UNIX的最后版本——4.4BSD被推出，由于使用了Berkeley开发的新源代码，4.4BSD宣布不受AT＆T的许可证制约。

1979年1月发行的UNIX版本是一个真正可移植的UNIX系统，它对其后的UNIX发展有着深远的影响。该版本最初是运行在PDP-11和Interdata 8/32上的，该系统更加健壮，而且提供了比版本6更强大的功能，但其相当慢。许多领取了许可证的用户针对这一情况从不同方面对系统的性能进行了改进，AT＆T又将这些改进中的许多性能加入了其以后的UNIX发行中。

1982年，AT＆T被拆分。同年，AT＆T在UNIX第7版的基础上，发布了UNIX System III，1983年发布了UNIX System V。在1990年，AT＆T下属的USL公司发布了最后一个UNIX版本，即UNIX System V Release 4.2，简称为SVR4.2。

1992年，AT＆T把UNIX技术、USL公司和UNIX商标卖给了Novell公司。同年10月，Novell将UNIX商标无偿赠送给X/Open组织。1996年，SCO从Novell收购了UNIX系统事业部，UNIX系统源代码和技术现在由SCO来开发，然而SCO并没有获得UNIX商标所有权。UNIX系统的不断发展吸引了许多计算机公司。它们急急忙忙地开始将UNIX商业化，出售自己的UNIX版本。每一家都是以AT＆T或BSD为蓝本，将它们移植到自己的硬件上，并加上一些自己的“增值”功能。UNIX系统变体的泛滥造成了许多不兼容问题，尽管所有的变体从某种程度“看起来都像UNIX”，但它们在许多重要方面却千差万别。后来随着商业变体不断涌现，情况越来越糟。主要的UNIX版本有：IBM AIX、Sun Solaris、HP-UX、SGI Irix、SCO UNIXWare等。到20世纪80年代末期，UNIX的版本已超过100种。为了统一UNIX，以AT＆T和Sun为首成立了UI（Unix International），以IBM和DEC为首成立了OSF（Open Software Foundation）。1986年，IEEE和ANSI定义了基于UNIX的可移植操作系统接口POSIX，该标准基本上是SVR3和BSD UNIX 4.3的主要部分的混合。1990年，IEEE公布了POSIX 1003.1，简称为POSIX.1。1993年，OSF和UI联合成立了COSE（公共开放系统环境），同年UI解散。1995年，X/Open正式批准了两项UNIX：一项为Spec.1170标准，即UNIX 95标准，规定了UNIX的1170个接口标准。另一项是CDE，即UNIX公共桌面环境标准，规定了UNIX的标准图形桌面。1996年，OSF与X/Open合并成立Open Group，在1998年发布了UNIX 98标准。

二、UNIX系统的特点

1.UNIX具有良好的用户界面。

2.好的树形文件系统。UNIX的文件系统有很多种，如早期的s5，ufs，AFS，EAFS，HTFS，DTFS。

3.系统用高级语言编写，为用户提供了良好的开发环境。UNIX的默认安装一般都包括标准的C语言编译器，程序员可以利用它们来开发C和C＋＋应用程序。

4.良好的开放性和可移植性。随着计算机技术的发展，各种不同类型的计算机不断出现。因此，任何一种操作系统都很难做到适应所有的硬件平台。如果一个操作系统的适应性太差，将其应用在一种新型的计算机系统中，就可能有大量原有系统软件需要重新设计，这对快速更新的计算机类型来讲是非常不利的。因此，操作系统的开放性和可移植性是衡量其优劣的一项重要指标。UNIX系统由于其内核设计的许多特征，尤其是UNIX系统内核的大部分是用C语言实现的，这就使得操作系统的移植工作变得比较容易。

5.增强的系统安全机制。系统大多满足C2级系统安全规范，部分专用系统已经达到了B1级；经典而完善的按属主和组进行3种权限管理的机制仍然是当今最完善的用户权限解决方案。

6.强大的网络功能、集群和分布式计算，适合当今的Internet，其Telnet设计思想很适合用户进行远程管理。

1.2　Linux的诞生和历史上的重要人物

Linux操作系统是UNIX操作系统的一种克隆系统。它诞生于1991年的10月5日（这是第一次正式向外公布的时间）。以后借助于Internet网络，并经过全世界各地计算机爱好者的共同努力，现已成为今天世界上使用最多的一种UNIX类操作系统，并且使用人数还在迅猛增长。

在1991年，芬兰的一个学生：Linus Benedict Torvalds，在赫尔辛基大学上计算机专业二年级。在comp.os.minix这个新闻群组上发表了这样一封内容不怎么起眼的一帖：

From：torvalds＠klaava.Helsinki.FI（Linus Benedict Torvalds）

Newsgroups：comp.os.minix

Subject：What would you like to see most in minix？

Summary：Small poll for my new operating system.

Message-ID：＜1991Aug25.205708.9541＠klaava.Helsinki.FI＞

Date：25 Aug 91 20：57：08 GMT

Organization：University of Helsinki。

1991年9月中旬，Linux0.01版诞生了，并且被放到了网上。它立即引起了人们的注意。源代码被下载、测试、修改，最终被反馈给Linux。10月5号，0.02版出来了，同时伴随着Linus著名的声明：

From：torvalds＠klaava.Helsinki.FI（Linus Benedict Torvalds）

Newsgroups：comp.os.minix

Subject：Free minix-like kernel sources for 386-AT

Message-ID：＜1991Oct5.054106.4647＠klaava.Helsinki.FI＞

Date：5 Oct 9105：41：06 GMT

Organization：University of Helsinki

1.3　自由软件（Free Software）

根据自由软件基金会的定义，自由软件是一种可以不受限制地自由使用、复制、研究、修改和分发的软件。这方面的不受限制正是自由软件最重要的本质，与自由软件相对的是非自由软件（proprietary software），也常被称为私有软件、封闭软件。要将软件以自由软件的形式发表，通常是让软件以“自由软件授权协议”的方式被分配发布，以及公开软件源代码。

在Linux之前和之后，都诞生过很多操作系统，如国产的COSIX等，但大多没有流行开来，而Linux却得到了很多支持，这不能不归功于Linux诞生的时机。一方面，GNU计划（又称革奴计划，是由Richard Stallman在1983年9月27日公开发起的，它的目标是创建一套完全自由的操作系统。）中的Hurd在开发中遇到了很多问题，已经做不下去了，Linux正好补充进来，而Linux也从GNU项目中得到了大量的实用软件，如bash，gcc，emacs等。GNU和Linux互相支持发展，所以现在我们都管Linux叫GNU/Linux。另外，Linux赶上了POSIX标准的制定，这使得Linux一开始就向标准靠拢。还有，随着Internet的普及，使得众多爱好者网上协同开发成为了可能。更重要的是，Linux发展的时期，正是“反微软霸权”的意识日益高涨的时期，众多公司、政府和组织都需要一个能与Microsoft的Windows抗衡的软件，时代呼唤Linux！

Linux发展的一个重要的法律理论基础是GPL，即GNU General Public License，又叫做copyleft（与copyright对应）。遵循GPL的软件的特点是：

你可以复制这个软件。

你可以得到软件的源代码。

你可以更改源代码并重新编译。

你可以发布更改了的代码和二进制文件。你可以从中获利。

权利与义务总是对等的，你的义务是：

你必须让使用你的软件的人享有同样的权利。

也就是说，你用了GPL的软件，那么你的软件也要GPL’ed。书接上文，GPL是GNU的法律基础，也是Linux发展的重要保证。正是在GPL的约束下，自由软件得到了蓬勃的发展。但是很多商业公司都会避免使用GPL的软件，因为GPL不等于没限制，使用了GPL的源代码，自己的软件也要GPL’ed，这对于商业软件来讲是不可以接受的。不过，按照GPL的条件，如果你只是通过软件的界面来完整的使用GPL的软件，而并不深入修改源代码，就可以不受GPL的约束。另外，除了GPL以外，还有一些比较宽松的License，如LGPL、BSD等。

要说明的一点是，虽然自由软件的精神很无私，但搞自由软件的程序员并不都是“活雷锋”，他们一样要挣钱，而搞自由软件的人挣的钱一点都不比搞商业软件的人挣得少。他们挣钱的方式有很多，比如通过对软件的服务来盈利。举个例子，一般用户和程序员使用某Linux发行版，可能只是拿来玩一玩，不好玩就放弃了，一般不需要服务，但一个企业选用了某Linux发行版，如果打算把核心业务运行到Linux上，那么就需要一个Linux发行商提供相应的服务和技术支持，而这个服务的费用是相当不菲的。

1.4　Linux的发展和现状

1983年，理察·马修·斯托曼建立了GLinux计划。这个计划有一个重要的目标，是为了发展一个完全免费自由的Unix-like操作系统。自20世纪90年代发起这个计划以来，GNU开始大量的生产或收集各种系统所必备的元件，1990年，GNU计划开始在马赫微核的架构之上开发系统核心，也就是所谓的GNU Hurd，但是这个基于Mach的设计异常复杂，发展进度则相对缓慢。

正因为Linux是一款免费的操作系统，用户可以通过网络或其他途径免费获得，并可以任意修改其源代码。这是其他的操作系统所做不到的。所以来自全世界的无数程序员参与了Linux的修改、编写工作，程序员可以根据自己的兴趣和灵感对其进行改变。这让Linux吸收了无数程序员的精华，不断壮大。

现在Linux操作系统也出现了很多版本，这里介绍一款：红旗Linux。

北京中科红旗软件技术有限公司（简称红旗软件）是由中国科学院软件研究所和上海联创投资管理有限公司共同组建的；并于2001年3月成功得到了信息产业部通过中国电子信息产业发展研究院（CCID）赛迪创业投资有限公司的注资。公司专门致力于开发和推广基于Linux的操作系统及应用软件。“立足Linux，面向Internet时代，为企业的解决方案、个人应用及所有Internet接入设备提供系统原动力。”

红旗软件汇集中国科学院20多年在开放系统上的研究成果，以及10多年来中文系统的开发经验，率先推出红旗Linux服务器，扬起国产软件的一面旗帜。红旗Linux服务器、红旗Linux桌面版、基于IBM S/390主机、Alpha、Intel、PA RISC、Sun Spare芯片的红旗Linux操作系统、红旗Linux嵌入式操作系统和机顶盒、PDA等嵌入式解决方案相继亮相，在业界引起强烈反响。丰厚的技术底蕴和自由软件相结合，使红旗软件产品处于业界领先地位。

现在，Linux已经不再只是一个新的操作系统，而是深深的改变着很多人的生活。Linux被广泛的用在嵌入式设备、笔记本电脑、桌面系统、开发系统、各种规模的服务器以及大规模集群和超级计算机中，众多公司选择Linux来支持他们的服务器，如IBM、波音、美国宇航局、google.com等。

对于中国软件业来讲，自由软件Linux给我们带来的机遇，使得我们能够离软件最本质、最朴素的思想更进一点，但是，Linux不是免费的午餐，也不是救世主，民族软件的腾飞，不能依靠把别人的东西拿来改改就能实现，必须是一代一代的程序员努力的结果，Linux可能是让我们接触UNIX，学习真正意义的系统管理的一个最便捷的方式。

1.5　Linux的学习方法

以上讲了很多关于Linux文化。之所以一上来讲这么多历史、精神和文化背景，是因为笔者觉得学Linux如果只是去学怎么安装，怎么操作，那跟学Windows还有什么差别？现在很多人学Linux的过程就是尝试装各种发行版的过程，或者是拿Linux跟Windows去对比的过程。大量的时间，用在比较哪个发行版漂亮、功能多，或者Windows上能怎么样，Linux也要能怎么样，然后抱怨Linux上的软件用得没有Windows上的顺手，新鲜了两天就又回到Windows中了。这真让人觉得是“明珠投暗”了，好像是拿千里马去参加选美大赛……倒不是说图形应用不需要了解，而Linux的强项是充当服务器，提供网络服务，或是嵌入式开发，为什么不在这些地方多花点时间呢？所以，Linux用得好不好，不要说装过多少种Linux，也不要说能在Linux看电影、上QQ，而要看字符命令了解多少、配置文件知道多少、系统管理的功能你会完成多少。以下是希望初学者在学习时应该侧重的几个方面。

一、忘记Windows的思维方式

Windows和Linux有很多的差别，一般人都习惯于Windows的思维，所以学习Linux思想性的转变比暂时性的技术提高更有用，因为他能帮助你加快学习速度。现在很多人用Linux。但是，他们用Linux完全是Windows的那一套方式。骨子里都是Windows的思想。这样是不能领悟Linux的精髓，体验不到它的优越性的。现在大部分的Linux初级用户受到Windows影响都喜欢用图形界面的工具来完成一些基本的操作，这是很不好的习惯。

二、从命令开始、从基础开始

常常有些刚接触Linux的人就希望构架网站，根本没有想到要先了解一下Linux的基础。这是相当困难的。虽然Linux桌面应用发展很快，但是命令在Linux中依然有很强的生命力。Linux是一个由命令行组成的操作系统，精髓在命令行，无论图形界面发展到什么水平，这个原理是不会变的。Linux命令有许多强大的功能：从简单的磁盘操作、文件存取到复杂的操作。所以我们一开始就要好好学习命令的使用。

三、了解系统结构

等你有了一定的系统管理知识，知道了/etc下那些配置文件有什么用，知道了一般的网络服务器如何配置后，就可以去了解系统结构了。了解系统结构不是要你去看什么文件夹放什么内容，而是要学习一些原理性的东西。比如系统是如何引导的，引导后启动了哪些东西，系统中哪些是最基本的库文件，有什么用等等。

四、使用帮助系统

由于各个Linux的发行版本的技术支持时间都较短，当你安装了一个完整的Linux系统后，其中已经包含了一个强大的帮助系统。主流Linux发行版都自带非常详细的文档，从系统安装到系统安全，针对不同层次的人的详尽文档，很多问题都可在此解决。所以有些问题完全可以使用帮助系统来解决。当然也可以在Linux论坛中获取帮助。

五、多操作

平时操作软件时最好多用一些原码包自己编译一些软件来试验一下。把所学到的各种东西都运用到实验之中，这才是进步的最好办法。

1.6　Linux的版本

要想掌握Linux，唯一的方法就是去用它，就像要学会游泳，就要去多游一样。但是很多初学Linux的人，一上来就被一堆名字给搞晕了，Red Hat、SuSE、Debian、红旗……它们跟Linux到底是什么关系？

我们平时说的Linux，有两种含义，一种的狭义的含义，指的是由Linus领导的小组所维护的一个操作系统核心功能，即内核，另一种是广义的含义，指的是使用Linux内核并包括了一些工具的完整的操作系统，即发行版。

严格来说，Linux应该指的是操作系统内核，操作系统内核定期更新，在http://www.kernel.org上可以下载各个版本的Linux内核。内核版本号由三个数字组成，如2.6.9。其中第2位次版本号为偶数的是稳定版本，奇数的为测试版本，普通用户要选用稳定版本的内核。

但是光有一个内核是不可能供用户使用的，所以在内核之上，有很多人开发了各种各样的工具，从shell、编译器，到图形界面等，然后有些组织或公司，将内核和各种工具组合在一起，制作成光盘出售或放在网上供大家下载，这些光盘一般都含有一个方便的安装程序，通过向导一步步的提示，就可以安装整个操作系统，这就是发行版。各个发行版维护自己的发行版本号，比如Red Hat 9。

下面简单介绍一下目前比较著名、流行的Linux发行版本。

●　Mandriva

Mandriva原名Mandrake，创建于1998年7月。记得前两年国内刚开始普及Linux时，Mandrake非常流行。说起Mandrake的历史，其实最早Mandrake的开发者是基于Red Hat进行开发的。Red Hat默认采用GNOME桌面系统，而Mandrake将之改为KDE。而由于当时的Linux普遍比较难安装，不适合第一次接触Linux的新手，所以Mandrake还简化了安装系统。我想这也是当时Mandrake在国内如此红火的原因之一。Mandrake在易用性方面的确是下了不少工夫，包括默认情况下的硬件检测等。

Mandrake的开发完全透明化，包括“cooker”。当系统有了新的测试版本后，便可以在cooker上找到。之前Mandrake的新版本的发布速度很快，但从9.0之后便开始减缓。估计是希望能够延长版本的生命力以确保稳定和安全性。

优点：友好的操作界面，图形配置工具，庞大的社区技术支持，NTFS分区大小变更

缺点：部分版本bug较多，最新版本只先发布给Mandrake俱乐部的成员

软件包管理系统：urpmi（RPM）

免费下载：FTP即时发布下载，ISO在版本发布后数星期内提供

官方主页：http://www.mandrivaLinux.com/

●　SUSE

SUSE是德国最著名的Linux发行版，在全世界范围中也享有较高的声誉。SUSE自主开发的软件包管理系统YaST也大受好评。SUSE于2003年年末被Novell收购。

SUSE之后的发布显得比较混乱，比如9.0版本是收费的，而10.0版本（也许由于各种压力）又免费发布。这使得一部分用户感到困惑，也转而使用其他发行版本。但是，瑕不掩瑜，SUSE仍然是一个非常专业、优秀的发行版。

优点：专业、易用的YaST软件包管理系统

缺点：FTP发布通常要比零售版晚1～3个月

软件包管理系统：YaST（RPM），第三方APT（RPM）软件库（repository）

免费下载：取决于版本

官方主页：http://www.suse.com/

●　Debian GNU/Linux

Debian最早由Ian Murdock于1993年创建。可以算是迄今为止，最遵循GNU规范的Linux系统。Debian系统分为三个版本分支（branch）：stable，testing和unstable。截至2005年5月，这三个版本分支分别对应的具体版本为：Woody，Sarge和Sid。其中，unstable为最新的测试版本，其中包括最新的软件包，但是也有相对较多的bug，适合桌面用户。testing的版本都经过unstable中的测试，相对较为稳定，也支持了不少新技术（比如SMP等）。而Woody一般只用于服务器，上面的软件包大部分都比较过时，但是稳定和安全性都非常的高。

为何有如此多的用户痴迷于Debian呢？apt-get/dpkg是原因之一。dpkg是Debian系列特有的软件包管理工具，它被誉为所有Linux软件包管理工具（比如RPM）中最强大的。配合apt-get，在Debian上安装、升级、删除和管理软件变得异常容易。许多Debian的用户都开玩笑的说，Debian将他们养懒了，因为只要简单得敲一下“apt-get upgrade ＆ ＆ apt-get update”，机器上所有的软件就会自动更新了……

优点：遵循GNU规范，100%免费，优秀的网络和社区资源，强大的apt-get

缺点：安装相对不易，stable分支的软件极度过时

软件包管理系统：APT（DEB）

免费下载：是

官方主页：http://www.debian.org/

●　Ubuntu

简单而言，Ubuntu就是一个拥有Debian所有的优点，以及自己所加强的优点的近乎完美的Linux操作系统。Ubuntu是一个相对较新的发行版，但是，它的出现可能改变了许多潜在用户对Linux的看法。也许，从前人们会认为Linux难以安装、难以使用，但是，Ubuntu出现后，这些都成为了历史。Ubuntu基于Debian Sid，所以这也就是笔者所说的，Ubuntu拥有Debian的所有优点，包括apt-get。然而，不仅如此而已，Ubuntu默认采用的GNOME桌面系统也将Ubuntu的界面装饰的简易而不失华丽。当然，如果你是一个KDE的拥护者的话，Kubuntu同样适合你。

Ubuntu的安装非常的人性化，只要按照提示一步一步进行，安装和Windows同样简便。并且，Ubuntu被誉为对硬件支持最好最全面的Linux发行版之一，许多在其他发行版上无法使用，或者默认配置时无法使用的硬件，在Ubuntu上轻松搞定。并且，Ubuntu采用自行加强的内核（kernel），安全性方面更上一层楼。并且，Ubuntu默认不能直接root登录，必须从第一个创建的用户通过su或sudo来获取root权限（这也许不太方便，但无疑增加了安全性，避免用户由于粗心而损坏系统）。Ubuntu的版本周期为六个月，弥补了Debian更新缓慢的不足。

优点：人气颇高的论坛提供优秀的资源和技术支持，固定的版本更新周期和技术支持，可从Debian Woody直接升级

缺点：还未建立成熟的商业模式

软件包管理系统：APT（DEB）

免费下载：是

官方主页：http://www.ubuntuLinux.org/

●　Gentoo

Gentoo最初由Daniel Robbins（前Stampede Linux和FreeBSD的开发者之一）创建。由于开发者对FreeBSD的熟识，所以Gentoo拥有媲美FreeBSD的广受美誉的ports系统——portage。（Ports和Portage都是用于在线更新软件的系统，类似apt-get，但还是有很大不同）Gentoo的首个稳定版本发布于2002年。

Gentoo的出名是因为其高度的自定制性：因为它是一个基于源代码的（source-based）发行版。尽管安装时可以选择预先编译好的软件包，但是大部分使用Gentoo的用户都选择自己手动编译。这也是为什么Gentoo适合比较有Linux使用经验的老手使用的原因。但是要注意的是，由于编译软件需要消耗大量的时间，所以如果你所有的软件都自己编译，并安装KDE桌面系统等比较大的软件包，可能需要几天时间才能编译完。

优点：高度的可定制性，完整的使用手册，媲美Ports的Portage系统，适合高手使用

缺点：编译耗时多，安装缓慢

软件包管理系统：Portage（SRC）

免费下载：是

官方主页：http://www.gentoo.org/

●　Slackware

Slackware由Patrick Volkerding创建于1992年。算起来应当是历史最悠久的Linux发行版。曾经Slackware非常的流行，但是当Linux越来越普及，用户的技术层面越来越广（更多的新手）后，Slackware渐渐的被新来的人们所遗忘。在其他主流发行版强调易用性的时候，Slackware依然固执的追求最原始的效率——所有的配置均还是要通过配置文件来进行。

尽管如此，Slackware仍然深入人心（大部分都是比较有经验的Linux老手）。Slackware稳定、安全，所以仍然有大批的忠实用户。由于Slackware尽量采用原版的软件包而不进行任何修改，所以制造新bug的几率便低了很多。Slackware的版本更新周期较长（大约1年），但是新版本的软件仍然不间断的提供给用户下载。

优点：非常稳定、安全，高度坚持UNIX的规范

缺点：所有的配置均通过编辑文件来进行，自动硬件检测能力较差

软件包管理系统：Slackware Package Management（TGZ）

免费下载：是

官方主页：http://www.slackware.com/

●　Knoppix

由德国的Klaus Knopper开发的Knoppix，是一个基于Debian的发行版。Knoppix严格算起来是一款LiveCD Linux，所谓的LiveCD就是整个操作系统都在一张光盘上，只要开机从光盘启动，就能拥有一个完整的Linux系统，无需安装。当然，Knoppix也能够非常轻松的安装到硬盘上。其强大的硬件检测能力、系统修复能力、即时压缩传输技术，都令人大加称赞。可以说，在LiveCD界，Knoppix是无人能及的。

优点：无需安装可直接运行于CD上，优秀的硬件检测能力，可作为系统急救盘使用

缺点：LiveCD由于光盘的数据读取速度限制导致性能大幅下降

软件包管理系统：APT（DEB）

免费下载：是

官方主页：http://www.knoppix.com/

●　MEPIS

MEPIS由Warren Woodford在2003年建立。MEPIS虽然刚建立不久，但是迅速的传播在Linux用户间。简单来说，MEPIS是一个集合了Debian Sid和Knoppix的产物。用户既能将之当做LiveCD使用，也能使用常规的图形界面进行安装。

MEPIS默认集成安装了Java Runtime Environment、Flash插件、nVidia加速驱动等许多常用的程序。用户可以非常轻松的安装完系统后就直接开始使用，而不用到处寻找资料如何下载、如何安装、如何配置这些软件。这不仅给Linux新手带来了便捷，也给老手们节约了相当多的时间。

优点：LiveCD与常规安装两用，优秀的硬件检测能力，预装了许多实用的软件

缺点：建立时间不长，默认的界面有些寒酸

软件包管理系统：APT（DEB）

免费下载：是

官方主页：http://www.mepis.org/

●　Xandros

Xandros建立在已经成为历史的Corel Linux之上。当初Corel Linux的公司由于财政上的困难，被迫终止了Corel Linux的开发，而Xandros适时的将Corel Linux部门买下，于2002年10月推出全新的Xandros Desktop。

Xandros的卖点在于极其简单的安装和使用，所以它的市场定位是那些没有任何Linux使用经验的新手，或是习惯使用Windows的用户。Xandros的标准版和增强版都是商业软件，当时分别售价＄40和＄99美元。不过你仍然可以在这里下载到免费的公开发行版。

优点：适合完全没有经验的新手，安装完以后就能立即投入使用，自带非常不错的工具

缺点：商业软件

软件包管理系统：Xandros Networks（DEB）或APT（DEB）（可选，但不提供技术支持）

免费下载：公开发行版

官方主页：http://www.xandros.com/

●　FreeBSD

首先要强调的是：FreeBSD不是一个Linux系统！可是，为什么要介绍FreeBSD呢？因为FreeBSD的用户也相当多，其许多特性都与Linux相类似。事实上，Linux和BSD（Berkeley Software Distribution）均是UNIX的演化分支。并且，Linux中相当多的特性和功能（比如用于配置DNS的Bind软件）都是取自于BSD的。而FreeBSD便是BSD家族中最出名，用户数量最多的一个发行版。

FreeBSD建立于1993年，拥有相当长的历史。FreeBSD拥有两个分支：stable和current。顾名思义，stable是稳定版，而current则是添加了新技术的测试版。另外，FreeBSD会不定期的发布新的版本，称为RELEASE，stable和current均有自己的RELEASE版本。比如4.11-RELEASE和5.3-RELEASE，请注意，这并不代表后者比前者的版本新。这仅仅代表前者（数字小的版本）是stable版本，后者（数字大的版本）是current版本。

FreeBSD除了作为服务器系统外，也适合桌面用户。不过，考虑到软件方面的兼容性，一般用户选择FreeBSD作为桌面系统不是很明智。作为服务器而言，FreeBSD是相当优秀的。曾经有人说过，同样的服务器硬件配置，运行同样的一个WEB论坛，FreeBSD所用的资源要比Linux少。这也是为什么许多空间商极力推崇FreeBSD的原因。在这里要多说几句，很多人都乐于比较Linux各个版本的优劣，甚至发生唇枪舌剑的争论，其实从技术上讲没有长胜将军，技术是在不断进步的过程中，优劣都是暂时的，竞争也是技术进步的动力。

优点：速度快，非常稳定，优秀的使用手册，Ports系统

缺点：比起Linux而言对硬件的支持较差，对于桌面系统而言软件的兼容性是个问题

软件包管理系统：Ports（TBZ）

免费下载：是

官方主页：http://www.freebsd.org/

●　Red Hat

国内，乃至是全世界的Linux用户所最熟悉、最耳熟能详的发行版想必就是Red Hat了。Red Hat最早由Bob Young和Marc Ewing在1995年创建。而公司在最近才开始真正步入盈利时代，归功于收费的Red Hat Enterprise Linux（RHEL，Red Hat的企业版）。而正统的Red Hat版本早已停止技术支持，最后一版是Red Hat 9.0。于是，目前Red Hat分为两个系列：由社区开发的免费的Fedora Core，以及适用于服务器的版本是Red Hat Enterprise Linux，而由于这是个收费的操作系统。于是，国内外许多企业选择CentOS。CentOS可以算是RHEL的克隆版，但它最大的好处是免费！

优点：拥有数量庞大的用户，优秀的社区技术支持，许多创新

缺点：免费版（Fedora Core）版本生命周期太短，多媒体支持不佳

软件包管理系统：up2date（RPM），YUM（RPM）

免费下载：是

官方主页：http://www.redhat.com/

本书接下来以Fedora Core为例讲解Linux，所以在这里再介绍一下Fedora Core的版本。Fedora是众多Linux发行套件之一。它是一套从Red Hat Linux发展出来的免费Linux系统。现时Fedora最新的版本是12，2009年11月17日，Fedora 12正式版发布。Fedora的前身就是Red Hat Linux。2003年9月，红帽公司（Red Hat）突然宣布不再推出个人使用的发行套件而专心发展商业版本（Red Hat Enterprise Linux）的桌面套件，但是红帽公司也同时宣布将原有的Red Hat Linux开发计划和Fedora计划整合成一个新的Fedora Project。Fedora Project将会由红帽公司赞助，以Red Hat Linux 9为范本加以改进，原本的开发团队将会继续参与Fedora的开发计划，同时也鼓励开放原始码社群参与开发工作。

2003年11月，第一个发行版本Fedora Core 1出炉，版本代码为Yarrow。这一版本与Red HatLinux非常相似，加入了新的安装机制yum。

2004年5月，Fedora Core 2正式发布，版本代码为Tettnang。这一版本除了是第一个采用2.6版核心的发行套件及用Xorg X11取代XFree86外，也加入了IIIMF，SELinux等许多新技术，并且在开放原始码社群的支援下修正了许多套件的错误。

2004年11月，Fedora Core 3正式发布，版本代码为Heidelberg。这一版本采用2.6.9版核心、Xorg 6.8.1、GNOME 2.8和KDE 3.3.0。

2005年6月，Fedora Core 4正式发布，版本代码为Stentz。这一版本采用2.6.11版核心、GNOME 2.10、KDE 3.4.0、GCC 4.0和PHP 5.0。此外FC9还添加了对于PowerPC的支援。

2006年3月20日，Fedora Core 5正式发布，版本代码为Bordeaux。GNOME桌面基于2.14发布，KDE桌面是3.5的一般版本。首次包含Mono支持，以及众多Mono应用程序，例如Beagle桌面搜索工具、F-Spot相片管理工具以及Tomboy记事程序。SCIM语言输入框架取代了过去使用的IIIMF系统。默认网页浏览器是Firefox 1.5。gcc 4.1编译器包含其中。内核基于Linux 2.6.15。

2006年10月24日，Fedora Core 6正式发布，版本代码为Zod。GNOME桌面基于GNOME 2.16，KDE桌面基于KDE 3.5.4。添加了Compiz窗口管理器，提供对桌面视觉回馈特效的支持，并包含了X.org 7.1版本，内核基于2.6.18 Linux kernel。

到目前为止十二个发行版本的代号分别为：

＃Fedora 12（Constantine）

＃Fedora 11（Reign）

＃Fedora 10（Cambridge）

＃Fedora 9（Sulphur）

＃Fedora 8（Werewolf）

＃Fedora 7（Moonshine）

＃Fedora Core 6（Zod）

＃Fedora Core 5（Bordeaux）

＃Fedora Core 4（Stentz）

＃Fedora Core 3（Heidelberg）

＃Fedora Core 2（Tettnang）

＃Fedora Core 1（Yarrow）

以上介绍了目前较为流行的各Linux发行版本，但是对于初学者而言，可以从众多版本中挑选一个当前易于使用而又有美观的界面和丰富应用的版本开始接触Linux。当然其实装哪个版本都是可以的，只要经常去使用，就一定会有收获。

Linux，GNU，GPL，Free Software，Open Source

1.操作系统是什么？有什么作用？

2.操作系统的主要功能是什么？

3.Linux的主要特点是什么？

4.自由软件的主要思想是什么？

5.Linux的内核版本号与发行版版本号有什么关系？

第二章　安装Linux

主要内容

1.安装Linux前的准备工作

2.安装Linux的过程

2.1　安装Linux前的准备工作

Linux发展到现在，其安装过程已经变得十分简单。最简单的安装方式是从光盘安装。以下是安装所需硬件：

硬盘：

Linux系统对于计算机硬件的要求不高，现阶段的主流计算机配置应付Linux系统绰绰有余，对于现今大容量硬盘建议用于安装Linux系统的磁盘空间分配15G容量或更大，若计算机的硬件配置较低的话，最低的磁盘空间应在5G容量以上，最低不得低于5G容量。

内存：

内存容量最低不能低于256M，建议在384 M以上。若内存容量低于256M，系统启动时会出现提示信息但仍能运行，只是运行的速度不佳。

显卡：

显卡只要是VGA级别或以上的对于Linux系统来说不管是纯文本模式或X Windows模式都可以。

光盘介质：

可以在网络上下载Linux fedora core完整安装光盘镜像，然后再刻录成光盘，通过光驱进行安装。

Linux与Windows是不同的操作系统，所以是不可以把Linux安装在Windows的某个分区上的！Linux必须在硬盘上的空闲空间中划分出自己的分区。有人可能会说，我听说Linux可以在386上运行得很快，空间也需要的很小，为什么见到的Linux启动也要几分钟，占空间比Windows还要大？这个问题是这样的，如果你需要的是一个Linux服务器，看重的是Linux的I/O性能而不需要图形界面的话，那么Linux可以在很差的硬件上运行得很好，但是如果你要用Linux的图形界面来当工作站，那么其对硬件的需求与Windows也差不多了。另外Windows只有1张安装盘，安装后占1G左右的空间，为什么比较新的Linux发行版，如Fedora Core 12就有6张安装CD盘或一张有3G容量的DVD，完全安装要6个多G的空间？因为Windows刚装完可能只占1G左右的空间，但是要处理文档，就要装一套MS Office，要编程，装一套MS Visual Studio……这样算下来，把常用的软件装齐了，也差不多要这么大的空间，而Red Hat等发行版完全安装的话，常用的软件就已经装齐了。

2.2　安装Linux的过程

以上介绍完了安装系统前的必要准备工作，下面我们就以FC9为例开始安装Linux系统：

首先我们开启计算机进入BISO设置页面对BIOS进行设置，将计算机的第一启动项设置为从光盘引导启动，保存然后重新启动计算机，将安装盘的第一张放入光驱；

第一步　启动安装程序

以安装服务器为例，从光盘启动安装程序后，就会出现如图2-1所示的画面。

图2-1　安装引导界面

安装界面上有5个选项供用户选择：

（1）“Install or upgrade an existing system”项，用来以图形方式，安装或是升级现有的系统；

（2）“Install or upgrade an existing system（text mode）”项，用来以文本方式安装或是升级现有的系统；

（3）“Rescue installed system”项，用来进入故障修复系统；

（4）“Boot from local drive”项，用来从本地盘启动；

（5）“Memory test”项，用来测试内存。

以上选项均可直接按＜Enter＞键进入，为了有利于初学者比较直观地学习，此处我们选“Install or upgrade anexisting system”，按＜Enter＞键进入图形方式安装。

第二步　CD媒体检测

从开始安装后，系统一般要花费一段时间来检测计算机的各种硬件配置，当系统识别相应的设备后，出现如图2-2所示界面。

图2-2　CD检测

此处若选“OK”，则进入对安装光盘进行介质检测的界面，最后会出现光盘介质检测报告以表明这张安装光盘是否正常能否用于安装。现假设我们所选安装光盘已通过光盘介质检测结果为正常，此处我们则选择“Skip”，按＜Enter＞键。跳过这一检测过程。

第三步　欢迎界面

欢迎界面如图2-3所示，单击“Next”。

图2-3　欢迎界面

第四步　语言选择语言配置如图2-4所示，我们在此选择“Chinese（Simplified）（简体中文）”，单击“Next”。

图2-4　语言选择

第五步　键盘配置

键盘配置如图2-5所示，默认为“美国英语式”，正是我们所需要的选项，单击“下一步（N）”。

图2-5　键盘配置

到这时，安装程序会出现如图2-6所示的对话框。选“是（Y）”。

图2-6　警告

第六步　网络配置

网络配置如图2-7所示，一般默认设置，单击“下一步（N）”。

图2-7　网络配置

第七步　选择时区

时区配置如图2-8所示，通过鼠标在地图上找到“Shanghai”，下面列表框中就会出现“Asia/Shanghai”，若不正确则做相应调整，单击“下一步（N）”。

图2-8　选择时区

第八步　设置root口令

下一步是设置root口令。在UNIX/Linux中，系统管理员的名字是root，root的权力非常的大，以root身份登录后几乎可以做任何的事，所以root的口令是系统的最高机密，一般要求8位以上，不能是一个单词，要包含大小写字母、数字和特殊符号并且不定期的更换。另外，root的权力太大，误操作可能会给系统带来灭顶之灾，所以平时要以普通用户身份登录，只有必要时再临时切换成root，完成管理任务后尽快切换回来。

口令配置如图2-9所示，输入一串不少于六个字符的口令，然后再重新输入一次注意这个口令一定要记住。单击“下一步（N）”。

图2-9　设置根口令

此时会出现如图2-10所示的界面，提醒您输入的密码过于简单，是否要重新设置。如果要重新设置点“否”，反之点“是”。

图2-10　脆弱密码提示

第九步　磁盘分区设置

进行到如图2-11所示的界面，上面有个列表框，其中有四个选项，分别为“在选定磁盘上删除所有分区并创建默认分区结构”、“在选定驱动上删除Linux分区并创建默认的分区结构”、“重新定义现有分区大小并在剩余空间中创建默认布局”、“使用选定驱动器中的空余空间并创建默认的分区结构”和“建立自定义分区结构”。我们这里选“建立自定义分区结构”。单击“下一步（N）”。

图2-11　磁盘分区设置

第十步　正在分区

如图2-12所示。

图2-12　正在分区

在这步中我们来分别创建“/boot”、“swap”和“/”三个分区。

图2-13　添加/boot分区

选“新建（W）”，选“挂载点（M）：”为“/boot”，设置“大小（MB）（S）：”为“100”，“其他大小选项”选“固定大小（F）”，单击“确定（O）”，如图2-13所示；再选“新建（W）”，“文件系统类型（T）：”选为“Swap”，“其他大小选项”选“指定空间大小（MB）（u）”为实际内存大小的两倍，此处我们设置为“512”，单击“确定（O）”，如图2-14所示；再选“新建（W）”，选“挂载点（M）：”为“/”，选“其他大小选项”中的“使用全部可用空间（a）”，注意在这块硬盘上我们只用来装Fedora 9，如果您的硬盘上还有其他的系统，您可以根据自己的需要进行合理的分配空间，单击“确定（O）”，如图2-15所示；我们刚刚所设置的分区情况，如图2-16所示，若仍想调整，则您可以通过“编辑（E）”、“删除（D）”、“重设（S）”等按钮来实现，单击“下一步（N）”。

图2-14　添加swap分区

图2-15　添加/分区

图2-16　最终分区情况

此时会出现如图2-17所示界面。点击“将修改写入磁盘（W）”。

图2-17　确认写入分区

将分区数据写入磁盘后，分区操作就完成了。

注意事项：硬盘与分区的命名规则。Linux中对硬盘和分区的命名与Windows大不相同。对于常见的IDE硬盘，由于主板上一般只有两个IDE的接口，而每个IDE接口上可以接出来一根数据线，上面可以最多有一个主设备（master）和一个从设备（slave）。Linux中规定，在第一个IDE接口的主设备被称为hda，从设备为hdb，在第2个IDE接口上的主设备被称为hdc，从设备为hdd，如果其中有光盘，也是采用这个命名。对于新的串口IDE硬盘，一般排到hde、hdf等等。假设Linux将安装在hda上。在基于Intel x86系列的机器上，硬盘的第一个磁道（第0柱面、0磁道）不属于任何一个分区，这个磁道的第一个扇区（第0柱面、0磁道、1扇区）叫做主引导扇区，包括主引导记录（Master Boot Record，MBR）和分区表。除了这个磁道外，硬盘的其余部分可以分为最多4个主分区。不同的分区可以包含不同的文件系统，可以用来安装不同的操作系统。另外，其中的一个主分区可以设置为扩展分区，而扩展分区中可以进一步的包括最多63个逻辑分区，每一个逻辑分区也可以包含不同的文件系统。大部分操作系统都必须放在主分区上才可以引导，但Linux并不受此限制。第一个IDE硬盘上第一个主分区为hda1，第二个主分区为hda2，等等。第一个逻辑分区为hda5，第二个逻辑分区为hda6，以此类推。

Linux在安装过程中，在硬盘的空闲空间中至少需要建立两个分区，一个分区用来装数据，可以规定文件系统的类型为ext2或ext3，装载点为“/”。

另外还需要一个交换分区，类型为Linux swap，Linux中的交换空间（Swap space）在物理内存（RAM）被充满时被使用。如果系统需要更多的内存资源，而物理内存已经充满，内存中不活跃的页就会被移到交换空间去。虽然交换空间可以为带有少量内存的机器提供帮助，但是这种方法不应该被当做是对内存的取代。交换空间位于硬盘驱动器上，它比进入物理内存要慢。交换空间可以是一个专用的交换分区（推荐的方法），交换文件，或两者的组合。交换空间的总大小应该相当于你的计算机内存的两倍和32 MB这两个值中较大的一个，但是它不能超过2048 MB（2 GB）。

第十一步　引导装载程序配置

引导程序如图2-18所示，若硬盘上还装有其他系统，在“标签”下，还会出现“Other”行，通过选择其前面的复选框，来设置引导装载程序引导至哪个系统，此处默认为“Fedora”；若想设置引导装载程序口令，则可选其前面的复选框之后，按照相关提示进行设置，此处我们按照默认，不选。单击“下一步（N）”。

图2-18　引导装载程序配置

第十二步　选择软件包组

出现如图2-19所示的界面时，将“办公”、“软件开发”和“网络服务器”三项前的复选框都选中，再选“Fedora”下面的单选框选为“现在定制（C）”。单击“下一步（N）”。

图2-19　安装软件包类型

软件包组选择如图2-20所示。

图2-20　选择软件包组

左侧点选“选桌面环境”选项：选中“GNOME桌面环境”选项；

左侧点选“应用程序”选项：选中“图形、基于文本的互联网、编辑器”选项；选中“办公/生产率、图形化互联网”选项，再单击任选软件包，将其中选项全部选择；

左侧点选“开发”选项：选中“GNOME软件开发、X软件开发、开发工具、开发库”；

左侧点选“服务器”选项：选中“FTP服务器、MySQL数据库、Windows文件服务器、万维网服务器、打印支持、服务器配置工具、网络服务器、邮件服务器”选项，再单击任选软件包，将其中选项全部选择；

左侧点选“基本系统”选项：选中“Java、X窗口系统、基本、字体、拨号网络支持、旧字体、硬件支持、管理工具、系统工具”选项；

左侧点选“语言支持”选项：选中“中文支持、英国英语支持”选项；

也可以根据自己的需要，来进行选择安装哪些软件包；如果空间足够大的话，建议全部安装，会得到更好更完善的性能。

第十三步　正在安装软件包

如图2-21所示，此时系统正在安装您之前所选择的软件包，整个安装过程可能花费的时间，由所选择的软件包个数来决定。请耐心等待。

图2-21　正在安装软件包

第十四步　预选软件包安装完成

等待过后若看到如图2-22所示的界面，则表明预选的软件包已安装完成，此时我们单击“重新引导（t）”。系统将会重新启动，请耐心等待。

图2-22　祝贺您预选的软件包已安装完成

第十五步　系统的基本配置

系统重启后，会出现如图2-23所示界面。

图2-23　系统启动

（1）欢迎界面

如图2-24所示为欢迎界面，单击“前进（F）”。

图2-24　欢迎界面

（2）许可信息

如图2-25所示为许可信息，不需了解我们可直接单击“前进（F）”。

图2-25　许可信息

（3）创建用户

到这步时，系统会要求你添加一个普通用户帐号，请按照提示，填写相关信息，口令长度不少于六位。单击“完成（F）”。如图2-26所示。

图2-26　创建用户

（4）时间与日期设置

为系统设置正确的时间与日期，一般该程序会自动检测当前时间与日期。若时间与日期与当前不符，我们可以自行调整。选择好时间与日期后，单击“前进（F）”，进入下一步。如图2-27所示。

图2-27　时间与日期

（5）硬件配置

如图2-28所示，此处我们选“不要发送配置文件”，单击“完成（F）”。

在选择“不发送配置文件”后，系统会弹出如图2-29所示的对话框，选择“不，不发送”。提示信息消失后将会看到如图2-30所示的登录界面，此时您可以通过前面安装过程中所设置的根用户帐号（超级管理员）或普通用户帐号及口令进行登录。注意，由于根用户具有超级系统权限，一般不到系统出现重大问题时不建议使用。可以通过鼠标来选择屏幕中央的用户名，进行登录，如图2-31所示。成功通过验证后，你就可以看到如图2-32所示的系统桌面了。

图2-28　硬件配置

图2-29　信息发送提示

图2-30　系统登录界面

图2-31　＠-＠！用户登录验证

图2-32　系统桌面

登录系统桌面了后，到此为止，我们的Linux系统就算安装完成了。

比起Windows，尤其Windows 95/98的安装来说，Linux安装向导最大的好处就是有什么问题一气问完再装，当你回答完最后一个问题，提示下面开始安装后，就再也没有问题要问你了，而是进入漫长的安装过程，直到全部装完。当然，中间需要换盘，这个事情需要你的参与，除非使用的是DVD的安装盘，一张盘可以放得下所有的安装文件。一般来讲，完全安装可以需要近1个小时的时间。全部安装完成后，重启就可以进入Linux了。

通过上面的内容，我们可以看到Linux的安装并不复杂，但如果在同一台机器上安装Windows与Linux双系统的话，要考虑的事情还是不少的，主要是硬盘分区和引导程序，如果设置或操作不当，可能会导致硬盘数据丢失或原来的操作系统无法正常引导。对于初学者，也可以在VMWare中安装Linux，不过可能又要学习一下VM-犠犪狉犲。犞犕犠犪狉犲是一个很小的软件，在Windows/Linux等系统中都可以安装，它的作用相当于让我们可以在一个操作系统里把另一个操作系统当做应用程序来安装和运行。VMWare运行时，可以在其中安装一个完整的操作系统，这个操作系统会被分配给CPU、内存、硬盘、网卡等虚拟资源，就像在真正的硬件上安装一样，但是对于外面的操作系统来说，VMWare不过是一个普通的应用程序。这样在VMWare中安装的Linux对外面的Windows没有任何影响，装坏了可以删了重来，就像是把Linux操作系统当做应用程序安装在Windows操作系统里。不过，VMWare主要的不足是比较消耗内存，一般不建议在256M以下的内存的机器上使用。

发行版、安装、引导、分区、虚拟机

1.要安装Fedora Core 9，需要做哪些准备工作？

2.Fedora Core 9可以安装在哪些硬件平台上？都需要哪些安装光盘？

3.安装Fedora Core 9的主要过程是什么？

4.安装Linux前硬盘分区要注意什么问题？

5.什么是系统引导程序？Linux使用什么引导程序？

第三章　开始使用Linux

主要内容

1.登录Linux

2.Linux注销与关机

3.Linux命令的格式

4.基本的Linux命令

5.在Linux中获得帮助

3.1　登录Linux

要使用Linux，第一步要登录到系统中来。首先启动计算机，如果计算机中只安装了一个Linux系统或安装了多系统XP和Linux，在BIOS自检后会看到屏幕出现图3-1的提示。

图3-1　启动提示

稍等一下会进入GRUB启动画面，如果只安装了Linux系统则会直接进入Linux引导画面，若安装了多操作系统XP和Linux，则可能会出现二者之一，这要看安装Linux系统时选择的默认系统而定，如果启动的不是Linux系统，我们可以按“CTRL＋ALT＋DEL”键组重新启动计算机，在出现图3-1画面时快速按下“ESC”键，会出现选择菜单，选择FEDORA并回车即可引导Linux，如图3-2。

图3-2　启动引导界面

在内核载入并进行一系列程序初始化后出现启动各种系统服务和网络连接的图形界面如图3-3。

图3-3　系统启动

等全部系统服务启动后出现图3-4的登录界面，输入用户名回车，再输入密码并回车后即可登录到默认的GNOME图形界面。我们可以通过安装时设置的两个不同类型的用户帐户登录，一个是root用户帐号，一个是普通用户帐户。但是请大家注意，平时如果不是系统维护，最好不用root用户帐号登录系统，由于root用户具有超级系统权限，一般不到系统出现重大问题时不建议使用，还有就是Linux是区分大小写字母的，也就是说ROOT和root并不是一个用户，千万小心呐！在这里，我们现用第一次配置Linux时建立的普通用户登录。

图3-4　登录界面

图3-5　系统桌面

当用户进入Linux时，可以启动相应的shell。shell是一种命令行解释器，负责用户和操作系统的沟通，用户在提示符下输入的每个命令，都是先被shell解释，然后传给内核执行。通过shell，用户可以启动各个命令。shell有很多种，但基本功能大同小异。在大多数Linux中，缺省的shell为Bash，是“Bourne-again shell”的首字母缩写。

Linux除了提供方便的图形界面外，也提供基于文本的命令行界面。如果开机处于文本界面下，可以通过startx命令启动图形界面。

3.2　Linux注销与关机

当一个用户已经登录到Fedora图形界面后想切换成为另一个用户时，需要先注销当前登录用户，然后用新用户名登录：选择“系统”菜单中的“注销”命令，如图3-6，在其后弹出的窗口中选择“注销”并单击“注销”即退出登录，如图3-7。这里介绍一个快速注销方法，同时按Ctrl＋Alt＋BackSpace，只见屏幕迅速黑屏并出现登录界面。

图3-6　系统菜单

图3-7　系统注销

Linux和其他的操作系统一样，是不可以直接用电源来关机的。而且，一般只有系统的管理员root可以发布关机或重启的命令。如果用户想关机、重新启动或休眠，选择“系统”菜单中的“关机”，在其后弹出的窗口中选择“关机”、“重新启动”、“休眠”并单击确定即可。

如果在文本界面上，也可以用下面的命令：

重启：shutdown-r now或reboot

关机：shutdown-h now或halt

图3-8　系统关机

3.3　Linux命令的格式

与其他的UNIX一样，使用和管理Linux需要使用大量的命令。虽然这些命令的功能不同，但它们的使用方式和规则都是统一的。如果在文本界面上，登录后在命令提示符后面就可以输入各种命令，如果在图形界面下，可以启动一个字符终端，在里面也可以输入命令。

Linux中的命令格式一般为：命令名［选项］［参数1］［参数2］……

如：ls-l/home。另外命令还有如下特点：

1.Linux命令由一个命令（command）和零到多个参数构成，命令和参数之间，以及参数与参数之间用空格隔开。命令名由小写的英文字母构成，往往是表示相应功能的英文单词或单词的缩写。例如，date表示日期；who表示谁在系统中；cp是copy的缩写，表示拷贝文件等。

2.选项是对命令的特别定义，以“-”开始，多个选项可用一个“-”连起来，如“ls-l–a”与“ls–la”相同。

3.命令行的参数提供命令运行的信息，或者是命令执行过程中所使用的文件名。通常参数是一些文件名，告诉命令从哪里可以得到输入＜type＝＂text/javascript＂＞，以及把输出送到什么地方。

4.如果命令行中没有提供参数，命令将从标准输入文件（即键盘）接受数据，输出结果显示在标准输出文件（即显示器）上，而错误信息则显示在标准错误输出文件（即显示器）上。可使用重定向功能对这些文件进行重定向。

5.命令在正常执行后返回一个0值，表示执行成功；如果命令执行过程中出错，没有完成全部工作，则返回一个非零值（在Shell中可用变量＄？查看）。在Shell脚本中，可用命令返回值作为控制逻辑的一部分。

6.Linux操作系统的联机帮助对每个命令的准确语法都做了说明，可以使用命令man来获取相应命令的联机说明，如“man ls”。

7.Linux的命令格式和DOS的命令格式相似，但Linux的命令区分大小写，且命令和参数之间必须隔开。如：对DOS来说是以下四条命令是相同的：

cd\tmp

cd\tmp

CD\tmp

cd\Tmp

对Linux操作系统来说，改变目录的命令也是cd命令，以下是正确的Linux cd命令：

cd/tmp

cd/Tmp

但tmp和Tmp是两个不同的目录。

关于Linux命令的选项的使用方法，平时多用几次就会熟悉起来。

3.4　基本的Linux命令

列文件和目录

＄ls
ls命令可以列出某一目录下的文件和子目录。

改变当前目录

＄cd dir
cd命令用于将当前目录切换到指定目录（dir）下。

创建目录

＄mkdir dir
mkdir命令用于创建新的目录（dir）。

删除目录

＄rmdir dir
rmdir命令用于删除一个空目录（dir）。

删除文件

＄rm file
rm命令删除指定的文件（file）。

移动文件

＄mv SourceFile TargetFile
mv命令将源文件（SoreceFile）移动到目标位置并且改名为（TargetFile）。

复制文件

＄cp prog.c prog.bak
cp命令将源文件（prog.c）复制到目标位置并且命名为（prog.bak）。

显示文件

显示文件内容通常可用两个命令，分别是cat，more。

＄cat file
cat命令显示文件file的全部内容。

＄more file
more命令分屏显示文件file的内容并以空格键显示下一屏。

修改用户口令：

普通用户可以修改自己的口令，例如，当前用户为tux1：

＄passwd

Chaging password for tux1

（current）UNIX password：

New UNIX password：

Retype new UNIX password：

超级用户root可以修改所有人的口令，不需要提供该用户的旧口令。

查看时间日期：

＄date

Sat Dec 31 17：13：31 BEIST 2005

查看日历：显示2005年12月的日历

＄cal 12 2005

查看当前有哪些用户登录到系统上，通常有几条命令可以使用

＄who
who命令显示用户ID、登录位置、登录时间日期以及从哪个主机登录（如果使用网络的话）。

＄finger
finger命令显示用户ID、全名，显示控制台、空闲时间、登录时间等。

＄who am i

显示登录时用的用户ID。

＄who am i

显示当前有效ID，系统使用此ID决定用户权限。通过使用su命令，可以临时更改有效ID。

＄su［-］［新用户］

临时切换为新用户，如果省略用户名，则切换为root。这时需要输入新用户的口令。中间的减号代表使用新用户的环境。

＄finger peter

显示用户peter的更详细的信息。

清屏命令

＄clear

将信息显示在屏幕上

＄echo message
echo命令将消息（message）显示在屏幕上，如果在命令行下执行该命令可能没有什么意义，它通常使用在可执行的脚本文件里。

统计文件信息

＄wc［-l］［-w］［-c］filename
wc显示指定文件内所含的行数、单词数及字符数，分别用-l、-w、-c开关指定。若不指定开关选项，将依次显示这几个数字。

接收电子邮件

接收mail：

当有新邮件到来时，屏幕上显示：You have mail in/var/spool/mail/allet

输入mail：详细的使用方法请查看帮助。

向特定的用户终端屏幕上显示消息

＄write team02

Message

＜ctrl-d＞

向所有的用户终端屏幕上显示消息

＄wall

Message

＜ctrl-d＞

两个人交谈：使用talk命令。如John想与Fred交谈，John在命令行上打入

＄talk fred

这时，Fred也打入命令：

＄talk john

两个用户就可以交谈了。

可以用mesg命令设定是否接受消息

＄mesg［y｜n］
root用户可以不受设定的限制。

以上介绍的一些常用命令还会在下面的相关章节中详细解释。

3.5　在Linux中获得帮助

Linux中的指令比较多，用户根本不可能将每个指令的参数记下来，但是我们也不要因为指令多，并且每个指令的参数也非常多就不知道怎么办了。

其实在学习Linux的时候，我们只需要记一些常用的指令和这些指令的参数就可以了。建议大家自己要花时间经常动手。当一些指令的参数很多的时候，我们有的时候还是要靠一些其他的帮助来解决问题，那么在Linux中有哪些取得帮助的方法呢？

1.what is：可以为查询的指令显示简短的功能描述。

2.--help：指令的help参数，用来显示所查询的指令的摘要和参数的列表，大部分指令可以使用--help查看。

3.man：主要是可以提供一些指令的说明文件，每个指令都有相对应的说明文件，这些说明文件称为“man page”，这些说明一起被称为Linux的操作手册。

4.info：类似于man指令，但是提供更详细的说明文件。5、/usr/share/doc目录中的说明文件。

登录、命令格式、常用命令、man帮助文档、关机

1.如何登录到Linux系统？

2.在Linux中如何正常关机？

3.举例说明Linux命令的格式？

4.在Linux中不知道怎么用一个命令怎么办？

5.如何查看当前有哪些用户在线？

第四章　文件和目录

主要内容

1.Linux中文件的概念

2.使用和管理目录

3.使用和管理文件

4.链接文件与inode

5.文件的权限

6.Linux的目录结构

7.文件系统

4.1　Linux中文件的概念

在Linux中，一个文件是一组数据的集合，可以被理解为一个字符流或字节流，Linux并不为文件设计内部结构，而把文件都理解为无结构的数据集合。在Linux中，“文件”这个概念包含了三类概念，即普通文件、目录和特殊文件。普通文件即我们平时说的狭义的“文件”，往往是一组特定数据的集合，像一张图片、一首MP3、一部电影或一个文档等。目录就是Windows中的“文件夹”，作用是存放其他目录或文件，Linux将所有的文件都存放在各个目录下，组成一棵目录树。在Linux中，所有的设备都有文件与之对应，这些文件就属于特殊文件。以上三类在Linux中均称为文件，即广义上的“文件”。

Linux中的文件是通过文件名来访问的。文件名应该反映文件的内容，并且要满足下列的条件：

由大写字母、小写字母、数字和一些特殊符号组成。

不可以包含*？＜＞（）［］｛｝/\｜“｀＆；！等符号。

＋—可以出现在文件名中，但是不能作为文件名中的第一个字母。

文件名中一般不应该包含空格。

更重要的是，Linux的文件名是大小写敏感的，即ABC和abc是不同的两个文件，而在DOS/Windows中，两个文件名如果只有大小写上的差异，就被认为是同一个文件。另外，Linux中文件名没有扩展名的概念，例如Linux中的可执行文件不一定要叫做*.exe。还有Linux中文件没有“隐藏”属性，在Linux中，如果一个文件的文件名的第一个字母是“.”，那么这个文件就是隐藏文件，在一般命令中是不查看隐藏文件的。

4.2　使用和管理目录

Linux的目录结构是树状层次结构。其中有且仅有一个根目录，标为“/”。根目录下包含其他的目录或文件，而各目录中也可以包含子目录或文件。

在Linux系统中，要指明一个目录或文件，有两种表示方法，如果一个目录以“/”起始，表示这个目录是从根目录开始一级一级的表示，这样的表示方式叫做绝对路径，如果一个目录不以“/”起始，表示这个目录是从当前目录开始表示。对用户的shell中，当前目录只有一个，就是用户当时所在的目录。显示当前目录可以使用pwd命令。

命令：pwd （Print Working Directory）

功能：显示当前目录

语法：pwd

要更改当前目录，可以使用cd命令。如cd doc（相对路径）、cd/home/tux1/doc（绝对路径）。

在Linux文件系统中，每个用户都有一个属于自己的目录，用来存放个人文件的，这个目录通常是在/home目录下以该用户名字命名的目录，如用户user1的主目录通常为/home/user1。在Linux中，“～”代表主目录（home directory），“.”代表当前目录，“..”代表当前目录的父目录，所以，使用cd..命令回到父目录，使用cd～或只用cd不含参数回到自己的主目录。使用cd～user1切换到user1的主目录。另外，使用cd-可以回到刚才的目录，比如你本来在目录A中，通过cd命令切换到目录B，这时候，输入cd-就从目录B回到了目录A，注意目录A与目录B并不一定有父子关系。

命令：cd （change directory）

功能：切换目录

语法：cd［target directory］

在Linux中，创建一个目录的命令是mkdir，删除一个目录的命令是rmdir。

命令：mkdir（make directory）

功能：新建目录

语法：mkdir［directory］

命令：rmdir（remove directory）

功能：删除目录

语法：rmdir［directory］
mkdir和rmdir的参数可以是相对路径，也可以是绝对路径。使用rmdir目录，要求目录是空目录，且不是当前目录或当前目录在这个目录下。如果目录非空，可以使用rm-rf dirname命令。另外，在mkdir和rmdir命令中可以使用“-p”参数，可以创建或删除多个目录。如mkdir-p dir1/dir2，可以在当前目录下创建dir1目录并在其中新建dir2目录。同理，rmdir-p dir1/dir2可以同时删除多级目录。

显示目录中的内容，可以使用ls命令。

命令：ls（list）

功能：显示目录包含的内容

说明：ls包含许多选项。如果不指定参数的话，就显示当前目录中所有的文件和目录。常用选项

●　显示所有文件，包括隐藏文件：-a

●　显示所有文件，包括子目录下的文件：-R

●　显示文件的详细信息：-l

●　显示目录的信息而不是目录所含的内容：-d

●　使用--color，可以用不同颜色来标示不同的文件。普通文件：缺省色（灰色）。目录：蓝色。可执行文件：绿色。特殊文件：黄色。通过修改LS＿COLORS或LS＿COLOURS变量，可以设定缺省的颜色。

例：

［tux＠localhost/］＄ls
bin　dev　home　lib64　media　mnt　opt　root　seLinux　sys　tmp　var
boot　etc　lib　lost＋found　misc　net　proc　sbin　srv　tftpboot　usr

［tux＠localhost/］＄ls-l
drwxr-xr-x　　2 root root　4096 Jan 25 04：18 bin
drwxr-xr-x　　4 root root　4096 Jan 24 10：12 boot
drwxr-xr-x　10 root root　5560 Jan 24 17：20 dev
drwxr-xr-x　116 root root　12288 Jan 2504：18 etc
drwxr-xr-x　　4 root root　4096 Jan 24 10：47 home
drwxr-xr-x　10 root root　4096 Jan 2504：14 lib
drwxr-xr-x　　7 root root　4096 Jan 2504：12 lib64
drwx------　　　2 root root　16384 Jan 24 17：54 lost＋found
drwxr-xr-x　　3 root root　4096 Jan 24 17：20 media
drwxr-xr-x　　2 root root　　0 Jan 24 17：20 misc
drwxr-xr-x　　2 root root　4096 May 23 2005 mnt
drwxr-xr-x　　2 root root　　0 Jan 24 17：20 net
drwxr-xr-x　　3 root root　4096 May 23 2005 opt
dr-xr-xr-x　94 root root　　0 Jan 2501：19 proc
drwxr-x---　13 root root　4096 Jan 25 10：06 root
drwxr-xr-x　　2 root root　12288 Jan 2504：18 sbin
drwxr-xr-x　　1 root root　　0 Jan 2501：19 seLinux
drwxr-xr-x　　2 root root　4096 May 23 2005 srv
drwxr-xr-x　10 root root　　0 Jan 2501：19 sys
drwxr-xr-x　　3 root root　4096 Jan 24 10：32 tftpboot
drwxrwxrwt　16 root root　4096 Jan 25 10：06 tmp
drwxr-xr-x　16 root root　4096 Jan 24 10：01 usr
drwxr-xr-x　28 root root　4096 Jan 24 10：29 var

用ls–l显示的是文件的详细信息，一个文件一行，每行由7列组成，其中第一列为文件的类型和权限，第一个字母为文件的类型，常见的“d”为目录，“-”为普通文件，其余9位是文件的权限，下面有详细的叙述。第二列为文件的链接数，下面也会再叙述。第三列为文件的所有者，第四列为文件所在的组，第五列为文件的大小，第六列为文件最后修改时间，第七列为文件名。

4.3　使用和管理文件

在Linux中对文件的操作主要有：创建、复制、移动和删除一个文件或为一个文件改名，查看文本文件的内容以及打印一个文件等。

在Linux中，用touch命令可以创建一个0字节的空文件或更新文件的时间戳。

命令：touch

作用：更新文件的时间戳，如果这个文件不存在，则产生一个空文件

格式：touch filename

说明：touch命令可以用来将一批文件的最后访问时间和最后修改时间改为当前时间，一般在发布一批文件时使用。不过，touch命令更常用的地方是用来创建一个文件。因为在Linux中，有些场合只需要有一个特定名字的文件存在即可，这时候就可以用touch命令。

在Linux中复制文件可以使用cp命令。

命令：cp（copy）

格式：1）cp［options］source dest

2）cp［options］source...directory
cp命令有两个格式，第一种是将一个文件复制一份，这时第二个参数dest可以是一个文件，也可以是一个目录，如果是一个文件，就把源文件复制为目标文件，如果是一个目录，就将文件复制到这个目录中，并保持源文件名。

例：
cp myfile1 myfile2

在当前目录中为myfile1创建一个复本myfile2
cp myfile1～/doc/

将当前目录下myfile1文件复制到主目录下的doc目录中，保持原文件名。

第二种是将多个文件复制到一个目录中，这时候，最后一个参数必须是目录。

例：
cp myfile1 myfile2 doc/

将当前目录下的myfile1和myfile2复制到doc目录中，保持原文件名不变。常用选项：

-p：保持文件原来的属性

-R：如果被复制的对象有目录，加上-R就可以将该目录下的子目录及子目录下的文件均复制到指定目录中。

使用mv命令可以移动文件或为文件改名。

命令：mv（move）

格式：mv［options］source dest

mv［options］source...directory
mv的第一种格式是将一个文件改名为另一个文件。如：
mv myfile1 myfile2

另一种格式是将一个或多个文件移动到一个目录中，这时候最后一个参数必须是目录。所有的文件将保持原文件名不变。如：
mv myfile1 myfile2 dir1/

Linux中可以使用rm命令删除文件。

命令：rm（remove）

格式：rm［options］file...

rm可以删除一个或多个文件。如果使用-r或-R的参数，还可以删除目录。常用选项：

-R或-r：递归删除，可以用来删除一个目录，无论其中是否有东西

-i：删除前先询问

-f：强制删除。

例如：
rm–i file*

删除当前目录下所有以file打头的文件，删除前先询问。

rm–rf doc/

删除目录doc，无论是否是空目录。

查看文本文件的内容，可以使用很多命令，如cat，more，less，head，tail。

命令：cat（concatenate）

作用：显示一个文件的内容

命令：more，less

作用：

分屏显示一个文件的内容

命令：head，tail

作用：显示一个文件的前若干行或后若干行

例：

显示一个文件的前5行：head–5 file1显示一个文件的后15行：tail–15 file1

显示一个文件从第20行开始之后的行：tail＋20 file1

显示一个文件的后10行，并且不退出，当文件被更新时立即显示：tail–f file1

显示二进制文件，使用od命令。显示二进制文件中的字符串，使用string命令。使用lpr命令把文件送入打印队列，使用lpq命令查看打印队列的状态，取消一个打印任务，使用lprm job＿id命令。

Linux中有一条强大的按照制定规则查找文件的命令：find。由于find具有强大的功能，所以它的选项也很多，其中大部分选项都值得我们花时间来了解一下。在运行一个非常消耗资源的find命令时，很多人都倾向于把它放在后台执行，因为遍历一个大的文件系统可能会花费很长的时间（这里是指30G字节以上的文件系统）。

命令：find

一、find命令格式

1.find命令的一般形式为：
find pathname-options［-print-exec-ok...］

2.find命令的参数
pathname：find命令所查找的目录路径。例如用“.”来表示当前目录，用“/”来表示系统根目录。

-print：find命令将匹配的文件输出到标准输出。

-exec：find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为command｛｝\；，注意｛｝和\之间的空格。

-ok：和-exec的作用相同，只不过以一种更为安全的模式来执行该参数所给出的shell命令，在执行每一个命令之前，都会给出提示，让用户来确定是否执行。

3.find命令选项

-name

按照文件名查找文件。

-perm

按照文件权限来查找文件。

-prune

使用这一选项可以使find命令不在当前指定的目录中查找，如果同时使用-depth选项，那么-prune将被find命令忽略。

-user

按照文件属主来查找文件。

-group

按照文件所属的组来查找文件。

-mtime-n＋n

按照文件的更改时间来查找文件，-n表示文件更改时间距现在n天以内，＋n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime选项，但它们都和-m time选项。

-nogroup

查找无有效所属组的文件，即该文件所属的组在/etc/group中不存在。

-nouser

查找无有效属主的文件，即该文件的属主在/etc/passwd中不存在。

-newer file1！file2

查找更改时间比文件file1新但比文件file2旧的文件。

-type

查找某一类型的文件，诸如：
b-块设备文件。

d-目录。

c-字符设备文件。

p-管道文件。

l-符号链接文件。

f-普通文件。

-size n：［c］查找文件长度为n块的文件，带有c时表示文件长度以字节计。

-depth：在查找文件时，首先查找当前目录中的文件，然后再在其子目录中查找。

-fstype：查找位于某一类型文件系统中的文件，这些文件系统类型通常可以在配置文件/etc/fstab中找到，该配置文件中包含了本系统中有关文件系统的信息。

-mount：在查找文件时不跨越文件系统mount点。

-follow：如果find命令遇到符号链接文件，就跟踪至链接所指向的文件。

-cpio：对匹配的文件使用cpio命令，将这些文件备份到磁带设备中。

另外，下面三个的区别：

-amin n

查找系统中最后n分钟访问的文件

-atime n

查找系统中最后n*24小时访问的文件

-cmin n

查找系统中最后n分钟被改变文件状态的文件

-ctime n

查找系统中最后n*24小时被改变文件状态的文件

-mmin n

查找系统中最后n分钟被改变文件数据的文件

-mtime n

查找系统中最后n*24小时被改变文件数据的文件

4.使用exec或ok来执行shell命令

使用find时，只要把想要的操作写在一个文件里，就可以用exec来配合find查找，很方便的。在有些操作系统中只允许-exec选项执行诸如ls或ls-l这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行rm命令删除文件之前，最好先用ls命令看一下，确认它们是所要删除的文件。

exec选项后面跟随着所要执行的命令或脚本，然后是一对儿“｛｝”，一个空格和一个“\”，最后是一个分号。如果验证一下find命令，会发现该命令只输出从当前路径起的相对路径及文件名。

例如：为了用ls-l命令列出所匹配到的文件，可以把ls-l命令放在find命令的-exec选项中：

＃find.-type f-exec ls-l｛｝\；

-rw-r--r--1 root root 34928 2003-02-25./conf/httpd.conf

-rw-r--r--1 root root 12959 2003-02-25./conf/magic

-rw-r--r--1 root root 180 2003-02-25./conf.d/README

上面的例子中，find命令匹配到了当前目录下的所有普通文件，并在-exec选项中使用ls-l命令将它们列出。

在logs目录中查找更改时间在5日以前的文件并删除它们：

＄find logs-type f-mtime＋5-exec rm｛｝\；

记住：在shell中用任何方式删除文件之前，应当先查看相应的文件，一定要小心！当使用诸如mv或rm命令时，可以使用-exec选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。

在下面的例子中，find命令在当前目录中查找所有文件名以.conf结尾、更改时间在5日以上的文件，并删除它们，只不过在删除之前先给出提示。

＄find.-name“*.conf”-mtime＋5-ok rm｛｝\；

＜rm..../conf/httpd.conf＞？n

按y键删除文件，按n键不删除。

任何形式的命令都可以在-exec选项中使用。

在下面的例子中我们使用grep命令。find命令首先匹配所有文件名为“passwd*”的文件，例如passwd、passwd.old、passwd.bak，然后执行grep命令看看在这些文件中是否存在一个sam用户。

＃find/etc-name“passwd*”-exec grep“sam”｛｝\；
sam：x：501：501：：/usr/sam：/bin/bash

二、find命令的例子

1.查找当前用户主目录下的所有文件

下面两种方法都可以使用：

＄find＄HOME-print

＄find～-print

2.让当前目录中文件属主具有读、写权限，并且文件所属组的用户和其他用户具有读文件的权限。

＄find.-type f-perm 644-exec ls-l｛｝\；

3.查找系统中所有文件长度为0的普通文件，并列出它们的完整路径。

＄find/-type f-size0-exec ls-l｛｝\；

4.查找/var/logs目录中更改时间在7日以前的普通文件，并在删除之前询问它们。

＄find/var/logs-type f-mtime＋7-ok rm｛｝\；

5.查找系统中所有属于root组的文件。

＄find.-group root-exec ls-l｛｝\；

-rw-r--r--1 root root 595 10月3101：09./file

6.find命令将删除当目录中访问时间在7日以来、含有数字后缀的admin.log文件。

该命令只检查三位数字，所以相应文件的后缀不要超过999。先建几个admin.log*的文件，才能使用下面这个命令：

＄find.-name“admin.log［0-9］［0-9］［0-9］”-atime-7–ok rm｛｝\；

＜rm..../admin.log001＞？n

＜rm..../admin.log002＞？n

＜rm..../admin.log042＞？n

＜rm..../admin.log942＞？n

7.查找当前文件系统中的所有目录并排序。

＄find.-type d｜sort

8.查找系统中所有的rmt磁带设备。

＄find/dev/rmt-print

三、xargs
xargs–从标准输入中创建并执行命令行

在使用find命令的-exec选项处理匹配到的文件时，find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制，这样在find命令运行几分钟之后，就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在，特别是与find命令一起使用。

find命令把匹配到的文件传递给xargs命令，而xargs命令每次只获取一部分文件而不是全部，不像-exec选项那样。这样它可以先处理最先获取的一部分文件，然后是下一批，并如此继续下去。

在有些系统中，使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程，并非将匹配到的文件全部作为参数一次执行。这样在有些情况下就会出现进程过多、系统性能下降的问题，因而效率不高。

而使用xargs命令则只有一个进程。另外，在使用xargs命令时，究竟是一次获取所有的参数，还是分批取得参数，以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

来看看xargs命令是如何同find命令一起使用的，并给出一些例子。

下面的例子查找系统中的每一个普通文件，然后使用xargs命令来测试它们分别属于哪类文件。

＃find.-type f-print｜xargs file

./.kde/Autostart/Autorun.desktop：UTF-8 Unicode English text

./.kde/Autostart/.directory：ISO-8859 text\

......

在整个系统中查找内存信息转储文件（core dump），然后把结果保存到/tmp/ core.log文件中：

＄find/-name＂core＂-print｜xargs echo＂＂＞/tmp/core.log

上面这个执行太慢，改成在当前目录下查找

＃find.-name＂file*＂-print｜xargs echo＂＂＞/temp/core.log

＃cat/temp/core.log

./file6

在当前目录下查找所有用户具有读、写和执行权限的文件，并收回相应其他用户的写权限：

＃ls-l
drwxrwxrwx 2 sam adm 4096 10月30 20：14 file6

-rwxrwxrwx 2 sam adm0 10月3101：01 http3.conf

-rwxrwxrwx 2 sam adm0 10月3101：01 httpd.conf

＃find.-perm-7-print｜xargs chmod o-w

＃ls-l
drwxrwxr-x 2 sam adm 4096 10月30 20：14 file6

-rwxrwxr-x 2 sam adm0 10月3101：01 http3.conf

-rwxrwxr-x 2 sam adm0 10月3101：01 httpd.conf

用grep命令在所有的普通文件中搜索hostname这个词：

＃find.-type f-print｜xargs grep“hostname”

./httpd1.conf：＃different IP addresses or hostnames and have them handled by the./httpd1.conf：＃VirtualHost：If you want to maintain multiple domains/hostnames on your

用grep命令在当前目录下的所有普通文件中搜索hostnames这个词：

＃find.-name\*-type f-print｜xargs grep“hostnames”

./httpd1.conf：＃different IP addresses or hostnames and have them handled by the./httpd1.conf：＃VirtualHost：If you want to maintain multiple domains/hostnames on your

注意，在上面的例子中，\用来取消find命令中的*在shell中的特殊含义。

find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。

四、find命令的参数

下面是find一些常用参数的例子，有用到的时候查查就行了。

1.使用name选项

文件名选项是find命令最常用的选项，要么单独使用该选项，要么和其他选项一起使用。

可以使用某种文件名模式来匹配文件，记住要用引号将文件名模式引起来。

不管当前路径是什么，如果想要在自己的根目录＄HOME中查找文件名符合*. txt的文件，使用～作为“pathname”参数，波浪号～代表了你的＄HOME目录。

＄find～-name“*.txt”-print

想要在当前目录及子目录中查找所有的‘*.txt’文件，可以用：

＄find.-name“*.txt”-print

想要的当前目录及子目录中查找文件名以一个大写字母开头的文件，可以用：

＄find.-name“［A-Z］*”-print

想要在/etc目录中查找文件名以host开头的文件，可以用：

＄find/etc-name“host*”-print

想要查找＄HOME目录中的文件，可以用：

＄find～-name“*”-print或find.-print

要想让系统高负荷运行，就从根目录开始查找所有的文件。

＄find/-name“*”-print

如果想在当前目录查找文件名以两个小写字母开头，跟着是两个数字，最后是.txt的文件，下面的命令就能够返回名为ax37.txt的文件：

＄find.-name“［a-z］［a-z］［0-9］［0-9］.txt”-print

2.使用perm选项

按照文件权限模式用-perm选项，按文件权限模式来查找文件的话。最好使用八进制的权限表示法。

如在当前目录下查找文件权限位为755的文件，即文件属主可以读、写、执行，其他用户可以读、执行的文件，可以用：

＄find.-perm 755-print

还有一种表达方法：在八进制数字前面要加一个横杠“-”，表示都匹配，如-007就相当于777，-006相当于666

＃ls-l

-rwxrwxr-x 2 sam adm0 10月3101：01 http3.conf

-rw-rw-rw-1 sam adm 34890 10月3100：57 httpd1.conf

-rwxrwxr-x 2 sam adm0 10月3101：01 httpd.conf
drw-rw-rw-2 gem group 4096 10月26 19：48 sam

-rw-rw-rw-1 root root 2792 10月31 20：19 temp

＃find.-perm006

＃find.-perm-006

./sam

./httpd1.conf

./temp

-perm mode：文件权限位等于mode值

-perm＋mode：mode的值对应的其中一位权限在文件中被设置

-perm–mode：mode的值对应的权限在文件中被设置

3.忽略某个目录

如果在查找文件时希望忽略某个目录，因为你知道那个目录中没有你所要查找的文件，那么可以使用-prune选项来指出需要忽略的目录。在使用-prune选项时要当心，因为如果你同时使用了-depth选项，那么-prune选项就会被find命令忽略。

如果希望在/apps目录下查找文件，但不希望在/apps/bin目录下查找，可以用：

＄find/apps-path“/apps/bin”-prune-o-print

4.使用find查找文件的时候怎么避开某个文件目录

比如要在/usr/sam目录下查找不在dir1子目录之内的所有文件
find/usr/sam-path“/usr/sam/dir1”-prune-o-print
find［-path...］［expression］在路径列表的后面的是表达式

-path“/usr/sam”-prune-o-print是-path“/usr/sam”-a-prune-o

-print的简写表达式按顺序求值，-a和-o都是短路求值，与shell的＆＆和｜｜类似。如果-path“/usr/sam”为真，则求值-prune，-prune返回真，与逻辑表达式为真。否则不求值-prune，与逻辑表达式为假。如果-path“/usr/sam”-a-prune为假，则求值-print，-print返回真，或逻辑表达式为真。否则不求值-print，或逻辑表达式为真。

这个表达式组合特例可以用伪码写为
if-path“/usr/sam”then

-prune
else

-print

避开多个文件夹
find/usr/sam\（-path/usr/sam/dir1-o-path/usr/sam/file1\）-prune-o-print圆括号表示表达式的结合。

\表示引用，即指示shell不对后面的字符作特殊解释，而留给find命令去解释其意义。

查找某一确定文件，-name等选项加在-o之后

＃find/usr/sam\（-path/usr/sam/dir1-o-path/usr/sam/file1\）-prune-o-name“temp”-print

5.使用user和nouser选项

按文件属主查找文件，如在＄HOME目录中查找文件属主为sam的文件，可以用：

＄find～-user sam-print

在/etc目录下查找文件属主为uucp的文件：

＄find/etc-user uucp-print

为了查找属主帐户已经被删除的文件，可以使用-nouser选项。这样就能够找到那些属主在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时，不必给出用户名。find命令能够为你完成相应的工作。

例如，希望在/home目录下查找所有的这类文件，可以用：

＄find/home-nouser-print

6.使用group和nogroup选项

就像user和nouser选项一样，针对文件所属于的组，find命令也具有同样的选项，为了在/apps目录下查找属于gem组的文件，可以用：

＄find/apps-group gem-print

要查找没有有效所属组的所有文件，可以使用nogroup选项。下面的find命令从文件系统的根目录处查找这样的文件：

＄find/-nogroup-print

7.按照更改时间或访问时间等查找文件

如果希望按照更改时间来查找文件，可以使用mtime，atime或ctime选项。如果系统突然没有可用空间了，很有可能某一个文件的长度在此期间增长迅速，这时就可以用mtime选项来查找这样的文件。

用减号（—）来限定更改时间在距今n日以内的文件，而用加号＋来限定更改时间在距今n日以前的文件。

希望在系统根目录下查找更改时间在5日以内的文件，可以用：

＄find/-mtime-5-print

为了在/var/adm目录下查找更改时间在3日以前的文件，可以用：

＄find/var/adm-mtime＋3-print

8.查找比某个文件新或旧的文件

如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件，可以使用-ne-wer选项。它的一般形式为：
newest＿file＿name！oldest＿file＿name

其中，！是逻辑非符号。

查找更改时间比文件sam新但比文件temp旧的文件：

例：有两个文件

-rw-r--r--1 sam adm0 10月3101：07 file

-rw-rw-rw-1 sam adm 34890 10月3100：57 httpd1.conf

-rwxrwxr-x 2 sam adm0 10月3101：01 httpd.conf
drw-rw-rw-2 gem group 4096 10月26 19：48 sam

-rw-rw-rw-1 root root 2792 10月31 20：19 temp

＃find-newer httpd1.conf！-newer temp-ls

10776690-rwxrwxr-x 2 sam adm0 10月3101：01./httpd.conf

1077671 4-rw-rw-rw-1 root root 2792 10月31 20：19./temp

10776730-rw-r--r--1 sam adm0 10月3101：07./fiel

查找更改时间比temp文件新的文件：

＄find.-newer temp-print

9.使用type选项

在/etc目录下查找所有的目录，可以用：

＄find/etc-type d-print

在当前目录下查找除目录以外的所有类型的文件，可以用：

＄find.！-type d-print

在/etc目录下查找所有的符号链接文件，可以用：

＄find/etc-type l-print

10.使用size选项

可以按照文件长度来查找文件，这里所指的文件长度既可以用块（block）来计量，也可以用字节来计量。以字节计量文件长度的表达形式为N c。以块计量文件长度只用数字表示即可。

在按照文件长度查找文件时，一般使用这种以字节表示的文件长度，来查看文件系统的大小，因为这时使用块来计量更容易转换。

在当前目录下查找文件长度大于1 M字节的文件：

＄find.-size＋1000000c-print

在/home/apache目录下查找文件长度恰好为100字节的文件：

＄find/home/apache-size100c-print

在当前目录下查找长度超过10块的文件（一块等于512字节）：

＄find.-size＋10-print

11.使用depth选项

在使用find命令时，可能希望先匹配所有的文件，再在子目录中查找。使用depth选项就可以使find命令这样做。这样做的一个原因就是，当在使用find命令向磁带上备份文件系统时，希望首先备份所有的文件，其次再备份子目录中的文件。

在下面的例子中，find命令从文件系统的根目录开始，查找一个名为CON.FILE的文件。

它将首先匹配所有的文件然后再进入子目录中查找。

＄find/-name“CON.FILE”-depth-print

12.使用mount选项

在当前的文件系统中查找文件（不进入其他文件系统），可以使用find命令的mount选项。

从当前目录开始查找位于本文件系统中文件名以XC结尾的文件：

＄find.-name“*.XC”-mount-p rint

4.4　链接文件与inode

Linux中用于共享文件时有个非常有特色的地方，叫做链接（link）。链接分为硬链接（hard link）和符号连接（symbolic link）两种，要学习链接，就必须先了解Linux中文件的inode与目录项之间的关系。

Linux中常用的文件系统为ext2/3等。以ext2文件系统为例，每个文件都由三部分组成，即文件名、文件属性和数据。其中，一个文件都有一个叫做inode的数据结构，其中存放了文件的各种属性，如文件的主人、所在组、权限、大小、最后访问时间等，另外还有指针指向数据块。文件与inode是一一对应关系，每个inode有一个编号，可以称做i-number。

与我们在Windows的经验不同的是，文件的inode中并不包含文件的名字。文件的名字存放在文件所在的目录中。Linux中的目录由若干目录项组成，每个目录项只包含两项信息，即这个目录中的文件的名字与对应的inode编号。

图4.1　目录项与文件inode

这样，有可能出现一种特殊的情况，就是多个目录项对应同一个inode，也就是一个文件可能有多个文件名。这些文件名可能属于同一个目录，也可能属于不同的目录。一个文件的多个名字叫做文件的硬链接，简称链接。

命令：ln（link）

作用：为一个文件建立硬链接

格式：ln原文件名新链接名

在文件的inode中，有一个记录文件链接个数的数字，叫做link counter，一个文件有几个硬链接，这个link counter就是几。一个文件如果有多个链接（文件名），那么这些链接的地位是一样的，用户可以通过任何一个链接来访问这个文件。

如果使用rm命令删除文件的话，删除的其实是文件的一个链接。如果一个文件的链接数大于1的话，系统仅仅是删除相应的目录项，并将inode中的link counter减1，并不真正删除文件，只有当这个文件的所有链接都被删除，即link counter变为0时，文件才会被真正的不可恢复的删除。

除了硬链接以外，Linux还支持另外一种链接，叫符号链接或软链接。所谓符号链接，与原文件不是同一个文件，但是符号链接中文件的数据部分存放的是一个指向目标文件的指针，可以通过一个符号链接来访问原文件。

建立符号链接的格式：ln–s原文件名符号链接名

用ls–l查看时，一个符号链接文件的第一个属性字母为l，代表符号链接。

为一个文件增加一个符号链接，并不会增大原文件的link counter，反之，删除符号链接也不会减少原文件的link counter。如果原文件被删除，那么符号链接仍然存在，但成为了一个无效的链接。与建立硬链接不同，为一个文件建立符号链接不需要对原文件有任何权限。事实上，完全可以为一个根本不存在的目标建立符号链接。在一定程度上，符号链接像Windows系统中的快捷方式。

符号链接是对硬链接重要的补充，这是因为有两种场合下是不可以建立硬链接的。一是不能为目录建立硬链接，这是因为硬链接增加了文件系统的复杂性，如果目录也支持硬链接，就有可能建立出环状的目录结构。二是不能为一个文件在不同卷，即不同的文件系统上建立硬链接。

链接是Linux管理文件的一个比较有特色的地方，有了链接，就可以更方便的共享文件。

4.5　文件的权限

●　使用ls-l命令，可以查看文件的权限

●　普通文件有r w x三种权限

●　目录文件也有r w x三种权限

●　文件的权限对三类人设定不同的权限：文件所有者、同组人、其他人

●　可以使用符号或八进制数来设置文件权限

●　使用umask设定文件和目录的缺省权限

使用ls-l命令查看文件的权限。在每一个文件的第一段为10位字母，第一个字母是文件的属性，“-”代表普通文件，“d”代表目录文件，“l”代表符号链接，“b”“c”代表设备。后面9位为文件的权限，分为三段，分别代表“所有者（u）”、“同组人（g）”、“其他人（o）”的读（r）、写（w）、执行（x）的权限。

对普通文件而言，“r”代表可以阅读文件内容，“w”代表可以修改或删除文件内容，“x”代表可以将文件作为命令来执行（同时需要r权限）。

对目录文件而言，“r”代表可以列出目录所包括的文件，“w”可以在目录内创建或删除文件（同时需要x权限），“x”表明目录可以做为活动目录。

命令：chmod（change mode）

作用：修改文件的权限

格式：chmod［options］符号权限或八进制权限files……

例如：使用符号来改变文件的权限。例如：chmod go-x doc为删除doc文件的同组人和其他人的执行权。chmod u-x，go＋w doc为删除doc文件所有者的执行权并添加同组人和其他人的写权。

使用八进制数来设置文件权限。三位八进制数，分别代表“所有者（u）”、“同组人（g）”、“其他人（o）”，读（r）、写（w）、执行（x）的权限用4，2，1代表。例：744代表rwxr--r--，666代表rw-rw-rw。

umask（掩码）是在创建文件时设置缺省权限用的。创建普通文件时，由666减umask。创建目录的缺省权限，是由777减umask。对普通用户而言，umask＝002，即新创建文件和目录的缺省权限分别为664和775。对root用户而言，umask＝022，即新创建文件和目录的缺省权限分别为644和755。可以在/etc/profile内设定umask值。

4.6　Linux目录结构

大部分Linux发布版都遵循标准Linux文件系统，这个标准规定了很多文件和目录的位置和名字。可以通过查看http://www.pathname.com/fhs来了解这个标准。这个标准大部分兼容了传统的UNIX文件系统，并做了小的改动。下面对这些目录的内容加以说明。

图4.2　目录结构示意图

/bin，/lib，/sbin

●　/bin目录包含供每个人使用的可执行程序。

●　/sbin目录包含仅供管理员使用的可执行程序。

●　/lib目录包含库文件。

/bin下的程序所有人都可以用，而/sbin下的程序一般只供管理员使用。所以，普通用户的＄PATH变量中不包括/sbin目录，而管理员的＄PATH里就有。

这三个目录在系统启动后、在单用户模式下或是用急救盘启动等各种情况都应该可见，所以它们不应该在独立的文件系统中。

/boot

●　/boot目录包括了内核镜像和其他相关内容。

●　应该放在硬盘1023柱面以前。如果/分区在1024柱面以后，则应该为/boot单独划在一个分区上。

由于BIOS设计的限制，在系统启动时，所有的内核文件要处在硬盘1023柱面以前，对于使用LBA（Linear Block Addressing）模式的硬盘而言，即8G以前。尽管在Linux启动以后，操作系统接管时，就可以绕过BIOS的这个限制，但是在启动时/ boot目录下的东西仍然需要放在硬盘1023柱面以前。所以，如果根目录所在的分区处在硬盘1024柱面以后，则应该为/boot单独划在一个分区上。当然，现在很多新的BI-OS已经可以存取1024以后的内容，但这并不是标准。

/dev

●　/dev目录包含着代表硬件设备的特殊文件，主要有：块设备，如硬盘。字符设备，如磁带机和串设备。命名管道和UNIX套接口（sockets）等。

●　每一个设备都有一个主编号和次编号，内核通过这些编号来识别设备。

●　/dev目录不能单独划在一个分区上。

在类UNIX的系统中，所有的设备和文件一样统一管理。用户可以对/dev目录的特殊文件访问来使用设备。由于这样比较危险，所以一般仅管理员可以这么做。在/ dev目录下有四类特殊文件：

字符设备。这类设备的权限位以c打头。对这类设备的存取将是以一个串行方式进行。例如：tty（终端），鼠标，空设备null，零设备zero，随机设备random。

块设备。这类设备的权限位以b打头。对这类设备可以随机存取。

命名管道。这类设备的权限位以p打头。在输入输出重定向时可以使用到这类设备。

UNIX套接口。这类设备的权限位以s打头。这些套接口可以在没有运行TCP/IP时像TCP/IP连接一样运行。只有在调用到套接口的程序中才可以使用这些套接口。

块设备和字符设备都有一个主编号和次编号。内核通过这些编号来识别设备。

块设备、字符设备和命名管道都可以使用mknod命令来创建，UNIX套接口则由程序创建。

/etc

●　/etc目录包含着整个系统的各种配置文件。

●　/etc目录不能单独划在一个分区上。

/etc目录是存放配置文件的目录，比如我们已经见过的/etc/inittab和/etc/ lilo.conf，但还有许多其他的配置文件。

/etc/X11包含X-Window的配置文件。

/etc/skel包含着用户缺省的配置文件。当新建一个用户时，将这个目录的内容复制到用户主目录下。

/etc/rc.d包含系统启动脚本。这些脚本将由/etc/inittab调用。

/etc/sysconfig包含系统配置文件。

/home，/root

●　/home目录包含各用户的主目录。

●　/root目录是root的主目录。

●　/home目录一般为独立的分区。/root目录不作为独立的分区。

当新建一个用户时，如果没有专门指定目录的话，用户主目录是/home目录下同用户名的目录。root用户的主目录则设置为/root目录。这主要是为了保存用户数据，用户主目录/home一般为独立的分区，但为了防止系统在装载文件系统时发生问题，root用户的主目录不放在/home下。

/mnt

●　/mnt目录包含装载其他非标准文件系统的装载点。

●　/mnt目录一般不是独立的分区。

由于UNIX类的操作系统对文件系统的使用是通过装载（mount）到/目录树上，所以Linux专门指定在/mnt目录下设置一些空目录为其他非标准文件系统的装载点。如/mnt/floppy用来装载软盘，/mnt/cdrom用来装载光盘。当然，还可以将其他文件系统装载在其他位置上。

/proc

●　/proc是个虚拟目录，里面保存内核和进程的信息。

/proc/interrupts包括所有中断（IRQs）的信息

/proc/net/sockstat包含网络套接口的统计信息

/proc/1/environ包含进程1的环境信息

/proc/self/cwd包含要访问这个文件的进程的当前工作目录

/proc/net/sockstat包含网络套接口的统计信息

/proc/1/environ包含进程1的环境信息

/proc/self/cwd包含要访问这个文件的进程的当前工作目录

/tmp

●　/tmp目录是为程序和用户提供放置临时空间的目录。

●　/tmp目录可以单独划在一个分区上。

●　/tmp目录会被一些系统进程定期清空。

/tmp目录用来存放一些临时文件，一般在进程结束或用户注销里就会被自动删除。

/usr

●　/usr目录包含UNIX系统的众多资源。所以是占空间最大的一个目录。

●　/usr目录包括很多应用程序和库文件等。

●　/usr目录可以是独立的分区，也可以通过NFS装载一个网络目录。/usr目录可以是只读的。

在一个新安装的Linux系统中，/usr目录是占空间最大的一个目录。除了在启动时和紧急情况下必要的程序放在/bin和/sbin下外，绝大部分的应用程序都放在/usr目录下。这个目录可以从网络上远程装载，如所有的工作站可以远程装载服务器上通过NFS共享出来的/usr目录，这样可以节约本地空间。而且，/usr设计为可以是只读的目录。

/usr目录下一些重要的子目录有：

/usr/bin，/usr/sbin，/usr/lib-含义类似根目录下对应目录

/usr/dict-包含字典文件

/usr/doc-包含一些重要文档

/usr/etc-在网络远程安装/usr目录时，此目录包含网络范围的配置文件

/usr/info，/usr/man-帮助信息和手册页

/usr/src-应用程序源文件

/usr/local-这个目录不是自动创建的，但是建议把自己的程序放在这个目录下，下面也对应一些目录，如bin，src等。

/var

●　/var目录包含了一些文件大小比较特殊的文件，如日志文件、锁文件等。

●　/var目录还包括各种用途的文件，如：邮件、计划、打印文件等。

●　/var目录也可以存放一些临时文件，它们一般比在/tmp目录下的文件使用时间长一些。

●　/var目录通常是独立的分区。

/var下经常存放一些比较大的文件，如日志文件放在/var/log，还有些应用程序产生的大文件放在/var下。

/var/tmp里面也可以存放一些临时文件，就像/tmp目录，不过一般这些文件比在/tmp目录下的文件使用时间长一些，大约一周左右。

/var/spool包含一些假脱机文件，即一些应用程序产生的但并不是马上处理的数据文件。典型的例子是邮件文件（放在/var/spool/mqueue）和打印文件（放在/var/spool/ lpd）。

/var/run目录包含进程运行的信息，如进程ID等。

/var/lock目录包含一些锁文件，这些文件起到一个信息的作用，说明某个资源正在被使用或某个进程正在运行。其他进程不可再使用这个资源或某个进程不能再运行一个复本等。

/var/state目录用来保存一些关于DHCP服务器的信息，以便于重新启动机器时使用。

/lost＋found

●　/lost＋found存在于所有的文件系统中。

●　当系统不正常关机而重新启动后，fsck程序会运行来检查文件一致性。如果由于不正常关机造成文件碎片的话，fsck会把这些碎片回收并放在/lost＋found下。

/目录下的其他目录

●　/opt目录是由一些外部应用程序使用的目录。

●　其他一些自己建的目录。

4.7　文件系统

什么是文件系统（Filesystem）？文件系统是存放文件的容器，在Linux中，一个文件系统是一个有层次结构的树型结构目录。一个文件系统是通过装载到另一个文件系统的装载点来使用的。一般来讲，装载点（即一个目录）是空的。根文件系统（/）是在系统引导时自动加载的。

Linux中存放文件系统的存储介质常见的有：硬盘、光盘、软盘、Flash盘、磁带、网络存储设备等。

Linux能够支持的常见的文件系统类型如下：

●　Linux自身提供的缺省文件系统：ext2fs（一般根文件系统/使用此文件系统）。

●　新增的自身提供的文件系统：ext3fs，ReiserFS，IBM JFS等。

●　其他UNIX使用的文件系统：minix，ext，xiafs等。

●　DOS/Windows使用的文件系统：FAT-12，FAT-16，FAT-32，VFAT，NTFS（只读）。

●　HPFS（OS/2使用，只读），HFS（Macintosh使用，只读）。

●　AFFS（Amiga），System V，Coherent，Xenix。

●　CD-ROM（ISO 9660）。

●　UMSDOS（UNIX-like FS on MS-DOS）。

●　NFS（网络文件系统）。

●　SMBFS（Windows共享文件系统）、NCPFS（Novell Netware共享文件系统）。

●　/proc（用于内核和进程信息）。

●　Linux操作系统安装过程中的文件系统的选择。

1）ext2文件系统。

ext2文件系统应该说是Linux正宗的文件系统，早期的Linux都是用ext2，但随着技术的发展，大多Linux的发行版本目前并不用这个文件系统了。比如Red Hat和Fedora大多都建议用ext3，ext3文件系统是由ext2发展而来的。ext2支持undelete（反删除），如果误删除文件，有时是可以恢复的，但操作上比较麻烦。ext2支持大文件。

2）ext3文件系统。

ext3是由ext2文件系统发展而来的一个用于Linux的日志文件系统。ext3支持大文件。但不支持反删除（undelete）操作。Red Hat和Fedora都力挺ext3。

3）reiserfs文件系统。

reiserfs文件系统是一款优秀的文件系统，支持大文件，支持反删除（undelete）。在测试ext2、reiserfs反删除文件功能的过程中，reiserfs文件系统表现的比较优秀，几乎能恢复90%以上的数据，有时能恢复到100%。操作反删除比较容易。

文件系统的安全性。

1）ext2、ext3和reiserfs文件系统自动修复能力对比。

ext2、ext3及reiserfs都能自动修复损坏的文件系统，也都是在开机时进行。从表现来看reiserfs更胜一筹。ext2和ext3文件系统在默认的情况下是“This filesystem will be automatically checked every 21 mounts or 180 days，whichever comes first”，也就是每间隔21次或每180天加载文件系统就要自动检测一次。

通过实践来看ext2和ext3在auto check上存在风险，有时文件系统开机后就进入单用户模式，并且把整个系统“扔”进lost＋found目录，如果要恢复系统，就得用fsck来进行修复。当然fsck也同样存在风险。所以我们对ext2和ext3文件系统的使用，对新手来说的确需要心理准备。毕竟修复已经损坏的ext2和ext3文件系统是有困难的。

另外ext2和ext3文件系统对于意外关机和断电，也可能导致文件系统损坏，所以我们在使用过程中，必须是合法关机。比如执行poweroff指令来关掉机器。

reiserfs文件系统也能自动修复，它在自动检测和修复上具有很强的功能，几乎很少出现ext2和ext3的情况，另外从速度来说它也比ext2、ext3文件系统的速度要快。

reiserfs对于意外断电表现最佳，reiserfs文件系统从未出现像ext2和ext3那样用手动方式来进行修复的情况。从这方面来说reiserfs还是极为安全的。不过，直接断电有时也会造成硬盘物理损伤。

2）ext2、ext3和reiserfs反删除功能对比。

从文件系统的反删除来看，ext2和reiserfs都支持反删除，对于一般使用者来说应该是安全的，但对于保密单位来说可能意味着不安全。从反删除角度来说明文件系统的安全性，也是有两方面。

对于从事的工作比较机密的，用ext3比较好，因为ext3一旦删除文件，是不可恢复的，虽然网上也有几个关于反删除恢复操作在ext3中的例子，但实践来看，并不是那么容易。因为反删除能恢复相应的绝秘资料的泄密。

但是对于一般使用者，建议用reiserfs文件系统，它支持反删除功能，反删除操作也比较容易。但也会存在一点问题。比如在Fedora或Red Hat中，有一个关于系统安全的seLinux，在默认情况下，可能在reiserfs中不支持seLinux。不过值得一说的是seLinux是一个绝对庞大、功能丰富、涉及面极广的安全工具，seLinux并不是一般使用者就能驾驭的了的。所以一般建议初学者在使用Linux系统时先关掉seLinux功能。慢慢尝试熟悉使用它。在Fedora和Red Hat最新的版本中，reiserfs文件系统的确是不支持seLinux，所以在Fedora或Red Hat中采用了reiserfs，并且还想用seLinux，还是自己找解决办法，可能要打内核补丁才行。至于其他Linux发行版本是否存在这个问题，还得需要尝试。

传统ext2文件解析：
ext2是传统的Linux支持的文件系统。其中的很多特性仍然保留在新的文件系统中，所以有必要对ext2文件系统进行一下解析。ext2文件系统的前身是minix文件系统，后来Linux在minix的基础上提出了扩展文件系统，即ext，ext2即扩展文件系统第二版。

ext2fs和inode。

当创建分区时，即格式化分区时，ext2fs分区将分成若干个大小为1024个字节（默认值）的块。

Linux的块可以有不同的用途：超级块（Superblock）、Inode（索引节点）、间接索引块、数据块。不能将一个块用于不同的用途。

1.Superblock（超级块）：一个文件系统的第一块。一个文件系统中的第一块（block 1）是超级块。这是一个非常重要的块，它包含这个文件系统的一些基本信息，如最后一次使用的时间、块的大小、指向这个文件系统根的指针、指向空闲inode链的指针、指向空闲数据块链的指针等。由于其内容的重要性，为了在这个超级块损坏时有备份数据可用，在第8193、16385等块处有这个超级块的备份。

2.inode（i节点块）：一个inode有256字节，即，一个1024字节的块中包含4个inode。inode包含一个文件的所有者（user）、组（group）、权限（permission）、大小（size）、创建时间（ctime）、最后使用时间（atime）、最后修改时间（mtime）等。此外，inode还包含这个文件的数据块的位置，这个结构比较复杂，但十分高效。在一个文件中，头12个数据块是直接寻址，数据块的地址是记录在inode中的。如果文件的长度大于12个数据块的容量，一般的即12KB，那么就需要使用间接索引块。由inode引出一个指针指向一个间接索引块，由这个间接索引块包含数据块的编号和地址。由于一个指针是4个字节，一个1024字节的间接索引块就可以索引256个数据块，即256KB大小。如果文件的大小比256K字节还要大，就需要二级间接索引块，即间接索引块所指的又是间接索引块。通过二级间接索引块，就可以再索引65536个数据块。更进一步，通过使用三级间接索引块，就可以又多索引16777216个数据块，即16GB。但由于其他方面的限制，Linux的ext2fs中文件最大容量是2GB。

3.数据块：包含的是文件的数据。因为目录也是文件的一种，所以目录也有数据块，其内容就是这个目录下的文件的文件名（由此可以看出，inode中并不存放文件名！），使用这种结构，就可以实现一个文件实例（inode）可以用多个文件名来访问。

所以，一个文件系统中最重要是inode和数据块。如果一个文件系统满了，这可能是由两种原因造成的，一是inode用完了，二是数据块用完了。要根据实际情况来调节文件系统中的两个参数：一是块大小，缺省是1024，还可以设置为2048，4096等。另一个是多少个字节中包含一个inode，缺省的是4096。如果这个文件系统中有大量的小文件，这个值就应该设的小一点，以防止空间还有但inode用完了。

在Linux中，使用文件系统前，需要创建和装载文件系统。

文件系统的创建：

这个过程是存储设备建立文件系统的过程，一般也被称为格式化或初始化，通过一些初始化工具来进行。一般的情况下每个类型的操作系统都有这方面的工具，也有多功能的第三方工具，比如PQ。如果不太懂操作系统自带的工具，可以用第三方工具来切割硬盘，把硬盘分割成若干分区，也可以使用Linux命令fdisk来创建一个分区。

命令：fdisk

使用：显示分区表或管理分区

语法是：fdisk［disk device］。

使用fdisk可以创建Linux所需要的Linux native分区。

然后再用操作系统自带的工具来初始化分区，也就是格式化分区。在Linux中有mkfs系列工具。以fedora 9.0为例，常用的工具有mkfs、mkfs.ext3、mkfs.reiserfs、mkfs.ext2、mkfs.msdos、mkfs.vfat、mkswap等。

提示：如果不能创建reiserfs文件系统，也就是说没有mkfs.reiserfs或者mkreis-erfs命令，是因为没有安装reiserfs-utils工具包。

1）mkfs的使用

使用方法：

＃mkfs-t文件系统存储设备

这里的文件系统是要指定的，比如ext3、reiserfs、ext2、fat32、msdos等设备，比如是一个硬盘的分区，软盘，光驱等。

在格式化分区之前，应该先查看硬盘分区情况，并有针对性的格式化。比如用fdisk-l来查看。比如想格式化一个硬盘中的一个分区，用fdisk–l查看，可以看到有sda这个设备，所以可以用fdisk-l/dev/sda专门来显示分区情况。

如果想把/dev/sda6格式化为ext3、ext2、reiserfs、fat32、msdos文件系统，命令格式如下。

＃mkfs-t ext3/dev/sda6

＃mkfs-t ext2/dev/sda6

＃mkfs-t reiserfs/dev/sda6

＃mkfs-t fat32/dev/sda6

＃mkfs-t msdos/dev/sda6

2）mkfs.ext3、mkfs.reiserfs、mkfs.ext2、mkfs.msdos、mkfs.vfat、mke2fs
mkfs在执行命令的时候，其实调用了上述一系列的工具。通过文件名，我们就知道这些工具是支持什么文件系统。

＃mkfs.ext3/dev/sda6注：把该设备格式化成ext3文件系统

＃mke2fs-j/dev/sda6注：把该设备格式化成ext3文件系统

＃mkfs.ext2/dev/sda6注：把该设备格式化成ext2文件系统

＃mke2fs/dev/sda6注：把该设备格式化成ext2文件系统

＃mkfs.reiserfs/dev/sda6注：把该设备格式化成reiserfs文件系统

＃mkfs.vfat/dev/sda6注：把该设备格式化成fat32文件系统

＃mkfs.msdos/dev/sda6注：把该设备格式化成fat16文件系统，msdos文件系统就是fat16

＃mkdosfs/dev/sda6注：把该设备格式化成fat16文件系统，同mkfs.msdos

例：mke2fs，可以在这个分区上创建ext2fs文件系统（格式化分区）。

＃mke2fs-b 1024-i 4096-c/dev/hda6

其中，-b指定块大小，-i指定多少个字节中包含一个inode，-c指定要格式化的分区。

3）mkswap把一个分区格式化成为swap交换区

＃mkswap/dev/sda6注：创建此分区为swap交换分区

＃swapon/dev/sda6注：加载交换分区

＃swapoff/dev/sda6注：关闭交换分区

我们查看系统已经加载的swap交换分区。

＃swapon/dev/sda6注：加载交换分区

＃swapon-s

如果让swap开机就加载，应该改/etc/fstab文件，加类似如下一行。

/dev/sda6 swap swap defaults00

或者把命令行直接写入/etc/rc.d/rc.local中也行：swapon/dev/sda6

如果硬盘不能再分区，你可以创建一个swap文件

＃dd if＝/dev/zero of＝/tmp/swap bs＝1024 count＝524288注：在/tmp目录下创建一个大小为512M的swap文件。

＃mkswap/tmp/swap注：把/tmp/swap文件，创建成swap交换区

＃swapon/tmp/swap注：加载swap

＃swapon-s

注意：在安装系统的时候，一般已经划分了交换分区。查看/etc/fstab，应该有swap相关的行。如果在安装系统时没有添加swap，可以通过这种办法来添加。

划分好的一个文件系统经过格式化后，并不能直接使用。文件系统只有加载才能使用，UNIX类的操作系统如此，Windows也是一样。在Windows更直观一些，具体内部机制我们不太了解。但Unix类的操作系统是通过mount进行的，加载文件系统时要有加载点，比如我们在安装Linux的过程中，有时会提示我们分区，然后建立文件系统，接着是问你的加载点是什么，我们大多选择的是/。我们在Linux系统的使用过程中，也会加载其他的硬盘分区，也要选中加载点，加载点通常是一个空置的目录，最好是我们自建的空置目录。

加载文件系统，目前有两种方法，一是通过mount来加载；另一种方法是通过/ etc/fstab文件来开机自动加载。

1.通过mount来加载磁盘分区（或存储设备）

命令：mount

功能：加载文件系统

语法：mount［-t文件系统类型］［-o选项］设备名加载点。

只使用mount命令而不带参数可以查看当前有哪些文件系统已经加载上来。如果希望在系统启动时自动加载一个文件系统，则需要在/etc/fstab这个配置文件中指定。使用mount/a命令则可以加载在/etc/fstab文件中定义了的文件系统。关于mount命令和fstab文件的格式，可以从man中获得更多信息。

-t：通过这个参数，我们来指定文件系统的类型，一般的情况下不必指定有时也能识别，-t后面跟ext3、ext2、reiserfs、vfat、ntfs等，其中vfat是fat32和fat16分区文件系统所用的参数。如果您忘记了文件系统，也可以在-t后面加auto。

-o：这个选项，主要选项有权限、用户、磁盘限额、语言编码等，但语言编码的选项，大多用于vfat和ntfs文件系统。由于选项太多，参见man mount。这里不多说。

设备名：指存储设备，比如/dev/hda1，/dev/sda1，cdrom等。至于您的系统中有哪些存储设备，主要通过fdisk-l或者/etc/fstab或dmesg查看。一般的情况下光驱设备是/dev/cdrom。软驱设备是/dev/fd0。硬盘及移动硬盘以fdisk-l的输出为准。

1）对光驱和软驱的加载。

＃mount/dev/cdrom

＃mount/dev/fd0

第一行是mount光驱，至于mount到哪了，可以通过/etc/fstab来查看。同理软驱/dev/fd0设备也是如此。比如在/etc/fstab

/dev/hdc/media/cdrecorder auto users，exec，noauto，managed00

可以肯定的是光盘被mount到了/media/cdrecorder目录。

但也可以自己来指定cdrom加载的位置。比如/mnt/cdrom，所以也可以这样来加载光驱：

＃mkdir/mnt/cdrom

＃mount/dev/cdrom/mnt/cdrom

我们先建一个目录，然后执行mount命令，这样cdrom就挂在/mnt/cdrom中了。我们就可以在/mnt/cdrom中查看光盘中的资料和文件。这个目录您想怎么建就怎么建。用什么目录不是最重要的。重要的是您知道自己在做什么就行了。比如我们也可以把这个目录建成dvdrom。然后用mount/dev/cdrom/mnt/dvdrom来加载。

有时我们的设备是COMBO的，有支持dvd cd还能支持刻录的。我们最好查一下光驱的设备，主要有两个方法，一是通过查看/etc/fstab，二是通过ls-l来查看。比如我们在/etc/fstab中查看到类似下面的一行。

/dev/hdc/media/cdrecorder auto users，exec，noauto，managed 00

通过这个，我们能知道hdc就是cdrom也是dvdrom的设备，更是cdrecorder的设备。为了验证我们的说法。请用ls-l来列文件。

＃ls-lh/dev/dvd*
lrwxrwxrwx 1 root root 32005-09-13/dev/dvd-＞hdc

＃ls-lh/dev/cdrom
lrwxrwxrwx 1 root root 32005-09-13/dev/cdrom-＞hdc

＃ls-lh/dev/cdwriter
lrwxrwxrwx 1 root root 32005-09-13/dev/cdwriter-＞hdc

这不一目了然了吗？dvd、cdrom、cdwriter的文件名都链接到了hdc这个设备，所以光驱设备根源就是/dev/hdc。所以我们也可以这样加载光驱。

＃mkdir/mnt/cdrom

＃mount/dev/hdc/mnt/cdrom

2）加载硬盘和移动硬盘的文件系统。

对于ext2、ext3、reiserfs不需要指定文件系统的编码，其实mount也没有这个功能。这些Linux文件系统，如果出现编码问题，一般是通过export LANG来指定。所以加载这些文件系统比较简单。

首先我们得建一个文件系统加载的目录。我们前面已经提到了。一个有文件系统的分区要挂到系统中，必须要有一个加载点。这个加载点就是一个目录。比如我们通过fdisk-l得知hda5是Linux分区，并且创建了文件系统，比如是reiserfs文件系统吧。

我们先用fdisk-l来查看一下分区情况：我们想要加载/dev/hda5分区，比如hda5分区创建的是reiserfs文件系统。

＃mkdir/mnt/hda5/

注：先创建一个加载目录。

＃chmod 777/mnt/hda5/

注：设置/mnt/hda5的权限为任何用户可写可读可执行。这样所有的用户都能够写入。

＃mount-t reiserfs/dev/hda5/mnt/hda5

注：通过-t reiserfs来指定/dev/hda5是reiserfs文件系统，并且加载到/mnt/hda5目录。

＃mount-t auto/dev/hda5/mnt/hda5

注：假如我们不知道hda5上reiserfs文件系统，我们可以用-t auto让系统定夺，然后加载到/mnt/hda5。

＃mount/dev/hda5/mnt/hda5

注：不加任何参数，直接mount/dev/hda5到/mnt/hda5。系统自动判断分区文件系统是不是被加载了，我们通过df-lh来查看。

要卸载一个文件系统，可以使用umount命令。

命令：umount（unmount）

功能：卸载文件系统。

语法：umount［设备名｜加载点］

要使用umount命令，首先要求没有用户和进程在使用这个文件系统上的东西，然使用umount设备名或umount装载点就可以卸载一个文件系统。

如果卸载文件系统时报错，如：设备或资源忙。那么通常是这个文件系统中有某件正在被使用，或用户的当前目录在该文件系统中。可以使用fuser命令来检查当前哪个用户在使用该文件系统。

其他与文件系统相关的一些命令主要有：
df可以查看已装载的分区的使用信息。

fsck可以对一个文件系统进行检查。

du显示一个目录的使用情况。

还有以m打头的一系列类dos的命令，如mdir，mcopy，mdel，mformat等。

对于ext2fs，还有一些专门的命令，如tune2fs，debugfs，chattr命令等。

2.通过/etc/fstab文件来开机自动加载文件系统

（1）理解fstab

上面是mount加载存储设备文件系统的办法。现在再来说一说在/etc/fstab中实现机自动加载文件系统的办法。首先要查看/etc/fstab。主要看写法。后文有开

＃This file is edited by fstab-sync-see man fstab-sync for details

LABEL＝/1/ext3 defaults 1 1

/dev/devpts/dev/pts devpts gid＝5，mode＝620 0 0

/dev/shm/dev/shm tmpfs defaults 0 0

/dev/proc/proc proc defaults 0 0

/dev/sys/sys sysfs defaults 0 0

LABEL＝SWAP-hda7 swap swap defaults 0 0

/dev/hdc/media/cdrecorder auto users，exec，noauto，managed 0 0

第一字段：设备名，在这里表示是文件系统。有时我们把加载文件系统也说成加载分区。在这个字段中也可以用分区标签。在例子中/LABEL＝/1就是Fedora系统安装分区的标签，至于是在哪个分区，可以用df-lh来查看。

［root＠localhost tux1］＃df-lh

Filesystem容量已用可用已用%加载点

/dev/hda811G 8.5G 1.9G 83%/

/dev/shm236M 0 236M 0% /dev/shm

/dev/hda1016G 6.9G 8.3G 46% /mnt/hda10

LABEL＝/1是/dev/hda8的标签。对于ext3和ext2文件系统，可以用e2label来设置硬盘分区的标签。

e2label device［newlabel］

比如我们想把文件系统为ext3的分区/dev/hda5的标签设备为/5，我们应该执行如下的命令：

＃e2label/dev/hda5/5

＃mkdir/mnt/hda5注：创建加载/dev/hda5分区的目录。

＃chmod 777/mnt/hda5注：打开权限，所有用户可读可写可执行。

然后要改/etc/fstab中加一行

/5/mnt/hda5 ext3 defaults 0 0

如果是reiserfs文件系统，我们应该用

＃reiserfstune-l标签设备

举例：比如为reiserfs文件系统/dev/hda10设置标签为/10。

＃reiserfstune-l/10/dev/hda10

在/etc/fstab中加入一行：

/10/mnt/hda10 reiserfs defaults 0 0

警告：请不要在Linux的安装分区（也就是Linux系统/所在的分区）实践，会导致Linux系统崩溃。如果想实践，请在其他分区测试。

第二字段：文件系统的加载点。

第三字段：文件系统类型。

第四字段：mount命令的选项，和mount中的-o同理。defaults包括这些选项：rw，suid，dev，exec，auto，nouser，async。通过实践，这个默认的还能满足我们的需要。至于这些选项的意思，请参看man mount。

第五字段：表示文件系统是否需要dump备份，是真假关系。1是需要，0是不需要。

第六字段：是否在系统启动时，通过fsck磁盘检测工具来检查文件系统，1是需要，0是不需要，2是跳过。

基于这些认识，比如要开机自动加载/dev/hda5，可以如下：

＃mkdir/mnt/hda5/注：先创建一个加载目录。

＃chmod 777/mnt/hda5/注：设置/mnt/hda5的权限为任何用户可写可读可执行。这样所有的用户都能够写入。

然后在/etc/fstab中加如下的一行：

/dev/hda5/mnt/hda5 reiserfs defaults 0 0

这样重启机器就能看到效果了。

对文件系统进行扫描fsck。

在Linux中有类似Windows中的scandisk的工具fsck，不过fsck可不仅仅是扫描，还能修正文件系统的一些问题。值得注意的是fsck扫描文件系统时一定要在单用户模式、修复模式或把设备umount后进行。

警告：如果扫描正在运行中的系统，会造成系统文件损坏。如果您的系统是正常，请不要用扫描工具，它可能会把您的系统搞坏掉，fsck运行是有危险的。

以Fedora为例，文件系统扫描工具有fsck、fsck.ext2、fsck.jfs、fsck.msdos、fsck.vfat、fsck.ext3、fsck.reiserfs（reiserfsck）。其中fsck默认支持文件系统ext2，如果想支持ext3文件系统的扫描，应该加-j参数，最好是应该根据不同的文件系统来调用不同的扫描工具，比如fsck.ext2，fsck.jfs，fsck.msdos，fsck.ext3，fsck.reiserfs（reiserfsck）等。我们也可以根据自己的文件系统选择不同的扫描工具。

对于fsck.ext2和fsck.ext3常用的几个选项：

-p自动修复文件系统存在的问题。

-y如果文件系统有问题，会跳出提示是否修复，如果修复请按y。此选项的作用是对所有的问题回答“yes”。

-c对文件系统进行坏块检查，并添加到坏块列表中。这是一个极为漫长的过程。

-n不对文件系统做任何改变，只是扫描，以检测是否有问题。

举例：比如/dev/hda6（文件系统是ext3的），如果要进行扫描并自动修复。

＃fsck.ext3-p/dev/hda6

注意：虽然有时fsck在不加参数的情况下能识别不同的文件系统，但是针对不同文件系统，最好用相应的工具，对于不同工具的最为详细的参数，请参看--help或者man。

（2）用户配额

●　配额限制（quota）是用来限制用户或组使用数据块或inode的数量的。配额限制是针对文件系统的。

●　使用mount命令来装载一个文件系统，使用umount命令来卸载一个文件系统。

硬盘配额限制有两个限制，软限制（soft quota）和硬限制（hard quota）。当用户超过软限制时，系统会给出警告，而超过了硬限制，就会出错。此外，还有一个宽容期限（grace period），在用户对硬盘使用超过了软限制时，就会自动计算时间，如果超过软限制的时间并且超过宽容期限，则用户收到的就不再是警告而是错误了。

在Linux上实现配额限制（quota），不需要daemon程序。对一个文件系统来说，都可以为每一个用户设置配额，这个配额存放在这个文件系统的根目录下，名字为quota.user和quota.groups。另外，在装载文件系统时要激活配额，可以在mount时指定usrquota和grpquota参数，自动加载的则要在/etc/fstab中指定。在装载上文件系统后，还需要使用quotaon命令加载配额检查。

所以，要对一个文件系统使用硬盘配额，需要以下几步：

1.修改/etc/fstab。在加载参数里指定usrquota和qrpquota

2.创建两个配额文件。

＃touch/quota.user/quota.group

＃chomd 600/quota.user/quota.group

3.重加载这个文件系统。

＃mount-o remount，usrquota，grpquota/

4.计算当前配额使用情况。＃quotacheck/

5.激活配额。＃quotaon/

要配置配额，使用edquota命令。edquota命令会启动＄EDITOR中指定的编辑器（通常为vi）来编程配置文件。对用户进行配额设置：edquota-u username。对组进行配额设置：edquota-g groupname。设置宽容期限：edquota-t。复制用户间的配额配置：edquota-p tux1-u tux2 tux3 tux4。

使用quota命令可以查看用户配额的使用情况。普通用户使用这条命令可以查看自己配额的使用情况。repquota命令则是只有root用户可以使用的命令，作用是生成所有用户和组配额使用情况的报告。

文件、目录、链接、权限、目录结构、文件系统

1.Linux中文件都有哪些类型？

2.Linux中目录项与inode有什么关系？解释一下硬链接和符号链接的异同。

3.Linux中是如何限制文件的权限的？

4.Linux中根目录下有哪些目录？它们主要是用来放什么东西的？

5.Linux支持哪些文件系统？

第五章　文本编辑器vi

主要内容

1.vi简介

2.vi基本操作

5.1　vi简介
vi做为Linux系统中一种编辑器，它的使用方法和界面与UNIX平台十分相似。在Linux中有很多功能强大，界面友好的编辑器，但是vi还是值得你学习它的使用方法。初步接触vi，你觉得它的界面不太友好，不容易掌握，可是一旦你掌握了vi的命令，你可以感觉到它强大的功能与高效。而且vi相对来说较小，无论你使用任何Linux系统，你总是可以使用vi的。在很多系统中，可能只有vi供你选择。

5.2　vi基本操作

1.进入与离开

要进入vi可以直接在系统提示字符下键入vi［文件名称］，vi可以自动载入所要编辑的文件或是开启一个新文件。进入vi后屏幕左方会出现波浪符号，凡是列首有该符号就代表此列目前是空的。

要离开vi并保留对文件所进行的修改，可以在命令模式下键入：

：wq或：x或ZZ　（注意冒号）

如果要离开vi并放弃对文件的修改，可以在命令模式下键入：

：q！　　　　　（注意冒号）
vi有二种工作模式，即编辑模式和命令模式。用［Esc］键可以切换到命令模式下，如果不知道现在是处于什么模式，可以多按几次［Esc］，系统会发出声响以确定进入命令模式。以下所有的命令都是在命令模式下输入。

2.vi输入模式

在编辑模式下，所有的键盘输入直接对文件进行编辑。从命令模式进入编辑模式有下面几条指令：

新增（append）
a：从光标所在位置后面开始新增资料，光标后的资料随新增资料向后移动。

A：从光标所在列最面的地方开始新增资料。

插入（insert）
i：从光标所在位置前面开始插入资料，光标后的资料随新增资料向后移动。

I：从光标列的第一个非空白字符前面开始插入资料。

开始（open）
o：在光标所在列下方新增一列并进入编辑模式。

O：在光标所在列上方新增一列并进入编辑模式。

删除与修改

何谓编辑？在这里我们认为是文字的新增修改以及删除，甚至包括文字区块的搬移、复制等等。这里先介绍vi的如何做删除与修改。（注意：在vi的原始观念里，输入跟编辑是两件事。编辑是在命令模式下操作的，先利用指令移动光标来定位要进行编辑的地方，然后才下指令做编辑。）
x：删除光标所在字符。

dd：删除光标所在的列。

r：修改光标所在字符，r后接着要修正的字符。

R：进入取代状态，新增资料会覆盖原先资料，直到按［Esc］回到命令模式下为止。

s：删除光标所在字符，并进入编辑模式。

S：删除光标所在的列，并进入编辑模式。

光标移动命令

光标移动

命令作用

〈b〉移动到当前单词的开始

〈e〉移动到当前单词的结尾

〈w〉向前移动一个单词

〈h〉向前移动一个字符

〈j〉向上移动一行

〈k〉向下移动一行

〈l〉向后移动一个字符

删除操作命令

删除操作

命令作用

〈x〉删除光标所在的字符

〈dw〉删除光标所在的单词

〈d＄〉删除光标至行尾的所有字符

〈D〉同〈d＄〉

〈dd〉删除当前行

可在删除命令前加上数字，如〈5x〉表示删除5行。

改变与替换操作命令

改变与替换操作

命令作用

〈r〉替换光标所在的字符

〈R〉替换字符序列

〈cw〉替换一个单词

〈ce〉同〈cw〉

〈cb〉替换光标所在的前一字符

〈c＄〉替换自光标位置至行尾的所有字符〈C〉同〈c＄〉

〈cc〉替换当前行

查询命令

查询

命令作用

〈/abc〉向前查询abc

〈？abc〉向后查询abc

〈n〉向前继续查询

〈N〉向后继续查询

拷贝与粘贴命令

拷贝与粘贴

命令作用

〈/yw〉将光标所在单词拷入剪贴板

〈y＄〉将光标至行尾的字符拷入剪贴板〈Y〉同〈y＄〉

〈yy〉将当前行拷入剪贴板

〈p〉将剪贴板中的内容粘贴在光标后

〈P〉将剪贴板中的内容粘贴在光标前

编辑器，vi，命令模式、编辑模式、文本文件

1.进入和退出vi的方法有哪些？

2.vi编辑器的工作方式有哪些？相互间如何转换？

3.在vi中移动光标的方式有哪些？

4.在vi中如何使用复制、剪切和粘贴的功能？

5.在vi中如何进行文字的查找与替换？

第六章　使用shell

主要内容

1.什么是shell

2.shell的基本操作

3.通配符与文件名匹配

4.输入输出重定向

5.shell变量

6.shell中的其他常用转义字符

7.命令的别名

8.定制用户环境

6.1　什么是Shell

1.shell的历史

终端（Terminals）：

UNIX是可以在许多种机器上运行的操作系统，但人们又如何使用这些机器呢？过去，他们是通过哑终端来连接到这些机器，也就是用键盘、显示器及足够的电子元件组成的机器与中央计算机相连。那么，现在这些东西都在哪儿？为什么我们使用UNIX/Linux时见不到“终端”呢？这是因为终端的厂家无法达成一项最终标准，这导致每种牌子的终端都有各自的键盘布局、各自的在屏幕上显示字符的方法、发送或接收什么信号表示什么字符、控制代码，等等。为了避免这些混乱，就创建了一个含有所有不同终端特性的（capability）文件，这就是“termcap”。打开文件/etc/termcap就可以看到。Linux终端大多数用“vt100”或“Linux”作为终端类型。

xterms：

在20世纪80年代初期，产生了一个UNIX的图形子系统——the X Window System。90年代早期，为了更好地实现基于Intel的UNIX类系统上（如FreeBSD、NetBSD、Linux）的应用，产生了一个系统分支—XFree86。

X Window中一个很大的好处是可以运行多个虚拟（virtual）终端。甚至在X Window下就有这么个应用程序——“xterm”。您将发现“xterm”和“virtual terminal”在很多情况下都是一样的。有的地方说“打开一个xterm”，其实您不是非要用“xterm”程序，其他的终端模拟器（terminal emulator），如rxvt、konsole、aterm、eterm、wterm等等，一样有效。

终端模拟器（又称为虚拟终端）通过伪（pseudo）tty设备——pty与系统相连，并且使用自己的显示标准——xterm。这导致不同的终端模拟器可能在一些按键或程序上存在细小的差别，这取决于模拟器多大程度上遵守了“xterm”的显示标准。

2.shell的作用

为了在终端中运进程序，需要shell。shell是操作系统的一部分，用来与用户打交道，并且可以用来协调各个命令。

shell的作用主要有：

（1）shell是系统用户界面，提供了用户与操作系统内核进行交互操作的接口。

（2）shell是命令解释器，解释用户输入的命令，把它们送到内核去执行。

（3）shell是脚本编程语言环境。

Linux中的shell的主要作用是用户与操作系统内核之间的一个接口，功能是解释用户的命令并且将命令送到内核中去执行。通过shell，可以同时在后台运行多个应用程序，并且把需要与用户交互的程序放在前台运行。通过在多条命令的序列中使用变量和流程控制，shell可以作为一名复杂的编程语言。第一个真正的UNIX shell——“sh”，亦称为“Bourne shell”，诞生于1975年，作者是Steve Bourne。很快，出现了其他shell，如基于原始“Bourne shell”的“ksh”、“zsh”，后者常用作专属Unixes系统中的标准shell。也有一些从C语言中衍生出来的shell，如“csh”或“tcsh”。发现到现在，shell主要有：csh，tcsh，pdksh，ash，sash，zsh，bash等。Linux的默认shell为bash（Bourne Again Shell）。这个shell功能非常强大。

虽然Linux发展到现在，普通用户可以在图形界面下作很多事情，但是，对于高级用户和系统管理员面言，很多功能必须在shell中才能完成。而Linux强大的功能往往在shell中才能体现出来。

6.2　shell基本操作

Linux中的shell命令行有许多非常实用的功能，如：自动补齐、命令行的历史记录和编辑命令行。下面分别讨论。

一、自动补齐

如何用“cd”（改变目录，change directory）最快地从您当前所在的home目录跳到“/ usr/src/redhat/”呢？

cd/u＜TAB＞sr＜TAB＞r＜TAB＞

这称为“命令行自动补齐”（automatic command line completion），这在平常应用中是不可缺少的。让我们仔细看看这个例子：
cd/u＜TAB＞

扩展成了cd/usr/，下面的
cd/u＜TAB＞sr＜TAB＞

扩展为cd/usr/src/。如果只敲了cd/us，“/usr”下匹配的（“cd/u*/s*”）三个子目录将列出供您选择：“/usr/sbin”、“/usr/share”和“/usr/src”。

因此，＜tab＞键可以很方便地用于根据前几个字母，来查找匹配的文件或子目录。比如，ls/usr/bin/zip将列出所有“/usr/bin”下面，以字符串“zip”开头的文件或子目录。当然，完成这类任务还有更厉害的命令，但这个方法确实很管用。

另外，碰到长文件名时就显得特别方便。假设您要安装一个名为“boomshakalak-whizbang-4.6.4.5-i586.rpm”的RPM包，您输入rpm-i boom，如果目录下没有其他文件能够匹配，那shell就会自动帮忙补齐。这种补齐对命令也有效：

［tom＠belbo tom］＄gre＜TAB＞
grecord grefer grep

［tom＠belbo tom］＄gre

在这里shell将列出所有以字符串“gre”开头的已知命令。

二、命令行的历史记录

通过按向上方向键，用户可以向后遍历近来在该控制台下输入的命令。用向下方向键可以向前遍历。与Shift键连用的话，还可以遍历以往在该控制台中的输出。也可以通过光标和功能键（Home、End等键）编辑旧的命令，然后再运行。

6.3　通配符与文件名匹配
shell在处理用户发出的命令时，如果遇到一些特殊的字符，就会作出特别的解释，这些有特殊含义的字符叫做转义字符（metacharacters）。例如：＜＞｜；！？*［］＄\“｀～（）｛｝。下面分别讨论一下shell中常用的转义字符。

一、通配字符（wildcards）与文件名匹配

通配符（wildcards）使得用户在进行文件名匹配时不必一一写出名称，就可以指定多个文件。常用到的通配符主要有：*？［］［-］［！］等。

假设用户想用“rm”命令删除目录下所有以字符串“.bak”结尾的文件。除了在“rm”后跟上所有文件名作为参数，还可以用通配符“*”：
rm*.bak

“*”可匹配一个或多个字符。在本例中，您告诉shell将命令“rm”的参数扩展到“所有以‘*.bak’结尾的文件”，shell就将扩展后的参数告诉“rm”命令。

再比如有个目录，其中含文件“124.bak”、“346.bak”及“583.bak”。您想只保留文件“583.bak”，可以用：
rm*4*.bak
shell就将“*4*.bak”扩展成“所有含“4”并以“.bak”结尾的字符串”。

注意到rm 4*.bak无法工作，因为这匹配的是以“4”开头的文件。由于目录中没有这样的文件，shell将这个模式扩展为空的字符串，故“rm”将返回出错信息：
rm：cannot remove‘4*.bak’：No such file or directory

如果您想保留文件“345.bak”，而删除“124.bak”和“583.bak”。这看起来有些难度，因为被删文件的名称除了后缀其他都不同。但幸运的是，您可以用不含有来指定文件：
rm*［！6］.bak

这将被读为：除了以“6.bak”结尾的文件，删除其他所有以“.bak”结尾的文件。您必须将取反号（negation sign）与取反字符（这里是6）放到括号中，不然的话，shell会将惊叹号（exclamation mark）解释成历史记录替换的开始（the beginning of a history substitution）。取反号在本篇介绍的所有匹配模式中都有效。

请注意：通配符“*”与取反号连用，很容易产生问题。

rm*［！6］*.bak

表示什么？这个命令将删除所有文件，甚至包括名称中包含“6”的文件。如果您将通配符“*”放到了取反号前面和后面，实际上取反号将失效，因为shell将其解释为“所有名称中任何位置都不含该字符的文件”。在我们的例子里，只有文件“666.bak”不符合该模式。

第二个通配符是问号（question mark）：“？”。在匹配时，一个问号只能代表一个字符。为了示范其用途，我们在上例的假设中添加两个新文件：“311.bak～”和“some.text”。现在，列出所有在点号后有四个字符的文件：
ls*.？？？？

问号通配符能够有效地避免上面提到的“取反号陷阱”（negation trap）：
rm*［！4］？.*

将扩展成“所有除了点号前倒数第二个字符为4的文件”，也就是只保留文件“346.bak”。

其实也可以这样：
ls［13］*

将列出所有以字符“1”或“3”开头的文件。在我们的例子中，文件“124.bak”、“311.bak～”和“346.bak”匹配。注意到您必须用中括号将匹配的模式括起来，否则模式只匹配以字符串“13”开头的文件。

再比如，ls*［3-8］？.*

将列出所有点号前倒数第二个字符落在“3”到“8”范围的文件。在我们的例子中，匹配的文件是“346.bak”和“583.bak”。

二、引用shell的特殊字符

但是，上面的那些机制存在一个缺点：shell总在命令执行前，试着进行扩展。有时候，会变得很棘手：

（1）文件名包含特殊字符。假设您在那个目录中还有一个名为“！56.bak”的文件。下面试图进行模式匹配：
rm！*
rm
rm：too few arguments
shell将“！*”解释成历史记录的替换（加入前一个命令的所有参数），而不是匹配方式。

（2）命令本身带特殊字符作参数。一些Linux下的命令行工具，比如（e）grep、sed、awk、find及locate，都使用自己的正则表达式（regular expressions）。这些表达式与模式匹配看起来惊人的相似，但在某些地方又有所不同。

但为了使这些特殊命令生效，shell就不能先将其当作模式匹配来解释：
find.-name［1-9］*-print
find：paths must precede expression

应该是：
find.-name“［1-9］*”-print

./346.bak

./124.bak

./583.bak

./311.bak～

可以通过反斜线（back slash）来引用特殊字符，比如！、＄、？或空格：
ls\！*

！56.bak

或者用（单）引号：
ls“！”*

！56.bak

请注意，要看清楚引号应该放在什么位置。命令ls！*将查找名为“！*”的文件，这是由于通配符也在引号间，所以只能依照字面来解释。

6.4　输入输出重定向

Linux的理念是汇集许多小程序，每个程序都有特殊的专长。复杂的任务不是由大型软件完成，而是运用shell的机制，组合许多小程序共同完成。重定向就在其中发挥着重要的作用。

系统定义三个标准文件：标准输入（stdin）、标准输出（stdout）、标准错误输出（stderr）。其中标准输入缺省是键盘，标准输出和标准错误输出缺省是显示器。但是，可以通过重定向改变命令的输入和输出。

1.输出重定向

有时，您希望将命令的输出结果保存到文件中，或以文件内容作为命令的参数。这可以通过“＞”来实现。

command＞file　将command的输出保存到file中，如果file文件不存在，就产生一个新文件file，如果file文件已经存在，将覆盖file中的内容：

例：ls＞dirlist　将当前目录的内容保存到“dirlist”文件。

另一种操作符是“＞＞”，这将输出添加到已存在的文件中：
echo“string”＞＞file

如果file文件不存在，就产生一个新文件file，如果file文件已经存在，将string加到文件file的尾部。

2.输入重定向
command＜file

将file内容作为command的输入：
sort＜dirlist＞sdirlist

将文件“dirlist”的内容送到命令“sort”，然后再将排序后的结果送到文件“sdirlist”。当然，您也可以一步到位。

3.错误输出重定向

如果在执行一条命令的过程中，系统有错误信息，如：
cat filea
shell给出如下的错误提示：
cat：filea：No such file or directory

如果想将这些错误提示保存在文件errfile中，可以写为
cat filea 2＞errfile

这时如果errfile已经存在，则被覆盖，如果只是想追加到文件尾，则可以用
cat filea 2＞＞errfile

另外一种常见的重定向错误输出的场合是直接丢弃这些错误提示，如：
cat filea 2＞/dev/null

在一条命令中，可以同时使用输入重定向、输出重定向和错误输出重定向，如：
command＜inputfile＞outputfile 2＞errfile

4.管道

管道符：”｜”，将前一个命令的输出转成下一个命令的输入。

语法是：command1｜command2｜command3等等。

管道经常将一个程序的输出送到“more”或“less”来阅读。

ls-l｜less

其中，第一个命令提供目录内容，第二个则将其以翻页的方式显示。更复杂的例子如：
rpm-qa｜grep＾x｜less

第一个命令给出所有已安装的RPM包，第二个则将其过滤（filter：“grep”），只剩下以“x”开头的包，第三个命令则将结果以翻页的方式显示。

5.过滤器（filters）

过滤器用来接收标准输入，经过一定的转化，再写到标准输出。所以，过滤器一般放在管道符中间。

常用的过滤器如下：expand，sed，awk，fmt，tac，tr，grep，nl，pr。

tee命令接收标准输入并将数据输出到标准输出和一个文件内。

6.5　shell变量
shell变量（Variables）又叫做环境变量，可以定制用户本身的工作环境。使用变量可以保存有用信息，使系统获知用户相关设置。变量也用于保存暂时信息。shell变量分两类，一类是用户自定义的变量，一类是系统预定义的变量。作为惯例，所有系统预定义的环境变量名都是大写。当然，用户可以自己定义一些变量，如“＄path”、“＄pAtH”，但shell不会理睬这些变量。使用set命令查看当时系统中定义的变量。

一、用户自定义变量

用户自定义变量时，在命令行上打入：变量名＝变量值，可以定义变量。Shell变量没有类型的区分，都是字符串型。在定义变量时，“＝”两边不能加空格。

例如：

＄var1＝2

＄var2＝“hello world”

使用echo＄变量名 查看变量值。

例如：

＄echo＄var1

在一个shell中定义的变量，是不能直接传递它的子进程或子shell使用的。如果在父shell中定义的变量想传递给子进程，则需要export命令。通过export命令，父shell将变量“复制”给子进程，子进程中对变量的任何修改，不会带回父shell。

例1：

＄xy＝hello　　　　　；在父shell中定义变量xy，值为hello

＄bash；启动子shell

＄echo＄xy　　　　　 ；在子shell中查看变量xy的值，为空

例2：

＄export xy＝hello　 ；在父shell中定义变量xy，值为hello，并将变量export

＄bash；启动子shell

＄echo＄xy　　　　　 ；在子shell中查看变量xy的值，为hello hello

＄xy＝goodbye　　　　；在子shell中修改变量xy的值为goodbye

＄exit　　　　　　　 ；返回父shell

＄echo＄xy 　　　　　；在父shell中查看变量xy的值，仍为hello hello

使用unset取消对变量的定义。例：

＄unset xy

二、系统预定义变量

系统定义了一些特殊的变量。

如

＄TERM（当前终端类型）

＄PATH（命令的搜索路径）

＄MANPATH（手册页存放的目录）

＄HOME（用户主目录）

＄LANG（当前使用语言）

＄PS1，＄PS2（命令提示符）

＄SHELL（当前shell名）。

……

下面介绍一些常用的系统预定义变量。

1.命令提示符

每次当用户打开一个控制台（console）或xterm时，最先看到的就是提示符（prompt），类似于：

account＠hostname～＄

在默认设置下，提示符将显示用户名、主机名（默认是“localhost”）、当前所在目录。

按照传统，最后一个字符可以标识该用户是普通用户（＄），还是“root”（＃）。命令：

echo＄PS1

将显示当前的设定。

可以通过＄PS1变量来设置提示符。其中可用字符的含义在man bash的“PROMPTING”部分，对这些参数（parameter）有详细说明。用户可以加入一些小玩意，如不同格式的当前时间，命令的历史记录号，甚至不同的颜色。

例如：PS1＝“\u：\w\\＄”

这样，提示符就变成：
user＿name：/usr/bin＄

可以通过命令export来测试不同的设置（比如，export PS1＝“\u：\w\\＄”）。如果找到了适合的提示符，就将设置放到您的“.bashrc”中。这样，每次打开控制台或终端窗口时，都会生效。

如果一条命令太长，那么可以在输入完一行后加“\”表示另起一行继续输入，下一行的提示符变为“＞”。这个提示符叫做第二提示符，可能通过变量＄PS2来查看或更改。

2.PATH

“＄PATH”与“＄PS1”一样，也是环境变量。输入
set

将列出所有当前定义的环境变量。

环境变量在shell的配置文件中定义，可能是用户自己的配置文件，也可能是由“root”通过“/etc”下面的系统级文件定义的。如果您使用X，更多的一些变量将由X、您的窗口管理器或桌面环境的启动文件配置。

如果对这些设置不很清楚，最好不要随便改动。了解如何改变＄PATH变量很有用，因为这个变量决定了shell将到哪些目录中寻找命令或程序。如果要执行的命令的目录在＄PATH中，就不必输入这个命令的完整路径，直接输入命令就可以了。一些第三方软件没有将可执行文件放到Linux的标准目录中。因此，将这些非标准的安装目录添加到＄PATH是一种解决的办法。

处理＄PATH变量要注意的是：不能只替换变量，而是要将新的字符串添加到原来的值中。在大多数情况下，不能用“PATH＝/some/directory”，因为这将删除＄PATH中其他的所有目录，这样用户在该终端运进程序时，就不得不给出完整路径。所以，只能作添加：

PATH＝＄PATH：/some/directory

这样，PATH被设成当前的值（以＄PATH来表示）＋新添的目录。

请不要在“.bashrc”中设置PATH，否则会导致PATH中目录的意外增长。您每次打开一个新的shell，“.bashrc”都会作用。所以如果在该文件中添加目录，您每次打开一个终端，目录又会被添加。这将导致PATH变量由于目录复制，不断地增长。

6.6　shell中的其他常用转义字符

除了前面介绍通配字符外，还有几个字符在shell中也有着特殊的含义。下面做一个小结。

1.反引号｀和＄（）

被反引号引起来的部分首先被执行，其结果放在外面的命令中。如：

＄echo Now is｀date｀

Now is Sat Dec 31 15：02：31 CST 2005

＄（）与｀作用相同。如

＄echo There are＄（ps aux｜wc-l）processes running

There are 226 processes running

2.单引号’

如果命令中的某部分被单引号包含，那么其中的所有字符均不转义，而是保留原来的样子。如：

＄xy＝hello

＄echo＄xy world
hello world

＄echo‘＄xy world’

＄xy world

3.双引号”

双引号与单引号类似，但是有三个字符例外，它们是反引号｀，反斜杠\和＄。如：

＄xy＝hello

＄echo＄xy world
hello world

＄echo“＄xy world”

hello world

4.反斜杠\

反斜杠表示下面一个字符不需要转义，如：

＄echo US\＄

US＄

另外，在一行命令的结尾处加\，表示本行没有结束，下行是续行。

6.7　命令的别名

记住所有的命令及各自带的可选项，然后每次一一输入，这确实有点枯燥。但幸运的是，用户可以为常用命令定义快捷方式。这些快捷方式可以用较简单的命令别名（alias），或复杂一些的shell函数的语法来定义。

命令的别名

定义别名的语法是：
alias shortcut＝command

例如，经常用到的命令ls-l，就可以设置一个别名：
alias ll＝ls-l

以后，就可以使用命令ll了，作用与ls-l相同。

命令中有空格的话，就需要用引号（如在命令与可选项间就有空格）。请注意，您可以用单引号或双引号，但它们是有区别的。

单引号将剥夺其中的所有字符的特殊含义，而双引号中的“＄”（参数替换）和“｀”（命令替换）是例外。这意味着，如果您想在别名中应用变量或命令的替换，就得用双引号。

您可以用“alias”在命令行快速地创建别名，或将命令放到各自的“～/.bashrc”，或放到系统级的“/etc/profile.d/alias.sh”中（而在Mandrake Linux 8以前的版本里，用的是“/etc/bashrc”）。要删除一个别名，只要输入：unalias alias。运行alias将列出您系统中所有定义的别名。

6.8　定制用户环境

用户在登录shell时，会依次执行一系列的脚本配置文件。这些配置文件是用来定制用户环境的。登录BASH时，用户将依次执行一系列的脚本：/etc/profile，＄HOME/.bash＿profile（如果没有，执行＄HOME/.bash＿login，还没有，执行＄HOME/.profile）。注销时，会自动执行＄HOME/.bash＿logout。使用redhat的用户，登录时除了这两个文件以外，还会自动执行＄HOME/.bashrc，这个文件又会再执行/etc/bashrc。

bash配置文件

在用户的home目录下，有一些以.bash开头的隐藏文件。

.bash＿history：记录了您以前输入的命令，

.bash＿logout：当您退出shell时，要执行的命令，

.bash＿profile：当您登入shell时，要执行的命令，

.bashrc：每次打开新的shell时，要执行的命令。

请注意后两个的区别：“.bash＿profile”只在会话开始时被读取一次，而“.bashrc”则每次打开新的终端（如新的xterm窗口）时，都要被读取。按照传统，您得将定义的变量，如PATH，放到“.bash＿profile”中，而像aliases（别名）和函数之类，则放在“.bashrc”。但由于“.bash＿profile”经常被设置成先读取“.bashrc”的内容，您如果图省事的话，就把所有配置都放进“.bashrc”。

这些文件是每一位用户的设置。系统级的设置存储在“/etc/profile”、“/etc/ bashrc”及目录“/etc/profile.d”下的文件中。但您得习惯用各自的配置文件：编辑不需要“root”权限，还可以使您的设置更有个性。当系统级与用户级的设置发生冲突时，将采用用户的设置。

上面的这些文件是每位用户的设置，系统级的设置存储在“/etc/profile”、“/etc/ bashrc”及目录“/etc/profile.d”下的文件中。您最好习惯使用各自的配置文件：编辑不需要“root”权限，还可以使您的设置更具个性。当系统级与用户级的设置发生冲突时，将优先采用用户的设置。

shell、转义字符、通配符、重定向、环境变量、别名

1.常用的shell有哪几种？Linux系统中默认的shell是什么？

2.shell的主要功能是什么？bash有什么特点？

3.说明三种引号的作用有什么区别。

4.别名的作用是什么？如何使用？

5.如何定制用户环境？

第七章　进程管理

主要内容

1.进程的概念

2.进程及作业

3.管理进程

4.任务计划

7.1　进程的概念

Linux是一个多用户多任务的操作系统。多用户是指多个用户可以在同一时间使用计算机系统。多任务是指Linux可以同时执行几个任务，它可以在还未执行完一个任务时又执行另一项任务。

操作系统管理多个用户的请求和多个任务。大多数系统都只有一个CPU和一个主存，但一个系统可能有多个二级存储磁盘和多个输入/输出设备。操作系统管理这些资源并在多个用户间共享资源，当您提出一个请求时，给您造成一种假象，好像系统只被您独自占用。而实际上操作系统监控着一个等待执行的任务队列，这些任务包括用户作业、操作系统任务、邮件和打印作业等。操作系统根据每个任务的优先级为每个任务分配合适的时间片，每个时间片大约都有零点几秒，虽然看起来很短，但实际上已经足够计算机完成成千上万的指令集。每个任务都会被系统运行一段时间，然后挂起，系统转而处理其他任务。过一段时间以后再回来处理这个任务，直到某个任务完成，从任务队列中去除。

7.2　进程及作业

Linux系统上所有运行的东西都可以称之为一个进程。每个用户任务、每个系统管理守护进程，都可以称之为进程。Linux用分时管理方法使所有的任务共同分享系统资源。我们所关心的是如何去控制这些进程，让它们能够很好地为用户服务。

进程的一个比较正式的定义是：在自身的虚拟地址空间运行的一个单独的程序。进程与程序是有区别的，进程不是程序，虽然它由程序产生。程序只是一个静态的指令集合，不占系统的运行资源。而进程是一个随时都可能发生变化的、动态的、使用系统运行资源的程序。而且一个程序，可以启动多个进程。

进程和作业的概念也有区别。一个正在执行的进程称为一个作业，而且作业可以包含一个或多个进程，尤其是当使用了管道和重定向命令。

作业控制指的是控制正在运行的进程的行为。比如，用户可以挂起一个进程，等一会儿再继续执行该进程。shell将记录所有启动的进程情况，在每个进程过程中，用户可以任意地挂起进程或重新启动进程。作业控制是许多shell（包括bash和tcsh）的一个特性，使用户能在多个独立作业间进行切换。

例如，当用户编辑一个文本文件，并需要中止编辑做其他事情时，利用作业控制，用户可以让编辑器暂时挂起，返回shell提示符开始做其他的事情。其他事情做完以后，用户可以重新启动挂起的编辑器，返回到刚才中止的地方，就像用户从来没有离开编辑器一样。这只是一个例子，作业控制还有许多其他实际的用途。

7.3　管理进程

键入需要运行的程序的程序名，执行一个程序，其实也就是启动了一个进程。在Linux系统中每个进程都具有一个进程号（PID），用于系统识别和调度进程。启动一个进程有两个主要途径：手工启动和调度启动，后者是事先进行设置，根据用户要求自行启动。关于调度启动，将在后面的任务计划中讨论。

1.启动进程

由用户输入命令，直接启动一个进程便是手工启动进程。但手工启动进程又可以分为前台启动和后台启动。

前台启动是手工启动一个进程的最常用的方式。一般地，用户键入一个命令“ls-l”，这就已经启动了一个进程，而且是一个前台的进程。这时候系统其实已经处于一个多进程状态。或许有些用户会疑惑：我只启动了一个进程而已。但实际上有许多运行在后台的、系统启动时就已经自动启动的进程正在悄悄运行着。还有的用户在键入“ls-l”命令以后赶紧使用“ps-x”查看，却没有看到ls进程，也觉得很奇怪。其实这是因为ls这个进程结束太快，使用ps查看时该进程已经执行结束了。

直接从后台手工启动一个进程用得比较少一些，除非是该进程甚为耗时，且用户也不急着需要结果的时候。假设用户要启动一个需要长时间运行的格式化文本文件的进程。为了不使整个shell在格式化过程中都处于”瘫痪”状态，从后台启动这个进程是明智的选择。

在Linux中，进程与进程之间存在族亲关系。所有的进程，都会有一个父进程。一个进程创造出的新进程叫做老进程的子进程，老进程就是新进程的父进程。所有的进程有一个共同的祖先进程，叫做init，它的进程号为1。

Linux中不存在“孤儿进程”，即没有父进程的进程，所以每个子进程都必须先于父进程结束。也就是说，如果一个进程结束前，它会首先结束它的所有子进程。这样做是为了在进程结束后能够有进程负责清理已结束进程的一些还在内存中的数据结构，如进程控制块等。但是，这样做的结果是，如果从shell中启动了一个后台进程，这个进程非常耗时，以至于当用户要退出shell登录时，这个进程还没有结束。因为shell中启动的任务都以这个shell作为它们的父进程，那么shell退出登录时，就会结束所有的尚未结束的后台进程。

解决这个问题的方法是如果要启动一个非常耗时，可能在退出登录前不能完成的任务时，使用nohup命令。如：
nohup long＿task＞result ＆

这样，当shell退出登录时，这个long＿task不会被结束，而是继续运行，只不过它的父进程改为祖先进程init。

2.查看进程

由于Linux是个多用户系统，有时候也要了解其他用户现在在干什么，同时Linux是一个多进程系统，经常需要对这些进程进行一些调配和管理。而要进行管理，首先就要知道现在的进程情况：究竟有哪些进程？进程情况如何？等等。所以需要进程查看方面的工作。

who命令

该命令主要用于查看当前在线上的用户情况。这个命令非常有用。如果用户想和其他用户建立即时通信，比如使用talk命令，那么首先要确定的就是该用户确实在线上，不然talk进程就无法建立起来。又如，系统管理员希望监视每个登录的用户此时此刻的所作所为，也要使用who命令。who命令应用起来非常简单，可以比较准确地掌握用户的情况，所以使用非常广泛。

w命令

该命令也用于显示登录到系统的用户情况，但是与who不同的是，w命令功能更加强大，它不但可以显示有谁登录到系统，还可以显示出这些用户当前正在进行的工作，并且统计数据相对who命令来说更加详细和科学，可以认为w命令就是who命令的一个增强版。w命令的显示项目按以下顺序排列：当前时间，系统启动到现在的时间，登录用户的数目，系统在最近1秒、5秒和15秒的平均负载。然后是每个用户的各项数据，项目显示顺序如下：登录帐号、终端名称、远程主机名、登录时间、空闲时间、JCPU、PCPU、当前正在运行进程的命令行。其中JCPU时间指的是和该终端（tty）连接的所有进程占用的时间。这个时间里并不包括过去的后台作业时间，但却包括当前正在运行的后台作业所占用的时间。而PCPU时间则是指当前进程（即在WHAT项中显示的进程）所占用的时间。

ps命令
ps命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等等。总之大部分信息都是可以通过执行该命令得到的。

ps命令最常用的还是用于监控后台进程的工作情况，因为后台进程是不和屏幕键盘这些标准输入/输出设备进行通信的，所以如果需要检测其情况，便可以使用ps命令了。

ps［选项］

下面对命令选项进行说明：

-e显示所有进程。

-f全格式。

-h不显示标题。

-l长格式。

-w宽输出。

a显示终端上的所有进程，包括其他用户的进程。

r只显示正在运行的进程。

x显示没有控制终端的进程。

最常用的三个参数是u、a、x。

查看系统中所有的进程，常用的两种格式为：
ps aux或ps-ef
pstree
pstree命令与ps类似，可以显示系统中所有的进程，而且，pstree以树状形式显示进程的族亲关系，看起来一目了然。

top命令
top命令和ps命令的基本作用是相同的，显示系统当前的进程和其他状况。但是top是一个动态显示过程，即可以通过用户按键来不断刷新当前状态。如果在前台执行该命令，它将独占前台，直到用户终止该程序为止。比较准确地说，top命令提供了实时的对系统处理器的状态监视。它将显示系统中CPU最“敏感”的任务列表。该命令可以按CPU使用、内存使用和执行时间对任务进行排序。而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定。

3.进程优先级

在Linux中，进程可以以不同的优先级运行。表示进程优先级关系的参数叫做nice值，nice值越大，进程就越“谦让”，优先级就越低，运行就越慢。一般进程的nice值的取值范围为-20～19，进程缺省的nice值为0。

启动一个进程时可以用nice命令设置nice值，如
nice-n 10 myprog1 ＆

以nice为10的优先级运行进程。普通用户只能将自己的进程的nice设为一个正值，这样这个进程运行起来就比较慢。root可以设置一个进程的nice值为负值。

对于系统中的进程，可以使用ps l命令来查看进程的nice值。

已经开始运行的进程，可以通过renice命令来调整nice值。同样的，普通用户只能将一个进程的nice值变大，而不能变小，root则都可以。

如：renice 15 3456就是将进程PID为3456的进程的nice值改为15。

同样使用top命令，也可以查看或修改进程的nice值。

4.进程调度

进程的挂起及恢复命令bg、fg

作业控制允许将进程挂起并可以在需要时恢复进程的运行，被挂起的作业恢复后将从中止处开始继续运行。只要在键盘上按Ctrl＋Z，即可挂起当前的前台作业。在键盘上按Ctrl＋Z后，将挂起当前执行的命令cat。使用jobs命令可以显示shell的作业清单，包括具体的作业、作业号以及作业当前所处的状态。恢复进程执行时，有两种选择：用fg命令将挂起的作业放回到前台执行。用bg命令将挂起的作业放到后台执行。灵活使用上述命令，将给自己带来很大的方便。

当需要中断一个前台进程的时候，通常是使用Ctrl＋C组合键。但是对于一个后台进程恐怕就不是一个组合键所能解决的了，这时就必须求助于kill命令。该命令可以终止后台进程。至于终止后台进程的原因很多，或许是该进程占用的CPU时间过多，或许是该进程已经挂死。总之这种情况是经常发生的。

kill命令是通过向进程发送指定的信号来结束进程的。如果没有发送指定信号，那么默认值为TERM信号。TERM信号将终止所有不能捕获该信号的进程。至于那些可以捕获该信号的进程可能就需要使用SIGKILL（9）信号了，该信号是不能被捕捉的。

kill命令的语法格式很简单，大致有以下两种方式：
kill［-s信号｜-p］［-a］进程号...

kill-l［信号］

下图是从用户角度来说，进程的三种运行状态及转换关系图。

图7.1　用户角度的进程状态及转换图

7.4　任务计划

调度启动

有时候需要对系统进行一些比较费时而且占用资源的维护工作，这些工作适合在深夜进行，这时候用户就可以事先进行调度安排，指定任务运行的时间或者场合，到时候系统会自动完成这一切工作。要使用自动启动进程的功能，就需要掌握以下几个启动命令。

第一个重要的命令是at命令

用户使用at命令在指定时刻执行指定的命令序列。也就是说，该命令至少需要指定一个命令、一个执行时间才可以正常运行。at命令可以只指定时间，也可以时间和日期一起指定。需要注意的是，指定时间有个系统判别问题。比如说：用户现在指定了一个执行时间：凌晨3：20，而发出at命令的时间是头天晚上的20：00，那么究竟是在哪一天执行该命令呢？如果用户在3：20以前仍然在工作，那么该命令将在这个时候完成。如果用户3：20以前就退出了工作状态，那么该命令将在第二天凌晨才得到执行。下面是at命令的语法格式：
at［-V］［-q队列］［-f文件名］［-mldbv］时间
at-c作业［作业...］
at允许使用一套相当复杂的指定时间的方法，它可以接受在当天的hh：mm（小时：分钟）式的时间指定。如果该时间已经过去，那么就放在第二天执行。当然也可以使用midnight（深夜），noon（中午），teatime（饮茶时间，一般是下午4点）等比较模糊的词语来指定时间。用户还可以采用12小时计时制，即在时间后面加上AM（上午）或者PM（下午）来说明是上午还是下午。也可以指定命令执行的具体日期，指定格式为month day（月日）或者mm/dd/yy（月/日/年）或者dd.mm.yy（日.月.年）。指定的日期必须跟在指定时间的后面。

上面介绍的都是绝对计时法，其实还可以使用相对计时法，这对于安排不久就要执行的命令是很有好处的。指定格式为：now＋count time-units，now就是当前时间，time-units是时间单位，这里可以是minutes（分钟）、hours（小时）、days（天）、weeks（星期）。count是时间的数量，究竟是几天，还是几小时，等等。

还有一种计时方法就是直接使用today（今天）、tomorrow（明天）来指定完成命令的时间。下面通过一些例子来说明具体用法。

［例］指定在今天下午5∶30执行某命令。假设现在时间是中午12∶30，2001年2月24日，其命令格式如下：
at 5：30pm
at 17：30
at 17：30 today
at now＋5 hours
at now＋300 minutes
at 17：30 24.2.99
at 17：30 2/24/99
at 17：30 Feb 24

以上这些命令表达的意义是完全一样的，所以在安排时间的时候完全可以根据个人喜好和具体情况自由选择。一般采用绝对时间的24小时计时法可以避免由于用户自己的疏忽造成计时错误的情况发生，例如上例可以写成：
at 17：30 2/24/99

这样非常清楚，而且别人也看得懂。

对于at命令来说，需要定时执行的命令是从标准输入或者使用-f选项指定的文件中读取并执行的。如果at命令是从一个使用su命令切换到用户shell中执行的，那么当前用户被认为是执行用户，所有的错误和输出结果都会送给这个用户。但是如果有邮件送出的话，收到邮件的将是原来的用户，也就是登录时shell的所有者。在7月31日上午10点执行文件work中的作业。

在任何情况下，超级用户都可以使用这个命令。对于其他用户来说，是否可以使用就取决于两个文件：/etc/at.allow和/etc/at.deny。

cron命令

前面介绍的两条命令都会在一定时间内完成一定任务，但是要注意它们都只能执行一次。也就是说，当指定了运行命令后，系统在指定时间完成任务，一切就结束了。但是在很多时候需要不断重复一些命令，比如：某公司每周一自动向员工报告头一周公司的活动情况，这时候就需要使用cron命令来完成任务了。实际上，cron命令是不应该手工启动的。cron命令在系统启动时就由一个shell脚本自动启动，进入后台（所以不需要使用＆符号）。一般的用户没有运行该命令的权限，虽然超级用户可以手工启动cron，不过还是建议将其放到shell脚本中由系统自行启动。

首先cron命令会搜索/var/spool/cron目录，寻找以/etc/passwd文件中的用户名命名的crontab文件，被找到的这种文件将载入内存。例如一个用户名为foxy的用户，它所对应的crontab文件就应该是/var/spool/cron/foxy。也就是说，以该用户命名的crontab文件存放在/var/spool/cron目录下面。cron命令还将搜索/etc/crontab文件，这个文件是用不同的格式写成的。cron启动以后，它将首先检查是否有用户设置了crontab文件，如果没有就转入“休眠”状态，释放系统资源。所以该后台进程占用资源极少。它每分钟“醒”过来一次，查看当前是否有需要运行的命令。命令执行结束后，任何输出都将作为邮件发送给crontab的所有者，或者是/etc/crontab文件中MAILTO环境变量中指定的用户。上面简单介绍了一些cron的工作原理，但是cron命令的执行不需要用户干涉。需要用户修改的是crontab中要执行的命令序列，所以下面介绍crontab命令。

crontab命令
crontab命令用于安装、删除或者列出用于驱动cron后台进程的表格。也就是说，用户把需要执行的命令序列放到crontab文件中以获得执行。每个用户都可以有自己的crontab文件。下面就来看看如何创建一个crontab文件。在/var/spool/cron下的crontab文件不可以直接创建或者直接修改。crontab文件是通过crontab命令得到的。现在假设有个用户名为foxy，需要创建自己的一个crontab文件。首先可以使用任何文本编辑器建立一个新文件，然后向其中写入需要运行的命令和要定期执行的时间。然后存盘退出。假设该文件为/tmp/test.cron。然后就是使用crontab命令来安装这个文件，使之成为该用户的crontab文件。键入：crontab test.cron。

这样一个crontab文件就建立好了。可以转到/var/spool/cron目录下面查看，发现多了一个foxy文件。这个文件就是所需的crontab文件。

在crontab文件中如何输入需要执行的命令和时间。该文件中每行都包括六个域，其中前五个域是指定命令被执行的时间，最后一个域是要被执行的命令。每个域之间使用空格或者制表符分隔。格式如下：
minute hour day-of-month month-of-year day-of-week commands

第一项是分钟，第二项是小时，第三项是一个月的第几天，第四项是一年的第几个月，第五项是一周的星期几，第六项是要执行的命令。这些项都不能为空，必须填入。如果用户不需要指定其中的几项，那么可以使用*代替。因为*是通配符，可以代替任何字符，所以就可以认为是任何时间，也就是该项被忽略了。

例：

30　　8 　* * *　task1　每天早上8：30分执行一次

0，30 8-16* * *　task2　从早上8：00到下午4：30分，每半小时执行一次

0　12　1　5 *　task3　每年的5月1日中午12点执行一次

59　　7 *　* 1　task4　 每周1的早上7：59执行一次

进程、程序、作业、后台进程、任务计划

1.进程与程序有什么区别？

2.如何启动一个后台进程？如何运行一个耗时非常长的进程？

3.如何控制前台进程和后台进程？

4.如何设置一个进程在后来的时间运行一次？

5.如何设置一个周期性运行的任务？

第八章　图形界面与中文处理

主要内容

1.X-Window与Linux

2.Linux与中文处理

8.1　X-Window与Linux

一、X-Window简介

要想成为一套优秀的操作系统，除了性能稳定、功能齐全之外，还应该拥有一个友好的操作系统，否则只会待在研究室里，难以普及。

在UNIX系统下，大多都是采用X-Window做为图形界面的。1984年，麻省理工学院与DEC制订了Athena计划，这就是X-Window第一个版本。1988年1月成立了一个非营利性的X联盟，负责制定X-Window的标准。在Linux出现后，XFree86 Project Inc.基于Linux实现了一个开源的X-Window系统：XFree86。

X Window与其他的图形界面系统相比，有几个特点：

良好的网络支持：X-Window采用了C/S网络结构，程序间可以通过网络来通信，而且有良好的网络透明性，也就是说用户不需知道程序在使用远端主机资源。

个性化的窗口界面：X-Window并未对窗口界面作统一性的规范，程序员可以根据需求自行设计，其中最有名的就是后面要介绍的GNOME与KDE。

不内嵌于操作系统：X-Window只定义了一个标准，而不属于某个操作系统，因此可在不同的操作系统上运行相同的X-Window软件。

整个X-Window由三个部分组成：

X Server：主要是控制输出及输入设备的程序，并维护相关资源，它接收输入设备的信息，并将其传给X Client，而将X Client传来的信息输出到屏幕上。所以不同的显卡就需要选择不同的X Server，在配置X-Window时最主要的就是配置X Server。

X Client：它才是应用程序的核心部分，它是与硬件无关的，每个应用程序就是一个X Client。

X protocol：X Client与X Server之间的通信语言就是X protocol。

为了使得X Window更加易于使用，各个不同的公司与组织都针对其做了许多集成桌面环境。如AIX上的CDE，SUN上的OpenServer，而在Linux下则主要是GNOME与KDE的双雄会。下面我们就一起来了解一下它们。

二、GNOME简介

GNOME最初是由墨西哥的程序设计师MiguelDeIcazq发起的，它受到了Red Hat公司的大力支持。它现在属于GNU（GNU is Not UNIX）计划的一部分，主要目的是希望能够为用户提供一个完整、易学、易用的桌面环境，并为程序设计师提供强大的应用程序开发环境。

1997年8月，为了克服KDE所遇到的QT许可协议和单一C＋＋依赖的困难，以墨西哥的MigueldeIcaza为首的250程序员就开始了一个新项目，完全从头开始，这就是GNOME。经过14个月的共同努力，终于完成了这个工程。现在GNOME已得到了占Linux市场份额最大发行商Red Hat的支持，拥有了大量应用软件，包括文字处理软件Go，电子表格软件Gnumeric，日历程序GNOMEcal，堪与Photoshop媲美的图形图像处理软件Gimp等。

现在GNOME与KDE成为了两大竞争阵营，必将使得Linux更加易于使用。

GNOME中还提供了大量的应用软件，它们都放在GNOME的“开始”（一个小脚丫）Programs中，包括了许许多多的应用软件，下面就是其中的一些：

1.Applications：应用软件

（1）Dia：一个工程图编辑器，适用于绘制电路图。

（2）Calendar：一个集日历与日程表于一身的好工具。

（3）Address Book：一个通讯录。

（4）GEdit：一个功能类似于Windows下的记事本的文本编辑器。

（5）Gnumeric：Linux下的一个类似于Excel的电子表格软件。

（6）Timetrackingtools：一个用于提醒时间的小工具。

2.Games：游戏软件

（1）Gnome Milnes：GNOME下的扫雷。

（2）Gnibbles：贪吃蛇游戏。

（3）Freecell：Windows下的空当接龙游戏。

3.Graphics：图形处理软件

（1）Electric Eyes：一个十分优秀的图形处理软件，可谓GNOME下的AcdSee呀！

（2）XPDF：一个在Linux阅读PDF文档的工具。

（3）TheGimp：一个十分优秀的绘图软件，与Photoshop很像！

4.Internet：Internet应用软件

（1）Dialup Configuration Tool：一个界面十分友好的拨号上网设置工具。

（2）gFTP：一个FTP客户端。

（3）pine：一个E-mail客户端软件。

（4）Netscape：大名鼎鼎的浏览器软件，被微软从Windows平台挤下来的。

（5）RHNetworkmonitor：网络流量显示。

5.Multimedia：多媒体软件

（1）Audio Mixer：声音控制器。

（2）CDPlayer：CD播放器。

（3）XMMS：与Winamp是一个模子里出来的。

三、KDE简介

KDE项目在1996年10月发起，其目的是在X-Window上建立一个完整易用的桌面环境。KDE现在除了拥有KFM（类似于IE4.0）、KPresenter（类似PowerPoint）、KIllustrator（类似CorelDraw或Illustrator）等重量级软件，还有体贴用户的GUI配置软件可以帮助用户配置UNIX/Linux，使其深受使用者欢迎。

但由于KDE是基于由TrollTech公司开发的Qt程序库的，所以也受到了许多批评。虽然Qt本身作为一个基于C＋＋的跨平台开发工具是非常优秀，但可惜的是它不是自由软件。Qt的License允许任何人使用Qt编写免费软件及免费拷贝给其他用户使用，但如果利用Qt编写非免费软件则需要购买他们的License。更重要的是任何人都不可以随意修改Qt源代码。如果TrollTech公司更改QtLicense、公司倒闭或给人收购等都会令KDE前功尽弃。

在KDE中，也有许许多的应用软件，它们被分组放在“开始”（一个K字）菜单中，说实在的，我感觉KDE的软件应用比GNOME更多，图形界面也更好。

1.Office：办公软件

这就是大名鼎鼎的Koffice套件。

（1）Kword：字处理软件

（2）Kspread：像Excel的电子表格处理软件

（3）Kpresenter：一个类似于PowerPoint的演示软件

（4）Kchart：一个电子图表软件

（5）Kiiiustrator：一个电子出版软件

2.Develop：开发工具

（1）Kdevelop：一个KDE下的集成开发环境

3.Applications：应用软件

（1）AdvancedEditor：一个增强型的文本编辑软件

（2）Emacs：这是一个功能强大的编辑软件，在GNOME中也有，它的原形是字符终端下的Emacs

（3）Organizer：一个日程安排软件

4.Internet：Internet软件

（1）Kppp：一个十分友好的拨号上网配置工具

（2）Kmail：一个十分漂亮的E-mail客户端，有点像Outlook

（3）ChatClient：一个IRC客户端

（4）KPPPLoad：一个网络流量工具

（5）Netscape：大名鼎鼎的Web浏览器，在GNOME中也有集成

四、使用窗口管理器

Red Hat/Fedora默认安装后，X-Window将使用GNOME做为窗口管理器，除非你在安装时将GNOME去掉，而选择了KDE包。通常我们可以将这两个包都安装上，到使用的时候再选择。

（1）在字符终端下执行以下命令，则以后X-Window的窗口管理器都成了KDE：

＃switchdeskKDE

（2）如果你又不想使用KDE了，则可以使用以下命令转回GNOME：

＃switchdeskGNOME

8.2　Linux与中文处理

在信息处理日益国际化的今天，计算机软件的国际化与本地化工作显得越来越重要。可以想象，一个不能处理多国语言文字的软件，将很难在国际上推广。另外，一个国外的软件，如果不能很好地做好本地化工作，那么满屏的外文，也很难让国内的用户接受。

众所周知，计算机的“母语”是英语，计算机一开始就只认识英文。但是，全世界的语言文字有上百种，这还不包括一些罕用的语言与文字。为了让计算机能够处理这些语言与文字，也为了让使用非英语的人能够方便地使用计算机，就需要做大量的国际化与本地化工作。本文将针对在这个过程中常见的问题加以分析并给出解决方法。

国际化与本地化

国际化，即Internationalization。这个单词很长，因第一个字母与最后一个字母之间有18个字母，故常简写为i18n。国际化指的是一个软件所处理的信息应当是包含各国语言和文字的，而不能仅局限于英文。

本地化，即Localization，因第一个字母与最后一个字母之间有10个字母，故常简写为l10n。本地化指的是将本来是其他国家语言和文字的软件，翻译成本国语言和文字，以方便本国用户使用。

国际化与本地化是两个技术，但他们都面临着相同的问题，即如果处理世界上众多的语言与文字。这个问题是与字符集编码有着密切的关系。

常见字符集编码

一、字符与编码

字符在计算机内以编码的形式存储。所谓编码，是以固定的顺序排列字符，并以此作为记录、存贮、传递、交换的统一内部特征，这个字符排列顺序被称为“编码”。

二、英文数字编码

最初计算机只能处理英文，英文、数字和标点符号，采用的是美国的国家标准ASCII（American Standard Code for Information Interchange）。ASCII编码进一步成为世界性的编码标准：ISO646（全名为7-bit coded character set for information interchange）。时至今日，虽然一个字节（byte）的长度已经从7位（bit）增加为8位，ASCII和ISO646仍然是电脑与网络世界里重要的奠基标准。

ASCII码编码长度为7位，可以提供128个编码位置（0～127）。分为两个部分：94个图形字符和34个控制字符。图形字符编码范围从33～126。控制字符则编码为0～32及127。ASCII开始时采用7位编码，高位（bit-8）用于在网络传输中做奇偶校验。后来，为了表示一些常见的欧洲字符，对高位（bit-8）为1的128个码位也进行了扩展编码。

8位字符集只能容纳256个字符，比如Latin-1（ISO 646）包括了英语、数字、常用标点和常见的一些欧洲字符。但是它们无法很好地承担在世界范围内进行信息交换的重任，因为它们没有足够的空间来容纳其他语言上万的字符。后来，很多国家为了表示本国文字，使用2或多字节来编码，如日语（JIS）、汉语（GB、BIG5）、韩语（KS）、印度语（ISCII）等等。

三、早期的汉字编码

1980年我国颁布了第一个汉字编码字符集标准，即GB2312-1980《信息交换用汉字编码字符集基本集》。该标准共收了6763个汉字及常用符号，奠定了中文信息处理的基础。GB2312-1980全称是《信息交换用汉字编码字符集基本集》，1980年发布，是中文信息处理的国家标准，在大陆及海外使用简体中文的地区（如新加坡等）是强制使用的唯一中文编码。P-Windows3.2和苹果OS就是以GB2312为基本汉字编码，Windows 95/98则以GBK为基本汉字编码，但兼容支持GB2312。

GB2312编码的码长为2个字节。在这个方案中，每个字符都有一个区位码。区位码由区码和位码组成，区码：01～94，位码：01～94。其中01区～15区：符号区。16区～88区：汉字区。区码＋160（0xA0）＝国标码高位，位码＋160（0xA0）＝国标码低位。GB2312编码体系中，机内存储的是国标码，范围：A1A1～FEFE，其中高位A1-A9：符号区，包含682个符号。B0-F7：汉字区，包含6 763个汉字。GB码共收录6 763个简体汉字、682个符号，其中汉字部分：一级字3 755个，以拼音排序，二级字3008，以偏旁排序。该标准的制定和应用为规范、推动中文信息化进程起了很大作用。

在同时期，在我国台湾地区、香港地区等使用繁体字的地方，通行的是BIG5编码，这是一种繁体汉字的编码标准，包括440个符号，一级汉字5 401个、二级汉字7 652个，共计13060个汉字。另外，日本、韩国等国家，因为其语言中包括“汉字”，所以各自也有对汉字的编码。

上述这些编码都是在计算机刚刚从科学计算领域走向信息处理领域，并从美国等西方少数国家走向全世界的时候诞生的。为了处理成千上万的汉字，中、日、韩等国家大都采用双字节编码体系。这些编码在早期处理汉字等非英语字符时起到了重要的作用。但是发展到现在，也暴露出很多问题：

（1）字符集太小。双字节编码体系（DBCS）理论上能容纳65 536个字符，但是实际上为了预防多字节字符编码被电脑或网络设备“吃掉”其中的某些字节，在编码时就必须避开每个字节的0～32和127这34个控制码（0～31叫做C0控制码区，128～159叫做C1控制码区），这样就会严重浪费编码空间。GB2312-1980所包含的汉字只有6 763个，BIG5也只有13060个。相对康熙大字典、中华大字典所收录的五六万的汉字，这些编码只能包含其中常用的一部分汉字。这样，没有被收录的汉字计算机就没有办法处理。我们经常在输入一些人名、地名时遇到这样的问题。

（2）由于国家、厂商和组织众多，缺乏共识，往往是你编你的码，我编我的码，其后果则是引发万“码”奔腾的现象。同样的一个编码，在不同的编码体系中代表不同的字。这样对于信息的识别和交换带来很大的麻烦。

四、国际统一编码

1.ISO10646

为容纳全世界各种语言的字符，ISO于1984年发起制定新的国际字符集编码标准。新标准由工作小组ISO/IEC JTC1/SC2/WG2（以下简称WG2）负责拟定，标准最后定名为“Universal Multiple-Octet Coded Character Set”（简称UCS），其编号则定为ISO/ IEC 10646。

ISO 10646字符集的正规形式为32位，即4个字节，简记为USC-4。4个字节分别代表编码结构中的组（group）、面（plane）、列（row）和格（cell）。WG2规定b32必须为0，且每个平面的最后二个编码位置，即FFFE和FFFF，保留不用。所以ISO10646共有128*256＝32768个面，每个面有256*256-2＝65 534个编码位置，共计2 147 418 112个编码位置。

ISO10646中第0组第0面称为“基本多语言文字面”即“Basic Multi-lingual Plane，BMP”。当只使用BMP字符码时，可以省略群八位和面八位，因而将字符码由32位缩短为16位，称为ISO10646字符码的基本面形式（可简称为UCS-2）。1993年国际标准化组织发布了ISO/IEC 10646-1《信息技术通用多八位编码字符集第一部分体系结构与基本多文种平面》。我国等同采用此标准制定了GB 13000.1-1993。该标准共收录了中、日、韩20 902个汉字。ISO10646的编码空间足以容纳古今人类使用过的所有文字和符号。但目前真正被使用的文字或符号，绝大多数都已经编入BMP，它们的使用频率可以超过99%。

WG2依语言特性把各种文字区分为表意文字和非表意文字两类。WG2截至目前为止所收集、整理的非表意文字和符号部分，扣除已编入BMP者，其余全部编入第1字面。而表意文字部分扣除已编入BMP者，其余全部编入第二字面。ISO10646所有字面中，目前仅有第0、第1和第2字面真正收容编码字符。

2.Unicode

与ISO制定10646的同时，以Universal，Unique和Uniform为主旨的Unicode组织也开始开发一个16位字符标准，为避免两种16位编码的竞争，1991年10月两组织达成协议，采用同一编码字集。这就是今天的UCS-2（BMP，Basic Multilingual Plane，16bit）和Unicode，但它们仍然是不同的方案。

目前Unicode是采用16位编码体系，其字符集内容与ISO10646的BMP（Basic Multilingual Plane）相同。Unicode于1992年6月通过DIS（Draft International Stand-ard），版本V2.0于1996年公布，内容包含符号6 811个，汉字20 902个，韩文拼音11 172个，造字区6 400个，保留20249个，共计65 534个。

但是，在Unicode世界中，遇到必须使用ISO10646中第1、第2字面甚至更后方字面的字符时，怎么办？Unicode协会提出的解决方式称为UTF-16或代理法（surro-gates）。UTF为“UCS（or Unicode）Transformation Format”的缩写。UTF-16意即把原为32位的ISO10646字符码转换为两个或多个16位的Unicode。目前的做法是组合两个Unicode字符码来代表一个ISO10646字符，所以又称为代表法。UTF-16总计可提供16个字面。对BMP而言，当然无需使用UTF-16转码，所以UTF-16主要应用于ISO10646的第1～14字面（因为第15字面为专用字面，WG2不予编码）。

由于Unicode编码是16位编码，因此它和很多只能使用US-ASCII编码的应用程序不兼容，因此产生了对Unicode进行各种转换的编码，以满足不同场合的需要。常见的编码为UTF-8。很多应用程序不能直接处理Unicode或UCS-4/UCS-2中的16（32）位字符。如Unicode中含有的\x0等字符将不能直接用于文件名或C字符串等等。利用UTF-8转码规则可将一个Unicode或ISO10646字符码转换成1～4个字节的编码。其中与ASCII码对应的字符转换成1个字节，与ASCII码相同，汉字等其他文字转成2～4个字节。

3.GBK和GB180130-2000

GBK编码是中国大陆制定的、等同于UCS的新的中文编码扩展国家标准。GBK工作小组于1995年12月完成GBK规范。该编码标准兼容GB2312，共收录汉字21003个、符号883个，并提供1 894个造字码位，简、繁体字融于一库。Windows95/98简体中文版的字库表层编码就采用的是GBK，通过GBK与UCS之间一一对应的码表与底层字库联系。

GBK的英文名：Chinese Internal Code Specification。中文名：汉字内码扩展规范1.0版。GBK采用双字节编码，GB2312-80的扩充，在码位上和GB2312-80兼容。范围：8140～FEFE（剔除xx7F）共23 940个码位，包含21003个汉字，包含了ISO/IEC 10646-1中的全部中日韩汉字。

信息产业部和原国家质量技术监督局于2000年3月17日联合发布了GB18030-2000《信息技术信息交换用汉字编码字符集基本集的扩充》。该方案与GB2312信息处理交换码所对应的事实上的内码标准兼容，在字汇上支持GB13000.1的全部中、日、韩（CJK）统一汉字字符和全部CJK扩充A的字符，并且确定了编码体系和27 484个汉字，兼容性、扩展性、前瞻性兼备。该标准作为国家强制性标准自发布之日起实施，过渡期到2001年8月31日止。GB18030是国家标准，在技术上是GBK的超集，并与其兼容，因此，GBK将结束其历史使命。

GB18030的英文名：Chinese Internal Code Specification。中文名：信息技术信息交换用汉字编码字符集。它是GB2312-1980基本集的扩充（2000-03-17发布和实施）。GB18030-2000采用单字节、双字节、四字节编码，向下与国家标准GB2312信息处理交换码所对应的事实上的内码标准兼容。在字汇上支持GB13000.1的全部中、日、韩（CJK）统一汉字字符和全部CJK统一汉字扩充A的字符。双字节部分收录内容主要包括GB13000.1全部CJK汉字20 902个，有关标点符号、表意文字描述符13个，增补的汉字和部首/构件80个，双字节编码的欧元符号等。四字节部分收录了上述双字节字符之外的，包括CJK统一汉字扩充A在内的GB13000.1中的全部字符。GB18030编码空间约为160万码位，目前已编码的字符约2.6万。随着我国汉字整理和编码研究工作的不断深入，以及国际标准ISO/IEC10646的不断发展，GB18030所收录的字符将在新版本中增加。

GB18030在体系结构上延续GB2311-1990《信息处理七位和八位编码字符集代码扩充技术》体系，采用单/双/四字节混合编码。GB18030-2000码位范围分配图见图8.1，码位总体结构图见图8.2。该标准与现有的绝大多数操作系统、中文平台在计算机内码一级兼容，能够支持现有的应用系统，在字汇上与GB13000.1-1993《信息技术通用多八位编码字符集（UCS）第一部分：体系结构与基本多文种平面》兼容，从而为中文信息在国际互联网上的传输与交换提供了保障。

图8.1　GB18030-2000码位范围分配图

图8.2　GB18030-2000码位总体结构图

国家标准GB18030-2000《信息交换用汉字编码字符集基本集的扩充》是我国继GB2312-1980和GB13000-1993之后最重要的汉字编码标准，是未来我国计算机系统必须遵循的基础性标准之一。凡是在2001年8月31日后正式发布或出厂的产品，必须符合GB18030相关要求。凡不符合该标准的产品，视为不合格产品。GB18030收录了27 484个汉字，总编码空间超过150万个码位，为解决人名、地名用字问题提供了方案，为汉字研究、古籍整理等领域提供了统一的信息平台基础。该标准同时收录了藏文、蒙文、维吾尔文等主要的少数民族文字，为推进少数民族的信息化奠定了坚实的基础。

五、操作系统中处理汉字的方法

现在微机上用的操作系统主要有两类，一类是微软的Windows系列；一类是Unix/Linux。Windows从Windows 2000开始支持GB18030-2000，但需要安装GB18030支持包。Windows 2000为了能够处理多国文字，在内核中使用Unicode编码体系，但为了符合中国相关规定，在上层增加了对GB18030的支持，之间使用了一套映射机制，这套机制对用户是透明的，这样可以最大程度上保护已有的GB2312、GBK编码的文档的使用。Linux也是采用了类似的机制。

图形界面、X-Window、中文、i18n、l10 n

1.X-Window与Linux内核是什么关系？

2.X-Window分为几部分？它们之间是什么关系？

3.如何启动Linux的图形界面？

4.常见的中文字符编码有哪些？

5.Linux在处理中文方面有哪些面临的问题？

第九章　Linux管理任务

主要内容

1.用户和组的管理

2.软件包管理

3.系统引导

4.内核重编译与模块

5.系统紧急修复

9.1　用户和组的管理

一、用户和组的概念

1.用户（user）的概念

Linux是真正意义上的多用户操作系统，所以我们能在Linux系统中建若干用户（user）。Linux中的用户分为三种，一种是普通用户。比如一台Linux的机器有很多人使用，一般不应该让所有的人使用同一个用户登录，因为每个用户可能有不想让别人看到的隐私内容，例如，资料和信息，这时应该为每位使用者建立独立的用户名，让每个用户使用自己的用户名登录，这从计算机安全角度来说是符合操作规则的。

另外，在Linux系统中还有一些用户是用来完成特定任务的，比如nobody和ftp等，比如一台Web服务器，别人连接上来访问网站，就是nobody用户。我们匿名访问ftp时，会用到用户ftp或anonymous。

第三种用户就是系统管理员。在Linux操作系统中，系统管理员的用户名为root，它的权限是最高的，也被称为超级权限的拥有者。普通用户无法执行的操作，root用户都能完成，所以也被称之为超级管理用户。

2.组（group）的概念

组（group）就是具有相同特征的用户（user）的集合体。比如有时我们要让多个用户具有相同的权限，比如查看、修改某一文件或执行某个命令，这时我们需要组，我们把用户都定义到同一组中，通过修改文件或目录的权限，让组具有一定的操作权限，这样组下的用户对该文件或目录都具有相同的权限，这就是通过定义组和修改文件的权限来实现的。

举例：我们为了让一些用户有权限查看某一文档，比如是一个时间表，而编写时间表的人要具有读写执行的权限，我们想让一些用户知道这个时间表的内容，而不让他们修改，所以我们可以把这些用户都划到一个组，然后来修改这个文件的权限，让组可读，这样组中的每个用户都是可读的。

3.用户和组的关系

用户和组的对应关系是：一对一、多对一、一对多或多对多。

一对一：某个用户可以是某个组的唯一成员。

多对一：多个用户可以是某个唯一的组的成员，不归属其他组。比如tux1和tux2两个用户只归属于tux1组。

一对多：某个用户可以是多个组的成员。比如tux1可以是root组成员，也可以是tux2组成员，还可以是adm组成员。

多对多：多个用户对应多个组，并且几个用户可以是归属相同的组。其实多对多的关系是前面三条的扩展。

一个用户可以属于一个组，也可以属于多个组。但每一个用户都至少要属于一个组，这个组叫做该用户的主要组（Primary Group），简称主组。一个用户如果还属于其他的组，那么这些组构成该用户的组集合（Group Set）。一个用户的组集合可能为空，但主要组一定会有，并且其中只有一个组。

对于判断用户访问权限来说，用户的主要组和组集合没有什么区别。它们的区别在于用户创建文件和目录时，被创建的文件和目录的所有者为创建者，因为一个文件只能属于一个组，故文件所在的组为创建者的主要组。

二、用户和组相关的配置文件和目录

1.与用户相关的配置文件

与用户相关的系统配置文件主要有/etc/passwd和/etc/shadow，其中/etc/shadow是用户信息的加密文件，比如用户口令的加密保存等。/etc/passwd和/etc/shadow文件是互补的。我们可以通过对比两个文件来查看它们的关系。

/etc/passwd是系统识别用户的一个文件，打个比方，/etc/passwd是一个花名册，系统所有的用户都在这里有登录记载。当我们以tux1这个帐号登录时，系统首先会查阅/etc/passwd文件，看是否有tux1这个帐号，然后确定tux1的UID，通过UID来确认用户和身份，如果存在则读取/etc/shadow影子文件中所对应的tux1的密码。如果密码核实无误则登录系统，读取用户的配置文件。该文件的权限一般为：

-r--r--r--1 root root 1024 10月1609：49/etc/passwd

在/etc/passwd中，每一行都表示的是一个用户的信息。一行有7个段位。每个段位用冒号“：”分隔，比如下面二行：
tux1：x：500：500：Mr.Tux1：/home/tux1：/bin/bash
tux2：x：501：501：：/home/tux2：/bin/bash

第一字段：用户名（也被称为登录名）。在上面的例子中，我们看到这两个用户的用户名分别是tux1和tux2。

第二字段：口令。在例子中我们看到的是一个x，其实密码已被映射到/etc/shadow文件中。

第三字段：UID。用户的数字ID。

第四字段：GID。用户主要组的组ID。

第五字段：用户名全称，这是可选的，可以不设置，在tux1这个用户中，用户的全称是Mr.tux1。而tux2这个用户没有设置全称。

第六字段：用户的主目录所在位置。tux1这个用户是/home/tux1，而tux2这个用户是/home/tux2。

第七字段：用户所用SHELL的类型，tux1和tux2都用的是bash。所以设置为/bin/bash。

UID是用户的ID值，在系统中每个用户的UID的值是唯一的，更确切的说每个用户都要对应一个唯一的UID，系统管理员应该确保这一规则。系统用户的UID的值从0开始，是一个正整数，至于最大值可以在/etc/login.defs可以查到，一般Linux发行版约定为60000。在Linux中，root的UID是0，拥有系统最高权限。

UID是确认用户权限的标识，用户登录系统所处的角色是通过UID来实现的，而非用户名。UID在系统中具有唯一性，作为系统管理员应该确保这一标准，UID的唯一性关系到系统的安全，应该值得我们关注！比如在/etc/passwd中把tux1的UID改为0后，设想会发生什么呢？tux1这个用户会被确认为root用户。tux1这个帐号可以进行所有root的操作。

一般情况下，每个Linux的发行版都会预留一定的UID和GID给系统虚拟用户占用，虚拟用户一般是系统安装时就有的，是为了完成系统任务所必需的用户，但虚拟用户是不能登录系统的，比如ftp、nobody、adm、rpm、bin、shutdown等。

在Fedora系统会把前499个UID和GID预留出来，我们添加新用户时的UID是从500开始的，GID也是从500开始，至于其他系统，有的系统可能会把前999的UID和GID预留出来。以各个系统中/etc/login.defs中的UID＿MIN的最小值为准。Fedora系统login.defs的UID＿MIN为500，而UID＿MAX值为60000，也就是说我们通过adduser默认添加的用户的UID的值在500～60000之间。而Slackware通过adduser不指定UID来添加用户，默认UID是从1000开始。

/etc/shadow文件是/etc/passwd的影子文件，这个文件并不由/etc/passwd而产生，这两个文件应该是对应互补的。shadow内容包括用户及被加密的密码以及其他/ etc/passwd不能包括的信息，比如用户的有效期限等。这个文件只有root权限可以读取和操作，权限如下：

-r--------1 root root 1.5K 10月1609：49/etc/shadow

/etc/shadow的权限不能随便改为其他用户可读，这样做是危险的。如果您发现这个文件的权限变成了其他组或用户可读了，要进行检查，以防系统安全问题的发生。如果我们以普通用户查看这个文件时，应该什么也查看不到，提示是权限不够：

/etc/shadow文件的内容包括9个段位，每个段位之间用冒号“：”分隔。例如：
tux11VE.Mq2 Xf2c9Qi7EQ9JP8GKF8gH7PB1：13072：0：99999：7：：：
tux21IPDvUhXP 8R6J/VtPXvLyXxhLWPrnt/：13072：0：99999：7：：13150：

第一字段：用户名（也被称为登录名），在/etc/shadow中，用户名和/etc/passwd是相同的，这样就把passwd和shadow中用的用户记录联系在一起。这个字段是非空的。在本例中有两条记录，表示有两个用户tux1和tux2。

第二字段：密码（已被加密），如果是有些用户在这段是x，表示这个用户不能登录到系统，也可以看作是虚拟用户。这个字段是非空的。

第三字段：上次修改口令的时间。这个时间是从1970年1月1日算起到最近一次修改口令的时间间隔（天数），可以通过passwd来修改用户的密码，然后查看/etc/ shadow中此字段的变化。上面的例子能说明tux1和tux2这两个用户，是在同一天更改了用户密码，更改密码的时间距1970年1月1日为13072天。

第四字段：两次修改口令间隔最少的天数，也就是说用户必须经过多少天才能修改其口令。如果设置为0，则禁用此功能。此项功能用处不是太大。默认值是通过/ etc/login.defs文件定义中获取，PASS＿MIN＿DAYS中有定义。上例中设置为0。

第五字段：两次修改口令间隔最多的天数。这个能增强管理员管理用户口令的时效性，应该说增强了系统的安全性。如果是系统默认值，是在添加用户时从/etc/login.defs文件定义中获取，在PASS＿MAX＿DAYS中定义。在本例中都是99 999天。

第六字段：提前多少天警告用户口令将过期。当用户登录系统后，系统登录程序提醒用户口令将要作废。如果是系统默认值，是在添加用户时从/etc/login.defs文件定义中获取，在PASS＿WARN＿AGE中定义。在本例中的值是7，表示在用户口令将过期的前7天警告用户更改过期口令。

第七字段：在口令过期之后多少天禁用此用户。此字段表示用户口令作废多少天后，系统会禁用此用户，也就是说系统会不能再让此用户登录，也不会提示用户过期，是完全禁用。在本例中，两个用户的此字段都是空的，表示禁用这个功能。

第八字段：用户过期日期。此字段指定了用户作废的天数（从1970年的1月1日开始的天数），如果这个字段的值为空，帐号永久可用。在例子中，我们看到tux1这个用户在此字段是空的，表示此用户永久可用。而tux2这个用户表示在距1970年1月1日后13 150天后过期，算起来也就是2006年1月1日过期。

第九字段：保留字段，目前为空，以备将来Linux发展之用。

2.与组相关的配置文件

组（Group）配置文件主要有/etc/group和/etc/gshadow，其中/etc/gshadow是/ etc/group的加密信息文件。

/etc/group文件是组的配置文件，内容包括用户和组，并且能显示出用户是归属哪个组或哪几个组，因为一个用户可以归属一个或多个不同的组。同一组的用户之间具有相似的特征。比如我们把某一用户加入到root组，那么这个用户就可以浏览root用户主目录的文件，如果root用户把某个文件的读写执行权限开放，root组的所有用户都可以修改此文件，如果是可执行的文件（比如脚本），root组的用户也是可以执行的。组的特性在系统管理中为系统管理员提供了极大的方便，但安全性也是值得关注的，如某个用户下有对系统管理有最重要的内容，最好让用户拥有独立的组，或者是把用户下的文件的权限设置为完全私有。另外root组一般不要轻易把普通用户加入进去。

/etc/group的内容包括组名、组口令、GID及该组所包含的用户（user），每个组一条记录。格式如下：
group＿name：passwd：GID：user＿list

在/etc/group中的每条记录分四个字段：

第一字段：组名称。

第二字段：组密码。早期UNIX中，组是有密码的，但是现在的UNIX和Linux中，组已经没有密码了，但是出于兼容的考虑，这个字段仍然被保留下来。现在一般该字段为“x”，表示没有设置密码。

第三字段：GID，即组的数字ID。

第四字段：用户列表，每个用户之间用逗号“，”分割。本字段可以为空。如果字段为空表示用户主要组为GID的用户名，可以通过/etc/passwd查看。

下面是/etc/group一个例子：
root：x：0：root
tux1：x：500：tux2
tux2：x：501：

第一行：组root，GID是0，该组包括root以及GID为0的其他用户。

第二行：组tux1，GID是500，该组包括tux2用户及GID为500的用户。

第三行：组tux2，GID是501，该组包括GID为501的用户。

如果/etc/passwd对应的相关的记录为：
root：x：0：0：root：/root：/bin/bash
tux1：x：500：500：Mr.tux1：/home/tux1：/bin/bash
tux2：x：501：501：：/home/tux2：/bin/bash

那么tux1组中包括的用户有tux1和tux2，tux2组中包括的用户有tux2。所以，如果要查看一个组所包含的用户，可以通过对比/etc/passwd和/etc/group来得到。

GID和UID类似，是一个正整数或0，GID从0开始，GID为0的组为root组。系统会预留一些较靠前的GID给系统虚拟用户之用。每个系统预留的GID都有所不同，比如Fedora预留了500个，我们添加新组时，组是从500开始的。而Slackware是把前100个GID预留，新添加的组是从100开始。查看系统添加组默认的GID范围应该查看/etc/login.defs中的GID＿MIN和GID＿MAX值。

/etc/gshadow是/etc/group的加密文件，比如组管理密码就是存放在这个文件。/ etc/gshadow和/etc/group是互补的两个文件。对于大型服务器，针对很多用户和组，定制一些关系结构比较复杂的权限模型，设置组密码是极有必要的。比如我们不想让一些非组成员永久拥有组的权限和特性，这时我们可以通过密码验证的方式来让某些用户临时拥有一些组特性，这时就要用到组密码。

/etc/gshadow格式如下，每个组独占一行。

groupname：password：admin，admin，...：member，member，...

例如：
tux1：！：tux1：tux2
tux2：oUS/q7NH75RhQ：：tux2

第一字段：组名称，这个例子中，有两个组tux1用tux2。

第二字段：组密码，这个段可以是空的或“！”，如果是空的或有“！”，表示没有密码。tux1组无密码。tux2组有已经加密的口令。

第三字段：组管理员，这个字段也可为空，如果有多个组管理者，用逗号“，”分割。例如，tux1组的管理员为tux1。

第四字段：组成员，如果有多个成员，用逗号“，”分割。另外还要对照一下/etc/ group和/etc/passwd查看是否还有其他用户。例如，tux1组所包含的成员是tux1和tux2。

3.其他配置文件

与用户和组相关的配置还有一些，常见的有/etc/login.defs和/etc/default/useradd等。下面简单介绍一下。

/etc/login.defs文件是当创建用户时的一些规划，比如创建用户时，是否需要主目录，UID和GID的范围。用户的期限等等，这个文件是可以通过root来定义的。

比如Fedora的/etc/logins.defs文件内容。

＃*REQUIRED*

＃Directory where mailboxes reside，＿or＿name of file，relative to the

＃home directory.If you＿do＿define both，MAIL＿DIR takes precedence.

＃QMAIL＿DIR is for Qmail

＃

＃QMAIL＿DIR Maildir

MAIL＿DIR/var/spool/mail注：创建用户时，要在目录/var/spool/mail中创建一个用户mail文件。

＃MAIL＿FILE.mail

＃Password aging controls：

＃

＃PASS＿MAX＿DAYS Maximum number of days a password may be used.

＃PASS＿MIN＿DAYS Minimum number of days allowed between password changes.

＃PASS＿MIN＿LEN Minimum acceptable password length.

＃PASS＿WARN＿AGE Number of days warning given before a password expires.

＃

PASS＿MAX＿DAYS 99999注：用户的密码不过期最多的天数。

PASS＿MIN＿DAYS0注：密码修改之间最小的天数。

PASS＿MIN＿LEN 5注：密码最小长度。

PASS＿WARN＿AGE 7注：口令过期前提前给出警告的天数。

＃

＃Min/max values for automatic uid selection in useradd

＃

UID＿MIN 500注：最小UID为500，也就是说添加用户时，UID是从500开始的。

UID＿MAX 60000注：最大UID为60000。

＃

＃Min/max values for automatic gid selection in groupadd

＃

GID＿MIN 500注：GID是从500开始。

GID＿MAX 60000

＃

＃If defined，this command is run when removing a user.

＃It should remove any at/cron/print jobs etc.owned by

＃the user to be removed（passed as the first argument）.

＃

＃USERDEL＿CMD/usr/sbin/userdel＿local

＃

＃If useradd should create home directories for users by default

＃On RH systems，we do.This option is ORed with them flag on

＃useradd command line.

＃

CREATE＿HOME yes注：是否创用户主目录，要求创建。

再说一下/etc/default/useradd文件，这是通过useradd添加用户时的规则文件。

＃useradd defaults file

GROUP＝100

HOME＝/home注：把用户的主目录建在/home中。

INACTIVE＝—1注：是否启用帐号过期停用权，—1表示不启用。

EXPIRE＝注：帐号终止日期，不设置表示不启用。

SHELL＝/bin/bash注：所用SHELL的类型。

SKEL＝/etc/skel注：默认添加用户的目录默认文件存放位置。也就是说，当我们用adduser添加用户时，用户主目录下的文件，都是从这个目录中复制过去的。

4.相关目录

/etc/skel目录一般是存放用户启动文件的目录，这个目录是由root权限控制，当我们添加用户时，这个目录下的文件自动复制到新添加的用户的主目录下。/etc/skel目录下的文件都是隐藏文件，也就是类似.file格式的。我们可通过修改、添加、删除/ etc/skel目录下的文件，来为用户提供一个统一、标准的、默认的用户环境。

例如，用ls查看/etc/skel目录，显示如下：

［root＠localhost tux1］＃ls-la/etc/skel/

总用量92
drwxr-xr-x 3 root root 4096 8月11 23：32.

drwxr-xr-x 115 root root 12288 10月14 13：44..

-rw-r--r--1 root root 24 5月1100：15.bash＿logout

-rw-r--r--1 root root 191 5月1100：15.bash＿profile

-rw-r--r--1 root root 124 5月1100：15.bashrc

-rw-r--r--1 root root 5619 2005-03-08.canna

-rw-r--r--1 root root 438 5月18 15：23.emacs

-rw-r--r--1 root root 120 5月2305：18.gtkrc
drwxr-xr-x 3 root root 4096 8月11 23：16.kde

-rw-r--r--1 root root 658 2005-01-17.zshrc

/etc/skel目录下的文件，一般是我们用useradd和adduser命令添加用户（user）时，系统自动复制到新添加用户（user）的主目录下。如果我们通过修改/etc/passwd来添加用户时，我们可以自己创建用户的主目录，然后把/etc/skel下的文件复制到用户的主目录下，然后要用chown来改变新用户主目录的属主。

三、用户和组相关的工具或命令

管理用户和组的方法可以使用命令行命令，也可以直接修改相关的配置文件。当然我们也不要忽略一些发行版独有用户管理工具，比如Fedora中有system-config-us-ers工具。这个工具比较简单，单击几下鼠标就能完成。在SuSE中可以使用Yast工具。下面主要介绍一下使用命令行命令来管理用户和组的方法。

1.添加用户

添加用户的命令有useradd和adduser，adduser是useradd的一个符号链接。这两个工具所达到的目的都是一样的，在Fedora发行版中，useradd和adduser用法是一样的。但在slackware发行版本中，adduser和useradd还是有所不同，表现为adduser是以人机交互的提问的方式来添加用户。

使用useradd不加-D时，功能是增加用户。

useradd［-u uid［-o］］［-g group］［-G group，...］

［-d home］［-s shell］［-c comment］［-m［-k template］

［-f inactive］［-e expire］［-p passwd］name

其中常用选项的含义为：

-c comment新帐号password档的说明栏。

-d home＿dir新帐号的主目录。默认值为default＿home内login名称。

-e expire＿date新帐号过期日期。日期的指定格式为MM/DD/YY。

-f inactive＿days新帐号过期几日后永久停用。当值为0时帐号则立刻被停用。而当值为—1时则关闭此功能，默认值为—1。

-g initial＿group新帐号的主要组。可以为组名称或组数字ID。组名须为现有存在的名称。组数字ID也须为现有存在的组。默认的组数字为1。

-G group，［...］新帐号的组集合。每个组使用“，”分隔开来。组名同-g选项的限制。

-m新帐号的用户目录如不存在则自动建立。如使用-k选项skeleton＿dir内的文件将复制至用户目录下。然而在/etc/skel目录下的文件也会复制过去取代。任何在skel-eton＿dir和/etc/skel的目录也相同会在用户目录下一一建立。-k同-m不建立目录以及不复制任何文件为默认值，但是在fedora中-m是隐含选项。

-M不建立用户目录，即使/etc/login.defs系统档设定要建立用户目录。

-n默认值组与用户名称会相同。此选项将取消此默认值。

-r此参数是用来建立系统帐号。系统帐号的UID会比定义在系统配置上/etc/ login.defs.的UID＿MIN来的小。注意useradd此用法所建立的帐号不会建立用户目录，也不会在乎记录在/etc/login.defs.的定义值。如果你想要有用户目录须额外指定-m参数来建立系统帐号。

-s shell用户登入后使用的shell名称。默认为不填写，这样系统会帮你指定默认的shell。

-u uid指定用户的ID值。除非用-o选项，否则必须为唯一的ID值。数字不可为负值。默认为以/etc/login.defs中的UID＿MIN的值为准，0到UID＿MIN的值之间，为系统保留的UID。

useradd不加参数选项时，后面直接跟所添加的用户名时，系统读取添加用户配置文件/etc/login.defs和/etc/default/useradd文件，然后根据其中所定义的规则添加用户。并向/etc/passwd和/etc/group文件添加用户和组记录。当然相关的加密文件/etc/ shadow和/etc/gshadow也同步生成记录。同时发生的还有系统会自动在/etc/add/default中所约定的目录中建用户的主目录，并复制/etc/skel中的文件（包括隐藏文件）到新用户的主目录中。

useradd加-D参数后，就是用来改变配置文件/etc/default/useradd的。语法为：
useradd-D［-g group］［-b base］［-s shell］［-f inactive］［-e expire］

当-D选项出现时，useradd可以显示现在的默认值，或是用设置新值的方式更新默认值。可用选项为：

-b default＿home注：定义用户所属目录的前一个目录。用户名称会附加在default＿home后面用来建立新用户的目录。当然使用-d后则此选项无效。

-e default＿expire＿date注：用户帐号过期日期。

-f default＿inactive注：帐号过期几日后停用。

-g default＿group注：新帐号起始组名或ID。组名须为现有存在的名称。组ID也须为现有存在的组。

-s default＿shell注：用户登入后使用的shell名称。往后新加入的帐号都将使用此shell。

如不指定任何参数，useradd-D显示目前默认的值。通过查看/etc/default/useradd可以了解到，文件的内容应该和上面的输出是一样的。所以如果我们想改变useradd配置文件/etc/default/adduser的内容，也可以用编辑器直接操作。

useradd命令很强大，使用时的选项也比较多，下面我们通过例子来学习它的使用方法。

例一：不加任何参数，直接添加用户：
useradd tux1

在这个例子中，我们添加了tux1用户，我们在查看/home/目录时，会发现系统自建了一个tux1的目录。我们再来查看/etc/passwd文件有关tux1的记录，可以看到这个文件中多了一条记录：
tux1：x：500：500：：/home/tux1：/bin/bash

从这条记录来看，以adduser工具添加tux1用户时，设置用户的UID和GID分别为500，并且把tux1的主目录设置在/home/tux1，所用的shell是bash。在/etc/ shadow、/etc/group和/etc/gshadow文件，也会增加与tux1有关的行。另外，tux1用户的增加与/etc/default/useradd和/etc/login.defs这两个配置文件的规则有关。在/ home/tux1目录下的文件，也是从/etc/skel目录中复制过来的。

如果在fedora中，系统会自动增加一个新组叫做tux1，并指定用户tux1的主要组为组tux1，这种分配策略叫做私有组。如果在SuSE中，系统会自动指定用户tux1的主要组为一个默认的组users，这种分配策略叫做公共组。

例二：添加一个用户tux1，指定tux1的主要组为staff，组集合为team1，team2：
useradd–g staff–G team1，team2 tux1

例三：把添加用户时的默认SHELL/bin/bash改为/bin/tcsh：
useradd-D-s/bin/tcsh

通过useradd-D或直接查看/etc/default/adduser文件，可以看到更新后的配置。

除了useradd和adduser工具以外，我们还能通过修改用户配置文件/etc/passwd和/etc/group的办法来实现。

2.修改用户密码
passwd设置或修改用户密码。passwd作为普通用户和超级权限用户都可以运行，但作为普通用户只能更改自己的用户密码，但前提是没有被root用户锁定。如果root用户运行passwd，可以设置或修改任何用户的密码。

如果新建用户后，要为新用户创建密码，则用passwd用户名，注意要以root用户的权限来创建。这时候不需要输入用户的旧口令。

［root＠localhost～］＃passwd tux1注：更改或创建tux1用户的密码。

Changing password for user tux1.

New UNIX password：注：请输入新密码。

Retype new UNIX password：注：再输入一次。

passwd：all authentication tokens updated successfully.注：成功。

普通用户如果想更改自己的密码，直接运行passwd即可。比如当前操作的用户是tux1。

［tux1＠localhost～passwd

Changing password for user tux1.注：更改tux1用户的密码。

（current）UNIX password：注：请输入当前密码。

New UNIX password：注：请输入新密码。

Retype new UNIX password：注：确认新密码。

passwd：all authentication tokens updated successfully.注：更改成功。

passwd几个比较重要的参数。

-k，--keep-tokens keep non-expired authentication tokens注：保留即将过期的用户在期满后能仍能使用。

-d，--delete delete the password for the named account（root only）注：删除用户密码，仅能以root权限操作。

-l，--lock lock the named account（root only）注：锁住用户无权更改其密码，仅能通过root权限操作。

-u，--unlock unlock the named account（root only）注：解除锁定。

-f，--force force operation注：强制操作。仅root权限才能操作。

-x，--maximum＝DAYS maximum password lifetime（root only）注：两次密码修正的最大天数，后面接数字。仅能root权限操作。

-n，--minimum＝DAYS minimum password lifetime（root only）注：两次密码修改的最小天数，后面接数字，仅能root权限操作。

-w，--warning＝DAYS number of days warning users receives before注：在距多少天提醒用户修改密码。仅能root权限操作。

-i，--inactive＝DAYS number of days after password expiration when an注：在密码过期后多少天，用户被禁掉，仅能以root操作。

-s，--status report password status on the named account（root only）注：查询用户的密码状态，仅能root用户操作。

比如我们让某个用户不能修改密码，可以用-l参数来锁定：

［root＠localhost～］＃passwd-l tux1注：锁定用户tux1不能更改密码。

Locking password for user tux1.

passwd：Success注：锁定成功。

［tux1＠localhost～］＃su tux1注：通过su切换到tux1用户。

［tux1＠localhost～］＄passwd注：tux1来更改密码。

Changing password for user tux1.

Changing password for tux1

（current）UNIX password：注：输入tux1的当前密码。

passwd：Authentication token manipulation error注：失败，不能更改密码。

再来一例：

［root＠localhost～］＃passwd-d tux1注：清除tux1用户密码。

Removing password for user tux1.

passwd：Success注：清除成功。

［root＠localhost～］＃passwd-S tux1注：查询tux1用户密码状态。

Empty password.注：空密码，也就是没有密码。

注意：当我们清除一个用户的密码时，登录时就无需密码。这一点要加以注意。

3.修改用户

用户修改工具usermod。usermod不仅能改用户的shell类型，所归属的组，也能改用户密码的有效期，还能改登录名和用户的主目录等等。

usermod［-u uid［-o］］［-g group］［-G group...］

［-d主目录［-m］］［-s shell］［-c注释］［-l新名称］

［-f失效日］［-e过期日］［-p密码］［-L｜-U］用户名
usermod和useradd的很多选项差不多。两者不同之处在于useradd是添加，usermod是修改。

-c comment

更新用户帐号password档中的注解栏，一般是使用chfn（1）来修改。

-d home＿dir

更新用户新的登入目录。如果给定-m选项，用户旧目录会搬到新的目录去，如旧目录不存在则建个新的目录。

-e expire＿date加上用户帐号过期日期。日期格式为MM/DD/YY.

-f inactive＿days帐号过期几日后永久停用。当值为0时帐号则立刻被停用。而当值为-1时则关闭此功能。默认值为-1。

-g initial＿group用户的主要组。组名须已存在。组ID必须参照既有的组。组ID默认值为1。

-G group，［...］用户的组集合。每个组使用“，”区格开来。组名同-g选项的限制。如果用户现在的组不在此列，则将用户由该组中移除。

-l login＿name变更用户login时的名称为login＿name。其他不变。特别是，用户目录名应该也会跟着更换成新的登入名。

-s shell指定新登入shell。如此栏留白，系统将选用系统默认shell。

-u uid用户ID值。除非用-o选项，否则必须为唯一的ID值。数字不可为负值。默认为最小不得小于/etc/login.defs中定义的UID＿MIN值。0到UID＿MIN值之间是传统上保留给系统帐号使用。用户目录树下所有的文件目录其userID会自动改变。放在用户目录外的文件则要自行手动更动。

usermod不允许你改变正在线上的用户帐号名称。当usermod用来改变userID，必须确认这名user没在电脑上执行任何程序。另外，usermod最好不要用它来改用户的密码，因为它在/etc/shadow中显示的是明口令。修改用户的口令最好用passwd。

举例：

［root＠localhost～］＃usermod-d/opt/Linuxfish-m-l fishLinux-U Linuxfish

注：把Linuxfish用户名改为fishLinux，并且把其主目录转移到/opt/Linuxfish。

［root＠localhost～］＃ls-la/opt/Linuxfish/注：查看用户fishLinux的主目录下的文件及属主。

总用量48
drwxr-xr-x 3 fishLinux Linuxfish 4096 11月5 16：46.

drwxrwxrwx 29 root root 4096 11月5 16：48..

-rw-r--r--1 fishLinux Linuxfish 24 11月5 16：46.bash＿logout

-rw-r--r--1 fishLinux Linuxfish 191 11月5 16：46.bash＿profile

-rw-r--r--1 fishLinux Linuxfish 124 11月5 16：46.bashrc

-rw-r--r--1 fishLinux Linuxfish 5619 11月5 16：46.canna

-rw-r--r--1 fishLinux Linuxfish 438 11月5 16：46.emacs

-rw-r--r--1 fishLinux Linuxfish 120 11月5 16：46.gtkrc
drwxr-xr-x 3 fishLinux Linuxfish 4096 11月5 16：46.kde

-rw-r--r--1 fishLinux Linuxfish0 11月5 16：46 mydoc.txt

-rw-r--r--1 fishLinux Linuxfish 658 11月5 16：46.zshrc

［root＠localhost～］＃more/etc/passwd｜grep fishLinux注：查看有关fishLinux的记录。

fishLinux：x：512：512：：/opt/Linuxfish：/bin/bash

通过上面的例子，我们发现文件的组还没有变，如果您想改变为fishLinux组，如果想通过usermod来修改，就要先添加fishLinux组。然后用usermod-g来修改，也可以用chown-R fishLinux：fishLinux/opt/finshLinux来修改。

另外一些修改用户信息的命令是chage、chfn和chage等。

chage可以用来修改用户相关的日期信息，它的语法格式：
chage［-l］［-m最小天数］［-M最大天数］［-W警告］［-I失效日］［-E过期日］［-d最后日］用户
chfn这个工具主要是用来改用户的全名，办公室地址，电话之类的。用法如下：
chfn［-f full-name］［-o office］［-p office-phone］［-h home-phone］［-u］［-v］［username］
chsh改变用户的shell类型。

chsh［-s shell］［--list-shells］［--help］［--version］［username］

如果不允许某个用户登录时，可以把用户的shell改到/sbin/nologin。系统中一些虚拟用户大多是不能登录系统的，这对于系统安全来说极为重要。

还有一个图形界面的修改工具userinfo。userinfo系统普通用户都能调用，但都是修改当前操作用户的。

前面已经多次说过用户配置文件的重要性了，其实无论用什么命令改，都是改与用户相关的配置文件，所以也可以直接修改与用户相关的配置文件的规则。

4.查询用户信息

想查询用户的信息，除了直接查看用户和组配置文件的办法外，还可以使用id和finger，id和finger是两个各有侧重的工具，id工具更侧重用户、用户所归属的用户组、UID和GID的查看。而finger侧重用户资讯的查询，比如用户名（登录名）、电话、主目录、登录shell类型、真实姓名、空闲时间等等。

id命令用法：
id选项用户名

比如：我想查询tux1和tux2用户的UID、GID以及归属用户组的情况：

＃id tux1
uid＝500（tux1）gid＝500（tux1）groups＝500（tux1）

注：tux1的UID是500，默认用户组是tux1，默认用户组的GID是500，归属于tux1用户组。

＃id tux2
uid＝505（tux2）gid＝502（tux2）groups＝502（tux2），0（root），500（tux1）

注：tux2的UID是505，默认用户组是tux2，默认用户组的GID是502，归属于tux2（GID为502）、root（GID为0），tux1（GID为500）。

finger的用法：
finger选项用户名1用户名2...

在finger后面加上用户名，可以看到用户的详细信息，可以一次查看多个用户，用空格分开。例如，我们查询用户tux1的信息。

＃finger tux1

Login：tux1注：用户名（也是登录名）Name：TUX 1（用户名全称）。

Directory：/home/tux1注：主目录Shell：/bin/bash注：所用shell类型。

On since Tue Oct 18 13∶53（CST）on tty2 10 minutes 55 seconds idle注：空闲时间。

On since Tue Oct 18 13∶57（CST）on pts/0 from：0.0

No mail.

No Plan.

使用who或w命令可以查看当前在线用户，如果finger不加任何参数和用户，也会显示出当前在线用户。例如，运行w命令的结果如下：

14：02：42 up 1：03，3 users，load average：0.04，0.15，0.18

USER TTY FROM LOGIN＠IDLE JCPU PCPU WHAT
tux2 tty1-13：39 22：510.01s0.01s-bash
tux1 tty2-13：53 8：48 11.62s0.00s/bin/sh/usr/X1
tux1 pts/0：0.0 13：570.00s0.14s 1.08s gnome-terminal

使用whoami和who am i可以查看当前用户的身份。区别在于如果用户在登录后使用su命令切换过用户身份，那么whoami显示的是切换后的当前身份，而who am i永远显示该用户登录时使用的身份。另外，who am i显示的信息也要详细一点。

用groups可以通过用户来查询所归属的组。比如查询tux1和tux2所归属的组：

［root＠localhost～］＃groups tux1 tux2
tux1：tux1
tux2：tux2 root tux1

注：这是通过groups同时查看了用户tux1和tux2所归属的组。

5.删除用户

删除用户的命令是userdel。userdel的语法格式：
userdel［-r］名称
userdel很简单，只有一个参数可选-r。如果加参数-r，表示在删除用户的同时，一并把用户的主目录及本地邮件存储的目录或文件也一同删除。比如我们现在有两个用户tux1和tux2，其主目录都位于/home目录中，现在我们来删除这两个用户。

＃userdel tux1注：删除用户tux1，但不删除其主目录及文件。

＃userdel-r tux2注：删除用户tux2，其主目录及文件一并删除。

不要轻易用-r参数，因为这样会删除用户的同时删除用户所有的文件和目录。如果用户目录下有重要的文件，在删除前请备份。

其实也有最简单的办法，但这种办法有点不安全，也就是直接在/etc/passwd中删除您想要删除用户的记录。但最好不要这样做，/etc/passwd是极为重要的文件，可能您一不小心会操作失误。

6.其他与用户相关的命令
pwcov同步用户从/etc/passwd到/etc/shadow。

pwck校验用户配置文件/etc/passwd和/etc/shadow文件内容是否合法或完整。

pwunconv是pwcov的逆向操作，是从/etc/shadow和/etc/passwd创建/etc/passwd，然后在删除/etc/shadow文件。

su用户切换工具。格式为su［-］［user］。如果省略user，则尝试切换为root身份。su中需要输入要切换到的用户的密码，如果输入正确，就会临时切换成新用户的身份工作，直到运行exit退回到原用户shell中。使用“-”可以在切换用户时同时切换工作环境变量。

sudo通过另一个用户来执行命令（execute a command as another user），su是用来切换用户，然后通过切换到的用户来完成相应的任务，但sudo能后面直接执行命令，比如sudo不需要root密码就可以执行root赋予的只有root才能执行相应的命令，但得通过visudo来编辑/etc/sudoers来实现。visudo是编辑/etc/sudoers的命令。也可以不用这个命令，直接用vi来编辑/etc/sudoers的效果是一样的。sudoedit和sudo功能差不多。

7.添加组

添加语法的命令为groupadd，其格式为：
groupadd［-g gid［-o］］［-r］［-f］group
groupadd可指定组名称来建立新的组帐号，需要时可从系统中取得新组值。groupadd有下列选项可用。

-g后接GID值，除非使用-o参数，不然该值必须是唯一，不可相同，数值不可为负，预设值以/etc/login.defs为准。

-r此参数是用来建立系统帐号的GID，会比定义在系统档文件上/etc/login.defs的GID＿MIN来的小。注意useradd此用法所建立的帐号不会建立使用者目录，也不会记录在/etc/login.defs.的定义值。如果你想要有使用者目录须额外指定-m参数来建立系统帐号，它会自动帮你选定一个小于的GID＿MIN的值，不需要再加上-g参数。

-f强制增加。新增一个已经存在的组帐号，系统会出现错误提示然后结束groupadd。如果是这样的情况，不会新增这个组，使用-f强制增加组。也可同时加上-g选项，当你加上一个GID，此时GID就不用是唯一值，可不加-o参数。

例如：添加GID为500的组team1。

＃groupadd-g500 team1

8.删除组
groupdel是用来删除组的。语法格式：groupdel组。例如：groupdel team1，就是删除组team1。

9.其他与组相关的命令

修改组信息：groupmod。

显示用户所属的组：groups。

检查组配置文件的合法性：grpck。

同步组信息：grpconv。通过/etc/group和/etc/gshadow的文件内容来同步或创建/etc/gshadow，如果/etc/gshadow不存在则创建。

grpunconv。通过/etc/group和/etc/gshadow文件内容来同步或创建/etc/group，然后删除gshadow文件。

设置或修改组管理员：gpasswd。

9.2　软件包管理

在Windows中，安装和删除软件是一件很方便的事情，一般通过控制面板中的“添加/删除软件”就可以做到了，但是，在Linux里，这就不是件轻松的事儿。在传统的UNIX中，安装和删除软件往往需要通过命令来完成。在Linux中，安装和删除软件也分为源码包软件、RPM包软件和DEB包软件等几种情况，在国内使用DEB的人较少，下面针对源码包和RPM包软件分别讨论一下。

一、源码包软件的安装与管理

1.什么是源码包

顾名思义，源码包就是源代码的可见的软件包，基于Linux和BSD系统的软件最常见。在国内源代码可见的软件几乎绝迹。大多开源软件都是国外出品。在国内较为出名的开源软件有fcitx、lumaqq及scim等。

但软件的源代码可见并不等于软件是开源的，我们还要以软件的许可为准。比如有些软件是源码可见的，但它约定用户只能按它约定的内容来修改，比如vbb论坛程序。所以一个软件是否是开源软件，得具备两个条件。一是源代码可见。二是要有宽松的许可证书，比如GPL证书等。

在GNU Linux或BSD社区中，开发人员在放出软件的二进制软件包的同时，也会为我们提供源代码软件包。

2.源代码有何用

一个软件如果有源码，是任何人都能看到它是怎么开发而来的，就像一个瓶子，比如瓶子制作的模具是什么，需要什么材料，具体的用途以及瓶子的详细说明书等等。软件的开放源码就是类似，开发者在给我们软件的同时，也会告诉我们软件是怎么开发出来的。只要我们的水平足够的高，所有的代码都在那里，我们就可以修改和定制软件，以适合我们的需要。如果Windows开放源代码，并以GPL发布，一样是有人能造出来N多的Windows发行版。遗憾的是Windows并不是开源系统。所以软件的源代码的用处无非是以下两点。

（1）软件根据用户的需要加以定制。

（2）二次开发。注：要根据软件的许可证书约定为准，开发者许可二次开发才行。

3.怎样安装以源码包打包的软件

源代码一般以file.tar.gz，file.tar.bz2或file.src.rpm打包。file.tar.gz和file.tar.bz2格式的解包命令如下。

［root＠localhost tux1］＃tar jxvf file.tar.bz2

［root＠localhost tux1］＃tar zxvf file.tar.gz

编译安装源码包的步骤：

（1）解开软件包查看帮助文档

我们解开一个包后，进入解压包，一般都能发现README（或readme）、IN-STALL（或install）或doc（或DOC）目录。看名字就知道个差不多。

比如我们下载一个比较新的fcitx的软件包，比如是fcitx-3.2-050827.tar.bz2。我们在解开这个软件包时会发现如下的文件。

［root＠localhost fcitx］＃tar jxvf fcitx-3.2-050827.tar.bz2

［root＠localhost fcitx］＃cd fcitx

［root＠localhost fcitx］＃ls
aclocal.m4 config.guess configure debian INSTALL Makefile.in src xpm

AUTHORS config.h.in configure.in depcomp install-sh missing THANKS
autogen.sh config.rpath COPYING doc lib mkinstalldirs TODO

ChangeLog config.sub data fcitx.spec.in Makefile.am README tools

所以我们就可以看fcitx的INSTALL和doc目录的安装文档了，里面都告诉我们如何安装。

有时安装文档也会在开发者的主页上有详细的说明，及常见问题的处理等。比如LumaQQ。

（2）编译安装软件的条件

首先我们在Linux系统中至少得把开发工具安装上，比如gcc、perl、python、glibc、gtk、make、automake等开发工具或基础包。还要安装一些相应的开发包，一般是文件名包括dev的，比如kernel-devel。还有一些开发库，比如以lib开头的。如果您在编译软件时，有时提示缺少什么东西之类的，大多数是这些开发工具和开发库等。从光盘中找出安装就是了。有时光盘没有提供，请用google搜索相应的软件包，有时可能也会用到源码包编译安装所依赖的包。

有时本来系统中已经安装了所依赖的包，但系统提示找不到应该怎么办？这时需要我们设置一下PKG＿CONFIG＿PATH的环境变量就行了。

＃export PKG＿CONFIG＿PATH＝/usr/lib/pkgconfig

或

＃export PKG＿CONFIG＿PATH＝/usr/local/lib/pkgconfig

然后我们再来运行编译的./configure；make；make install尝试着来吧。

以Java开发工具开发的程序，要用到jre或者jdk。jdk已经包括jre了，所以如果我们只是要求有一个Java程序运行的环境，只需要安装jdk就行了。安装好jdk，配置一下Java的环境变量就可以用了。如果是图形界面的程序，点点鼠标就OK了。

用perl开发的程序，是需要perl环境的，所以必须得把perl的包安装上，python也同理。

（3）编译安装软件的方法

大多以tar.gz和tar.bz2打包的软件，是通过./configure；make；make install来安装的。有的软件是直接make；make install。

我们可以通过./configure--help来查看配置软件的功能。大多软件是提供./configure配置软件的功能的。少数的也没有，如果没有的就不用./configure，直接make；make install就行了。

./configure比较重要的一个参数是--prefix，用--prefix参数，我们可以指定软件安装目录。当我们不需要这个软件时，直接删除软件的目录就行了。

比如我们可以指定fcitx安装到/opt/fcitx目录中。

［root＠localhost fcitx］＃./configure--prefix＝/opt/fcitx

如果我们不需要fcitx时，可以直接删除/opt/fcitx目录。

所以我们举这个例子中，fcitx如果定制安装到/opt/fcitx目录中，完整的安装方法应该是：

［root＠localhost fcitx］＃tar jxvf fcitx-3.2-050827.tar.bz2

［root＠localhost fcitx］＃cd fcitx

［root＠localhost fcitx］＃./configure--prefix＝/opt/fcitx

［root＠localhost fcitx］＃make

［root＠localhost fcitx］＃make install

调用fcitx，应该是

［tux1＠localhost～］＃/opt/fcitx/bin/fcitx

如果您想要让fcitx只要执行fcitx，就能调用，请配置环境变量，或者在/usr/bin中做一个fcitx的链接。

［root＠localhost tux1］＃ln-s/opt/fcitx/bin/fcitx/usr/bin/fcitx

一般的情况下都有说，但大多软件没有提供源码包的卸载方法。我们可以找到软件的安装点删除。主要看你把它安装在哪了。

所以您的PATH可以设置成这样的。

export PATH＝“.：/bin：/usr/bin：/usr/local/bin：/usr/sbin：/usr/X11R6/ bin：/sbin：/opt/fcitx/bin”

当然这只是举个例子，fcitx可以进入桌面自动运行的。

再举一个例子，比如我想安装mlterm。并指定安装目录为/opt/mlterm。http:// mlterm.sourceforge.net

＃./configure--prefix＝/opt/mlterm

＃make

＃make install

把源码包安装的软件都指定安装在/opt目录中，这样就知道软件安装在哪里了。也方便卸载。

4.安装其他类型软件

（1）基于perl和python的程序的安装

一般情况下，用＃perl file.pl安装。比如VMware的Linux版本的安装。

［root＠localhost vmware-distrib］＃perl vmware-install.pl

基于python开发，也得用python file.py来安装。

一般软件包都有README和INSTALL或者DOC文档，看文档安装。

（2）有些安装程序是脚本型的调用

要用＃sh文件名，其中的sh可以是系统中的一种shell，如bash等。

比如NVdia驱动的安装就是这样的。

［tux1＠localhost～］＃sh NFORCE-Linux-x86-1.0-0306-pkg1.run

当然也能通过chmod 755 NFORCE-Linux-x86-1.0-0306-pkg1.run，然后./ NFORCE-Linux-x86-1.0-0306-pkg1.run来安装。

也有一些是以file.bin文件来安装的。

［tux1＠localhost～］＃chmod 755 file.bin

［tux1＠localhost～］＃./file.bin

二、RPM软件包管理介绍

RPM开始是Red Hat Package Manager的缩写，本意是Red Hat软件包管理器，顾名思义是Red Hat贡献出来的软件包管理器。在Fedora、Red Hat、Mandriva、SuSE、YellowDog等主流发行版本，以及在这些版本基础上二次开发出来的发行版都采用RPM，正是由于RPM被广泛的使用，为了不给大家一个错觉，好像RPM只能用在Red Hat中，现在RPM已经修改为RPM Package Manager的缩写，又是一个递归定义。

RPM包里面都包含什么？里面包含可执行的二进制程序，这个程序和Windows的软件包中的.exe文件类似是可执行的。RPM包中还包括程序运行时所需要的文件，这也和Windows的软件包类似，Windows程序的运行，除了.exe文件以外，也有其他的文件。

一个RPM包中的应用程序，有时除了自身所带的附加文件保证其正常以外，还需要其他特定版本文件，这就是软件包的依赖关系。依赖关系并不是Linux特有的，Windows操作系统中也是同样存在的。比如我们在Windows系统中运行3D游戏，在安装的时候，它可能会提示，要安装Direct 9。Linux和Windows原理是差不多的。

1.RPM包管理的用途

（1）可以安装、删除、升级和管理软件。当然也支持在线安装和升级软件。

（2）通过RPM包管理能知道软件包包含哪些文件，也能知道系统中的某个文件属于哪个软件包。

（3）可以查询系统中的软件包是否安装及其版本。

（4）作为开发者可以把自己的程序打包为RPM包发布。

（5）软件包签名GPG和MD5的导入、验证和签名发布。

（6）依赖性的检查，查看是否有软件包由于不兼容而扰乱了系统。

2.RPM的使用权限

RPM软件的安装、删除、更新只有root权限才能使用。对于查询功能任何用户都可以操作。如果普通用户拥有安装目录的权限，也可以进行安装。

三、RPM的简单用法

我们除了软件包管理器以外，还能通过rpm命令来安装。是不是所有的软件包都能通过rpm命令来安装呢？不是的，以.rpm后缀结尾的文件才行。有时我们在一些网站上找到file.rpm，都要用rpm来安装。

1.初始化rpm数据库

通过rpm命令查询一个rpm包是否安装了，也是要用rpm数据库来完成的。所以我们要经常用下面的两个命令来初始化rpm数据库。

［root＠localhost tux1］＃rpm--initdb

［root＠localhost tux1］＃rpm--rebuilddb注：这个要花好长时间。

注：这两个参数是极为有用，有时rpm系统出了问题，不能安装和查询，大多是这里出了问题。

2.RPM软件包管理的查询功能

命令格式
rpm｛-q｜--query｝［select-options］［query-options］

RPM强大的查询功能是极为重要的功能之一。举几个常用的例子，更为详细的具体的，请参考man rpm。

1）对系统中已安装软件的查询。

a）查询系统已安装的软件。

语法：rpm-q软件名

举例：

［root＠localhost tux1］＃rpm-q gaim
gaim-1.3.0-1.fc9

-q就是--query，中文意思是“问”，此命令表示的是，是不是系统安装了gaim。如果已安装会有信息输出。如果没有安装，会输出gaim没有安装的信息。

查看系统中所有已经安装的包，要加-a参数。

［root＠localhost RPMS］＃rpm-qa

如果分页查看，再加一个管道｜和more命令。

［root＠localhost RPMS］＃rpm-qa｜more

在所有已经安装的软件包中查找某个软件，比如说gaim。可以用grep抽取出来。

［root＠localhost RPMS］＃rpm-qa｜grep gaim

上面这条的功能和rpm-q gaim输出的结果是一样的。

b）查询一个已经安装的文件属于哪个软件包。

语法rpm-qf文件名

注：文件名所在的绝对路径要指出

举例：

［root＠localhost RPMS］＃rpm-qf/usr/lib/libacl.la
libacl-devel-2.2.23-8
c）查询已安装软件包都安装到何处。

语法：rpm-ql软件名或rpm rpmquery-ql软件名

举例：

［root＠localhost RPMS］＃rpm-ql lynx

［root＠localhost RPMS］＃rpmquery-ql lynx
d）查询一个已安装软件包的信息。

语法格式：rpm-qi软件名

举例：

［root＠localhost RPMS］＃rpm-qi lynx
e）查看一下已安装软件的配置文件。

语法格式：rpm-qc软件名

举例：

［root＠localhost RPMS］＃rpm-qc lynx
f）查看一个已经安装软件的文档安装位置。

语法格式：rpm-qd软件名

举例：

［root＠localhost RPMS］＃rpm-qd lynx
g）查看一下已安装软件所依赖的软件包及文件。

语法格式：rpm-qR软件名

举例：

［root＠localhost tux1］＃rpm-qR rpm-python

查询已安装软件的总结：对于一个软件包已经安装，我们可以把一系列的参数组合起来用。比如rpm-qil。

举例：

［root＠localhost RPMS］＃rpm-qil lynx

2）对于未安装的软件包的查看。

查看的前提是您有一个.rpm的文件，也就是说对既有软件file.rpm的查看。

a）查看一个软件包的用途、版本等信息。

语法：rpm-qpi file.rpm

举例：

［root＠localhost RPMS］＃rpm-qpi lynx-2.8.5-23.i386.rpm
b）查看一件软件包所包含的文件。

语法：rpm-qpl file.rpm

举例：

［root＠localhost RPMS］＃rpm-qpl lynx-2.8.5-23.i386.rpm
c）查看软件包的文档所在的位置。

语法：rpm-qpd file.rpm

举例：

［root＠localhost RPMS］＃rpm-qpd lynx-2.8.5-23.i386.rpm
d）查看一个软件包的配置文件。

语法：rpm-qpc file.rpm

举例：

［root＠localhost RPMS］＃rpm-qpc lynx-2.8.5-23.i386.rpm
e）查看一个软件包的依赖关系

语法：rpm-qpR file.rpm

举例：

［root＠localhost archives］＃rpm-qpR yumex＿0.42-3.0.fc9＿noarch.rpm

/bin/bash

/usr/bin/python
config（yumex）＝0.42-3.0.fc9
pygtk2
pygtk2-libglade
rpmlib（CompressedFileNames）＜＝3.0.4-1
rpmlib（PayloadFilesHavePrefix）＜＝4.0-1
usermode
yum＞＝2.3.2

3.软件包的安装、升级、删除

1）安装和升级一个rpm包。

［root＠localhost tux1］＃rpm-ivh file.rpm注：这个是用来安装一个新的rpm包。

［root＠localhost tux1］＃rpm-Uvh file.rpm注：这是用来升级一个rpm包。

如果有依赖关系的，请解决依赖关系，其实软件包管理器能很好的解决依赖关系，请看前面的软件包管理器的介绍。如果您在软件包管理器中也找不到依赖关系的包。那只能通过编译它所依赖的包来解决依赖关系，或者强制安装。

语法结构：

［root＠localhost tux1］＃rpm-ivh file.rpm--nodeps--force

［root＠localhost tux1］＃rpm-Uvh file.rpm--nodeps--force

更多的参数，请查看man rpm

举例应用：

［root＠localhost RPMS］＃rpm-ivh lynx-2.8.5-23.i386.rpm

Preparing...＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃［100%］

1：lynx＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃［100%］

［root＠localhost RPMS］＃rpm-ivh--replacepkgs lynx-2.8.5-23.i386.rpm

Preparing...＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃［100%］

1：lynx＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃［100%］

注：--replacepkgs参数是将已安装的软件再安装一次。有时没有太大的必要。

测试安装参数--test，用来检查依赖关系。并不是真正的安装。

［root＠localhost RPMS］＃rpm-ivh--test gaim-1.3.0-1.fc9.i386.rpm

Preparing...＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃［100%］

由新版本降级为旧版本，要加--oldpackage参数。

［root＠localhost RPMS］＃rpm-qa gaim
gaim-1.5.0-1.fc9

［root＠localhost RPMS］＃rpm-Uvh--oldpackage gaim-1.3.0-1.fc9.i386.rpm

Preparing...＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃［100%］

1：gaim＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃［100%］

［root＠localhost RPMS］＃rpm-qa gaim
gaim-1.3.0-1.fc9

为软件包指定安装目录：要加-relocate参数。下面的举例是把gaim-1.3.0-1.fc9.i386.rpm指定安装在/opt/gaim目录中。

［root＠localhost RPMS］＃rpm-ivh--relocate/＝/opt/gaim gaim-1.3.0-1.fc9.i386.rpm

Preparing...＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃［100%］

1：gaim＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃［100%］

［root＠localhost RPMS］＃ls/opt/
gaim

为软件包指定安装目录：要加-relocate参数。下面的举例是把lynx-2.8.5-23.i386.rpm指定安装在/opt/lynx目录中。

［root＠localhost RPMS］＃rpm-ivh--relocate/＝/opt/lynx--badreloc lynx-2.8.5-23.i386.rpm

Preparing...＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃［100%］

1：lynx＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃［100%］

我们安装在指定目录中的程序如何调用呢？一般执进程序，都放在安装目录的bin或者sbin目录中。看下面的例子。如果有错误输出，就做相应的链接，用ln-s。

［root＠localhost RPMS］＃/opt/lynx/usr/bin/lynx

Configuration file/etc/lynx.cfg is not available.

［root＠localhost RPMS］＃ln-s/opt/lynx/etc/lynx.cfg/etc/lynx.cfg

［root＠localhost RPMS］＃/opt/lynx/usr/bin/lynx www.tux2.org

2）删除一个rpm包。

首先您要学会查询rpm包。请看前面的说明。

［root＠localhost tux1］＃rpm-e软件包名

举例：我想移除lynx包，完整的操作应该是：

［root＠localhost RPMS］＃rpm-e lynx

如果有依赖关系，您也可以用--nodeps忽略依赖的检查来删除。但尽可能不要这么做，最好用软件包管理器systerm-config-packages来删除或者添加软件。

［root＠localhost tux1］＃rpm-e lynx--nodeps

4.导入签名

［root＠localhost RPMS］＃rpm--import签名文件

举例：

［root＠localhost fc90］＃rpm--import RPM-GPG-KEY

［root＠localhost fc90］＃rpm--import RPM-GPG-KEY-fedora

关于RPM的签名功能，详情请参见man rpm。

5.RPM管理包管理器支持网络安装和查询

比如我们想通过Fedora Core 9.0的一个镜像查询、安装软件包。地址：
http://mirrors.kernel.org/fedora/core/4/i386/os/Fedora/RPMS/举例：

命令格式：
rpm参数rpm包文件的http或者ftp的地址

＃rpm-qpi
http://mirrors.kernel.org/fedora/core/4/i386/os/Fedora/RPMS/gaim-1.3.0-1.fc9.i386.rpm

＃rpm-ivh
http://mirrors.kernel.org/fedora/core/4/i386/os/Fedora/RPMS/gaim-1.3.0-1.fc9.i386.rpm

6.对已安装软件包查询的一点补充

［root＠localhost RPMS］＃updatedb

［root＠localhost RPMS］＃locate软件名或文件名

通过updatedb，我们可以用locate来查询一些软件安装到哪里了。系统初次安装时要执行updatedb，每隔一段时间也要执行一次。以保持已安装软件库最新。updat-edb是slocate软件包所有。如果您没有这个命令，就得安装slocate。

举例：

［root＠localhost RPMS］＃locate gaim

7.从rpm软件包抽取文件

命令格式：rpm2cpio file.rpm｜cpio-div

举例：

［root＠localhost RPMS］＃rpm2cpio gaim-1.3.0-1.fc9.i386.rpm｜cpio-div

抽取出来的文件就在当前操作目录中的usr和etc中。

其实这样抽到文件不如指定安装目录来安装软件来的方便。也一样可以抽出文件。

为软件包指定安装目录：要加-relocate参数。下面的举例是把gaim-1.3.0-1.fc9.i386.rpm指定安装在/opt/gaim目录中。

［root＠localhost RPMS］＃rpm-ivh--relocate/＝/opt/gaim gaim-1.3.0-1.fc9.i386.rpm

Preparing...＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃［100%］

1：gaim＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃＃［100%］

［root＠localhost RPMS］＃ls/opt/
gaim

这样也能一目了然。gaim的所有文件都是安装在/opt/gaim中，我们只是把gaim目录备份一下，然后卸掉gaim。这样其实也算提取文件的一点用法。

8.RPM的配置文件

RPM包管理的配置文件是rpmrc，我们可以在自己的系统中找到。比如Fedora Core 9.0中的rpmrc文件位于usr/lib/rpmr/rpmrc和/usr/lib/rpm/redhat/rpmrc下。

［root＠localhost RPMS］＃locate rpmrc

/usr/lib/rpm/rpmrc

/usr/lib/rpm/redhat/rpmrc

我们可以通过rpm--showrc查看。

9.3　系统引导

一、多重操作系统引导装载程序

系统启动引导装载程序，是在计算机启动后运行的第一个程序，它是用来负责加载、传输控制到操作系统的内核，一旦把内核加载，系统引导装载程序的任务就算完成退出，系统引导的其他部分，比如系统的初始化及启动过程则完全由内核来控制完成。

在X86架构的机器中，Linux、BSD或其他UNIX类的操作系统中GRUB、LILO是大家最为常用的，应该说是主流。

Windows也有类似的工具NTLOADER。比如我们在机器中安装了Windows 98后，我们再安装一个Windows XP，在机器启动的会有一个菜单让我们选择进入是进入Windows 98还是进入Windows XP。NTLOADER就是一个多系统启动引导装载程序，NTLOADER同样也能引导Linux，只是极为麻烦罢了。

在Powerpc架构的机器中，如果安装了Linux的Powerpc版本，大多是用yaboot多重引导装载程序，比如Apple机目前用的是IBM Powerpc处理器，所以在如果想在Apple机上，安装Macos和Linux Powerpc版本，大多是用yaboot来引导多个操作系统。

因为目前X86架构的机器仍是主流，所以目前GRUB和LILO仍然是我们最常用的多重操作系统引导装载程序。

二、GRUB介绍

GNU GRUB是一个多重操作系统启动管理器。GNU GRUB是由GRUB（GRand Unified Bootloader）派生而来的。GRUB最初由Erich Stefan Boleyn设计和应用。基于在X86架构的CPU而开发操作系统，系统引导装载程序不仅仅有GRUB，而且也有LILO，但对于多重系统引导装载程序，你只能选择其一而用。不能两个同时使用。目前这两个多重系统引导装载程序是大家最常用的，也是主流Linux发行版而采用的。主流发行版Fedora、Red Hat、Centos等基于RPM包的系统，在最新版本中都默认GRUB引导。Slackware目前仍采用LILO。而Debian发行版目前最新的版本也是采用GRUB。从目前看来，GRUB有逐渐取代LILO之势，GRUB 2.0正在开发之中。所以我们有理由用GRUB。

三、安装GRUB

1、安装GRUB软件

对于Linux的GRUB，几乎所有的Linux主流发行版都有打包，如果您安装了Linux，并且在开机后出现GRUB字样的，证明您已经安装了GRUB。而无需再次安装。如果您的Linux系统没有安装GRUB，或者采用的是LILO，而您想用GRUB，可以用系统安装盘自带GRUB的软件包来安装，或者到相关发行版本的软件仓库下载后安装。

GRUB的Linux版本目前在各大发行版中都有打包。比如Fedora/Red Hat/Centos/Mandrive/Mandriva/SuSE等以RPM包管理机制的系统，可以通过如下的命令来安装。

［root＠localhost～］＃rpm-ivh grub*.rpm

如果是Slackware，您可以用如下的办法来安装。

［root＠localhost～］＃installpkg grub*.tgz

其他的发行版本请用其自己特色的软件包管理工具来安装。

当然您也可以通过源码包，在任何Linux的发行版上安装。

［root＠localhost～］＃tar zxvf grub*.tar.gz

［root＠localhost～］＃cd grub-xxx

［root＠localhost～］＃./configure；make；make install

确认您是否成功安装了GRUB，您可以测试是否有如下两个命令：

［root＠localhost～］＃grub

［root＠localhost～］＃grub-install

2.在GRUB配置过程中的安装

GRUB配置过程中使用grub-install安装。grub-install是把我们前面已经安装的软件包中的一些文件复制到/boot/grub中。对于新安装GRUB软件包后，也是一个必经的过程。我们前面所说的是GRUB软件包的安装，而现在我们说的是GRUB配置的过程中的安装。虽然在英文中都是install，但表达的意思是不一样的。

如果硬盘为/dev/hda，可以使用下面的命令来安装GRUB。如果不能确定硬盘的名字，可以使用fdisk-l来确认。

［root＠localhost～］＃grub-install/dev/hda

Installation finished.No error reported.

This is the contents of the device map/boot/grub/device.map.

Check if this is correct or not.If any of the lines is incorrect，
fix it and re-run the scriptgrub-install.

（fd0）/dev/fd0

（hd0）/dev/hda

值得注意的是如果您有一个/boot分区，应该用如下的办法来安装。

［root＠localhost～］＃grub-install--root-directory＝/boot/dev/hda

3.设定GRUB的/boot分区并写入MBR

在Linux中，GRUB软件包的安装，及在配置过程中安装grub到/boot中还是不够的，还要把GRUB写入MBR才行。有时我们重新安装了Windows，Windows会把MBR重写，这样GRUB就消失了。如果您出现这样的情况，就要进行这个过程。

以root身份运行grub，会出现grub＞提示符，这是grub命令行模式，如果能在开机中出现提示符，没有引导不起来的系统，除非您的系统破坏得极为严重。如果仅仅是GRUB被破坏了，GRUB命令行是能让操作系统引导起来的。

首先，要找到/boot/grub/stage1，在grub＞后面输入：
grub＞find/boot/grub/stage1

（hd0，6）

注意，（hd0，6）是/boot所在的分区。不要误解为是Linux的/所在的分区，这是值得注意的。

grub＞root（hd0，6）注：这是/boot所在的分区。

grub＞setup（hd0）注：把GRUB写到MBR上。

四、硬盘及分区的两种表示方法

上面的例子中出现了类似root（hd0，6）的表示方法。在正式了解如何配置GRUB之前，我们先要了解硬盘及分区的表示方法。在Linux中的表示方法前面已经有介绍，但是在GRUB中，表示的方法略有不同，下面要专门讨论一下。

1.对于IDE接口的硬盘的两种表示方法

IDE接口中的整块硬盘在Linux系统中表示为/dev/hd［a-z］，比如/dev/hda，/dev/hdb…以此类推，有时/dev/hdc可能表示的是CDROM。另一种表示方法是hd［0-n］，其中n是一个正整数，比如hd0，hd1，hd2…hdn。

如果机器中只有一块硬盘，无论我们通过fdisk-l列出的是/dev/hda还是/dev/ hdb，都是hd0；如果机器中存在两个或两个以上的硬盘，第一个硬盘/dev/hda，另一种方法表示为hd0，第二个硬盘/dev/hdb，另一种表法是hd1。

大家可能对hd0，hd1这种表示方法并不陌生，现在新的机器，在BIOS中，在启动盘设置那块，硬盘是有hd0，hd1之类的，这就是硬盘表示方法的一种。

2.IDE接口硬盘分区的两种表示方法

硬盘的分区也有两种表示方法，一种是/dev/hd［a-z］X，这个a-z表示a、b、c…z，X是一个从1开始的正整数。比如/dev/hda1，/dev/hda2…/dev/hda6，/dev/hda7…值得注意的是/dev/hd［a-z］X，如果X的值是1～4，表示硬盘的主分区（包含扩展分区）。逻辑分区是从5开始的，比如/dev/hda5肯定是逻辑分区了。用fdisk-l就能列出一个硬盘的分区表。

硬盘分区的第二种表示方法（hd［0-n］，y）。我们前面已经说过了整块硬盘也有两种表示方法，一种方法是/dev/hd［a-z］的，另一种方法是hd［0-n］。y的值是/dev/hd［a-z］X中的X-1。

例如，系统中只有一块硬盘，在Linux中，这块硬盘的名字为/dev/hda，它的第1个主分区叫做/dev/hda1，第1个逻辑分区叫做/dev/hda5，对应的第二种表示方法中的名字是（hd0，0）和（hd0，4）。

3.关于SATA和SCSI接口的硬盘的两种表示方法

理解方法和IDE接口的硬盘相同，只是把hd换成sd。如果您的机器中比如有一个硬盘是/dev/hda，也有一个硬盘是/dev/sda，那/dev/sda的硬盘应该是sd0。具体每个分区用（sd［0-n］，y）的表示方法和IDE接口中的算法相同，比如/dev/sda1就是（sd0，0）。

4.usb及1394接口的存储设备和软驱设备
usb存储设备目前在内核中有两种驱动方法，一种是模拟SCSI硬盘，通过fdisk-l出现的是/dev/sd［0-n］。如果是模拟SCSI设备的方法来驱动，那usb存储设备在Linux的另一种表示方法和前面所说的SCSI和SATA相同。

但目前新版本的内核中，想抛弃模拟SCSI，我们通过fdisk列出系统存在的存储设置时会出现/dev/uba类似设备名的。但目前这个驱动并不成熟，比如大数据量表现不稳定。其实USB接口的存储设备，在Linux表现还是比较差。

1394接口存储设备，在Linux中也是模拟SCSI，我们通过fdisk-l后，出现的也是/dev/sd［0-n］，另一种表示方法（sd［a-z］，y）的理解请参照前面所说的。1394接口的存储设备在Linux表现极好。

软驱在Linux中，是/dev/fd0设备，这是一般情况，另一种表示为fd0。

5.关于存储设备的不同的表示方法的应用

/dev/hd［a-z］表示方法主要应用：

（1）用于mount加载文件系统（分区）之用。

（2）用于GRUB中指定Linux的根分区的位置。

在GRUB系统引导装载程序，用命令行启动一个操作系统时，要通过指定Linux根/所在的硬盘分区/dev/hd［a-z］X。比如root＝/dev/hda7。

hd［0-n］表示方法的应用：

这种一般是应用在GRUB的/boot所位于的硬盘分区的指定上。在GRUB的命令行和GRUB的配置文件menu.lst中都要应用到。

比如我们要把GRUB写到硬盘的MBR上，在GRUB的命令行模式中要通过root（hd［0-n］，y）来指定。这里的root（hd［0-n］，y），在GRUB中就是/boot所位于的分区。不要搞错了，有时/boot和Linux的根/并不是处于同一个分区的，就看您安装Linux时怎么安装的了。而我们前面所说的root＝/dev/hd［a-z］X来指定的是Linux根/所位于的分区。虽然有时/boot和/同处一个分区，但两种表示方法在GRUB中各有用途。

五、GRUB的配置文件

对于GRUB来说，如果没有配置menu.lst，无论是Linux版本的GRUB，还是WINGRUB，都会有命令行可用，通过命令行是一样能把操作系统引导起来的。有些用户总以为menu.lst配置错了，或者在机器启动后出现grub＞命令行模式就要重新安装系统，其实根本没有这个必要。只要学会GRUB的命令行的用法，根本没有必要重装系统。menu.lst位于/boot/grub目录中。

1.menu.lst的内容

以下以Fedora 9.0中的/boot/grub/menu.lst为例，看一下里面的内容。

default＝0
timeout＝5
splashimage＝（hd0，6）/boot/grub/splash.xpm.gz
hiddenmenu
title Fedora Core（2.6.11-1.1369＿FC9）

root（hd0，6）

kernel/boot/vmlinuz-2.6.11-1.1369＿FC9 ro root＝LABEL＝/

initrd/boot/initrd-2.6.11-1.1369＿FC9.img
title Windows

rootnoverify（hd0，0）

chainloader＋1

说明：
default＝0：默认启动哪个系统，从0开始。每个操作系统的启动的定义都从title开始的，第一个title在GRUB的启动菜单上显示为0，第二个启动为1，以此类推。

timeout＝5：表示在开机后，GRUB画面出现几秒后开始以默认启动。如果在启动时，移动上下键，则解除这一规则。

splashimage＝（hd0，6）/boot/grub/splash.xpm.gz：GRUB的背景画面，这个是可选项，可以用＃号注释掉。

hiddenmenu：隐藏GRUB的启动菜单，这项也是可选的。

一般的情况下对Linux操作系统的启动，一般要包括四行：title行、root行、ker-nel行、initrd行。

title XXXXX：title后面加一个空格，title是小写的，后面可以自己定义。比如FC9，自己定义一个名字就行。

root（hd［0-n］，y），在本例中，我们看到的是root（hd0，6），root（hd［0-n］，y）表示的是/boot所在的分区。有时我们安装Linux的时候，大多是不设置/boot的，这时/ boot和/在同一个分区。这个root（hd［0-n］，y）很重要，因为/boot目录中虽然有grub目录，最为重要的是还有kernel和initrd文件，这是Linux能启动起来最为重要的东西。

kernel一行，是指定内核及Linux的/分区所在位置。

比如例子中是：
kernel/boot/vmlinuz-2.6.11-1.1369＿FC9 ro root＝LABEL＝/

在这里以kernel起始，指定Linux的内核的文件所处的绝对路径。因为内核是处在/boot目录中的，如果/boot是独立的一个分区，则需要把boot省略。如果/boot是独立的分区，这行要写成：
kernel/vmlinuz-2.6.11-1.1369＿FC9 ro root＝LABEL＝/

因为/boot所处的分区已经在title下一行root（hd［0-n］，y）中指定了，所以就无须再指明内核处在哪个分区了。另外Linux系统的硬盘分区的加载配置文件在/etc/fstab，原理是通过mount/dev/hd［a-z］X/boot来进行的。您可以对照着来理解。

ro表示只读。root＝LABEL＝/来表示Linux的根所处的分区。LABEL＝/这是硬盘分区格式化为相应文件系统后所加的标签。如果您不了解什么是标签，也可以直接以/dev/hd［a-z］X或者/dev/sd［a-z］X来表示。就看您的Linux的根分区是哪个分区了。比如我的是在/dev/hda7，那这里就可以写成root＝/dev/hda7。

如果查看系统运行所加载的分区，请用df-lh来查看，就能明白/boot是不是独立的分区，或者查看/etc/fstab也能知道。

［root＠localhost～］＃df-lh

Filesystem容量已用可用已用%加载点

/dev/hda711G 9.2G 1.2G 90%/

/dev/shm236M 0 236M 0% /dev/shm

在这个例子中，我们可以发现/boot并没有出现。只有/dev/hda7，这表示/boot并不是独立的一个分区。所有的东西都包含在/中。于是我们在/boot中查看内核版本。

［root＠localhost～］＃ls/boot/vmlinuz*

/boot/vmlinuz-2.6.11-1.1369＿FC9注：看到内核vmlinuz所处的目录。

于是我们就可以这样kernel这行了。

kernel/boot/vmlinuz-2.6.11-1.1369＿FC9 ro root＝/dev/hda7
initrd命令行的写法：

如果是独立一个分区，initrd一行要把/boot中省略。如果/boot不是处于一个分区，而是和Linux的/分区处于同一分区，不应该省略。

比如我们在前面用的例子。现在拿到这里，我们应该首先查看/boot中的initrd的文件名到底是什么。

［root＠localhost～］＃ls/boot/initrd*

/boot/initrd-2.6.11-1.1369＿FC9.img

如果是通过df-lh或查看/etc/fstab也行，得知/boot是独立的分区。这时initrd应该写成：
initrd/initrd-2.6.11-1.1369＿FC9.img

如果/boot不是独处一个分区，而是和/同处在一个分区，则要写成：
initrd/boot/initrd-2.6.11-1.1369＿FC9.img

2.写menu.lst过程的小结

（1）用fdisk-l、df-lh、more/etc/fstab来确认分区情况。

我们用fdisk-l、df-lh、more/etc/fstab来确认/boot所在的分区，及Linux的根分区所在位置。

比如我们确认/boot和Linux的/分区同处一个分区。

［root＠localhost～］＃df-lh

Filesystem容量已用可用已用%加载点

/dev/hda711G 9.2G 1.2G 90%/

/dev/shm236M0 236M0%/dev/shm

然后我们/etc/fstab中，查看/所在的分区或分区标签是什么。

［root＠localhost～］＃more/etc/fstab

＃This file is edited by fstab-sync-seeman fstab-syncfor details

LABEL＝//ext3 defaults 1 1

/dev/devpts/dev/pts devpts gid＝5，mode＝620 0 0

/dev/shm/dev/shm tmpfs defaults 0 0

/dev/proc/proc proc defaults 0 0

/dev/sys/sys sysfs defaults 0 0

LABEL＝SWAP-hda1 swap swap defaults 0 0

/dev/hdc/media/cdrecorder auto pamconsole，exec，noauto，managed 0 0

经过上面的df-lh和more/etc/fstab的对照中得知，/boot并不是独立一个分区，而是和/在同一个分区。这个Linux系统安装在/dev/hda7上，文件系统（此分区）的标签为LABEL＝/，/boot也是处于/dev/hda7，/dev/hda7也可以说是root（hd0，6）。

（2）查看内核vmlinuz的和initrd文件名的全称。

［root＠localhost～］＃ls-lh/boot/vmlinuz*

-rw-r--r--1 root root1.6M 2005-06-03/boot/vmlinuz-2.6.11-1.1369＿FC9

［root＠localhost～］＃ls-lh/boot/initrd*

-rw-r--r--1 root root1.1M 11月26 22：30/boot/initrd-2.6.11-1.1369＿FC9.img

（3）开始写menu.lst。

我们根据上面所提到的，可以写成如下的样子：
default＝0
timeout＝5
title FC9

root（hd0，6）

kernel/boot/vmlinuz-2.6.11-1.1369＿FC9 ro root＝LABEL＝/

initrd/boot/initrd-2.6.11-1.1369＿FC9.img

也可以写成：
default＝0
timeout＝5
title FC9

root（hd0，6）

kernel/boot/vmlinuz-2.6.11-1.1369＿FC9 ro root＝/dev/hda7

initrd/boot/initrd-2.6.11-1.1369＿FC9.img

上面两个不同之处在于一指定Linux的根/所在的分区时，一个是用了文件系统的标签，另一个没有用标签。

3.menu.lst的精简型写法

本写法主要是把指定/boot所位于的分区直接写入kernel指令行。这样就省略了通过root（hd［0-n］，y）来指定/boot所位于的分区。

第一种情况：/boot和Linux的/分区在同一个分区。

default＝0
timeout＝5
title FC9

kernel（hd0，6）/boot/vmlinuz-2.6.11-1.1369＿FC9 ro root＝/dev/hda7

initrd（hd0，6）/boot/initrd-2.6.11-1.1369＿FC9.img
kernel这行这样理解kernel（boot所在的分区）/boot/内核文件件全称ro root＝Linux根所位于的分区或标签
initrd这行可以这样理解initrd（/boot所在的分区）/boot/内核文件名全称

第二种情况：/boot独立一个分区，和Linux的根分区不是同一个分区。

比如我们查看到df-lh得到的是

［root＠localhost～］＃df-lh

Filesystem容量已用可用已用%加载点

/dev/hda6200M 120M 80M 60% /boot

/dev/hda711G 9.2G 1.2G 90% /

我们再进一步查看/etc/fstab得知

LABEL＝//ext3 defaults 1 1

LABEL＝/boot/boot ext3 defaults 1 2

所以我们应该写成如下：
title FC9

kernel（hd0，5）/vmlinuz-2.6.11-1.1369＿FC9 ro root＝LABEL＝/

initrd（hd0，5）/initrd-2.6.11-1.1369＿FC9.img

因为Linux的根分区是/dev/hda7，通过/etc/fstab和df-h的内容得知标签为LA-BEL＝/的分区就是/dev/hda7，所以有：
title FC9

kernel（hd0，5）/vmlinuz-2.6.11-1.1369＿FC9 ro root＝/dev/hda7

initrd（hd0，5）/initrd-2.6.11-1.1369＿FC9.img

六、通过GRUB的命令行引导Linux

在开机的时候，不用GRUB的菜单，通过GRUB的命令也是一样能把操作系统引导起来。因为menu.lst的内容就是GRUB的一个一个的指令集合。

1.为什么需要学习GRUB的命令行

当我们把GRUB的menu.lst写错的时候，或者丢掉了menu.lst的时，比如在开机的时候，GRUB会出现grub＞类似的命令提示符，这时需要我们用命令行启动系统。这时可以不用定义GRUB的菜单，直接用命令行来启动系统。

2.用命令行来引导Linux操作系统的步骤

通过命令行来引导操作系统的流程，也没有什么难的。无非是把指令手工输入到grub＞提示符的后面。在这个过程中，tab键的命令补齐功能就显得很重要了。如果您不知道有哪些命令，可以输入help。

（1）进入GRUB的命令行模式grub＞。

如果开机时，GRUB出现的是grub＞，说明您没有/boot/grub/menu.lst，您需要自己写一个GRUB的菜单，让我们来选择进入哪个系统。如果有GRUB的菜单，您可以按Ctrl＋C组合键进入GRUB的命令行模式，会出现grub＞提示符：
grub＞

（2）获取帮助GRUB的help。

只要您在grub＞提示符的后面输入help就能得到GRUB所有的命令提示。

grub＞help
blocklist FILE boot
cat FILE chainloader［--force］FILE
clear colorNORMAL［HIGHLIGHT］
configfile FILE device DRIVE DEVICE
displayapm displaymem
find FILENAME geometry DRIVE［CYLINDER HEAD SECTOR［
halt［--no-apm］help［--all］［PATTERN...］
hide PARTITION initrd FILE［ARG...］
kernel［--no-mem-option］［--type＝TYPE］makeactive
map TO＿DRIVE FROM＿DRIVE md5crypt
module FILE［ARG...］modulenounzip FILE［ARG...］
pager［FLAG］partnew PART TYPE START LEN
parttype PART TYPE quit
reboot root［DEVICE［HDBIAS］］
rootnoverify［DEVICE［HDBIAS］］serial［--unit＝UNIT］［--port＝PORT］［--
setkey［TO＿KEY FROM＿KEY］setup［--prefix＝DIR］［--stage2＝STAGE2＿
terminal［--dumb］［--no-echo］［--no-ed terminfo［--name＝NAME--cursor-address
testvbe MODE unhide PARTITION
uppermem KBYTES vbeprobe［MODE］

如果需要得到某个指令的帮助，就在help后面空一格，然后输入指令，比如：
grub＞help kernel

（3）cat的用法。

cat指令是用来查看文件内容的，有时我们不知道Linux的/boot分区，以及/分区所在的位置，要查看/etc/fstab的内容来得知，这时，我们就要用到cat（hd［0-n］，y）/ etc/fstab来获得这些内容。注意要学会用tab键命令补齐的功能。

grub＞cat（按tab键会出来hd0或hd1之类的。）
grub＞cat（hd0，注：输入hd0，然后再按tab键。会出来分区之类的。）
grub＞cat（hd0，6）

Possible partitions are：

Partition num：0，Filesystem type unknown，partition type 0x7

Partition num：4，Filesystem type is fat，partition type 0xb

Partition num：5，Filesystem type is reiserfs，partition type 0x83

Partition num：6，Filesystem type is ext2fs，partition type 0x83

Partition num：7，Filesystem type unknown，partition type 0x83

Partition num：8，Filesystem type is reiserfs，partition type 0x83

Partition num：9，Filesystem type unknown，partition type 0x82
grub＞cat（hd0，6）/etc/fstab注：比如我想查看一下（hd0，6）/etc/fstab的内容就这样输入。

LABEL＝//ext3 defaults 1 1

/dev/devpts/dev/pts devpts gid＝5，mode＝620 0 0

/dev/shm/dev/shm tmpfs defaults 0 0

/dev/proc/proc proc defaults 0 0

/dev/sys/sys sysfs defaults 0 0

LABEL＝SWAP-hda1 swap swap defaults 0 0

/dev/hdc/media/cdrecorder auto pamconsole，exec，noauto，
managed 0 0

如果不知道Linux安装在了哪个分区，可以根据文件系统来判断，一个一个的尝试。只要能cat出/etc/fstab就能为以后引导带来方便。

查看/etc/fstab中的内容，主要是Linux的/分区及/boot是否是独立的分区。如果没有/boot类似的行，证明/boot和Linux的/处于同一个硬盘分区。比如上面的例子中LABEL＝/这行是极为重要的。说明Linux系统就安在标签为LABEL＝/的分区中。

如果您的Linux系统/boot和/没有位于同一个分区，可能cat（hd［a-n］，y）查到的是类似下面的。

LABEL＝//ext3 defaults 1 1

LABEL＝/boot/boot ext3 defaults 1 2

（4）root（hd［0-n］，y）指令来指定/boot所在的分区。

其实这个root（hd［0，n］，y）是可以省略的，如果省略了，我们要在kerenl命令中指定。我们前面已经说过（hd［0-n］，y）硬盘分区的表示方法的用途。主要是用来指定/boot所在的分区。

比如我们确认/boot和（hd0，6），所以就可以这样来输入root（hd0，6）grub＞root（hd0，6）

如果发现不对，可以重新设置。

（5）kernel指令，用来指定Linux的内核，及/所在的分区。

kernel这个指令可能初学者有点怕，不知道内核在哪个分区，及内核文件名的全称是什么。不要忘记tab键的命令补齐的应用。

如果我们已经通过root（hd［0-n］，y）指定了/boot所在的分区，语法有两个。

如果/boot和Linux的/位于同一个分区，应该是下面的一种格式：
kernel/boot/vmlinuz在这里按tab键来补齐，就看到内核全称了ro root＝/dev/ hd［a-z］X

如果/boot有自己独立的分区，应该是：
kernel/vmlinuz在这里按tab键来补齐，就看到内核全称了ro root＝/dev/hd［a-z］X

在这里root＝/dev/hd［a-z］X是Linux的/根所位于的分区，如果不知道是哪个分区，就用tab出来的计算，一个一个的尝试。或用cat（hd［0-n］，y）/etc/fstab中得到Linux的/所在的分区或分区的标签。

grub＞kernel/boot/在这里按tab键。这样就列出/boot中的文件了。

Possible files are：grub initrd-2.6.11-1.1369＿FC9.img System.map-2.6.11-1.1369

＿FC9config-2.6.11-1.1369＿FC9vmlinuz-2.6.11-1.1369＿FC9grubBAK memtest86＋—1.55

.1 xen-syms xen.gz
grub＞kernel/boot/vmlinuz-2.6.11-1.1369＿FC9 ro root＝LABEL＝/

［Linux-bzImage，setup＝0x1e00，size＝0x18e473］

注解：root＝LABEL＝/是Linux的/所在的分区的文件系统的标签。如果您知道Linux的/在哪个具体的分区，用root＝/dev/hd［a-z］X来指定也行。比如下面的一行也是可以的。

grub＞kernel/boot/vmlinuz-2.6.11-1.1369＿FC9 ro root＝/dev/hda7

也可以把/boot所在的分区的指定root（hd［0-n］，y）这行省掉，直接在kernel中指定/boot所在的分区。所以就有下面的语法：

如果是/boot和Linux的根同处一个分区。

kernel（hd［0-n］，y）/boot/vmlinuz ro root＝/dev/hd［a-z］X比如：
grub＞kernel

如果是/boot和Linux所在的根不在一个分区。则是：kernel（hd［0-n］，y）/vmlinuz ro root＝/dev/hd［a-z］X grub＞kernel（hd0，6）/boot/vmlinuz-2.6.11-1.1369＿FC9 ro root＝/dev/hda7

［Linux-bzImage，setup＝0x1e00，size＝0x18e473］

或下面的输入，以cat出/etc/fstab内容为准。

grub＞kernel（hd0，6）/boot/vmlinuz-2.6.11-1.1369＿FC9 ro root＝LABEL＝/

［Linux-bzImage，setup＝0x1e00，size＝0x18e473］

（6）initrd命令行来指定initrd文件。grub＞initrd/boot/initrd在这里按tab键来补齐。grub＞initrd/boot/initrd-2.6.11-1.1369＿FC9.img

［Linux-initrd＠0x2e1000，0x10e685 bytes］

如果/boot是独立的一个分区，应该是如下样子的语法。比如下面的：grub＞initrd/initrd在这里按tab键来补齐。grub＞initrd/initrd-2.6.11-1.1369＿FC9.img

［Linux-initrd＠0x2e1000，0x10e685 bytes］

（7）boot引导系统。

grub＞boot

前面的几个步骤都弄好，就进入引导，尝试一下就知道了。

（8）引导Linux系统实例全程回放。

实例：/boot和Linux的/处于同一个硬盘分区。

grub＞cat（hd0，6）/etc/fstab

＃This file is edited by fstab-sync-see man fstab-sync for details

LABEL＝//ext3 defaults 1 1

/dev/devpts/dev/pts devpts gid＝5，mode＝62000

/dev/shm/dev/shm tmpfs defaults00

/dev/proc/proc proc defaults00

/dev/sys/sys sysfs defaults00

LABEL＝SWAP-hda1 swap swap defaults00

/dev/hdc/media/cdrecorder auto pamconsole，exec，noauto，managed00
grub＞root（hd0，6）

Filesystem type is ext2fs，partition type0x83
grub＞kernel/boot/在这里按tab键补齐，全列出/boot所有的文件。

Possible files are：grub initrd-2.6.11-1.1369＿FC9.img System.map-2.6.11-1.1369＿FC9 config-2.6.11-1.1369＿FC9 vmlinuz-2.6.11-1.1369＿FC9
memtest86＋-1.55.1 xen-syms xen.gz
grub＞kernel/boot/vmlinuz-2.6.11-1.1369＿FC9 ro root＝/dev/hda7注：输入

［Linux-bzImage，setup＝0x1e00，size＝0x18e473］
grub＞initrd/boot/在这里按tab键补齐

Possible files are：grub initrd-2.6.11-1.1369＿FC9.img System.map-2.6.11-1.1369＿FC9 config-2.6.11-1.1369＿FC9 vmlinuz-2.6.11-1.1369＿FC9
memtest86＋-1.55.1 xen-syms xen.gz
grub＞initrd/boot/initrd-2.6.11-1.1369＿FC9.img注：输入intrd文件名的全名。

［Linux-initrd＠0x2e1000，0x10e685 bytes］grub＞boot

我们指定Linux的根时，可以用cat出来的fstab的内容中Linux的/分区文件系统标签来替代。也就是kernel那行中root＝/dev/hd［a-z］X。

grub＞cat（hd0，6）/etc/fstab

＃This file is edited by fstab-sync-seeman fstab-syncfor details

LABEL＝//ext3 defaults 1 1

/dev/devpts/dev/pts devpts gid＝5，mode＝620 0 0

/dev/shm/dev/shm tmpfs defaults 0 0

/dev/proc/proc proc defaults 0 0

/dev/sys/sys sysfs defaults 0 0

LABEL＝SWAP-hda1 swap swap defaults 0 0

/dev/hdc/media/cdrecorder auto pamconsole，exec，noauto，managed 0 0
grub＞root（hd0，6）

Filesystem type is ext2fs，partition type 0x83
grub＞kernel/boot/在这里按tab键补齐，全列出/boot所有的文件。

Possible files are：grub initrd-2.6.11-1.1369＿FC9.img System.map-2.6.11-1.1369＿FC9 config-2.6.11-1.1369＿FC9 vmlinuz-2.6.11-1.1369＿FC9
memtest86＋-1.55.1 xen-syms xen.gz
grub＞kernel/boot/vmlinuz-2.6.11-1.1369＿FC9 ro root＝LABEL＝/

［Linux-bzImage，setup＝0x1e00，size＝0x18e473］
grub＞initrd/boot/在这里按tab键补齐。

Possible files are：grub initrd-2.6.11-1.1369＿FC9.img System.map-2.6.11-1.1369＿FC9 config-2.6.11-1.1369＿FC9 vmlinuz-2.6.11-1.1369＿FC9 grubBAK
memtest86＋-1.55.1 xen-syms xen.gz
grub＞initrd/boot/initrd-2.6.11-1.1369＿FC9.img注：输入intrd文件名的全名。

［Linux-initrd＠0x2e1000，0x10e685 bytes］grub＞boot

如果/boot和Linux的根分区不在同一个分区，要把kernel和initrd指令中的/ boot去掉，也就是/vmlinuzMMMMMM或/initrdNNNN。

也可以不用root（hd［0-n］来指定/boot所在分区，要在kernel和initrd中指定。比如Linux的/根所位于的分区和/boot所位于的分区都是（hd0，6），并且我们cat出来的/etc/fstab是Linux的/根分区的文件系统的标签为LABEL＝/，引导操作系统的例子如下。

grub＞kernel（hd0，6）/boot/vmlinuz-2.6.11-1.1369＿FC9 ro root＝LABEL＝/
grub＞initrd（hd0，6）/boot/initrd-2.6.11-1.1369＿FC9.img
grub＞boot

或
grub＞kernel（hd0，6）/boot/vmlinuz-2.6.11-1.1369＿FC9 ro root＝/dev/hda7
grub＞initrd（hd0，6）/boot/initrd-2.6.11-1.1369＿FC9.img
grub＞boot

如果/boot位于/dev/hda6，也就是（hd0，5），Linux的根/位于分区/dev/hda7，并且我们cat出来的/etc/fstab中/分区的标签为LABEL＝/。下面的两种方法都可以引导：
grub＞kernel（hd0，5）/vmlinuz-2.6.11-1.1369＿FC9 ro root＝LABEL＝/
grub＞initrd（hd0，5）/initrd-2.6.11-1.1369＿FC9.img
grub＞boot

或
grub＞kernel（hd0，5）/vmlinuz-2.6.11-1.1369＿FC9 ro root＝/dev/hda7
grub＞initrd（hd0，5）/initrd-2.6.11-1.1369＿FC9.img
grub＞boot

七、通过GRUB引导Windows

1.通过编辑menu.lst来引导Windows系统

如果您的Windows所处于的分区在（hd0，0），可以在menu.lst加如下的一段就能引导起来了。

title Windows

rootnoverify（hd0，0）

chainloader＋1

如果您的机器有两块硬盘，而Windows位于第二个硬盘的第一个分区，也就是（hd1，0），您可以用grub的map来指令来操作把两块硬盘的序列对调，这样就不用在BIOS中设置了。在menu.lst中加如下的内容，比如下面的：
title Windows

map（hd0）（hd1）

map（hd1）（hd0）

rootnoverify（hd0，0）

chainloader＋1
makeactive

如果Windows的分区不位于硬盘的第一个分区，比如在（hd0，2），就要把rootnoverify这行的（hd0，0）改为（hd0，2）：
title Windows

rootnoverify（hd0，2）

chainloader＋1
makeactive

如果Windows在第二个硬盘的某个分区，比如说是位于（hd1，2），则要用到map指令。

title Windows

map（hd0）（hd1）

map（hd1）（hd0）

rootnoverify（hd1，2）

chainloader＋1
makeactive

如果有多个Windows系统，怎么才能引导出来呢？应该用hide和unhide指令操作。比如我们安装了两个Windows，一个是位于（hd0，0）的Windows 98，另一个是位于（hd0，1）的WindowsXP。这时我们就要用到hide指令了。

title Win98

unhide（hd0，0）

hide（hd0，1）

rootnoverify（hd0，0）

chainloader＋1
makeactive
title WinXP

unhide（hd0，1）

hide（hd0，0）

rootnoverify（hd0，1）

chainloader＋1
makeactive

2.通过GRUB指令来引导Windows

其实我们会写menu.lst了，在menu.lst中的除了title外，都是一条条指令。如果我们启动Windows，只是输入指令就行了。

比如Windows的分区在（hd0，0），我们在开机后，按Ctrl＋C组合键，进入GRUB的命令模式。就可以用下面的：
grub＞rootnoverify（hd0，0）
grub＞chainloader＋1
grub＞boot

八、GRUB丢失或损坏的应对策略

如果GRUB是Linux版本才会出这样的问题，WINGRUB可以不写在MBR上，所以不会出现这样的问题。WINGRUB用起来比较简单。menu.lst和命令行的用法和Linux版本的GRUB是一样的。

1.由于重新安装Windows或其他未知原因而导致GRUB的丢失

您可以通过系统安装盘、livecd进入修复模式。

首先，您根据前面所说grub-install来安装GRUB到/boot所在的分区，要仔细看文档，/boot是不是处于一个独立的分区是重要的，执行的命令也不同。

其次，要执行grub，然后通过root（hd［0-n］，y）来指定/boot所位于的分区，然后接着执行setup（hd0），这样就写入MBR了，比如下面的例子：
grub＞root（hd0，6）
grub＞setup（hd0）
grub＞quit

重新引导就会再次出现MBR的菜单或命令行的提示符了。

2.如果出现GRUB提示符，而不出现GRUB的菜单，如何引导系统

存在的问题可能是/boot/grub/menu.lst丢失，要自己写一个才行。您可以用命令行来启动系统，进入系统后写menu.lst就行了。另外，写好后还要建一个grub.conf的链接，如下：

［root＠localhost～］＃cd/boot/grub

［root＠localhost grub］＃ln-s menu.lst grub. conf

9.4　内核重编译与模块

一、为什么要编译内核

标准发行版中的内核可能不能满足需求，比如硬件不被内核支持。标准发行版中所支持的硬件驱动很多，造成内核过大，但我们并不需要。有时我们为了实现某些功能，比如对iptables的防火墙有些需要内核支持。还有实现一些硬件的支持等，这时我们需要重编内核。

还有，Linux开发核心人员会定期在网上发布内核新版本，我们可能要升级到新内核版本来体验或开发。当然，还有些人是因为好玩而重编译内核。

编译内核的步骤：

1.安装内核源代码；

2.创建配置文件.config；

3.删除旧的临时文件；

4.检查相关包依赖信息；

5.创建内核镜像文件；

6.创建并安装模块；

7.配置lilo或grub；

8.重新启动计算机。

二、内核源码版本的选择

如果发行版本提供内核源码，最好还是用发行版本提供的。比如Fedora 9.0提供了很多版本的内核源码。我们安装好后，它自带的配置文件大多能满足我们的需要，对于新手来说，根据自带的内核的配置文件.config，我们也能学到一点如何配置内核。也没有什么难的，熟能生巧罢了。当然，如果从kernel.org下载最新稳定版本的内核也是可以的。

三、内核源码安装或解压

对于Fedora Core 9.0来说，内核源码是放在/usr/src/kernels目录中。如果通过在线升级内核，也是放在这个目录中。如果您的系统中的/usr/src/kernels/中没有内容，说明您没有安装内核的源码包kernel-devel软件包。

如果您用Fedora Core 9.0，建议您在保留老内核的基础上，在线下载或者从kernel.org下载最新版本的内核kerenl-devel和对应版本的kernel，有时可能新的kerenl已经解决了您所面临的问题，这时就没有必要编译内核了。

如果您是通过在线安装的内核源码包，比如通过apt＋synaptic或者yum安装的，内核源码会被放到/usr/src/kernel下的目录中，您要进入相对应的目录进行编译。

如果您是下载kernel和kernel-devel的rpm包，可以通过rpm来安装。

［root＠localhost tux1］＃rpm-ivh kernel*.rpm

如果您是从kernel.org下载的类似Linux-2.6.13.tar.bz2或者Linux-2.6.13.tar.gz的，您要把下载下来的文件移到/usr/src目录中解压。然后进入解压的目录中进行配置和编译。

［root＠localhost tux1］＃mv Linux-2.6.13.tar.bz2/usr/src

［root＠localhost tux1］＃cd/usr/src/

［root＠localhost src］＃tar jxvf Linux-2.6.12.3.tar.bz2

提示：本文以Linux-2.6.12.3为例，其实通过发行版的升级版的kernel-devel和从kernel.org下载下来的差不多，大同小异。不同的是通过在线升级的rpm格式的内核源码包，有配置文件.config可以参考。安装到的目的地是/usr/src/kernel。

四、内核的配置

1.进入目录执行make mrproper，对于从kernel.org下载而来的tar.bz格式的源码包：

［root＠localhost src］＃cd Linux-2.6.12.3/

［root＠localhost Linux-2.6.12.3］＃make mrproper

［root＠localhost Linux-2.6.12.3］＃make menuconfig

对于Fedora Core 9.0，如果您是通过在线安装的kernel和kernel-devel新版本的包，比如是2.6.12-1.1398＿FC9-i686，你可以直进入/usr/src/kernel/相应的目录中直接执行make menuconfig。利用发行版本提供的.config来配置，这样方便点。这也是为什么要用发行版本提供的内核源码升级包的原因。

2.简要的配置内核。

内核配置有两种方法，一种是直接置入内核（标记为*）。另一种是编成模块（标记为M）。两种方法各有优点。直接编入内核的，比如设备的启动，不再需要加载模块的这一过程了。而编译成模块，则需要加载设备的内核支持的模块。但直接把所有的东西都编入内核也是不可行的，内核体积会变大，系统负载也会过重。我们编内核时最好把极为重要的编入内核。其他的如果您不明白的，最好用默认。

（1）执行make menuconfig后，移动键盘上下左右键，按Enter键进入一个目录。把指针移动到Exit就退出当前目录到上级目录。

（2）针对自己机器存在的问题进行修改，比如大内存的支持。

选择自己机器的CPU。

移动键盘到Processor type and features---＞，然后按Enter键进入。

找到Processor family（Pentium-Pro）---＞按Enter键进入。

进入后我们发现有好多CPU的型号可选。一般的情况下要根据/proc/cpuinfo的信息来选，比如我们的是Celeron（P4）一代的，应该选如下的，当然默认的486也是可以正常运行的，既然我们重编一次内核，就得选中对应型号的，也许性能有所提高呢。

Processor family（Pentium-4/Celeron（P4-based）/Pentium-4 M/Xeon）

对大内存支持。如果内存是1G或者1G以上，但小于4G的，就要选4G支持。如果超过4G的，要选64G的支持。

High Memory Support（4GB）---＞

（X）4GB

（　）64GB

还有比如声卡等硬件，需要我们一步一步地查看。如果有不明之处，就要按shift＋？组合键来查看说明。一般的情况下，2.6.x的内核会根据机器的情况自动配出一个文件，只需要我们来查看一下，把重要的地方改改就行了。

再举个例子：比如现在所用的声卡是intel ac97的，首先要知道自己的声卡的芯片组，我们要通过lspci-v来查看。

［root＠localhost tux1］＃lspci-v

只查看声卡的，应该用如下的方法：

［root＠localhost tux1］＃lspci-v｜grep audio

00：1f.5 Multimedia audio controller：Intel Corp.82801DB（ICH4）AC97 Audio Controller（rev03）

通过上面的输出，我们知道这台机器用的是intel AC97声卡。所以我们要特别注意AC97的配置。

找到Device Drivers---＞Sound---＞

＜M＞Sound card support声卡的支持，这个是一定要选中的吧。

＜M＞Advanced Linux Sound Architecture对声卡支持的ALSA驱动的支持。

下面有OSS驱动，只是一部分。如果想用更全的OSS的驱动，可以去买。其他的就看如下的选吧。

＜M＞Sequencer support

＜M＞Sequencer dummy client

＜M＞OSS Mixer API

＜M＞OSS PCM（digital audio）API［*］OSS Sequencer API

＜M＞RTC Timer support［*］Verbose printk

［］Debug

大多是默认的就好，如果您不知道是做什么用的，或者怎么用。

再往下：

Generic devices---＞进入里面

＜M＞Dummy（/dev/null）soundcard

＜M＞Virtual MIDI soundcard

＜M＞MOTU MidiTimePiece AV multiportMIDI

＜M＞UART16550 serial MIDI driver

＜M＞Generic MPU-401 UART driver

ISA devices---＞如果您用ISA声卡就在这里面选。

PCI devices---＞如果您用PCI声卡，就在这里面选，集成声卡也在这里。

USB devices---＞这是USB声卡内核支持选项。我有一个这样的声卡，但没有试过。

PCMCIA devices---＞这是PCMCIA声卡的选项，我还没有看过这样的声卡呢。如果您有，就在这里面动动手吧。

因为我用的是Intel集成的声卡，所以要在PCI中选择，我们在其中可以看到有两个与INTEL有关。

＜M＞Intel/SiS/nVidia/AMD/ALi AC97 Controller这个才是Intel AC97声卡的。

＜ ＞Intel/SiS/nVidia/AMD MC97 Modem（EXPERIMENTAL）这个是机器集成的INTEL猫的蜂鸣器的。

因为我发现如果把猫的蜂鸣器的驱动也选上，可能造成两个冲突。所以只能选上面的那个。

我们再回到Open Sound System---＞中看看，与我用的声卡是不是有关的？

＜M＞Open Sound System（DEPRECATED）

＜M＞Intel ICH（i8xx）audio support

＜M＞OSS sound modules

＜M＞Loopback MIDI device support

＜M＞Microsoft Sound System support

我们也可以看到Open Sound System中也有好多的声卡驱动，大家根据前面的lspci-v来选择吧。

（3）对于操作系统所采用的文件系统的支持要编入内核，最好不要编成模块。

比如我的Fedora core 9.0所采用的文件系统用的是ext3，所以我要把它直接编入内核。好处是不受模块丢失或者损坏而不能启动系统。而有时您把系统所采用的文件系统编译成模块，出现VFS错误，也有这方面的事，可能是您没有把ext3加入到相应的加载模块的配置文件中，所以我们为了减少麻烦，把风险降到最低，还是要直接置入内核的好。

File systems---＞

＜*＞Ext3 journalling file system support

［*］Ext3 extended attributes

［*］Ext3 POSIX Access Control Lists

［*］Ext3 Security Labels

如果您还有其他的硬盘分区要读取，比如是reiserfs、ext2、fat、fat32、ntfs等可以编成模块来支持。

再举一例：如果您的操作系统用的是reiserfs的文件系统，当然就要把reiserfs直接编入内核，其他的可以编成模块来支持了。

（4）对于硬盘及RAID的支持，要直接编入内核。

比如ATA、SATA、SCSI及RAID的支持直接内核支持。有时编完内核后，启动时不能识别硬盘和RAID，大多事情出在这里。Slackware中在这方面有的是模块支持，我们可以把它由模块M改成内核*来支持。如果您不明白，就按默认进行。SATA的硬盘的支持除了选中SATA的支持、IDE设备的支持以外，还要选中SCSI的支持。

（5）对于没有的设备，可以在内核中不选。

比如我没有ISDN设备，所以就把ISDN去掉。

ISDN subsystem---＞

＜＞Linux telephony support

如果您没有1394的设备，当然也可以把1394的支持去掉，等等。

如果您有USB的设备，要把USB方面好好看看。比如大家常用的移动硬盘、USB猫，还有扫描仪等。

配置好后先要保存

Save Configuration to an Alternate File

出来一个

Enter a filename to which this configuration，should be saved as an alternate. Leave blank to abort.

.config

按回车键就行了，这样就保存住了。

然后退出Exit，这时也会出现保存。

如果你想把.config保存起来，可以再复制一份到安全一点的目录，以备后用。

五、编译内核

［root＠localhost Linux-2.6.12.3］＃make

［root＠localhost Linux-2.6.12.3］＃make modules＿install

这样就编译好了，并把模块也安装在了/lib/modules目录中了，请看：

［root＠localhost Linux-2.6.12.3］＃ls/lib/modules/

2.6.11-1.1369＿FC9 2.6.12.3

六、安装内核及配置grub或lilo

1.复制bzImage等相关文件，并创建initrd文件

［root＠localhost Linux-2.6.12.3］＃cp arch/i386/boot/bzImage/boot/vmlinuz-2.6.12.3

［root＠localhost Linux-2.6.12.3］＃cp System.map/boot/System.map-2.6.12.3

［root＠localhost Linux-2.6.12.3］＃cd/boot

［root＠localhost Linux-2.6.12.3］＃/sbin/mkinitrd initrd-2.6.12.3.img 2.6.12.3

我们把编译出来的bzImage，拷入到/boot目录，拷贝成vmlinuz-2.6.12.3。

并且用mkinitrd来创建imitrd-×××.img文件，其中×××为内核的版本号，是通过查看/lib/modules版本来对应的，我们编译出来的是2.6.12.3，所以就运行上面的命令创建，创建出来的是initrd-2.6.12.3.img。不创建这个文件，有时是启动不起来的，比如提示VFS错误等。

2.查看系统引导装载程序grub或者lilo的配置文件

如果想要新内核能让系统引导装载程序在grub和lilo的菜单上能看得到，必须改grub.conf或者lilo.conf，但我们必须保留老内核的在grub和lilo的启动菜单，毕竟新内核不能百分之百的成功。

FC9系统引导装载程序是GRUB，所以我们谈谈GRUB的设置。

查看/etc/grub.conf。

比如我的grub.conf的内容是这样的。

＃grub.conf generated by anaconda

＃

＃Note that you do not have to rerun grub after making changes to this file

＃NOTICE：You do not have a/boot partition.This means that

＃all kernel and initrd paths are relative to/，eg.

＃root（hd0，7）

＃kernel/boot/vmlinuz-version ro root＝/dev/hda8

＃initrd/boot/initrd-version.img

＃boot＝/dev/hda
default＝0
timeout＝5

＃splashimage＝（hd0，7）/boot/grub/splash.xpm.gz

＃hiddenmenu
title Fedora Core（2.6.11-1.1369＿FC9）

root（hd0，7）

kernel/boot/vmlinuz-2.6.11-1.1369＿FC9 ro root＝LABEL＝/rhgb quiet

initrd/boot/initrd-2.6.11-1.1369＿FC9.img
title Windows

rootnoverify（hd0，0）

chainloader＋1

要把老内核的启动保留下来，以防不测，只加入新的内核的启动。所以加上这样一段。

title Fedora Core（2.6.12.3）
root（hd0，7）
kernel/boot/vmlinuz-2.6.12.3 ro root＝LABEL＝/rhgb quiet
initrd/boot/initrd-2.6.12.3.img

再来看一下改过后的配置文件。

＃grub.conf generated by anaconda

＃

＃Note that you do not have to rerun grub after making changes to this file

＃NOTICE：You do not have a/boot partition.This means that

＃all kernel and initrd paths are relative to/，eg.

＃root（hd0，7）

＃kernel/boot/vmlinuz-version ro root＝/dev/hda8

＃initrd/boot/initrd-version.img

＃boot＝/dev/hda
default＝0
timeout＝5

＃splashimage＝（hd0，7）/boot/grub/splash.xpm.gz

＃hiddenmenu
title Fedora Core（2.6.12.3）

root（hd0，7）

kernel/boot/vmlinuz-2.6.12.3 ro root＝LABEL＝/rhgb quiet

initrd/boot/initrd-2.6.12.3.img
title Fedora Core（2.6.11-1.1369＿FC9）

root（hd0，7）

kernel/boot/vmlinuz-2.6.11-1.1369＿FC9 ro root＝LABEL＝/rhgb quiet

initrd/boot/initrd-2.6.11-1.1369＿FC9.img
title Windows

rootnoverify（hd0，0）

chainloader＋1

然后重新启动机器，如果出现VFS错误，可能就是创建img文件的那个地方出了错误。

注意：如果重新启用内核后，原来安装的显示卡驱动，比如NVIDIA和ATI的驱动还要重新安装。

管理内核模块的相关命令

（1）lsmod列出已加载的内核模块。

lsmod是列出目前系统中已加载的模块的名称及大小等。另外我们还可以查看/ proc/modules，我们一样可以知道系统已经加载的模块。

［root＠localhost tux1］＃lsmod

（2）modinfo查看模块信息。

modinfo可以查看模块的信息，通过查看模块信息来判定这个模块的用途。

［root＠localhost tux1］＃moinfo模块名

举例：

［root＠localhost tux1］＃modinfo ne2k-pci
filename：/lib/modules/2.6.11-1.1369＿FC9/kernel/drivers/net/ne2k-pci.ko
author：Donald Becker/Paul Gortmaker
description：PCI NE2000 clone driver
license：GPL
parmtype：debug：int
parmtype：options：array of int
parmtype：full＿duplex：array of int
parm：debug：debug level（1-2）
parm：options：Bit 5：full duplex
parm：full＿duplex：full duplex setting（s）（1）
vermagic：2.6.11-1.1369＿FC9 686 REGPARM 4KSTACKS gcc-9.0
depends：8390
alias：pci：v000010ECd00008029sv*sd*bc*sc*i*
alias：pci：v00001050d00000940sv*sd*bc*sc*i*
alias：pci：v000011F6d00001401sv*sd*bc*sc*i*
alias：pci：v00008E2Ed00003000sv*sd*bc*sc*i*
alias：pci：v00004A14d00005000sv*sd*bc*sc*i*
alias：pci：v00001106d00000926sv*sd*bc*sc*i*
alias：pci：v000010BDd00000E34sv*sd*bc*sc*i*
alias：pci：v00001050d00005A5Asv*sd*bc*sc*i*
alias：pci：v000012C3d00000058sv*sd*bc*sc*i*
alias：pci：v000012C3d00005598sv*sd*bc*sc*i*
alias：pci：v00008C4Ad00001980sv*sd*bc*sc*i*
srcversion：6ACE95F441CD26DF9DC31C2

上面的例子是我们查看ne2k-pci这个模块的信息，通过查看，我们知道ne2k-pci模块是8029网卡（PCI NE2000 clone driver）的驱动。模块是位于/lib/modules/2.6.11-1.1369＿FC9/kernel/drivers/net/中ne2k-pci.ko。

我们现在常用的网卡也有8139的，8139网卡所用的驱动是8139too，用modinfo检查一下。

［root＠localhost tux1］＃modinfo 8139too

我们再查查vfat和ntfs的模块信息。

［root＠localhost tux1］＃modinfo vfat

［root＠localhost tux1］＃modinfo ntfs

自己尝试一下。

注意：模块名是不能带有后缀的，我们通过modprobe-l所看到的模块，都是带有.ko或.o后缀。

3.modprobe加载新模块以及新模块相依赖的模块
modprobe常用的功能就是加载模块，在加载某个内核模块的同时，这个模块所依赖的模块也被同时加载。当然modprobe也有列出内核所有模块，还有移除模块的功能。下面我们举个例子说一说我们常用的功能和参数。

modprobe［-v］［-V］［-C config-file］［-n］［-i］［-q］［-o＜modname＞］＜modname＞［parameters...］
modprobe-r［-n］［-i］［-v］＜modulename＞...

modprobe-l-t＜dirname＞［-a＜modulename＞...］

上面是modprobe的用法，具体更为详细的帮助，我们可以查看man modprobe。

［root＠localhost tux1］＃modprobe-c
modprobe-c可以查看modules的配置文件，比如模块的别名是什么等。

［root＠localhost tux1］＃modprobe-l
modprobe-l是列出内核中所有的模块，包括已加载和未加载的。通过modprobe-l，我们能查看到我们所需要的模块，然后根据我们的需要来加载。其实modprobe-l读取的模块列表就位于/lib/modules/uname-r目录中。其中uname-r是内核的版本。

［root＠localhost tux1］＃uname-r

2.6.11-1.1369＿FC9

［root＠localhost tux1］＃ls/lib/modules/2.6.11-1.1369＿FC9/

通过上面的命令，自己试试看：

［root＠localhost tux1］＃modprobe模块名注：加载一个模块。

举例：

［root＠localhost tux1］＃modprobe ne2k-pci注：加载ne2k-pci模块。

［root＠localhost tux1］＃modprobe vfat注：加载vfat模块。

［root＠localhost tux1］＃modprobe ntfs注：加载ntfs模块。

［root＠localhost tux1］＃lsmod注：列出已加载模块，我们会看到ne2k-pci，vfat，ntfs的模块。

注意：模块名是不能带有后缀的，我们通过modprobe-l所看到的模块，都是带有.ko或.o后缀。

［root＠localhost tux1］＃modprobe-r模块名注：移除已加载的模块，和rmmod功能相同。

注意：模块名是不能带有后缀的，我们通过modprobe-l所看到的模块，都是带有.ko或.o后缀。

［root＠localhost tux1］＃modprobe-r模块名

举例：

［root＠localhost tux1］＃modprobe-r ne2k-pci

就说这么多吧，更为详细的还是用man modprobe来查看和尝试。

4.rmmod移除已加载模块

命令格式：
rmmod模块名

注意：模块名是不能带有后缀的，我们通过modprobe-l所看到的模块，都是带有.ko或.o后缀。

举例：

［root＠localhost tux1］＃rmmod vfat注：移除已加载的模块vfat

5.depmod创建模块依赖关系的列表

这个模块管理工具是创建模块依赖关系的列表，有几个参数我们注意一下就行了，目前的Linux发行版所用的内核是2.6x版本，是自动解决依赖关系，所以这个命令知道就行了。模块之前也有依赖关系，比如我们想驱动USB移动硬盘，目前有两种驱动，一种是udev，在内核中有，但目前不太稳定。另一种办法是用usb-storage驱动，而usb-storage依赖的模块是scsi模块，所以我们要用usb-storage的模块，也得把scsi编译安装。

再举个例子：sata的硬盘，在Linux中的设备表示的是/dev/sd*，比如/dev/ sda，/dev/sdb等。系统要驱动sata硬盘，则需要把sata在内核中选中，或编译成模块，或内置于内核之中，在此同时，还需要在内核中选中ide，scsi的支持等。

depmod工具的英文原意：depmod—program to generate modules.dep and map files。可译为创建modules.dep文件和映射文件。

［root＠localhost tux1］＃depmod-a注：为所有列在/etc/modprobe.conf或/etc/ modules.conf中的所有模块创建依赖关系，并且写入到modules.dep文件。

［root＠localhost tux1］＃depmod-e注：列出已加载但不可用的模块。

［root＠localhost tux1］＃depmod-n注：列出所有模块的依赖关系，但仅仅是输出出来（Write the dependency file on stdout only）。

注：modules.dep位于/lib/modules/内核版本目录

比如Fedora Core 9.0中，系统默认的内核：

［root＠localhost tux1］＃ls/lib/modules/2.6.11-1.1369＿FC9/modules.dep

/lib/modules/2.6.11-1.1369＿FC9/modules.dep

6.insmod加载模块
insmod这个工具，和modprobe有点类似，但功能上没有modprobe强，modprobe在加载模块不用指定模块文件的路径，也不用带文件的后缀.o或.ko。而insmod需要的是模块所在目录的绝对路径，并且一定要带有模块文件名后缀的（modulefile.o或modulesfile.ko）。

对于这个工具，我们只是介绍一下，并不推荐使用。因为模块有依赖关系，对于新手来说，可能不知道这个模块和哪个模块依赖。

举例：

［root＠localhost tux1］＃insmod/lib/modules/2.6.11-1.1369＿FC9/kernel/drivers/net/tg3.ko

我们要到/lib/modules/内核版本uname-r的命令输出/kernel/drivers中找相对应的模块才行，要有绝对路径，而且必需要用到文件名的全称，不能把文件名的后缀省略。

与内核模块加载相关的配置文件。

1.模块的配置文件modules.conf或modprobe.conf

内核模块的开机自动加载模块一般是位于一个配置文件，一般的Linux发行版本都有/etc/modules.conf或/etc/modprobe.conf。比如Fedora Core 9.0内核模块开机自动加载文件是/etc/modprobe.conf。在这个文件中，一般是写入模块的加载命令或模块的别名的定义等。比如我们在modules.conf中可能会发现类似的一行：
alias eth0 8139too

而8029的网卡应该是
alias eth0 ne2k-pci

这样系统启动的时候，首先为modprobe 8139too，然后再为8139too指定别名为eth0，我们在登录的时候，用ifconfig就会查看到网卡的IP等情况，当然您得为网卡设置IP才行。

一般的情况下，modproe.conf或modules.conf的内容是我们用相应的硬件配置工具而生成的。如果您的硬件驱动是没有被内核支持，您自己到硬件的厂商下载而来的驱动，一般的情况下都有安装和帮助文件。他们的驱动在配置时，他会写入硬件的支持到modules.conf或modprobe.conf文件中。

再比如我们的声卡在modules.conf或modprobe.conf中也有相应的内容，这是由alsaconf配置工具生成的，明白了吧。同理网卡在modprobe.conf或modules.conf中的内容也是由网卡的配置工具而来的。

有些硬件是以内核模块的方式驱动的，模块一旦加载上就能用，也没有什么配置工具，比如vfat和ntfs的支持。如果是硬件驱动不以模块的方式支持，而是直接编入内核，也不会用在modprobe.conf或modules.conf中加入什么内容。

如果您有些模块不能开机加载，您想让一些模块加机自动加载，就可以把modprobe模块直接写入配置文件。

2.内核模块其他配置文件

内核模块的其他配置文件还是需要了解的，比如/lib/modules/内核版本目录下的几个文件。了解一下就行。比如：

［root＠localhost tux1］＃uname-r

2.6.11-1.1369＿FC9

［root＠localhost tux1］＃ls/lib/modules/2.6.11-1.1369＿FC9/
build misc modules.ccwmap modules.ieee1394map modules.isapnpmap modules.symbols source
kernel modules.alias modules.dep modules.inputmap modules.pcimap modules.usbmap

硬件驱动是必须由内核支持的，无论是我们自己安装驱动，还是内核自带的驱动都是如此。硬件驱动如果是以内核模块支持的，驱动目录位于：/lib/modules/内核版本/kernel/目录或/lib/modules/内核版本/kernel/drivers目录中。

［root＠localhost tux1］＃uname-r

2.6.11-1.1369＿FC9

［root＠localhost tux1］＃ls/lib/modules/2.6.11-1.1369＿FC9/kernel
arch crypto drivers fs lib net sound

注：只有驱动在内核中以模块的方法支持，驱动才位于/lib/modules/相应的目录。如果是直接置入内核的，不会出现在/lib/modules驱动相关的目录。

自己编译驱动的办法。

如果是硬件厂商或者开源社区提供的驱动（没有集成在内核源码中的），编译驱动过程一般是./configure；make；make install，有时程序不提供./configure，我们可以make或make install，或者执行make；make install。如果不能make install，则需要我们自己复制.o或者.ko文件到/lib/modules/内核版本/kernel/目录或/lib/modules/内核版本/kernel/drivers目录中相应的驱动目录。

这个还是自己尝试吧，说也说不清楚，遇到问题后就知道怎么弄了。具体的还是以驱动的REAME和INSTALL为准。

现在大多驱动都是在编译安装时，自动复制.o或.ko文件到内核模块目录，大多不用我们自己动手复制过去。如果您尝试编译安装声卡驱动alsa-drivers就会明白我所说的意思。

如果是我们通过重编内核来解决驱动问题，可以查看/usr/src/目录中的内核源码目录中的Documentation的REAME。所有的帮助文件都在那里。

9.5　系统紧急修复

如果一台Linux机器无法正常启动，或root口令丢失，就需要进行系统的紧急修复。

一、单用户模式

单用户模式要求我们输入root用户的密码，否则您无法登录单用户模式。如果您丢失了root用户的密码，并不能用单用户模式来重设您的root密码。另外单用户模式还有一个前提是您的grub或者lilo是能正常工作的。并且您知道您的系统问题发生在哪里，当以单用户模式登录时，您能打开文件系统的写操作，然后进行您想要进行的系统修复。

要以单用户登录，如果使用grub系统引导装载程序，在grub启动后，移动键盘到Linux的启动项。按E键。然后再移动键盘到类似下面的一行，也就是kernel的那行：
kernel/boot/vmlinuz-2.6.11-1.1369＿FC9 ro root＝LABEL＝/1 rhgb quiet

把光标移动到这行后，再按一下E键，进入编辑状态。在行尾敲一个空格，然后输入Linux single，也就是类似如下的：
kernel/boot/vmlinuz-2.6.11-1.1369＿FC9 ro root＝LABEL＝/1 rhgb quiet Linux single

结束编辑，按回车键返回。接着按一下B键启动系统。

如果使用lilo引导装载程序单用户模式，则在boot：处输入：

Linux single

当进入单用户模式运行后，系统提示我们输入root密码。输入正确后会进入系统。您可以用df-h来查看文件系统加载位置等，也可以用fdisk-l来查看分区等。但单用户进入系统后，可能系统是只读的。对文件系统的写操作，要运行下面的命令：

＃mount-o remount，rw/

二、Linux rescue修复模式

Linux的修复模式就是Linux rescue。修复模式并不需要系统密码，当进入修复模式后，系统会提示我们要加载哪个分区上的文件系统，我们根据自己的系统情况来选择就是了。登录完成后，系统也会提示所在分区的文件系统会被加载到哪个目录。如果您不知道加载在哪里，请通过df-h来查看。

修复模式需要安装盘的第一张或独立的修复盘。比如Fedora就有专门的修复盘。其实修复盘在一定意义上来说类似livecd，是不需要安装到硬盘也能运行系统。然后通过mount来加载文件系统。其实当我们执行Linux rescue时，像Fedora这类的系统，会有一些提示，比如提示要mount哪个分区，我们选择一下就行了。

执行修复模式时，需要以下几个步骤。

（1）在BIOS中，设置首个启动驱动器为CDROM。

（2）找出系统安装盘的第一张。放入CDROM。当光盘运行时，会提示安装的界面。

在boot：后面输入Linux rescue，然后按回车键。

boot：Linux rescue

进入修复模式，我们可以进行系统的紧急修复，比如加载usb盘进行数据备份、修改系统中的配置文件、重新设置root密码等。

三、livecd光盘或第三方Linux系统

Linux的livecd版本无需安装的Linux系统，在光盘上就可以运行的Linux系统。livecd大多是用来修复之用，livecd集成了常用的系统操作工具。第三方Linux系统是指你的机器上安装一个以上的Linux系统，如果其中一个发生问题，我们就可以用另一个来修复。

livecd和第三方Linux系统来修复已经被破坏的Linux，常用的工具有mount和chroot等等。如果您只是简单的更改存在问题的系统文件，用mount就足够了。chroot工具可以改变/，进而进入另一个系统，这个工具的确有用。

livecd就是在光盘上运行的Linux，您可以找一个livecd的发行版本刻录一下就能用了，使用简单方便。下载地址：http://www.frozentech.com/content/livecd.php。常用的有SLAX，Knoppix，Damn Small Linux，Ubuntu…大体都差不多，下载一个小的备用也行。

通过livecd Linux或其他Linux来修复已经破坏的Linux步骤如下：

（1）mount加载文件系统。

注：执行mount及chroot时，要以root权限运行，以下同。

比如存在问题的系统位于/dev/hda5，如果您不知道哪个分区是Linux的，您可以通过fdsik-l来查看。

［root＠localhost～］＃fdisk-l注：查看分区情况。

［root＠localhost～］＃pwd注：确定当前工作目录。

/root注：当前工作目录为/root。

［root＠localhost～］＃mkdir systmp注：在当前工作目录下创建一个临时目录。

［root＠localhost～］＃mount/dev/hda5 systmp/注：加载hda5到tmpsys目录中。

［root＠localhost～］＃df-h注：查看是否已经加载。

Filesystem容量已用可用已用%加载点

/dev/hda811G 9.8G 581M 95%/

/dev/shm236M 0 236M 0% /dev/shm

/dev/hda57.9G 5.9G 2.0G 76% /root/systmp注：看好了，是加载到了/root/ systmp目录中。

既然把/dev/hda5分区的文件系统已经加载了，我们就能对已经加载的文件系统进行写操作。如果是简单的备份和文件修改，是完全能行的。

注意：在写操作的过程中，要倍加小心，在操作某个文件的时候，要先备份。当出现不能mount的情况，可能是您的当前所用的内核不支持相应的文件系统。如果系统要求指定文件系统的时候，请看如下的例子。

mount-t文件系统类型磁盘分区加载目的目录

对于Linux的文件系统类型主要有：reiserfs，ext3，ext2。比如hda5是reiserfs的，可以用下面的命令来加载。

［root＠localhost～］＃mount-t reiserfs/dev/hda5 systmp/

（2）chroot到已经加载的文件系统。

chroot这个工具很有用，很多Linux都支持chroot切换到另一个文件系统中，然后进行一系列系统包的安装和系统配置。这并不是说任何文件系统都能chroot切入，首先这个文件系统中得具备系统运行的一定的工具和环境，比如/bin和/sbin目录是拥有等。

比如我的机器中有两个Linux系统，一个运行正常，另一个有点问题（比如是root密码忘记了），我想通过正常的系统来修复另一个。首先我们进行的是mount，也就是前面所说的，然后下一步就是chroot，通过chroot切换到要修复的文件系统中。

比如存在问题的系统位于/dev/hda5

［root＠localhost～］＃fdisk-l

［root＠localhost～］＃pwd

/root

［root＠localhost～］＃mkdir systmp

［root＠localhost～］＃mount/dev/hda5 systmp/

［root＠localhost～］＃df-h

Filesystem容量已用可用已用%加载点

/dev/hda811G 9.8G 581M 95%/

/dev/shm236M 0 236M 0% /dev/shm

/dev/hda57.9G 5.9G 2.0G 76% /root/systmp

［root＠localhost～］＃chroot systmp注：chroot到hda5分区的系统中。

bash-3.00＃注：已经登录。

bash-3.00＃df-lh注：查看文件系统加载情况。

Filesystem容量已用可用已用%加载点

/dev/hda57.9G 5.9G 2.0G 76%/
proc7.9G 5.9G 2.0G 76% /proc
sysfs7.9G 5.9G 2.0G 76% /sys

上面我们就通过chroot命令完成了通过一个系统到另一个系统的跨控制台登录。Livecd如果要完成此任务，也是通过这样过程完成的。我们既然已经登录到有问题的系统了，可以进行相应的修复工作，比如对root密码的恢复，软件包的安装，相应文件的修改……

有些发行版的安装盘类似livecd，比如slackware的安装盘的第一张，当它启动到让你输入用户名和密码进行安装时，我们不必输入什么，或者直接输入root，就能进入cdrom虚拟环境了。这时我们就用前面所说mount加载文件系统，然后chroot加载的文件系统。

四、如果X不能启动了，如何才能登录机器

把开机登录由图形登录改为文本模式登录，然后修复。

以单用户模式登录，找到/etc/inittab文件，找到如下一行。

id：5：initdefault：

把这里的5改为3，也就是改成如下的代码：
id：3：initdefault：

用户、组、包管理、引导、内核重编译、模块、系统修复

1.在Linux中用户和组的关系是什么？

2.Linux中如何安装新软件？

3.grub有什么功能？如何配置？

4.为什么要进行内核重编译？

5.把驱动程序编译进内核和编成独立的模块有什么区别？

第十章　Linux网络基础

主要内容

1.计算机网络基础

2.设置TCP/IP属性

3.与Windows协同工作

4.作为Internet服务器

10.1　计算机网络基础

计算机网络和Internet正逐渐成为我们生活中不可缺少的组成元素。什么是计算机网络？在计算机网络发展过程的不同阶段中，人们对计算机网络提出不同的定义。不同的定义反映了人们对网络的不同认识水平。从资源共享的观点来讲，计算机网络是按照网络协议，以共享资源（硬件、软件、信息）为主要目的，将物理上分散且独立自主的计算机通过数据传输设备和通信控制处理器互联。

计算机之间可以用同轴电缆、双绞线、电话线、DDN（Data Digital Network）、IS-DN（Integrated Service Digital Network）和光纤等有线介质，也可以使用微波、卫星无线媒体把它们连接起来。联入计算机网络的每部计算机本身都是独立的系统，可以独立运行，也可通过计算机网络共享网络服务器或其他计算机的软、硬件资源。

一、计算机网络类型和网络体系结构

（一）计算机网络分类

计算机网络类型按网络涉辖范围，可分成：①局域网（Local Area Network，LAN）；②城域网（Metropolitan Area Network，MAN）；③广域网（Wide Area Network，WAN）。

局域网的地理范围一般在10km之内，在一个单位或团体组建的范围内，例如一个学校的校园网。广域网涉辖范围可以是很大，从几十公里到几万公里，即采用远程通讯技术把局域网连接起来。例如一个城市、国家或洲际网络。城域网是介于局域网和广域网之间，一般覆盖一个城市或地区，例如一个城市的信息网络（信息港）。

（二）计算机网络体系结构

计算机网络由多个节点（工作站）互联而成。在这些节点之间要做到数据有条不紊地进行交换，需要有控制网络数据交换的协议（Protocol）。国际标准化组织ISO（International Organization for Standardization）成立于1947年，下设的分委员会于1979年提出了开放系统互联（Open System Interconnection，OSI）模型。这是一种定义连接异种计算机的标准主体体系。

计算机网络的功能非常复杂，通常网络协议都按结构化层次方式进行组织。OSI模型分为7层，由高层至低层分别是：

第七层　　应用层

第六层　　表示层

第五层　　会话层

第四层　　传输层

第三层　　网络层

第二层　　数据链路层

第一层　　物理层（硬件接口）

二、局域网技术

自20世纪70年代中期以后，计算机硬件的价格不断下降，微型计算机（PC）得到了广泛应用，计算机局部网络技术也飞速发展起来。局域网通常被分成三种，即：

·局域网

·高速局域网（High Speed Local Network，HSLN）

·专门小交换机（Private Branch Exchange，PBX）

PBX原来是为一个单位电话通讯而设置的小交换机。使用计算机程序控制的PBX不仅可以传送语音信息，而且可以传送数据。局域网和近年来发展的高速局域网应用较为广泛。

（一）局域网基本组成

1.服务器（Server）　服务器是局域网的核心。根据它在网络中所起的作用可分为文件服务器、打印服务器和通讯服务器等。文件服务器提供大容量磁盘空间、软件、数据库供网络用户共享。打印服务器接收和完成客户机打印请求。通讯服务器主要处理网络与网络之间的通讯及远程客户机的通信请求。

2.客户机（Clients）　客户机也称为用户工作站，一般是微机。每一客户机都可运行自己的程序，主要任务是共享网络服务器上的资源。

3.网络设备　主要是一些决定局域网的拓扑结构、通讯协议以及电缆类型的硬件设备，例如路由器、集线器、网络接口卡等。

4.通讯介质　局域网中的通讯介质主要有同轴电缆、双绞线和光纤等。同轴电缆有粗电缆和细电缆两种，在局域网中每段粗、细电缆标准传输距离分别为500m和185m，超过规定标准传输距离的局域网，需加中继器才能正常运行，而且最多允许使用4个中继器。双绞线有UTP（无屏蔽双绞线）和STP（屏蔽双绞线）两种。无屏蔽双绞线的长度一般不超过100m。传输数据速率可达到100Mbps。光纤技术依赖于光波的特性，不受电子或电磁干扰的影响。而且光传递允许几乎无限的带宽，可达200Gbps。

5.网络操作系统（NOS）和协议（Protocols）　计算机局域网像一台独立计算机一样必须有操作系统来对整个网络的资源和运行进行管理，如应有UNIX、Novell或Windows NT等。计算机局域网络协议是一组规则和标准，使网络中的计算机能进行互相通讯，如Netbeui、TCP/IP等。

（二）局域网拓扑

局域网技术目前发展最迅速，并在社会各领域中得到广泛的应用。主要用于一个单位、一所大学、一幢大楼内资源共享和信息服务。局域网在网络拓扑上主要采用总线型、环型与星型结构。

1.总线型拓扑结构　局域网最主要的拓扑结构之一。总线型局域网的介质访问控制方法采用的是“共享介质”方式，所有的节点通过相应的网络接口卡（Network Interface Card，NIC）连接到以同轴电缆或双绞线为公共传输介质的总线上（图10-1）。由于总线作为公共传输介质为多个节点共享，因此会出现“冲突”（collision），造成传输失败。所以若局域网的每个网段的节点数超过30个，网络速度会下降。

图10-1　总线型网络拓扑结构

总线型拓扑结构具有结构简单、实现容易、易于扩展等优点，在局域网建设中采用较多。其缺点是不易管理，故障诊断和隔离比较困难。

2.环型拓扑结构　是局域网最基本的拓扑结构之一。每个节点通过网络接口卡连入网内，各节点到节点首尾相接，最后闭合成环路（图10-2）。信息沿环单向逐步传送。

图10-2　环型网络拓扑结构

环型拓扑结构具有安装容易、故障诊断定位比较准确等优点。由于环型网是单向传输和点到点连接，非常适合以光纤作为传输介质，例如FDDI网。环型拓扑结构的缺点是可靠性较差，在单环上出现的任何故障会导致全网瘫痪。

3.星型拓扑结构　由中心节点和一些与之相连的从节点组成（图10-3）。目前较为流行的是在中心节点配置集线器（HUB），每个节点通过网络接口卡和电缆连接到HUB。

图10-3　星型网络拓扑结构

星型拓扑结构具有维护管理容易、重新配置灵活等优点。缺点是安装工作量大，依赖中心节点，如中心集线器故障，则要影响全网。

在局域网的实际应用中，一般采用总线型拓扑和星型拓扑的组合和扩展方式。目前比较流行的智能大楼布线技术中，是在每个楼层安置集线器，连接节点，并连接到总线型的主干上。

（三）高速局域网

传统的共享介质局域网主要有Ethernet、Token Bus和Token Ring三类，而目前应用最广泛的是Ethernet。在过去20多年里，计算机的处理速度提高了百万倍，而网络传输速率只提高了几千倍。随着局域网规模的不断增大，网络通讯量进一步增加，局域网的带宽与性能已不能适应用户的需求。

高速局域网是保持传统的局域网体系结构与介质控制方法不变，设法提高局域网的传输速度。例如快速以太网（Fast Ethernet）在保留传统的10Mbps速率Ethernet所有特征的基础上，把Ethernet每比特发送时间由100ns降低到10ns，从而成为100 Mbps的Fast Ethernet。近年来，每比特发送时间降低到1ns，千兆位以太网（Gigabit Ethernet）也已问世。

（四）交换局域网

交换局域网的核心部件是它的局域网交换机。典型的交换局域网是交换式以太网

（Switch Ethernet），其核心部件是以太网交换机（Ethernet Switch）。Ethernet Switch可以有多个端口，每个端口可与一个节点连接，也可与一个共享式HUB连接。交换局域网每个端口提供10Mbps或100Mbps的带宽，可以通过Ethernet Switch支持交换机端口之间的多个节点开放连接，实现多个节点之间数据的并发传输，因此增加了局域网带宽，改善了局域网的性能。

（五）ATM网络

异步传输模式（Asynchronous Transfer Mode，ATM）从本质上看，是一种分组交换技术。它把数字、语音、图像等所有的数字信息分解为长度固定的信元（Cell），每个信元长度为53 bytes，为高速交换信息提供了有利条件。伴随着ATM技术的日趋成熟和标准化，在网络建设中采用ATM技术的也越来越多。ATM比较适合于高速传输声音、图像、视频等多媒体数据。国内有许多学校的校园网采用155 Mbps ATM，也有少数大学已采用622 Mbps ATM作为校园网络主干。

三、网络互联

网络互联是指处于同一地域或不同地域的同类型或不同类型网络之间的互联。随着信息网络和信息技术的发展，各个单位建立的局域网纷纷进行互联，并通过公共信息网络设施联入地区、国家信息网络和Internet，进行信息交换和信息资源共享。

局域网受到最多节点数、最远覆盖范围等因素的限制，而局域网的互联就可以突破这些限制。局域网互联有多种方式，从距离上区分主要是局域网之间的连接、局域网同远程局域网之间的连接。例如某校图书馆局域网联入校园网，校园网通过中国教育和科研计算机网及Internet同远程的局域网连接。传输介质有同轴粗缆或细缆、各类屏蔽双绞线STP和非屏蔽双绞线UTP、单模或多模光缆、DDN、ISDN、卫星、微波等。局域网的互联结构也要遵循ISO/OSI开放系统互联参考模型。

网络互联按不同层次可分为物理层、数据链路层、网络层和高层，与之对应的设备分别是中继器（Repeater）、网桥（Bridge）、路由器（Router）和网关（Gateway）。

（一）中继器和集线器

1.中继器 中继器是网络的物理层的一种连接器，用于放大在传输介质中已衰减的电信号。通常一种传输介质的传输距离都有一定的限度。在局域网中每段10BASE-T粗电缆标准传输距离为500m，10BASE-2细电缆则是185m，超过规定的标准传输距离的局域网，需加中继器才能正常运行，但最多允许使用4个中继器，即可连接5个网段。中继器对信号有放大作用，但没有通信隔离功能，所以不能解决局域网信息拥挤等问题。

2.集线器 集线器（HUB）是一种特殊的中继器，它可作为多个网络段的中转设备而将各个网络段连接起来。集线器一般分无源（Passive）集线器、有源（Active）集线器和智能（Intelligent）集线器。无源集线器只是把传输介质连接在一起。有源集线器还具有信号放大作用。智能集线器除具有有源集线器的全部功能外，还有网络管理等智能性功能。现在集线器被广泛地用于总线型网络和星型网络相结合的局域网络中。

（二）网桥

网桥的操作在网络数据链路层进行。网桥可以将大范围的网络分成几个相互独立的网段，使得某一网段的传输效率提高，而各网段之间还可以通过网桥进行通信和访问。通过网桥连接局域网，可以提高各子网的性能和安全性。网桥从应用上可分为：①本地网桥，用于连接两个或两个以上的局域网。②远程网桥，用于连接远程局域网。网桥一般用于同类局域网的互联。

（三）路由器

路由器是在网络层上实现多个网络互联的设备。在由路由器互联的网络中，只要求每个网络的网络层以上高层协议相同（例如TCP/IP），数据链路层和物理层协议可以是不同的。路由器比网桥更复杂、管理功能更强，但更具灵活性，经常被用于多个局域网、局域网与广域网以及不同类型网络的互联。例如在校园网同CERNET（中国教育和科研计算机网）连接中，一般都要采用路由器。目前，存在不同标准的路由器协议，如IGRP、RID、OSPF等。

（四）网关

网关是通过硬件和软件来实现不同网络协议之间的转换功能，也就是协议转换器。它工作在网络传输层或更高层，主要用于不同体系结构的网络或局域网同大型计算机的连接。局域网通过网关可以使网上用户能省去同大型计算机连接的接口设备和电缆，却能共享大型计算机的资源。

四、Internet简介

（一）什么是Internet

Internet并不是一个单一的计算机网络，而是一个“网间网”，即它是一个将许多较小的计算机网络彼此互联在一起的巨型网络，通常的译法为“因特网”“国际互联网”等。Internet网络上用于传送数据的协议叫做TCP/IP。因此，Internet经常被定义为“一组使用TCP/IP作为其共同协议的网络”。

（二）Internet发展历程

20世纪60年代末，美国国防部高级研究计划署（DOD Advanced Research Project Agency）建立了著名的ARPANET。它是由四个节点组成的分组交换网。ARPANET是最早出现的计算机网络之一。

20世纪70年代，ARPANET从一个实验性网络变成一个可运行网络。在ARPA-NET不断增长的同时，ARPA开发研制了卫星通信网与无线分组通信网，并想将它们联入ARPANET，由此导致网络互联协议TCP/IP的出现。对该网的基本要求之一是：即使它的基本结构中的很大一部分消失，它也能继续工作。美国国防部需要一个能经受住核弹袭击的网络。

20世纪80年代初，TCP/IP协议成为军用标准，1983年1月1日国防部通信局正式将TCP/IP作为ARPANET的网络协议，与此同时，在当时流行的BSDUNIX内核集成了TCP/IP，推动了TCP/IP协议的进一步研究和应用。同年，ARPANET分为独立的两部分，一部分仍叫作APPANET，用于研究工作，另一部分是MILNET，用于军方非机密通信。APPANET的一个副产品是网络互联的概念——将独立的网络联结成为一个整体。在ARPANET的TCP/IP协议之后，这种互联开始实现，于是形成了一个“由网络组成的网络”。在网络工业范围内，互联网络的技术术语称为网间连接（Internetworking）。这个网际网络称为Internet。

20世纪80年代中后期，美国国家科学基金会（National Science Foundation NSF）围绕其六个超级计算机中心建立了NSFNET并与ARPANET相连。NSFNET代替ARPANET成为Internet的新主干。

20世纪90年代，Internet以惊人的速度发展，成为全球连接范围最广、用户最多的互联网络。

（三）Internet的现状和展望

1999年年底的统计资料显示，Internet已成为通达世界所有国家和绝大部分地区的国际性网络。与之相连的大小网络约3万个，在网上运行的主机约有3000万台，而且正以每小时100台的速度激增，网上用户已达2亿多，随着越来越多的人意识到了Internet对于他们的重要性，网上用户的数量也在日益膨胀。据有关专家估计，到2000年年底，Internet用户将会高达3亿。

Internet中一些最大的网络是：美国科学基金会NSFNET，澳大利亚的AAR-NET，美国国家航空宇航局科学网（SNI）以及瑞士的科学与研究网SWITCH。

美国政府提出NII（National Information Infrastructure）国家信息基础结构，也称“信息高速公路”，有可能取代Internet，因为它能将网络性能提高很多倍。它将提供“一个通信网络、计算机、数据库和消费者电子设备组成的无缝连接网”以使用户可以方便地获得巨大数量的信息。具体如何实现还不十分清楚，但是可以预料的是NII将运行得足够快（每秒55至150M）以便在同一个网络上提供充分集成的数字服务，例如声音、图像和数据等。即是说您将能够通过连入您家中的同一根电线打电话、收看电视和有线电视及其他数据（如E-mail）。目前的Internet与NII不同，这主要是由于Internet与能够提供全动感视频图像的网络相比，速度太慢而且很不方便，但是它也许能影响NII的发展。

五、TCP/IP协议

TCP/IP是用于计算机网络上计算机间互联共享资源的一组协议，由ARPANET研究中心开发。TCP/IP是一组协议族（Internet protocol suite），而TCP、IP是该协议族中最重要的最普遍使用的两个协议，所以用TCP/IP来泛指该组协议。

TCP（Transmission Control Protocol）对发送的信息进行数据分解，保证可靠性传送并按序组合。IP（Internet Protocol）则负责数据包的寻址。

在Internet内部，信息不是一个恒定的流，从主机传送到主机，而是把数据分解成数据包。例如您传送一个很长的信息给在另一地区的朋友，TCP负责把这个信息分成很多个数据包，每一个数据包用一序号和接收地址来标定，还插入一些纠错信息。而IP则将数据包传过网络，把它们传送给远程主机。在另一端，TCP接收到数据包并核查错误，若有错误发生，TCP要求重发这个特定的数据包，当所有的数据包都被正确地接收，TCP将用序号来重构原始信息。换句话说，IP的工作是把原始数据（数据包）从一地传送到另一地，TCP的工作是管理这种流动并确保其数据是正确的。

把数据分解成数据包有很多的好处。首先，它允许Internet让很多不同的用户在同一时间用同一通讯线路。因为这些数据包不必一起输送，所以通讯线路可以载着所有类型的数据包按它们自己的路径从一地到另一地。就如同一条高速公路上，各类汽车（即使它们开向不同的地方）都在公共道路上行驶。当数据包传输时，它们沿规定的路由从主机到主机，一直到它们到达最终目的地。这意味着Internet很具灵活性。如果一个特定的连接中断了，控制数据流动的计算机通常可以找到另一条路由。事实上，在单一数据传输中，多个数据包完全可能沿不同的路由传输。当条件改变时，网络可获得当时最好的连接。如当网络的某一部分过载，数据包可以改变路线去走那些比较空闲的线路。用数据包传输的另一个好处是，当某处出错，只须重新传送单个数据包，而不是整个信息。这样会大大加快Internet的传输总速度。这种灵活性产生很高的可靠性。Internet运行非常好，虽然所有数据包都必须通过很多计算机，但它可以用几秒钟就把一个文件从一主机传输到另一主机，尽管它们相距很远。

什么是TCP/IP？TCP/IP是计算机和通讯设备组织成网络的协议大家庭。两个最重要的协议是TCP、IP。IP传输数据从一地到另一地，而TCP保证它们正确地工作。Internet依靠上千个网络和百万计的计算机，而TCP/IP是把它们合在一起的黏结剂。

TCP/IP模型由以下四层组成：

1）应用层

位于TCP/IP协议的最高层，它提供一些常用的应用程序如电子邮件、文件传输等。

2）传输层

提供应用程序间（即端到端）的通信，其功能是利用网际层传输格式化的信息流，提供无连接和面向连接的服务。它对发送的信息进行数据报分解，保证可靠性传送并按序组合。

3）网际层

负责相邻计算机之间的通信，网际层作为通信子网的最高层，提供无连接的数据报传输机制。其功能包括三个方面。第一，处理来自传输层的分组发送请求：收到请求后，将分装入IP数据报，填充报头，选择去往目的地的路径，将数据报发往适当的网络接口。第二，处理输入数据报：首次检查其合法，进行寻址转发，若该数据报是发往本机的，则去掉报头，将剩下的部分（传输层分组）交给适当的传输协议。第三，处理ICMP报文，处理路径、流控、拥塞等问题。

4）网络接口层

负责接收IP数据报并通过网络发送出去，或者从网络上接收物理帧，分离IP数据报，交给IP层。

六、IP地址与子网掩码

（一）IP地址

TCP/IP中的地址是实现异种网互联的一个关键技术，它有效地隐藏了物理地址间的差异，在不同网络之间实现了一种统一、有效的地址模式。

我们知道，在任何一种物理网络中，各站点都有一个机器可识别的地址，该地址叫做物理地址（physical address），物理地址有两个特点：首先，物理地址的长度、格式等是物理网络技术的一部分，物理网络技术不同，物理地址也不同。其次，假如地址分配不采取像以太网一样的统一管理模式，则同一类型不同网络的站点可能拥有相同的物理地址。由于网际互联技术是将不同物理网络技术统一起来的高层软件技术，因此在统一的过程中，首先要解决的就是地址的统一问题。

TCP/IP对物理地址的统一是通过上层软件完成，确切地说，是在网际层中完成的。IP协议提供一种在互联网络中通用的地址格式，并在统一管理下进行地址分配，保证一个地址对应网络中的一台主机，这样物理地址的差异被网际层所屏蔽。网际层所用到的地址就是我们经常所说的IP地址。

IP地址是一种层次型地址，携带关于对象位置的信息。它所要处理的对象比广域网庞杂得多，无结构的地址是不能担此重任的。国际互联网络（Internet）在概念上分三个层次。

图10-4　国际互联网络（Internet）概念上的三个层次

IP地址正是对上述结构的反映，Internet是由许多网络组成，每一网络中有许多主机，因此必须分别为网络主机加以标识，以示区别。这种地址模式明显地携带位置信息，给出一主机的IP地址，就可以知道它位于哪个网络。

IP地址的长度为32位。为了便于阅读，IP地址被分成四个8位二进制组，由句点分隔四个八位二进制组，每个八位组用十进制数0～255表示，这种格式称为点分十进制（dotted decimal notation）。例如某台主机的IP地址OxA66F5010（十六进制），用点分十进制表示为166.111.80.16。

IP地址由两部分构成，一部分是网络标识（netid）；另一部分是主机标识（hostid），网络标识中的某些信息还代表网络的种类。Internet的网络地址分为五类，A、B、C、D和E，目前常用的为前三类。每类网络中IP地址的结构即网络标识长度和主机标识长度都有所不同。

图10-5　IP地址的结构

A类地址：网络标识仅占用第一个8位组，包含的网络是从1.0.0.0到126.0.0.0，共有126个A类地址（000和127保留），而每个网络中允许有160万个节点。用于少量的，主机数介于2^16～2^24的大型网络。

B类地址：网络标识占用前两个8位组，包含的网络是从128.0.0.0到191.255.0.0，共有16384个B类网络，每个网络最多可以包含65534台主机，用于主机数介于2^8～2^16的中型网络。

C类地址：网络标识占用前三个8位组，包含的网络是从192.0.0.0到223.255.255.0总共近210万个C类网络，每个网络最多可以包含254台主机。用于主机数少于254的大量的小型网络。

D类地址：第一个8位组224～239。用于多播地址。多播地址（multicast address）就是多点传送地址，用于支持多目的传输技术。

E类地址：第一个8位组为240～247。InterNIC保留E类地址作为扩展。

（二）子网掩码（subnet mask）

从IP地址的结构中可知，IP地址由网络地址和主机地址两部分组成。这样IP地址中具有相同网络地址的主机应该位于同一网络内，同样同一网络内的所有主机的IP地址中网络地址部分应该相同。不论是在A、B或C类网络中，具有相同网络地址的所有主机构成了一个网络。

通常一个网络本身并不只是一个大的局域网，它可能是由许多小的局域网组成。因此，为了维持原有局域网的划分便于网络的管理，允许将A、B或C类网络进一步划分成若干个相对独立的子网。A、B或C类网络通过IP地址中的网络地址部分来区分。在划分子网时，将网络地址部分进行扩展，占用主机地址的部分数据位。在子网中，为识别其网络地址与主机地址，引出一个新的概念：子网掩码（subnet mask）或网络屏蔽字（netmask）。

子网掩码的长度也是32位，其表示方法与IP地址的表示方法一致。其特点是，它的32位二进制可以分为两部分，第一部分全部为“1”，而第二部分则全部为“0”。子网掩码的作用在于，利用它来区分IP地址中的网络地址与主机地址。其操作过程为，将32位的IP地址与子网掩码进行二进制的逻辑与操作，得到的便是网络地址。便如，IP地址为166.111.80.16，子网掩码为255.255.128.0，则该IP地址所属的网络地址为166.111.0.0，而166.111.129.32子网掩码为255.255.128.0，则该IP地址所属的网络地址为166.111.128.0原本为一个B类网络的两个主机被划分为两个子网。从A、B以及C类网络的定义中可知，它们具有缺省的子网掩码。A类地址的子网掩码为255.0.0.0，B类地址的子网掩码为255.255.0.0，而C类地址的子网掩码为255.255.255.0。

这样，我们便可以利用子网掩码来进行子网的划分。例如，某单位拥有一个B类网络地址166.111.0.0，其缺省的子网掩码为255.255.0.0。如果需要将其划分成为256个子网，则应该将子网掩码设置为255.255.255.0。于是，就产生了从166.111.0.0到166.111.255.0总共256个子网地址，而每个子网最多只能包含254台主机。此时，便可以为每个部门分配一个子网地址。

由于在IP地址的A、B、C类地址定义中，强行限制了网络的规模，因此，通过提供子网掩码机制，来增加一定的灵活性。通过子网划分将一个大的网络划分成为若干小的网段，除了能够提供管理上的便利之外，还可以降低网络上不必要的通信流量。例如，如果将一个B类网络中的所有主机组成一个大型的局域网，由于局域网大多是广播式的，网络中任何一个主机都可以接收到网络内部所有的通信数据。一方面，安全性非常差。另一方面，网络上的通信流量很容易达到饱和，这是因为多数的局域网都是共享传输介质的，即某一时刻网络上只能有一个主机发送。此外，对网络进行子网的划分还有助于保持网络原有的拓扑结构。子网掩码通常是用来进行子网的划分，它还有另外一个用途，即进行网络的合并，这一点对于新申请IP地址的单位很有用处。由于IP地址资源的匮乏，如今A、B类地址已分配完，即使具有较大的网络规模，所能够申请到的也只是若干个C类地址（通常会是连续的）。当用户需要将这几个连续的C类地址合并为一个的网络时，就需要用到子网掩码。例如，某单位申请到连续4个C类网络合并成为一个网络，可以将子网掩码设置为255.255.252.0。使用4位子网标识的B类地址的子网掩码是：255.255.240.0，使用8位网标识的B类地址的子网掩码是：255.255.255.0，无子网的C类地址的子网掩码也是：255.255.255.0。

使用子网掩码时应注意以下几点。

1.子网掩码一定要填写正确，否则计算机不能正常工作。

2.有些软件，问的是子网比特位数（Subnet Bits），它对应的子网掩码换算关系如下：

子网比特位数与其对应的子网掩码换算关系（C类）

（三）IP地址的申请组织及获取方法

IP地址必须由国际组织统一分配。IP组织分A、B、C、D、E五类，A类为最高级IP地址。

·分配最高级IP地址的国际组织——NIC

Network Information Center国际网络信息中心负责：分配A类IP地址、授权分配B类IP地址的组织——自治区系统，有权重新刷新IP地址。

·分配B类IP地址的国际组织InterNIC、APNIC和ENIC

目前全世界有三个自治区系统组织：ENIC负责欧洲地区的分配工作，InterNIC负责北美地区的分配工作，APNIC负责亚太地区的分配工作，设在日本东京大学。我国属APNI，被分配B类地址。

·分配C类地址：由各国和地区的网管中心负责分配。

七、域名系统（Domain Name System DNS）

IP地址是一种数字型网络标识和主机标识。数字型标识对计算机网络系统来说是最有效的。但对使用网络的人有些抽象，不便记忆。这种数字型表示法有点像一个人的身份证号码而不是名字，而日常生活中我们更习惯于使用名字，因名字更容易使用和记忆。由于这种原因，网络设计人员设计了Internet的域名系统（DNS）。域名系统让Internet的用户用域名www.smmu edu.cn，而不是用IP地址202.121.224.5来表示主机。

DNS是一种采用客户机/服务器形式的运行机制，服务器包含了与DNS数据库分配有关的信息。客户机通过向服务器发出请求获得目的地的IP地址。

DNS数据库的结构同一棵倒过来的树类似，它的根位于结构的最顶部。紧接在根的下面是一些主域，每个域都进一步划分为不同的子域。下表为大家总结了由InterN-IC分配的一些常见的主域名前缀。并对每种前缀适宜的单位类型进行了说明。

域名前缀

大家应注意到表中列出的都是一些最早定义的、最常见的顶级域名。除了以单位类别划分的域名外，顶级域名亦可根据双字母的国家代码名定义。这种双字母国家代码是由国际标准化组织（ISO）3166号标准文件规定的。例如，.au代表顶级澳大利亚域名，而.cn则代表顶级的中国大陆域名。

在一个应用程序里输入了目的地地址后，就需要进行一种翻译过程，将那个名字转换为由32个二进制位构成IP地址。为完成这种翻译过程，每个TCP/IP网络都应有一台服务器，它能对本网络内的主机名进行跟踪与维护。如一名网络用户输入的是一个英文名称，而不是十进制的IP地址，那么应用程序的名称解析器（扮演了一个客户机的角色）就会向网络获取，并已保存在高速缓存里，服务器就会返回与那个名称对应的IP地址。如指定的名称既不在名称服务器内也未在高速率缓存内保存，则服务器会向位于另一个网络的“更高级”DNS服务器发出一个名称解析请求。事实上，每台DNS服务器有指向位于那棵倒立树结构上一级的另一台服务器。这种请求转发机制则可能重复多次，并可能在全球范围内传送，直到最后终于找到并返回与用户指定英文名称对应的IP地址。

采用了DNS分级式数据库结构以后，一个主要的优点就是可以支持近似重复的名称。例如，International Pretzel大学可将自己的WWW服务器设为www.ipretzel.edu；它实际并未与前面提到的同名商业公司重名。

IP定址和寻址机制允许数据包在网络之间传递，这一切都依赖于由32个二进制位构成的地址。通常用四个十进制数字表示这32个二进制位，每个数字最多占据8位，最大为255。由于大多数人都喜欢使用英语形式的地址，所以因特网工程任务组（IETF）又设计了一种域名系统，用它作为将英语助记符或名称翻译成IP地址。

八、Internet网络安全

（一）网络安全的一般概念

随着网络的发展，网络安全问题已成为网络管理员和用户关心的头等大事，也是决定Internet命运的重要因素。最近有许多骇人听闻的消息，如：两名少年闯入美国五角大楼信息系统，美国纽约时报信息系统遭到黑客攻击等，实际上已经出现不少个体网络由于自身安全受到威胁，而不得不被迫暂时退出Internet的事件。

然而从根本意义上讲，绝对安全的计算机是根本不存在的，绝对安全的网络也是不可能的。只有存放在一个无人知晓的密室里，而又不插电的计算机才可以称之为安全。计算机只要投入使用，就或多或少存在着安全问题，只是程度不同而已。因此，在探讨网络安全的时候，实际上指的是一定程度的网络安全。而到底需要多大的安全性，却要完全依据实际需要及自身能力而定。网络安全性越高，同时也意味着网络运行使用不方便。网络的安全性与网络的使用便利性是一对矛盾的概念。

目前威胁网络安全的主要有“黑客”的攻击和带有极强破坏性的病毒的传播等，所谓“黑客”是英文Hacker的译音，是指在Internet上有一批熟悉网络技术的人（其中不乏网络天才），经常利用网络上现存的一些漏洞，设法进入他人的计算机系统，有些人只是为了好奇，而有些人是存在不良动机侵入他人系统，他们偷窥机密信息，或将其计算机系统捣毁，这部分人就被称为“黑客”。黑客是目前影响网络安全的最大威胁。

（二）网络安全防范的主要技术

与网络安全防范的有关技术主要有：

·防火墙技术

网络安全一个使用广泛的技术就是防火墙技术（Firewall），即在Internet和内部网络（Internal network）之间设一个防火墙。目前在全球连入Internet的计算机中约有1/3是处于防火墙保护之下。

防火墙实际上是一个或一组系统。防火墙的主要功能就是防止外部网络未授权访问。如果某个网络决定设定防火墙，那么首先需要由网络决策人员及网络专家共同决定本网络的安全策略（seurity policy），即确定什么类型的信息允许通过防火墙，什么类型的信息不允许通过防火墙。防火墙的职责就是根据本单位的安全策略，对外部网络与内部网络交流的数据进行检查，符合的予以放行，不符合拒之门外，以在一定程度上保证网络的安全。

·加密技术

网络安全的另一个非常重要手段就是加密技术（cryptography）。它的思想核心就是，既然网络本身并不安全可靠，那么所有重要信息全部通过加密处理。

1）单匙技术

即无论加密还是解密都是用同一把钥匙（secret key），这是比较传统的一种加密方法。发信人用某把钥匙将某重要信息加密，通过网络传给收信人，收信人再用同一把钥匙将加密后的信息解密。这种方法快捷简便，即使传输信息的网络不安全，被别人截走信息，加密后的信息也不易泄露。

2）双匙技术

即有两个相关互补的钥匙，一个称为公用钥匙（public key），另一个称为私人钥匙

（secret key）。公用钥匙是大家被告知的，而私人钥匙则只有每个人自己知道。发信者需用收信人的公用钥匙将重要信息加密，然后通过网络传给收信人。收信人再用自己的私人钥匙将其解密。除了私人钥匙的持有者，没有人（包括发信者）能够将其解密。

（三）网络安全管理

妥善的系统管理可将网络的不安全性降至最低。目前发现的大多问题，都归因于一些编程漏洞及管理不善，如果每个网络及系统管理员都能注意到以下几点，即可在现有条件下，将网络安全风险降至最低。

·口令管理 口令的有效管理是非常基本的，也是非常重要的。

①首先绝对杜绝不设口令的帐号存在。

②缩短口令更换周期，使用户经常更换口令。

③采用新版本口令管理软件。新的口令管理软件在用户设定一些容易被猜中的口令时，会自动拒绝接受，并提示用户重新选择口令。例如用户不能使用自己的名字、生日日期等做口令，也不能选用英语单词做口令等等。

·用户帐号管理 在为用户建立帐号时，应注意保证每个用户的标识码是唯一的，应避免使用公用帐号，对于过期帐号要及时封闭，用户也不能随意将自己的帐号外借他人。

·谨慎从网络上下载软件

当你从任何地方获得可执行软件时应特别谨慎，小心攻击性极强的计算机病毒。

10.2　设置TCP/IP属性

Linux是与Internet共同发展起来的操作系统，与UNIX一样，它从一开始就具备了网络功能，而且，Linux既可以充当客户端，又可以充当服务器。TCP/IP协议是现在Internet事实上的标准协议族，Linux对TCP/IP协议有着很好的支持。首先我们了解一下在Linux中如何设置TCP/IP属性。

在Linux中设置TCP/IP属性有两种方法，一种是使用发行版所提供的管理工具来设置，这种方法简单方便，适合于普通用户，但不同的发行版的管理工具不同，所以要分别学习各发行版的管理工具的用法。另一种方法是通过一些命令和修改配置文件来设置，这种方法通用性强，但需要记住一系统的命令和文件名，所以适合于有经验的管理员使用。

在redhat/fedora core中，可以使用发行所提供的管理工具来设置TCP/IP属性，以root身份在图形界面下运行system-config-network。在SuSE中，可以通过YaST2来设置TCP/IP属性。

手工设置TCP/IP属性可以通过命令行的命令或修改相应的配置文件。要设置的内容主要有：

配置主机名

配置网卡适配器

配置IP地址

配置缺省路由

配置域名解析

配置主机名：

Linux主机要上网，就必须设置主机名。可以用hostname这条命令来查看或设置主机名。

查看主机名：hostname

设置主机名：hostname欲设置的主机名

用hostname设置的主机名立即就可以生效，但机器重启后就回到原来的状态，如果想让修改永久保存，需要修改相应的配置文件。其中redhat中的配置文件为/etc/sysconfig/network，SuSE中的为/etc/HOSTNAME。

配置网卡适配器：

在Linux中网卡往往可以被自动识别，不需要我们手工设置，不过，如果网卡是非“即插即用”的，如传统的ISA总线的网卡，就需要手工设置参数。如果网卡驱动是编译进内核的，可以修改lilo.conf或grub.conf文件，如果是作为独立的模块，则应该设置modules.conf文件。

例如：

＃cat/etc/lilo.conf

.

image＝/boot/bzImage

append＝“eth0＝0x300，2，3c509”

.

＃cat/boot/grub/grub.conf

.

title Red Hat Linux（2.4.18-3）

kernel/vmlinuz-2.4.18-3 ro root＝/dev/hda15 eth0＝0x300，2，3c509

.

＃cat/etc/modules.conf
alias eth03c509
options eth0 io＝0x300 irq＝2

设置IP地址：

手工设置IP地址可以使用ifconfig命令，或修改相应的配置文件。

命令：ifconfig

作用：查看或设置IP地址

例：ifconfig eth0 192.168.0.2 netmask 255.255.255.0 up

要激活一个网络界面（IP地址），可以使用ifup eth0，禁用可以使用ifdown eth0。

ifconfig的设置立即生效，但重启后就不再保存。要永久保存，需要修改相应的配置文件。redhat中配置文件是/etc/sysconfig/networking/devices/ifcfg-＜device＞，SuSE的配置文件是/etc/sysconfig/network/ifcfg-＜device＞。

如果要为一块网卡设置二个以上的IP地址，可以使用别名机制。例如，eth0的别名是eth0：0，eth0：1…例：ifconfig eth0：0 192.168.1.2 netmask 255.255.255.0 up。

配置缺省路由：

在Linux的术语中，路由（router）和网关（gateway）是可以互换的。设置路由的命令是route。

例：设置缺省路由
route add default gw 192.168.0.1

同ifconfig类似，用route设置的路由不能保存到下次开机后，所以，要修改相应的配置文件。Red Hat：/etc/sysconfig/network。SuSE：/etc/sysconfig/network/routes。

配置域名解析：

在因特网上，域名比IP地址更容易被用户记忆。将域名转换成相应的IP地址或反过来将IP地址转换成相应的域名，都可以使用DNS服务器。设置DNS服务器的地址可以在配置文件/etc/resolv.conf中增加DNS服务器。例如：
cat/etc/resolv.conf
search mydomain.com
nameserver 192.168.0.254
nameserver 192.168.0.25 3

10.3　与Windows协同工作

用上samba以后，在Windows和Linux的局域网内可以共享文件了，Linux就像一台网络PC或者Windows PC，就像LAN内部的Windows计算机一样。另外，从Linux机器上也可以存取Windows的硬盘了。直接mount Windows的目录，就像用你自己的文件一样了。设置也非常容易，当然对于新手来说可能复杂一点。

下面，我们一步一步地来设置samba服务器。一般说来，每一个Linux发行版本都包含samba，但是如果你没有安装samba的话，请先从安装光盘中安装samba。设置samba。在目录/usr/local/samba/lib/内建立设置文件smb.conf：touch/usr/local/samba/lib/smb.conf

为便于测试，我们建立一个最小配置的文件：

［global］

workgroup＝workgroup

［all］

path＝/

read only＝yes

workgroup＝group1

workgroup后面的名字必须和Windows网络属性里工作组的名字一样。

编辑好配置文件后，启动samba：

/usr/local/samba/bin/nmbd-D

/usr/local/samba/bin/smbd-D

在Windows机器上登录。注意：必须使用Linux存在的用户名。双击网络图标后，可以看到Linux机器。打开这个机器，要求输入口令，在这里输入你在Linux机器上的口令。

实际的配置文件允许你存取Linux上的所有文件。下面，我们改变配置文件。下面的配置应该可以在大多数系统上工作，我们没有注释所有的设置，你如果想知道得更多的话，可以阅读http://de.samba.org上的手册。

［global］
workgroup＝workgroup
guest account＝nobody
keep alive＝30
os level＝2
security＝user
printing＝bsd
printcap name＝/etc/printcap
load printers＝yes；如果需要samba作为一台wins服务器的话，把wins support改为yes。需要samba使用现有的wins服务器的话，去掉下行的注释，并改变其中的IP地址为你的wins服务器地址：
wins server＝192.168.1.1

共享

［local］
path＝/usr/local
read only＝yes；

现在可以在Windows下找到/usr/local下的任何程序了

［homes］

comment＝Home

Directory browseable＝no

read only＝no

create mode＝0750；

以下的共享让用户存取服务器的CD驱动器

［cdrom］
comment＝Linux
path＝/cdrom
read only＝yes
locking＝no［printers］
comment＝All Printers
browseable＝no
printable＝yes
public＝no
read only＝yes
create mode＝0700
directory＝/tmp

这下，打印机也可以在Windows下使用了。

然后重新启动nmbd以及smbd守护程序，来激活新的配置。

在Windows网络窗口里搜索Linux PC，它应该就在那里了，如果没有的话，看一下日志文件：/usr/local/samba/var/log.smb和/usr/local/samba/var/log.nmb。

10.4　作为Internet服务器

由于Linux工具包拥有几乎所有的工具，能够轻松且廉价地搭建起Internet和Intranet应用服务。因而，在Internet/Intranet环境下，Linux开始替代商业的UNIX和Windows NT。Linux环境下的Apache服务软件在Internet/Intranet上提供了极高的性能和极低的费用。Apache服务器软件是自由软件旗帜下的一个最典型的例子。它管理着全球半数以上的浏览服务器，具有低成本、高性能、功能显著的特点。另外，Linux在硬件上的需求要小于其他的竞争者。当硬件系统升级后，Linux系统很容易扩展它的功能，系统的性能也会相应地提高。一个单独的Linux系统就能够提供包括WWW浏览服务（http）、文件下载服务（ftp）、代理服务（proxy）、电子邮件服务（E-mail）、域名解析服务（dns）、TCP/IP路由服务（route）等内容。Linux的各个发行版本均提供了所需要的工具，能简单快速地安装Internet服务软件。

配置Linux中的网络服务需要Linux管理和计算机网络的知识，在Linux操作系统入门中就不作详细介绍了。

计算机网络、TCP/IP、Internet、samba、服务

1.TCP/IP网络模型有几层？每层的功能是什么？

2.IP地址是怎样分类的？

3.如何在Linux中设置网络基本属性？

4.在Linux中如何访问Windows的网上邻居？

5.Linux可以提供哪些Internet服务？

附录A　Linux常用命令

名称：cat

使用权限：

所有使用者

使用方式：
cat［-AbeEnstTuv］［--help］［--version］fileName

说明：

把文件串连接后传到基本输出（屏幕或加＞fileName到另一个文件）

参数：

-n或--number由1开始对所有输出的行数编号

-b或--number-nonblank和-n相似，只不过对于空白行不编号

-s或--squeeze-blank当遇到有连续两行以上的空白行，就代换为一行的空白行

-v或--show-nonprinting

范例：

把textfile1的文件内容加上行号后输入到textfile2这个文件里：
cat-n textfile1＞textfile2

把textfile1和textfile2的文件内容加上行号（空白行不加）之后将内容附加到text-file3：
cat-b textfile1 textfile2＞＞textfile 3

名称：cd

使用权限：

所有使用者

使用方式：
cd［dirName］

说明：

变换工作目录至dirName。其中dirName表示法可为绝对路径或相对路径。若目录名称省略，则变换至使用者的主目录（也就是刚login时所在的目录）。

另外，“～”也表示为主目录的意思，“.”则是表示目前所在的目录，“..”则表示目前目录位置的上一层目录。

范例：

跳到/usr/bin/：cd/usr/bin

跳到自己的主目录：cd～

跳到目前目录的上上两层：cd../..

指令名称：chmod

使用权限：

所有使用者

使用方式：
chmod［-cfvR］［--help］［--version］mode file...

说明：

Linux/UNIX的文件存取权限分为三级：文件拥有者、群组、其他。利用chmod可以藉以控制文件如何被他人所存取。

参数：
mode：权限设定字符串，格式如下：［ugoa...］［＋-＝］［rwxX］...］［，...］，其中u表示该文件的拥有者，g表示与该文件的拥有者属于同一个群体（group）者，o表示其他以外的人，a表示这三者皆是。

＋表示增加权限、-表示取消权限、＝表示唯一设定权限。

r表示可读取，w表示可写入，x表示可执行，X表示只有当该文件是个子目录或者该文件已经被设定过为可执行。

-c：若该文件权限确实已经更改，才显示其更改动作

-f：若该文件权限无法被更改也不要显示错误信息

-v：显示权限变更的详细资料

-R：对目前目录下的所有文件与子目录进行相同的权限变更（即以递归的方式逐个变更）

--help：显示辅助说明

--version：显示版本

范例：

将文件file1.txt设为所有人皆可读取：
chmod ugo＋r file1.txt

将文件file1.txt设为所有人皆可读取：
chmod a＋r file1.txt

将文件file1.txt与file2.txt设为该文件拥有者，与其所属同一个群体者可写入，但其他以外的人则不可写入：
chmod ug＋w，o-wfile1.txt file2.txt

将ex1.py设定为只有该文件拥有者可以执行：
chmod u＋x ex1.py

将目前目录下的所有文件与子目录皆设为任何人可读取：
chmod-R a＋r*

补充：

此外chmod也可以用数字来表示权限，如chmod 777 file。

语法为：chmod abc file

其中a，b，c各为一个数字，分别表示User、Group、及Other的权限。

r＝4，w＝2，x＝1

若要rwx属性则4＋2＋1＝7。

若要rw-属性则4＋2＝6。

若要r-x属性则4＋1＝7。

范例：
chmod a＝rwx file和chmod 777 file效果相同
chmod ug＝rwx，o＝x file和chmod 771 file效果相同

若用chmod 4755 filename可使此程序具有root的权限

名称：chown

使用权限：
root

使用方式：
chmod［-cfhvR］［--help］［--version］user［：group］file...

说明：

Linux/UNIX是多用户多任务操作系统，所有的文件皆有拥有者。利用chown可以将文件的拥有者加以改变。一般来说，这个指令只是由系统管理者（root）所使用，一般使用者没有权限可以改变别人的文件拥有者，也没有权限可以将自己的文件拥有者改设为别人。只有系统管理者（root）才有这样的权限。

参数：
user：新的文件拥有者的使用者IDgroup：新的文件拥有者的使用者群体 （group）-c：若该文件拥有者确实已经更改，才显示其更改动作-f：若该文件拥有者无法被更改也不要显示错误信息-h：只对于连接（link）进行变更，而非该link真正指向的文件-v：显示拥有者变更的详细资料-R：对目前目录下的所有文件与子目录进行相同的拥有者变更（即以递归的方式逐个变更）--help：显示辅助说明--version：显示版本。

范例：

将文件file1.txt的拥有者设为users群体的使用者jessie：
chown jessie：users file1.txt

将目前目录下的所有文件与子目录的拥有者皆设为users群体的使用者lamport：
chmod-R lamport：users*

名称：cp

使用权限：

所有使用者

使用方式：
cp［options］source dest
cp［options］source...directory

说明：

将一个文件复制至另一文件，或将数个文件拷贝至另一目录。

选项：

-a尽可能将文件状态、权限等资料都照原状予以复制

-r若source中含有目录名，则将目录下之文件亦皆依序复制至目的地

-f若目的地已经有相同文件名的文件存在，则在复制前先予以删除再行复制

范例：

将文件aaa复制（已存在），并命名为bbb：
cp aaa bbb

将所有的C语言程序复制至Finished子目录中：
cp*. c Finished

名称：cut

使用权限：

所有使用者

用法：
cut-cnum1-num2 filename

说明：

显示每行从开头算起num1到num2的文字。

范例：

假如文件example内容如下：
test2
this is test1

显示开头算起前6个字符
cut-c0-6 example
test2
this i

名称：find

用法：
find［expression］

说明：

将文件系统内符合expression的文件显示来。你可以指出文件的名称、类别、时间、大小、权限等不同信息的组合，只有完全相符的才会被显示来。

find根据下列规则判断path和expression，在命令列上第一个-（），！之前的部分为path，之后的是expression。如果path是空字符串则使用目前路径，如果expression是空字符串则使用-print为缺省expression。

expression中可使用的选项有二三十个之多，在此只介绍最常用的部分。

-mount，-xdev：只检查和指定目录在同一个文件系统下的文件，避免显示其他文件系统中的文件

-amin n：在过去n分钟内被读取过

-anewer file：比文件file更晚被读取过的文件

-atime n：在过去n天过读取过的文件

-cmin n：在过去n分钟内被修改过

-cnewer file：比文件file更新的文件

-ctime n：在过去n天过修改过的文件

-empty：空的文件-gid n or-group name：gid是n或是group名称是name

-ipath p，-path p：路径名称符合p的文件，ipath会忽略大小写

-name name，-iname name：文件名称符合name的文件。iname会忽略大小写

-size n：文件大小是n单位，b代表512字节的区块，c表示位数，k表示kilo bytes，w是二个字节。-type c：文件类型是c的文件
d：目录
c：字型设备文件
b：区块设备文件
p：具名队列
f：一般文件
l：符号连结
s：socket

-pid n：process id是n的文件

可以使用（）将运算式分隔，并使用下列运算。

exp1-and exp2

！expr

-not expr
exp1-or exp2
exp1，exp2

范例：

将目前目录及其子目录下所有延伸文件名是c的文件显示出来。

＃find.-name“*.c”

将目前目录及其下子目录中所有一般文件显示

＃find.-ftype f

将目前目录及其子目录下所有最近20分钟内更新过的文件显示

＃find.-ctime-20

名称：less

使用权限：

所有使用者

使用方式：
less［Option］filename

说明：
less的作用与more十分相似，都可以用来浏览文字文件的内容，不同的是less允许使用者往回卷动。

已浏览已经看过的部分，同时因为less并未在一开始就读入整个文件，因此在遇上大型文件的开启时，会比一般的文书编辑器（如vi）来的快速。

范例：

分屏显示文件text1的内容：
less text1

名称：ln

使用权限：

所有使用者

使用方式：
ln［options］source dist，其中option的格式为：

［-bdfinsvF］［-S backup-suffix］［-V｛numbered，existing，simple｝］［--help］［--version］［--］

说明：

Linux/UNIX文件系统中，有所谓的连接（link），我们可以将其视为文件的别名，而连接又可分为两种：硬连接（hard link）与软连接（symbolic link），硬连接的意思是一个文件可以有多个名称，而软连接的方式则是产生一个特殊的文件，该文件的内容是指向另一个文件的位置。硬连接是存在同一个文件系统中，而软连接却可以跨越不同的文件系统。ln source dist是产生一个连接（dist）到source，至于使用硬连接或软连接则由参数决定。不论是硬连接或软连接都不会将原本的文件复制一份，只会占用非常少量的软盘空间。

参数：

-f：链接时先将与dist同文件名的文件删除

-d：允许系统管理者硬连接自己的目录

-i：在删除与dist同文件名的文件时先进行询问

-n：在进行软连接时，将dist视为一般的文件

-s：进行软连接（symbolic link）

-v：在连接之前显示其文件名

-b：将在连接时会被覆写或删除的文件进行备份

-S SUFFIX：将备份的文件都加上SUFFIX的字尾

-V METHOD：指定备份的方式

--help：显示辅助说明

--version：显示版本

范例：

将文件yy产生一个symbolic link：zz
ln-s yy zz

将文件yy产生一个hard link：zz
ln yy xx

名称：locate

使用权限：

所有使用者

使用方式：
locate［-q］［-d］［--database＝］
locate［-r］［--regexp＝］
locate［-qv］［-o］［--output＝］
locate［-e］［-f］＜［-l］［-c］

＜［-U］［-u］＞
locate［-Vh］［--version］［--help］

说明：
locate让使用者可以很快速的搜寻文件系统内是否有指定的文件。其方法是先建立一个包括系统内所有文件名称及路径的资料库，之后当寻找时就只需查询这个资料库，而不必实际深入文件系统之中了。在一般的发行版之中，资料库的建立都被放在contab中自动执行。一般使用者在使用时只要用locate your＿file＿name的形式就可以了。

参数：

-u/-U：建立资料库，-u会由根目录开始，-U则可以指定开始的位置

-e：将……排除在寻找的范围之外

-l：如果是1.则启动安全模式。在安全模式下，使用者不会看到权限无法看到的文件。这会使速度减慢，因为locate必须至实际的文件系统中取得文件的权限资料

-f：将特定的文件系统排除在外，例如我们没有道理要把proc文件系统中的文件放在资料库中

-q：安静模式，不会显示任何错误信息

-n：至多显示几个输出

-r：使用正则表达式做寻找的条件

-o：指定资料库存的名称

-d：指定资料库的路径

-h：显示辅助信息

-v：显示更多的信息

-V：显示程序的版本信息

范例：
locate chdrv：寻找所有叫chdrv的文件
locate-n100 a.out：寻找所有叫a.out的文件，但最多只显示100个
locate-u：建立资料库

名称：ls

使用权限：

所有使用者

使用方式：
ls［-alrtAFR］［name...］

说明：

显示指定工作目录下的内容（显示目前工作目录所含的文件及子目录）。

选项：

-a显示所有文件及目录（ls内定将文件名或目录名称开头为“.”的视为隐藏文件，不会显示）

-l除文件名称外，亦将文件型态、权限、拥有者、文件大小等信息详细显示

-r将文件以相反次序显示（原定依英文字母次序）

-t将文件依建立时间之先后次序显示

-A同-a，但不显示“.”（目前目录）及“..”（父目录）

-F在显示的文件名称后加一符号。例如可执行文件则加“*”，目录则加“/”

-R若目录下有文件，则以下之文件亦皆依序显示

范例：

显示目前工作目录下所有名称是s开头的文件，愈新的排愈后面：
ls-ltr s*

将/bin目录以下所有目录及文件详细资料显示：
ls-lR/bin

显示目前工作目录下所有文件及目录。目录于名称后加“/”，可执行文件于名称后加“*”：
ls-AF

名称：more

使用权限：

所有使用者

使用方式：
more［-dlfpcsu］［-num］［＋/pattern］［＋linenum］［fileNames..］

说明：

类似cat，不过会以一页一页的显示方便使用者逐页阅读，而最基本的指令就是按空白键（space）就往下一页显示，按b键就会往回（back）一页显示，而且还有搜寻字符串的功能（与vi相似），使用中的说明文件，请按h。

选项：

-num一次显示的行数

-d提示使用者，在画面下方显示［Press space to continue，q to quit.］，如果使用者按错键，则会显示［Press h for instructions.］而不是“哔”声

-l取消遇见特殊位＾L（送纸位）时会暂停的功能

-f计算行数时，以实际上的行数，而非自动换行过后的行数（有些单行字数太长的会被扩展为两行或两行以上）

-p不以卷动的方式显示每一页，而是先清除屏幕后再显示内容-c跟-p相似，不同的是先显示内容再清除其他旧资料

-s当遇到有连续两行以上的空白行，就代换为一行的空白行

-u不显示下引号（根据环境变数TERM指定的terminal而有所不同）

＋/在每个文件显示前搜寻该字符串（pattern），然后从该字符串之后开始显示＋num从第num行开始显示
fileNames欲显示内容的文件，可为复数个数

范例：
more-s testfile逐页显示testfile的文件内容，如有连续两行以上空白行则以一行空白行显示。

more＋20 testfile从第20行开始显示testfile的文件内容。

名称：mv

使用权限：

所有使用者

使用方式：
mv［options］source dest
mv［options］source...directory

说明：

将一个文件移至另一文件，或将数个文件移至另一目录。

选项：

-i若目的地已有同名文件，则先询问是否覆盖旧文件。

范例：

将文件aaa更名为bbb：
mv aaa bbb

将所有的C语言程序移至Finished子目录中：
mv-i*. c Finished

名称：rm

使用权限：

所有使用者

使用方式：
rm［options］name...

说明：

删除文件及目录。

参数：

-i删除前逐一询问确认。

-f即使原文件属性设为只读，也直接删除，无需逐一确认。

-r将目录及以下之文件也逐一删除。

范例：

删除所有C语言程序文件。删除前逐一询问确认：
rm-i*.c

将Finished子目录及子目录中所有文件删除：
rm-r Finished

名称：rmdir

使用权限：

于目前目录有适当权限的所有使用者

使用方式：
rmdir［-p］dirName

说明：

删除空的目录。

参数：

-p是当子目录被删除后使它也成为空目录的话，则顺便一并删除。

范例：

将工作目录下，名为AAA的子目录删除：
rmdir AAA

在工作目录下的BBB目录中，删除名为Test的子目录。若Test删除后，BBB目录成为空目录，则BBB亦予删除。

rmdir-p BBB/ Test

名称：split

使用权限：

所有使用者

使用方式：
split［OPTION］［INPUT［PREFIX］

说明：

将一个文件分割成数个。而从INPUT分割输出成固定大小的文件，其文件名依序为PREFIXaa，PREFIXab...PREFIX缺省值为x。若没有INPUT文件，则从标准输入读进资料。

参数：

-b，--bytes＝SIZE，SIZE值为每一输出文件的大小，单位为byte

-C，--line-bytes＝SIZE，每一输出文件中，单行的最大byte数

-l，--lines＝NUMBER，NUMBER值为每一输出文件的列数大小

-NUMBER，与-l NUMBER相同

--verbose，于每个输出文件被开启前，打显示帧错信息到标准错误输出

--help，显示辅助信息然后退出

--version，显示版本信息然后退出

SIZE可选单位：b代表512，k代表1K，m代表1 Meg。

范例：

PostgresSQL大型资料库备份与回存：因Postgres允许表格大过你系统文件的最大容量，所以要将表格dump到单一的文件可能会有问题，使用split进行文件分割。

pg＿dump dbname｜split-b1m-filename.dump.

重新载入：
createdb dbname
cat filename.dump.*｜pg sql dbname

名称：touch

使用权限：

所有使用者

使用方式：
touch［-acfm］［-r reference-file］［--file＝reference-file］［-t MMDDhhmm［CC］YY］［.ss］［-d time］［--date＝time］［--time＝｛atime，access，use，mtime，modify｝］［--no-create］［--help］［--version］file1［file2...］

说明：
touch指令改变文件的时间记录。ls-l可以显示文件的时间记录。

参数：
a改变文件的读取时间记录
m改变文件的修改时间记录
c假如目的文件不存在，不会建立新的文件。与--no-create的效果一样
f不使用，是为了与其他UNIX系统的相容性而保留
r使用参考文件的时间记录，与--file的效果一样
d设定时间与日期，可以使用各种不同的格式
t设定文件的时间记录，格式与date指令相同

--no-create不会建立新文件。

--help显示指令格式。

--version显示版本信息。

范例：

最简单的使用方式，将文件的时候记录改为现在的时间。若文件不存在，系统会建立一个新的文件。

touch file

将file的时间记录改为5月6日18点3分，公元两千年。时间的格式可以参考date指令，至少需输入MMDDHHmm，就是月日时与分。

touch-c-t05061803 file
touch-c-t050618032000 file

将file的时间记录改变成与referencefile一样。

touch-r referencefile file

将file的时间记录改成5月6日18点3分，公元两千年。时间可以使用am，pm或是24小时的格式，日期可以使用其他格式如6 May 2000。

touch-d“6：03pm”file
touch-d“05/06/2000”file
touch-d“6：03pm05/06/2000”file

名称：at

使用权限：

所有使用者

使用方式：
at-V［-q queue］［-f file］［-mldbv］TIME

说明：
at可以让使用者指定在TIME这个特定时刻执行某个程序或指令，TIME的格式是HH∶MM其中的HH为小时，MM为分钟，甚至你也可以指定am，pm，midnight，noon，teatime（就是下午4点钟）等口语词。

如果想要指定超过一天内的时间，则可以用MMDDYY或者MM/DD/YY的格式，其中MM是分钟，DD是第几日，YY是指年份。另外，使用者甚至也可以使用像是now＋时间间隔来弹性指定时间，其中的时间间隔可以是minutes，hours，days，weeks。

另外，使用者也可指定today或tomorrow来表示今天或明天。当指定了时间并按下enter之后，at会进入交谈模式并要求输入指令或程序，当你输入完后按下ctrl＋D即可完成所有动作，至于执行的结果将会寄回你的帐号中。

选项：

-V：显示版本编号

-q：使用指定的队列（Queue）来储存，at的资料是存放在所谓的queue中，使用者可以同时使用多个queue，而queue的编号为a，b，c...z以及A，B，...Z共52个

-m：即使程序/指令执行完成后没有输出结果，也要寄封信给使用者

-f file：读入预先写好的命令文件。使用者不一定要使用交谈模式来输入，可以先将所有的指令先写入文件后再一次读入

-l：显示所有的指令（使用者也可以直接使用atq而不用at-l）

-d：删除指令（使用者也可以直接使用atrm而不用at-d）

-v：显示所有已经完成但尚未删除的指令

范例：

三天后的下午5点钟执行/bin/ls：
at 5pm＋3 days/bin/ls

三个星期后的下午5点钟执行/bin/ls：
at 5pm＋2 weeks/bin/ls

明天的17：20执行/bin/date：
at 17：20 tomorrow/bin/date

1999年的最后一天的最后一分钟显示the end of world！

at 23 ：5912/31/1999 echo the end of world！

名称：cal

使用权限：

所有使用者

使用方式：
cal［-mjy］［month［year］

说明：

显示日历。若只有一个参数，则代表年份（1～9999），显示该年的年历。年份必须全部写出：“cal 89”将不会是显示1989年的年历。使用两个参数，则表示月份及年份。若没有参数则显示这个月的月历。

参数：

-m：以星期一为每周的第一天方式显示

-j：以凯撒历显示，即以一月一日起的天数显示

-y：显示今年年历

范例：
cal：显示本月的月历。

cal 2001：显示公元2001年年历。

cal 5 2001：显示公元2001年5月月历。

cal-m：以星期一为每周的第一天方式，显示本月的月历。

cal-jy：以一月一日起的天数显示今年的年历。

名称：crontab

使用权限：

所有使用者

使用方式：
crontab［-u user］filecrontab［-u user］｛-l｜-r｜-e｝

说明：
crontab是用来让使用者在固定时间或固定间隔执行程序之用，换句话说，也就是类似使用者的时程表。-u user是指设定指定user的时程表，这个前提是你必需要有其权限（比如说是root）才能够指定他人的时程表。如果不使用-u user的话，就是表示设定自己的时程表。

参数：

-e：执行文字编辑器来设定时程表，内定的文字编辑器是VI，如果你想用别的文字编辑器，则请先设定VISUAL环境变数来指定使用那个文字编辑器（比如说setenv VISUAL joe）

-r：删除目前的时程表

-l：显示目前的时程表

补充：

时程表的格式为：f1 f2 f3 f4 f5 program

其中f1是表示分钟，f2表示小时，f3表示一个月份中的第几日，f4表示月份，f5表示一个星期中的第几天。program表示要执行的程序。

当f1为*时表示每分钟都要执行program，f2为*时表示每小时都要执行程序，其余类推

当f1为a-b时表示从第a分钟到第b分钟这段时间内要执行，f2为a-b时表示从第a到第b小时都要执行，其余类推

当f1为*/n时表示每n分钟个时间间隔执行一次，f2为*/n表示每n小时个时间间隔执行一次，其余类推

当f1为a，b，c...时表示第a，b，c...分钟要执行，f2为a，b，c...时表示第a，b，c...个小时要执行，其余类推

使用者也可以将所有的设定先存放在文件file中，用crontab file的方式来设定时程表。

范例：

每月每天每小时的第0分钟执行一次/bin/ls：

0 7***/bin/ls

在12月内，每天的早上6点到12点中，每隔20分钟执行一次/usr/bin/backup：

0 6-12/3*12*/usr/bin/backup

周一到周五每天下午5：00寄一封信给alex＠domain.name：

0 17**1-5 mail-s“hi”alex＠domain.name＜/tmp/maildata

每月每天的午夜0点20分，2点20分，4点20分....执行echo“haha”

200-23/2***echo“haha”

注意：

当程序在你所指定的时间执行后，系统会寄一封信给你，显示该程序执行的内容，若是你不希望收到这样的信，请在每一行空一格之后加上＞/dev/null 2＞＆1即可。

名称：date

使用权限：

所有使用者

使用方式：
date［-u］［-d datestr］［-s datestr］［--utc］［--universal］［--date＝datestr］［--set＝datestr］［--help］［--version］［＋formAT］［MMDDhhmm［CC］YY］［.ss］

说明：
date可以用来显示或设定系统的日期与时间，在显示方面，使用者可以设定欲显示的格式，格式设定为一个加号后接数个标记，其中可用的标记列表如下：

时间方面：

%：显示%

%n：下一行

%t：跳格

%H：小时（00..23）

%I：小时（01..12）

%k：小时（0..23）

%l：小时（1..12）

%M：分钟（00..59）

%p：显示本地AM或PM

%r：直接显示时间（12小时制，格式为hh：mm：ss［AP］M）

%s：从1970年1月1日00∶00∶00 UTC到目前为止的秒数

%S：秒（00..61）

%T：直接显示时间（24小时制）

%X：相当于%H：%M：%S

%Z：显示时区

日期方面：

%a：星期几（Sun..Sat）

%A：星期几（Sunday..Saturday）

%b：月份（Jan..Dec）

%B：月份（January..December）

%c：直接显示日期与时间

%d：日（01..31）

%D：直接显示日期（mm/dd/yy）

%h：同%b

%j：一年中的第几天（001..366）

%m：月份（01..12）

%U：一年中的第几周（00..53）（以Sunday为一周的第一天的情形）

%w：一周中的第几天（0..6）

%W：一年中的第几周（00..53）（以Monday为一周的第一天的情形）

%x：直接显示日期（mm/dd/yy）

%y：年份的最后两位数字（00.99）

%Y：完整年份（0000..9999）

若是不以加号作为开头，则表示要设定时间，而时间格式为MMDDhhmm［CC］YY］［.ss］，其中MM为月份，DD为日，hh为小时，mm为分钟，CC为年份前两位数字，YY为年份后两位数字，ss为秒数

选项：

-d datestr：显示datestr中所设定的时间（非系统时间）

--help：显示辅助信息

-s datestr：将系统时间设为datestr中所设定的时间

-u：显示目前的格林威治时间

--version：显示版本编号

范例：

显示时间后跳行，再显示目前日期：
date＋%T%n%D

显示月份与日数：
date＋%B%d

显示日期与设定时间（12：34：56）：
date--date 12：34：56

注意：

当你不希望出现无意义的0时（比如说1999/03/07），则可以在标记中插入-符号，比如说date＋%-H：%-M：%-S会把时分秒中无意义的0给去掉，像是原本的08：09：04会变为8：9：4。另外，只有取得权限者（比如说root）才能设定系统时间。

当你以root身分更改了系统时间之后，请记得以clock-w来将系统时间写入CMOS中，这样下次重新开机时系统时间才会持续保持最新的正确值。

名称：sleep

使用权限：

所有使用者

使用方式：
sleep［--help］［--version］number［smhd］说明：
sleep可以用来将目前动作延迟一段时间

参数说明：

--help：显示辅助信息

--version：显示版本编号
number：时间长度，后面可接s、m、h或d

其中s为秒，m为分钟，h为小时，d为日数

范例：

显示目前时间后延迟1分钟，之后再次显示时间：
date；sleep1m；date

名称：time

使用权限：

所有使用者

使用方式：
time［options］COMMAND［arguments］

说明：
time指令的用途，在于量测特定指令执行时所需消耗的时间及系统资源等信息。例如CPU时间、内存、输入输出等等。需要特别注意的是，部分信息在Linux上显示不出来。这是因为在Linux上部分资源的分配函数与time指令所缺省的方式并不相同，以至于time指令无法取得这些资料。

选项：

-o or--output＝FILE

设定结果输出文件。这个选项会将time的输出写入所指定的文件中。如果文件已经存在，系统将覆写其内容。

-a or--append

配合-o使用，会将结果写到文件的末端，而不会覆盖掉原来的内容。

-f formAT or--format＝formAT

以formAT字符串设定显示方式。当这个选项没有被设定的时候，会用系统缺省的格式。不过可以用环境变数time来设定这个格式，如此一来就不必每次登入系统都要设定一次。一般可以用t表示跳栏，或者是用n表示换行。每一项资料要用%做为前导，如果要在字符串中使用百分比符号。

time指令可以显示的资源有四大项，分别是：

Time resources

Memory resources

IO resources

Command info

详细的内容如下：

Time Resources

E执行指令所花费的时间，格式是：［hour］：minute：second。请注意这个数字并不代表实际的CPU时间。

e执行指令所花费的时间，单位是秒。请注意这个数字并不代表实际的CPU时间。

S指令执行时在核心模式（kernel mode）所花费的时间，单位是秒。

U指令执行时在使用者模式（user mode）所花费的时间，单位是秒。

P执行指令时CPU的占用比例。其实这个数字就是核心模式加上使用者模式的CPU时间除以总时间。

Memory Resources

M执行时所占用的实体内存的最大值。单位是KB
t执行时所占用的实体内存的平均值，单位是KB

K执行程序所占用的内存总量（stack＋data＋text）的平均大小，单位是KB

D执行程序的自有资料区（unshared data area）的平均大小，单位是KB
p执行程序的自有堆叠（unshared stack）的平均大小，单位是KB

X执行程序间共享内容（shared text）的平均值，单位是KB

Z系统内存页的大小，单位是byte。对同一个系统来说这是个常数

IO Resources

F此程序的主要内存页错误发生次数。所谓的主要内存页错误是指某一内存页已经置换到置换文件（swap file）中，而且已经分配给其他程序。此时该页的内容必须从置换文件里再读出来。

R此程序的次要内存页错误发生次数。所谓的次要内存页错误是指某一内存页虽然已经置换到置换文件中，但尚未分配给其他程序。此时该页的内容并未被破坏，不必从置换文件里读出来

W此程序被交换到置换文件的次数
c此程序被强迫中断（像是分配到的CPU时间耗尽）的次数
w此程序自愿中断（像是在等待某一个I/O执行完毕，像是软盘读取等等）的次数

I此程序所输入的文件数

O此程序所输出的文件数
r此程序所收到的Socket Message
s此程序所送出的Socket Message
k此程序所收到的信号（Signal）数量

Command Info

C执行时的参数以及指令名称
x指令的结束代码（Exit Status）

-p or--portability

这个选项会自动把显示格式设定成为：
real%e
user%U
sys%S

这么做的目的是为了与POSIX规格相容。

-v or--verbose

这个选项会把所有程序中用到的资源通通显示来，不但有一般英文语句，还有说明，对不想花时间去熟习格式设定或是刚刚开始接触这个指令的人相当有用。

范例：

利用下面的指令time-v ps-aux，可以获得执行ps-aux的结果和所花费的系统资源。如下面所列的资料：

USER PID%CPU%MEM VSZ RSS TTY STAT START TIME COMMAND
root 10.00.4 1096 472？S Apr190：04 init
root 20.00.000？SW Apr190：00［kflushd］
root 30.00.000？SW Apr190：00［kpiod］

......

root 242690.0 1.0 2692996 pts/3 R 12：160：00 ps-aux

Command being timed：“ps-aux”

User time（seconds）：0.05

System time（seconds）：0.06

Percent of CPU this job got：68%

Elapsed（wall clock）time（h：mm：ss or m：ss）：0：00.16

Average shared text size（kbytes）：0

Average unshared data size（kbytes）：0

Average stack size（kbytes）：0

Average total size（kbytes）：0

Maximum resident set size（kbytes）：0

Average resident set size（kbytes）：0

Major（requiring I/O）page faults：238

Minor（reclaiming a frame）page faults：46

Voluntary context switches：0

Involuntary context switches：0

Swaps：0

File system inputs：0

File system outputs：0

Socket messages sent：0

Socket messages received：0

Signals delivered：0

Page size（bytes）：4096

Exit status：0

名称：uptime

使用权限：

所有使用者

使用方式：
uptime［-V］

说明：
uptime提供使用者下面的信息，不需其他参数：现在的时间

系统开机运转到现在经过的时间

连线的使用者数量

最近一分钟，五分钟和十五分钟的系统负载

参数：

-V显示版本信息。

范例：
uptime

其结果为：

10：41am up 5 days，10 min，1 users，load average：0.00，0.00，1.9 9

名称：chfn

使用权限：

所有使用者

用法：
chfn

说明：

提供使用者更改个人信息，用于finger和mail的用户名。

范例：

＄chfn

Changing finger information for user

Password：

Name［］：Tux1＃＃＃提供finger时的资料

Office［］：

Office Phone［］：

Home Phone［］：

名称：chsh

使用权限：

所有使用者

用法：
chsh

说明：

更改使用者shell设定

范例：

＄chsh

Changing fihanging shell for user1

Password：

New shell［/bin/tcsh］：＃＃＃［是目前使用的shell］

＄chsh-l＃＃＃展示/etc/shells文件内容

/bin/bash

/bin/sh

/bin/ash

/bin/bsh

/bin/tcsh

/bin

/csh

名称：finger

使用权限：

所有使用者

使用方式：
finger［options］user［＠address］

说明：
finger可以让使用者查询一些其他使用者的资料。会显示来的资料有：

Login Name

User Name

主目录

Shell

Login status
mail status

.plan

.project

.forward

其中.plan，.project和.forward就是使用者在他的主目录里的.plan，.project和.forward等文件里的资料。如果没有就没有。finger指令并不限定于在同一服务器上查询，也可以寻找某一个远端服务器上的使用者。只要给一个像是E-mail address一般的地址即可。

选项：

-l：多行显示

-s：单行显示。这个选项只显示登入名称，真实姓名，终端机名称，闲置时间，登入时间，办公室号码及电话号码。如果所查询的使用者是远端服务器的使用者，这个选项无效

范例：

下列指令可以查询本机管理员的资料：
finger root

其结果如下：

Login：root Name：root

Directory：/root Shell：/bin/bash

Never logged in.

No mail.

No Plan.

名称：last

使用权限：

所有使用者

使用方式：
last［options］

说明：

显示系统开机以来或是从每月初登入者的信息

选项：

-R省略hostname的栏位

-num展示前num个
username展示username的登入信息
tty限制登入信息包含终端机代号

范例：

＄last-R-2
johnney pts/1 Mon Aug 14 20：42 still logged in
johnney pts/0 Mon Aug 14 19：59 still logged in
wtmp begins Tue Aug 109：01：10 2000＃＃＃/var/log/wtmp

＄last-2 minery
minery pts/0 140.119.217.115 Mon Aug 14 18：37-18：40（00：03）
minery pts/0 140.119.217.115 Mon Aug 14 17：22-17：24（00：02）
wtmp begins Tue Aug 109：01：10 2000

名称：passwd

使用权限：

所有使用者

使用方式：
passwd［-k］［-l］［-u［-f］［-d］［-S］［username］

说明：

用来更改使用者的密码

参数：

-d关闭使用者的密码认证功能，使用者在登入时将可以不用输入密码，只有具备root权限的使用者方可使用。

-S显示指定使用者的密码认证种类，只有具备root权限的使用者方可使用.

［username］指定帐号名称。

名称：who

使用权限：

所有使用者都可使用

使用方式：
who-［husfV］［user］

说明：

显示系统中有那些使用者正在上面，显示的资料包含了使用者ID，使用的终端机，从哪边连上来的，上线时间，呆滞时间，CPU使用量，动作等等。

选项：

-h：不要显示标题列

-u：不要显示使用者的动作/工作

-s：使用简短的格式来显示

-f：不要显示使用者的上线位置

-V：显示程序版本

名称：newaliases

使用权限：

系统管理者

使用方式：

请用newaliases更新资料库

说明：
sendmail会使用一个在/etc/aliases中的文件做使用者名称转换的动作。当sendmail收到一个要送给xxx的信时，它会依据aliases文件的内容送给另一个使用者。这个功能可以创造一个只有在信件系统内才有效的使用者。例如mailing list就会用到这个功能，在mailinglist中，我们可能会创造一个叫redLinux＠link.ece.uci.edu的mailinglist，但实际上并没有一个叫redLinux的使用者。实际aliases文件的内容是将送给这个使用者的信都收给mailing list处理程序负责分送的工作。

/etc/aliases是一个文字模式的文件，sendmail需要一个二进位格式的/etc/aliases.db。newaliases的功能传是将/etc/aliases转换成一个sendmail所能了解的资料库。

范例：

＃newaliases

下面命令会做相同的事：

＃sendmail-bi

名称：mail

使用权限：

所有使用者

使用方式：
mail［-iInv］［-s subject］［-c cc-addr］［-b bcc-addr］user1［user 2...］

说明：
mail不仅只是一个指令，mail还是一个电子邮件程序，不过利用mail来读信的人应该很少吧！对于系统管理者来说mail就很有用，因为管理者可以用mail写成script，定期寄一些备忘录提醒系统的使用者。

参数：
i忽略tty的中断信号（interrupt）

I强迫设成互动模式（Interactive）
v打显示信息，例如送信的地点、状态等等（verbose）
n不读入mail.rc设定文件
s邮件标题
c cc邮件地址
b bcc邮件地址

范例：

将信件送给一个或以上的电子邮件地址，由于没有加入其他的选项，使用者必须输入标题与信件的内容等。而user2没有主机位置，就会送给邮件服务器的user2使用者。

mail user1＠email.address
mail user1＠email.address user2

将mail.txt的内容寄给user2同时cc给user1。如果将这一行指令设成cronjob就可以定时将备忘录寄给系统使用者。

mail-s标题-c user1 user2＜mail. txt

指令：mesg

使用权限：

所有使用者

使用方式：
mesg［y｜n］

说明：

决定是否允许其他人传信息到自己的终端机界面

选项：
y：允许信息传到终端机界面上。

n：不允许信息传到终端机界面上。

如果没有设定，则信息传递与否则由终端机界面目前状态而定。范例：

改变目前信息设定，改成不允许信息传到终端机界面上：
mesg n

与mesg相关的指令有：talk，write，wall。

名称：talk

使用权限：

所有使用者

使用方式：
talk person［ttyname］

说明：

与其他使用者对谈

选项：
person：预备对谈的使用者帐号，如果该使用者在其他机器上，则可输入person＠machine.name
ttyname：如果使用者同时有两个以上的tty连线，可以自行选择合适的tty传信息

范例：

1.与现在机器上的使用者Rollaend对谈，此时Rollaend只有一个连线：
talk Rollaend

接下来就是等Rollaend回应，若Rollaend接受，则Rollaend输入“talk jzlee”即可开始对谈，结束请按ctrl＋c

2.与Linuxfab.cx上的使用者Rollaend对谈，使用pts/2来对谈：
talk Rollaend＠Linuxfab.cx pts/2

接下来就是等Rollaend回应，若Rollaend接受，则Rollaend输入“talk jzlee＠jzlee.home”即可开始对谈，结束请按ctrl＋c

注意：若屏幕的字会出现不正常的位，试着按ctrl＋l更新屏幕画面。

名称：wall

使用权限：

所有使用者

使用方式：
wall［message］

使用说明：
wall会将信息传给每一个mesg设定为yes的上线使用者。当使用终端机界面做为标准传入时，信息结束时需加上EOF（通常用Ctrl＋D）

范例：

传信息“hi”给每一个使用者：
wall hi

名称：write

使用权限：

所有使用者

使用方式：
write user［ttyname］

说明：

传信息给其他使用者

选项：
user：预备传信息的使用者帐号
ttyname：如果使用者同时有两个以上的tty连线，可以自行选择合适的tty传信息

范例：

1.传信息给Rollaend，此时Rollaend只有一个连线：
write Rollaend

接下来就是将信息打上去，结束请按ctrl＋c

2.传信息给Rollaend，Rollaend的连线有pts/2，pts/3：
write Rollaend pts/2

接下来就是将信息打上去，结束请按ctrl＋c

注意：若对方设定mesg n，则此时信息将无法传给对方

名称：kill

使用权限：

所有使用者

使用方式：
kill［-s signal｜-p］［-a］pid...

kill-l［signal］

说明：
kill送出一个特定的信号（signal）给进程id为pid的进程根据该信号而做特定的动作，若没有指定，缺省是送出终止（TERM）的信号

选项：

-s（signal）：其中可用的信号有HUP（1），KILL（9），TERM（15），分别代表着重启，中止，结束；详细的信号可以用kill-l

-p：显示pid，并不送出信号

-l（signal）：显示所有可用的信号名称

范例：

将pid为323的进程中止（kill）：
kill-9 323

将pid为456的进程重启（restart）：
kill-HUP 456

名称：nice

使用权限：

所有使用者

使用方式：
nice［-n adjustment］［-adjustment］［--adjustment＝adjustment］［--help］［--ver-sion］［command［arg...］］

说明：

以更改过的优先级来执行程序，如果未指定程序，则会显示目前的排程优先级，内定的adjustment为10，范围为-20（最高优先级）到19（最低优先级）

选项：

-n adjustment，-adjustment，--adjustment＝adjustment皆为将该原有优先级的增加adjustment

--help显示求助信息

--version显示版本信息

范例：

将ls的优先级加1并执行：
nice-n 1 ls

将ls的优先级加10并执行：
nice ls将ls的优先级加10并执行

注意：

优先级（priority）为操作系统用来决定CPU分配的参数，Linux使用『回合制（round-robin）』的演算法来做CPU排程，优先级越高，所可能获得的CPU时间就越多。

名称：ps

使用权限：

所有使用者

使用方式：
ps［options］［--help］

说明：

显示瞬间进程（process）的动态

参数：
ps的参数非常多，在此仅显示几个常用的参数并大略介绍含义

-A显示所有的进程

-w显示加宽可以显示较多的信息

-au显示较详细的信息

-aux显示所有包含其他使用者的进程
au（x）输出格式：

USER PID%CPU%MEM VSZ RSS TTY STAT START TIME COMMAND

USER：进程拥有者

PID：pid

%CPU：占用的CPU使用率

%MEM：占用的内存使用率

VSZ：占用的虚拟内存大小

RSS：占用的内存大小

TTY：终端的次要设备号码（minor device number of tty）

STAT：该进程的状态：

D：不可中断的静止

R：正在执行中

S：静止状态

T：暂停执行

Z：不存在但暂时无法消除

W：没有足够的内存分页可分配

＜：高优先级的进程

N：低优先级的进程

L：有内存分页分配并锁在内存内（即时系统或捱A I/O）

START：进程开始时间

TIME：执行的时间

COMMAND：所执行的指令

范例：
ps

PID TTY TIME CMD

2791 ttyp000：00：00 tcsh

3092 ttyp000：00：00 ps

%ps-A

PID TTY TIME CMD

1？00：00：03 init

2？00：00：00 kflushd

3？00：00：00 kpiod

4？00：00：00 kswapd

5？00：00：00 mdrecoveryd

……

%ps-aux

USER PID%CPU%MEM VSZ RSS TTY STAT START TIME COMMAND
root 10.00.7 1096 472？S Sep100：03 init［3］
root 20.00.000？SW Sep100：00［kflushd］
root 30.00.000？SW Sep100：00［kpiod］
root 40.00.000？SW Sep100：00［kswapd］

……

名称：pstree

使用权限：

所有使用者

使用方式：
pstree［-a］［-c］［-h｜-Hpid］［-l］［-n］［-p］［-u］［-G｜-U］［pid｜user］
pstree-V

说明：

将所有进程以树状图显示，树状图将会以pid（如果有指定）或是以init这个基本进程为根（root），如果有指定使用者id，则树状图会只显示该使用者所拥有的进程。

参数：

-a显示该进程的完整指令及参数，如果是被内存置换出去的进程则会加上括号

-c如果有重复的进程名，则分开显示（缺省值是会在前面加上*）

范例：
pstree
init-＋-amd

｜-apmd

｜-atd

｜-httpd---10*［httpd］

%pstree-p
init（1）-＋-amd（447）

｜-apmd（105）

｜-atd（339）

%pstree-c
init-＋-amd

｜-apmd

｜-atd

｜-httpd-＋-httpd

｜｜-httpd

｜｜-httpd

｜｜-httpd

……

名称：renice

使用权限：

所有使用者

使用方式：
renice priority［［-p］pid...］［［-g］pgrp...］［［-u］user...］

说明：

重新指定一个或多个进程（Process）的优先级（一个或多个将根据所下的参数而定）

选项：

-p pid重新指定进程的id为pid的进程的优先级

-g pgrp重新指定进程群组（process group）的id为pgrp的进程（一个或多个）的优先级

-u user重新指定进程拥有者为user的进程的优先级

范例：

将进程id为987及32的进程与进程拥有者为daemon及root的优先级号码加1：
renice＋1 987-u daemon root-p 32

注意：

每一个进程（Process）都有一个唯一的（unique）id

名称：top

使用权限：

所有使用者

使用方式：
top［-］［d delay］［q］［c］［S］［s］［i］［n］［b］

说明：

即时显示process的动态

选项：
d：改变显示的更新速度，或是在交谈式指令列（interactive command）按s
q：没有任何延迟的显示速度，如果使用者是有superuser的权限，则top将会以最高的优先级执行
c：切换显示模式，共有两种模式，一是只显示执行文件的名称，另一种是显示完整的路径与名称

S：累积模式，会将己完成或消失的子进程（dead child process）的CPU time累积起来
s：安全模式，将交谈式指令取消，避免潜在的危机
i：不显示任何闲置（idle）或无用（zombie）的进程
n：更新的次数，完成后将会退出top
b：批次文件模式，搭配“n”参数一起使用，可以用来将top的结果输出到文件内

范例：

显示更新十次后退出；
top-n 10

使用者将不能利用交谈式指令来对进程下命令：
top-s

将更新显示二次的结果输入到名称为top.log的文件里：
top-n 2-b＜top. log

名称：skill

使用权限：

所有使用者

使用方式：
skill［signal to send］［options］选择程序的规则

说明：

送个信号给正在执行的程序，缺省的信息为TERM（中断），较常使用的信息为HUP，INT，KILL，STOP，CONT，和0

信息有三种写法：分别为-9，-SIGKILL，-KILL，可以使用-l或-L显示可使用的信息。

一般参数：

-f快速模式/尚未完成

-i互动模式/每个动作将要被确认

-v详细输出/显示所选择程序的信息

-w智能警告信息/尚未完成

-n没有动作/显示程序代号

参数：

选择程序的规则可以是，终端机代号，使用者名称，程序代号，命令名称。

-t终端机代号（tty或pty）

-u使用者名称

-p程序代号（pid）

-c命令名称可使用的信号：

以下显示已知的信号名称，信号代号，功能。

名称（代号）功能/描述

ALRM 14退出

HUP 1退出

INT 2退出

KILL 9退出/强迫关闭

PIPE 13退出

POLL退出

PROF退出

TERM 15退出

USR1退出

USR2退出

VTALRM退出

STKFLT退出/只适用于i386，m68k，arm和ppc硬体

UNUSED退出/只适用于i386，m68k，arm和ppc硬体

TSTP停止/产生与内容相关的行为

TTIN停止/产生与内容相关的行为

TTOU停止/产生与内容相关的行为

STOP停止/强迫关闭

CONT从新启动/如果在停止状态则从新启动，否则忽略

PWR忽略/在某些系统中会退出

WINCH忽略

CHLD忽略

ABRT 6核心

FPE 8核心

ILL 4核心

QUIT 3核心

SEGV 11核心

TRAP 5核心

SYS核心/或许尚未实作

EMT核心/或许尚未实作

BUS核心/核心失败

XCPU核心/核心失败

XFSZ核心/核心失败

范例：

停止所有在PTY设备上的程序
skill-KILL-v pts/*

停止三个使用者user1，user2，user3
skill-STOP user1 user2 user3

其他相关的命令：kill

名称：expr

使用权限：

所有使用者

用法：

1.显示字符串长度

＄ expr length“this is a test”

14

2.数字商数

＄ expr 14%9

5

3.从位置处抓取字符串

＄ expr substr“this is a test”3 5
is is

4.数字符串，只显示第一次出现

＄ expr index“testforthegame”e

2

5.字符串真实重现

＄ expr quote thisisatestformela
thisisatestformela

名称：tr

用法：

1.把目录下所有的大写文件名换为小写文件名。

＃！/bin/sh
dir＝“/tmp/testdir”；
files＝｀find＄dir-type f｀；
for i in＄files
do

dir＿name＝｀dirname＄i｀；

ori＿filename＝｀basename＄i｀

new＿filename＝｀echo＄ori＿filename｜tr［：upper：］［：lower：］｀＞/dev/ null；

＃echo＄new＿filename；

mv＄dir＿name/＄ori＿filename＄dir＿name/＄new＿filename
done

2.小写变大写

＄ echo“this is a test”｜tr a-z A-Z

THIS IS A TEST

3.去掉不想要的字符串

＄echo“this is a test”｜tr-d this
a e

4.取代字符串

＄ tr-s“this”“TEST”

this

TEST
th

TE

名称：clear

用途：

清除屏幕用。

使用方法：

在console上输入clear。

名称：reset，tset

使用方法：
tset［-IQqrs］［-］［-e ch］［-i ch］［-k ch］［-m mapping］［terminal］

使用说明：
reset其实和tset是同一个命令，它的用途是设定终端机的状态。一般而言，这个命令会自动的从环境变数、命令列或是其他的组态文件决定目前终端机的型态。如果指定型态是？的话，这个程序会要求使用者输入终端机的型别。

由于这个程序会将终端机设回原始的状态，除了在login时使用外，当系统终端机因为程序不正常执行而进入一些奇怪的状态时，你也可以用它来重设终端机。例如不小心把二进位文件用cat指令输入到终端机，常会有终端机不再回应键盘输入，或是回应一些奇怪位的问题。此时就可以用reset将终端机回复至原始状态。选项说明：

参数：

-p：将终端机类别显示在屏幕上，但不做设定的动作。这个命令可以用来取得目前终端机的类别

-e ch：将erase位设成ch

-i ch：将中断位设成ch

-k ch：将删除一行的位设成ch

-l：不要做设定的动作，如果没有使用选项-Q的话，erase、中断及删除位的目前值依然会送到屏幕上

-Q：不要显示erase、中断及删除位的值到屏幕上

-r：将终端机类别印在屏幕上

-s：将设定TERM用的命令用字符串的形式送到终端机中，通常在.login或.profile中用

范例：

让使用者输入一个终端机型别并将终端机设到该型别的缺省状态。

＃reset？

将erase位设定control-h

＃reset-e＾B

将设定用的字符串显示在屏幕上

＃reset-s

Erase is control-B（＾B）.

Kill is control-U（＾U）.

Interrupt is control-C（＾C）.

TERM＝xterm；

名称：compress

使用权限：

所有使用者

使用方式：
compress［-dfvcV］［-b maxbits］［file...］

说明：
compress是一个相当古老的UNIX文件压缩指令，压缩后的文件会加上一个.Z延伸文件名以区别未压缩的文件，压缩后的文件可以以uncompress解压。若要将数个文件压成一个压缩文件，必须先将文件tar起来再压缩。由于gzip可以产生更理想的压缩比例，一般人多已改用gzip为文件压缩工具。

参数：
c输出结果至标准输出设备（一般指屏幕）
f强迫写入文件，若目的文件已经存在，则会被覆盖（force）
v将程序执行的信息打印在屏幕上（verbose）
b设定共同字符串数的上限，以位元计算，可以设定的值为9至16 bits。由于值越大，能使用的共同字符串就越多，压缩比例就越大，所以一般使用缺省值16 bits（bits）
d将压缩文件解压缩

V显示版本信息

范例：

将source.dat压缩成source.dat.Z，若source.dat.Z已经存在，内容则会被压缩文件覆盖。

compress-f source.dat

将source.dat压缩成source.dat.Z，并显示压缩比例。

-v与-f可以一起使用
compress-vf source.dat

将压缩后的资料输出后再导入target.dat.Z可以改变压缩文件名。

compress-c source.dat＞target.dat.Z

-b的值越大，压缩比例就越大，范围是9～16，缺省值是16。

compress-b 12 source.dat

将source.dat.Z解压成source.dat，若文件已经存在，使用者按y以确定覆盖文件，若使用-df程序则会自动覆盖文件。由于系统会自动加入.Z为延伸文件名，所以source.dat会自动当作source.dat.Z处理。

compress-d source.dat
compress-d source.dat. Z

名称：lpd

使用权限：

所有使用者

使用方式：
lpd［-l］［＃port］

说明：
lpd是一个常驻的打印机管理程序，它会根据/etc/printcap的内容来管理本地或远端的打印机。/etc/printcap中定义的每一个打印机必须在/var/lpd中有一个相对应的目录，目录中以cf开头的文件表示一个等待送到适当设备的印表工作。这个文件通常是由lpr所产生。

lpr和lpd组成了一个可以离线工作的系统，当你使用lpr时，打印机不需要能立即可用，甚至不用存在。lpd会自动监视打印机的状况，当打印机上线后，便立即将文件送交处理。这个使所有的应用程序不必等待打印机完成前一工作。

参数：

-l：将一些出错信息显示在标准输出上。

＃port：一般而言，lpd会使用getservbyname取得适当的TCP/IP port，你可以使用这个参数强迫lpd使用指定的port。

范例：

这个程序通常是由/etc/rc.d中的程序在系统启动阶段执行。

名称lpq

作用：

显示打印机队列中未完成的工作

用法：
lpq［l］［P］［user］

说明：
lpq会显示由lpd所管理的打印机队列中未完成的项目。

范例：

1.显示所有在lp打印机队列中的工作

＃lpq-PlpRank

名称：lpr

使用权限：

所有使用者

使用方式：
lpr［-P printer］

说明：

将文件或是由标准输入送进来的资料送到打印机队列之中，打印机管理程序lpd会在稍后将这个文件送给适当的程序或设备处理。lpr可以用来将文件送给本地或是远端的主机来处理。

参数：

-p Printer：将资料送至指定的打印机Printer，缺省值为lp。

范例：

将www.c和kkk.c送到打印机lp。

lpr-Plp www.c kkk. c

名称：lprm

作用：

将一个工作从打印机队列中删除

用法：

/usr/bin/lprm［P］［file...］

说明：

尚未完成的打印机工作会被放在打印机队列之中，这个命令可用来将尚未送到打印机的工作取消。由于每一个打印机都有一个独立的队列，你可以用-P这个命令设定想要作用的打印机。如果没有设定的话，会使用系统缺省的打印机。

这个命令会检查使用者是否有足够的权限删除指定的文件，一般而言，只有文件的拥有者或是系统管理员才有这个权限。

范例：

将打印机hpprinter中的第1123号工作删除
lprm-Phpprinter 1123

将第1011号工作从缺省打印机中删除
lprm 1011

名称：fdformat

使用权限：

所有使用者

使用方式：
fdformat［-n］device

使用说明：

对指定的软驱设备进行低级格式化。使用这个指令对软盘格式化的时候，最好指定像是下面的设备：

/dev/fd0d360软驱A：，磁盘为360KB软盘

/dev/fd0h1440软驱A：，磁盘为1.4MB软盘

/dev/fd1h1200软驱B：，磁盘为1.2MB软盘

如果使用像是/dev/fd0之类的设备，如果里面的软盘不是标准容量，格式化可能会失败。在这种情况之下，使用者可以用setfdprm指令先行指定必要参数。

参数：

-n关闭确认功能。这个选项会关闭格式化之后的确认步骤。

范例：
fdformat-n/dev/fd0h1440

将软驱A的磁盘格式化成1.4MB的磁盘。并且省略确认的步骤。

名称：mformat

使用权限：

所有使用者

使用方式：
mformat［-t cylinders］［-h heads］［-s sectors］［-l volume＿label］［-F］［-I fsVer-sion］［-S sizecode］［-2 sectors＿on＿track＿0］［-M software＿sector＿size］［-a］［-X］［-C］［-H hidden＿sectors］［-r root＿sectors］［-B boot＿sector］［-0 rate＿on＿track＿0］［-A rate＿on＿other＿tracks］［-1］［-k］drive：

在已经做过低级格式化的磁盘上建立DOS文件系统。如果在编译mtools的时候把USE＿2M的参数打开，部分与2M格式相关的参数就会发生作用。否则这些参数（像是S，2，1，M）不会发生作用。

参数：

-t磁柱（cynlider）数

-h磁头（head）数

-s每一磁道的扇区数

-l标签

-F将软盘格式化为FAT32格式，不过这个参数还在实验中。

-I设定FAT32中的版本号。这当然也还在实验中。

-S扇区大小代码，计算方式为sector＝2＾（大小代码＋7）

-c族（cluster）的扇区数。如果所给定的数字会导致族数超过FAT表的限制，mformat会自动放大扇区数。

-M软件扇区大小。这个数字就是系统回报的扇区大小。通常是和实际的大小相同。

-a如果加上这个参数，mformat会产生一组Atari系统的序号给这块软盘。

-X将软盘格式化成XDF格式。使用前必须先用xdfcopy指令对软盘作低级格式化的动作。

-C产生一个可以安装MS-DOS文件系统的软盘镜像文件（disk image）。当然对一个实体软驱下这个参数是没有意义的。

-H隐藏扇区的数目。这通常适用在格式化硬盘的分区时，因为通常一个分区的前面还有分割表。这个参数未经测试，能不用就不用。

-n软盘序号

-r根目录的大小，单位是扇区数。这个参数只对FAT12和FAT16有效。

-B使用所指定的文件或是设备的开机扇区作为这片磁盘或分区的开机扇区。当然当中的硬体参数会随之更动。

-k尽量保持原有的开机扇区。

-0第0道的资料传输率

-A第0道以外的资料传输率

-2使用2m格式

-1不使用2m格式

范例：
mformat a：

这样会用缺省值把a：（就是/dev/fd0）里的软盘片格式化。

名称：mkdosfs

使用权限：

所有使用者

使用方式：
mkdosfs［-c｜-l filename］［-f number＿of＿FATs］［-F FAT＿size］［-i volume＿id］［-m essage＿file］［-n volume＿name］［-r root＿dir＿entry］［-s sector＿per＿cluster］［-v］device［block＿count］

说明：

建立DOS文件系统。device指你想要建立DOS文件系统的设备代号。像是/dev/ hda1等等。block＿count则是你希望配置的区块数。如果block＿count没有指定，则系统会自动替你计算符合该设备大小的区块数。

参数：

-c建立文件系统之前先检查是否有坏道

-l从指定的文件中读取坏道记录

-f指定文件分配表（FAT，File Allocation Table）的数量。缺省值为2。目前Linux的FAT文件系统不支持超过2个FAT表。通常这个不需要改

-F指定FAT表的大小，通常是12或是16个字节。12字节通常用于软盘片，16字节用于一般硬盘的分区，也就是所谓的FAT16格式。这个值通常系统会自己选定适当的值。在软盘片上用FAT16通常不会发生作用，反之在硬盘上用FAT12亦然。

-i指定Volume ID。一般是一个4个字节的数字，像是2e203a47。如果不给，系统会自己产生

-m当使用者试图用这片磁盘或是分区开机，而上面没有操作系统时，系统会给使用者一段警告信息。这个参数就是用来变更这个信息的。你可以先用文件编辑好，然后用这个参数指定，或是用

-m-

这样系统会要求你直接输入这段文字。要特别注意的是，文件里的字符串长度不要超过418个字，包括展开的跳栏符号（TAB）和换行符号（换行符号在DOS底下算两个位！）

-n指定Volume Name，就是软盘标签。如同在DOS底下的format指令一样，给不给都可以。没有缺省值

-r指定根目录底下的最大文件数。这里所谓的文件数包括目录。缺省值是在软盘上是112或是224，在硬盘上是512。没事不要改这个数字

-s每一个族（cluster）的扇区数。必须是2的次方数。不过除非你知道你在做什么，这个值不要乱给

-v提供额外的信息

范例：

将软盘驱动器A里的软盘片格式化为DOS格式，并将标签设为Tester
mkdosfs-n Tester/dev/fd0

附录B　Linux常用配置文件

/etc/DIR＿COLORS：

设定在使用ls时，各种不同文件类型所用的颜色，但是不能用pipe再导向输出，否则就没有各种颜色了。由文件的内容可以很轻易地了解，如缺省的目录是蓝色，具有可执行权限的是绿色，而压缩文件是红色……这些都可依个人喜好来加以更改。在颜色的组成方面，我们常用RGB三原色的成份值来组合出各种不同的颜色。由RGB这个bit是0或是1三个值组合出颜色这个道理虽浅显，但假如我们更了解R，G，B的加权值分别是1，2，4的话，那就再也不用翻书查颜色了……选择自己的调色盘来取代缺省的调色盘，是经常会做的事。

/etc/HOSTNAME：

记录完整的主机名（hostname）与域名（domain name），这个文件在需要hostname的场合会用得到，如/etc/rc.d/rc.M等。

/etc/NETWORKING：

YES，没什么用，改成NO会怎样呢？会对网络的使用造成影响吗？答案是否定的。

/etc/X11：
link到/var/X11/lib/X11。

/etc/at.deny：

在这个文件中可记载哪些人不能使用at这个命令来做一些在以后的时间执行一次的任务。假如at.deny是空的，而且at.allow也不存在的话，那就是每个人都可以用at这个命令。

/etc/at.allow：

相对于at.deny，这个文件记载哪些人可以使用at这个指令。关于at.deny与at.allow，at会先去找at.allow，假如存在而且有记录一些人的话，那就只有这些人能使用at这个指令，但假如at.allow并不存在的话，那at就会去找at.deny，没有在at.deny中的人都可以使用at这个指令了。

/var/spool/atjobs：

当你使用at来安排一件工作时，系统会把你目前的环境变数及所要用at执行的工作抄一份到这个目录下的文件中。

/var/spool/atspool：

使用at命令之后所得到的一些信息，会被记录在这里。可能是at所要执行的命令传回的错误信息，或传回执行成功的信息。

/etc/csh.cshrc、/etc/csh.login：

这两个文件是常见到的.cshrc及.login，不过普通用户只注意到自己的主目录有这两个文件，但/etc下也有这两个文件，不过/etc下的这两个文件绝大部份的情况下都是由系统管理员在维护，一般用户不应该有权力去改。顺便一提的是，系统会先去找/etc下这两个文件，接着才加上自己主目录中那两个文件的设定。当然，有了.login也有.logout，.logout中可以写一些message，或执行一些命令，当你下达logout之后，.logout就会被执行。

/etc/disktab：

假如你在刚开机需要传递一些参数给内核的话，比如硬盘比较特别，需要传递cylinders，heads，sectors给内核，或者是SCSI的硬盘有时也要用到一些参数，那这些参数就会被记录在这里。

/etc/exports：

这个文件记录着你要给别人mount的文件系统，这就是典型NFS系统所存在的文件，若要使用NFS而要把自己的文件系统让别人装载的话，这个文件也是不可或缺的。

/etc/fastboot：

这个文件是使用shutdown-f所产生的，-f的意思是“fastboot”。在重新reboot之后，系统会去检查这个文件是否存在，以决定是否要runfsck。

/etc/fdprm：

Floopy disk parameter table。一般情况下是不需要更动的，除非你有很奇怪格式的软盘，或者你想做出不符合一般格式的软盘片。

/etc/fstab：

记录开机要装载上来的文件系统，这个文件相当重要。在/etc/rc.d/rc.S中找到/ sbin/mount-avtnonfs这一列，当执行到这一列时，mount就依据/etc/fstab中的记载，自动地将文件系统装载上来。假如你一开机就想自动装载一些文件系统，而不要等到开机后再以手动装载的话，那把这些文件系统及相关信息写在这个文件是不错的选择。在文件格式方面，每一列有六个栏位，不过后面两个栏位常被省略，所以我们只看到有四个栏位。其他的两栏分别为dump-freq及pass-number。dump-freq缺省值为0；而pass-number是fsck所会参考到的地方，数字可为0，1，2……1表示这个filesystem将首先被fsckcheck，2表其次，其余类推……

/etc/ftpusers：这个文件记录哪些人不可以ftp登录系统，缺省值有root，uucp，news。这些都是为了安全方面的考虑，你可以在这里加入不可ftp进来的userid。

/etc/gateways：

顾名思义，这个文件记录一些网关的信息，这个文件的格式如下：

＜net｜host＞name1 gateway name2 metric value＜passive｜active｜external＞

当routed启动时，它会去读/etc/gateways这个文件。若一个网关并不做路由信息交换的话，那它就会被标示成passive，假如有做路由信息的交换，即这台机器上在运行routed，那就会标示成active net或host，这个关键字是指出route是到网络或是到一台特定的机器上。name1就是目的网络或目的机器的名字，这个名字可用/etc/hosts或是/ etc/networks中的符号地址name，name2就是信息将被送往之网关的名字或IP地址。

/etc/group：

如同/etc/passwd显示了系统中所有的使用者名字，/etc/group定义系统中所有的组与组的相关信息。这个文件只能被管理员所读写，管理员可使用groupadd，groupdel，groupmod来管理/etc/group这个文件，要手动管理也是可以的。

/etc/hosts：

这个文件记录着IP地址和主机名的映射关系。在这个文件中，至少会有两列，一列为loopback，这是为了检错目的而设的，另一列为localhost，就是你自己的机器。

/etc/hosts.equiv：

在里面可以设定一些远程机器，而从这些远程机器利用rsh或rlogin连回本机的话，便不用输入密码，同样的东西也可以在.rhosts见到。不过这东西最好不要乱设，以信得过的hosts为主，才不会造成安全上的困扰。

/etc/hosts.deny：

设定哪些远程机器不可以使用inetd。

/etc/hosts.allow：

设定哪些远程机器可以使用inetd。至于inetd有哪些service，可以参考/etc/ inetd.conf，从里面就可以很清楚地看出来。假如你采取比较稳妥做法的话，可以在hosts.deny中写ALL：ALL。然后在hosts.allow中加入可以访问的主机。

/etc/hosts.lpd：

记录可访问打印机的主机。假如一台打印机可被网络上的许多台主机所共用，那printcap这个文件必须得描述完整的网络设定信息。在比较严密控制的情况下，有两个条件必须符合。首先，本地机器必须在远程机器的/etc/hosts.eqiuv中，或者，在远程机器的/etc/hosts.lpd中被记载。其次，使用者必须有远程机器的帐号。

/etc/issue：

这个文件记录着登录前所要显示的提示信息。

/etc/ld.so.conf：

记录一些library所在的目录

/etc/magic：

初看这个文件时，也许只能隐隐约约地看到：这个文件似乎是描述一些文件的格式。没错，这个文件记载了许多文件格式的识别字串或方法。当使用file这个指令时，它可以告诉你某一个文件的格式，如它是一个text文件，或是一个shellscript或DOS可执行文件等……而file这个指令，就是去参考/etc/magic这个资料库。假如你知道某一文件的识别字，而原来magic这个资料库没有记录，那你可以把识别方法加到资料库中，或干脆建立自己的资料库算了。

/etc/motd：

这个文件很简单，就是message of the day的意思，里面可以写一些提示信息，而这些提示信息会在登录shell之前被显示出来。通常都是系统管理员要告知用户的一些信息。

/etc/mtab：

目前mount上来的filesystems，各位可使用mount这个指令来看看这个文件的变化。

/etc/mtools：

这里面记录的，是给/usr/bin/mtools参考用的参数。mtools是一群操作MSDOS文件的命令集合，可用的命令很多。这些都被link到mtools。

/etc/named.boot：

假如你要建立域名服务器的话，那这个文件就是你要修改的地方。详细的情况可以去看named的手册就知道了。

/etc/networks：

这个文件与hosts有点像，都是在启动的时候会用到的东西，在这里可以定义一个子网络与其IP地址对应。

/etc/nntpserver：

这个文件记录着newsserver，当我们使用tin-r（readnews remotely）时，这个文件会被参考到，若这个文件不存在的话，那环境变数NNTPSERVER所指定的server就会被当成要去取得news的server。

/etc/nologin：

这个文件平常是不存在的，通常看到这个文件的话，那表示系统大概要shutdown了，因为系统要shutdown了，自然不希望有人又login进来，所以在我们执行shutdown时，nologin这个文件会自动地被创建，里面放着关机提示信息。实际上，当我们在登录时，系统会去检查有没有这个文件，假如有的话，那就会显示这个文件中的内容，然后不让你登录。nologin也有可能是为了某种理由被制造的，比如说系统在维护时，暂时不希望有人登录。无论如何nologin若存在，就不能登录。

/etc/passwd：

这个文件很重要，记录了用户帐号信息。文件内容每列的格式如下：

LoginName：EncryptedPassword：UID：GID：GCOS：Home Directory：Login Shell

Login Name：每个login name必须是唯一的，而且不能超过8个字符，一般说来，login name虽然可以大小写混合，但平常的情况下都用小写。顺便一提的是/usr/lib/ aliases这个文件，修改这个文件的内容可以使mail时用超过8个字符的文件。

Encrypted Password：这栏是编码过的密码，在新增一个用户时，应该在这栏填上*，更改password可用passwd。

UID：userid，每个用户的UID都要不一样，习惯上，一定数字以前被保留做为特殊的userid，而root总是0。

GID：groupid，用户的主要组的GID。

GCOS：这栏基本上没有特殊格式限制，在这里可以写上你的full name，家庭电话，住址……爱写什么就写什么。虽然你可以乱写一通，但若你用到逗号，系统会把它当成区间。

Home Directory：这栏没什么，就是记录用户的主目录而已。

Login Shell：设定使用者所使用的shell，缺省值是/bin/bash。

为了安全方面的考虑，可以使用shadow，将passwd这个文件中密码加密后保存在/etc/shadow中。

/etc/profile：
profile这个文件是bash这个shell所用的，profile之于bash就好像cshrc之于csh。同样的，/etc下的profile也是管理员在维护的，主要是放着全局的设定，而每个用户在自己的主目录都可以有各人的.profile。

/etc/protocols：

假如你为了某些目的，而写了自己的protocol，那你就必须把它列在这个文件中，这样inetd才会管理一些daemons去用它。

/etc/psdatabase：

这个文件是被psupdate所用到，psupdate主要的功能就是更新/etc/psdatabase这个文件，以符合目前的kernel image system mapfile。一般的缺省文件是/usr/src/ Linux/tools/zSystem。

/etc/resolv.conf：

这里面记载着你机器的域名及域名服务器的IP地址，域名服务器可以自己加入。

/etc/securetty：

假如你要以root登录的话，实际上是有限制的，这个文件就列出了root可以登录的ttys，假如你把每一列都注释起来，那就没有任何一个terminal可供root登录了。

/etc/services：

系统提供的服务与端口的对应。

/etc/shell：

这个文件再简单也不过了，里面就记录着可以用的login shell。还有一点，那就是这个文件的记录会在使用chsh时作为参考，唯有被列在这里的shell，使用chsh时才会出现这些shell可选。

/etc/sudoers：

在一个不是很复杂的系统中，也许一个系统管理员就可以管理所有的事情。但一旦系统提供的服务变多，系统管理的工作也随之变得沉重，这时候，sudo就派上用场了，sudo可以让一个普通的user变成superuser，这样一来，一个系统的某些工作，就可以分配给这些superusers来做，以减轻负担。

当然，并不是每个user都可以变成superuser，所以/etc/sudoers就是记录着哪些人可以用superuser的身份来执行一些工作，这个文件的格式如下：

/var/run/utmp：

从utmp中可以知道现在有谁正在用系统。当使用者logout之后，init就去把logout的使用者从/etc/utmp中去掉。实际上，utmp每个record是像这样的一个结构：
structutmp｛
shortut＿type；/*typeoflogin*/
pid＿tut＿pid；/*pidofprocess*/
charut＿line［12］；/*devicenameoftty-”/dev/”*/
charut＿id［2］；/*initidorabbrev.ttyname*/
time＿tut＿time；/*logintime*/
charut＿user［8］；/*username，notnull-term*/
charut＿host［16］；/*hostnameforremotelogin*/
longut＿addr；/*IPaddrofremotehost*/

｝；

/var/log/wtmp：

简而言之，wtmp是一个登录记录的数据库，有许多的指令会用到这个文件，像last，sessreg，who…这个文件格式与utmp大致相同，只是多了shutdown及reboot这个记录，指出系统的shutdown或reboot，及一个空的username，指出在相关terminal的logout。还有，不像utmp，wtmp的记录是慢慢地附加上去的，也就是说，这个文件会越变越大，虽然变大的速度并不会太快，但一旦到了某种程度大小的话系统管理员应该要考虑删除部分内容。

/etc/zprofile：
link到/etc/profile。

参考文献

［1］孟庆昌.Linux教程.北京：电子工业出版社

［2］Jerry Peek O’Reilly，等著.UNIX超级工具（第二版）.张志龙等译，北京：中国电力出版社

［3］Jeffrey Dean，O’Reilly.LPI Linux认证权威指南（影印版）.南京：东南大学出版社

［4］梁如军.Red Hat Linux 9应用基础教程.北京：机械工业出版社

［5］徐德民.操作系统原理Linux篇.长沙：国防工业出版社