首页资源分类嵌入式系统 > 鸟哥的私房菜 linux

鸟哥的私房菜 linux

已有 445122个资源

下载专区

上传者其他资源

    嵌入式系统热门资源

    本周本月全部

    文档信息举报收藏

    标    签:鸟哥的私房菜linux

    分    享:

    文档简介

    鸟哥的私房菜  linux

    文档预览

    仅发 Linux 伊甸园 鸟哥的 Linux 私房菜 文档收集: 檸檬dё單純 尊重作者鸟哥,转载请示出处! 交流群: 7744707 Welcome You!!! 什么是 Linux 最近更新日期:2006/05/31 众所皆知的, Linux 的核心原型是 1991 年由托瓦兹 (Linus Torvalds) 写出来的, 但是托瓦兹为何可以写 出 Linux 这个操作系统?为什么他要选择 386 的计算机来开发? 为什么 Linux 的发展可以这么迅速? 又为什么 Linux 是免费的? 以及目前为何有这么多的 Linux 版本 (distributions) 呢? 了解这些东西后, 才能够知道为何 Linux 可以免除专利软件之争, 并且了解到 Linux 为何可以同时在个人计算机与大型主 机上面大放异彩! 所以,在实际进入 Linux 的世界前,就让我们来谈一谈这些有趣的历史故事吧! ^_^ 1. 什么是 Linux 1.1 计算器:计算的辅助工具 1.2 什么是操作系统? 1.3 Linux 之前,Unix 的历史 1.4 关于 GNU 计划 2. Torvalds 的 Linux 发展 2.1 与 Minix 之间 2.2 对 386 硬件的多任务测试 2.3 初次释出 Linux 0.02 2.4 Linux 的发展:虚拟团队的产生 2.5 Linux distributions 3. Linux 的特色 3.1 Linux 的特色 3.2 Linux 的优缺点 3.1 其它 Linux 相关 4. 重点回顾 5. 本章练习 6. 参考数据 7. 针对本文的建议:http://phorum.vbird.org/viewtopic.php?t=23871 什么是 Linux ? Linux 这玩意儿是在计算机上面运作的,所以,当然得要了解一下计算机这玩意儿。首先,到底有哪些种 类的计算机呢? 而 Linux 可以在哪些种类的计算机上面运作?且 Linux 源自哪里?这些我们都得来谈 一谈先! 计算器:计算的辅助工具 在目前的都市生活中,您应该很难不接触到计算机这个玩意儿吧? 这个计算机当初在开发的时候,是希望 可以辅助与简化人们进行大量的运算工作, 后来才发展成为一些特殊用途。无论如何,计算机基本的功能 就是: 『接受使用者输入指令,经由 CPU 的数学与逻辑单元运算处理后, 以产生或储存成有用的信息』。 为了达成这个功能,当然计算机就必须要有: • 输入单元:例如鼠标、键盘、卡片阅读机等等 • 中央处理器(CPU):含有算数逻辑、控制、记忆等单元 • 输出单元:例如屏幕、打印机等等 如果您看过计算机的话,那么上面的东西其实就是组成您计算机的主要组件啰! 而为了连结各个组件,因 此有了主机板,所以,您的主机里面就包含了主机板以及 CPU , 还有各种需要的适配卡。而屏幕、键盘、 鼠标则透过与主机的连结,就构成一部可以运作的计算机了。 另外,由于计算机仅认识 0/1 ,因此计算 机主要是以二进制的方式来计算的, 因此,通常计算机的记忆/储存单位都是以 Byte 或 bits 为基本单 位。他们的单位是这样的: • 1 Bytes = 8 bits • 1 KB = 1024 Bytes • 1 MB = 1024 KB • 1 GB = 1024 MB 而计算机也因为他的复杂度,而分为数种等级,例如: • 超级计算机(Supercomputer): 超级计算机是运作速度最快的计算机,但是他的维护、操作费用也最高! 主要是用于需要有高速 计算的计划中。例如:国防军事、气象预测、太空科技, 用在模拟的领域较多。详情也可以参考: 国家高速网络与计算中心http://www.nchc.org.tw/ 的介绍! 至于全世界的 500 大超级计算机, 则请参考:http://www.top500.org/ • 大型计算机(Mainframe Computer): 大型计算机通常也具有数个高速的 CPU ,功能上虽不及超级计算机, 但也可用来处理大量资料 与复杂的运算。例如大型企业的主机、 全国性的证券交易所等每天需要处理数百万笔数据的企业 机构, 或者是大型企业的数据库服务器等等。 • 迷你计算机(Minicomputer): 迷你计算机仍保有大型计算机同时支持多使用者的特性,但是主机可以放在一般作业场所, 不必 像前两个大型计算机需要特殊的空调场所。通常用来作为科学研究、 工程分析与工厂的流程管理 等。 • 微电脑(Microcomputer): 又可以称为个人计算机,也是我们这本书主要探讨的目标!体积最小,价格最低, 但功能还是五 脏俱全的!大致又可分为桌上型、笔记型等等。 虽然在目前个人计算机的使用甚为广泛,但是在 1990 年以前,个人计算机是比较不被重视的! 因为(1) 他的运算速度在当时实在很差,而且(2)当时比较有名的操作系统也没有对个人计算机支持。 所以才会流 行不太起来~ 嘿嘿!提到操作系统啰~ 底下我们就来谈一谈之前的操作系统。 什么是操作系统 什么是操作系统 (Operation System, OS) 呢?我们先来想一想, 上面介绍的计算器(计算机)是如何工作 的?举例来说,您计算机屏幕上面显示的讯息, 是如何显示出来的呢?嗯!是藉由显示卡与屏幕显像的。 那么如果你想要看 VCD 呢? 呵呵,就需要 1.)有影音数据的光盘片、 2.)可读取光盘片的光驱、 3.) 可 以转换影音数据输出的中央处理器 (CPU)、 4.)可以显示影像的显示芯片(显示卡)、 5.) 可以传输声音的 音效芯片(声卡)、 6.)可以输出影像的屏幕以及 7.)可以发出声音的喇叭! 也就是说:所有在『工作』的 东西都是『硬件』呀! 对啦!就是硬件在工作! 那么问题来了,现在我们知道,计算机所进行的工作都是计算机硬件帮我们达成的,但是, 为什么这些硬 件知道如何播放 VCD 呢?这当然是因为有某个东西在正确的控制硬件的工作了, 那个咚咚就是: 操作系 统 啦! 操作系统可以管理整部计算机的硬件,他可以控制 CPU 进行正确的运算, 他可以分辨硬盘里头 的数据并进行读取,他还必须要能够认识所有的适配卡, 这样,才能够将所有的硬件通通正确的使用上啊! 所以,如果没有这个操作系统,那么您的计算机就等于是一堆废铁而已啊! 虽然操作系统可以完整的掌控所有的硬件资源,但是,对于使用者来说,还是不够的! 因为操作系统虽然 可以掌控所有的硬件,但是,如果使用者无法与操作系统沟通, 那么这个操作系统就没有什么用处了。简 单的来说,以上面的 VCD 为例, 虽然操作系统可以控制硬件播放 VCD ,但是,如果使用者没有办法控制 何时要播出 VCD 的话, 那么到底我们要怎么看 VCD 啊?对吧! 所以说,一个比较『完整的操作系统』应该要包含 两个东西,一个是『核心与其提供的接口工具』、 一 个是『利用核心提供的接口工具所开发出来的软件』。 我们以大家常使用的 Windows 计算机来做一个简 单的说明好了。大家应该都使用过 Windows 计算机里面的『档案总管』吧!当你开启档案总管的时候,他 就会显示你硬盘当中的数据, 这个『显示硬盘里面的数据,就是核心帮你做的』,但是, 『你要核心去 显示硬盘哪一个目录下的数据,则是由档案总管这个工具帮你达成的』! 这样可以理解吗? 那么核心有没有作不到的事?当然有的,举例来说, 如果您曾经自行安装过比较新的显示卡在您的个人计 算机上面, 那么应该常常会发生 Windows 计算机告知您:『找不到合适的驱动程序来显示』的问题吧? 也 就是说,即使您有最新的显示卡安装在您的个人计算机上面,而且也有播放 VCD 的程序, 但是因为『核 心』无法操控这个最新的显示卡,所以,就无法正常的显示您的 VCD 了。 没错!你的整个硬件是由核心 来管理的,而如果核心不认识你的硬件, 那么你将无法使用该硬设备,例如上面提到的最新的显示卡。 Tips: 在定义上,只要能够让计算机硬件正确无误的运作,那就算是操作 系统了。 所以说,操作系统其实就是核心与其提供的接口工具, 不 过,就如同上面讲的,因为最阳春的核心缺乏了与使用者沟通的亲 和接口, 所以在目前,一般我们提到的『操作系统』都会包含核 心与相关的使用者应用软件呢! 核心就是『Kernel』, 他是一个操作系统的最底层的东西,由他来掌管整个硬件资源的工作状态,而 每 个操作系统都有自己的核心,所以说, 当有新的硬件加入到你的系统中的时候,若你的『 Kernel 』并没 有支援他的时候,呵呵,这个新的硬件就肯定无法工作的,因为控制他的 Kernel 并不认识他呀!这样了 解了吗?!先有个概略性的了解, 后面我们提到『核心编译』的时候会再更详细的谈到他! 一般来说,Kernel 为了达成使用者所需要的正确运算结果,他必须要管理的事项有: • 系统呼叫接口(System call interface) : 为了方便程序开发者可以轻易的透过与 kernel 的沟 通,将硬件的资源进一步的利用, 于是需要有这个简易的接口来方便程序开发者。 • 行程管理(Process control) : 总有听过所谓的『多任务环境』吧?一部计算机可能同时间有很 多的工作跑到 CPU 等待运算处理, Kernel 这个时候必须要能够控制这些工作,让 CPU 的资源 作有效的分配才行! • 内存管理(Memory management) : 控制整个系统的内存管理,若内存不足, Kernel 最好还能够 提供虚拟内存的功能! • 档案系统管理(File system management) : 档案系统的管理,例如数据的输入输出 (I/O) 等等 的工作啦! 还有不同档案格式的支持啦等等,如果你的核心不认识某个档案系统, 那么您将无 法使用该档案格式的档案啰!例如: Windows 98 就不认识 NTFS 档案格式的硬盘; • 装置的驱动(Device drivers) : 就如同上面提到的,硬件的管理是 Kernel 的主要工作之一, 当然啰,装置的驱动程序就是核心需要做的事情啦! 好在目前都有所谓的『可加载模块』功能, 可以将驱动程序编辑成模块, 就不需要重新的编译核心啦!这个也会在后续的核心编译当中提到 的! 所以啦!所有硬件的资源都是 kernel 来管理的!至于我们要达成一些工作时,除了藉由核心本身提供的 功能 ( 例如上面提到的档案总管 ) 之外,还可以藉由其它的应用软件来达成喔!举个例子来说,你要看 VCD 影片是吧!那么除了 Windows 提供的媒体播放程序之外,你也可以自行安装 VCD 播放程序来播放 VCD 啰!这个播放程序就是应用软件啰,而这个应用软件可以帮你去控制核心来工作 ( 就是放映影片啰 ) , 因此,我们可以这样说, 核心是控制整个硬件支持的咚咚,也是一个操作系统的最底层, 然而要让整个 操作系统更完备的话,那还需要含有相当丰富的核心提供的工具, 以及核心相关的应用软件来支持。 OK!提到这里那么您知道 Linux 是什么了吗?呵呵!对啦!其实 Linux 就是一个操作系统,这个操作系 统里头含有最主要的 kernel 以及 kernel 提供的工具啦!他提供了一个完整的操作系统当中最底层的硬 件控制与资源管理的完整架构, 这个架构是沿袭 Unix 良好的传统来的,所以相当的稳定而功能强大!此 外, 由于这个优良的架构可以在目前的个人计算机( X86 系统 ) 上面跑, 所以很多的软件开发者将他们 的工作心血移转到这个架构上面,那就是很多的应用软件啦! 虽然 Linux 仅是其核心与核心提供的工具, 不过,由于核心、核心工具与这些软件开发者提供的软件的整合,使得 Linux 成为一个更完整的、功能强 大的操作系统啰!我们可以将 Linux 的系统与使用者的相关性看成底下的图示: 图一、使用者、使用者接口与核心工具、核心、与硬件之相关性 约略了解 Linux 是何物之后,接下来,我们要谈一谈,『为什么说 Linux 是很稳定的操作系统呢?他是 如何来的?』 Tips: Torvalds 先生在写出 Linux 的时候,其实该核心仅能『驱动 386 所有的硬件』而已, 所谓的『让 386 计算机开始运作,并且等待 使用者指令输入』而已,事实上, 当时能够在 Linux 上面跑得软 件还很少呢! Tips: 由上面的说明中,我们知道硬件是由『核心』来控制的,而每种操 作系统都有他自己的核心。 这就产生了一个很大的问题,因为早 期硬件的开发者所开发的硬件架构或多或少都不相同, 举例来说, 2006 年以前的麦金塔是请 IBM 公司开发自己的硬件与操作系统, Windows 则是开发在 x86 架构上的操作系统之一, 那么 Windows 是否可以在麦金塔上面跑?答案是『不行』的!不过,在 2006 年 以后, 麦金塔转而请 Intel 设计其硬件架构,亦即其硬件架构已 经转为 x86 系统,因此在 2006 年以后的麦金塔若使用 x86 架构 时,其硬件则『可能』可以安装 Windows 操作系统了。 Tips: 因为 Windows 操作系统本来就是针对个人计算机 x86 架构的硬 件去设计的,所以他当然只能在 x86 的个人计算机上面运作,在 不同的平台,当然就无法运行了。也就是说, 每种操作系统都是 在他专门的机器上面运行的喔!这点得要先了解。不过,Linux 由 于是 Open Source 的操作系统,所以他的程序代码可以被修改成 适合在各种机器上面运行的, 也就是说, Linux 是具有『可移植 性』,这可是很重要的一个功能喔! ^_^ Linux 之前, Unix 的历史 早在 Linux 出现之前的二十年 ( 大约在 1970 年代 ), 就有一个相当稳定而成熟的操作系统存在了!那 就是 Linux 的老大哥『 Unix 』是也! 怎么这么说呢?!他们这两个家伙有什么关系呀?这里就给他说 一说啰!众所皆知的, Linux 的核心是由 Linus Torvalds 在 1991 年的时候给他开发出来的, 并且丢 到网络上提供大家下载,后来大家觉得这个小东西 ( Linux Kernel ) 相当的小而精巧,所以慢慢的就有 相当多的朋友投入这个小东西的研究领域里面去了! 但是为什么这的小东西这么棒呢?!然而又为什么大 家都可以免费的下载这个东西呢?! 嗯!等鸟哥慢慢的唬 xx....喔不!听我慢慢的道来! • 1969 年以前:一个没有完成的梦想: Bell, MIT 与 GE 的『 Multics』系统 早期的计算机并不像现在的个人计算机一样,他可不是一般人碰的起的呢~ 除非是军事或者是高 科技用途,或者是学术单位的学术研究,否则,真的很难接触到。 非但如此,早期的计算机架构 还很难使用,除了运算速度并不快之外,操作接口也很困扰的! 在那个时候,写程序是件很可怜 的事情,因为,程序设计者,必须要将程序相关的信息在读卡纸上面打洞, 然后再将读卡纸插入 卡片阅读机来将信息读入主机中运算。光是这样就很麻烦了,如果程序有个小地方写错, 哈哈! 光是重新打卡就很惨,加上主机少,使用者众多,光是等待,就耗去很多的时间了! 在之后,经由操作系统的改良,使得后来可以使用键盘来进行信息的输入/输出。 不过,在一间 学校里面,主机毕竟可能只有一部,如果多人等待使用,那怎么办? 好在 1960 年代初期麻省理 工学院 (MIT) 发展了所谓的: 『兼容分时系统( Compatible Time-Sharing System, CTSS )』, 它可以让大型主机透过提供数个终端机(terminal)以联机进入主机,来利用主机的资源进行运算 工作。 架构有点像这样: 图二、早期主机与终端机的相关性图标 如此一来,无论主机在哪里,只要在终端机前面进行输入输出的作业,就可利用主机提供的功能 了。 不过,需要注意的是,此时终端机只具有输入/输出的功能,本身完全不具任何运算或者软 件安装的能力。 而且,比较先进的主机大概也只能提供 30 个不到的终端机而已。 为了更加强化大型主机的系统,以让主机的资源可以提供更多使用者来利用,所以在 1965 年前 后, 由贝尔实验室 (Bell)、麻省理工学院 (MIT) 及奇异公司 (GE) 共同发起了 Multics 的计 划, Multics 目的是想要让大型主机可以达成提供 300 个以上的终端机联机使用的目标。 不过, 到了 1969 年前后,计划进度落后,资金也短缺,所以该计划就宣告不治.....喔!是宣告失败~ (注: Multics 有复杂、多数的意思存在。) • 1969 年: Ken Thompson 的小型 file server system 在认为 Multics 计划不可能成功之后,贝尔研究室 就退出该计划。不过,原本参与 Multics 计 划的人员中,已经从该计划当中获得一些点子, Ken Thompson 就是其中一位!Thompson 因为自 己的需要,希望开发一个小小的操作系统, 以提供自己的需求。在开发时,有一部 DEC (Digital Equipment Corporation) 的 PDP-7 没人使用, 于是他就准备针对这部主机进行操作系统核心程 序的撰写。本来 Thompson 是没时间的, 有趣的是,在 1969 年八月份左右,刚好 Thompson 的 妻儿去了美西探亲, 于是他有了额外的一个月的时间好好的待在家将一些构想实现出来! 经过 四个星期的奋斗,他终于以组译语言 (Assembler) 写出了一个核心程序,同时包括一些核心工具 程序, 以及一个小小的档案系统。那个系统就是 Unix 的原型! 当时 Thompson 将 Multics 庞 大的复杂系统简化了不少,于是同实验室的朋友都戏称这个系统为: Unics 。 Thompson 的这个 档案系统有两个重要的概念,分别是: o 所有的程序或系统装置都是档案 o 不管建构编辑器还是附属档案,所写的程序只有一个目的,且要有效的完成目标。 这些概念在后来对于 Linux 的发展有相当重要的影响喔! • 1973 年: Unix 的正式诞生,Ritchie 等人以 C 语言写出第一个正式 Unix 核心 由于 Thompson 写的那个操作系统实在太好用了,所以在贝尔实验室内部广为流传,并且数度经 过改版。 但是,比较重要的改版则发生在 1973 年。Unix 本来是以组译语言写成的,后来因为 系统移植与效能的需求, 该系统被 B 语言所改写。不过,效能依旧不是很好。后来, Dennis Ritchie 将 B 语言重新改写成 C 语言,C 语言算是比较高阶的程序语言,可以在不同的机器上 面运作, 而 Ritchie 等人也同时将原本 Thompson 的那个操作系统重新以 C 语言改写, 最后 发行出 Unix 的正式版本! 在这个时候需要特别注意的是,贝尔实验室是隶属于 AT&T 的,只是 AT&T 当时忙于其它商业活 动, 所以对于 Unix 是采取比较开放的态度,此外, Unix 在这个时期的发展者都是贝尔实验室 的工程师, 这些工程师对于程序当然相当有研究,所以, Unix 在此时当然是不容易被一般人所 接受的! 此外,也需要特别强调,由于 Unix 是以较高阶的 C 语言写的,相对于组译语言需要 与硬件有密切的配合, 高阶的 C 语言与硬件的相关性就没有这么大了!所以,这个改变也使得 Unix 很容易被移植到不同的机器上面喔! • 1977 年: 重要的 Unix 分支: BSD 的诞生 前面说到,虽然贝尔属于 AT&T ,但是 AT&T 此时对于 Unix 是采取开放的态度, 此外, Unix 是 以高阶的 C 语言写成的,理论上是具有可移植性的! 所以,只要取得 Unix 的原始码,并且针 对大型主机的特性加以修订原有的原始码( Source Code ), 就可能将 Unix 移植到另一部不同 的主机上头了。所以在 1973 年以后, Unix 便得以与学术界合作开发!最重要的接触就是与加 州柏克莱 ( Berkeley ) 大学的合作了。 柏克莱大学的 Bill Joy 在取得了 Unix 的核心原始码 后,着手修改成适合自己机器的版本, 并且同时增加了很多工具软件与编译程序,最终将他命名 为 Berkeley Software Distribution (BSD) 。这个 BSD 是 Unix 很重要的一个分支, Bill Joy 也是 Unix 业者『 Sun 』这家公司的创办者! Sun 公司即是以 BSD 发展的核心进行自己的商业 Unix 版本的发展的。 (后来可以安装在 x86 硬件架构上面 FreeBSD 即是 BSD 改版而来!) • 1979 年: 一个措手不及的版权宣告! 由于 Unix 的高度可移植性与强大的效能,加上当时并没有版权的纠纷, 所以让很多商业公司开 始了 Unix 操作系统的发展,例如 AT&T 自家的 System V、IBM 的 AIX 以及 HP 与 DEC 等公司, 都有推出自家的主机搭配自己的 Unix 操作系统。 但是,如同我们前面提到的,操作系统的核心 ( Kernel ) 必须要跟硬件配合, 以提供及控制硬 件的资源进行良好的工作! 而在早期每一家生产计算机硬件的公司还没有所谓的『协议』的概念, 所以每一个计算机公司出产的硬件自然就不相同啰!因此他们必须要为自己的计算机硬件开发合 适的 Unix 系统。 例如在学术机构相当有名的 Sun 、 Cray 与 HP 就是这一种情况。 他们开发 出来的 Unix 操作系统以及内含的相关软件并没有办法在其它的硬件架构下工作的! 且由于没有 厂商针对个人计算机设计 Unix 系统,因此,在早期并没有支持个人计算机的 Unix 操作系统的 出现 ( 由于 Unix 强调的是多人多任务的环境,但早期的 x86 个人计算机架构下的 CPU 是没有 能力达到多任务的作业,因此,并没有人对移植 Unix 到 x86 的计算机上有兴趣 )。 每一家公 司自己出的 Unix 虽然在架构上面大同小异,但是却真的仅能支持自身的硬件, 所以啰,早先的 Unix 只能与服务器 ( Server ) 或者是大型工作站 ( Workstation ) 划上等号! 但是这个高度开放的 Unix 系统在 1979 年有了重大的转折~ 因为 AT&T 由于商业的考虑,以及 在当时现实环境下的思考,于是将想 Unix 的版权收回去, 因此,在 AT&T 在 1979 年发行的第 七版 Unix 中,特别提到了 『不可对学生提供原始码』的严格限制! 同时,也造成 Unix 业界 之间的紧张气氛,并且也引爆了很多的商业纠纷~ • 1984 年之一: x86 架构的 Minix 诞生 关于 1979 年的版权声明中,影响最大的当然就是学校教 Unix 相关学问的教授了! 想一想,如 果没有核心原始码,那么如何教导学生认识 Unix 呢? 这问题对于 Andrew Tanenbaum (谭宁邦) 教授来说,实在是很伤脑筋的! 不过,学校的课程还是得继续啊!那怎么办?? 既然 1979 年 的 Unix 第七版可以在 Intel 的 x86 架构上面进行移植, 那么是否意味着可以将 Unix 改写并 移植到 x86 上面了呢?在这个想法上, 谭宁邦教授于是乎自己动手写了 Minix 这个 Unix Like 的核心程序! 在撰写的过程中,为了避免版权纠纷,谭宁邦完全不看 Unix 核心原始码! 并且 强调他的 Minix 必须能够与 Unix 兼容才行!谭宁邦在 1984 年开始撰写核心程序, 到了 1986 年终于完成,并于次年出版 Minix 相关书籍,同时与新闻群组相结合~ 这个 Minix 版本比较有趣的地方是,他并不是完全免费的,无法在网络上提供下载! 必须要透 过磁盘/磁带购买才行!虽然真的很便宜~不过,毕竟因为没有在网络上流传, 所以 Minix 的传 递速度并没有很快速!此外,购买时,随磁盘还会附上 Minix 的原始码! 这意味着使用者可以 学习 Minix 的核心程序设计概念喔! (这个特色对于 Linux 的启始开发阶段,可是有很大的关 系喔!) 此外,开发者仅有谭宁邦教授,因为学者很忙啊!加上谭宁邦始终认为 Minix 主要用在 教育用途上面, 所以对于 Minix 是点到为止!所以, Minix 很受欢迎没错, 不过,使用者的 要求/需求的声音可能就比较没有办法上升到比较高的地方了! 这样说,您明白吧??? ^_^ • 1984 年之二: GNU 与 FSF 计划的成立 Richard Mathew Stallman (史托曼) 在 1984 年发起的 GNU 计划,对于现今的自由软件风潮, 真 有不可磨灭的地位!目前我们所使用得很多自由软件,几乎均直接或间接帮助于 GNU 这个计划呢! 那么史托曼是何许人也?为何他会发起这个 GNU 计划呢? Richard Mathew Stallman (生于 1953 年, 网络上自称的 ID 为 RMS) 从小就很聪明!他在 1971 年的时候,进入黑客圈中相当出名的人工智能实验室(AI Lab.), 这个时候的黑客专指计算机功 力很强的人,而非破坏计算机的怪客 (cracker) 喔! 当时的黑客圈对于软件的着眼点几乎都是 在『分享』,所以并没有专利方面的困扰! 这个特色对于史托曼的影响很大!不过,后来由于管 理阶层的问题,导致实验室的优秀黑客离开该实验室, 并且进入其它商业公司继续发展优秀的软 件。但史托曼并不服输,仍然持续在原来的实验室开发新的程序与软件。 后来,他发现到,自己 一个人并无法完成所有的工作,于是想要成立一个开放的团体来共同努力! 1983 年以后,因为实验室硬件的更换,使得史托曼无法继续以原有的硬件与操作系统继续自由程 序的撰写~ 而且他进一步发现到,过去他所使用的 Lisp 操作系统,是麻省理工学院的专利软件, 是无法共享的,这对于想要成立一个开放团体的史托曼是个阻碍。于是他便放弃了 Lisp 这个系 统。 后来,他接触到 Unix 这个系统,并且发现, Unix 在理论与实际上,都可以在不同的机器 间进行移植。 于是他开始转而使用 Unix 系统。因为 Lisp 与 Unix 是不同的系统, 所以,他 原本已经撰写完毕的软件是无法在 Unix 上面运行的!为此, 他就开始将软件移植到 Unix 上面。 并且,为了让软件可以在不同的平台上运作, 因此,史托曼将他发展的软件均撰写成可以移植的 型态! 1984 年,史托曼开始 GNU 计划,这个计划的目的是想要: 建立一个自由的开放的 Unix 操作系 统。 但是建立一个操作系统谈何容易啊!而且在当时的 GNU 是仅有自己一个人单打独斗的史托 曼~ 这实在太麻烦,但又不能不做这个计划,于是史托曼反其道而行~『既然操作系统太复杂, 我就先写可以在 Unix 上面运行的小程序,这总可以了吧?呵呵!』在这个想法上, 史托曼便开 始了程序的写作。在写作期间,为了不让自己吃上官司,他绝对不看专利软件的原始码! 为了这 个计划,他开始使用原本 Unix 上面跑的软件, 并自行撰写功能与 Unix 原有专利软件相仿的软 件。 但不论是什么软件,都得要进行编译成为二进制档案(binary file)后才能够执行, 因此他便开 始撰写 C 语言的编译器,那就是现在相当有名的 GNU C (gcc)! 这个点相当的重要!这是因为 C 语言编译器版本众多,但都是专利软件, 如果他写的 C 编译器够棒,效能够佳,那么将会大大 的让 GNU 计划出现在众人眼前! Tips: 我们在前面稍微提过,计算机仅认识 0/1 的数据,但是人类不认 识啊! 人类对于纯文字的数据(就是所谓的 ASCII 档案格式)比较 有感觉。 但是偏偏计算机又不认识 ASCII 格式的文字,很头痛, 不是吗? 为此,就会有很多的所谓的『编译器』来辅助我们撰写 程序。 我们一般使用文字编辑器以 ASCII 纯文字格式来撰写程 序, 再透过所谓的『编译器(compiler)』』将刚刚完成的文本文 件 『编译』成为计算机认识的二进制制(binary file)的档案, 以 让计算机认识且可以执行的程序啊! 但开始时并不顺利,为此,他先转而将 Emacs 编辑器写成可以在 Unix 上面跑得软件, 并公开 公布原始码,因为 Emacs 太优秀了,因此,很多人便直接向他购买。此时 Internet 尚未流行, 所以,史托曼便借着 Emacs 以磁带(tape)出售,赚了一点钱 ,进而开始全力撰写其它软件。并 且成立 自由软件基金会 (FSF, Free Software Foundation),请更多工程师与志工撰写软件。 终 于还是完成了 GCC,这比 Emacs 还更有帮助!此外,他还撰写了更多可以被呼叫的 C 函式库(GNU C library), 以及可以被使用来操作操作系统的基本接口 BASH shell ! 这些都在 1990 年左 右完成了! Tips: 如果纯粹使用文字编辑器来编辑程序的话,那么程序语法如果写错 时, 只能利用编译时发生的错误讯息来修订了,这样实在很没有 效率。 Emacs 则是一个很棒的编辑器!注意!是编辑(editor)而 非编译(compiler)! 他可以很快的立刻显示出您写入的语法可能 有错误的地方,这对于程序设计师来说, 实在是一个好到不能再 好的工具了!所以才会这么的受到欢迎啊! 到了 1985 年,为了避免 GNU 所开发的自由软件被其它人所利用而成为专利软件, 所以他与律 师草拟了有名的通用公共许可证 (General Public License, GPL), 并且称呼他为 copyleft (相 对于专利软件的 copyright!)。 关于 GPL 的相关内容我们在下一个小节继续谈论,在这里,必 须要说明的是, 由于有 GNU 所开发的几个重要软件,如: o Emacs o GNU C (GCC) o GNU C Library (glibc) o Bash shell 造成后来很多的软件开发者可以藉由这些基础的工具来进行程序开发! 进一步壮大了自由软件团 体!这是很重要的!不过,对于 GNU 的最初构想 『建立一个自由的 Unix 操作系统』来说,有 这些优秀的程序是仍无法满足, 因为,当下并没有『自由的 Unix 核心』存在.....所以这些软 件仍只能在那些有专利的 Unix 平台上工作~~一直到 Linux 的出现...... • 1988 年: 图形接口 XFree86 计划 有鉴于图形使用者接口 ( Graphical User Interface, GUI ) 的需求日益加重,在 1984 年由 MIT 与其它协力厂商首次发表了 X Window System ,并且更在 1988 年成立了非营利性质的 XFree86 这个组织。所谓的 XFree86 其实是 X Window System + Free + x86 的整合名称呢! 而这个 XFree86 的 GUI 界面更在 Linux 的核心 1.0 版于 1994 年释出时,整合于 Linux 操作系统当 中! Tips: 为什么称图形使用者接口为 X 呢?因为由英文单字来看, Window 的 W 接的就是 X 啦!意指 Window 的下一版就是了! 需注意的 是, X Window 并不是 X Windows 喔! • 1991 年: 芬兰大学生 Linus Torvalds 的一则简讯 到了 1991 年,芬兰的赫尔辛基大学的 Linus Torvalds 在 BBS 上面贴了一则消息, 宣称他以 bash, gcc 等工具写了一个小小的核心程序,这个核心程序可以在 Intel 的 386 机器上面运作, 让很多人很感兴趣!从此开始了 Linux 不平凡的路程! 关于 GNU 计划 1984 年创立 GNU 计划与 FSF 基金会的 Stallman 先生认为, 写程序最大的快乐就是让自己发展的良好 的软件让大家来使用了! 而既然程序是想要分享给大家使用的,不过,每个人所使用的计算机软硬件并不 相同, 既然如此的话,那么该程序的原始码 (Source code) 就应该要同时释出, 这样才能方便大家修改 而适用于每个人的计算机中呢!这个将原始码释出的举动, 就称为 Open Source !此外,史托曼同时认 为,如果您将您程序的 Source code 分享出来时,若该程序是很优秀的,那么将会有很多人使用, 而每 个人对于该程序都可以查阅 source code ,无形之中,就会有一票人帮您除错啰! 您的这支程序将会越 来越壮大!越来越优秀呢! 而为了避免自己的开发出来的 Open source 的自由软件被拿去做成专利软件, 于是 Stallman 同时将 GNU 与 FSF 发展出来的软件,都挂上 GPL 的版权宣告~ 这个 FSF 的核心观念是『版权制度是促进社会 进步的手段, 版权本身不是自然权力。』对于 FSF 有兴趣或者对于 GNU 想要更深入的了解时,请参考树 德大学的洪朝贵教授的网站 http://saturn.stu.edu.tw/~ckhung/a/c_83.php,或直接到 GNU 去: http://www.gnu.org 里面有更为深入的解说! Tips: 为什么要称为 GNU 呢?其实 GNU 是 GNU's Not Unix 的缩写, 意 思是说, GNU 并不是 Unix 啊!那么 GNU 又是什么呢? 就是 GNU's Not Unix 嘛!.....如果您写过程序, 就会知道,这个 GNU = GNU's Not Unix 可是无穷循环啊!忙碌~ 另外,什么是 Open Source 呢?所谓的 source 是程序发展者写 出的原始程序代码, Open Source 就是,软件在发布时,同时将 作者的原始码一起公布的意思! 那么这个 GPL ( GNU General Public License, GPL ) 是什么玩意儿? 为什么要将自由软件挂上 GPL 的 『版权宣告』呢?这个版权宣告对于作者有何好处? 首先, Stallman 对 GPL 一直是强调 Free 的,这 个 Free 的意思是这样的: "Free software" is a matter of liberty, not price. To understand the concept, you should think of "free speech", not "free beer". "Free software" refers to the users freedom to run, copy, distribute, study, change, and improve the software 大意是说, Free Software (自由软件) 是一种自由的权力,并非是『价格!』 举例来说,你可以拥有自 由呼吸的权力、你拥有自由发表言论的权力, 但是,这并不代表您可以到处喝『免费的啤酒!(free beer)』, 也就是说, 自由软件的重点并不是指『免费』的,而是指具有『自由度, freedom』的软件, 史托曼进一 步说明了自由度的意义是: 使用者可以自由的执行、复制、再发行、学习、修改与强化自由软件。 这无 疑是个好消息!因为如此一来,你所拿到的软件可能原先只能在 Unix 上面跑, 但是经过原始码的修改之 后,你将可以拿他在 Linux 或者是 Windows 上面来跑!总之,一个软件挂上了 GPL 版权宣告之后,他自 然就成了自由软件! 这个软件就具有底下的特色: • 取得软件与原始码:您可以根据自己的需求来执行这个自由软件; • 复制:您可以自由的复制该软件; • 修改:您可以将取得的原始码进行程序修改工作,使之适合您的工作; • 再发行:您可以将您修改过的程序,再度的自由发行,而不会与原先的撰写者冲突; • 回馈:您应该将您修改过的程序代码回馈于社群! 但请特别留意,您所修改的任何一个自由软件都不应该也不能这样: • 修改授权:您不能将一个 GPL 授权的自由软件,在您修改后而将他取消 GPL 授权~ • 单纯贩卖:您不能单纯的贩卖自由软件。 也就是说,既然 GPL 是站在互助互利的角度上去开发的,您自然不应该将大家的成果占为己有, 而取消 GPL 授权的!对吧!因此您当然不可以将一个 GPL 软件的授权取消, 即使您已经对该软件进行大幅度的 修改!那么自由软件也不能贩卖吗?当然不是!还记得上一个小节里面, 我们提到史托曼藉由贩卖 Emacs 取得一些经费,让自己生活不至于匮乏吧??是的! 自由软件是可以贩卖的,不过,不可仅贩卖该软件, 应同时搭配售后服务与相关手册~ 这些可就需要工本费了呢! 很多人还是有疑问,目前不是有很多 Linux 开发商吗?为何他们可以贩卖 Linux 这个 GPL 授权的软件? 原因很简单,因为他们大多都是贩卖『售后服务!』所以,他们所使用的自由软件, 都可以在他们的网站 上面下载!(当然,每个厂商他们自己开发的工具软件就不是 GPL 的授权软件了!) 但是,您可以购买他 们的 Linux 光盘,如果您购买了光盘,他们会提供相关的手册说明文件, 同时也会提供您数年不等的咨 询、售后服务、软件升级与其它协力工作等等的附加价值! 所以说,目前自由软件工作者,他们所赖以维 生的,几乎都是在『服务』这个领域呢! 毕竟自由软件并不是每个人都会撰写,有人有需要您的自由软件 时,他就会请求您的协助, 此时,您就可以透过服务来收费了!这样来说, 自由软件确实还是具有商业 空间的喔! Tips: 很多人对于 GPL 授权一直很疑惑,对于 GPL 的商业行为更是无法 接受! 关于这一点,鸟哥在这里还是要再次的申明, GPL 是可以 从事商业行为的! 而很多的作者也是藉由这些商业行为来得以取 得生活所需,更进一步去发展更优秀的自由软件! 千万不要听到 『商业』就排斥!这对于发展优良软件的朋友来说,是不礼貌的! 上面提到的大多是与使用者有关的项目,那么 GPL 对于自由软件的作者有何优点呢? 大致的优点有这些: • 软件安全性较佳; • 软件执行效能较佳; • 软件除错时间较短; • 贡献的原始码远永都存在。 这是因为既然是 Open Source 的自由软件,那么您的程序代码将会有很多人帮您查阅, 如此一来,程序 的漏洞与程序的优化将会进展的很快!所以,在安全性与效能上面, 自由软件一点都不输给商业软件喔! 此外,因为 GPL 授权当中,修改者并不能修改授权, 因此,您如果曾经贡献过程序代码,嘿嘿!您将名 留青史呢!不错吧! ^_^ 不过,就鸟哥的观点来看, GPL 对于程序开发者的优点是相当多的,不过, 对于不熟悉程序的一般人来 说, GPL 的优点其实不太容易看出来~ 首先,虽然他是随手可得的自由软件,不过,您也必须要会使用 基本的编译器才行吧! (呵呵!这也是您为何要买这本书/察看鸟哥的网站的原因吧! ^_^) 这对于一般人 来说并不容易!当然啦,如果每个人都跟 Stallman 一样神,那商业公司就不用存在啦! 嘿嘿!对于不懂 程序的人来说,商业公司是一个很快速的解决之道啊! 而对于我们广大的读者群来说,认识了/学习了 Linux 与自由软件的相关技巧后, 对于未来真的是有很不错的帮助喔! Torvalds 的 Linux 发展 我们前面一节当中,提到了 Linux 是由 Torvalds 这个芬兰人所发明的。 那么为何托瓦兹可以发明 Linux 呢?凭空想象而来的?还是有什么渊源? 这里我们就来谈一谈啰! 与 Minix 之间 Linus Torvalds (托瓦兹, 1969 年出生)的外祖父是赫尔辛基大学的统计学家, 他的外祖父为了让自己的 小孙子能够学点东西, 所以从小就将托瓦兹带到身边来管理一些微计算机。在这个时期,托瓦兹接触了汇 编语言 (Assembly Language),那是一种直接与芯片对谈的程序语言,也就是所谓的低级语言。 必须要很 了解硬件的架构,否则很难以汇编语言撰写程序的。 在 1988 年间,托瓦兹顺利的进入了赫尔辛基大学,并选读了计算机科学系。 在就学期间,因为学业的需 要与自己的兴趣,托瓦兹接触到了 Unix 这个操作系统。 当时整个赫尔辛基只有一部最新的 Unix 系统, 同时仅提供 16 个终端机 (terminal)。 还记得我们上一节刚刚提过的,早期的计算机仅有主机具有运算 功能,terminal 仅负责提供 Input/Output 而已。在这种情况下,实在很难满足托瓦兹的需求,因为..... 光是等待使用 Unix 的时间,就很耗时~ 为此,他不禁想到:『我何不自己搞一部 Unix 来玩?』不过, 就如同 Stallman 当初的 GNU 计划一样,要写核心程序,谈何容易~ 不过,幸运之神并未背离托瓦兹,因为不久之后,他就知道有一个类似 Unix 的系统, 并且与 Unix 完全 兼容,还可以在 Intel 386 机器上面跑的操作系统, 那就是我们上一节提过的,谭宁邦教授为了教育需 要而撰写的 Minix 系统! 他在购买了最新的 Intel 386 的个人计算机后,就立即安装了 Minix 这个操 作系统。 另外,由于 Minix 这个操作系统是有附上原始码的~所以,托瓦兹也经由这个原始码 学习到了 很多的核心程序设计的设计概念喔! 对 386 硬件的多任务测试 事实上,托瓦兹对于个人计算机的 CPU 其实并不满意,因为他之前碰的计算机都是工作站型的计算机, 这 类计算机的 CPU 特色就是可以进行『多任务处理』的能力。什么是多任务呢? 理论上,一个 CPU 在一个 时间内仅能进行一项工作, 那如果有两个工作同时出现到系统中呢?举例来说, 您可以在现今的计算机 中同时开启两个以上的办公软件,例如电子电子表格与文字处理软件。 这个同时开启的动作代表着这两个 工作同时要交给 CPU 来处理~ 啊! CPU 一个时间点内仅能处理一个工作,那怎么办?没关系, 这个时 候如果具有多任务的 CPU 就会自动在不同的工作间切换~ 亦即我先跑 10% 的电子电子表格,再转到文书 处理器跑 10% ,再回去电子电子表格.... 一直到将两个工作结束为止(不一定同时结束!如果某个工作先 结束了, CPU 就会全速去跑剩下的那个工作了!) Tips: 为什么有的时候我同时开两个档案(假设为 A, B 档案)所花的时 间, 要比开完 A 再去开 B 档案的时间还要多?现在是否稍微可 以理解? 因为如果同时开启的话, CPU 就必须要在两个工作之间 不停的切换~ 而切换的动作还是会耗去一些 CPU 时间的!所以 啰,同时启用两个以上的工作在一个 CPU 上, 要比一个一个的执 行还要耗时一点。这也是为何现在 CPU 开发商要整合两个 CPU 于 一个芯片中! 也是为何在运作情况比较复杂的服务器上,需要比 较多的 CPU 负责的原因! 早期 Intel 的 x86 架构计算机不是很受重视的原因,就是因为 x86 的芯片对于多任务的处理不佳, CPU 在不同的工作之间切换不是很顺畅。但是这个情况在 386 计算机推出后, 有很大的改善。托瓦兹在得知 新的 386 芯片的相关信息后,他认为, 以价格性能比的观点来看, Intel 的 386 便宜而且性能上也就 稍微可以将就将就 ^_^。 所以他就贷款去买了一部 Intel 的 386 来玩。 前面提到,托瓦兹是玩汇编语言的,汇编语言对于硬件有很密切的关系, 为了彻底发挥 386 的效能,于 是托瓦兹花了不少时间在测试 386 机器上! 他的重要测试就是在测试 386 的多功效能上。首先,他写了 两个小程序, 一个程序会持续输出 A ,另一个会持续输出 B,他将两个程序同时执行, 结果,他看到屏 幕上很顺利的一直出现 ABABABAB...... 他知道,他成功了! ^_^ Tips: 要达到多任务(multitasking)的环境,除了硬件(主要是 CPU)需要 能够具有多任务的特性外, 操作系统也需要支持这个功能喔!一 些不具有多任务特性的操作系统, 想要同时执行两个程序是不可 能的。除非先被执行的程序执行完毕,否则, 后面的程序不可能 被主动执行。至于多任务的操作系统中,每个程序被执行时, 都 会有一个最大 CPU 使用时间,若该工作运作的时间超过这个 CPU 使用时间时, 该工作就会先被丢出 CPU 的运作中,而再度的进入 核心工作排程中,等待下一次的 CPU 运作。 这有点像在开记者会 啦,主持人(CPU)会问『谁要发问』?一群记者(工作程序) 就会举 手(看谁的工作重要!),先举手的自然就被允许发问,问完之后, 主持人又会问一次谁要发问,当然,所有人(包括刚刚那个记者) 都可以举手! 如此一次一次的将工作给他完成啊! ^_^ 多任务的 环境对于复杂的工作情况,帮助很大喔! 初次释出 Linux 0.02 探索完了 386 的硬件相关信息,并且也安装了类似 Unix 的 Minix 操作系统, 同时还取得 Minix 的原 始码,接下来,托瓦兹干嘛去了?? 因为 Minix 的发展控制在谭宁邦教授手上,他希望 Minix 能以教育 的立场去发展, 所以对于 Minix 的开发并不是十分的热中,但是一堆人对于 Minix 的功能需求又很强烈, 例如一些接口与周边的驱动程序与新的协议等等。在无法快速的得到解决后, 托瓦兹就想,那我干脆自己 写一个更适合我自己用的 Minix 好了! 于是他就开始进行核心程序的撰写了。 对于托瓦兹来说, GNU 真的是一个不可多得的好家伙~ 因为他用来撰写属于自己小核心的工具,就是 GNU 的 bash 操作接口与 gcc 编译器等等自由软件。 他以 GNU 的软件针对 386 并参考 Minix 的设计理念 (注意,仅是程序设计理念, 并没有使用 Minix 的原始码)来写这个小核心。喝!没想到竟然可以写出这 个小玩意, 而这个小玩意竟然可以在 386 上面顺利的跑起来~还可以读取 Minix 的档案系统。 真是太 好了!不过还不够,他希望这个程序可以获得大家的一些修改建议, 于是他便将这个核心放置在网络上提 供大家下载,同时在 BBS 上面贴了一则消息: Hello everybody out there using minixI'm doing a (free) operation system (just a hobby, won't be big and professional like gnu) for 386(486) AT clones. 他说,他完成了一个好玩的小核心操作系统,这个核心是用在 386 机器上的, 同时,他真的仅是好玩, 并不是想要做一个跟 GNU 一样大的计划!这则新闻引起很多人的注意, 他们也去托瓦兹提供的网站上下 载了这个核心来安装。 有趣的是,因为托瓦兹放置核心的那个 FTP 网站的目录为: Linux , 从此,大 家便称这个核心为 Linux 了。(请注意,此时的 Linux 就是那个 kernel 喔! 另外,托瓦兹所丢到该目 录下的第一个核心版本为 0.02 呢!) 同时,为了让自己的 Linux 能够兼容于 Unix 系统,于是托瓦兹开始将一些能够在 Unix 上面运作的软件 拿来在 Linux 上面跑。不过,他发现到,是有很多的软件无法在 Linux 这个核心上运作。 这个时候他有 两种作法,一种是修改软件,让该软件可以在 Linux 上跑, 另一种则是修改 Linux ,让 Linux 符合软 件能够运作的规范! 由于 Linux 希望能够兼容于 Unix ,于是托瓦兹选择了第二个作法『修改 Linux 』! 为了让所有的软件都可以在 Linux 上执行,于是托瓦兹开始参考标准的 POSIX 规范。 这个正确的决定让 Linux 在起步的时候体质就比别人优良~ 因为 POSIX 标准主要是针对 Unix 与一些 软件运行时候的标准规范, 只要依据这些标准规范来设计的核心与软件,理论上,就可以搭配在一起执行 了。 而 Linux 的发展就是依据这个 POSIX 的标准规范, Unix 上面的软件也是遵循这个规范来设计的, 如此一来,让 Linux 很容易就与 Unix 兼容共享互有的软件了! 同时,因为 Linux 直接放置在网络下, 提供大家下载, 所以在流通的速度上相当的快!导致 Linux 的使用率大增! 这些都是造成 Linux 大受 欢迎的几个重要因素呢! Linux 的发展:虚拟团队的产生 Linux 虽然是托瓦兹发明的,而且内容还绝不会涉及专利软件的版权问题。 不过,如果单靠托瓦兹自己一 个人的话,那么 Linux 要茁壮实在很困难~ 因为一个人的力量是很有限的。好在托瓦兹选择 Linux 的开 发方式相当的务实! 首先,他将释出的 Linux 核心放置在 FTP 上面,并请告知大家新的版本信息, 等 到使用者下载了这个核心并且安装之后,如果发生问题, 或者是由于特殊需求亟需某些硬件的驱动程序, 那么这些使用者就会主动回报给托瓦兹。 在托瓦兹能够解决的问题范围内,他都能很快速的进行 Linux 核 心的更新与除错。 不过,托瓦兹总是有些硬件无法取得的啊,那么他当然无法帮助进行驱动程序的撰写与相关软件的改良。 这 个时候,就会有些志工跳出来说:『这个硬件我有,我来帮忙写相关的驱动程序。』 因为 Linux 的核心 是 Open Source 的,黑客志工们很容易就能够跟随 Linux 的原本设计架构, 并且写出兼容的驱动程序或 者软件。志工们写完的驱动程序与软件托瓦兹是如何看待的呢? 首先,他将该驱动程序/软件带入核心中, 并且加以测试。 只要测试可以运行,并且没有什么主要的大问题,那么他就会很乐意的将志工们写的程序 代码加入核心中! 总之,托瓦兹是个很务实的人,对于 Linux 核心所欠缺的项目,他总是『先求有且能 跑, 再求进一步改良』的心态!这让 Linux 使用者与志工得到相当大的鼓励! 因为 Linux 的进步太快 了!使用者要求虚拟内存,结果不到一个星期推出的新版 Linux 就有了! 这不得不让人佩服啊! 另外,为因应这种程序代码的加入,于是 Linux 便逐渐发展成具有模块的功能! 亦即是将某些功能独立 出于核心外,在需要的时候才加载到核心中。如此一来, 如果有新的硬件驱动程序或者其它协议的程序代 码进来时,就可以模块化, 大大的增加了 Linux 核心的可维护能力! 后来,因为 Linux 核心加入了太多的功能, 光靠托瓦兹一个人进行核心的实际测试并加入核心原始程序 实在太费力~ 结果,就有很多的朋友跳出来帮忙这个前置作业! 例如考克斯(Alan Cox)、与崔迪(Stephen Tweedie)等等, 这些重要的副手会先将来自志工们的修补程序或者新功能的程序代码进行测试, 并且结 果上传给托瓦兹看,让托瓦兹作最后核心加入的原始码的选择与整并! 这个分层负责的结果,让 Linux 的 发展更加的容易! 特别值得注意的是,这些托瓦兹的 Linux 发展副手,以及自愿传送修补程序的黑客志工, 其实都没有见 过面,而且彼此在地球的各个角落,大家群策群力的共同发展出现今的 Linux , 我们称这群人为虚拟团 队!而为了虚拟团队数据的传输,于是 Linux 便成立的核心网站: http://www.kernel.org ! 而这群素 未谋面的虚拟团队们,在 1994 年终于完成的 Linux 的核心正式版! version 1.0 。 这一版同时还加入 了 X Window System 的支持呢!更于 1996 年完成了 2.0 版, 同时因应商业版本的需求, 于是开始将 核心版本以测试版及稳定版同时开发, 次版本偶数为稳定版,奇数为开发中的测试版。 例如 2.6 与 2.5 版为相同的版本,不过, 2.6 为稳定版, 2.5 则为测试版。 测试版含有较多的功能,不过,稳定性可不 敢说~ 并且托瓦兹指明了企鹅为 Linux 的吉祥物。 Tips: 奇怪的是,托瓦兹是因为小时候去动物园被企鹅咬了一口念念不 忘, 而正式的 2.0 推出时,大家要他想一个吉祥物。他在想也想 不到什么动物的情况下, 就将这个念念不忘的企鹅当成了 Linux 的吉祥物了...... Linux 由于托瓦兹是针对 386 写的,跟 386 硬件的相关性很强,所以, 早期的 Linux 确实是不具有移 植性的。不过,大家知道 Open source 的好处就是, 可以修改程序代码去适合作业的环境。因此,在 1994 年以后, Linux 便被开发到很多的硬件上面去了! 目前除了 x86 之外, IBM、HP、Sun 等等公司出的硬 件也都有被 Linux 所支持呢! Linux distributions 好了,经过上面的说明,我们知道了 Linux 其实就是一个操作系统最底层的核心及其提供的核心工具。 他 是 GNU 授权模式,所以,任何人均可取得原始码与可执行这个核心程序,并且可以修改。 此外,因为 Linux 参考 POSIX 设计规范,于是兼容于 Unix 操作系统, 故亦可称之为 Unix Like 的一种。 Linux 的出现让 GNU 计划放下了心里的一块大石头,因为 GNU 一直以来就是缺乏了核心程序, 导致他们 的 GNU 自由软件只能在其它的 Unix 上面跑。既然目前有 Linux 出现了,且 Linux 也用了很多的 GNU 相 关软件,所以 Stallman 认为 Linux 的全名应该称之为 GNU/Linux 呢! 不管怎么说,Linux 实在很不错, 让 GNU 软件大多以 Linux 为主要操作系统来进行开发,此外,很多其它的自由软件团队,例如 sendmail, wu-ftp, apache 等等也都有以 Linux 为开发测试平台的计划出现!如此一来, Linux 除了主要的核心程 序外,可以在 Linux 上面运行的软件也越来越多,如果有心,就能够将一个完整的 Linux 操作系统搞定 了! 虽然由 Torvalds 负责开发的 Linux 仅具有 Kernel 与 Kernel 提供的工具, 不过,如上所述,很多的 软件已经可以在 Linux 上面运作了,因此, Linux + 各家软件就可以完成一个相当完整的操作系统了。 不 过,要完成这样的操作系统......还真难~ 因为 Linux 早期都是由黑客工程师所开发维护的,他们并没 有考虑到一般使用者的能力...... 为了让使用者能够接触到 Linux ,于是很多的商业公司或非营利团体, 就将 Linux Kernel (含 tools ) 与可运行的软件整合起来,加上自己具有创意的工具程序, 这个工具程 序可以让使用者以光盘或者透过网络直接安装/管理 Linux 系统。 这个 Kernel + Softwares + Tools 的 可完整安装的咚咚,我们称之为 Linux distribution , 一般中文翻译成 可完整安装套件,或者安装套 件等等。 Tips: 由于 Linux 核心是由黑客工程师写的,要由原始码安装到 x86 计 算机上面成为可以执行的 binary 档案, 这个过程可不是人人都 会的~所以早期确实只有工程师对 Linux 有兴趣。 一直到一些社 群与商业公司将 Linux 核心配合自由软件,并提供完整的安装程 序, 且制成光盘后,对于一般使用者来说, Linux 才越来越具有 吸引力! 因为只要一直『下一步』就可以将 Linux 安装完成啊! ^_^ 我们前面说过, GNU 的 GPL 授权并非不能从事商业行为,于是很多商业公司便成立来贩卖 Linux distribution。而由于 Linux 的 GPL 版权宣告,因此,商业公司所贩卖的 Linux distributions 通常也 都可以从 Internet 上面来下载的!此外,如果您想要其它商业公司的服务, 那么直接向该公司购买光盘 来安装,也是一个很不错的方式的! 不过,由于发展 Linux distributions 的公司实在太多了,例如有名的 Red Hat, Mandriva, Debian, SuSE 等等,所以很多人都很担心,如此一来每个 distribution 是否都不相同呢?这就不需要担心了,因为每 个 Linux distributions 使用的 kernel 都是 http://www.kernel.org 所释出的,而他们所选择的软件, 几乎都是目前很知名的软件,重复性相当的高, 例如 WWW 服务器的 Apache , Mail 服务器的 Postfix/sendmail ,File 服务器的 Samba 等等。 此外,为了让所有的 Linux distributions 开发不致于差异太大,还有 Linux Standard Base (LSB) 来 规范开发者,以及目录架构的 File system Hierarchy Standard (FHS) 规范! 唯一差别的,可能就是该 开发者自家所开发出来的管理工具,以及套件管理的模式吧! 所以说,基本上,每个 Linux distributions 除了架构的严谨度与选择的套件内容外, 其实差异并不太大啦! ^_^ 。大家可以选择自己喜好的 distribution 来安装即可! 底下列出几个主要的 Linux distributions 发行者网址: • Red Hat: http://www.redhat.com • Fedora: http://fedora.redhat.com • Mandriva: http://www.mandriva.com • Novell SuSE: http://www.novell.com/linux/suse/ • Debian: http://www.debian.org/ • Slackware: http://www.slackware.com/ • Linpus: http://www.linpus.com.tw/ • Gentoo: http://www.gentoo.org/ • Ubuntu: http://www.ubuntulinux.org/ • CentOS: http://www.centos.org/ 当然发行套件者不仅于此,您可以查阅其它的 Linux 新闻来发现喔! 但是值得大书特书的,是中文 Linux 的延伸计划: CLE 这个套件! 早期的 Linux 因为是工程师发展的,而这些工程师大多以英文语系的国家 为主, 所以, Linux 对于国人的学习是比较困扰一点。后来由国人发起的 CLE 计划: http://cle.linux.org.tw/ 开发很多的中文套件级翻译了很多的英文文件,使得我们目前得以使用中文的 Linux 呢! 另外,目前正在开发中的还有台南县卧龙小三等老师们发起的众多自由软件计划, 真是造福 很多的朋友啊! • 自由软件技术交流网: http://freesf.tnc.edu.tw/index.php • B2D: http://b2d.tnc.edu.tw/ 此外,如果只想看看 Linux 的话,还可以选择所谓的可光盘开机进入 Linux 的 Live CD 版本, 亦即是 KNOPPIX 这个 Linux distributions 呢!台湾也有阿里巴巴兄维护的中文 Live CD 喔! • http://www.knoppix.net/ • 中文 KNOPPIX: http://knoppix.tnc.edu.tw/ Tips: 对于没有额外的硬盘或者是没有额外的主机的朋友来说, KNOPPIX 这个可以利用光盘开机而进入 Linux 操作系统的 Live CD 真的 是一个不错的选择!您只要下载了 KNOPPIX 的映象档,然后将他 烧录成为 CD,放入您主机的光驱,并设定光盘为第一个开机选项, 就可以使用 Linux 系统了呢! 如果您还想要知道更多的 Linux distributions 的下载与使用信息,可以参考: • http://www.linuxiso.org/ • http://distrowatch.com/ 那我到底应该要选择哪一个 distributions ?就如同我们上面提到的,其实每个 distributions 差异性 并不大! 不过,由于套件管理的方式主要分为 Debian 的 pkg 及 Red Hat 系统的 RPM 方式, 目前鸟哥 的建议是,先学习以 RPM 套件管理为主的 Fedora/SuSE/Mandriva 等台湾使用者较多的版本, 这样一来, 发生问题时,可以提供解决的管道比较多。如果您已经接触过 Linux 了, 还想要更严谨的 Linux 版本, 那可以考虑使用 Debian ,如果您是以效能至上来考虑, 那么或许 Gentoo 是不错的建议! 总之,版本 很多,但是各版本差异其实不大,建议您一定要先选定一个版本后, 先彻头彻尾的了解他,那再继续玩其 它的版本时,就可以很快的进入状况。 鸟哥的书/网站仅提供一个版本,不过是以比较基础的方式来介绍 的, 因此,如果能够熟练这本书/网站的话,呵呵!哪一个 distributions 对您来说,都不成问题啦! Linux 的特色 Linux 是 Torvalds 先生所开发出来的,基于 GPL 的版权宣告之下, 可以在 x86 的架构下运作,也可以 被移植到其它的大型主机上面。 由于开发的相关理念与兼容的问题,因此,我们也可以称 Linux 为 Unix Like 操作系统的一种。 Tips: 其实 Unix-Like 可以说是目前服务器类型的操作系统的统称啦! 因为,不论是 FreeBSD, BSD, Sun Unix, HP Unix, Red Hat Linux, Mandrake Linux 等等,都是由同一个祖先 Thompson 所写的 『Unix』来的, 因此,这些咚咚都被统称为 Unix-Like 的操作系 统啰! Linux 的特色 那么这个系统有什么特异功能呢?简单的说: • 自由与开放:由于 Linux 是基于 GPL ( General Public License ) 的架构之下,因此他是自由 软件, 也就是任何人都可以自由的使用或者是修改其中的原始码的意思! 这就是所谓的『开放 性架构』, 这对科学界来说是相当重要的!因为很多的工程师由于特殊的需求,常常需要修改系 统的原始码, 使该系统可以符合自己的需求!而这个开放性的架构将可以满足各不同需求的工程 师! 因此当然就有可能越来越流行啰!以鸟哥来说,目前环境工程界的空气质量模式最新版 Models-3/CMAQ 就是以 Linux 为基准平台设计的呢! • 配备需求低廉:而 Linux 可以支持个人计算机的 x86 架构, 系统资源不必像早先的 Unix 系统 那般,仅适合于单一公司 ( 例如 Sun ) 设备! 单就这一点来看,就可以造成很大的流行啰!不 过,如果您想要在 Linux 下执行 X Window 系统, 那么硬件的等级就不能太低了! • 功能强大而稳定:而且由于 Linux 功能并不会输给一些大型的 Unix 工作站,因此,近年来越来 越多的公司或者是团体、 个人投入这一个操作系统的开发与整合工作! • 独立作业:另外, 由于很多的软件套件逐渐被这套操作系统拿来使用,而很多套件软件也都在 Linux 这个操作系统上面进行发展与测试,因此, Linux 近来已经可以独力完成几乎所有的工作 站或服务器的服务了,例如 Web, Mail, Proxy, FTP.....。 所以,目前 Linux 已经是相当成熟的一套操作系统啰!而且不耗资源又可以自由取得!呵呵, 可以说造 成微软相当大的压力呀!此外,由于他的系统硬件要求很低, 加上目前很多的人由于『Intel 的阴谋』( 呵 呵!开玩笑的,因为 Tom 的硬件评论 (http://www.big5.tomshardware.com/) 网站常常这样取笑 Intel 的说!呵!很好笑!) 而造成手边有相当多的淘汰掉的硬件配备, Linux 在这些被淘汰的硬件中就可以 执行的相当的顺畅与稳定! 因此也造成相当多朋友的关注啰! 这也是造成 Linux 成为最近几年来最受瞩目的操作系统之一,如前所述, 他会受到瞩目的原因主要是因 为他是『free』的,就是可以自由取得的操作系统啦! 然后他是开放性的系统,也就是你可以随时的取得 程序的原始码,这对于程序开发工程师是很重要的! 而且,虽然他是 Free 的自由软件,不过功能却很强 大!另外, Linux 对于硬件的需求是很低的,这一点更造成它流行的主因,因为硬件的汰换率太快了, 所 以很多人手边都有一些很少在用的零件,这些零件组一组就可以用来跑 Linux 了,反正做一个工作站又不 用使用到屏幕 ( 只要主机就可以啰 ) ,因此 Linux 就越来越流行啰!(插个嘴,也就是因为 Linux 具有 1.硬件需求低、 2.架构开放、 3.系统稳定性及保密性功能够强、 4.完全免费,所以造成一些所谓『反微 软联盟』的程序设计高手不断的开发新软件!以与 Microsoft 进行抗衡!) Linux 的优缺点 那干嘛要使用 Linux 做为我们的主机系统呢?这是因为 Linux 有底下这些优点: • 稳定的系统: Linux 本来就是基于 Unix 概念而发展出来的操作系统,因此, Linux 具有与 Unix 系统相似的 的程序接口跟操作方式,当然也继承了 Unix 稳定并且有效率的特点。常听到安装 Linux 的主机 连续运做一年以上而不曾当机、不必关机是稀松平常的事; • 免费或少许费用: 由于 Linux 是基于 GPL 的基础下的产物,因此任何人皆可以自由取得 Linux , 至于一些『安 装套件』的发行者, 他们发行的安装光盘也仅需要些许费用即可获得!不同于 Unix 需要负担庞 大的版权费用,当然也不同于微软需要一而再、 再而三的更新你的系统,并且缴纳大量费用啰! • 安全性、漏洞的快速修补: 如果你常玩网络的话,那么你最常听到的应该是 『没有绝对安全的主机』!没错!不过 Linux 由 于支持者日众,有相当多的热心团体、个人参与其中的开发, 因此可以随时获得最新的安全信息, 并给予随时的更新,亦即是具有相对的较安全! • 多任务、多使用者: 与 Windows 系统不同的, Linux 主机上可以同时允许多人上线来工作, 并且资源的分配较为公 平,比起 Windows 的单人假多任务系统要稳定的多啰! 这个多人多任务可是 Unix-Like 上面相 当好的一个功能,怎么说呢?你可以在一部 Linux 主机上面规划出不同等级的使用者,而且每个 使用者登入系统时的工作环境都可以不相同, 此外,还可以允许不同的使用者在同一个时间登入 主机,以同时使用主机的资源。 • 使用者与群组的规划: 在 Linux 的机器中,档案的属性可以分为『可读、可写、可执行』 等参数来定义一个档案的适 用性,此外,这些属性还可以分为三个种类, 分别是『档案拥有者、档案所属群组、其它非拥有 者与群组者』。 这对于项目计划或者其它计划开发者具有相当良好的系统保密性。 • 相对比较不耗资源的系统: Linux 只要一部 p-100 以上等级的计算机就可以安装并且使用愉快啰!还不需要到 P-4 或 AMD K8 等级的计算机呢!不过,如果你要架设的是属于大型的主机(服务上百人以上的主机系统), 那么就需要比较好一点的机器了。不过,目前市面上任何一款个人计算机均可以达到这一个要求 啰! • 适合需要小核心程序的嵌入式系统: 由于 Linux 只要几百 K 不到的程序代码就可以完成一个完整的操作系统, 因此相当适合于目前 家电或者是小电子用品的操作系统呢!那就是当红炸子鸡『嵌入式』系统啦! Linux 真的是很适 合例如手机、数字相机、PDA、家电用品等等的微电脑操作系统呢! ^_^ 反正 Linux 好处说不完啦!不过虽然 Linux 具有这样多的好处, 但是他先天上有一个足以致命的地方, 使他的普及率受到很大的限制,就是 Linux 需要使用『指令列』 的终端机模式进行系统的管理!虽然近 年来有很多的图形接口开发使用在 Linux 上面,但毕竟要熟悉 Linux 还是以指令列来使用是比较好的, 因此要接受 Linux 的玩家必须比较要能熟悉对计算机下指令的行为,而不是用鼠标点一点 icon 就行了! 不过如果只是要架一些简单的小站呢?是不是大家都可以做的到?没错!其实只要对 Linux 做一些小小的 设定就可以架站了!Linux 还可以改进的地方: • 没有特定的支持厂商:因为在 Linux 上面的所有套件几乎都是自由软件, 而每个自由软件的开 发者可能并不是公司团体,而是非营利性质的团体。如此一来, 在您 Linux 主机上面的软件若 发生问题,该如何是好? 好在由于目前 Linux 商业界的整合还不错,目前在台湾比较具名的 Red Hat 与 SuSE 均有设立了服务点。您可以经由这个服务点来直接向他们购买/咨询相关的软硬件问 题呢! 不过,如果您并非选择有专门商业公司的 Linux distributions 时?怎么办? 没有专人 到府服务呢~这点倒是还不需要太担心, 因为拜网络风行之赐,你要问的问题几乎在网络上都可 以找到答案喔!看你有没有用心去找就是了! • 图形接口作的还不够好:虽然早在 1994 年 Linux 1.0 版释出时, 就已经含有 XFree86 的 X Window 架构了。不过, X Window 毕竟是 Linux 上的一个软件, 他并不是 Linux 最核心的部 分,有没有他对 Linux 的服务器执行都没有影响的! 所以鸟哥通常是不玩 X Window 的啦! 但 其实有更多人对于 Linux 并非是着眼在网络服务器,而是一般桌上型计算机的使用, 这一点对 于 Linux 来说,还是不够好!即使目前已有 KDE (http://www.kde.org/) 及 GNOME (http://www.gnome.org/) 等优秀的窗口管理程序, 不过,毕竟整合度还是需要加强,希望未来 可以看到整合度超高的 Linux 桌上型计算机呢! 其它 Linux 相关 还有一些数据需要提醒大家的呢! • 依循标准: Linux 有个优良的传统,那就是支持比较公认而正式的标准, 例如开发时就使用的 POSIX 规范。此外, 由 于 Linux 是一个没有『规格品』样式的新鲜玩意儿, 如果大家都自己玩自己的,那么可想而知的是,未 来想要在 Linux 这个操作系统上面发展软件与硬件的厂商一定会无所适从的! 为了让软件开发商、与硬 件发展者有一个依循的方向,因此而有 Linux Standard Base (LSB) 及 File system Hierarchy Standard (FHS) 这些个玩意儿的诞生!所以,各个 distribution 也都要遵循 LSB 上面的规范,软硬件发展者也都 会依循 LSB ,所以啰,我们才会常常说,各大 distribution 虽然在提供的工具与创意上面有所不同,但 是基本上,他们的 Linux 架构都是很类似的!因此,你只要玩一套 Linux distribution 也就够了!其它 的 distribution 应该就难不倒你啰! • FHS: http://www.pathname.com/fhs/ • LSB: http://www.linuxbase.org/ • 服务器、工作站、终端机... 由于网络的盛行,我们或许常常会听到一些名词ㄋㄟ~所以,底下先来介绍几个简单的网络名词吧! ^_^, 来认识一下什么是 服务器 ( Server )、工作站 ( Workstation ) 与终端机 ( Ternianl )?简单的来说, 你可以这样认为: • 服务器 ( Server ):提供 Internet 一种以上的网络服务的主机,例如 yahoo 提供的是 WWW 的 服务,那么 yahoo 就可以称之为 服务器 了!那么,你自己架设一台 mail server 呢?呵呵! 那也是一个小型的服务器啰!所以,你必须要清楚的知道, 服务器是有规模大小之分的!目前一 部 Linux 上面就可以架设多个服务器软件啰!例如 WWW 服务器的 Apache 软件、 FTP 服务器的 Wu-ftp 软件等等的; • 工作站 ( Workstation ) :基本上, 工作站可以视为仅提供一群特定人士,作为数值分析、科 学用途的机器。例如鸟哥的研究室有一部 Sun 的机器,他仅提供我们研究室内部几部计算机的联 机,当我们有需要使用到 Fortran 这个程序语言时,就联机进入 Sun 这部机器,并在上面进行 我们所需要的计算工作! 这个就是工作站啦。而工作站与服务器的差别,大概就在于有没有提供 internet 上面的服务而已,例如,如果我将 Sun 上面的 mail server 开启之后, 那么这部机 器就可以称之为服务器了!同时也是我们的工作站喔! 当然,更广义的定义是,只要是没有对 Internet 上面提供网络服务的,那就是工作站了!这当然也就包含所谓的终端机! • 终端机 ( Terminal ) :简单的说,就是 end-user ( 就是你啦 ) 前面的那部计算机!呵呵,例 如鸟哥都是使用我的工作机 ( Windows ) 连上我们的主机来工作,那么这一部 Windows 的计算 机,就可以称为 terminal 机器啰!不过,更狭义的来说,『终端机』本身应该是不具备任何可 以作业的软件的, 在终端机上面一定要连上 Server 之后,才能进行各项作业! 那才是最狭义 的终端机啰!例如我们前面说过的 早期的大型主机联机模式! 大致上的分别可以用上面的观点来看! • 几个常见的授权模式与定义 现在市面上有好多的软件,有的是自由软件,有的是专利软件。 有的专利软件免费,有的自由软件要钱~ 啊!好烦啊!怎么分辨这些东西? 其实,鸟哥并不是律师,对于法律也不十分懂,不过, 还是有几个授 权模式可以来谈一谈~ • Open Source :Open source 表示软件释出时, 一定伴随着原始码的释出喔!通常他有几个好处: 1. 程序设计师通常会等到程序成熟之后才会释出 ( 免得被笑, ^_^ ), 所以通常程序在雏 形的时候,就已经具有相当的优良体质; 2. Open Source 的精神,相信当程序原设计人将程序原始码释出之后, 其它的程序设计师 接受这份原始码之后,由于需要将程序改成自己所需的样式, 所以会经由本身的所学来 加以改良,并从中加以改良与除虫,所以程序的 debug 功能会比传统的 close source 来的快! 3. 由于程序是伴随原始码的,因此,系统将会不易存在鲜为人知的木马程序或一些安全漏 洞, 相对而言,会比较更加的安全! Open source 的代表授权为 GNU 的 GPL 及 BSD 等等: o GNU General Public License : 这个可以由刚刚的说明了解,他主要定义在『自由软 件』上面,任何挂上 GPL 授权的软件,需要公布其原始码 ( Open Source ),GPL 有几 个主要的大方向: 1. 任何个人或公司均可释出自由软件 ( free software ); 2. 任何释出自由软件的个人或公司,均可由自己的服务来收取适当的费用; 3. 该软件的原始码 ( Source Code ) 需要随软件附上,并且是可公开发表的; 4. 任何人均可透过任何正常管道取得此一自由软件,且均可取得此一授权模式。 更多的 GPL 可参考附录 A 的中文化条文! o Berkeley Software Distribution (BSD) :使用 BSD source code 最常接触到的就是 BSD 授权模式了!这个授权模式其实与 GPL 很类似,而其精神也与 Open Source 相呼 应呢! 此外,近期以来还有 Apache 的授权、 Sun 的授权,好多好多~ • Close Source : 程序的核心是封闭的,优点是有专人维护,您不需要去更动他;缺点则是灵活 度大打折扣, 使用者无法变更该程序成为自己想要的样式,此外,若有木马程序或者安全漏洞, 将会花上相当长的一段时间来除错!这也是所谓专利软件 (copyright) 常见的软件出售方式。 代 表的授权模式有: o Freeware :不同于 Free software , Freeware 为『免费软件』而非『自由软件!』 虽然它是免费的软件,但是不见得要公布其原始码, 端看释出者的意见啰!这个东西与 Open Source 毕竟是不太相同的东西喔! 此外,目前很多标榜 免费软件 的程序很多都 有小问题!例如假借免费软件的名义, 实施使用者数据窃取的目的!所以 『来路不明 的软件请勿安装!』 o Shareware :共享软件这个名词就有趣了! 与免费软件有点类似的是, Shareware 在 使用初期,它也是免费的,但是, 到了所谓的『试用期限』之后,您就必须要选择『付 费后继续使用』或者『将它移除』 的宿命~通常,这些共享软件都会自行撰写失效程序, 让你在试用期限之后就无法使用该软件。 重点回顾 • 计算机主要以二进制作为单位,而目前常用的磁盘容量单位为 bytes,其单位换算为 1Byte = 8bits, 其它的以 1024 为其倍数,如 1GByte=1024MBytes 等等。 • 操作系统(Operation System)主要在管理与驱动硬件,因此必须要能够管理内存、管理装置、 负 责行程管理以及系统呼叫等等。因此,只要能够让硬件准备妥当 (Ready) 的情况, 就是一个阳 春的操作系统了。 • 最阳春的操作系统仅在驱动与管理硬件,而要使用硬件时,就得需要透过应用软件或者是壳程序 (shell) 的功能,来呼叫操作系统操纵硬件工作。因此,目前称为操作系统的, 除了上述功能外, 通常已经包含了日常工作所需要的应用软件在内了。 • Unix 的前身是由贝尔实验室(Bell lab.)的 Ken Thompson 利用组译语言写成的, 后来在 1971-1973 年间由 Dennis Ritchie 以 C 程序语言进行改写,才称为 Unix。 • 1977 年由 Bill Joy 释出 BSD (Berkeley Software Distribution),这些称为 Unix-like 的操 作系统。 • 1984 年由 Andrew Tannenbaum 制作出 Minix 操作系统,该系统可以提供原始码以及软件; • 1984 年由 Richard Stallman 提倡 GNU 计划,倡导自由软件(Free software), 强调其软件可 以『自由的取得、复制、修改与再发行』,并规范出 GPL 授权模式, 任何 GPL (General Public License) 软件均不可单纯仅贩卖其软件,也不可修改软件授权。 • 1991 年由芬兰人 Linus Torvalds 开发出 Linux 操作系统。简而言之,Linux 成功的地方主要 在于: Minix(Unix), GNU, Internet, POSIX 及虚拟团队的产生。 • Linux 本身就是个最阳春的操作系统,其开发网站设立在 http://www.kernel.org,我们亦称 Linux 操作系统最底层的数据为『核心, Kernel』。 • 目前 Linux 的发展分为两种版本,分别是稳定版本的偶数版,如 2.6.X,适合于商业与家用环境 使用; 一种是发展中版本如 2.5.X 版,适合开发特殊功能的环境。 • Linux distributions 为 Linux 的 Kernel + Tools + Free Software + Documentations + 可 完整安装的程序所制成的一套完整的系统。 习题练习 ( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看) • 一个完整的操作系统至少要能够完整的控制整个硬件,请问,操作系统应该要控制硬件的哪些单 元? 至少要能够控制:(1)input/output crontrol, (2)device control, (3)process management, (4)file management. 等等! • 核心的功能在于管控整个系统的硬件,这包括了 CPU 运算单元的管理,输入/输出的管理,内存 的管理等等。 那么请问一个较为完整的操作系统,应该包含哪些部分? 应包含 Kernel + Kernel Tools + Applications 等等 • 一个 GBytes 的硬盘空间,等于几个 KBytes ? 1GBytes = 1024 MBytes * 1024 KBytes/MBytes = 1048576 KBytes • 你在你的主机上面安装了一张网络卡,但是开机之后,系统却无法使用,您确定网络卡是好的, 那 么可能的问题出在哪里?该如何解决? 因为所有的硬件都没有问题,所以,可能出问题的地方在于系统的核心(kernel) 不支持这张网络 卡。解决的方法,到网络卡的开发商网站,下载支持您主机操作系统的驱动程序, 安装网络卡驱 动程序后,就可以使用了。 • 我在一部主机上面安装 Windows 操作系统时,并且安装了显示卡的驱动程序,他是没有问题的。 但是安装 Linux 时,却无法完整的显示整个 X Window 。请问,我可不可以将 Windows 上面的 显 示卡驱动程序拿来安装在 Linux 上? 不行!因为核心不同,针对硬件所写的驱动程序也会不相同, 编译器也不同,当然,驱动程序也 无法在两个操作系统间兼容。 这也是为何开发商在他们的网站上面,都会同时提供许多不同操作 系统的驱动程序之故。 • 我在 Windows 上面玩的游戏,可不可以拿到 Linux 去玩? 当然不行!跟上一题相似的,因为游戏也是一个应用程序 (application), 他必须要使用到核心 所提供的工具来开发他的游戏, 所以这个游戏是不可在不同的平台间运作的。除非这个游戏已经 进行了移植。 • 什么是软件的移植? 程序是由程序代码(通成为 ASCII 格式)经过编译器编译成为 binary file 之后, 才能够在该操 作系统上面执行。因此,您可以将您的程序的程序代码修改成可以适应 其它操作系统的环境,并 且加以编译,使程序可以在其它平台上运作, 这个修改的动作即为移植。 • Linux 本身仅是一个核心与相关的核心工具而已,不过,他已经可以驱动所有的硬件, 所以,可 以算是一个很阳春的操作系统了。经过其它应用程序的开发之后,被整合成为 Linux distribitions。请问众多的 distributions 之间,有何异同? 相同:利用同样的 Linux kernel (http://www.kernel.org),几乎相同的自由软件套件 (例如 GNU 里面的 gcc/glibc/vi/apache/bind/sendmail... ),几乎相同的操作接口 (例如均使用 bash/KDE/GNOME 等等)。 不同:使用的 kernel 与各软件的版本可能会不同;各开发商加入的应用工具不同, 使用的套件 管理模式不同(debian 与 RPM) • Unix 是谁写出来的? GNU 计划是谁发起的? Unix 是 Ken Thompson 写的,1973 年再由 Dennis Ritchie 以 C 语言改写成功。 至于 GNU 与 FSF 则是 Richard Stallman 发起的。 • GNU 的全名为何?他主要由那个基金会支持? GNU 是 GNU is Not Unix 的简写,是个无穷循环! 另外,这个计划是由自由软件基金会 (Free Software Foundation, FSF) 所支持的! 两者都是由 Stallman 先生所发起的! • 我要如何取得 Linux distribution 的可安装光盘? 目前各大版本的 Linux distribution 大致上仍然依附在 GPL 这个版权宣告上, 因此在网络上 面都可以轻易的下载,若有兴趣的话可以到各发展的厂商主网页去下载。 然而为了频宽的节省起 见,建议在台湾以映像站台来下载速度上会快上很多, 特别建议南台湾朋友可以到义守大学的 FTP 站 ( http://ftp.isu.edu.tw/ )下载资料! • 简单的说明一下什么是 GNU 的 GPL ? 1. 任何个人或公司均可释出自由软件 ( free software ); 2. 任何释出自由软件的个人或公司,均可由自己的服务来收取适当的费用; 3. 该软件的原始码 ( Source Code ) 需要随软件附上,并且是可公开发表的; 4. 任何人均可透过任何正常管道取得此一自由软件,且均可取得此一授权模式。 • 何谓多人 ( Multi-user ) 多任务 ( Multitask )? Multiuser 指的是 Linux 允许多人同时连上主机之外, 每个使用者皆有其各人的使用环境,并 且可以同时使用系统的资源! Multitask 指的是多任务环境,在 Linux 系统下, CPU 与其它例如网络资源可以同时进行多项 工作, Linux 最大的特色之一即在于其多任务时,资源分配较为平均! • 简单说明 GNU General Public License ( GPL ) 与 Open Source 的精神: 1. GPL 的授权之软件,乃为自由软件(Free software),任何人皆可拥有他; 2. 开发 GPL 的 团体(或商业企业)可以经由该软件的服务来取得服务的费用; 3. 经过 GPL 授权的软件,其属于 Open source 的情况,所以应该公布其原始码; 4. 任何人皆可修改经由 GPL 授权过的软件,使 符合自己的需求; 5. 经过修改过后 Open source 应该回馈给 Linux 社群。 • 有个朋友问我说『 Linux 是什么?』我该如何回答比较好? 简单的说, Linux 就是一个操作系统,或者说, Linux 是操作系统最底层的核心。 这个核心可 以管理整个计算机硬件,让计算机硬件可以完整的运作起来,并等待使用者输入指令。最早 Linux 是由 Torvalds 在 1991 年写出来的,后来由于他承接了 Unix 的良好传统:稳定性高、 多人多 任务的环境设计优良、要求配备较低等优点,所以很多软件开发商在这个核心上面开发, 而某些 厂商将这些软件与核心整合成为可以完整安装的光盘,而成为目前大家常常听到的 Linux 操作系 统了。 • 什么是 POSIX ?为何说 Linux 使用 POSIX 对于发展有很好的影响? POSIX 是一种标准规范,主要针对在 Unix 操作系统上面跑的程序来进行规范。 若您的操作系统 符合 POSIX ,则符合 POSIX 的程序就可以在您的操作系统上面运作。 Linux 由于支持 POSIX , 因此很多 Unix 上的程序可以直接在 Linux 上运作, 因此程序的移植相当简易!也让大家容易 转换平台,提升 Linux 的使用率。 • Linux 的发展主要分为哪两种核心版本? 主要分为奇数的发展中版本(develop),如 2.5 ,及偶数的稳定版本,如 2.6 。 • 简单说明自由软件 (free software) 与开放源码 (open source) 的差异? 自由软件意指:你可以拥有自由的取得、复制、修改、再发行该软件的权利, 由于具有这些权利, 因此自由软件通常是 Open source 的。 开放源码意指:软件释出时,同时释出原始码,但使用者取得原始码后,能否修改该原始码, 则 依据该软件的授权而定。 意思就是说,自由软件是 Open source 的,但是 Open source 的软件则不见得是自由软件! • 什么是 Linux 的 Live CD ? 所谓的 Live CD 就是将完整的 Linux distribution 放置到一片光盘 (目前也有 DVD 版本了) 当中, 然后透过重新开机以『光盘开机』,就能够不使用硬盘直接进入 Linux 系统的环境。 • 简单说明 Linux 成功的因素? 1. 藉由 Minix 操作系统开发的 Unix like ,没有版权的纠纷; 2. 藉助于 GNU 计划所提供的各项工具软件, gcc/bash 等; 3. 藉由 Internet 广为流传; 4. 藉由支持 POSIX 标准,让核心能够适合所有软件的开发; 5. 托瓦兹强调务实,虚拟团队的自然形成! 参考数据 • 王孝熙等,2002,『计算器概论』,台湾东华书局出版。 • 葛林穆迪着,杜默译,『Linux 传奇』,时报文化出版企业。 • 网络农夫,2001, Unix 简史 http://netlab.cse.yzu.edu.tw/~statue/freebsd/docs/csh/ • Ken Thompson 的个人网站: http://plan9.bell-labs.com/cm/cs/who/ken/index.html • Dennis Ritchie 的个人网站: http://cm.bell-labs.com/cm/cs/who/dmr/ • Richard Stallman 的个人网站: http://www.stallman.org/ • GNU 计划: http://www.gnu.org • 洪朝贵老师的 GNU/FSF 介绍: http://saturn.stu.edu.tw/~ckhung/a/c_83.php 如何学习 Linux 最近更新日期:2005/06/08 目前 Linux 上头有两种主要的操作模式,分别是图形接口与文字接口, 那么学习 Linux 要用 X-Window ( 图形接口 ) 好还是 Command Line ( 文字接口 ) 好? 这两种学习心态有什么优缺点呢?此外,有没有 良好的入门文件可供参考?! Linux 学习有困扰的时候应该要如何发问?!要到哪里去搜寻网络资源?! 还有,怎样进行有智慧的提问?嗯!在这一章里面,我们好好谈一谈! 1. Linux 的应用 2. 基础学习 2.1 从『头』学习 2.2 选择一本易读的工具书 2.3 实作再实作 3. 学习的方法 3.1 X Widnow 还是 command line ? 3.2 主机/网络数据查询 3.3 真的没办法,发问吧! 3.4 鸟哥的建议(重点在 solution 的学习) 4. 本章习题练习 5. 针对本文的建议:http://phorum.vbird.org/viewtopic.php?t=23872 Linux 的应用 前一章节我们谈到了 Linux 相关的历史, 与简单的介绍了一下 Linux 这个『Kernel』与 Linux distributions 等等。 而在开始进入 Linux 的基础学习之前,我们有必要了解一下应该要如何有效的学 习 Linux 的! 但在谈到 Linux 如何学习之前,我们得就 Linux 目前的一般应用来说明一下, 才好理解 您需要什么样的学习方式!目前 Linux 的应用至少有底下这些: • 网络服务器: 承袭了 Unix 高稳定性的良好传统, Linux 上面的网络功能特别的稳定与强大! 此外,由于 GNU 计划与 Linux 的 GPL 授权模式,让很多优秀的软件都在 Linux 上面发展, 且这些在 Linux 上面的服务器软件 几乎都是自由软件! 因此,做为一部网络服务器,例如 WWW, Mail Server, File Server, FTP Server 等 等, Linux 绝对是上上之选!当然,这也是 Linux 的强项! • 工作站计算机: 如同前一章提到的,工作站计算机与服务器不一样的地方,大概就是在于网络服务了。 工作站计算机本身 是不应该提供 Internet 的服务的(LAN 内的服务则可接受)。 此外,工作站计算机与桌上型计算机不太一 样的地方,在于工作站通常得要应付比较重要的公事应用, 例如工程界流体力学的数值模式运算、娱乐事 业的特效功能处理、软件开发者的工作平台等等。 Linux 上面有强大的运算能力,以及支持度相当广泛的 GCC 编译软件, 因此在工作站当中也是相当良好的一个操作系统选择。 例如鸟哥所在的研究室目前就要将 Sun Unix 上面执行的大型模式移转到 Linux 上面, 据美国环保署内 部人员的测试,发现 Linux 不但比较便宜 ( X86 系统嘛! )而且速度还比较快呢! • 桌上型计算机: 所谓的桌上型计算机,其实就是你我在办公室使用的计算机啦。一般我们称之为 Desktop 的系统。 那么 这个 Desktop 的系统平时都在做什么呢?大概都是这些工作吧: • 上网浏览; • 文书处理; • 网络接口之公文处理系统; • 办公室软件( Office Software )处理数据; • 收发电子邮件; 这些工作要被进行他需要什么东西在 Desktop 的计算机上面呢很简单, 『就是需要窗口』! 因为上网浏 览、文书编排的所见即所得接口,以及电子公文系统等等, 如果没有窗口接口的辅助,那么将对使用者造 成很大的困扰。而众所皆知的, Linux 早期都是由工程师所发展的,对于窗口接口并没有很需要,所以造 成 Linux 不太亲和的印象。 好在,为了要强化桌上型计算机的使用率, Linux 与 X Window System 结合了! 如同前一章里面的说明, 要注意的是, X Window System 仅只是 Linux 上面的一套软件, 而不是核心喔!所以即使 X Window 挂 了,对 Linux 也可能不会有直接的影响呢! 好,我们就来谈一谈 X Window System 吧! • 由前一章提到的 Unix 与 Linux 的历史中,我们知道在 1986 年美美的窗口画面就已经在 Unix 上面出现过了,那个时候窗口画面被简称为 X 系统,而后来到了 1994 年的时候正式被整合在 Linux 里头!至于微软的 Windows 则是在 1995 年才出现! • 所谓的 X Window System 就是以 XFree86 这个计划释出的 X11 这个窗口软件为管理显示核心的 一套窗口接口的软件,我们常常简称他为 图形使用者接口( Graphical User Interface )。 这 个 XFree86 只是 Linux 核心上面的一套软件而已, 他主要的工作就是管理图形接口输出的时 候,几乎所有显示相关的硬件的控制, 例如显示卡、屏幕、键盘、鼠标、等等,都是 XFree86 管 理的!或者, 我们可以称 XFree86 为 X-Window System 的服务器,简称为 X Server 。 • 至于我们所看到的美美的窗口画面,则是使用 X Server 提供的显示相关硬件的功能, 来达到图 形显示的『窗口管理员( Window Mananger, WM )』所发挥的能力啦! 这也就是说, WM 是挂在 X Server 上面来运作的一套显示窗口接口的软件,例如我们常见的 KDE, GNOME 等等都是 WM。 由于 Linux 整合了 X Window System ,虽然还有改善的空间,不过,却也已经具有相当个规模了! 目前 的 Linux 不但有强大美观的 KDE,以及 KDE 附加的 KOffice 办公室软件, 还有由 Sun 开发释出的自由 软件 Start Office 以及修订过后的 Open Office 等办公室软件, 这些办公室软件同时也都拥有 文书处 理、电子电子表格、简报软件等等,哇!功能太齐全了! 也就是说,目前的 Linux 桌面应用上,已经可 以应付大部分上班族群的工作需求了! • 嵌入式系统: 近年来电子相关产业相当的蓬勃发展,其中,小型微电脑的发展甚为重要! 例如家电产品、PDA、手机、 数字相机以及其它微型的计算机配备。 这些计算机配备也都是需要操作系统来控制的!而操作系统是直接 嵌入于产品当中的, 例如 PDA 本身就是一个小型的计算机操作系统啦!这些系统我们就称为嵌入式系统。 Linux 在这些嵌入式系统当中的应用是相当好的!因为 Linux 的核心的可变动性, 以及核心的小而美、 效能佳的特性,让他在嵌入式设备的市场当中,具有很大的竞争优势! Linux 的核心有多小呢?在您的 PC 上的 Linux (假设您已经安装了 Linux 了) 核心最大绝对不会超过 2MB ,呵呵!够小了吧?而这个核心 里面还包含了很多可能用不到的模块,所以将所有不需要的功能移除,仅留下需要的程序,那么几百 KBytes 甚至几十 KBytes 的 Linux 核心 都可以被制作出来喔!所以啊,这对于嵌入式设备锱铢必较的内存空间来 说, 真是相当的优秀啊! 网络服务器、工作站计算机、桌上型计算机等等,就是 Linux 目前最常被应用的环境了。 而您如果想要 针对桌上型计算机,或者是网络服务器主机来学习的话,对于 Linux , 您应该如何进行学习的课题呢? 底下我们就来谈一谈。 基础学习 我们在 第零章 提到过 学习心态的分别 ,如果您看过的话,应该就不难理解,如果您仅想要了解 Linux , 并且利用 Linux 来作为您的桌上型计算机的话,那么,您只需要购买一本介绍 Linux 桌面设定,例如 中 文输入法、打印机设定、因特网设定等等概念的的书籍即可, 不需要特别针对 Linux 来进行什么特殊的 学习的!反正利用 Linux 的 X Window System 的图形接口就可以达到您的需求了!您可以选择专为桌上 型计算机发行的 Linux distributions 例如: • Ubuntu: http://www.ubuntulinux.org/ • Novell SuSE: http://www.novell.com/linux/suse/ • Mandriva: http://www.mandriva.com 但是仍须注意的是,SuSE 与 Mandriva 都有出多种版本,请挑选属于 Desktop 的那种喔! 另外,您还可 以参考一些网站的数据: • 杨老师的图解桌面 http://apt.nc.hcc.edu.tw/docs/FC3_X/ • 中文指南 http://tw.ubuntuguide.org/ 不过,如果您不想只学习 Linux 的桌上应用,还想学习更多 Linux 在网络上的应用, 那么单纯的以 X Window 来管理您的 Linux 主机,肯定是不够的! 因为毕竟 X Window 是 Linux 上的一套软件,想用他 来完全掌控 Linux 真的是很不容易的事情~ 而且,在服务器的应用上,档案的安全性、人员账号的管理、 软件的安装/修改/设定、 登录文件的分析以及自动化工作排程与程序的撰写等等,都是需要学习的, 而 且这些东西都还未涉及服务器软件呢!对吧!这些东西真的很重要,所以,您就得要这样学习才行: 从头学习 其实,不论学什么系统,『从头学起』是很重要的!还记得你刚刚接触微软的 Windows 都在干什么?还不 就是由档案总管学起,然后慢慢的玩到控制台、玩到桌面管理, 然后还去学办公室软件,我想,你总该不 会直接就跳过这一段学习的历程吧!?那么 Linux 的学习其实也差不多,就是要从头慢慢的学起啦!不能 够还不会走路之前就想要学飞了吧! ^_^! 常常有些朋友会写信来问鸟哥一些问题,不过,信件中大多数的问题都是很基础的! 例如:『为什么我的 使用者个人网页显示我没有权限进入?』、『为什么我下达一个指令的时候,系统告诉我找不到该指令?』、 『我要如何限制使用者的权限』等等的问题,这些问题其实都不是很难的,只要了解了 Linux 的基础之后, 应该就可以很轻易的解决掉这方面的问题呢! 所以请耐心的,慢慢的,将后面的所有章节内容都看完。自 然你就知道如何解决了! 此外,网络基础与安全也很重要,例如 IP 的基础,网络的 Gateway 设定基础与网络的相关概念!很多的 朋友一开始问的问题就是『为什么我的 mail server 无法收到信件?』这种问题相当的困扰,因为发生的 原因太多了,而朋友们常常一接触 Linux 就是希望『架站!』根本没有想到要先了解一下 Linux 的基础! 这是相当伤脑筋的!尤其近来计算机怪客 ( Cracker ) 相当多, ( 真奇怪,闲闲没事干的朋友还真是不 少.... ) ,一个不小心您的主机就被当成怪客跳板了! 甚至发生被警告的事件也层出不穷!这些都是没 能好好的注意一下网络基础的原因呀! 所以, 鸟哥希望大家能够更了解 Linux ,好让他可以为你做更多的事情喔! 而且这些基础知识是学习更 深入的技巧的必备条件呀!因此建议: 1. 先理解一下基础的硬件知识,不用一定要全懂(没那么多时间),但是至少要『听过、有概念』即 可; 2. 先了解一下 Linux 的基础知识,这些包含了『使用者、群组的概念』、『权限的观念』,『程序 的定义』等等; 3. 必需至少学会一种以上的文书编辑器,例如最好学会通用版本的 vi 啰! 4. 实际操作 Linux 时,必定要学习的 Shell ,最好 Shell scripts 也能够了解; 5. 如果上面你都通过了,那么网络的基础就是下一阶段要接触的咚咚,这部份包含了『IP 概念』『路 由概念』『TCP/IP』等等; 6. 如果连网络基础都通过了,那么网站的架设对你来说,简直就是『太简单啦!』 在一些基础知识上,可能的话,当然得去书店找书来读啊! 如果您想要由网络上面阅读的话,那么这里推 荐一下由 Netman 大哥主笔的 Study-Area 里面的基础文章,相当的实用! • 计算机基础 (http://www.study-area.org/compu/compu.htm) • 网络基础 (http://www.study-area.org/network/network.htm) 选择一本易读的工具书 一本好的工具书是需要的,不论是未来作为查询之用,还是在正确的学习方法上。 可惜的是,目前坊间的 书大多强调速成的 Linux 教育,或者是强调 Linux 的网络功能, 却欠缺了大部分的 Linux 基础管理~ 鸟哥在这里还是要再次的强调,Linux 的学习历程并不容易, 他需要比较长的时间来适应、学习与熟悉, 但是只要能够学会这些简单的技巧, 这些技巧却可以帮助您在各个不同的 OS 之间遨游! 您既然看到这里了,应该是已经取得了鸟哥的 Linux 私房菜 -- 基础学习篇 了吧! ^_^ 。 希望这本书 可以帮助您缩短基础学习的历程,也希望能够带给您一个有效的学习观念! 而在这本书看完之后,或许还 可以参考一下 Netman 推荐的相关网络书籍: • 请推荐有关网络的书 http://linux.vbird.org/linux_basic/0120howtolinux/0120howtolinux_1.php 不过,要强调的是,每个人的阅读习惯都不太一样,所以,除了大家推荐的书籍之外, 您必须要亲眼看过 该本书籍,确定您可以吸收的了书上的内容,再下去购买喔! 实作再实作 要增加自己的体力,就是只有运动;要增加自己的知识,就只有读书;当然,要增加自己对于 Linux 的认 识,大概就只有实作经验了!所以,赶快找一部计算机,赶快安装一个 Linux 套件,然后快点进入 Linux 的世界里面晃一晃!相信对于你自己的 Linux 能力必然大有斩获!除了自己的实作经验之外,也可以参考 网络上一些善心人士整理的实作经验分享喔! 例如最有名的 Study-Area ( http://www.study-area.org ) 等网站。 此外,人脑不像计算机的硬盘一样,除非硬盘坏掉了或者是数据被你抹掉了, 否则储存的数据将永远而且 立刻的记忆在硬盘中!在人类记忆的曲线中, 你必须要『不断的重复练习』才会将一件事情记得比较熟! 同样的,学习 Linux 也一样,如果你无法经常摸索的话,那么,抱歉的是,学了后面的, 前面的忘光光! 学了等于没学,这也是为什么鸟哥当初要写『鸟哥的私房菜』这个网站的主要原因, 因为,我的忘性似乎 比一般人还要好~~呵呵!所以,除了要实作之外,还得要常摸!才会熟悉 Linux 而且不会怕他呢! 好了,底下列出几个学习网站来提供大家做为参考实作的依据: (注:由于不同的网站当初撰写的时候所 用的 Linux 套件或版本与目前的主流并不相同,因此参考他人的实作经验时, 必须要特别留意对方的版 本,否则反而可能造成你的困扰喔!) • Study-Area http://www.study-area.org • 鸟哥的私房菜馆 http://linux.vbird.org • 狼主的网络实验室 http://netlab.kh.edu.tw/index.htm • 卧龙大师的网络技术文件 http://linux.tnc.edu.tw/techdoc/ • 大南国小(林克敏主任文件集) http://freebsd.lab.mlc.edu.tw/ • 张毓麟先生的小文章 http://www.se.ntou.edu.tw/~ylchang/MyDocuments/index.html • 台湾 Linux 社群 http://www.linux.org.tw/ • 吴仁智的文件集 http://www.cses.tcc.edu.tw/~chihwu/ 学习的方法 如果您想透过自学来学习 Linux 的话,那么努力的实作之外, 还需要学的有效的方法。首先,我们就刚 刚也稍微提到的 X Window 与 command line 的议题来继续讨论。 X Window 还是 command line 由前面的介绍我们可以知道,虽然目前 X-Window 的接口越做越漂亮, 而且也已经渐渐的可以来控管整个 系统了!但是必须要注意的是, X-Window 毕竟还只是一个 Linux 上面的软件,并不是一套『操作系统』, 所以实际上使用他来设定系统的时候,还是有相当多的困扰的,因为毕竟他无法完全的管理好我们的 Linux 啊! 虽然就以 Desktop 的型态来说,X-Window 是让 Linux 立刻深入人心的方法。不过, X-Window 在使用的 时候还是有相当多的问题的,最大的问题来自于 『系统资源的有效应用』,以 鸟哥的使用情况来说,我 的系统资源并没有很好,但是 X-Window 本身相当的消耗系统资源,如果一开 X-Window ,那么你的内存 几乎都被 X-Window 吃光了!您要如何来用剩下的系统资源来进行高效率的其它工作呢?! 这也是为什么 很多的书籍与网站都会希望使用者架设网站的时候,不要启动 图形使用者接口的原因啰! 以下再来说说 X-Window 学习与 command line 学习的角度。 • X-Window 如果您对于 Linux 的要求是『桌上型计算机』,并且你又不架设网站的话,那么学习 X-Window 对您而言, 绝对是需要的!至于指令列模式对你就不是这么必要了!但是,如果 Linux 对你而言是『服务器与工作站』 的话,那么 X-Window 可能就不是这么重要, 但是指令列模式可就大大的重要啦! 因为,如果以 X-Window 作为学习 Linux 的方式,那么未来一定会有死角, 这是因为 X-Window 了不起 也只是 Linux 的『一套软件』而不是『Linux 核心』 此外,目前发展出来的 X-Window 对于系统的管理 上还是有无法掌握的地方, 举个例子来说,如果 Linux 本身捉不到网络卡的时候, 请问如何以 X-Window 来捉这个硬件呢?!还有,如果需要以 tarball 的方式来安装软件并加以设定的时候,请以 X-Window 来 架设他!这可能吗?当然可能,但是这是在考验『X-Window 开发商』的技术能力, 对于了解 Linux 架构 与核心并没有多大的帮助的!所以说,如果只是想要『会使用 Linux 』的角度来看,那么确实使用 X-Window 也就足够了,反正搞不定的话, 花钱请专家来搞定即可;但是如果想要更深入 Linux 的话,那么指令列 模式才是不二的学习方式! • 服务器端 如果 Linux 对你而言是『生财』的工具,呵呵!那可不是只要学习 X-Window 能够解决的了!举个例子来 说好了,假如你的客户人在台北,而你人在远方的台南, 他的 Linux 服务器出了问题,要你马上解决他, 请问:要您亲自上台北去修理? 还是他搬机器下来让你修理?!或者是直接请他开个账号给你进去设定即 可?! 想当然尔,就会选择开账号给你进入设定即可啰!因为这是最简单而且迅速的方法!然而这个方法 使用的方式却不是 X-Window 作的到的!因为 X-Window 太耗资源,实在不容易让您这样子联机(很麻烦 的啦!) 所以啰!文字界面是相当重要的!尤其如果想要深入 Linux 的核心时,那么以文字界面来了解 Linux 就更需要了!所以说,不要怕麻烦,还是多摸一些文字界面的东西吧!! 帮助会比较大哩! 所以基本上, VBird 还是希望大家可以多多的以 文字接口( command line )的方式来学习 Linux 啦! 主机/网络数据查询 其实,在 Linux 主机及网络上面已经有相当多的 FAQ 整理出来了! 所以,当你发生任何问题的时候,除 了自己检查, 或者到上述的实作网站上面查询一下是否有设定错误的问题之外,最重要的当然就是到各大 FAQ 的网站上查询啰!以下列出一些有用的 FAQ 网站给您参考一下: • Linux 自己的文件数据: /usr/share/doc (在你的 PC 中) • CLDP 中文文件计划 http://www.linux.org.tw/CLDP/ • Unix 的一般常见问题 http://www.csie.nctu.edu.tw/document/unixfaq/ • The Linux Documentation Project:http://www.tldp.org/ 上面比较有趣的是那个 LDP (Linux Documentation Project), 他几乎列出了所有 Linux 上面可以看到 的文献数据,各种 How-To 的作法等等,虽然是英文的, 不过,很有参考价值! 除了这些基本的 FAQ 之外,其实,还有更重要的问题查询方法,那就是利用酷狗 (Google) 帮您去搜寻答 案呢!在鸟哥学习 Linux 的过程中,如果有什么奇怪的问题发生时, 第一个想到的,就是去 http://www.google.com.tw 搜寻是否有相关的议题。 举例来说,我想要找出 Linux 底下的 NAT ,只要 在上述的网站内,输入 Linux 跟 NAT, 立刻就有一堆文献跑出来了!真的相当的优秀好用喔! 您也可以 透过酷狗来找鸟哥网站上的资料呢! http://linux.vbird.org/Searching.php 真的没办法,发问吧! 如果自己真的都找过了相关的信息,却还是无法得到答案时,只好去网络上面求救了。 但是,不要直接问 问题呢~发问之前,务必注意过底下这些事情: • 注意讯息,自行解决: 一般而言, Linux 在下达指令的过程当中,或者是 log file 里头就可以自己查得错误信息了,举个例子 来说,当您下达: ls -l /vbird 时,由于系统并没有 /vbird 这个目录,所以会在屏幕前面显示: ls: /vbird: No such file or directory 这个错误讯息够明确了吧!系统很完整的告诉您『查无该数据』! 呵呵!所以啰,请注意,发生错误的时 候,请先自行以屏幕前面的信息来进行 debug ( 除错 )的动作,然后,如果是网络服务的问题时,请到 /var/log 这个目录里头去查阅一下 log file (登录档),这样可以几乎解决大部分的问题了! • 搜寻问题的信息: 一般来说,如果发生错误现象,一定会有一些讯息对吧! 那么当您要请教别人之前,就得要将这些讯息整 理整理, 否则网络上人家也无法告诉您解决的方法啊!这一点很重要的喔! • 讨论区的提问: 万一真的经过了自己的查询,却找不到相关的信息,那么就发问吧! 不过,在发问之前建议您最好先看一 下『 提问的智慧 http://phorum.vbird.org/viewtopic.php?t=96』 这一篇讨论!然后,你可以到底下几 个讨论区发问看看: • Study-Area 讨论区 http://phorum.study-area.org • 鸟哥的私房菜馆讨论区 http://phorum.vbird.org • 狼主的网络实验室讨论区 http://netlab.kh.edu.tw/board/board.asp • telnet://bbs.sayya.org 不过,基本上去每一个讨论区回答问题的熟手,其实都差不多是那几个, 所以,您的问题『不要重复发表 在各个主要的讨论区!』 举例来说,鸟园与酷学园讨论区上的朋友重复性很高,如果您两边都发问, 可 能会得到反效果,因为大家都觉得,另外一边已经回答您的问题了呢~~ 此外,发问的时候一定要注意到某些礼节!最好是先以搜寻的方式搜寻一下 该讨论区是否有您需要的文章 之后,在发问!这样可以获得事半功倍的功能喔!此外, Netman 兄提供的一些学习的基本方针,提供给 大家参考: • 在 Windows 里面﹐程序有问题时﹐如果可能的话先将所有其它程序保存并结束﹐ 然后尝试按救 命三键(Ctrl+Alt+Delete)﹐将有问题的程序(不要选错了程序哦) “结束工作”﹐看看能不能恢 复系统。不要动不动就直接关机或 reset。 • 有系统地设计档案目录﹐不要随便到处保存档案以至以后不知道放哪里了﹐ 或找到档案也不知 道为何物。 • 养成一个做记录的习惯。尤其是发现问题的时候﹐把错误信息和引发状况以及 解决方法记录清楚 ﹐同时最后归类几定期整理。别以为您还年轻﹐ 等你再弄多几年计算机了﹐您将会非常庆幸您有 此一习惯。 • 如果看在网络上看到任何好文章﹐可以为自己留一份 copy﹐同时定好题目﹐归类存档。 • 作为一个使用者﹐人要迁就机器﹔做为一个开发者﹐要机器迁就人。 • 学写 script 的确没设定 server 那么好玩﹐不过以我自己的感觉是﹕ 关键是会得“偷”﹐偷 了会得改﹐改了会得变﹐变则通矣。 • 在 Windows 里面﹐设定不好设备﹐您可以骂它﹔在 Linux 里面﹐如果设定好设备了﹐您得要感激 它﹗ 鸟哥的建议: 除了上面的学习建议之外,还有其它的建议吗?确实是有的!其实, 无论作什么事情,对人类而言,两个 重要的因素是造成我们学习的原动力: • 成就感 • 兴趣 很多人问过我,鸟哥是怎么学习 Linux 的?由鸟哥之前的 自我介绍 与对于 Linux 的接触历程,你大概 会知道, 原来我本人对于计算机就蛮有兴趣的,加上工作的需要,而鸟哥又从中得到了相当多的成就感, 所以啰,就一发不可收拾的爱上 Linux 啰!因此,鸟哥个人认为,学习 Linux 如果玩不出兴趣,他对你 也不是什么重要的生财工具,那么就不要再玩下去了! 因为很累人ㄋㄟ~而如果你真的想要玩这么一套优 良的操作系统, 除了前面提到的一些建议之外,说真的,得要培养出兴趣与成就感才行! 那么如何培养 出兴趣与成就感呢?可能有几个方向可以提供给你参考: • 建立兴趣:Linux 上面可以玩的东西真的太多了, 你可以选择一个有趣的课题来深入的玩一玩! 不论是 Shell 还是图形接口等等,只要能够玩出兴趣,那么再怎么苦你都会不觉得喔! • 成就感:成就感是怎么来的?说实在话, 就是『被认同』来的!怎么被认同呢?写心得分享啊! 当你写了心得分享,并且公告在 BBS 上面,自然有朋友会到你的网页去瞧一瞧,当大家觉得你的 网页内容很棒的时候, 哈哈!你肯定会加油继续的分享下去而无法自拔的!那就是我啦...... ^_^!而且,就鸟哥的经验来说,你『学会一样东西』与 『要教人家会一样东西』思考的纹路是 不太一样的! 学会一样东西可能学一学会了就算了!但是要『教会』别人,那可就不是闹着玩的! 得要思考相当多的理论性与实务性方面的咚咚,这个时候,你所能学到的东西就更深入了! 鸟哥 常常说,我这个网站对我在 Linux 的了解上面真的的帮助很大! • 协助回答问题: 另一个创造成就感与满足感的方法就是『助人为快乐之本!』当你在 BBS 上面 告诉一些新手,回答他们的问题,你可以获得的可能只是一句『谢谢!感恩吶!』 但是那句话真 的会让人很有快乐的气氛!很多的老手都是因为有这样的满足感, 才会不断的协助新来的朋友的 呢!此外,回答别人问题的时候,就如同上面的说明一般, 你会更深入的去了解每个项目,哈哈! 又多学会了好多东西呢! • 参与讨论: 参与大家的技术讨论一直是一件提升自己能力的快速道路!因为有这些技术讨论, 你 提出了意见,不论讨论的结果你的意见是对是错,对你而言,都是一次次的知识成长!这很重要 喔! ^_^。目前活动力很高的台南 Linux 使用者社群 (Tainan Linux User Group, TnLUG) 在每 个月都会举办研讨会,目前每个月在台南与台北两地均有举办呢!有兴趣参加讨论的朋友可以看 看: http://tnlug.linux.org.tw/ 此外,除了这些鸟哥的经验之外,还有在 BBS 上面有一封对于 Linux 新手相当有帮助的文件数据,大家 可以多看一看: • 李果正先生之 GNU/Linux 初学者之旅: http://info.sayya.org/~edt1023/linux_entry.html 鸟哥这里有也一个备份 http://linux.vbird.org/linux_basic/0120howtolinux/0120howtolinux_3.php • 信息人的有效学习(洪朝贵教授网页) http://www.cyut.edu.tw/~ckhung/published/018learn.shtml 除了这些基本的初学者建议外,其实,对于未来的学习,这里建议大家要『眼光看远!』!! 一般来说, 公司行号会发生问题时,他们绝不会只要求各位『单独解决一部主机的问题』而已, 他们需要的是整体环 境的总体解决『Total Solution』。 而我们目前学习的 Linux 其实仅是在一部主机上面进行各项设定而 已, 还没有到达解决整体公司所有问题的状态。当然啦,得要先学会 Linux 相关技巧后, 才有办法将这 些技巧用之于其它的 solution 上面! 所以,大家在学习 Linux 的时候,千万不要有『门户之见』,认为 MS 的东西就比较不好~ 否则,未来 在职场上,竞争力会比人家弱的!有办法的话, 多接触,不排斥任何学习的机会!都会带给自己很多的成 长! 而且要谨记:『不同的环境下,解决问题的方法有很多种,只要行的通,就是好方法!』 本章习题练习 ( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 ) • 我的计算机上面老是出现问题,他会有一个错误讯息为 『fatal: SASL per-connection security setup』 请帮我找出可能的原因为何? 先跑到 http://www.google.com.tw 里面去,输入上列的错误讯息, 就可以找到很多文件,根据 文件去判断吧! • Windows 的操作系统当中,老是自动出现一个名为 internet optimizer 的软件, 我想要知道他 是什么,可以怎么找? 利用 http://www.google.com.tw 输入 inetnet optimizer 后, 就可以找到相关的信息。基本 上,这是一个木马程序啦!赶紧移除吧! • 我的 Linux 发生问题,我老是找不到正确的答案,想要去 http://phorum.study-area.org 提问, 应该要先做哪些动作才发问? 1. 先将您 Linux 上面的问题作一个清楚的描述,例如,做了什么动作,结果发生了什么讯息与 结果。 2. 先到 http://phorum.study-area.org 内的『搜寻』查询有无相关的问题 3. 再到 http://www.google.com.tw 查询一下有无相关的信息 4. 将您的问题描述写下,并且写下您的判断,以及查询过数据的结果。 5. 等待回复~ • 你觉得学习 Linux 最重要的一环是什么? 其实是自己的学习心态~最重要的地方在于能够『刻苦耐劳~』 ^_^ • 什么是 LDP ?全名为何?网站在哪里? LDP 是 Linux Documentation Project 的缩写,内容提到的是 Linux 操作系统的各个 How-To 以 及相关的说明文件如 man page 等等。网站在 http://www.tldp.org 喔! • 想一想再回答,为何您想要学习 Linux ?有没有持续学习的动力?? 您想要 Linux 帮您达成什 么样的工作目标? Linux 主机的规划 最近更新日期:2005/06/15 一部好的 Linux 主机系统,除了后续的维护之外,一开始的硬件选择与 distributions 的搭配, 以及主机 预期的『工作任务』来加以思考,而选择最合适的硬件,这是很重要的一个开始! 俗话说『钱要花在刀口 上』,没有必要为了一个小小的 IP 分享的功能来买一部双 CPU 的硬件架构吧? 而一部简单的个人计算 机,也真的无法满足中大型企业的工作环境需求。 在这一章里面,鸟哥会向您介绍一下,在开始安装 Linux 之前,您应该要先思考哪些工作? 好让您后续的主机维护轻松愉快啊! 此外,要了解这个章节的重要性, 您至少需要了解到 Linux 档案系统的基本概念, 所以,在您完成了后面的相关章节之后,记得要再回来 这里看看如何规划主机喔! ^_^ 1. 认识主机的各部分硬件组件 1.1 认识计算机的硬件配备 1.2 选择与 Linux 搭配的主机配备 1.3 各硬件装置在 Linux 中的代号? 2. 安装 Linux 前的规划 2.1 选择适当的 distributions 2.2 主机的服务规划与硬件的关系 2.3 主机硬盘的主要规划(partition) 2.4 鸟哥说:关于练习机的安装建议 3. 鸟哥的两个实际案例 4. 本章习题练习 5. 参考数据 6. 针对本文的建议:http://phorum.vbird.org/viewtopic.php?t=23874 认识主机各部分硬件组件 在开始安装 Linux 之前,有些功课是要先作的!因为 Linux 对于较新的硬件的支持度可能比较不足, 所 以,您必须要了解您的主机是否为 Linux 所支持的 CPU、RAM、显示卡、网络卡等等。 此外,您也必须要 先了解到您的 Linux 预计想要达成的功能是什么?这样在选购硬件时, 才会知道,那个部分是最重要的 啊!举例来说,桌上型的使用者,应该会用到 X Window 系统, 此时,显示卡的优劣与内存的大小可就占 有很重大的影响。如果是想要做成档案服务器, 那么硬盘或者是其它的储存设备,应该就是您最想要增购 的组件啰!所以说,功课还是需要作的啊! 鸟哥在这里要不厌其烦的再次的强调, Linux 对于计算机各组件/装置的分辨, 与我们惯用的 Windows 系 统完全不一样!因为,各个组件或装置在 Linux 底下都是『一个档案!』 这个观念我们在 Linux 是什么 的章节里面已经提过, 这里我们再次的强调。因此,您在认识各项装置之后,学习 Linux 的装置代号之 前, 务必要先将 Windows 对于装置名称的概念先拿掉~否则会很难理解喔! 认识计算机的硬件配备 『什么?学 Linux 还得要玩硬件?!』呵呵!没错! 因为 Linux 早期是与 x86 架构的个人计算机系统 紧密结合,而且我们由前两章的 Linux 是什么 当中也晓得,硬件与操作系统的关系可是很大的! 所以, 我们当然就得要了解一下个人计算机主机的基本架构了! 事实上,计算机主机的硬件配备与这部主机未来的功能是很有相关性的! 举例来说,家里有小孩,或者自 己仍然算是小孩的朋友大概都知道:『 要用来打 Game 的 "游戏机计算机" 所需要的配备一定比办公室用 的 "工作机计算机" 配备更高档』,为什么呢?因为『计算机游戏』所需要的显示、 CPU 等资源较高,所 以需要适合比较大量运算的配备,因此等级上面不能太差啊( 例如 Athlon 或者是 P4 系列 ) 至于办公室 个人计算机环境中,通常我们不太可能会使用到太复杂的软件,所以,等级不需要太好 ( 例如K6-2 500 ), 就可以运作的很顺畅啦!那什么叫做高档配备? 呵呵!底下我们得先来约略了解一下计算机主机里面的各 个配备, 以及他们对于系统性能的影响啰! 所谓的『计算机主机』就是那个机壳内的咚咚~当您拆掉主机机壳之后,会发现里面有一张大板子, 这块 大板子上面插了好几块小板子,还有一颗小风扇安置在一块四方形的东西上面。 此外,还有几颗硬盘与光 盘或软盘被锁在机壳里面,还有一个铁盒子,上面有很多电线跑出来, 这些电线的接头都被接在硬盘/光 盘/软盘以及大板子上面。其中最重要的就是那张大板子, 因为所有的机壳内的东西,都会接到这个大板 子上面!这个大板子就是『主机板』。 主机板有点像底下这个样子: 图一、主机的架构示意图 上图一中,中间上面的部分就是中央处理器 ( CPU ) 的插槽了,至于 CPU 右边那三个直直的则是内存 ( RAM ) 的插槽; 而在中间偏下有几个名称为 PCI 的咚咚,那就是一些适配卡的插槽了。包括 SCSI 适 配卡、网络卡,还有一些声卡等等,都是接在 PCI 卡上面的!至于在 PCI 上面还有一个 AGP 插槽是干嘛 的? 那个就是前一阵子的主流显示卡接口噜!此外, 在内存的右边还有几支黑黑的咚咚,那就是使用『排 线』连接主机板与硬盘的接口插槽, 我们称他为『IDE 接口』, 而硬盘除了 IDE 接口外,现在比较流行 的应该是 SATA 接口,这个接口的硬盘插槽比较小一点, 连接线也比较好接,因为比较细,对于机壳内的 空气对流比较好。 这个部分相当的重要,等一下我们会再提到的!底下我们来谈一谈关于几个主要的组件, 然后再介绍整体的运作吧! Tips: 很讨厌的是,个人计算机的发展不断的向上延伸,各项接口也在不 断的改善, 截至目前为止 (2005/06),有 PCI Express 、 AGP 渐 渐被淘汰、IDE 接口被 SATA 接口所取代, 内存也均已 DDR 接口 取代原本的 PC133 的 SDRAM, 这些接口的改善也造成您的硬件在 升级时候的困扰,因为,很多旧的配备无法被重复利用的! 所以, 上面的图示仅是一个简略的介绍!您需要随时请教店家喔! • 中央处理器 ( CPU ) : CPU 可以说是一部计算机主机里面相当重要的东西了,因为, 他负责了所有事件的运算!而且,跟大量运 算有关的主机,主要的关键几乎就是卡在 CPU 的速度上。 目前全世界前两大的个人计算机 CPU 制造商为 Intel 与 AMD ,而这两家公司自己的 CPU 规格就不少了,加上有两家制造商,哇!这表示, CPU 的规格 多的吓人~ 早期的 CPU 规格都是由 Intel 来拟定,然后大家按照他的规格去设计自己的 CPU , 所以,在主机的购 置上面,会比较不容易产生不兼容的情况。 但因为某些因素,导致 AMD 自行在 x86 的架构上发展自己的 CPU 脚位, 而且因为 CPU 结构的变更,使得脚位的定义越来越多。 目前因为规格太多, 而且 CPU 的插 脚的脚位都不一样,有的即使一样但是 CPU 的运作电压不同, 也无法兼容!因此,在选购 CPU 与相关的 主机板时, 务必要询问正确的信息, 否则买了 CPU 与主机板不能兼容的话,那么两个东西都会变成废铁 的喔! 目前流行的 CPU 规格大致分为 Intel 的 P-4 系列,而 P-4 系列未来又分为双核心与单核心, 这两款 CPU 是不兼容的,主机板也不兼容,必须特别留意。至于 AMD 的 Sempron, Athlon64, Athlon64x2 当中, Sempron 是入门级, Athlon64 与 Athlon64x2 是 64 位的 CPU, 分别是单核心与双核心,两款的脚位相 同,据说主机板是可以互通的!但是 Sempron 与 Athlon64 的主机板则不兼容!要特别注意。(注:所谓 的双核心,是在一颗 CPU 里面, 建构了两个运算单元,也就是说,这个双核心的 CPU 有两个可以运算的 实体 CPU 就是了。 而 AthlonXP 也已经被新的型号 Sempron 所取代了!) 好了,那么 CPU 的速度除了核心的优良与否之外,常用来判断同级产品之间的速度,就是频率了。 所谓 的频率,简单的说,就是单位时间的运算次数。 所以,频率越高,代表这个装置设备的运算次数越多次, 当然速度上就会比较快。 (注:不同的 CPU 之间不可以单纯用频率来判断运算的效能喔!例如 AMD 的 Athlon64 2G 在运作上,效能比 P-4 2G 还要好很多!所以,频率目前仅能用来比较同样的 CPU 的速度。) 比较特别的是, CPU 有所谓的倍频与外频,有什么意义呢? • CPU 有所谓的『倍频』与『外频』, 外频是 CPU 与接口设备进行数据传输/运算的速度, 至于 倍频则是 CPU 本身运算时候加上去的一个运算速度! 两者相乘才是 CPU 的频率。与 CPU 外频 有关的咚咚为内存与主机板芯片组。 一般来说,越快的频率代表越快的 CPU 运算速度。以 Intel 的 PIII 频率 933 MHz 为例, o CPU 外频与倍频: 133(外频) X 7(倍频) MHz o RAM 频率:通常与 CPU 之外频相同,为 133 MHz o PCI 接口( 包含网络卡、声卡等等的接口喔 ) 133/4=33 MHz o AGP 界面 : 133 / 2 = 66 MHz (这是 AGP 正常的频率喔!) • 外频是可以超频的! 什么是超频呢?原本的 CPU 外部频率假设是 133 好了,如果您藉由某些工 具, 或者主机板本身也可能会提供这个工具,那您就可以将 133 提升到比较高的频率, 那就是 所谓的超频。为什么要超频呢?因为可以在比较便宜的 CPU 上面让频率升到比较高, 等于是『赚 到了』的意思。不过,超频本身的风险很高~ 如果是超外频的话,例如到 166 MHz 时,你的 AGP 将达 (166/2=83) 而 PCI 也将达 (166/4=41.5) ,高出正常值甚多,通常, 越快的外频由于所 有的设备运作频率都会提升,所以,可以让效能提高不少, 但也可能会造成系统不稳定!例如常 常当机,或者是造成某部分组件的寿命简短等等。 此外,目前的计算机系统真的是够快了,不需 要超频啦!而且,在 Linux 系统中,『不建议超频』,因为,即使 CPU 可以耐的住这么高的频 率,但是系统的运作是全面性的,只要有一个设备当机, 那么你的系统就跟着当掉啦!而因为超 频之后,系统频率高出正常值太多, 所以当然容易造成不稳定呢! • 另一个需要注意的是,『CPU 是有分等级的』,而目前很多的程序都有对 『CPU 做最佳化』的行 动,所以就会有所谓的 i386, i586, i686 为附档名的档案产生啦!基本上,在 P MMX 以及 K6-III 都称为 586 的 CPU ,而 Intel 的赛扬以上等级与 AMD 的 K7 以上等级,就被称为 686 的机器 了!万一改天你发现一些程序是注名给 686 的 CPU 使用时,就不要将他安装在 586 以下等级的 计算机中,否则可是会无法执行该软件的!不过,在 686 倒是可以安装 386 的软件喔!也就是 说,这些东西具有向下兼容的能力啦! • 内存 ( RAM ) : 内存对于系统来说,真是一个重要的家伙,怎么说呢?刚刚提到,计算机真正运作的核心是 CPU ,但是真 正『喂给』 CPU 运算数据的,那就是内存 (Memory, RAM) 啦! 所以你的操作系统的核心啦、软硬件的驱 动程序啦、所有你要读取的档案啦等等的, 都需要先读入内存之后,才喂给 CPU 来进行数据的运作!您 瞧! RAM 可重要的很吧! 此外,一些比较优良的操作系统,也会将常用的档案或程序等数据, 给他常驻在内存内而不直接移除,如 此一来,下次取用这个数据时, 就不需要在去周边存取设备读取一次,呵呵!对于系统速度来说,真是不 无小补喔! 所以啰,您就会晓得,如果你常常开启大容量的档案,以及执行一些很占资源的软件, 那么 你就必须要『很大量的内存』来帮助你存放这些数据,瞧!很重要的一个项目吧! 内存目前的规格也不少,主要有两种,分别是 SDRAM 与 DDR,新一代的内存通常使用 DDR 这种规格的内 存, 不过还得配合主机板与 CPU 来选择 RAM 的规格才行!对于一个系统来说, 通常越大的内存代表越 快速的系统,这是因为系统不用常常释放一些内存内部的数据。 以服务器来说,内存的容量有时比 CPU 的 速度还要来的重要的! • 显示卡 ( VGA card ): 显示卡对于图形接口有相当大的影响!因为我们要将影像数据显示到屏幕时, 就需要使用到显示卡 (VGA Card) 的相关硬件功能了。 目前 3D 的画面在计算机游戏接口与工作接口很大量的被使用,而由于如果这 些 3D 画面没有先经过处理而直接进入 CPU 来做处理的话,将会影响到整体运作的速度,因为 CPU 的工 作实在太多了!这个时候就有所谓的 GPU 出现了! GPU 那是什么咚咚呢?为了避免由于大量的 3D 画面造成 CPU 的困扰,所以显示卡开发商就在显上卡上面 安插一个可以处理这些很耗 CPU 运算时间的硬件来处理这些画面数据,如此一来,不但图形画面处理的速 度增快了, CPU 的资源也会多出来以执行其它的工作喔! 目前的显示卡也有两种主要规格,一种是以传统 AGP 接口来进行影像数据的传输, 一种则是以更快的 PCI Express 接口来传输数据!由刚刚我们提到的 CPU 运作频率中,我们可以知道 PCI 的接口标准速度是 33MHz ,但是 AGP 标准是 66 MHz 。不过,即使是 AGP 的 66 MHz 也无法满足现在的需求了,因此, 才 又有 PCI Express (简称 PCI-E) 接口出现。这个接口的速度又比 AGP 来的更加的快速呢。 不过,您到 底要买哪一款?还是得要看您的主机板有没有支持该接口才行! 另外, VGA 卡上面也有一个内存,这个内存的大小可以影响您屏幕输出的分辨率与画素喔! 这个内存是 直接嵌入于显示卡上面的,与你的主存储器(上面提到的 RAM)没有关系! 一般来说,服务器没有 X Window 的话,显示卡并不重要,如果是需要使用到图形接口的话, 那么这个显示卡内存的容量就比较重要了! • 硬盘与存取装置( hard disk ): 总是需要有数据,我们的主机才能够藉由这些数据来加载,来运作吧? 这些数据一般来说,就是存放在主 机的硬盘上面了。而我们也可以透过可携式储存媒体, 例如光盘、Zip 磁盘、软盘片等等来传递数据的。 我们就单纯来说说硬盘好了。 在个人计算机上面,主流的硬盘存取接口应该是 SATA 与 IDE 这两种。 一般来说,主机板上面至少应该都会有两个 IDE 或者 SATA 的插槽, 而每个插槽都可以接两个 IDE 或者 SATA 接口的硬盘或装置。 SATA 是近年来开发出来的新接口,他的硬盘转速比较高,存取效能要比传统的 IDE 接口来的好。 此外, SATA 的特色就是,他与主机板连接的排线可以比较长(可长达 1m), 并且排线 比较细,可以帮助主机机壳内部的通风,有很不错的效果。 在 Linux 上面, SATA 或 IDE 接口的命名方 法都是一样的, 所以未来我们还是以 IDE 来介绍装置。 由于一个 IDE 插槽可以接两个 IDE 接口的装置,那么系统怎么知道那个是那个?此时就需要 IDE 装置 的跳针 (Jumper) 来设定了!你可以在一个 IDE 接口接的两个装置上面,以排线接一个 Master 以及一个 Slave 的装置!而 Master 与 Slave 可以在任何一个 IDE 装置上面找到的!也就是说,如果你有两颗硬 盘,那么你可以将任何一颗调成 Master ,但是另外一颗则必须为 Slave 才行!否则 IDE 接口会无法分 办,而造成系统的当机喔!至于硬盘的一些相关数据我们在后面的章节再来提! 至于硬盘的选购上面,您除了必须要注意硬盘的容量大小之外, 还得知道硬盘的转速,以及缓冲存储器的 大小。目前的要求是,转速至少得 7200 转, 缓冲存储器最好可以选择 8M 比较好一些。 • PCI 适配卡: 我们常用的网络卡、声卡、特殊功能卡等等,几乎都是透过 PCI 插槽来安装的, 这些东西就被称为 PCI 接 口的装置啦!当然不止,因为主机板上还有很多内建的 PCI 装置呢! • 网络卡:网络卡很重要吧!因为他是让你可以连接上 Internet 的重要功臣!网络卡的传输速度 目前都已经可以支持 10/100Mbps 的主流速度了!但是网卡的好坏却差很多!同样是 10/100Mbps ,但是 Intel 与 3Com 的卡硬是要比一般的杂牌卡多出 1000 元新台币以上,原因 无他,因为网络卡的稳定性、消耗 CPU 资源的特性与其它特殊功能等,Intel 与 3Com 要比其它 的厂牌优良的多! 至于网络线连接的接口上面,目前则几乎已经都是 RJ-45 的接口插孔了, 这 种接口有点像是电话线插孔,不过要稍微大一点。 另外,由于网络的需求不断向上攀升,所以, 网络卡已经有很多 Gigabits 的速度出现了。 您也可以选购 10/100/1000 Mbps 的网络卡喔! • SCSI 适配卡:这个东西可以用来连接 SCSI 的接口的装置!以硬盘为例,目前的硬盘除了个人计 算机主流的 IDE/SATA 接口(刚刚说过了) 之外,就是这个 SCSI 接口!由于 SCSI 接口的装置比 较稳定, 而且装置的运转速度较快,因而速度也会快的多,而且也比较不耗费 CPU 的资源。目 前 SCSI 适配卡是一般大型服务器主机的硬盘传输接口,不过,用在个人计算机上面的话, IDE/SATA 接口就够了!因为, SCSI 接口的硬盘很贵呢! • 主机板( Mainboard 或 Mother board ): 我们在 图一 提到的那个主机板真是重要! 上面提到的 CPU、RAM、VGA Card、PCI Card等等,全部都是 接在这个主机板上面的。 当然啦,这个主机板就得要负责沟通所有接口的工作了。而沟通所有上面提到的 咚咚的东西, 就是 主机板的芯片组。 由于主机板上面的芯片组将负责与 CPU、RAM 及其它相关的输出、 输入装置, 所以,芯片组设计的好坏也相差甚多喔!整个主机板芯片组与各个组件之间的沟通可以 使用 下图二来简单的说明: 图二、芯片组架构示意图 先要提醒您的是,我们这里仅列出芯片组功能示意而已,并没有完整列出芯片组的详细架构喔。 底下我们 就来提一下芯片组的相关功能介绍吧! • 芯片组的功能:芯片组就是在沟通 CPU、 RAM 、输出与输入装置的重要角色!还记得刚刚我们在 CPU 时候提到的频率问题吧?在这里我们再次的强调, CPU 的外频就是芯片组与其它周边沟通的 速度啰,假如使用刚刚的 P-III 933 MHz 做为例子的话,那么你的芯片组运作频率应该是以 133 为基准,所以 CPU 与芯片组沟通是 133 ,芯片组与 RAM 亦是 133 的速度,与 PCI 接口则通常 是 33 (133/4),而与 AGP 则是 66 (133/2)啰!所以,一个芯片组就需要负责这么多不同的频率 操作喔! 呵呵!所以啰,芯片组的好坏对于系统的影响也是相当大的! 另外,目前很多的技术 可以提升各个与芯片组之间沟通的频率速度,例如 DDR 内存,可以将频率再提升一倍,所以,如 果刚刚是 133 ,那么使用 DDR 内存时,就可以提升成为 266 啰!至于 P4 则芯片组与 CPU 之 间则可以提升四倍的频率速度,遗憾的是,芯片组能支持的规格, 只有一种,并无法支持所有的 规格,也就是说,你的 Intel 芯片组的主机板,只能支持 Intel 的 CPU 与芯片组能沟通的内存 规格; • CPU、内存与芯片组 (就是主机板啦) 在选购的时候需要一起考虑,因为芯片组(主机板)能够支持 的 CPU 只有特定的规格,而芯片组对内存的支持通常也仅支持特定规格,所以,当你选择 Intel 的主机板芯片组时,那就不能使用 AMD 的 CPU 啰! 这在购买的时候要特别小心您主机板上芯片 组所能支持的规格喔! 使用者最容易搞错的就是这里了!大家总是认为 DDR 最好,所以拼命也 要买 DDR,但是,如果你主机板芯片组本来就不支持 DDR 内存的话,那你买来的 DDR 是找不到 地方插的!所以, 如果您想要升级你的系统时,请特别留意你的主机板芯片组是否有支持喔! • I/O 地址与 IRQ 岔断: 既然主机板是负责各个计算机系统组件之间的沟通的,但是计算机的东 西又太多了, 又有输出输入、又有不同的储存装置,主机板芯片组怎么知道如何负责沟通吶? 这 个时候就需要用到所谓的 I/O 与 IRQ 啰!I/O 有点类似门牌地址啦, 每个装置都有他自己的地 址,一般来说,不能有两个装置使用同一个 I/O 地址, 否则系统就会不晓得该如何运作,例如, 如果你家门牌与隔壁家的相同, 那么邮差怎么送信到你家啊?不过,万一还是造成不同的装置使 用了同一个 I/O 而造成 I/O 冲突时,就需要手动的设定一下各个装置的 I/O 啰!而除了 I/O 地 址之外,还有个 IRQ 岔断这个咚咚,如果 I/O 想成是门牌号码的话,那么 IRQ 就可以想成是各 个门牌连接到邮件中心 ( CPU ) 的专门路径啰!IRQ 可以用来沟通 CPU 与各个装置啦!目前 IRQ 只有 15 个,如果你的周边接口太多时, 可能就会不够用,这个时候你可以选择将一些没有用到 的周边接口关掉,以空出一些 IRQ 来给真正需要使用的接口喔!当然,也有所谓的 sharing IRQ 的技术就是了! • BIOS :BIOS 是 Basic Input/Output System 的缩写,刚刚上面我们提到了很多的输出与输入以 及 I/O, IRQ 等等的咚咚, 你要如何设定呢?可以透过操作系统,也可以透过主机板提供的 BIOS 功能来设定喔!当你开机的时候,屏幕上不是会出现一些版本的讯息吗?那就是 BIOS 的设定啰! 你可以在开机的时候按下 DEL 按键,以设定开机顺序、 I/O ,以及 IRQ 等等! • 其它输出输入接口: 目前主机板上面通常会内建一些基本的接口,这些接口通常是在主机机壳的 后面,例如: o PS2 界面:这是目前最常见的键盘与鼠标的接口, 在插孔的地方是圆形的,这种接口速 度上面会比较好一些,但是最麻烦的地方在,  p 果你的键盘与鼠标松脱了,通常只能 以重新开机来再次驱动键盘或鼠标啰; o 九针串行端口:这个是以前用来接鼠标的接口, 常常被称为 com1 ; o 25 针并列埠:这通常用来连接打印机的接口,通常称为 LPT1, LPT2...; o 声音输出、输入与麦克风: 这个是一些圆形的插孔,而必须你的主机板上面有内建音效 芯片时,才会有这三个东西; o USB 界面:目前相当流行的一个接口, 支持随插即用,目前已经推出到 USB 2.0 了, 这个规格改变了速度上的问题, 目前 USB 2.0 的速度已经足够了 (480 Mbps),相当的 快速!不像之前 1.xx 版时 ( 12 Mbps ), copy 一些数据到 USB 硬盘时,会吐血.... • 电源供应器 ( Power ): 除了上面这些组件之外,其实还有一个很重要的组件也要来谈一谈,那就是电源供应器。 在您的机壳内, 有个大大的铁盒子,上头有很多电源线会跑出来, 那就是电源供应器了。我们的 CPU/RAM/主机板/硬盘 等 等都需要用电, 而近来的计算机组件耗电量越来越高,以前很古早的 230W 电源已经不够用了! 最近您 要安装新的主机时,要记得,电源供应器至少也要 300W 以上才够你的主机使用, 有些特殊的主机,还会 要求至少要 400~500W 以上的电源呢! 电源供应器的价差又更大了!贵一点的 300W 可以到 4000 NT,便宜一点的 300W , 只要 500 NT 不到! 怎么差这么多?没错~因为 Power 的用料不同, 电源供应的稳定度也会差很多,差一点的电源供应器, 甚至是造成计算机不稳定的元凶呢! 所以,尽量不要使用太差的电源供应器喔! • 关于速度/稳定度的问题: 对于速度来说的话,由刚刚我们看到的芯片组所负责沟通的工作来看, 您就应该晓得啦!速度的快慢与『整 体系统的最慢的那个设备有关!』 ,如果你是使用最快速的 P4 ,使用最快的 DDR 内存, 但是配上一个 慢慢的过时显示卡,那么整体的速度效能将会卡在那个显示卡上面喔! 很重要的呢!所以,在购买整套系 统时,请特别留意需要全部的接口都考虑进去喔! 尤其是当您想要升级时,要特别注意这个问题,并非所 有的旧的设备都适合继续使用的。 除此之外,到底那个组件特别容易造成系统的不稳定呢?有几个常见的系统不稳定的状态是: • 系统超频:这个行为很不好!不要这么做! • 电源供应器的电源不稳定:这也是个很严重的问题,当您测试完所有的组件都没有啥大问题时,记 得测试一下电源供应器的稳定度! • 内存无法负荷:现在的 DDR 内存质量差很多,差一点的内存, 可能会造成您的主机在忙碌的工 作时,产生不稳定或当机的现象喔! • 系统过热:『热』是造成电子零件运作不良的主因之一,如果您的主机在夏天容易当机, 冬天却 还好,那么考虑一下,加几个风扇吧!有助于机壳内的散热, 系统会比较稳定喔!『 这个问题 也是很常见的系统当机的元凶! 』 这些咚咚就是系统所必备的一些组件了!当然啦,还有光驱、鼠标、键盘我们没有介绍, 因为那个东西比 较简单啦!只是要注意的是,他与主机板提供的连接接口是否相同呢? 如果不同的话,自然就无法连接啰! 例如你拿 PS2 的接头要去接九针串行端口的插槽,试问,可以连接吗?? 所以,买接口设备的时候,要 考虑到整体性喔! Tips: 事实上,要了解每个硬件的详细架构与构造是很难的!这里鸟哥仅 是列出一些比较基本的概念而已。 另外,要知道某个硬件的制造 商是哪间公司?可以看该硬件上面的信息。 举例来说,主机板上 面都会列出这个主机板的开发商与主机板的型号,知道这两个信 息, 就可以找到驱动程序了。另外,显示卡上面有个小小的芯片, 上面也会列出显示卡厂商与芯片信息喔! 选择与 Linux 搭配的主机配备 认识了主要的计算机系统硬件之后,接下来就得知道, 那么你的硬件需要怎样的等级才能符合你的操作系 统需求呢?刚刚我们也提到了, 不同的主机服务需要的主机等级是不相同的!基本上,如果你的 Linux 是 做为终端机之用 ( 也就是当作你的工作机,并不对 Internet 提供其它服务 ),并且也不玩 X-Window 的 话,那么由于 Linux 所需要的硬件资源是很低的,只要你有 Pentun-133 以上等级的机器就可以跑得很顺 畅啰!所以,若你手上有升级后要汰换的设备, 千万别急着丢掉,可以尝试着组装一下,然后来玩玩 Linux 呀! 但是,万一您的 Linux 机器是预计用来作为您公司内部的 mail server 或者是您学校的 Web server, proxy server 时,或者是要玩 X-Window 的话, 那么你就必须要选择高档一点的计算机配备了,尤其是 RAM 的大小、显示卡的内存容量与硬盘的空间容量! 另外,由于 Linux 还没有茁壮到大部分的桌上型计算机的操作系统都用他,因此, 某些特殊硬件对于 Linux 之支持度,就有点不足了。 举例来说,最新的显示卡可能就无法被预设的 Linux 核心捉到。 不过, 其实这并不是 Linux 的问题~怎么说呢?因为驱动程序都是由该硬件的开发商开发的, 而不是 Linux 核 心工作小组应该要开发的喔!所以啊, 如果您买了一个显示卡,却无法被你的 Linux 侦测到,那么您应 该要前往这个显示卡开发商的网站, 去反应,或者去下载给 Linux/Windows 或其它操作系统使用的驱动 程序才对喔! 此外, Linux 开发商在释出 Linux 之前,都会针对该版所预设可以支持的硬件做说明, 因此,您除了可 以在 Linux 的 Howto 去查询外,也可以到各个相关的 Linux distributions 网站去查询呢! • Linux 的硬件中文 HowTo: http://www.linux.org.tw/CLDP/HOWTO/hardware.html#hardware • Mandriva 的硬件支持: http://www.linux-mandrake.com/en/hardware.php3 • Red Hat 的硬件支持: http://hardware.redhat.com/hcl/?pagename=hcl • SuSE 的硬件支持: http://hardwaredb.suse.de/index.php?LANG=en_UK • Linux 对 Printer 的支援: http://www.linuxprinting.org/ • Linux 对 Notebook 计算机的支持: http://www.linux-laptop.net/ • 显示卡对 XFree86/Xorg 的支持: http://www.linuxhardware.org/ 底下我们稍微谈一下 Linux 至少所需要的硬件配备是如何吧!假设一台 Linux 主机,他主要的功能是用 来作为 NAT 主机,所谓的 NAT 主机也就是类似『IP 分享器』 的功能,而且用这台 NAT 主机的 PC 数并 不多,那你只需要 Pentun-166, 32MB RAM, 及一块不太特殊的显示卡及网络卡也就够了! 当然,硬件的 需求与你服务的对象多寡是有相当的相关性的!在这个一般家庭的 NAT 主机的环境下,你所需要的硬件大 致的需求如下: • CPU:Pentun-166 以上等级就可以了。不过建议使用 K6-2 300 以上等级的 CPU,当然了, CPU 的 等级与你旧有的主机板兼容程度是有相关性的; • RAM:至少 32MB 以上。其实除了 CPU 之外, 在 Linux 系统中最重要的应该是内存的大小了, 因为如果你的服务开得太多, 而你的内存不够大,势必要使用类似 Windows 的 『虚拟内存 』 的东西 ( 在 Linux 当中称为 Swap ) ,这个 Swap 是使用硬盘的空间来仿真内存的存取型态, 所以,你可以知道,在内存中跑的数据却以速度较慢的硬盘来跑, 呵呵!这东西可操硬盘的紧! 所以虽然内存最低的需求是 32MB 就可以了,不过强烈建议最好是有 64MB 以上比较好,尤其是 如果你还要玩 X-Window 的话! ( 注:目前新出版的 Linux distribution 当中,由于提供的服 务越来越多,且 X-Window 接口越做越好,所以对于内存的要求,实际上也越来越高!事实上, 最好要求您的 Linux 具有 128 MB 以上的内存,不过,如果您跟鸟哥 一样不碰 X-Window 的话, 那么使用 64 MB 就已经吓吓叫了! ) • Hard disk:最好有 2GB 以上。 当然是越大越好,最好至少为 3GB 的硬盘!(注:同样的,目 前的 Linux 提供的资料太多了!所以某些出版商提供的 Linux 在选择完整安装之后,硬盘竟然 占用了 4.5 GB 左右的空间,相当的可怕!不过,如果您已经学会了 Linux 的话, 那么事实上, 透过选择的套件内容,将不需要用到这么多硬盘空间,尤其不玩 X-Window 的话,硬盘空间几乎 可以减少一半以上。) • VGA ( 显示卡 ):如果是旧设备的话,最好是 S3 早期的显示卡。 Linux 对于最新的显示卡支持 的并不是很足够,而且通常鸟哥 是建议人家使用淘汰的零件当主机使用,并且如果你又不玩 X-Window 的话,一块 1MB 内存的 S3-775 显示卡就够了!重要的是, Linux 对于 S3 旧的 VGA 卡 ( 如 Virge 系列 ) 支持的程度相当的成熟,所以我推荐他!然而,如果您想要将 X-Window 建 置在您的 Linux 机器上面,那么最好是『一定要有 8 MB 以上的显示卡内存』,否则光是等待的 时间,会磨尽您原本具有的耐心指数…. • Network Card ( 网络卡 ) :一块极其普通的 10/100 MB 的网卡就可以了,建议用具有 RTL8139 或者是 NE2000 兼容的芯片的网卡,因为 Linux 本身就有支持,不用再额外加挂驱动程序!强烈 的建议使用 Realtek RTL8139 芯片的 PCI 接口网络卡,便宜又蛮好用的!不过,还是得提醒一 下,如果您的 Linux 是用来架设大流量的网站时,那么好一点的网络卡将是不能节省的花费!如 果能够使用 Intel 或是 3Com 的网络卡,那将是不错的选择呀! • 光盘、软盘、键盘与鼠标:不要太旧的就可以了。 基本上除了键盘之外,其它的装置都是非必备 的,以鸟哥为例, 在安装 Linux 的时候先拿别部计算机的光驱、软盘机与鼠标来安装,等到安 装完毕之后, 关机,将所有的装置拔掉,只要剩下硬盘与电源供应器就可以啦!等到所有的设定 都完成之后, 连屏幕都可以搬走了!剩下的 Linux 会自动搞定!因为通常服务器这东西最需要 的就是稳定, 而稳定的最理想状态就是平时没事不要去动他是最好的! 不过,请千万注意了,上面提到的是『规模很小的主机系统』可以这样玩!如果是『企业内部的 Linux 主 机』,呵呵,可能就要做修正啰!例如某些学校内部架设的 Proxy 系统, 由于服务的机器数非常的大, 所以建议至少需要: • CPU 等级至少需要 P-III 500 以上; • RAM 最重要,最好至少 512 MB 以上,越大越好; • 网络卡最好可以选择较佳一些的,例如 Intel 或 3COM 的! • 硬盘至少需要数十 GB 以上的,分割成多槽, Proxy 执行效率较好; • 其它的就随意啦! 所以啰!不同规模的服务器,他的硬件要求等级也就会不相同!除此之外,不同的 Linux distribution 对 于硬件的要求也不一样!举例来说,在 Open Linux 的 server 3.1.1 就『严格要求』您的系统必须是 i686 ( 也就是 PII 等级以上的 CPU ) ,所以,您必须要针对您即将安装的 Linux 所需要的硬件需求进 行了解呢。 Tips: 一般来说,目前 (2005/06) 的入门计算机机种,至少都会有 P-4 2G 以上, RAM 有 512MB ,显示卡内存也有 64MB 以上,所以, 如果您是新购置的计算机, 那么该计算机用来作为 Linux 的练习 机,而且加装 X Window 系统, 肯定是可以跑的吓吓叫的啦! ^_^ 底下鸟哥针对一般您可以会接触到的计算机主机的用途与相关硬件配备的基本要求来说明一下好了: • 一般小型主机且不含 X Window 系统: o 用途:家庭用 NAT 主机或小型企业之非图形接口小型主机。 o CPU:大于 Pentun 133 以上等级即可。 o RAM:至少 32MB ,不过还是大于 64MB 以上比较妥当! o 网络卡:一般的 10/100 Mbps 即可应付。 o 显示卡:随便!只要能够被 Linux 捉到即可,例如 S3 或 Sis 6326 o 硬盘:2GB 以上即可! • 桌上型 Linux 系统/含 X Window : o 用途:Linux 的练习机或 Office 工作机。 o CPU:最好等级高一点,例如 P-III 或 K7 以上等级。 o RAM:一定要大于 256MB 比较好!否则容易有停顿的现象。 o 网络卡:普通的 10/100 Mbps 就好了! o 显示卡:使用 32MB 以上内存的显示卡! o 硬盘:越大越好,最好有 20GB 。 • 中型以上 Linux 服务器: o 用途:中小型企业/学校单位的 FTP/mail/WWW 等网络服务主机。 o CPU:最好等级高一点,例如 P4 或 K7 以上等级。甚至可以考虑使用双 CPU 系统。 o RAM:最好能够大于 512MB 以上,大于 1GB 更好! o 网络卡:知名的 3Com 或 Intel 等厂牌,比较稳定效能较佳!注意,也可选购 10/100/1000 Mbps 的速度。 o 显示卡:如果有使用到图形功能,则一张 64MB 内存的显示卡是需要的! o 硬盘:越大越好,如果可能的话,使用 SCSI 或者磁盘阵列,或者网络硬盘等等的系统 架构, 能够具有更稳定安全的传输环境,更佳! 总之,鸟哥这里仅是提出一个方向,亦即是:如果您有因为升级而用不到的计算机主机, 千万不要急着丢 掉,可以将他回收后,作为 Linux 的架设与练习之用! 而如果您想要架设一部更稳定的 Linux Server , 那么,系统的整体搭配性、 整体运作的效率考虑,以及系统散热的问题等等,都需要加以考虑。在综合考 虑之后, Linux Server 在中大型企业上,购买各硬件厂商已开发完成的硬件系统, 是一个很不错的选择! 至少那些服务器主机都已经测试过搭配性,而且散热上一定比较没问题! 总之,如果是自己维护的一个小网站,考虑到经济因素,您可以自行组装一部主机来架设。 而如果是中、 大型企业,那么主机的钱不要省~因为,省了这些钱,未来主机挂点时, 光是要找出那个组件出问题,或 者是系统过热的问题,会气死人ㄟ! 而且,要注意的就是未来你的 Linux 主机规划的『用途』来决定你 的 Linux 主机硬件配备喔! 相当的重要呢! 各硬件装置在 Linux 中的代号 了解了硬件之后,接着下来得了解一下个硬件在 Linux 当中所扮演的角色啰! 在 Linux 系统当中,每个 装置都被当成一个档案来对待! 举例来说,硬盘的文件名称即为 /dev/hd[a-d] ,其中, 括号内的字母 为 a-d 当中的任何一个,亦即由 /dev/hda, /dev/hdb, /dev/hdc, 及 /dev/hdd 这四个档案的意思 (注: 这种型式的表示法在后面的章节当中会使用得很频繁,请特别留意)。 那么光驱与软盘呢?分别是 /dev/cdrom, /dev/fd0 啰! 好了,其它的接口设备呢?底下列出几个常见的装置与其在 Linux 当中的代 号啰: Tips: 先提出来强调一下,在 Linux 这个系统当中,几乎所有的硬件装 置代号档案都在 /dev 这个目录当中,所以您会看到 /dev/hda, /dev/cdrom 等等~ 装置 IDE 硬盘机 SCSI 硬盘机 USB 随身碟 装置在 Linux 内的代号 /dev/hd[a-d] /dev/sd[a-p] /dev/sd[a-p](与 SCSI 硬盘一样) CDROM 软盘机 打印机 鼠标 磁带机 /dev/cdrom /dev/fd[0-1] /dev/lp[0-2] /dev/mouse /dev/ht0 (IDE)或 /dev/st0 (SCSI 界面) 需要特别留意的是硬盘机(不论是 IDE/SCSI/USB 都一样),每个磁盘驱动器的磁盘分割 ( partition ) 不 同时,其磁盘代号还会改变呢! 关于 硬盘机的分割与配置将在安装 Linux 时再提及。此外,您会发现怎 么档案开头都是 /dev 呢?呵呵!那个咚咚就是我们放置装置档案的目录啦!而需要特别注意的是磁带机 的代号,在某些不同的 distribution 当中可能会发现不一样的代号,需要稍微留意。总之,你得先背一 下 IDE 硬盘的代号就是了!其它的,用的到再来背吧! 安装 Linux 前的规划 操作系统与硬件相关性是很高的,我们刚刚也才谈过 x86 这个个人计算机架构的各硬件组件, 也大略的 介绍了一些选购的注意事项,再来是什么?呵呵!再来则是需要知道那我应该要安装那个版本的 Linux ? 在安装的过程当中,我应该要如何将我的硬盘进行分割?还有,我应该要如何选择要安装的 Linux 套件(软 件)? 因为每个不同的 Linux 开发商在开发他们的 Linux 时,着眼点都不同,所以当然就要选择比较适 合您的版本啰。 至于硬盘分割,那本来就是一件很重要的事情~不论是在那个操作系统当中啊!而 Linux 的软件众多, 没有必要每个都安装在您的主机上面的说!呵呵!底下我们就分别来谈一谈这些东西啰! 选择适当的 distributions 就如同前面几个章节提到的,每个版本的 Linux 都是使用 http://www.kernel.org 所发展的核心, 都遵 循 LSB 与 FHS 等等的架构,所以差异性其实不大啦!不过,每个 Linux distributions 在发展的时候, 都有锁定他们的用户群,因此,在『预设的情况下』,每个版本都有比较特别适合的使用群。 举例来说, Ubuntu (http://www.ubuntulinux.org/) 就比较适合桌上型计算机使用, 因为他的 X Window 整合得很 好。 Red Hat Enterprise Linux 与 SuSE Enterprise Linux Server 就比较适合企业的 Linux 主机,因 为他们的系统服务整合的比较好。 但是,上面提到的都是『预设情况下』的使用状态,事实上,因为每个 linux distributions 差异性不大, 所以,您当然可以随意选择一个 distributions 来加以改造, 以符合您自己的喜好的环境啊! 不过,要 注意的是,由于近期以来,网络的怪客 (Cracker) 很多, 造成我们主机的被入侵的危险性大增!因此, 您要选择的 distributions 的标准之一, 就是:『选择比较新的 distribution 为宜!』这是因为比较 新的版本他在 持续维护套件的安全性上,比较长,可以让您的系统比较安稳一点。而且,比较新的 distributions , 他在新硬件的支持上面,当然也会比较好啰!这样可以了解吗? 您可以在 Linux 是什么 那个章节当中介绍的 Linux distributions 选择适当的 distribution 去下载 来安装,不过,那些网站大多是国外的网站,下载时间会较久。 这里介绍国内的学术网络,例如义守大学 的 FTP 网站: http://ftp.isu.edu.tw/pub/Linux/ 去下载最新的安装光盘版本。 鸟哥在这里给您建议, 以台湾目前而言,使用者群使用 Fedora 及 Mandriva 还不少, 这表示使用这两个版本若发生问题时,应 该可以得到比较多的参考数据,所以,您可以选择这两个套件其中之一, 来开始练习您的 Linux 啊! 另外,您也可以选择国外的一个提供几乎全部 Linux distributions 的网站: http://www.linuxiso.org/ 来下载。 要注意的是,以义守大学的 FTP 提供的 FC4 (Fedora Core Release 4) 为例,他的下载点: http://ftp.isu.edu.tw/pub/Linux/Fedora/linux/core/4/i386/iso/ 里面有好多档案, 每个档案都很 大!这是因为,那些档案都是映象档(image file),还必须要烧录成为光盘后, 才可以使用。而您也会看 到里头有 i386 及 i386-SRPMS 的档案,那个 SRPMS 的档案是含有原始码的, 目前我们使用不到,所以 可以略过不下载,只要下载 FC4-i386-disc[1-4].iso 即可。 (注:提供 Linux distributions 下载的网 站很多,您可以到各大专院校的 BBS 站的精华区去搜寻一番!) Tips: 要注意的是,因为 images 档案实在太大了,通常是 600MB-700MB 之间, 这么大的档案使用浏览器的接口 ( 如 IE 或 Firefox ) 来下载可能会有问题, 例如断线啦等等的。所以这里请您以 FTP 的软件 (例如 cuteftp 等等的) 来下载, 这样不但可以避免断 线,也拥有续传的功能,而且档案取得也会比较完整。 主机的服务规划与硬件的关系 前面已经提过,由于主机的服务目的不同,所需要的硬件等级与配备自然也就不一样! 底下鸟哥稍微提一 提每种服务可能会需要的硬件配备规划,当然,还是得提醒, 每个朋友的需求都不一样,所以设计您的主 机之前,请先针对自己的需求进行考虑。而, 如果您不知道自己的考虑为何,那么就先拿一部普通的计算 机来玩一玩吧!不过要记得! 不要将重要数据放在练习用的 Linux 主机上面。 • 打造 Windows 与 Linux 共存的环境: 在某些情况之下,你可能会想要在『一部主机上面安装 两套以上的操作系统』,举例来说: 一、我的环境里面仅能允许我拥有一部主机,不论是经济问题还是空间问题~ 二、因为目前各主要硬件还是针对 Windows 进行驱动程序的开发,我想要同时保有 Windows 操作系统与 Linux 操作系统,以确定在 Linux 底下的硬件应该使用那个 I/O port 或者是 IRQ 的分配等等; 三、我的工作需要同时使用到 Windows 与 Linux 操作系统。 果真如此的话,那么您就可能会需要使用到所谓的 『多重开机』选单系统了 !所谓的多重开机选单,就 是在系统开机时, 可以让您选择进入哪一种操作系统的程序。因为如此,所以,您就可以在一部主机 上 面安装两套操作系统在不同的磁盘分割槽内,此时您就能够以一部主机来操弄两个操作系统了。 Tips: 一般来说,您还可以在 Windows 操作系统上面安装 VMware 之类 的软件, 让您可以在 Windows 系统上面使用 Linux 系统,就是 两个操作系统同时启动! 不过,那样的环境比较复杂,尤其很多 硬件都是仿真的,会让新手很难理解系统控制原理。 基本上,鸟 哥很不建议您使用这样的方式来学习 Linux 喔! 举例来说,假设您想要同时安装 Windows XP 与 Linux 在您的工作主机上面, 那你必须先安装 Windows XP 再灌 Linux 系统就可以了!当然啰,如果你先安装了 Linux 再安装 Windows 系统呢?还能不能成功的制 作多重开机?当然可以啦!不过, 你就需要学会知道什么是『多重开机』的概念,这部分我们会在后面再 继续谈,不要着急喔! 基本上,多重开机涉及硬盘规划的问题,如果你的硬盘有 6GB ,那你可以先以 DOS 的 Fdisk 或其它的分割程序如 SPFdisk http://spfdisk.sourceforge.net/ 进行硬盘的划分。仅割出 Windows 要的扇区就好。例如你要分 1GB 给 windows ,那以 Fdisk 分割一个 1GB 的主分割就好了!其 它的等 Linux 灌的时候再弄就可以啦!这部分会在后面再提到! 再来提到您的 Linux 主机系统,我这里要跟大家报告的是, 如果您是使用较为老旧的计算机来做为主机 的处理,并且他上面可能预计会安装 mail, WWW 等服务器软件,因此需要全天、全年开机的,所以安装 Windows 与 Linux 共存的环境是可以,但是请将 Windows 的硬盘规划的小一点! 好让您的 Linux 主机 可以有更多的空间提供更完善的服务。 好了!现在来说说你需要的主机服务有哪些呢? 一般而言,对于 非企业或者是小型企业或者是学校单位,通常你需要的服务有底下这几个: • NAT (类似 IP 分享器的功能): 如果您是一般小型企业,或者是一般的中小学学校, 那么贵单位对外的联机应该通常是:『申请一个固定 制的 IP ,然后透过 IP 分享器 ( IP sharing ) 来达到全校的计算机皆可连上 Internet 的联机机制』 吧!咦!要连上 Internet 不是需要公共 IP 吗( Public IP ),那每部计算机不是都需要一个 IP 吗?那 么您只有申请一个 Public IP ,其它计算机的 IP 要怎么设定呢?早在当初规划这个 IPv4 协议时( 就是 目前的 IP 设定啰! ),就考虑到可能的 IP 不足啦!此时,就有专门给内部网域设定用的 Private IP 了 ( 或者称为私有 IP 或保留 IP ) ,需要注意的是,这些 Private IP 都不能直接与 Internet 上面的 Public IP 互相沟通! 那怎么我学校内部的计算机还是可以透过 IP 分享器连出去呢?这就是所谓的 NAT( Network Address Translation )功能啦!当内部计算机要连接上 Internet 时,需要通过 NAT 的技术,将你内部计算机的 数据封包中,关于 IP 的设定都设定成 NAT 主机的公共 IP ,然后才传送出去 Internet ,如此一来,你 的内部计算机虽然是使用私有 IP ,但是在联机上 Internet 时,就可以透过 NAT 主机的 NAT 技术,将 IP 来源给改了改!哈哈!如此一来,就可以向 Internet 要求数据啰!这部分我们在 网络基础篇 会再提及 的!通常使用旧计算机来做为主机时,最大的效用就是用来作为 NAT 了!若你的主机仅单纯提供 NAT 服 务,那么在这个服务当中,比较重要的就属网络卡而已!其它的 CPU、RAM、硬盘 等硬件的影响相对就小 了相当多! • SAMBA (类似网络上的芳邻功能): 在 Windows 里面可以很轻易的就以『网络上的芳邻』来分享彼此的档案数据,那么 Linux 要如何与 Windows 分享呢?呵呵!使用 SAMBA 就可以啦! 这也是最普遍的 file server (档案服务器)。 由于 分享的数据量可能较大,那么对于系统的网络卡与硬盘的大小及速度就比较重要, 如果您针对不同的使用 者提供档案服务器功能,那么 /home 可以考虑独立出来,并且加大容量。 • Mail (邮件服务器): Linux 一安装完毕就已经提供了 Sendmail 或 Postfix 的邮件服务! 由于我们如果向外面的公司申请免 费的 E-Mail 信箱,了不起容量大致上到 20 MB , 但是,要知道有时候我们一不小心就会让邮件容量超 过了 20 MB,这样一来,呵呵,您的免费信箱就爆了!真抱歉....但是,如果你自己架设一个 mail server 呢?哈哈!哪么你的信箱就可以到达几 GB 这么大!很过瘾吧!在 mail server 上面,重要的也是硬盘容 量与网络卡速度,在此情境中,也可以将 /var 独立出来,并加大容量。 • Web (WWW 服务器): WWW 几乎是每个主机上面都会安装的一个套件了!当然,要推销你自己的话,那么 WWW 服务器是绝对不会 被你忘掉的!在 Web server 上面,CPU 的等级有时候不能太低,而最重要的则是 RAM 了!要增加 WWW 系 统的稳定度,提升 RAM 是一个不错的考虑。 • DHCP (提供自动取得 IP 的功能): NAT 搞定之后,要晓得的是,你的 Client (客户端)每一部都需要经过设定才能上网 ( 刚刚提到的私有 IP 的概念! ) !阿!好麻烦!那么使用 DHCP 就可以改善这个问题啰!呵呵! Client 端都不必设定任 何咚咚,马上将可以上网了!快乐吧! 这个咚咚的硬件要求可以不必很高啰。 • Proxy (代理服务器): 这也是常常会安装的一个服务器软件,尤其像中小学校的频宽较不足的环境下, Proxy 将可有效的解决频 宽不足的问题!当然,你也可以在家里内部安装一个 Proxy 喔!但是,这个服务器的硬件要求可以说是相 对而言最高的,他不但需要较强有力的 CPU 来运作,对于硬盘的速度与容量要求也很高! 自然,既然提 供了网络服务,网络卡则是重要的一环! • FTP: FTP 的功能是真的很好啦!但是对于 拨接制 ADSL 使用者来说,架设 FTP 实在是一件不智的事情!因为 对你的频宽影响太大了! 鸟哥 相当不建议架设 FTP 的啦!尤其安全性上面也很伤脑筋! 对于 FTP 则是 您的硬盘容量与网络卡好坏相关性较高。 大致上我们会安装的服务器软件就是这一些啰!假设您需要 NAT 的服务, 那么通常会建议安装『两块网 络卡』在您的主机上面,因为可以顺便解决您内部计算机的安全问题!假如您需要 mail 与 Web 服务器, 那么就建议申请 DNS 或者是直接申请免费的动态 DNS 系统的 domain name 啰!如果您需要 Proxy 的服 务,那么在当初设计硬盘规划的时候, 就要小心硬盘的分割了,因为不同的切割方式会使得您的 Proxy 效 能有差异! 当然啦,还是那句老话,目前我们这本书里面谈论的,还是以 Linux 基础为主,鸟哥也希望您先了解 Linux 的相关主机操作技巧,其它的架站,未来再谈吧! 而上面列出的各项服务,仅是提供给您,如果想要架设 某种网络服务的主机时,您应该如何规划主机比较好! 主机硬盘的主要规划 系统对于硬盘的需求跟刚刚提到的主机开放的服务有关,那么除了这点之外, 还有没有其它的注意事项 呢?当然有,那就是数据的分类与安全性的考虑。 常常会发现网络上有些朋友在问『我的 Linux 主机因 为跳电的关系,造成不正常的关机,结果导致无法开机,这该如何是好?』 呵呵,幸运一点的可以使用 fsck 来解决硬盘的问题,麻烦一点的可能还需要重新安装 Linux 呢!伤脑筋吧!另外,由于 Linux 是多人多 任务的环境,因此很可能上面已经有很多人的数据在其中了, 如果需要重新安装的话,光是搬移与备份数 据就会疯掉了!所以硬盘的分割考虑是相当重要的! 同时,硬盘的规划对于 Linux 新鲜人而言, 那将是造成您『头疼』的主要凶手之一!因为硬盘的分割技 巧需要对于 Linux 档案结构有相当程度的认知之后才能够做比较完善的规划的! 所以在未来的几个章节 当中,鸟哥将会着重在这方面的探讨, 这可是相当重要的入门知识呢!因为如此,所以特别建议 Linux 新 鲜人先只切两个扇区就好,分别是根目录 / 与 Swap ! 无论如何,底下还是说明一下基本硬盘分割的模 式吧! • 最简单的切割方法: Linux 安装的过程中,至少要有两个 partition 才行,一个是『 / 』,另 一个则是虚拟内存『 Swap 』,如果你的硬盘很小(例如小于 1GB 的小硬盘),那么使用这个分 割的方法会比较好!但是,保证是比较不保险的切割方式啦; • 稍微麻烦一点的方式:在预设的情况下,由于 Linux 的操作系统都是摆在 /usr/ 当中,所以啰, 你可以将这个部分切割的大一点,另外,由于使用者的信息都是在 /home 底下,因此这个也可以 大一些,而 /var 底下是记录所有预设服务器的登录档,且 mail 与 WWW 预设的路径也在 /var 底下,因此这个空间可以加大一些喔!所以,需要的目录就有: o/ o /usr o /home o /var o Swap 以鸟哥为例,通常我会希望我的邮件主机大一些,因此我的 /var 通常会给个数 GB 的大小,如此一来就 可以不担心会有邮件空间不足的情况了!另外,由于我开放 SAMBA 服务,因此提供每个研究室内人员的数 据备份空间,所以啰, /home 所开放的空间也很大!至于 /usr/ 的空间,大概只要给 2-3 GB 即可!凡 此种种均与您当初预计的主机服务有关! 因此,请特别注意您的服务项目!然后才来进行硬盘的规划 鸟哥说:关于练习机的安装建议 • 关于硬件方面 一般来说,对于学习 Linux 这个操作系统,最麻烦也最重要的地方,就是一开始的安装了。 很多朋友都 是一开始安装 Linux 就遭遇到困扰,导致没有兴致再继续往下来学习 Linux 。 造成这样的安装困扰,很 多都是因为朋友们只有一部主机,而在还没有了解到磁盘档案系统的运作, 就贸然的进行多重开机的规划, 导致系统不小心被损毁,进而不想继续使用 Linux 。 另外则有一些朋友是利用类似 VMWare 的软件来学 习 Linux 。但是因为 VMWare 里面的硬件很多都是仿真的, 造成朋友们不知道该如何分辨问题发生的所 在,而无法继续学习。 有鉴于此,因此,鸟哥『强烈的建议您,务必拥有一台主机, 而且内含一颗仅有 Linux 操作系统的硬盘』, 以鸟哥自己为例, 我的主机上面有一个抽取式硬盘盒,而我有两颗分离的硬盘, 分别安装 Windows 与 Linux 系统,要使用 Linux 时,就插入 Linux 硬盘, 使用 Windows 时,就插入 Windows 硬盘,如此一 来,主机很单纯, 而抽换也很快速,不需要对机壳拆拆装装的,很方便!提供给您做为参考。 • 关于硬盘分割方面 此外,在硬盘的分割方面,鸟哥也建议新手们,先暂时以 / 及 swap 两个分割即可, 而且,还要预留一 个未分割的空间喔!因为我们是练习机,暂时不会提供网络服务, 所以只要有 / 及 Swap 提供给我们进 行安装 Linux 的空间即可。不过, 我们未来会针对系统的磁盘部分进行分割的练习以及磁盘配额 (quota) 的练习, 因此,预留一个磁盘空间是必须要的! 举例来说,如果您有一个 20GB 的硬盘,那么建议您,分 15 GB 给 / 来安装 Linux , 512 MB 给 Swap , 另外的 4GB 左右不要分割,先保留下来,未来我们可以继续来练习喔!^_^ • 关于软件方面 另一个容易发现问题的地方,在于使用者常常会找不到某些指令,导致无法按照书上的说明去执行某些指 令。 因为无法执行指令,所以就会一直给他放在那边,不会继续往下学习啊!真是可惜! 为什么会找不 到指令呢?很简单啊!就是因为没有安装该套件(软件)啊! 所以,『强烈的建议新手,务必将所有的套件 都给他安装上去!』 也就是选择『安装所有套件』就是了。 当然啦,上面提到的都是针对『练习机』而言喔!如果是您自己预计要上线的 Linux 主机, 那就不建议 按照上面的说明安装了!切记切记! 鸟哥的两个实际案例 这里说一下鸟哥曾经规划过的两个范例,要先声明的,鸟哥的范例不见得是最好的, 因为每个人的考虑不 同,我只是提供相对可能较佳的方案喔! 案例一:一般家庭使用的小型 Linux 主机: • 提供服务:提供家里的五部计算机 ADSL 联机分享、同时架设 NAT Server、Mail Server、 WWW Server、SAMBA 等服务。此外,为多重开机系统。 • 架设硬件: o CPU 使用 P-166; o 内存大小为 64MB 的 RAM; o 网络卡为 螃蟹卡; o 硬盘机容量为 3.2 GB; o 显示卡选择 S3 Virge VGA。 o 安装完毕之后拔掉 CD-ROM、鼠标、键盘、屏幕等等配备!只剩下网络线及电源线跟主机 连接! • 硬盘切割: o 提供 500 MB 给 Windows 98; o 1GB 给 /var (特别针对邮件设定); o 100 MB 给 Swap; o 剩下的空间都给 / 案例二:提供约 100 部以上 PC 的 Proxy 主机设定: • 提供服务:提供整个单位的 Proxy 服务器服务,同时提供单位内相关人员的数值模式仿真(这个 模式很耗系统资源!)。 • 架设硬件: o 使用双 CPU 架构(因为需要大量的运算); o 使用 GeForce 2 MX 显示卡(因为数值模式仿真完毕之后,需要将图标显示在屏幕上除 错); o 使用 30 GB 硬盘两颗(数值模式所需的储存、 Proxy 所需要的空间); o 使用 3COM 网络卡( Proxy 呦!); o 使用 512 MB RAM。 • 硬盘切割: o 6 GB 给 Proxy (/proxy1, /proxy2, /proxy3 各占 2 GB); o 1GB 给 Swap (数值模式需要); o 5 GB 给 /; o 剩下的都给 /disk1 及 /disk2 在上面的案例中,案例一是属于小规模的主机系统,因此只要使用预计被淘汰的配备即可进行主机的架设! 唯一可能需要购买的大概是网络卡吧!呵呵!;而在案例二中,由于我需要大量的数值运算,并且由于提 供了很多计算机的 Proxy 服务,因此就需要较大的硬盘空间、与较佳的网络卡来搭配了!这些工作请先记 得,因为下一章节在实际安装 Linux 之前,您得先进行主机的规划呀! • 关于大硬盘 随着时代的演变,在 2005 年底的目前,呵呵~个人计算机上面的硬盘容量竟然都已经高达 160GB 以上了! 这么大的硬盘用起来当然是很爽快的啦~不过,也有一些问题的~那就是~开机的问题~ 因为 Linux 的开机程序『可能』会找不到 BIOS 提供的硬盘信息,这个不是 Linux 的问题, 而是 BIOS 本 身无法支持这么大的硬盘的问题~啊!真困扰~虽然 Linux 的核心会『取代 BIOS』 而成功的侦测到大硬 盘,不过,如果您将开机扇区安装在 > 1024 磁柱以后, 那么很可能你的 Linux 就会变成『可以安装, 但是无法开机顺利使用』啦~ 那怎么办?最简单的方法就是『将开机扇区规范在小于 1024 以内~』 即可!那怎么做到呢?很简单,在 进行安装的时候,规划出三个扇区,分别是: • /boot •/ • swap 那个 /boot 只要给 100M Bytes 以内即可!而且 /boot 要放在整块硬盘的最前面! 这部份您先有印象与 概念即可,未来我们谈到开机流程时,会再加强说明的! ^_^ 本章习题练习 (要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看) • 请简略说明一部计算机主机里面,大概有哪些基本的硬件? 一部计算机主机机壳内,一定都有主机板,主机板上面安插了 CPU、主存储器及显示卡等等; 另 外还有排线与硬盘、光盘、软盘等等连接;主机机壳的背板则有输出输入的连接端口, 例如鼠标、 键盘打印机等等;此外,还有一些 PCI 插槽,例如网络卡、声卡等等(有的是主机芯片组内建的) • 一部计算机主机是否只要 CPU 够快,整体速度就会提高? 不见得!一部计算机系统的速度与整体计算机系统的运作有关,每个组件皆会影响计算机的速度! 这包括了内存、CPU、AGP 与显示卡速度,硬盘的速度以及其它相关的输入输出接口等等! 所以, 如果您的系统是升级的,那么还得必须要注意各个旧组件是否可以保留, 或者旧的可以用的组件 必须要舍弃! • 什么是 CPU 的外频与倍频? CPU 频率的计算当中,有所谓的外频与倍频,真正的频率需要将两者相乘才是!比较重要的是 CPU 的外频了!因为系统整体运作的频率便是依据这个外频来进行各个组件的沟通的!一般而言, 目 前比较流行的属于 133 这个外部频率,至于 PCI 则是这个频率的 1/4 倍,亦即是 33 MHz , AGP 则是 66 ( 133/2 ),而,由于目前的技术越来越高超, CPU 可以透过特殊的技术来将外频调高 为 133 的两倍,亦即是 266 , RAM 也可以经过 DDR 的技术来将 133 加倍成为 266 ,这些技 术都有助于速度上面的帮助! • 什么是 I/O 地址与 IRQ 岔断? 主机板是负责各个计算机系统组件之间的沟通的,但是计算机的东西又太多了, 又有输出输入、 又有不同的储存装置,主机板芯片组怎么知道如何负责沟通吶?这个时候就需要用到所谓的 I/O 与 IRQ 啰!I/O 有点类似门牌地址啦,每个装置都有他自己的地址,一般来说, 不能有两个装 置使用同一个 I/O 地址,否则系统就会不晓得该如何运作。不过, 万一还是造成不同的装置使用 了同一个 I/O 而造成 I/O 冲突时,就需要手动的设定一下各个装置的 I/O 啰!而除了 I/O 地 址之外,还有个 IRQ 岔断这个咚咚,如果 I/O 想成是门牌号码的话,那么 IRQ 就可以想成是各 个门牌连接到邮件中心 ( CPU ) 的专门路径啰!IRQ 可以用来沟通 CPU 与各个装置啦!目前 IRQ 只有 15 个,如果你的周边接口太多时,可能就会不够用 ,这个时候你可以选择将一些没有用到 的周边接口关掉,以空出一些 IRQ 来给真正需要使用的接口喔! • Linux 对于硬件的要求需要的考虑为何?是否一定要很高的配备才能安装 Linux ? Linux 对于硬件的要求是因『服务种类、服务范围及主机的角色』而定的。例如一部专门用来运 算数值解析的 Linux 运算工作站,需要比较强大的 CPU 与足够的 RAM 来进行工作,至于一般家 庭用的仅用来做为 ADSL 宽带分享器的 Linux 主机,则只要 586 等级的计算机,甚至 486 系列 的等级,就可以很顺利的运行 Linux 了。 • 一部好的主机在安装之前,最好先进行规划,哪些是必定需要注意的 Linux 主机规划事项? 依据上一题的答案内容,我们知道 Linux 对于硬件的要求是『因地制宜』地!所以,要进行 Linux 的安装之前,一定需要规划 Linux 主机的定位与角色!因此, Linux 的主机是否开放网络服务? 这部主机的未来规划中,是否需要进行大量的运算?这 部主机是否需要提供很大的硬盘容量来服 务客户端的使用?这部主机预计开放的网络服务内容? 等等,都是需要经过考虑的,尤其未来的 『套件选择安装』上面,更需要依据这些规划来设定。 • 请写下目前您使用的个人计算机中,各项配备的主要等级与厂商或芯片组名称: 主机板: CPU: 内存大小: 硬盘容量: 显示卡: 网络卡: • 请写下下列配备中,在 Linux 的装置代号: IDE 硬盘: CDROM: 打印机: 软盘机: 网络卡: IDE 硬盘:/dev/hd[a-d] CDROM:/dev/cdrom 打印机:/dev/lp[0-2] 软盘机:/dev/fd[0-1] 网络卡:/dev/eth[0-n] • 如果您的系统常常当机,又找不到方法解决,您可以朝硬件的那个方向去搜寻? 如果软件没有问题的话,那么当然发生当机的,可能就是硬件的问题了。 1.可以先检测系统有没 有超频? 2.再来则是查阅当系统运作时,系统的机壳内温度会不会过高? 因为过高的温度常常 会造成当机。 3.再者,检查一下 CPU 的温度,这也很重要。 4.再来,则是检查是否插了多条的 内存,因为不同厂牌的内存混插很容易造成系统不稳定。 5.电源供应器是否合乎标准?这些都可 以进行检测喔! • 目前在个人计算机上面常见的显示卡接口有哪两个? AGP 与 PCI-Express 两种 • 目前在个人计算机上面常见的硬盘与主机板的连接接口有哪两个? 有早期的 IDE 接口与最近的 SATA 接口,购买时要分的很清楚! • 硬盘上面有所谓的跳针 (Jump) ,他是干嘛用的? 由于一条 IDE 或 SATA 排线上面有两个装置的插入口,我们必须要藉由 Jump 来决定哪一个装置 先被取用。目前有 Slave/Master/Cable select 等。 • 请上网查询,例如 Tom's hardware guide (http://www.big5.tomshardware.com/) 选择一款主 机板芯片组,说明芯片组与 CPU/RAM/VGA/Hard disk 等等接口互相沟通的相关信息。 参考数据 • SPFdisk http://spfdisk.sourceforge.net/ 一个简单的 SPFdisk 分割实例 最近更新日期:2005/06/12 磁盘分割是个很重要的学习知识!尤其是在您原本的硬盘空间不足了,或者是新增硬盘了, 或者是为了增 加磁盘效能而必须要规划出比较适当大小的磁盘空间等等。 市面上很多工具可以让我们来进行磁盘的分割 的,不过,都需要钱~ 当然,您也可以使用 Linux 的 fdisk 程序,不过,纯文字接口的方式,可能您也 不容易学~ 相较之下,由台湾人自行开发的 spfdisk (special fdisk) 程序,不但纯中文接口, 使用图形接 口的显示,耗用的系统资源又少!还可以作为开机管理程序!太完美了!赶紧来看看! 1. 什么是硬盘分割? 2. SPFdisk 2.1 删除原有分割 2.2 建立主要分割扇区 2.3 储存分割表 2.4 格式化硬盘 3. 针对本文的建议:http://phorum.vbird.org/viewtopic.php?t=23875 什么是硬盘分割(Partition) 在开始进行 Linux 之前,应该有很多的工作要做的!最重要的就如同前面『Linux 主机规划』当中说的, 要如何规划硬盘呢?!到底要如何分割硬盘才好!是要将 swap (虚拟内存)规划的大一点比较好?或者 是只要一个根目录就可以了呢?另外,如果我的硬盘上面已经有 Windows 系统,我又不想要将 Windows 杀 掉,想使用多重开机来安装我的多个操作系统,那要怎么做呢?!况且,由于 DOS 的 fdisk 不认识 Linux 的档案格式,那么我要如何将 Linux 完全的从我的硬盘中移除呢?!呵呵! 这里就来说一下该如何是好 吧! 由于不同的操作系统所使用的档案系统架构(file system)并不相同,有些甚至是不兼容的,例如 Windows 所使用的是 FAT 表,而 Linux 所使用的是 ext2 这个档案格式,这两种格式完全不相同,在 Linux 底下 还可以藉由编辑核心来支持 Windows 的 FAT 档案格式,但是 Windows 则完全无法读取 Linux 的档案格 式了!此外, Windows 使用的磁盘分割工具 fdisk ,很抱歉的,并不认识 Linux 的 ext2 这个档案格式, 所以如果您有一棵已经安装有 Linux 系统的硬盘,呵呵,使用 Windows 的 fdisk 是完全无法分割这块硬 盘的! 那么到底什么是硬盘分割呢?真的要将硬盘用刀子割一割吗?!不是这样的,实际上,硬盘是以 sectors(扇 区), cylinder(磁柱), partitions(分割槽) 这些东西来作为储存的单位,而最底层的实体硬盘单位就是 sectors 了,通常一个 sector 大约是 512 bytes 左右。不过,在磁盘进行格式化的时候,可以将数个 sector 格式化成为一个逻辑扇区(logical block),通称为 block。blocks 为一个档案系统(filesystem) 存取的最小量。 那么 partition 是什么?简单的来说,你知道你的 Windows 有所谓的 C:, D: 是吧!其 实他们是同一颗硬盘,只是利用『磁盘分割表』(partition table)来将实体的硬盘规划出不同的区块。 举个例子说,假设你的硬盘总共有 1024 个 cylinder (利用 blocks 结合而成的硬盘计算单位), 那么 你在这块硬盘的文件头地方 (就是磁盘分割表,可以想成要读取一块硬盘时最先读取的地方)如果写入你 的 partitions 共有两块,一块是 primary 一块是 extended ,而且 extended 也只规划成一个 logical ,那么你的硬盘就是只有两个槽啦(对于系统来说,真正能使用的有 Primary 与 Logical 的扇 区, Extended 并无法直接使用的!需要再加以规划成为 Logical 才行! ) ,而且在 partition table 也 会记录 primary 是由『第 n1 个 cylinder 到第 n2 个 cylinder 』,所以啰,这样子一来,当系统要去 读取 primary (就是 c 槽)的时后,就只会在!n1~n2 之间的实体硬盘当中活动啰! 基本上, Windows 98 系统中的 Fdisk 这支程序仅支持一个 primary 与一个 extended ,其中, extended 可以再细分成多个 logical 的硬盘槽。NT 很抱歉,小弟不熟,所以就不提了!那么 Linux 呢?嗯!基本 上最多可以有 4 个 primary 的硬盘,而可以支持到 3 个 primary 与一个 extended ,其中, extended 若再细分成 logical 的话,则全部 primary + extended + logical 应该可以支持到 64 个之多。底下我 们将以 spfdisk 这个全中文接口的 fdisk 磁盘分割工具来介绍如何分割硬盘!(注:更多详细的磁盘与磁 盘分割信息,可以参考 SPFdisk 的官方网站喔! 在最底下的参考数据当中有提供连结呢!) 硬盘分割 ==> SPFdisk SPFdisk 是一套由国人开发完成的全中文接口的硬盘分割工具,他要比微软出的 Fdisk 功能强多了, 他 的好处有: • 全中文界面让你一定可以看的懂之外,简单的类图形接口可以让你轻易的进行硬盘分割; • 除此之外,这套软件的『DOS 工具』内的『格式化工具』格式化硬盘的速度真是 DOS 比不上的, 我格式化一个 30GB 的硬盘不用十秒就可以格式化完全! 另外,其它的优点我在此也不多说了,若有需要你可以自行自一些搜寻网站下载最新的程序,或从 这里 下 载鸟哥有的程序,不过可能旧一点。 另外,由于 DOS 的 Fdisk 并不认识 Linux 的分割表,所以用 DOS 的 Fdisk 是无法将 Linux 的分割表 去除的。因此,你要删除 Linux 的分割表,只有两个比较快的方法,一个是以 Linux 直接再分割,一个 则是使用 SPfdisk 分割啦! Tips: 由于您正在阅读的这个页面的影像档案很大,有时候会有没办法显 示的情况发生, 这时请在画面上『按鼠标右键』,再选择『显示 图片』这个选项,即可显示画面啦! 硬盘分割主要可分为下面几个步骤: 1. 将旧有的分割表删除; 2. 建立新的主分割及扩充分割(若有需要的话); 3. 贮存分割表; 4. 以 DOS 工具格式化以分割的硬盘。 1. 删除原有的分割: 假设你的主机中没有任何系统存在,则请以 Windows98 制作开机片后,将 spfdisk 拷贝至开机片。以此 磁盘开机之后,执行: A:\>spfdisk 会出现如下欢迎画面。 按任意键后出现下面画面: 以方向键移动光标至『硬盘分割工具』按 Enter 键后会出现画面如下: 这是向你询问是否需要使用 FAT32 的档案系统,由于 Windows 98 支持的长档名及相关的档案型态是以 FAT32 为准,所以当然按 『Y』!按了 Y 之后会出现硬盘的信息,如下所示: 因为我是在我原有的机器上执行这个程序,所以会有两颗硬盘,如果你的系统只有一颗硬盘的话, 则只会 显示你有的硬盘数据,在上图中,1.19GB 的硬盘其总磁柱仅有 621 单位,比可开机扇区范围(0 ~ 1023) 小得多,所以可以随意分割。将光标以方向键移动至 1.19GB 这颗硬盘后,按 Enter : 因为这颗硬盘之前被我灌过 Linux ,所以会显示 Linux 的扇区划分情况。上面的意义为: • 启动:由于系统开机时会去先去找分割表, 由分割表所设定的『可开机扇区』进行开机程序, 因 此若这个扇区为开机扇区,则『启动』项目会有一个心型的符号存在! • 起始磁柱与结束磁柱:这一个被分割的扇区的开始与结束扇区。 • MBytes:这个扇区的硬盘容量。 • 系统 ID 与系统种类:这一个分割表的类型。因为这是 Linux 的分割类型,所以其 ID 显示为 83, 若是 FAT32 的话,则为 0b。 将光标以方向键移动至这个扇区后,按 Enter : 在这个画面中,将光标以方向键移动至『删除分割』这个项目,并按下 Enter : 出现此画面后,确定要删除这个分割就按『[Y]是』这个项目。 删除分割之后你的硬盘中就没有分割表的存在了,所以这个硬盘的系统种类则变成了 未规划。 2. 建立主要分割扇区: 在上面的画面中,按下 Enter 键,会出现下面画面。 由于这一颗硬盘的分割表被删除了,所以『系统 ID』与『删除分割』被取消了。这时按下『建立分割』会 出现如下画面: 然后选择『建立主分割』,那何谓主分割与扩充分割呢?所谓的主分割在 windows 系统下即是 『C 槽』 啦! 但是扩充分割并非『逻辑分割』,这里要注意一下, 所谓的『逻辑分割』是包含在扩充分割中的,例如当 你的扩充分割共有 10GB 但是你想将之分为两槽,则可以使用逻辑分割将扩充分割分为两槽, 这两槽即称 为『逻辑分割』。所以这里要注意啦,建立扩充分割的时候就要选择『配置整个区域』啦! 好!下一步按 下『建立主分割』: 这里会问你是否要将整个硬盘分割为仅有一个磁盘区?由于我们要将硬盘分为两槽, 所以这里当然选择 『[N]否』啦! 由于你选择了『不要配置整个区域为一块扇区』,所以这时程序要你输入你所需要的扇区。 通常在第一步 是输入『启始磁柱』,这时只要按 Enter 就可以啦,然后会要你输入『结束磁柱』, 结束磁柱的输入方 法有两种模式,一种是输入磁柱区,一种是输入你所需要的 MB 数,通常我是输入 MB 数啦,例如如上所 示,我所需要的空间大小是 600MB , 所以输入『+600』即可,而如果你的硬盘很大,你要输入 4GB 时, 则需要输入 『+4000』,以此类推!输入『+600』并按 Enter 之后出现如下画面。 这时出现了你刚刚划分的硬盘信息啦,由于我们是划分为 DOS 分割区,所以系统种类是 FAT-32 ,而 ID 则 为 0b 。至于另外尚未划分的就会显示为 <未规划> 啦!如果你还需要再继续划分的话,这时将光标移动 至 <未规划> 的那一个扇区按 Enter 后选择『扩充分割』即可继续划分。如果划分完毕之后, 当然就是 贮存分割表啰。这里注意一下,因为刚刚的动作均尚未完成贮存的工作,所以要反悔还来得及! 3. 贮存分割表: 接下来要做贮存的动作了,按下『Esc』键 (键盘左上角那个键)后会出现如下画面: 按『[Y]是』,将刚分割好的分割表贮存至硬盘中! 然后出现如下画面: 这里的动作是连续的: 1. 程序会先跟你确认你的硬盘有没有错误,这里还可以反悔。 2. 然后程序会问你是否需要使用破坏贮存,一般来说是需要使用『破坏贮存』的, 因为需要将你的 硬盘划分完全啦!所以要按 [Y]; 3. 为了可以让你以后回复分割情况,所以你可以选择 『建立 UNDO』档,所谓的 UNDO 文件即是记 录你之前硬盘分割表信息的档案啦。 这样一来你的硬盘就划分完毕而且贮存啦!这时要做的就是重新开机并格式化硬盘。格式化硬盘可以使用 DOS 的 Format ,当然也可以使用 spfdisk 的内建功能喔! 4. 格式化硬盘: 再进入刚刚你划分完毕的那个硬盘区,按下 Enter 之后会出现一串选单,然后最下方的选单为 『DOS 工 具』,选择这一项并按 Enter 后,会出现另一个选单: 在这个次选单中的第二项即是快速格式化,这个格式化的动作非常的快喔!比 DOS 的格式化快多了!不过, 这里也必须指出一个问题,那就是若你的硬盘有坏轨的话,那最好还是使用 DOS 的 format 比较完整一点。 参考数据 • SPFdisk http://spfdisk.sourceforge.net/ 事实上, SFPdisk 能作的事情还很多,包括最为人所熟知的 boot loader 的应用! 建议您一定 要到 SPFdisk 的官方网站上面瞧一瞧喔! ^_^ 简易且较小安装 Red Hat 7.2 主机的硬件配备与预计开放的服务 硬盘规划 多重操作系统的安装流程 Linux 安装流程(较小安装、完全安装) 建立软盘开机片 本章习题练习 最近更新日期:2003/02/03 主机的硬件配备与预计开放的服务 就如同前面所说的,安装你的 Linux 之前,最好先来了解一下您的 Linux 用途!当然啰!如果目前您所 需要的 Linux 仅只是在于学习 Linux 的指令的话,那么底下的咚咚你都可以把他看看就好!不过,还是 强烈的建议您慢慢的一步一步的安装你的 Linux 系统,这样对于您的 Linux 系统会有比较完整的概念说! 此外,由于 Linux 系统最好在安装完成之后,立即重新编译过他的核心,以使 Linux 系统『较为稳定』, 所以,在你可以连上 Internet 的时候,千万记得一起下载新的 核心 喔!由于 Red Hat 7.2 的核心版本 为 2.4.7 ,因此,你必须要下载较新的 2.4.17 以后的版本喔(到 2002/02/16 为止)。 我的主机配备: 好了,既然 VBird 写的这个部分主要的目的是在于『使用淘汰的计算机来进行 Linux 服务器的安装』, 那么我的硬件配备当然不会太好啰!以下就是我的配备啦: • CPU 为 P-166,主机板为华硕的老主机板; • 使用 64 MB 的 RAM (是 72 pin 的喔!); • 硬盘为 3.2 GB 的硬盘,安插在 primary 排线的 master 上面; 这里要特别说明一下,通常在 586 之后的主机板上面都有两条接排线的界面(排线就是 硬盘与主机板相接的那一个东西啦!),而我们称这种界面为 IDE 界面(目前的主流硬 盘界面),并且主机板上面的这两个界面就分别称为 Primary (主要的) 与 Secondary (次要的) IDE 啰。 而如果你有仔细观察的话,那么每一条排线上面还有两个插孔,也就是说一条排线可以 接两个 IDE 界面的装置(硬盘或光驱),而你有两条排线,因此一个主机板在预设的情 况中,应该都可以接四个 IDE 界面的装置。好了,那么每条排线上面该如何判别哪一个 是主硬盘( Master ),哪一个是副硬盘( Slave )呢?基本上这个需要调整硬盘上面 的 jump 才可以知道!这个时候,请察看一下您的硬盘机吧!上面应该都会有图示说明 才对! 这一部份请特别留意喔!因为不同的硬盘接法将会导致不一样的状况,更严重的,将会 导致无法开机的窘境,所以建议您注意一下这里! • 网络卡预计使用两块螃蟹卡,不过,如果您不希望有无法分辨网络卡的状况发生,那么建 议使用两块不一样芯片的网络卡比较好! • 显示卡使用的是 S3 Virge 的 PCI 显示卡,不过由于我以后的过程中将不会使用 X-Windows ,所以这部份似乎不会有问题! • 安装过程中需要的装置:键盘、屏幕、光驱、软盘机等等,这些装置在安装完成 Linux 之 后,即可马上拔掉! 硬盘 partition 的问题: 硬盘的 partition 是相当重要的一环呦!这里有一些重要的信息要先跟大家报告!就是说: • 在 Linux 底下,每一个装置都以一个档案来代表,例如 IDE1 的 master 为 /dev/hda , 而由于 primary + extended 最多有四个 partition ,所以第一个由 extended 分割出 来的 logical 扇区为 /dev/hda5 ! • 需要特别留意的另几个装置是网络卡、软盘、光盘,其代号分别为: eth0, /dev/fd0, /dev/cdrom! • 如果你有一个硬盘接在 IDE2 的 master 上面,并且有 5 个可以使用的扇区,同时你分割 了 2 个 primary partition 时,那么你的磁盘应该就会有底下几个代号: o /dev/hdc1 (primary) o /dev/hdc2 (primary) o /dev/hdc3 (extended, 这个为不可使用的磁盘代号) o /dev/hdc5 (1st logical) o /dev/hdc6 (2nd logical) o /dev/hdc7 (3th logical) 预计开放的服务: 虽然是老旧的配备,不过相对于我服务的机器数:五部个人计算机,也相当足够了!呵呵!那么我需要的 服务有哪些呢? • NAT : 用来分享频宽; • Mail : 用来收发信件; • WWW : 用来给大家架设个人网页; • Proxy : 用来提供五部区域计算机内的用途,并加以分流; • DHCP : 主要在提供内部计算机不需要安装一些有的没的! • FTP : 最好是不要安装的啦! 我的网络: 我的网络主要是以 拨接制 ADSL 为主,那么如何规划呢? • 在 Linux 系统中,预计以 rp-pppoe 这个软件来拨接 ADSL 并且予以分享; • 我的内部网络之 网段 为 192.168.1.0/255.255.255.0 这一个,没有再切割的子网络; • 我的 Linux 主机名称为 vbird.adsldns.org ,是跟 www.adsldns.org 申请的动态 DNS 系统; 选择的套件: 我选择的安装套件为 Red Hat 7.2 版,他的特征为: • 这一版的预设核心为 2.4.7-10 ! • 预设的防火墙机制为 Kernel 2.4.x 的 iptables ; • 预计使用 LILO 作为 Boot Loader 喔! • 另外,由于在设定其它的服务之前,想要先以较新的 Kernel ( 核心 ) 来编译过,因此需 要先下载核心! 大致上就是这样啰! 硬盘规划 自订安装『Custom』: 初次接触 Linux :只要切割『 / 』及『 Swap 』即可! 好了,通常初次安装 Linux 系统的朋友们,我们都会建议他直接以一个最大的扇区『 / 』来安装,这样 有个好处,就是不怕分割错误造成无法安装的困境!例如 /usr/ 是 Linux 安装程序中摆放的目录,万一 你分割了一块扇区给 /usr ,但是却给的不够大,那么就伤脑筋了!因为会造成无法将数据完全写入的问 题,就有可能会无法安装啦!因此上,如果你是初次安装的话,那么可以仅分割成两个扇区『 / 与 Swap 』 即可! 建议分割的方法:预留一个备份的扇区! 就如同前面几个心得分享文章中提到的,由于 Linux 预设的目录是固定的,所以: • 通常我们会将 /var 及 /home 这两个目录稍微加大一些,如果硬盘够大的话,加个几 GB 也不为过! • 另外, /usr 至少给他 3~5 GB 吧,如果硬盘真的大的话! • 而 / 也可以给个几 GB 的空间。 • 最后,由于我们的 Linux 可能是在『试用』阶段,所以很有可能会重复的一再安装,因此 上,我都会预留一个扇区来备份我的核心啦与实验过程中觉得不错的 scripts (就有点 像 DOS 的批次檔),当然,我的 /home 底下的咚咚也可以有备份的地方,而安装套件 的源文件也可以摆在这里!有个最大的好处是,当我的 Linux 重新安装的时候,我的一 些套件马上就可以直接在硬盘当中找到!呵呵!重新安装比较便利啦! 选择 Server 的硬盘切割方式: 对于首次接触 Linux 的朋友们,通常不建议使用 Red Hat 预设的 Server 安装方式,因为会让你无法得 知 Linux 在搞什么鬼,而且也不见得可以符合你的需求!不过,这里仍然说一下选择 Server 的时候,他 是如何切割硬盘的呢? 注意:选择 Server 的时候,请『确定』您的硬盘数据是不要的!因为 Linux 会自动的把你的硬盘里面旧 有的数据全部杀掉!此外,硬盘至少需要 2 GB 以上才可以选择这一个模式! • 64 MB 的 Swap ; • 256 MB 的 / ; • 256 MB 的 /var ; • 其它的空间平分给 /usr 与 /home ! 知道了吗?由于 Server 会有上面的限制,所以通常我都不太喜欢让 Linux 自己切啦!选择 Custom 比较 好说! 硬盘的代号意义? 在 Windows 或者是 DOS 年代,硬盘以 FAT 表来切分时,他们的代表扇区为 C: D: E: ...但是在 Linux 中 则不然喔!一个『目录』可以代表一个『装置』!基本上,每一个硬盘在安插的 IDE 接口中,都有不同的 代号: 硬盘安插的 IDE 接口 第一个 IDE 的 Master 上之硬盘 第一个 IDE 的 Slave 硬盘 Linux 上面的磁盘名称 hda hdb 第二个 IDE 的 Master 硬盘 hdc 第二个 IDE 的 Slave 硬盘 hdd 另外,需要特别留意的是,每一个硬盘(例如 hda )最多可以有 4 个 primary 扇区!分别是 hda1, hda2, hda3, hda4!而如果是逻辑扇区的话,那么就需要由 hda5 开始增加啰! 多重操作系统的安装流程 • 硬盘重新规划的多重开机系统: 如果你想要在你的 Linux 机器上同时安装 Windows ?可行吗?当然可行啰!况且目前很多的朋 友手边只有一部计算机,但是又想要同时学习一下 Linux ,呵呵!那么安装多重操作系统实在是 必须要的!好了!那要如何安装呢?以我前一阵子帮一个朋友规划的 Win98, Win2000, Linux 为 例,我先将硬盘以 spfdisk 切割成两个 FAT partition,分别是 2GB 与 3GB ,预计安装 Win98 与 Win2000 (分别是 C: 与 D: ),然后再以 CD 开机后,分割最后的磁盘成为 / 与 Swap 两 个!好了!如何安装: 1. 先以 Spfdisk 分割硬盘:由于 Windows 的 Fdisk 实在太慢了,我蛮喜欢使用 spfdisk 这个全中文的磁盘分割接口的!简单又方便!将硬盘切割成 C: 2GB, D: 3GB即可!详细 的 Spfdisk 执行范例可以看一下底下这一篇: spfdisk 范例 2. 先安装 Win98 :这个简单吧!用 98 开机片开机之后,直接安装,并且选择安装在 C 槽 即可! 3. 再安装 Win2000:进入 Win98 之后,将 Win2000 的光盘片放进光驱中,屏幕会自动的 跑出一个窗口,问你要不要升级,选择『是』,然后会进行一些小动作!在安装程序问 到『升级安装或全新安装』的时候,请千万选择『全新安装』这个项目,并且不要升级 硬盘扇区!然后在出现一个『问你安装目录所在』的问题时,进入选项里面,选择『要 我自己挑选硬盘分割区』那个项目!然后接下来一直按下『确定』或『是』即可!之后, 计算机会重新开机,开机完成之后会进入 Win2000 的安装画面,然后在出现『安装扇区』 的时候,请选择 D 槽,并且选择『不要更改扇区档案系统』即可!接下来就会完成一些 程序啦! 4. 最后才安装 Red Hat 7.2:是的,最后才安装 Linux !安装的过程底下会说明喔! 5. 以 Lilo 设定多重开机:是的,我还是比较习惯使用 Lilo 来作为多重开机的设定啦! 好了!这样你就可以具有多重开机的主机系统啰!很高兴吧!呵呵!先别高兴的太早!很多的朋 友安装 Windows XP 及 Windows ME 版本与 Linux 共存,安装的结果是『残念』的!不过个人没 有试过 XP 与 ME ,所以无法提供任何的解答!这点请千万注意了!在我的经验中,使用 98 与 2000 来与 Linux 共存是没有问题的(在我的旧机器与新的双 CPU 主机当中都试过! OK !) • 在既存的 Windows 系统中加装 Linux 系统: 另外再提供一个之前也曾经安装过的一个经验!恩!你可能会觉得奇怪,这个方法跟上一个方法 有什么不同!?呵呵呵呵!最大的不同在于: o 我既存的 Windows 系统中的数据不想丢掉,并且我也没有新的硬盘来暂存我的系统或者 是备份数据!假设原本我的 20 GB 硬盘中分割成 10GB, 10GB 两槽,但是我还想要安装 Linux ,且是在『旧系统仍然可以存活』的情况下!那该如何是好?! 这真的是很有趣的问题!早先在 Windows 系统中, VBird 就犯了一个错!C 槽给的太大了!基 本上,系统文件不需要太大啦!通常我都喜欢 C 槽只给大约 4 GB 左右的空间(甚至更小),这 是因为 C 槽是很需要备份的!如果太大的话,备份很麻烦!所以系统重置就会很花时间(因为所 有的东西都要重新安装!我哩咧....!)!因此,我都习惯将 C 槽只给一点点的空间,然后再安 装完并设定完所有的系统之后,马上以 Ghost 来备份我的系统!而所有的备份数据文件都摆放在 D 槽!此外,我的 OutLook Express 的书信目录也都不是摆在 C 槽!呵呵所以我不会很害怕 C 槽 挂掉,因为,直接以 Ghost 还原即可啰!系统还原还不需要 30 分钟呢! 这里就发生一个问题啦,假如原本的系统是 10GB, 10GB 的两槽,不过全部的有用到的资料量只有 10GB 不 到!也就是还有空间来安装 Linux ,但是由于硬盘切割的不好,所以伤脑筋!此外,我的原系统希望留下 来,而且也希望可以安装 Linux ,要怎办?!我曾经这样做过: • 由于 FAT 的扇区使用,其实只是在磁头区域(所谓的硬盘第零轨)规划而已,所以,我就 将我的数据先以『磁盘重组』的方式将数据都归在一起; • 然后以 Spfdisk 将该硬盘的 FAT 表进行分割,注意喔!只是分割 FAT 表,并没有 format 喔!不过这里的技术性很高,需要特别注意!因为你是将 FAT 表重新划分,所以你的数 据必须要在同一个扇区内!好了,我就将原本的 10GB 10GB 切割成 4GB、10GB 与 6GB 三 槽!而且在 spfdisk 的帮助之下,顺利的在没有任何数据遗失的状况下,将我的硬盘由 原先的两槽分割成三槽啰!那么一来,我就可以在我原本的 D 槽里面安装 Linux 啦! 方法有点像底下的图示: 很神奇吧!数据还是在原来的地方,不过扇区的定位点改变了,还多出一个扇区!不过,这里要提醒大家, 虽然 VBird 曾经以这个方法成功而且完全没有惊险的将硬盘数据在不毁损的情况下,顺利的将硬盘切割完 毕!但是那是小弟已经了解到 FAT 与扇区的相关性(其实 FAT 只是在『规范』你的硬盘读取头读取的『头』 跟『尾』而已,并不是真的将硬盘『切割』啰!),而且我也有『壮士断腕』的觉悟!呵呵!因此不是很 建议您这样做!尤其是当你的数据还很重要的时候!切记切记! Linux 安装流程(较小安装、完全安装) 接着下来要开始来安装 Linux 啰!说了这么多有的没的 ㄟ .... 不好意思, VBird 太喜欢胡扯了.... 事先检查: 基本上你必须先检查一下你的武装配备喔: • 下载并烧录 Red Hat 7.2 的可开机光盘:不要问我如何烧录~~ enigma-i386-disc1.iso enigma-i386-disc2.iso 强烈的建议您不要使用 HTTP 来捉这两个档案,就是不要使用 IE 或者是 Netscape 之 类的浏览器来捉这两个档案,因为档案太大了,在传输的过程中会有捉错的情况,所以 就会很麻烦....建议使用续传软件,或者是直接以 FTP 软件到中山大学的 FTP 站捉, 不但具有续传功能不怕断线,捉到的档案也会比较正常(已经有很多朋友在 BBS 上面留 言,发现捉的档案无法烧录啰!)。此外,也建议直接下载新的核心,以方便后来的核 心编译工作!目前新的核心已经出到了 linux-2.4.17 (截至 2002/02/16 为止),通 常 VBird 都是在中山大学下载的,你可以到底下来看看呦! 中山大学关于核心 • 进入 BIOS 设定开机顺序: 基本上如果是不太旧的主机板都会支持光盘开机的,使用 CD-ROM 开机的好处是比较快, 而且也不用再去做 Linux 安装开机片,确认的方法如下: o 按电源键开机; o 在进入系统之前会出现 Del 字样(每个厂牌不太相同),此时按下键盘上的 Delete 键; o 进入 BIOS 之后以方向键选择 『BIOS Features Setup』这一项,或者是 『Advanced BIOS Features』,不管如何,反正只要看到 『BIOS Features』 字样的那一项就对了!; o 将方向键移动至 『Boot Sequence』 或者是 『First Boot Device』; 这一 项,按键盘上的『Page Up』 或 『Page Down』 按键,选择『CD-ROM』 为第 一开机顺位即可。这里注意一下,如果你的机器并不支持 CD-ROM 开机的话, 你一定找不到 CD-ROM 这一项,这时请制作开机片吧,并将此项调整为『A』为 第一顺位; o 按键盘上 『ESC』 键退出; o 将方向键移动至 『Save and Exit』 这一项按 『Enter』 及 『Y』 确认后重 新开机即可! • 制作 Linux 开机片: a. 随便找一台 Windows 计算机,开启 MS-DOS 窗口; b. 将可开机 Linux 光盘放入光驱中,在 MS-DOS 窗口键入: C:\WINDOWS> cd E:\dosutils 上面的 E 为你的光驱代号; c. 在 DOS 提示字符下键入: E:\dosutils> rawrite -f e:\images\boot.img -d a: 上面的 e 为你的光驱代号,这时在软盘机放入一片空白的软盘片后,按『Enter』 即可。 开始安装: 这样就准备妥当了!正式进入安装吧!特别说明,由于 VBird 不太喜欢使用 X-Windows 系统,所以通常 我都使用文字接口安装的,因此底下将以 文字 接口作为介绍,而且,由于许多画面不是很重要,因此 VBird 并没有将画面秀出来喔! 1. 开机==>放入 Red Hat 7.2 的光驱后,以 CD-ROM 开机或者以刚刚做好的 Linux 软盘开 机; 2. 选择安装模式==>进入欢迎画面,之后在『 boot: 』的地方输入:『 text 』以文字接 口安装!这个时候 Red Hat 会加载一些模块,所以会花费一些时间。 3. 选择语系==>然后在选择语系的地方输入『 English 』;因为文字接口好像没有支持中 文的样子!? 4. 键盘模式==>同样的,键盘先选择『 us 』即可; 5. 鼠标模式==>由于我没有鼠标,所以直接按『 tab 』键到『 OK 』按下 Enter 即可; 6. 欢迎画面==>按 Enter 即可; 7. 选择系统模式==>如前所述,这里共分为 Workstation, Server 与 Custom 等等,由于 Workstation 与 Server 会将你旧有的硬盘 Partition 给杀掉,因此我们就直接以 『 Custom System 』来安装吧! 8. 要不要 Linux 自动帮你规划硬盘==>开什么玩笑!当然要自己规划自己的硬盘啰!请选 择『 Manually partition 』这一项; 9. 选择硬盘分割工具==>硬盘分割工具当然是选择比较简单的啦!那么我们就选择『 Disk Druid 』这个有点像图形接口的咚咚吧! 10. 硬盘分割==>进入 Disk Druid 接口之后,应该有点像底下的图,不过由于 VBird 不会 捉图,所以底下的画面是『错误的』喔! Red Hat 7.2 版已经不是这个样子的图示了! 因为他还有加入 ext3 呢!呵呵!不过基本的使用方式还是差不多啦!底下来说一说吧: 基本上你会看到类似上面的话面,总共会显示你的目前硬盘的扇区,如上面说的, 『 Primary IDE 的硬盘中的 Mater 为 hda 』!这点请特别留意啰!好了,如果你要将 旧有的 FAT 扇区安装 Linux 的话,那么你就必须将该扇区『 Delete 』掉才行,不论 如何,请看一下你的剩余硬盘数据空间(注:常常有很多的朋友来信问到,咦!我的 E 槽 明明还有 5GB 的空间,为什么不能安装 Linux 呢?!就是这个问题啦!因为 Linux 的 扇区与 Windows 的 FAT 并不相同呀!所以你必须将原有的 FAT 扇区砍掉后,才能规划 出新的 Linux 扇区呀!所以要看一下硬盘的 Free 喔!)我这里建议的分割方式有几种 (请注意,第三个安装的选项是关于 Proxy 的设定方面,如果你要安装 Proxy 套件的 话,才建议多加这些扇区!因为据说这样分割的硬盘会让 Proxy 的效能比较好!): 较小安装(或初次安装) 建议安装 • Swap 约 100 MB; • /var 给 3~5 GB; o Swap 约 • /usr 给 3~5 100 MB ; GB; o 其它的都 • / 给 1 GB 以 给/ 上; • /home 可以给大 一些; • /backup 用来做 为备份的扇区 含有 Proxy o 与 建议安装 相同 o /proxy1 给 500 MB; o /proxy2 给 500 MB; o /proxy3 给 500 MB; o /proxy4 给 500 MB 另外,进入每一个扇区之后,你必须要决定: 『 Mount point 』就是扇区啦; 『 Filesystem type 』除了一定要有一个 Swap 之外,你可以选择 Ext3 这个新的扇区 喔!似乎有稍微快一点呢; 『 hda, hdb 』这个是硬盘啦!这里请小心选择! 『 Fixed Size 』由于我们都需要给每一个扇区固定的大小,所以这里就选择 Fixed Size 这一个,但是在最后一个扇区(通常是 /backup 这一个)时,我通常都会选择『 Fillall available space 』将其它剩下的空间都给他! 『 Force to be a primary partition 』除非特别需求,例如你的这个扇区是开机区, 但是却可能落在 8 GB 以后的扇区内,那么才需要将这个勾选,否则这个选项不要管他! 『 Check for bad blocks 』除非你的硬盘是有坏轨的,否则『千万不要选』不然硬盘 检查真的好慢....好慢..... VBird 的分割结果(3.6 GB 硬盘): /dev/hda1 2204 / /dev/hda2 996 /var /dev/hda3 502 /backup /dev/hda5 100 /proxy1 /dev/hda6 100 /proxy2 /dev/hda7 100 /proxy3 /dev/hda8 100 /proxy4 /dev/hda9 64 Swap 11. 选择安装的开机管理系统==>Red Hat 7.2 提供两个开机管理系统,由于 VBird 比较习 惯使用 Lilo ,所以这里我是选择『 Lilo Boot Loader 』的!如果你要试一试其它的 多重开机控制软件,不反对啦!但是,这里 VBird 仍是以 Lilo 来作为说明的! 12. 选择开机管理系统安装的扇区==>如果没有特殊的需要,就直接选择『 MBR Master Boot Record 』吧! 13. 加载额外的模块==>这个选项专门提供给系统中特殊装置使用的!由于我们的装置都很普 通,所以这里就按『 OK 』跳过去吧! 14. 开机系统的名称==>你可以选择其它的名称,当然也可以不用理他,以预设的名称输入之, 例如,如果你已经存在有 Windows 系统,那么很可能 Lilo 秀出来的却是 DOS 字样, 你可以修改啦!这个可以在未来 Lilo 的部分说明,所以先不要管啦! 15. 网络卡设定==>『先再次强调,VBird 这一次的安装是预计要安装两块螃蟹卡的,由于具 有相同的芯片组,所以我在安装的时候仅先安装一块而已!并且,这一块网络卡预设是 做为内部虚拟网络之用的!另外一块会在后面才安装上去!』。如果你不是使用很奇怪 的卡,那么这个步骤应该会出现网络卡的设定的!(我在这个步骤中预设是当作内部网 络之用!所以先给他一个虚拟 IP 喔!) 首先将 DHCP 前面的 [*] 取消(按空格键); 然后按上下键来设定你的网络条件成为: IP:192.168.1.2 Netmask:255.255.255.0 Gateway:192.168.1.2 Primary DNS:139.175.10.20 Secondary DNS:163.28.112.1 16. 主机名称的设定==>给自己一个名字吧!例如我的主机为 vbird.adsldns.org 啰!这里 写错也不要紧,后面会提到修改 host name 的方法! 17. 防火墙的设定==>由于我们会在后续的步骤中更改一些防火墙机制,所以这里不用设定 啰!选择『 No Firewall 』那一个项目; 18. 选择语系==>通常我只选择两个语系,分别是『 English 』与『 Taiwan, R. O. C. 』 这两个! 19. 选择预设语系==>由于我不使用 X-Windows ,而终端机界面(纯文字界面的情况下)并 没有办法提供中文的显示,选择中文作为预设的语系反而会在纯文字界面下出现乱码!! 所以我都是选择『 English 』作为我的预设语系啰! 20. 选择时区==>在台湾,当然选择『 Asia/Taipei 』啰! 21. 设定密码==>这里要特别告诫大家,密码最好『多于八个字符』,并且含有『非英文或数 字的特殊符号』为较佳的选择!当然啰,你也不能忘记呀!选择 Password 会有两次, 提供你输入正确的密码! 22. 设定使用者 ID ==>我这里通常都先不设定的!所以就跳过去吧!先不设定啰! 23. 选择加密的条件==>也使用默认值就可以了!所以按下『 tab 』键移动至『 OK 』后, 按下 Enter 吧! 24. 套件选择==>呵呵!终于来到重头戏了!底下提供三个选择,你可以参考看看!通常,如 果你的硬盘很大的话,那么将光标移动到最底下,选择『 Every thing 』来个完全安装 即可!但是为了安全性,不建议选择 Every Thing 啦!VBird 建议以『建议二』的方式 来安装,不过,如果你的硬盘很小的话,那么就选择『建议一』来安装吧!无论如何, VBird 的系统中是以『 建议二 』安装的! 建议一 o Network Support o Dialup Support o Messaging and Web Tools o Router/Firewall o Network/Managed Workstation o Utilities 全部套件共占 366 MB 适合只想要作为 NAT 之用的机器 建议二 建议三 o Network Support o Dialup Support o Messaging and Web Tools o Router/Firewall o Network/Managed Workstation o Utilities o Software Development o Kernel Development o 选 择『 Every Thing 』 全部套件共占 657 MB 全部套件共占 2902 MB 可以后续再加入套件! 新手的安装啦! 25. 大概就这样吧!若想要跟 VBird 一样的系统,那就直接以『建议二』安装啰! 26. 开始正式安装啰==>这个时候系统会跟你说:『安装的过程中,会将信息都记录在 /var/install.tmp 档案中』不理他,直接给他『 OK 』下去!然后系统就会正式的作底 下的工作啰: 1. 先 Formating ,这个动作蛮快的,但是如果你前面选择了『 check bad blocks 』那么可能就会花很长一段时间! 2. 再来是 Copying files ,然后是: 3. Package Installation !通常是蛮快的,由于我们安装的套件并不多!不 过,如果你是选择 Every Thing 的话,那么可能要花比较长的时间喔!过程中 需要抽换光盘片喔! 27. 制作开机片==>Boot Disk 最好作一下吧!有备而无患呀! 28. 完成安装==>屏幕显示出 Complete 的时候,哈哈!恭喜你啦!这样就 OK 啰! 注意事项: • 你可能会觉得很奇怪,为什么你的安装过程会跟我的不一样?!呵呵!由于 VBird 的安装 是比较简易的,包括我也没有安装 X-Windows 呀!所以当然也就没有 X-Windows 的测 试的画面啰!因此,如果你再安装的过程中选择了跟我不一样的套件,不用担心,安装 过程会有些许的不相同的! • 在安装完成之后,请千万记得『取出光盘片』,不然又会在进入一次安装画面喔! • 同时建议,安装完成之后,请进入您的 BIOS 当中,将开机的顺序改回来『 C、A 』或『 C only 』反正就是让硬盘开机啦! 好了!这样应该就已经安装完毕了!请继续往下看看吧!而且,相当的建议您,在正式的进行架站之前, 请依序看一下底下的网页,最好不要跳着看,不然的话,嘿嘿嘿嘿!出现什么问题可不要怪我!因为,照 着顺序看会对你的 Linux 认识比较有帮助啦! 建立软盘开机片 建立软盘开机片一直是个好主意!他可以在你求助无门的时候给你莫大的帮助喔!所以,建立一个新的软 盘开机片是一个好主意啦!如何建立呢?其实真的是很简单,不过,需要你的系统核心的版本就是了!依 序进行底下的步骤(先将软盘片塞进软盘机中喔!) [root @tsai / ]# uname -r 2.4.7-10 <==先取得核心的版本 [root @tsai / ]# mkbootdisk --device /dev/fd0 2.4.7-10 Insert a disk in /dev/fd0. Any information on the disk will be lost. Press to continue or ^C to abort: 按下 enter 吧! 注意一下上表的第三行,mkbootdisk 是制作开机软盘的指令,而 /dev/fd0 是软盘的代号,至于 2.4.7-10 则是我们系统的核心。要注意的是,如果你的核心曾经更新过,那么你的核心将不会是预设的 2.4.7-10 喔! 需要跟着改变才行!这样就制作 OK 啰!然后将你的可开机软盘贴上卷标,给他保存起来吧! 本章习题练习( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 ) • Linux 的目录配置以『树状目录』来配置,至于磁盘分割区 ( partition ) 则需要与树状目录相 配合!请问,在预设的情况下,在安装的时候系统会要求你一定要分割出来的两个 Partition 为 何? 答: 就是根目录『/』与虚拟内存『Swap』 • 什么是 IDE 界面,一般而言,普通 PC 允许几个 IDE 界面与装置? 答: IDE 为用来传输硬盘数据的一个汇流界面; 共有 IDE1, IDE2 ,分别有 master 与 slave 所以共四个 IDE 装置支持! • IDE2 的 master 之第一个 logical 磁盘中,其装置代号(文件名称)为何? 答: /dev/hdc5 • 在硬盘分割 (Partition)时,最多有几个 primary + extended ? 答: Primary + Extended 共四个,其中 Extended 只有一个! ( 更详细的硬盘与 MBR 可以 参考 这里 这篇讨论 ) • 若在分割的时候,在 IDE1 的 slave 硬盘中,分割『六个有用』的扇区(具有 filesystem 的), 此外,有两个 primary 的扇区!请问六个扇区的代号? 答: /dev/hdb1(primary) /dev/hdb2(primary) /dev/hdb3(extended) /dev/hda5(logical 底下皆为 logical) /dev/hda6 /dev/hda7 /dev/hda8 请注意,5-8 这四个 logical 相加的总和为 3! • 一般而言,在 RAM 为 64MB 或 128 MB 的系统中, swap 要开多大? 答: Swap 可以简单的想成是虚拟内存,通常他的建议大小为 RAM 的两倍,但是实际上还是 得视您的主机规格配备与用途而定。约两倍的 RAM ,亦即为 128 MB 或 256 MB ,可获 得较佳效能! • 什么是 GMT 时间?台北时间差几个钟头? 答: GMT 时间指的是格林威治时间,为标准的时间,而台北时间较 GMT 快了 8 小时! • Tap, SCSI 硬盘, RAID, printer 的装置代号? 答: Tap : /dev/ht0 (IDE), /dev/st0 (SCSI); SCSI H.D.: /dev/sd[a-p], RAID : /dev/md[0-15]; printer : /dev/lp[0-2] • 如果我的磁盘分割时,设定了四个 Primary 扇区,但是磁盘还有空间,请问我还能不能使用这些 空间? 答: 不行!因为最多只有四个 Primary 的磁盘分割槽,没有多的可以进行分割了!且由于没 有 Extended ,所以自然不能再使用 Logical 分割说 • 我的 Mandrake 9.0 在安装的时候,进行 X-Window 的测试时都不会成功,要怎么办呢? 答: X-Window System 的!万一还是没有办法登入 X-Window 的话,没有关系!不要害怕!等到 后来『系统管理员篇』的时候,我们再来`入的谈一谈 X-Window 的设定吧!! ^_^。而,如果万 一不幸不小心按下了测试,要怎么办呢?屏幕已经一片漆黑了!@_@,没关系,此时可以按下 [Ctrl] + [Alt] + [F1] 就可以回到原先的画面啦! • 通常在安装 Linux 的时候,最重要的就是磁盘分割了!请问:磁盘分割通常要分成几个步骤? 答: 1. 进行磁盘分割 partition ; 2. 进行格式化 format ; • 磁盘分割之后会有所谓的 Primary, Extended 与 Logical 的磁盘分割槽,请问何者为可使用的 Partition ? 答: 只有 Primary 与 Logical 为可用, Extended 为不可直接使用的 Partition ,还需要 再次的分割成为 Logical 之后,才可以继续使用!而最大可分割出来的 Partition 应 该有 64 个才对! 安装 FC4 与多重开机小技巧 最近更新日期:2005/11/08 等了好久!终于要开始来安装我们的 Linux 练习机了!注意喔! 既然这里特别强调的是『练习机』,所 以,里面的种种建议都是『练习用』的喔! 而且,这部练习机在您顺利的了解 Linux 的主机操作之前,『最 好不要连上 Internet 』呢!很容易被入侵啊! 我们这里使用目前最新的 Fedora Core Release IV 来进行安 装喔! 1. Linux 安装的第一步『规划』 1.1 一个练习机的规划 1.2 硬盘的连接与代号 1.3 认识硬盘的 partition 1.4 Linux 安装模式下,硬盘分割的选择(极重要) 2. 开始安装 Fedora Core Release IV 3. 多重开机安装流程与技巧 4. 关于大硬盘导致无法开机的问题 5. 本章习题练习 6. 针对本文的建议:http://phorum.vbird.org/viewtopic.php?t=23876 Linux 安装的第一步『规划』 由 上一章的 Linux 主机规划 我们大致上可以了解: 『Linux 主机的配备要求与 Linux 主机所提供的服 务有关』, 所以啰,要安装 Linux 的第一步就是先进行 Linux 主机的未来蓝图规划啦!那么该如何规划? 由前一章的内容,我们不难了解,要规划好一个 Linux 主机的话,需要: 1. 决定 Linux 主机的角色定位; 2. 根据步骤一,选择适当的硬件配备; 3. 根据步骤一,决定实体硬盘的分割状态; 4. 根据主机上面的操作系统,选择适当的开机加载程序 ( boot loader ) , 以便安装在主要开机 扇区中 ( Master Boot Recorder, MBR ); 5. 根据步骤一,选择所需要的 Linux 程序套件; 好了,既然已经知道大概需要规划的原理之后,底下我们就实地的来操练一遍吧!好让您不会很快的忘掉 去! 一个练习机的规划 假设:这部主机主要是为了我自己练习 Linux 之用, 不过,未来可能会接触到网络的实际练习。而为了 方便数据查询,因此,我需要 X Window 系统的支持, 而且由于不熟悉 Linux ,因此也需要预留硬盘空 间作为日后练习之用。如果是这样的状态, 您应该要如何规划你的主机呢? 1. Linux 主机角色的定位 由上面的假设状态,您可以知道这部主机主要是作为练习之用,需要 X Window , 而且由于操作 者是新手,因此,建议将所有的套件都安装上去呢! 2. 硬件的配备选择: 因为我使用 Linux 来作为练习,而且含有 X Window 在里面,预计是将所有的套件都装上去的, 因此,硬盘不能少,CPU/显示卡等等的等级也必须要适中,不可用等级太低的。而且, 内存也应 该大于 256MB 以上比较妥当。我使用的练习机设备为: o 主机板与 CPU: 我的练习机 CPU 是 AMD 的 AthlonXP 1800+,搭配 Asus 的 A7V8X 主 机板。 o 内存:我安插了 256MB 的内存。 o 硬盘:使用一颗淘汰下来的 20GB 硬盘。因为我只有一部主机,为了要同时使用 Windows 与 Linux 操作系统,因此,我选择了抽取式硬盘盒来帮忙抽换。 这样一来,比较大的 优点是可以让我完全掌控一部主机,而不需要担心将 Windows 的系统删除。 o 网络卡:用最阳春的螃蟹卡(Realtek 8139 芯片)。 o 显示卡:这个重要,因为我要使用 X Window ,因此, 我用的是 32MB 的 ATI 的 9200 芯片组(现在这个等级已经算很差的配备了)。 o 其它的输出/输入装置:一部 DVD 光驱、 pc104 键盘、光学鼠标、300W 电源供应器及 19 吋的传统映像管屏幕。 一般来说,这样的配备算是前一阵子的入门级机种了!目前的入门级机种都比这个配备好太多! 您 也可以利用您的 CPU 等级为 P-III 的主机来进行练习啊! 但不建议使用 P-II 以下等级的机 种。除非您不要使用 X Window !请参考前一章的介绍。 3. 关于硬盘分割的分配: 因为是练习机,建议您主要分为 / 与 Swap 两个即可。不过,还是需要留下一些硬盘空间来作为 练习之用。 我的 8GB 硬盘主要分为 6GB 为 / , 512MB 为 swap , 1GB 为 /home ,另外的磁 盘空间则不规划!。 至于磁盘分割与各目录的相关意义,我们会在 磁盘档案系统 当中来进行说 明,切莫着急啊! ^_^。至于如果您的硬盘大于 60GB 以上时,可能会有开机扇区的问题,那就 必须要独立出 /boot 这个磁盘槽了,请参考 本章最后一节的说明。 4. 选择 MBR 当中的开机管理程序: 在 Linux 里面预设使用两种开机管理程序,分别是 LILO 与 GRUB 这两个好东西,其中,LILO 算 是比较早期的开机管理程序,不过, 鸟哥个人倒是还蛮喜欢 LILO 的, 毕竟他虽然比较死板, 但是还蛮好用的,磁盘代号设定上面与 Linux 上的磁盘代号相同, 所以没有什么太大的困扰。 而较新的 GRUB 其实是很棒的一套开机管理程序,我个人认为, 他最大的功能也最具魅力的地方 是具有『动态搜寻核心档案』的功能, 他可以让您在开机的时候,可以自行编辑您的开机设定系 统档案,呵呵!所以即使您不小心设定错了 grub ,没关系!开机的时候自行编辑一下就好啦! 这方面的技巧, 我们会在 开机流程与 Loader 的时候再来详细的介绍, 还是慢慢的从头学习起 来呦! 5. 选择所需的套件: 虽然将光盘上面的全部套件都安装,是有点浪费硬盘空间,不过我们是练习机嘛! 所以还是完整 的都给他安装下去的好。(如果您想要选择套件的话, 特别建议您,务必将『系统开发工具』, 也就是 gcc, kernel-headers, kernel-source 等等安装上去喔!) 到了这一步之后,嘿嘿!规划就已经差不多了,所以,这个时候,基本上已经可以开始来安装 Linux 啦! 但是,还是有个困扰耶,那就是,在第三步骤的时候,我要怎么在安装的时候分割我的硬盘呀!? 上一章 里面有提过硬盘的排线与硬盘在 Linux 里面的磁盘代号有关,那么该如何分割? 另外,有什么自订的方 式可以来帮我分割硬盘吗?呵呵!底下我们就来提一提如何进行这些动作啰! 硬盘的连接与代号 硬盘分割与配置的好坏,会影响到未来您的主机的使用情况,此外,好一点的分割方式, 会让您的数据保 有一定的安全性!怎么说呢?这么想好了,如果你的 Windows 硬盘里面,仅有 C 槽的话,那么当 Windows 需要重新安装的时候,你又想要重新格式化 ( format ) 时,而 C 槽里面很不巧的,已经放了很多重要的 档案数据,这个时候怎么办? 光是搬这些重要数据到其它空间就受不了! 所以,比较聪明的玩家,都喜 欢分割成两槽以上,将系统档案与数据文件分开, 可以达到比较好的管理效果!除此之外,磁盘分割的好 坏,还可以影响到系统存取数据的效能呢! 这个部分我们在后面几章再来谈一谈! 所以啰,正常使用情况下的 Linux 主机,通常会依照目录与主机的特性,来分割硬盘, 以达到比较好的 管理成效。不过,由于 Linux 的硬盘分割比较具有弹性,同时, Linux 硬盘分割程序 fdisk 功能很强悍, 此外,要分割的好,必须要了解一下基础的硬盘架构, 所以,底下我们先来介绍一下硬盘的基本架构,然 后再来介绍如何分割吧! 现在的主流硬盘应该是 SATA 小排线的那一种接口硬盘。他与旧 IDE 硬盘的分别, 我们已经在前一章谈 过了,这里就略过不提。但不论是 SATA 或者是 IDE 接口的硬盘, 他在 Linux 当中的硬盘代号都是一样 的!所以,这里我们依旧以 IDE 硬盘来稍作说明啰! 通常在 586 之后生产的主机板上面都有两条接排线的界面 ( 排线就是用来连接硬盘与主机板的那一个东 西啦!),而我们称这种界面为 IDE 界面,这也是之前的主流硬盘界面(目前已被 SATA 取代) ,为了区隔 硬盘读取的先后顺序,所以主机板上面的这两个界面就分别被称为 Primary ( 主要的 ) 与 Secondary ( 次要的 ) IDE 接口啰, 或者被称为 IDE1 ( Primary ) 与 IDE2 ( Secondary )。 而如果你有仔细观察的话,那么每一条排线上面还有两个插孔,也就是说一条排线可以接两个 IDE 界面的 装置 ( 硬盘或光驱 ),而你有两条排线,因此 一个主机板在预设的情况中,应该都可以接四个 IDE 界面 的装置。好了,那么每条排线上面该如何判别哪一个是主硬盘 ( Master ),哪一个是副硬盘 ( Slave ) 呢? 这个时候就需要调整硬盘上面的跳针 ( jump ) 才可以知道!请察看一下您的硬盘机吧!上面应该都会有 图示说明才对。 (注:硬盘的 master/slave 判断方法中,除了利用 jump 主动调整之外, 还可以透过 cable 自动选择。) 好了,所以如果我有一个光驱了,那么我最多就只能再安装三部 IDE 接口的硬盘在我的主机上面。OK!那 么由于我的硬盘与 Linux 的磁盘代号有关,那么我怎么知道这个硬盘的代号呢?没问题啦,由 IDE 1 ( Primary IDE ) 的 Master 硬盘先计算,最后是 IDE 2 的 slave 硬盘,所以各个磁盘的代号是: IDE\Jumper IDE1(Primary) IDE2(Secondary) Master /dev/hda /dev/hdc Slave /dev/hdb /dev/hdd 假如我只有一颗硬盘,而且这一颗硬盘接在 IDE 2 的 Master 上面,那么他在 Linux 里面的代号就是 /dev/hdc 啰!OK!好像没问题了呦!呵呵!才不是呢,问题很大呦! 因为,如果我这个磁盘被分割成两 个磁盘分割槽(Partition),那么每一槽在 Linux 里面的代号又是如何?如何知道每个 partition 的代号 呢? 认识硬盘的 partition 基本上,硬盘是由最小的物理组成单位 扇区 ( sector ) 所组成的,而数个扇区组成一个同心圆时,那就 称为 磁柱 ( cylinder ) ,最后构成整个硬盘的容量大小。关于硬盘的管理我们在后续章节再来介绍, 这 里我们比较想要知道的是,如何分割硬盘,所以先简单的将硬盘变成如下的图标: 图 1、硬盘数据示意图 在上面的图示中,我们可以很清楚的知道,在硬盘里面有分为两个区域,一个是放置这个硬盘的信息区, 我们称为 Master Boot Recorder, MBR ( 主要开机扇区 ), 一个则是实际档案数据放置的地方。MBR 可 以说是整个硬盘最重要的地方了,因为在 MBR 里面记录了两个重要的东西,分别是:开机管理程序,与磁 盘分割表 ( partition table )。因此,只要 MBR 物理实体坏掉了,那么这颗硬盘就差不多要报废了! 因 为,如果系统找不到 partition table ,就无法使用这块硬盘,所以数据即使没有丢掉,但是没有 MBR , 呵呵,还是不能使用的啦! 首先来看一看什么是 partition table 呢?简单的说,我们说的『 硬盘分割』就是在修改这个 partition table 而已!他基本上定义了『第 n 个磁盘区块是由第 x 磁柱到第 y 个磁柱』,所以,每次当系统要去 读取 n 磁盘区块时,就只会去读取第 x 到 y 个扇区之间的数据!呵呵!这样知道了吗?很简单吧!下次 记得人家在谈磁盘分割的时候, 不要以为系统真的会在硬盘上面用力、努力的划标签!实际上,他最大的 功能就是修改 MBR 里面的 partition table 啦! 不过,由于这个 MBR 区块的容量有限,所以,当初设计的时候,就 只有设计成 4 个分割纪录,这些分割 记录就被称为 Primary ( 主分割 ) 及 Extended ( 延伸分割 ) ,也就是说,一颗硬盘最多可以有 4 个 ( Primary + Extended ) 的扇区,其中, Extended 只能有一个, 因此,你如果要分割成四块磁盘分割 的话,那么最多就是可以: P+P+P+P P+P+P+E 的情况来分割了。其中需要特别留意的是,如果上面的情况中, 3P + E 只有三个『可用』的磁盘,如果 要四个都『可用』,就得分割成 4P 了!( 因为 Extended 不能直接被使用,还需要分割成 Logical 才行, 底下我们会继续说明的! )。那么为什么要有 Extended 呢?这是因为如果我们要将硬盘分割成 5 个区块 的话,那么怎么办?这个时候就需要 Extended 的帮忙了。 由于 MBR 仅能保有四个 partition 的数据记录,那如果超过 4 个以上时, 系统允许在额外的硬盘空间 放置另一份磁盘分割信息,那就是 Extended 了! 假设您将您的硬盘分割成为 3P + E ,那么那个 E 其 实是告诉系统,磁盘分割表在另外的那份 partition table, 也就是说,那个 Extended 其实就是具有『指 向 (point)』正确的那个额外的 partition table 啦! 本身 Extended 是不能在任何系统上面被使用的, 还需要再额外的将 Extended 分割成 Logical ( 逻辑 ) 分割才能被使用,所以啰,藉由这个 Extended 的 帮忙,我们就可以分割超过 5 个可以利用的 partition 啰! 不过,在实际的分割时,还是容易出现问题 的,底下我们来思考看看: • 思考一:如果我要将我的大硬盘『暂时』分割成四个 partition ,同时,还有其它的空间可以让 我在未来的时候进行规划,那么该如何分割? 说明: 由刚刚的说明,我们可以知道, Primary + Extended 最多只能有四个 partition,而如果要超 过 5 个 partition 的话,那么就需要 Extended 的帮忙。因此,在这个例子中,我们『千万不 能分割成四个 Primary 』为什么呢?假如您是一个 20 GB 的硬盘,而 4 个 primary 共用去了 15 GB ,您心想还有 5 GB 可以利用对吧?错!剩下的 5 GB 『完全不能使用』,这是因为已经 没有多余的 partition table 纪录区可以记录了,因此也就无法进行额外的分割,当然啰, 空 间也就被浪费掉了!因此,请千万注意,如果您要分割超过 4 槽以上时,请记得一定要有 Extended 分割区,而且必须将所有剩下的空间都分配给 Extended ,然后再以 logical 的分割区来规划 Extended 的空间。 另外,考虑到磁盘的连续性,一般建议将 Extended 的扇区分割在最后面的 磁柱内。 • 思考二:我可不可以仅分割 1 个 Primary 与 1 个 Extended 呢? 说明: 当然可以!基本上, Logical 的号码可达 63 号,因此, 你可以仅分割一个主分割,并且将所 有其它的分割都给 Extended ,利用 Logical 分割来进行其它的 partition 规划即可! • 思考三:假如我的硬盘安装在 IDE 1 的 Master ,并且我想要分割成 6 个可以使用的硬盘扇区, 那么每个磁盘在 Linux 底下的代号为何? 说明: 由于硬盘在 Primary + Extended 最多可以有四个,因此,在 Linux 底下,已经将 partition table 1 ~ 4 先留下来了,如果只用了 2 个 P + E 的话,那么将会空出两个 partition number 呦!再详细的说明一下,假设我将四个 P + E 都用完了, 那么硬盘的实际分割会如同下图所示: 图 2、六个硬盘的分割示意图 实际可以使用的是 /dev/hda1, /dev/hda2, /dev/hda3, /dev/hda5, /dev/hda6, /dev/hda7 这 六个 partition!至于 /dev/hda4 这个 Extended 扇区本身仅是用来规划出让 Logical 可以利 用的磁盘空间而已!(其实在每个 partition 的最前面扇区,会有一个特殊的区块, 称为 super block,我们的 Extended 指向的,就是 /dev/hda4 的 super block 处, 该处就是额外记录的 那个 partition table 啦!) 那么万一我只想要分割 1 个 Primary 与 1 个 Extended 呢?这个时候你的磁盘分割会变成如 下所示: 图 3、六个硬盘的分割示意图 注意到了吗?因为 1~4 号已经被预留下来了,所以第一个 Logical 的代号由 5 号开始计算起 来,而后面在被规划的, 就以累加的方式增加磁盘代号啰!而其中 /dev/hda3, /dev/hda4 这两 个代号则是空的, 被保留下来的代号。 Linux 安装模式下,硬盘分割的选择(极重要) 实际上,在 Linux 安装的时候,已经提供了相当多的预设模式让您选择分割的方式了, 不过,无论如何, 分割的行为都不是很能符合自己主机的样子!因为毕竟每个人的『想法』都不太一样! 因此,强烈建议使 用『自订安装, Custom 』这个安装模式! 在某些 Linux distribution 中,会将这个模式写的很厉害, 叫做是『 Expert, 专家模式 』,这个就厉害了,请相信您自己,了解上面就自称为 专家 了吧!没有问 题! • 自订安装『Custom』: • A:初次接触 Linux :只要切割『 / 』及『 Swap 』即可! 好了,通常初次安装 Linux 系统的朋友们,我们都会建议他直接以一个最大的扇区『 / 』来安 装,这样有个好处,就是不怕分割错误造成无法安装的困境!例如 /usr/ 是 Linux 的可执行程 序及相关的文件摆放的目录,所以他的容量需求蛮大的, 万一你分割了一块扇区给 /usr ,但是 却给的不够大,那么就伤脑筋了! 因为会造成无法将数据完全写入的问题,就有可能会无法安装 啦!因此上, 如果你是初次安装的话,那么可以仅分割成两个扇区『 / 与 Swap 』即可! • B:建议分割的方法:预留一个备份的扇区! 就如同前面几个心得分享文章中提到的,由于 Linux 预设的目录是固定的,所以,通常我们会将 /var 及 /home 这两个目录稍微加大一些,如果硬盘够大的话,加个几 GB 也不为过!另外, /usr 至少给他 3~5 GB 吧,如果硬盘真的大的话!而 / 也可以给个几 GB 的空间。最后,由于我们的 Linux 可能是在『试用』阶段,所以很有可能会重复的一再安装,因此上,鸟哥 都会预留一个扇 区来备份我的核心啦与实作过程中觉得不错的 scripts ( 就有点像 DOS 的批次檔 ) ,当然,我 的 /home 底下的咚咚也可以有备份的地方, 而安装套件的源文件也可以摆在这里!有个最大的 好处是,当我的 Linux 重新安装的时候,我的一些套件马上就可以直接在硬盘当中找到! 呵呵! 重新安装比较便利啦! • 选择 Linux 安装程序提供的预设硬盘分割方式: 对于首次接触 Linux 的朋友们,通常不建议使用各个 distribution 所提供预设的 Server 安装方式,因 为会让你无法得知 Linux 在搞什么鬼,而且也不见得可以符合你的需求!注意:选择 Server 的时候,请 『确定』您的硬盘数据是不要的!因为 Linux 会自动的把你的硬盘里面旧有的数据全部杀掉!此外,硬盘 至少需要 2 GB 以上才可以选择这一个模式! 硬盘方面的规划大致上就是如此啦!要规划硬盘的时候,请特别的小心呦! 开始安装 Fedora Core Release IV Linux 安装之前要准备什么呢?就是刚刚前面已经讲过的几个咚咚啦!归纳一下: 1. Linux 主机规划单:就是刚刚我们规划好的那个数据啰! 2. Linux distribution :利用一些映象站台下载各版本的 Linux ,或者直接以本书提供的四块 CD 装的 FC4 进行安装啰! 3. 主机硬件信息收集:根据主机规划单的内容, 去收集一下你的硬件信息吧!其中特别重要的是, 先检查一下是否可以使用光盘开机呢?如果 BIOS 不能支持光盘开机的话,那么就需要先行安装 可开机软盘。 4. 网络硬件联机:这部份本书先不谈,否则内容就太多了, 阿!再写下去鸟哥会疯掉……所以请大 家先上网查阅一下网络的硬件联机吧! 5. 网络信息:包括你的 IP, netmask, gateway, dns IP 、是否为拨接等等,都需要先知道呦! 然后,其实各个套件的安装步骤都差不多,大概都是: • A. 选择安装模式:主要分为图形接口安装与文字接口安装; 如果是图形接口安装的话,还可以 选择语系,这个时候我们就有中文可以使用啦! • B. 搜寻硬件信息:然后安装程序会去搜寻一下系统的硬设备, 以利后续的处理,有的安装程序 会在这个地方让您加入一些参数,以驱动不明的装置设备; • C. 设定键盘、鼠标模式:这个可是很重要的项目呀! • D. 硬盘分割设定:就是刚刚提到的几个注意事项; • E. 套件选择:这是很重要的部分呢!请特别留意! • F. 网络与安全性设定:连上 Internet 的模式与驱动网络卡的方式等设定; • G. 超级管理员与一般身份使用者账号设定:最重要的是设定 root ( 超级管理员 ) 的密码啰! • H. 设定 X-Window 与开机片:如果有安装 X-Window 相关的软件,那么 X-Window 就需要设定并 且测试一下! 大概就是这样子吧!好了,底下我们就真的要来安装啰! 1. 选择开机次序并开机: 因为目前几乎所有的 Linux Distributions 都是支持光盘开机的, 而我们的主机板也几乎都是支持光盘 开机。只是,您必须要确定系统的第一个开机搜寻装置为光驱就是了。 我们可以在 BIOS 里面设定开机的 次序,看看能不能以光驱开机! 设定方式为: 1. 按电源键开机; 2. 在进入系统之前会出现 Del 字样(每个厂牌不太相同),此时按下键盘上的 Delete 键; 3. 进入 BIOS 之后以方向键选择 『BIOS Features Setup』这一项,或者是 『Advanced BIOS Features』,不管如何,反正只要看到 『BIOS Features』字样的那一项就对了!; 4. 将方向键移动至 『Boot Sequence』 或者是 『First Boot Device』; 这一项,按键盘上的『Page Up』 或 『Page Down』 按键,选择『CD-ROM』 为第一开机顺位即可。这里注意一下,如果你的 机器并不支持 CD-ROM 开机的话,你一定找不到 CD-ROM 这一项。这就比较麻烦,因为目前有些 Linux distributions 仅支持光盘开机的说~所以,您就得要找比较早期的版本或者其它方式来 安装了。 5. 按键盘上 『ESC』 键退出; 6. 将方向键移动至 『Save and Exit』 这一项按 『Enter』 及 『Y』 确认后重新开机即可! 在进行完上面的步骤之后,请将第一片 Fedora Core IV 可开机光盘放入光驱中,按下电源,给他开机去! Tips: 其实,目前除了一般的光盘片之外,很多版本的 Linux 也提供可开机 DVD 片了! 所以,如果您嫌 4 片装的 FC4 太麻烦,那么可以到义守 大学下载 DVD 版本的 FC4 喔! http://ftp.isu.edu.tw/pub/Linux/Fedora/linux/core/4/i386/iso/ 另外,那个 FC4-i386-rescuecd.iso 档案也可以下载!那个是救援光 盘~ 如果发生不可预期的错误时,利用这个光盘可以救回来您的 FC4 喔! 2. 选择安装模式: 在进行完上面的动作之后,理论上,您的主机已经以 FC4 可开机光盘开机成功了! 如果发生一些错误讯 息时,很可能是由于: 1)硬件不支持; 2)光驱会挑片; 3)光盘片有问题; 如果是这样,那么建议您, 再仔细的确认一下您的硬件是否有超频?或者其它不正常的现象。 而,您的光盘来源也需要再次的确认! (如果是书上附赠的光盘, 却发现无法开机成功,先确定一下您的光驱是否会挑片?换一台光驱试看看。 如 果还是无法开机,可以寄回您的书商,请他们帮忙您换一组光盘呢!这是您的权利喔!) 一般 Linux 都会支持至少两种安装以上的安装模式,分别是文字(text)与图形(graphic)接口。 正常的话, 以光盘开机后,会出现如下图示。 图 4 、选择安装模式 如果想要以图形接口来安装,可以直接按下 按键,如果想要以文字接口来安装, 可以在箭头指 的地方输入『 linux text 』来让安装程序以文字接口安装。 不过,要注意的是,如果在 10 秒左右您没 有在 boot: 后(箭头处)输入任何按键的话, 那么安装程序就会以预设的模式来安装,预设是以图形接口 来安装的喔!我们这里也使用图形接口来介绍。 其实,两个接口都很像啦!只是图形接口还可以使用中文 就是了! ^_^ 在按下 Enter 之后,安装程序就会开始去侦测硬件,并且将信息列在屏幕上给您参考, 如下图所示。由 于鸟哥为了捉图的需要,所以使用 VMWare 之类的软件来仿真安装。 不过,就如同前面介绍的,不建议您 用这样的软件来安装喔!这里只是作个介绍而已。 图 5 的箭头处就指出一些 IRQ 的利用,以及安装程序 侦测到的硬件相关信息(例如 VMWare 仿真的硬盘!) 图 5 、进行硬件侦测过程 硬件侦测完之后,会出现一个是否检查光盘的画面,如下图所示。 注意,如果要检查光盘的话,会花去很 多时间的!所以,如果确定光盘来源没有问题, 请选择『 Skip 』选项即可! 图 6 、是否检查光盘?请选择 skip 喔! 略过光盘检验工作后,因为我们使用的是图形接口的安装模式,所以安装程序就会去侦测: 屏幕、键盘、 鼠标等等相关的硬件啰!如下图所示啊! 图 7 、安装程序侦测到的屏幕、显示卡与鼠标等信息 3. 选择安装程序的语系与键盘配置: 在完成了一些硬件方面的侦测之后,顺利的话,就可以进入图形接口的安装了! 安装的画面如下图所示。 基本上,分为左右两个区块,左边主要是作为『说明』之用, 右边才是真正的操作区块!如果您搞不懂这 个安装画面是干嘛用的,可以参考左边区块的说明。 至于右下角则是下一步或者回到上一步的按钮喔!给 他按下一步吧 图 8 、FC4 的欢迎画面 之后就是选择语系啦!因为安装程序可以使用很多不同的语言来呈现。 我们可以选择中文来进行安装喔! 如下图所示,先选择『繁体中文』按『下一步』即可! 图 9 、语系的选择 嘿嘿!此时竟然是以中文来显示我们所需要的画面了!啊!真是太高兴了! ^_^ 接下来,则要选择『键盘 的配置』。因为每个地区的键盘上面的字母配置都不一样, 我们使用的是英文的键盘配置,所以,选择『美 式英文』就可以了!如下图所示。 图 10 、键盘配置的选择 4. 安装的系统类型与磁盘分割: 什么是『安装的系统类型』呢?基本上, FC 4 已经帮您规划好一些主机利用的方式了。 举例来说,如果 您想要使用桌上型计算机的功能,那么可以选择下图的『个人计算机』项目, 他会主动的帮您进行好磁盘 分割以及相关的套件选择啊!不过,缺点是, 可能您的硬盘 partition 就交给系统主动去判断处理,在 学习上,会比较不好, 而且,系统的预设分割与套件的选择,也不见得就会跟您想象的一样! 因此,这 里强烈的建议您,务必选择『自订安装』喔! 图 11 、预设的安装系统类型 好了,接下来自然就是要进行磁盘的分割动作了!这是我们在安装与规划的部分一直强调的地方呢!^_^ 此 时,请选择『使用 Disk Druid 』工具来自行进行磁盘分割呢!这可是很重要的喔! 图 12 、磁盘分割的模式(自动/手动) 如果是一颗全新的硬盘,可能会发生如下的错误讯息,这个讯息仅是告知您, 安装程序找不到 partition table 而已,还不需要太担心啦!此时, 直接按下『是』就可以了! 图 13 、确定是否删除 partition table 接下来的画面则是在操作磁盘分割的主要画面了!这个画面主要分为三大区块, 最上方为硬盘的分割示意 图,目前因为我的硬盘并未分割,所以呈现的就是一整块而且为 Free 的字样。 中间则是指令区,下方则 是每个分割槽(partitions)的启始磁柱、结束磁柱、所占容量大小, 以及相关的档案系统与挂载点了。关 于挂载点我们会在后面几个章节加以介绍, 这里您只要知道我们要将磁盘分割槽挂载到 /home 以及 / 还 有 swap 即可。 至于指令区,总共有六大区块,其中 RAID 与 LVM 是硬盘特殊的应用, 我们先略过不谈(在基础篇的最后 面硬件维护的章节,我们会来谈一谈 LVM)。 指令的作用如下: • 『新增』是增加新分割,亦即进行分割动作,以建立新的磁盘分割槽; • 『编辑』则是编辑已经存在的磁盘分割槽,您可以在实际状态显示区点选想要修改的分割槽, 然 后再点选『编辑』即可进行该分割槽的编辑动作。 • 『删除』则是删除一个磁盘分割槽,同样的,您得要再实际状态显示区点选想要删除的分割槽喔! • 『重设』则是恢复最原始的磁盘分割状态! 需要注意的是,您的系统与鸟哥的系统当然不可能完全一样,所以,您的屏幕上的硬盘信息, 应该不会与 鸟哥的相同的喔!所以看到不同,不要太紧张啊,那是正常的! 图 14 、磁盘分割的主画面 好了!准备来进行分割的动作吧!按下『新增』之后,会出现如下图的窗口~ 我们得选择挂载点,我首先 规划出来的是根目录 / 的分割槽,所以先点选如下图最上方箭头指的地方, 然后选择 / 即可; 图 15 、选择根目录的磁盘分割 接下来,因为我仅有一颗硬盘,所以在『可使用磁盘驱动器』就没有办法选择,一定是固定的那一颗啦! 而 我想要的磁盘档案系统类型就选择标准的 ext3 即可!再来则是选择分割的状态了。首先,我要规划出 6GB 左右,因此,在『大小』那个地方填入 6000 (大约是 6000M = 6G)。 然后我想要固定大小,因此选择『固 定分割区大小』且选择『强制成为主要分割区』,这个就是 primary 的 partition 啦!最后按下确定。(注 意,如果您想要将系统的所有套件安装 这里至少需要填入 10000 ,亦即 10GB 的空间才足够喔!) 图 16 、选择根目录的磁盘分割 之后会回到主画面,就如下图所示,在『示意图』方面就已经有一个大区块出现了! 在实际状态区,则有 /dev/hda1 出现了!很简单吧!好了,继续来进行虚拟内存 swap 的分割吧! 图 17 、已经分割出 / 的画面 同样的按下『新增』然后就会出现同样的画面,此时,我们直接在『档案系统类型』的地方, 选择『swap』 这个类型即可!这个 Swap 有什么功能呢?简单的说,他可以被看做为 『虚拟内存』啰,那么虚拟内存是 什么? 您可以这样想象,当你的物理内存只有 64 MB 的时候,但是你的系统负荷突然之间太大了, 例如 突然之间有数十个人连上你的 Web 服务器时,那么你的物理内存将不足以负荷这些计算的数据! 怎么办? 这个时候我们可以使用硬盘来仿真内存的数据存取,这个就是所谓的『虚拟内存』啰! 不过,虚拟内存的 速度会比较慢呦! 当有数据被存放在物理内存里面,但是这些数据又不是常被 CPU 所取用时, 那么这些不常被使用的程序 将会被丢到虚拟内存当中, 而将速度较快的物理内存空间释放出来给真正需要的程序使用! 这就是虚拟 内存 的功效之一啦!通常 Swap 建议的值大约是『RAM 的两倍大』, 但是这个因地制宜啦!像鸟哥的 Proxy 主机本身的内存就达到 1GB 了, 那么是否还需要虚拟内存呢?见仁见智啰! 图 18 、新增加 swap 磁盘分割 然后,我们要将 swap 规划为 512 MB ,所以,如下图所示,直接填入 512 ,并且同样的强制为主分割, 以及固定分割区的大小,按下确定即可! 图 19 、新增加 swap 磁盘分割 再次回到主画面!呵呵!看到了吗?又多了一个 partition 出现啦!这次是 /dev/hda2 呢! 图 20 、含有 / 与 swap 的主画面 继续来新增 /home 这个分割槽吧!如下图所示,我们给予 /home 大约 1GB 的磁盘空间吧! 同样也是选 择标准的 ext3 档案系统! 图 21 、规划 /home 的磁盘分割槽 回到主画面后,这就是我们最终的分割结果了!注意到,我们还有一部份的剩余空间没有使用到喔! 那个 没有被使用到的空间,可以做为我们未来的磁盘练习啦!别将他规划了! ^_^ 另外,您也可以自行测试一 下以不同的方式来分割您的磁盘,举例来说,您也可以这样分割: • Swap 约 100 MB; • /var 给 3~5 GB; • /usr 给 3~5 GB; • / 给 1 GB 以上; • /home 可以给大一些; • /backup 用来做为备份的扇区 无论如何,我们这个练习机的分割最终结果如下图: 图 22 、分割完成的最后结果 5. 选择开机管理程序: 分割完硬盘之后,接下来就来选择开机管理程序啦!在 Linux 里面主要有 Lilo 与 grub 这两套开机管理 程序,不过,目前 Lilo 已经比较少使用,取而代之的就是 grub 这个好用的管理程序啰! 所以,我们可 以看到如下的画面:比较值得注意的是,开机管理程序可以被安装在 MBR 也可以安装在每个 partition 最 前面的 super block 处(这个我们会在后面继续说明!看不懂先有印象即可!)。 在下图当中,我们安装 在 /dev/hda 内,这就是『MBR』的安装点,如果是类似『/dev/hda1』这个就是 super block 的安装处啦! 在下图中,显示了我们目前仅有一个开机选单,那就是 『Fedora Core』 这个选项而已。 我们可以透过 『新增』、『编辑』与『删除』来管理开机时,要显示的项目。 举例来说,如果您有安装 Windows 在这 个系统当中,那么此时,您就可以按下『新增』, 将 Windows 可开机扇区加到这个画面当中来喔!至于 最底下的『密码』与『进阶设定』, 我们在后续相关的章节谈到时,再深入来研究啊! 图 23 、安装 grub 开机管理程序 上图中,如果按下『新增』就会出现如下所示的图样,此时,您可以选择所需要的 partition, 以及开机 时选单内的名称(标签),按下确定即可。如果没有额外的开机区, 就略过这个步骤吧! 图 24 、安装 grub 开机管理程序 6. 网络与防火墙设定: 再来,如果您的网络卡可以被系统捉到的话,那么您就可以设定网络参数了! 例如下图所示的模样!目前 各大版本几乎都会预设网络卡 IP 的取得方式为『自动取得 IP』, 也就是所谓的『DHCP』网络协议啦! 不过,由于这个协议需要有 DHCP 主机的辅助, 开机的过程中可能会等待一段时间。因此,您可以改成手 动设定。不过,无论如何, 都要与您的网络环境相同才是。 如果您不懂网络如何设定,没有关系,我们会在服务器篇好好的深入介绍的,在这里,还没有需要了解他! 您可以照着鸟哥的设定值设定就好了!未来了解了网络架构,再回来这里进行修订的工作即可! 图 25 、安装程序预设的网络参数设定值 说过啦!不要用 DHCP 啊!利用手动设定即可!你也可以设定开机就驱动网络卡喔! 如下图的箭头指的地 方。至于 IP 嘛!嘿嘿!就跟鸟哥的一样就好了!别担心! 图 26 、设定网络卡 IP 上图中给他按下确定之后,就会出现如下的图示啦!您必须要替自己的 Linux 主机取的名称。 一般来说, 我们都不建议取的名称太大众化!因为,可能会造成未来设定主机的一些困扰。 所以,这里鸟哥以自己的 名字取一个主机名称呢!您也可以依样画葫芦喔! 另外,那个网关器与 DNS 的设定嘛!就跟鸟哥设定的 一样就好了!不知道原理没关系! 以后我们再来设定好! 图 27 、设定主机名称与 Gateway, DNS 设定好网络之后,再来则是跟网络有相当大关系的防火墙啦!因为我们是练习用的主机,这里就先不要使 用防火墙。 另外,那个 SELinux 的设定值得特别留意! SELinux 是 Security Enhanced Linux 的简写, 这个套件是由 National Security Agency (NAS, http://www.nsa.gov/selinux/) 所发展的,他主要的功 能可以代管整个 Linux 系统的存取控制(access control), 可藉以避免一些可能造成我们 Linux 操作系 统安全问题(Security)的软件的破坏, 虽然 SELinux 会有比较好的系统防护能力,不过,如果不熟悉他, 那么启动了 SELinux 之后,嘿嘿! 您未来的服务可能会因为这个较为严密的安全机制,而导致无法提供 联机的问题,或者无法进行数据存取的问题, 所以,暂时也将他关闭吧! ^_^ 图 28 、防火墙的设定 因为我们停用防火墙,安装程序很好心的会提示我们:『你没有启用防火墙喔!』,嘿嘿! 没关系!继续 吧!因为我们在服务器篇里面会提到自己设定的防火墙功能啊! 图 29 、无防火墙的警告讯息 7. 选择时区与设定 root 密码: 因为全世界被细分为 24 个时区,所以,得要告知系统我们的时区在哪里才行啊! 如下图所示,您可以选 择台北,或直接用鼠标在地图上面点选也可以! 要特别注意的是那个 『UTC』,他与所谓的『日光节约时 间』有关。 不过,我们不需要选择这个,不然的话,还可能造成时区被影响,导致系统显示的时间会与本 地时间不同。 Tips: 事实上, UTC 与所谓的 GMT 时间是一样的!就是格林威治时间, 那是标准的地球时间啦! 以格林威治(英国)所在地为 GMT 0 点, 而将地球切为 24 个时区,我们台湾在 GMT 的东方, 时间比较早, 所以台湾本地时间为 GMT+8 小时。 图 30 、时区的选择 再来则是最重要的『系统管理员的密码』设定啦! 在 Linux 底下,系统管理员的预设名称为 root ,请 注意,这个密码很重要! 虽然我们是练习用的主机,不过,还是请您养成良好的习惯,最好 root 的密码 可以设定的严格一点。 可以设定至少 8 个字符以上,而且含有特殊符号更好,例如:I&my_dog 之类,有 点怪, 对您又挺好记的密码! 图 31 、系统管理员密码的设定 图 32 、系统开始读取套件数据 8. 套件的选择: 在进行完套件的读取之后,接下来,则是选择您要的套件啦! 咦!我怎么知道我要什么套件?哈哈!您当 然不可能会知道~知道的话.....就不会来这儿查阅数据了 @_@ 没有啦!开开玩笑....呼~好冷~~ 基本上,鸟哥不建议您使用安装程序预设的套件来安装!因为,会缺乏很多需要的套件的! 如果您的硬盘 够大,建议您,像下图一样,选择『全部安装』,一劳永逸!不必怕什么咚咚没有装。 当然啦,这是针对 练习机来进行的安装。 如果您已经具有基本的套件管理知识,那么鸟哥会建议您选择『最小值』来安装, 不过,要有心理准备, 就是很多数据您都得在安装成功后,再自行由光盘中的档案来安装! 但是,优点是,会占用比较少的空间, 而且系统会比较干净。 那有没有折衷的方法啊?有的,假设您不需要 X Window ,但却需要一些有的没有的工具的话, 那么您可 以选择底下这些相关的套件啊! • 编辑器 • 文字接口的因特网 • 编写与出版 • 服务器设定工具 • 开发工具(这个最重要!一定要选择!) • 兼容旧式软件开发 • 语言支持 • 管理工具 • 系统工具 • 打印支持 这样的套件大约需要 1833 MB 的硬盘空间。而如果您想要使用 X Window 的话,那么最上方的 『X 窗口 系统』与 『KDE 桌面环境』也可以将他选择的啦!仔细注意到下图的最下方, 有个『总安装大小: xxxxxM』 吧?!那就是您选择的套件总共会占用多少硬盘空间啦! 选择看看吧! 图 33 、套件的选择 检查过相依属性的问题后,会出现一个说明窗口,里面说的是, 等一下就会主动的将所有选择的套件安装 妥当,而且,所有安装的信息都会被纪录在 /root/install.log 及 /root/anaconda-ks.cfg 这两个档案 中呢! 图 34 、安装前的说明 由于您所选择的套件分别在这几张光盘当中,所以会出现这个窗口,告知您, 必须要有这四片光盘才可以 安装妥当喔! 图 35 、确定您所拥有的光盘 呵呵!开始安装啰!在安装的这个画面中,会显示还需要多少时间, 每个套件的名称,以及该套件的简易 说明呢! 图 36 、安装过程的画面 一片一片的将光盘拿出来~放进去~花费的时间可不少呢! 图 37 、光盘更换警示 等到所有的安装光盘都安装之后,一切就都 OK 了!最后出现这个画面, 请将光驱的片子拿出来,准备按 下『重新开机』去开机吧! 图 38 、光盘更换警示 在重新开机时,会出现如下的画面,这是正常的!别担心!系统就要重新开机啰! 接着请看下一章相关的 开机与关机内容啊! 图 39 、光盘更换警示 9. 其它注意事项: 在安装完毕之后,有些地方还是需要提醒您的: • 你可能会觉得很奇怪,为什么你的安装过程会跟我的不一样?! 呵呵!因为每个人选择的套件都 不尽相同,因此, 如果你在安装的过程中选择了跟我不一样的套件,不用担心,安装过程会有些 许的不相同是正常的! • 在安装完成之后,请千万记得『取出光盘片』,不然又会在进入一次安装画面喔! • 同时建议,安装完成之后,请进入您的 BIOS 当中,将开机的顺序改回来『 C、A 』或『 C only 』 反正就是让硬盘开机啦!这样比较安全一些! 好了!这样应该就已经安装完毕了!请继续往下看看吧!而且,相当的建议您,在正式的进行架站之前, 请 依序看一下底下的网页,最好不要跳着看,不然的话,嘿嘿嘿嘿!出现什么问题可不要怪我!因为,照着 顺序看会对你的 Linux 认识比较有帮助啦! 附带额外提醒一点,由一些 bug reports 的数据显示, FC4 预设的 X Window 对于 Intel 以及一些 G550 的显示卡在支持度上可能有问题,这是因为编译的过程里面下达的参数不佳所致。完整的 bug reports 可 以参考: https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=161242 简单的来说,就是 Intel 的显示卡与 G550 的显示卡硬件在 FC4 的编译过程中, 可能无法对这两种显示 卡做比较好的处理,导致 tty1 ~ tty7 都没有东西跑出来。 那怎么解决呢?如果您是初次接触 Linux 的 话,那么请先参考 Linux 档案与目录管理 章节当中的 cp 这个复制指令的介绍,然后将 FC3 的这个档案 /usr/X11R6/lib/modules/libvgahw.a 复制到 FC4 底下的相同档案去, 经过重新开机后,应该可以克服 这个问题。该档案可以在底下取得: ftp://people.redhat.com/mharris/libvgahw.a 在这里或许您还看不懂上面写些什么,没关系,这很正常,等到下一章后, 您就晓得这个地方在讲啥了~ 所以,如果您在下一章的文字、图形接口变换时发生问题, 记得来这里看看呦! 多重开机安装流程与技巧 很多的朋友,包括我自己,由于工作的需要,常常需要两部不同的操作系统来处理日常生活与工作的杂事! 那么我是否需要两部计算机呢?并不需要,只要一部计算机使用多重开机的方式来进行安装,嘿嘿!这样 就 OK 啊!理论上是如此,不过实际上还需要一些小技巧呢! 不过,就如同鸟哥之前提过的,多重开机系统是有很多风险存在的,而且您也不能随时变动这个多重操作 系统的开机扇区, 这对于初学者想要『很猛烈的』玩 Linux 有点妨碍~所以,鸟哥不是很建议新手使用 多重开机啦! 所以,底下仅是提出一个大概,您可以看一看,未来我们谈到后面的章节时, 您自然就会 有『豁然开朗』的笑容出现了! ^_^ • 硬盘重新规划的多重开机系统: 如果你想要在你的 Linux 机器上同时安装 Windows ?可行吗?当然可行啰! 况且目前很多的朋友手边只 有一部计算机,但是又想要同时学习一下 Linux ,呵呵!那么安装多重操作系统实在是必须要的!好了! 那要如何安装呢?以鸟哥前一阵子帮一个朋友规划的 Win98, Win2000, Linux 为例,我先将硬盘以 spfdisk 切割成两个 FAT partition,分别是 2GB 与 3GB ,预计安装 Win98 与 Win2000 (分别是 C: 与 D: ),然后再以 CD 开机后,分割最后的磁盘成为 / 与 Swap 两个!好了!如何安装: 1. 先以 Spfdisk 分割硬盘: 由于 Windows 的 Fdisk 实在太慢了,我蛮喜欢使用 spfdisk 这个全中文的磁盘分割接口的!简 单又方便!将硬盘切割成 C: 2GB, D: 3GB即可!详细的 Spfdisk 执行范例可以到网络上搜寻一 下教学文章吧! 例如:http://linux.vbird.org/linux_basic/0140spfdisk.php 2. 先安装 Win98 : 这个简单吧!用 98 开机片开机之后,直接安装,并且选择安装在 C 槽即可! 3. 再安装 Win2000: 进入 Win98 之后,将 Win2000 的光盘片放进光驱中,屏幕会自动的跑出一个窗口, 问你要不要 升级,选择『是』,然后会进行一些小动作!在安装程序问到 『升级安装或全新安装』的时候, 请千万选择『全新安装』这个项目, 并且不要升级硬盘扇区!然后在出现一个『问你安装目录所 在』的问题时, 进入选项里面,选择『要我自己挑选硬盘分割区』那个项目!然后接下来一直按 下 『确定』或『是』即可!之后,计算机会重新开机,开机完成之后会进入 Win2000 的安装画 面,然后在出现『安装扇区』的时候,请选择 D 槽, 并且选择『不要更改扇区档案系统』即可! 接下来就会完成一些程序啦! 4. 最后才安装 Linux distribution : 是的,最后才安装 Linux !安装的过程就如同上面提的, 只不过在硬盘分割的地方会比较不一 样就是了!! 5. 以 Lilo 或 grub 设定多重开机: 是的,您必须选用 lilo 或 grub 来将您的开机程序设定一下, 这个动作我们会在后头再谈,或 者您可以在了解 vi 之后,直接翻到多重开机章节去瞧一瞧去! • 在既存的 Windows 系统中加装 Linux 系统: 另外再提供一个之前也曾经安装过的一个经验!恩!你可能会觉得奇怪, 这个方法跟上一个方法有什么不 同!?呵呵呵呵!最大的不同在于: 我既存的 Windows 系统中的数据不想丢掉, 并且我也没有新的硬盘来暂存我的系统或者是备份数据!假 设原本我的 20 GB 硬盘中分割成 10GB, 10GB 两槽,但是我还想要安装 Linux , 且是在『旧系统仍然可 以存活』的情况下!那该如何是好?! 这真的是很有趣的问题!早先在 Windows 系统中, 鸟哥就犯了一个错!C 槽给的太大了!基本上,系统 文件不需要太大啦!通常我都喜欢 C 槽只给大约 4 GB 左右的空间(甚至更小),这是因为 C 槽是很需 要备份的!如果太大的话, 备份很麻烦!所以系统重置就会很花时间(因为所有的东西都要重新安装!我 哩咧....!)!因此,我都习惯将 C 槽只给一点点的空间,然后再安装完并设定完所有的系统之后,马上 以 Ghost 来备份我的系统!而所有的备份数据文件都摆放在 D 槽!此外,我的 OutLook Express 的书信 目录也都不是摆在 C 槽!呵呵所以我不会很害怕 C 槽挂掉,因为,直接以 Ghost 还原即可啰!系统还原 还不需要 30 分钟呢! 这里就发生一个问题啦,假如原本的系统是 10GB, 10GB 的两槽,不过全部的有用到的资料量只有 10GB 不 到!也就是还有空间来安装 Linux ,但是由于硬盘切割的不好,所以伤脑筋!此外, 我的原系统希望留 下来,而且也希望可以安装 Linux ,要怎办?!鸟哥曾经这样做过: • 由于 FAT 的扇区使用,其实只是在磁头区域(所谓的硬盘第零轨)规划而已, 所以,我就将我 的数据先以『磁盘重组』的方式将数据都归结在一起; • 然后以 Spfdisk 将该硬盘的 FAT 表进行分割,注意喔!只是分割 FAT 表,并没有 format 喔! 不过这里的技术性很高,需要特别注意!因为你是将 FAT 表重新划分,所以你的数据必须要在同 一个扇区内!好了,我就将原本的 10GB 10GB 切割成 4GB、10GB 与 6GB 三槽!而且在 spfdisk 的帮助之下, 顺利的在没有任何数据遗失的状况下,将我的硬盘由原先的两槽分割成三槽啰!那 么一来, 我就可以在我原本的 D 槽里面安装 Linux 啦!方法有点像底下的图示: 图 40 、磁盘空间重新分配的示意图(resize) 很神奇吧!数据还是在原来的地方,不过扇区的定位点改变了,还多出一个扇区! 不过,这里要提醒大家, 虽然鸟哥曾经以这个方法成功的将硬盘数据在不毁损的情况下, 顺利的将硬盘切割完毕,不过,这个方法 本身还是具有相当程度的风险,呵呵! 因此不是很建议您这样做!尤其是当你的数据还很重要的时候!切 记切记! • 在既存的 Linux 系统安装新的 Linux 系统: 那我能否在 Linux 系统上面安装另一套 Linux 呢?举例来说,在已经安装了 SuSE 的 Linux 上面加装 Fedora 4 呢?当然可以啊!不过,同样的,您依然有着 partition 分割的问题。 如果要将原本的 partion 在 Linux 里面放大或缩小时,您必须要了解整个档案系统的概念, 这点要参考后续章节的磁盘与档案系 统的相关知识, 然后再利用基础篇最后几章的硬件维护与管理里面谈到的 resize2fs 等指令,就可以达 到啰~不过,同样的,也是很危险喔! 没有三两三,不要上梁山!对吧~先不要急着玩这么进阶的玩意儿 啊! ^_^ 关于大硬盘导致无法开机的问题 有些朋友可能在第一次安装完 Linux 后,却发现无法开机的问题, 也就是说,确实可以使用上面鸟哥介 绍的方法来安装 FC4 ,但是,就是无法顺利开机, 只要重新开机,就会出现类似底下的画面: # 前面是一些奇怪的提示字符啊! grub> _ 然后等待你输入一些数据~如果不幸你发生了这样的问题,那么可能的主要原因就是...... • 你的主机板 BIOS 太旧,导致捉不到您的新硬盘; • 你的硬盘容量太大了 (例如超过 120 GB 以上),但是主机板并不支持~ 如果真的是这样,那就麻烦了~你可能可以这样做: • 前往您主机板的官方网站,下载最新的 BIOS 档案,并且更新 BIOS 吧! • 将您的硬盘的 cylinders, heads, sectors 抄下来,进入 BIOS 内,将硬盘的型号以使用者设定 的方式手动设定好~ 当然还有一个最简单的解决方法,那就是: 重新安装 Linux ,并且在 partition 的地方,建立一个 100MB 左右的 partition ,将他挂载 到 /boot 这个挂载点。并且要注意, /boot 的那个挂载点,必须要在整个硬盘的最前面!例如, 必须是 /dev/hda1 才行! 至于会产生这个问题的原因确实是与 BIOS 支持的硬盘容量有关, 处理方法虽然比较麻烦,不过,也只能 这样做了。更多与硬盘及开机有关的问题, 鸟哥会在 开机与关机程序 再进一步说明的啦! 本章习题练习 ( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 ) • Linux 的目录配置以『树状目录』来配置,至于磁盘分割区 ( partition ) 则需要与树状目录相 配合!请问,在预设的情况下,在安装的时候系统会要求你一定要分割出来的两个 Partition 为 何? 就是根目录『/』与虚拟内存『Swap』 • 什么是 IDE 界面,一般而言,普通 PC 允许几个 IDE 界面与装置? IDE 为用来传输硬盘数据的一个汇流界面;共有 IDE1, IDE2 ,分别有 master 与 slave 所以共 四个 IDE 装置支持! • IDE2 的 master 之第一个 logical 磁盘中,其装置代号(文件名称)为何? /dev/hdc5 • 在硬盘分割 (Partition)时,最多有几个 primary + extended ? Primary + Extended 共四个,其中 Extended 只有一个! 更详细的硬盘与 MBR 可以参考 http://phorum.vbird.org/viewtopic.php?t=182 • 若在分割的时候,在 IDE1 的 slave 硬盘中,分割『六个有用』的扇区(具有 filesystem 的), 此外,有两个 primary 的扇区!请问六个扇区的代号? /dev/hdb1(primary) /dev/hdb2(primary) /dev/hdb3(extended) /dev/hda5(logical 底下皆为 logical) /dev/hda6 /dev/hda7 /dev/hda8 请注意,5-8 这四个 logical 相加的总和为 3! • 一般而言,在 RAM 为 64MB 或 128 MB 的系统中, swap 要开多大? Swap 可以简单的想成是虚拟内存,通常他的建议大小为 RAM 的两倍, 但是实际上还是得视您的 主机规格配备与用途而定。约两倍的 RAM ,亦即为 128 MB 或 256 MB ,可获得较佳效能! • 什么是 GMT 时间?台北时间差几个钟头? GMT 时间指的是格林威治时间,为标准的时间,而台北时间较 GMT 快了 8 小时! • Tap, SCSI 硬盘, RAID, printer 的装置代号? Tape: /dev/ht0 (IDE), /dev/st0 (SCSI); SCSI H.D. : /dev/sd[a-p]; RAID : /dev/md[0-15]; printer: /dev/lp[0-2] • 如果我的磁盘分割时,设定了四个 Primary 扇区,但是磁盘还有空间,请问我还能不能使用这些 空间? 不行!因为最多只有四个 Primary 的磁盘分割槽,没有多的可以进行分割了!且由于没有 Extended ,所以自然不能再使用 Logical 分割说 • 通常在安装 Linux 的时候,最重要的就是磁盘分割了!请问:磁盘分割通常要分成几个步骤? 1. 进行磁盘分割 partition ; 2. 进行格式化 format ; • 磁盘分割之后会有所谓的 Primary, Extended 与 Logical 的磁盘分割槽,请问何者为可使用的 Partition ? 只有 Primary 与 Logical 为可用, Extended 为不可直接使用的 Partition , 还需要再次的 分割成为 Logical 之后,才可以继续使用!而最大可分割出来的 Partition 应该有 63 个才对! • 硬盘最小的物理储存量(sector)大小通常为多少? 目前个人计算机的 SATA/IDE 接口硬盘 sector 的单位为 512 bytes。 • 硬盘的第零轨含有 MBR 及 partition table,请问,partition 的最小单位为(磁柱、磁头、磁道) 为 Cylinder (磁柱),所以 partition 的大小为磁柱大小的倍数。 安装 Mandrake 9.0 与多重开机技巧 Linux 安装的第一步『规划』 硬盘分割之配置 Linux 安装前准备 一个 Linux 安装实例 多重开机安装流程与技巧 课后练习 最近更新日期:2003/02/05 Linux 安装的第一步『规划』 由第二章的内容我们大致上可以了解:『Linux 主机的配备要求与 Linux 主机所提供的服务有关』,所以 啰,要安装 Linux 的第一步就是先进行 Linux 主机的未来蓝图规划啦!那么该如何规划?由第二章的内 容,我们不难了解,要规划好一个 Linux 主机的话,需要: 1. 决定 Linux 主机的角色定位; 2. 根据步骤一,选择适当的硬件配备; 3. 根据步骤一,决定实体硬盘的分割状态; 4. 根据主机上面的操作系统,选择适当的开机加载程序 ( boot loader ) ,以便安装在主要开机扇 区中 ( Master Boot Recorder, MBR ); 5. 根据步骤一,选择所需要的 Linux 程序套件; 好了,既然已经知道大概需要规划的原理之后,底下我们就实地的来操练一遍吧!好让您不会很快的忘掉 去! 假设:我是我们宿舍的代表,由于同住的校外宿舍同学需要上网缴交作业,但是该宿舍只有一条 电话线,因此希望以 ADSL 来做为网络联机的方式。也就是说,我们宿舍里面要安装一部 Linux 主 机来做为频宽分享的机器,同时,这部 Linux 主机预计也要做为我们宿舍里面 20 个人的邮件主 机,与网页空间服务器,请问我该如何规划我的 Linux 主机呢? 1. Linux 主机的角色定位: 由上面的说明,可以知道 Linux 主机的服务主要有 NAT ( Network Address Transfer ) 这个频宽分享的机制、邮件服务与 Web 空间提供等等,此外,为了以后方便系统升级与 安装其它套件,因此需要安装一些工具软件,例如 gcc 这个编译器与 kernel-header 或 kernel-source 等等套件。 2. 硬件的配备选择: 由于服务的对象并不多,加上主机的服务当中,需要 CPU 运算的地方较少,不过呢,由 于我需要提供每个人的磁盘使用空间,并且还要提供使用者的邮件空间,所以硬盘方面 可能需要大一点容量才行。所以我的硬件配备可以是: ƒ 主机板与 CPU :CPU 只要比 P-166 好即可,而主机板需要与 CPU 形式配合。 此外,选择淘汰的计算机配备来安装就很好了; ƒ 内存:使用 64 MB 以上的 RAM ,如果未来网页空间的流量太大时,可能需要 提升内存到 256 MB 以上,所以需要预留内存插槽; ƒ 硬盘:硬盘至少需要 3.2 GB 以上的 IDE 硬盘; ƒ 网络卡:网络卡预计使用螃蟹卡; ƒ 显示卡:由于这部机器本身是做为主机之用,所以不需要 X-Window ,因此显 示卡使用的是 S3 Virge 的 PCI 显示卡; ƒ 安装过程中需要的装置:键盘、屏幕、光驱、软盘机等等,这些装置在安装完 成 Linux 之后,即可马上拔掉! 3. 关于硬盘分割的分配: 由于我们的 Linux 主机要用做网页空间与邮件主机,所以如果为了安全起见,最好将放 置网页的目录与放置邮件的目录安置在不同的扇区中,因此总共规划为四个扇区,分别 为: ƒ/ ƒ /var/spool/mail ƒ /home ƒ swap 特别注意到,硬盘分割的分配与你的主机规划相关性最高了,在下一节当中,我们会更 仔细的介绍硬盘分割的基本原理与步骤!而至于各个目录与扇区的相对应关系,我们将 在磁盘档案系统进行说明,请莫着急呦 ^_^ ! 4. 选择 MBR 当中的开机管理程序: 在 Linux 里面预设使用两种开机管理程序,分别是 LILO 与 GRUB 这两个好东西,其中, LILO 算是比较早期的开机管理程序,不过, VBird 个人倒是还蛮喜欢 LILO 的,毕竟 他虽然比较死板,但是还蛮好用的,磁盘代号设定上面与 Linux 上的磁盘代号相同,所 以没有什么太大的困扰。而较新的 GRUB 其实是很棒的一套开机管理程序,我个人认为, 他最大的功能也最具魅力的地方是具有『动态搜寻核心档案』的功能,他可以让您在开 机的时候,可以自行编辑您的开机设定系统档案,呵呵!所以即使您不小心设定错了 grub ,没关系!开机的时候自行编辑一下就好啦!这方面的技巧,我们会在开机流程与 Loader 的时候再来详细的介绍,还是慢慢的从头学习起来呦! 5. 选择所需套件: 由于将光盘上面的全部套件都安装,是有点浪费硬盘空间,当然如果您是要练习 Linux 的话,那么还是完整的都给他安装下去的好。由于我们需要 Web 与邮件,所以需要特别 加选这两个套件来安装,此外,由于预设的安装项目并不包含 gcc, kernel-headers 等 对于自行编译程序者而言相当重要的套件,所以我们也要额外加选这些项目! 到了这一步之后,嘿嘿!规划就已经差不多了,所以,这个时候,基本上已经可以开始来安装 Linux 啦!但是,还是有个困扰耶,那就是,在第三步骤的时候,我要怎么在安装的时候分割我的硬盘 呀!?第二章里面有提过硬盘的排线与硬盘在 Linux 里面的磁盘代号有关,那么该如何分割?另 外,有什么自订的方式可以来帮我分割硬盘吗?呵呵!底下我们就来提一提如何 硬盘分割之配置 硬盘分割与配置的好坏,会影响到未来您的主机的使用情况,此外,好一点的分割方式,会让您的数据保 有一定的安全性!怎么说呢?这么想好了,如果你的 Windows 硬盘里面,仅有 C 槽的话,那么当 Windows 需要重新安装的时候,你又想要重新格式化 ( format ) 时,而 C 槽里面很不巧的,已经放了很多重要的 档案数据,这个时候怎么办?光是搬这些重要数据到其它空间就受不了!所以,比较聪明的玩家,都喜欢 分割成两槽以上,将系统档案与数据文件分开,可以达到比较好的管理效果! 所以啰,正常使用情况下的 Linux 主机,通常会依照目录与主机的特性,来分割硬盘,以达到比较好的管 理成效。不过,由于 Linux 的硬盘分割比较具有弹性,同时, Linux 硬盘分割程序 fdisk 功能很强悍, 此外,要分割的好,必须要了解一下基础的硬盘架构,所以,底下我们先来介绍一下硬盘的基本架构,然 后再来介绍如何分割吧! • 硬盘连接排线与硬盘代号: 通常在 586 之后生产的主机板上面都有两条接排线的界面 ( 排线就是用来连接硬盘与 主机板的那一个东西啦! ),而我们称这种界面为 IDE 界面,这也是目前的主流硬盘界 面,为了区隔硬盘读取的先后顺序,所以主机板上面的这两个界面就分别被称为 Primary ( 主要的 ) 与 Secondary ( 次要的 ) IDE 接口啰,或者被称为 IDE1 ( Primary ) 与 IDE2 ( Secondary )。而如果你有仔细观察的话,那么每一条排线上面还有两个插孔, 也就是说一条排线可以接两个 IDE 界面的装置 ( 硬盘或光驱 ),而你有两条排线,因 此一个主机板在预设的情况中,应该都可以接四个 IDE 界面的装置。好了,那么每条排 线上面该如何判别哪一个是主硬盘 ( Master ),哪一个是副硬盘 ( Slave ) 呢?这个 时候就需要调整硬盘上面的跳针 ( jump ) 才可以知道!请察看一下您的硬盘机吧!上 面应该都会有图示说明才对。 好了,所以如果我有一个光驱了,那么我最多就只能再安装三部 IDE 接口的硬盘在我的 主机上面。OK!那么由于我的硬盘与 Linux 的磁盘代号有关,那么我怎么知道这个硬盘 的代号呢?没问题啦,由 IDE 1 ( Primary IDE ) 的 Master 硬盘先计算,最后是 IDE 2 的 slave 硬盘,所以各个磁盘的代号是: IDE\Jumper IDE1(Primary) IDE2(Secondary) Master /dev/hda /dev/hdc Slave /dev/hdb /dev/hdd 假如我只有一颗硬盘,而且这一颗硬盘接在 IDE 2 的 Master 上面,那么他在 Linux 里 面的代号就是 /dev/hdc 啰!OK!好像没问题了呦!呵呵!才不是呢,问题很大呦!因 为,如果我这个磁盘被分割成两槽,那么每一槽在 Linux 里面的代号又是如何?注意! 基本上,在 Linux 底下我们不是用 槽 为单位,而是以 partition ( 磁盘分割区块 ) 来说明!所以啰,如何知道每个 partition 的代号呢? • 认识硬盘: 基本上,硬盘是由最小的组成单位 扇区 ( sector ) 所组成的,而数个扇区组成一个磁 柱 ( cylinder ) ,最后构成整个硬盘的容量大小。关于硬盘的管理我们在后续章节再 来介绍,这里我们比较想要知道的是,如何分割硬盘,所以先简单的将硬盘变成如下的 图标: 在上面的图示中,我们可以很清楚的知道,在硬盘里面有分为两个区域,一个是放置这 个硬盘的信息区,我们称为 Master Boot Recorder, MBR ( 主要开机扇区 ),一个则是 实际档案数据放置的地方。MBR 可以说是整个硬盘最重要的地方了,因为在 MBR 里面记 录了两个重要的东西,分别是:开机管理程序,与磁盘分割表 ( partition table )。 因此,只要 MBR 物理实体坏掉了,那么这颗硬盘就差不多要报废了!因为,如果系统找 不到 partition table ,就无法使用这块硬盘,所以数据即使没有丢掉,但是没有 MBR , 呵呵,还是不能使用的啦! 首先来看一看什么是 partition table 呢?简单的说,我们说的『硬盘分割』就是在修 改这个 partition table 而已!他基本上定义了『第 n 个磁盘区块是由第 x 磁柱到第 y 个磁柱』,所以,每次当系统要去读取 n 磁盘区块时,就只会去读取第 x 到 y 个扇 区之间的数据!呵呵!这样知道了吗?很简单吧!下次记得人家在谈磁盘分割的时候, 不要以为系统真的会在硬盘上面用力、努力的划标签!实际上,他最大的功能就是修改 MBR 里面的 partition table 啦!不过,由于这个 MBR 区块的容量有限,所以,当初 设计的时候,就只有设计成 4 个分割纪录,这些分割记录就被称为 Primary ( 主分割 ) 及 Extended ( 延伸分割 ) ,也就是说,一颗硬盘最多可以有 4 个 Primary + Extended 的扇区,其中, Extended 只能有一个,因此,你如果要分割成四块磁盘分割的话,那 么最多就是可以: P+P+P+P P+P+P+E 的情况来分割了。其中需要特别留意的是,如果上面的情况中, 3P +E 只有三个『可用』 的磁盘,如果要四个都『可用』,就得分割成 4P 了!( 因为 Extended 不能直接被使 用,还需要分割成 Logical 才行,底下我们会继续说明的!)。那么为什么要有 Extended 呢?这是因为如果我们要将硬盘分割成 5 的磁块的话,那么怎么办?这个时候就需要 Extended 的帮忙了,本身 Extended 是不能在任何系统上面被使用的,还需要再额外的 将 Extended 分割成 Logical ( 逻辑 ) 分割才能被使用,所以啰,藉由这个 Extended 的帮忙,我们就可以分割超过 5 个可以利用的 partition 啰!不过,在实际的分割时, 还是容易出现问题的,底下我们来思考看看: o 思考一:如果我要将我的大硬盘『暂时』分割成四个 partition ,同时,还有 其它的空间可以让我在未来的时候进行规划,那么该如何分割? 说明: 由刚刚的说明,我们可以知道, Primary + Extended 最多只能有四 个 partition,而如果要超过 5 个 partition 的话,那么就需要 Extended 的帮忙。因此,在这个例子中,我们『千万不能分割成四个 Primary 』为什么呢?假如您是一个 20 GB 的硬盘,而 4 个 primary 共用去了 15 GB ,您心想还有 5 GB 可以利用对吧?错!剩下的 5 GB 『完全不能使用』,这是因为已经没有多余的 partition table 纪录 区可以记录了,因此也就无法进行额外的分割,当然啰,空间也就被 浪费掉了!因此,请千万注意,如果您要分割超过 4 槽以上时,请记 得一定要有 Extended 分割区,而且必须将所有剩下的空间都分配给 Extended ,然后再以 logical 的分割区来规划 Extended 的空间。 o 思考二:我可不可以仅分割 1 个 Primary 与 1 个 Extended 呢? 说明: 当然可以!基本上, Logical 可以有 64 个,因此,你可以仅分割一 个主分割,并且将所有其它的分割都给 Extended ,利用 Logical 分 割来进行其它的 partition 规划即可! o 思考三:假如我的硬盘安装在 IDE 1 的 Master ,并且我想要分割成 6 个可 以使用的硬盘扇区,那么每个磁盘在 Linux 底下的代号为何? 说明: 由于硬盘在 Primary + Extended 最多可以有四个,因此,在 Linux 底下,已经将 partition table 1 ~ 4 先留下来了,如果只用了 2 个 P + E 的话,那么将会空出两个 partition number 呦!再详细的说 明一下,假设我将四个 P + E 都用完了,那么硬盘的实际分割会如同 下图所示: 实际可以使用的是 /dev/hda1, /dev/hda2, /dev/hda3, /dev/hda5, /dev/hda6, /dev/hda7 这六个 partition!至于 /dev/hda4 这个 Extended 扇区本身仅是用来规划出让 Logical 可以利用的磁盘空间 而已! 那么万一我只想要分割 1 个 Primary 与 1 个 Extended 呢?这个 时候你的磁盘分割会变成如下所示: 注意到了吗?因为 1~4 号已经被预留下来了,所以第一个 Logical 的代号由 5 号开始计算起来,而后面在被规划的,就以累加的方式增 加磁盘代号啰!而其中 /dev/hda3, /dev/hda4 则是空的,被保留下 来的代号。 • Linux 底下的硬盘分割模式选择注意事项: 实际上,在 Linux 安装的时候,已经提供了相当多的预设模式让您选择分割的方式了, 不过,无论如何,分割的行为都不是很能符合自己主机的样子!因为毕竟每个人的『想 法』都不太一样!因此,强烈建议使用『自订安装, Custom 』这个安装模式!在某些 Linux distribution 中,会将这个模式写的很厉害,叫做是『 Expert, 专家模式 』,这个就 厉害了,请相信您自己,了解上面就自称为 专家了吧!没有问题! o 自订安装『Custom』: ƒ A:初次接触 Linux :只要切割『 / 』及『 Swap 』即可! 好了,通常初次安装 Linux 系统的朋友们,我们都会建议他直接以一 个最大的扇区『 / 』来安装,这样有个好处,就是不怕分割错误造成 无法安装的困境!例如 /usr/ 是 Linux 的可执行程序及相关的文件 摆放的目录,所以他的容量需求蛮大的,万一你分割了一块扇区给 /usr ,但是却给的不够大,那么就伤脑筋了!因为会造成无法将数据 完全写入的问题,就有可能会无法安装啦!因此上,如果你是初次安 装的话,那么可以仅分割成两个扇区『 / 与 Swap 』即可! ƒ B:建议分割的方法:预留一个备份的扇区! 就如同前面几个心得分享文章中提到的,由于 Linux 预设的目录是固 定的,所以,通常我们会将 /var 及 /home 这两个目录稍微加大一些, 如果硬盘够大的话,加个几 GB 也不为过!另外, /usr 至少给他 3~5 GB 吧,如果硬盘真的大的话!而 / 也可以给个几 GB 的空间。最后, 由于我们的 Linux 可能是在『试用』阶段,所以很有可能会重复的一 再安装,因此上, VBird 都会预留一个扇区来备份我的核心啦与实作 过程中觉得不错的 scripts ( 就有点像 DOS 的批次檔 ) ,当然,我 的 /home 底下的咚咚也可以有备份的地方,而安装套件的源文件也可 以摆在这里!有个最大的好处是,当我的 Linux 重新安装的时候,我 的一些套件马上就可以直接在硬盘当中找到!呵呵!重新安装比较便 利啦! o 选择 Linux 安装程序提供的的硬盘分割方式: 对于首次接触 Linux 的朋友们,通常不建议使用各个 distribution 所提供预 设的 Server 安装方式,因为会让你无法得知 Linux 在搞什么鬼,而且也不见 得可以符合你的需求!注意:选择 Server 的时候,请『确定』您的硬盘数据 是不要的!因为 Linux 会自动的把你的硬盘里面旧有的数据全部杀掉!此外, 硬盘至少需要 2 GB 以上才可以选择这一个模式! 硬盘方面的规划大致上就是如此啦!要规划硬盘的时候,请特别的小心呦! Linux 安装前准备 Linux 安装之前要准备什么呢?就是刚刚前面已经讲过的几个咚咚啦!归纳一下: 1. Linux 主机规划单:就是刚刚我们规划好的那个单据啰! 2. Linux distribution :利用一些映象站台下载各版本的 Linux ,或者直接以本书提供的三块 CD 装的 Mandrake 进行安装啰! 3. 主机硬件信息收集:根据主机规划单的内容,去收集一下你的硬件信息吧!其中特别重要的是, 先检查一下是否可以使用光盘开机呢?如果 BIOS 不能支持光盘开机的话,那么就需要先行安装 可开机软盘。 4. 网络硬件联机:这部份本书先不谈,否则内容就太多了,阿!再写下去鸟哥会疯掉……所以请大 家先上网查阅一下网络的硬件联机吧! 5. 网络信息:包括你的 IP, netmask, gateway, dns IP 、是否为拨接等等,都需要先知道呦! 然后,其实各个套件的安装步骤都差不多,大概都是: • A. 选择安装模式:主要分为图形接口安装与文字接口安装;如果是图形接口安装的话,还可以选 择语系,这个时候我们就有中文可以使用啦! • B. 搜寻硬件信息:然后安装程序会去搜寻一下系统的硬设备,以利后续的处理,有的安装程序会 在这个地方让您加入一些参数,以驱动不明的装置设备; • C. 设定键盘、鼠标模式:这个可是很重要的项目呀! • D. 硬盘分割设定:就是刚刚提到的几个注意事项; • E. 套件选择:这是很重要的部分呢!请特别留意! • F. 网络与安全性设定:连上 Internet 的模式与驱动网络卡的方式等设定; • G. 超级管理员与一般身份使用者账号设定:最重要的是设定 root ( 超级管理员 ) 的密码啰! • H. 设定 X-Window 与开机片:如果有安装 X-Window 相关的软件,那么 X-Window 就需要设定并 且测试一下,另外,制作开机片永远是最正确的选择! 大概就是这样子吧!好了,底下我们就真的要来安装啰! 一个 Linux 安装实例 好咯,我要开始安装我的 Linux 啦!那么先说明一下我的基本规划: • Linux 主机定位: 关于这部 Linux 主机,主要是用来做为练习与比较各不同版本 Linux 之间的差异用的,所以定 位在练习上面,预计并不提供任何的网络服务; • 硬件要求: 因为定位在练习上面,所以以手边有的机器来做为练习就是了,且由于是手边的工作机,所以必 须要安装多重开机系统。 o CPU 使用 P-III 933 的 CPU ,这个是我的工作机啦,实际上不需要这么高档的货色; o 内存使用 128 MB ,是 PC 133 的规格; o 硬盘使用手边有的一颗 30 GB 硬盘,预计未来要在上面安装 3 ~ 4 个 Linux 系统,所 以在这次的安装中,预计规划 /, /home, swap 三个磁盘区块而已; o 网络卡使用最常见的螃蟹卡; o 显示卡则是前一阵子的主流,但是目前已经落伍了的 Geforce 2 MX ; o 其它软盘机、光驱、鼠标、键盘等等的配备,则是一般的个人计算机之配备 • 磁盘分割: 如同刚刚提到的,由于是定位在练习上面,所以仅分割出 /, /home, swap 三个磁盘区块,各别 占约: o/ /dev/hda1 :4 GB o /home /dev/hda3 :1 GB o Swap /dev/hda2 :200 MB o 其它则为尚未规划空间 • 由于需要多重开机,所以选择开机管理程序为 grub 这个程序,并且安装在 MBR 里头; • 套件选择:由于是定位在练习上面,并且不提供任何的网络服务,所以一些零碎的套件将不安装, 并且 X-Window 仅安装个人较为喜好的 KDE 套件; 好啦!真的要来安装了!请依照下面的步骤来进行吧! 1. 选择开机次序并开机: 我们可以在 BIOS 里面设定开机的次序,看看能不能以 光驱 开机!现今的主机板大多已经支持 这项功能了,而我们的 Mandrake 9.0 光盘片本身就是可以开机的,所以设定成光盘开机最好啰! 设定方式为: o 按电源键开机; o 在进入系统之前会出现 Del 字样(每个厂牌不太相同),此时按下键盘上的 Delete 键; o 进入 BIOS 之后以方向键选择 『BIOS Features Setup』这一项,或者是 『Advanced BIOS Features』,不管如何,反正只要看到 『BIOS Features』字样的那一项就对了!; o 将方向键移动至 『Boot Sequence』 或者是 『First Boot Device』; 这一项,按键 盘上的『Page Up』 或 『Page Down』 按键,选择『CD-ROM』 为第一开机顺位即可。 这里注意一下,如果你的机器并不支持 CD-ROM 开机的话,你一定找不到 CD-ROM 这一 项,这时请制作开机片吧,并将此项调整为『A』为第一顺位; o 按键盘上 『ESC』 键退出; o 将方向键移动至 『Save and Exit』 这一项按 『Enter』 及 『Y』 确认后重新开机即 可! 如果是必须以软盘开机的话,那么需要的动作就变成了: o 随便找一台 Windows 计算机,启动档案总管,进入光驱的档案数据夹,假如您的光驱在 E 槽,那么请进入 E:\dosutils 这个目录,请注意,每个人的光驱所在磁盘代号都不一 样,请依您的计算机来操作; o 在该目录当中,点选 rawrite 这个应用程序,然后在出现的 MS-DOS 画面之中依序输入 下列:( 注:那个磁盘代号是光驱,请依您的计算机实际配置来决定! ) Enter disk image source file name: e:\images\cdrom.img Enter target diskette drive: a: Please insert a formatted diskette into drive A: and press -ENTER- : o 请注意,请将软盘放入您的软盘机当中呦! 无论如何,在进行完上面的步骤之后,请将第一片 Mandrake 可开机光盘放入光驱中,如果使用 软盘的朋友,请将可开机软盘放入软盘机,否则拿出软盘,按下电源,给他开机去! 2. 选择安装模式: 一般 Linux 支持两种安装模式,分别是图形接口与文字接口。正常的话,在开机之后,会到底下 的这个画面,在这里可以直接按下 Enter 来进入图形安装接口,或者在 boot: 后面输入 text 来 以文字接口安装。由于 Mandrake 的安装程序做的蛮好的,所以通常可以顺利的进入图形安装程 序当中。如果必须以文字接口来安装的话,那么也没有关系,因为全部的步骤都跟图形接口下一 模一样,所以您可以对照着这个网页的步骤来试看看。 3. 选择安装程序的语系: 在 boot: 之后,会跑一些安装程序所需要的数据,然后就是进入这个语系选择的画面。由于我们 比较看的懂中文呀!所以,在进入图形接口之后,请移动鼠标并且选择上面的项目,选择完毕之 后,请按下 OK 按钮即可; 4. 是否接受授权码规定: 授权码一定要选择接受才可以继续呦!所以就接受吧!同时请注意到,在这个安装程序的画面中, 主要分为三个区域: o 执行流程步骤区:这个区域是在左边的流程列,您会发现到上面的画面中,那个『选择 语系』左边的按钮列颜色不一样!对啦,那表示『已经或正在安装的步骤』咯!而在下 方的颜色则是表示尚待进行中的流程。好了,那么假设您已经进行到了第五个流程,亦 即是『选择键盘形式』那个流程时,却想要回到前一个流程,亦即是『设定鼠标』时, 可以将鼠标移动到『设定鼠标』左边的按钮,按下他,嘿!就回到设定鼠标的画面啦! o 此步骤的提示内容:在上头画面的右下方,就是此一步骤的提示协助文字区( Help ), 您可以到该画面的右边滚动条处移动,以了解完整的信息; o 该步骤的选择项目:就是占了画面最大面积的那个框框当中啦!里面是关于该步骤安装 时,需要您来设定的选择项目,请仔细的进行选择吧! 此外,在某些流程步骤当中,会另外有跳出式窗口来提供您选择或设定,这就是基本的安装程序 画面啰。 5. 选择预设或自订安装: 目前的 distribution 通常还蛮好心的,会询问您是否要『安装』还是在『既有的 Linux 上面升 级』,另外,也可以不升级核心,仅升级可以升级的套件!由于我们是第一次安装,且想要以自 己最想要的方式来安装,所以当然就如同上面一般,选择『自订』及按下『安装』即可! 6. 硬盘侦测: 由于您的系统上面可能会有 SCSI 接口的硬盘,果真有的话,由于 Linux 会再以额外的程序去侦 测并驱动 SCSI 接口的硬盘,所以这里才需要选择『是的』,如果您跟 VBird 一样是个苦命的人, 那么这里直接给他『否』吧!当然,有兴趣的话,可以去『检视硬件信息』看看你的硬件配备是 否被正常的驱动了呢? 7. 设定鼠标: 选择属于您正确的鼠标类型,这里设定错的话,有些 distribution 可是不许您进入 X-Window 的 呦!鼠标比较有关系的是他的连接到主机的类型啦!如果是圆头的,那就称为是『PS2 接口』的 鼠标,如果是有九个孔的,就称为『串行端口』鼠标,如果是扁头的,那就是『USB』鼠标啦!我 们这里选择标准就好了! 8. 设定键盘: 通常我们直接选择美式键盘即可! 9. 安全性设定: 共分为四种等级,分别为『标准』、『高』、『较高』、『严密』等四个,通常我们选择『标准』 就可以了!对于安全性而言,这样的设定可能并不足够,需要再进一步的设定,关于安全性的设 定文章,请参考相关书籍。不过,我们这里的定义是练习用主机,所以选择『标准』即可。 10. 设定档案系统及硬盘分割: 接着下来是最重要的硬盘分割方式!如上图所示,我们会看到硬盘的整体信息,由于我们的硬盘 尚未规划,所以在 hda 的部分为白色的模样!此外,在底下有几个重要的按钮,分别的功能是: o 全部清除:将原有的硬盘分割全部删除成未分割的样子; o 自动分配:以系统磁盘分割方式进行磁盘分割; o 更多:更多的详细资料; o 精灵:叫出提示精灵; o 复原:恢复成尚未进行分割前的样子; o 切换到一般模式:换成较为简易的设定画面; o 完成:完成磁盘分割,并将 partition table 写入 MBR 内。 o A. 建立根目录分割: 在按一下 hda 那个空白的区域之后,在选择动作栏内会出现『新建』字样,按下『新建』 会出现底下的图样: 在这个跳出式的窗口之中,我们要选择的是开始的扇区与大小,刚刚我们的设定是需要 根目录约 4 GB 左右,这里『开始的扇区』使用默认值即可,鼠标移到『大小』右边的 那个滚动条上面,请注意,由于每个磁盘的大小不同,所以一个磁柱的大小也都不一样, 因此,你的屏幕前面看到的内容可能与我的不一样,请特别留意! 设定完了磁盘的大小之后,再来是要选择磁盘的档案格式,Linux 预设的档案格式是 Ext2 ,但是更新的 Ext3 档案格式中,提供了更多的日志式记录功能,所以目前也可以 使用 Ext3 这一个档案格式呦!同时,我们选择了『 / 』根目录做为挂载点以及『Primary』 做为设定值,所以,最后得到的结果为: 再按下『确定』之后,就会显示出目前这个扇区的属性啦!如下图所示: 在上面的图标中,将鼠标移动到空白的区域之内,按一下鼠标左键,就又会出现『新建』 的字样,此时,再继续新建的工作!好啦,我们来新建一下 Swap 这个虚拟内存吧! o B. 建立虚拟内存 Swap : 与新建的功能相当,不过,需要选择的则是『档案系统格式』内容,需要选择为『 Linux swap 』的格式,则底下『挂载点』会自动被取消掉! 这个 Swap 有什么功能呢?简单的说,他可以被看做为『虚拟内存』啰,那么虚拟内存 是什么?您可以这样想象,当你的物理内存只有 64 MB 的时候,但是你的系统负荷突然 之间太大了,例如突然之间有数十个人连上你的 Web 服务器时,那么你的物理内存将不 足以负荷这些计算的数据!怎么办?这个时候我们可以使用硬盘来仿真内存的数据存取, 这个就是所谓的『虚拟内存』啰!不过,虚拟内存的速度会比较慢呦! 当有数据被存放在物理内存里面,但是这些数据又不是常被 CPU 所取用时,那么这些不 常被使用的程序将会被丢到虚拟内存当中,而将速度较快的物理内存空间释放出来给真 正需要的程序使用!这就是虚拟内存 的功效啦!通常 Swap 建议的值大约是『RAM 的两 倍大』,但是这个因地制宜啦!像我的 Proxy 主机本身的内存就达到 1GB 了,那么是 否还需要虚拟内存呢?见仁见智啰! o C. 新增其它挂载扇区: 好啦!再来以同样的方法建立其它的磁盘分割,同样的方式建立起 /home 这一个磁盘分 割吧!请注意,上面三个我都使用 Primary 进行分割的呦!最后的数据就成为: o D. 使用预设分割行为分割: 安装程序也提供了三种主要的预设分割方式来给使用者,当我按下『全部清除』并且再 按下『自动分配』之后,会出现上面的窗口,其中,他们的分割方式分别为: ƒ with /usr: / : 1GB Swap : 2 * RAM /usr : 3.9 GB /home :其它剩余的空间都直接给 /home ƒ simple: / : 5.3 GB Swap : 2 * RAM /home :其它剩余的空间 ƒ server: / : 256 MB Swap : 3 * RAM /usr : 3.9 GB /tmp : 500 MB /var 与 /home 平均分配其它的硬盘空间。 o 同样的,我们这里不建议使用安装程序提供的方式来分割啦! o E. 写入磁盘分割表: 最后,就给他输入『完成』,并且在出现的窗口中,将硬盘分割表写入,这样就完成了 我们的硬盘分割啰!哇!好累呦! o F. 选择刚刚分割完成的磁盘分割表: 使用刚刚完成的那个分割表,所以选择第二项即可按下确定! o G. 设定挂载点: 再次的设定挂载点,对应好刚刚的分割表!嘿嘿!这样就完成了最麻烦的工作之一了! o H. 硬盘分割的建议: 这里必须要给 Linux 新鲜人一些硬盘分割上面的建议: ƒ 甲、 初次使用 Linux : Swap 约 100 MB 其它的都给 / ; ƒ 乙、 进阶使用者: Swap 约 100 MB; /var 给 3?5 GB; /usr 给 3?5 GB; / 给 1 GB 以上; /home 可以给大一些; /backup 用来做为备份的扇区 11. 硬盘格式化: 接着下来,硬盘分割完毕之后,就是格式化硬盘啦!没错,所以这里选择一下你要格式化的磁盘, 当然,如果该磁盘早就存在,那么不格式化也没有关系! ^_^….. 12. 选取程序套件: 接着下来自然就是选择套件啰!而要选择套件之前, Mandrake 会先检查是否有这些安装套件的 原始码存在,所以会先显示是否有上面这些光盘片存在?如果您使用的是书上附的光盘片,那么 就会出现上面的内容咯!请勾选他吧! o A. 选择所需要的套件: 接下来我们要来选择的就是所需要安装的套件啦!刚刚已经提过了,我们需要的是 KDE 与相关的 X-Window 套件,另外,也需要几乎所有的练习用的资料,所以可以选择如上 面所示的套件项目,可以在上图的左下角发现选择的套件容量为 1727 MB ! 上表中,最需要注意的是『Console 工具』、『程序开发平台』及『文件档案』这几个 东西,如果我们未来在进行一些程序编译的时候,或者是自己在网络上面下载软件来安 装的时候,常常会使用到这三个项目内的数据,如果没有选择的话,会死翘翘! 底下提供五个建议来给大家做为套件选择上面的考虑: ƒ 预设给桌上型计算机用的:这是默认值共需 969 MB 的空间,缺点是没有 compiler ,以后不能以原始码安装软件。 办公室软件平台 Internet 平台 KDE 环境 Gnome 环境 o ƒ 全部都安装:全部安装需要大约 2193 MB 的空间,特别建议新手以这个方式来 安装您的第一套 Linux ,以降低学习的困难呢! ƒ 小硬盘的选择:没有 X-Window, 并且未来也不能自行安装软件,不过就是可以 节省硬盘空间,占了大约 430 MB 的容量。 客户端网络环境 组态设定 Console 工具 文件档案 ƒ 只有文字接口的服务器用主机:特别适合用来进行架站的选择套件方式,没有 X-Window 呦,而且仅占容量为 958 MB,是鸟哥最喜欢的安装方式了! Internet 平台 客户端网络环境 组态设定 Console 工具 程序开发平台(特别重要,一定要选择) 文件档案 防火墙、路由器 ƒ 加上 X-Window 的服务器用主机:这个比上一个多了 X-window 就是了,共享 了 1727 MB,也是我们上面的图示的内容!建议第二次玩 Linux 的朋友,并且 还是想要使用 X-Window 的朋友安装! o B. 危险套件的警告标语: 当你选择了一些套件,但是这些套件在 Linux 上面可能不是这么安全,所以 Mandrake 特别提出告示警语,呵呵!没关系,我们早就知道会有这些咚咚,所以不用理他吧! o C. 开始正式安装啰: 努力的给他安装中……喝杯茶,看个电视去? 不过,在安装的过程中,会要求您换片, 依序换上第二片 CD ,以及第三片名为 Internal CD 的,安装完毕之后,就可以进入到 下一个画面了! 13. 设定 root 密码: 这个也是相当重要的呦!那就是系统管理员的密码啦!由于我们预设使用 Linux 本身的密码机制, 所以选择 本机密码 数据,至于其它的密码格式,则请参考个别的网络书籍吧! 对于密码的设定,如果您的机器可能会上网,那么不论是否为 Server ,最好将 root 的密码设 定的严格一点,例如至少 8 个字符以上,而且含有特殊符号,例如: I&my_dog 之类的怪怪密码! 不但不容易被猜测,自己还蛮容易记忆的为主! 14. 预设使用者登入系统: 如果您的系统预计是要给许多人来使用的,那么这个『开机预设使用者身份登入』的功能最好是 取消,对您而言会比较有保障! 15. 新增使用者: 您可以在这个动作里面设定你的一般身份使用者的账号与密码,也可以在未来进行账号与密码的 设定,这里我们先设定一个名为 test 的使用者,并且帮他设定一下密码,设定完成之后,先按 下『接受使用者』,再按下『完成』,就可以进入到下一步骤啰!至于其它的使用者设定,我们 将在后面的章节再介绍。 16. 设定网络: 很多朋友对于设定网络的问题都很困扰耶!这真是伤脑筋了!不过没有关系,我们底下以一般性 的用法来设定你的网络卡,如果你不知道如何设定你的网络卡,那么就直接以底下的例子来设定 吧! o A. 选择自动侦测网络卡与联机模式: 选择自动侦测网络卡之后,如果能够见到上面的图示您应该要觉得『哇!好高兴!』因 为看到这个画面表示你的网络卡已经被 Linux 捉到了!这还不够高兴呀!应该要很爽的 哩!好了,接着下来设定其它的东西吧!按下确定; o B. 网络适配卡信息选择: 注意一下上面显示的是否为你的网络配备,没有问题的话,那么就给他按下『否』之后, 选择确定吧! o C. 设定网络卡地址 IP: 网络卡地址(IP)选择最简单的私有 IP 来设定即可!如果不知道如何设定,那么就设定 上面的样子就好了! o D. 设定主机名称与 DNS 相关: 在实际的网络世界中,每一部主机都有他『独一无二的名字』,那就是这里设定的主机 名称啦!不过,因为我们没有对外公布我们的主机名称,所以这里随便你设定没有关系 啦!相关的主机名称讯息,请参考 DNS ( Domain name server ) 的相关文章。至于 DNS 服务器与通讯闸,那个 DNS 服务器可以直接填中华电信的, 168.95.1.1 大家都能使用, 没有问题,再来的那个通讯闸就不见得每个人都一样了!如果你还是不知道你的网络状 况,那么还是先跟我一样的填法吧未来可以自行修改呢! o E. 使用代理服务器: 如果不知道你的代理服务器是什么,就不要设定吧!没有关系的啦! 17. 设定总结: 好啦!看看有没有设定错误啦!没有的话就给他『确定』下去吧! 18. 设定系统服务: 在预设的状态之下,系统就会启动一些服务来自我调整使用环境,这些包含了登录档案的纪录、 例行命令的执行与内存管理等等,这个部分我们会在后面的章节继续说明,所以也可以直接给他 『确定』下去吧! 19. 设定开机管理程序: 我们以较新的 Grub 开机管理程序来管理我们的 Linux 主机吧!同时,将他安装在开机扇区的 MBR 里面,作业延迟表示『选单会停留 10 秒钟』来让我们决定是否要以该核心进入 Linux 系统! 20. 建立软盘开机片: 无论任何时刻,建立可以开机的救援磁盘都是一件正确的选择!因为您无法肯定什么时候会来个 全台大停电,您总不希望努力了这么久的安装好了的系统被破坏吧! ^_^”” 21. 设定 X-Window : 如果您有安装关于 X-Window 这个窗口接口的软件,例如 KDE, Gnome 等等的咚咚时,那么就会 出现这个设定 X 环境的选项啰!『设定窗口接口是个很麻烦的程序,而且一定会不成功』,这是 因为 Mandrake 的安装程序在设定 X-Window System 的部分有点小问题!所以,『请不要测试 X-Window 』!然而,无论如何,如果设定不成功,仍然可以在装完成之后再进行重新设定,所以 这一步即使设定错误了,也别难过,我们在『系统管理员篇』的时候,会再详细的介绍 X-Window 的设定方法! 同时也请特别留意, X-Window 在 Linux 里面『仅是一套软件』,而且他还是相当有趣的一套软 件,怎么说呢? X-Window 又分为两部份,第一部份称为 X Server ,这个 X Server 负责 Linux 主机硬件的管理,例如显示卡、鼠标、键盘、屏幕分辨率等等,都是他在管,而这个 X Server 即 是鼎鼎大名的『 XFree86 』是也,而负责整个桌面的显示的管理者,就称为 Window Manager ( 窗 口管理员 ) 软件啰,目前最让大家熟知的就是 KDE 与 GNOME 这两套窗口管理系统啦!那么也就 是说,只要您的 XFree86 死掉的话,那么 KDE 也好, GNOME 也好,就肯定也是死掉的,而我们 通常说的在『设定 X-Window 』通常就是设定那个 XFree86 啰,包括屏幕的分辨率、更新频率等 等的! o A. 设定分辨率: 分辨率的设定就如同上面所示,一般使用者计算机的分辨率设定大都是『 800x600 更新 频率 60-80 』,但是鸟哥特别喜欢字小小的,桌面大大的,所以我会选择 1024 x 768 那 个分辨率呢! o B. 选择显示卡芯片组: 刚刚提过,我的显示卡为 Geforce 2 mx ,所以选择这一个就对啦!『看!』之前不是 跟您说过最好先了解一下自己的硬件吗?嘿嘿!就是这些地方用的到啦! o C. 选择 X Server 版本: 目前 XFree86 分为两个版本,较新的是 4.x.x 版,旧版的为 3.3.x 版,由于 4.x.x 支 持度比较高,当然选择 4.2.1 那个版本啰! o D. 调整色彩度: 调整一下您的未来的桌面吧!这里我选择我最喜欢的大小,您亦可选择您喜欢的色彩呦! o E. 测试设定值: 记住喔!由于 Mandrake 的安装程序问题,这个测试的功能『一定会失败!』,所以请 不要测试喔!但是,如果不小心测试下去了,屏幕变成黑压压的一片时,怎么办?!别 担心,这个时候给他按下: [Ctrl] + [Alt] + [F1] 就会回到刚刚的画面了!无论如何,如果测试成功的话,那么就会进入到下一个画面。 o F. 选择是否以 X-Window 做为预设的开机登入系统: 就像之前就一直在说的,不需要直接进入 X-Window 啦!反正在文字接口之下,仍然可 以轻松的就进入 X-Window 的说!所以这里我是选择『否』呦! o G. 再次确认 X Server 设定值: 如果没有问题的话,就给他『是的』下去吧! o H. 制作救援磁盘: 我也不是很清楚为什么这里还要再制作一次救援磁盘?无论如何,小心驶得万年船,所 以还是再拿另外一块磁盘来制作一次吧!这样 X-Window 就设定完成啰! 22. 套件修补中心: 这可不是坐月子中心吶!因为发展出来的各个 Linux 套件都很有可能被一些网络闲人所破解,而 利用一些漏洞来影响或破坏别人家的主机,因此,必须要常常进行各种套件修补的动作!不过, 由于我们的网络还没有搞定,所以….这个步骤也就没有办法做啦!选择『否』吧!等到安装完毕, 并且连上 Internet 之后,再来修补漏洞! 23. 安装完成!恭喜发财! 不经一番寒彻骨,焉得梅花扑鼻香,呵呵!您已经经过了『一番寒彻骨』了,恭喜您即将进入『扑 鼻香』的境界!恭喜您,安装成功,请按下『确定』,然后取出光盘片,OK!等待登入吧! 24. 安装后的注意事项: o 你可能会觉得很奇怪,为什么你的安装过程会跟我的不一样?!呵呵!因为每个人选择 的套件都不尽相同,因此,如果你在安装的过程中选择了跟我不一样的套件,不用担心, 安装过程会有些许的不相同是正常的! o 在安装完成之后,请千万记得『取出光盘片』,不然又会在进入一次安装画面喔! o 同时建议,安装完成之后,请进入您的 BIOS 当中,将开机的顺序改回来『 C、A 』或 『 C only 』反正就是让硬盘开机啦!这样比较安全一些! o 如果真的没有办法在开机的时候加载 Linux 的核心,以进行安装时,不要太担心,直接 将 Mandrake 9.0 第一片可开机片放入 Windows 的系统当中,会出现下面图示: 再直接按下 Install Mandrake Linux! 即可安装啰! ^_^y 好了!这样应该就已经安装完毕了!请继续往下看看吧!而且,相当的建议您,在正式的进行架 站之前,请依序看一下底下的网页,最好不要跳着看,不然的话,嘿嘿嘿嘿!出现什么问题可不 要怪我!因为,照着顺序看会对你的 Linux 认识比较有帮助啦! 多重开机安装流程与技巧 很多的朋友,包括我自己,由于工作的需要,常常需要两部不同的操作系统来处理日常生活与工作的杂事! 那么我是否需要两部计算机呢?并不需要,只要一部计算机使用多重开机的方式来进行安装,嘿嘿!这样 就 OK 啊!理论上是如此,不过实际上还需要一些小技巧呢! • 硬盘重新规划的多重开机系统: 如果你想要在你的 Linux 机器上同时安装 Windows ?可行吗?当然可行啰!况且目前 很多的朋友手边只有一部计算机,但是又想要同时学习一下 Linux ,呵呵!那么安装多 重操作系统实在是必须要的!好了!那要如何安装呢?以我前一阵子帮一个朋友规划的 Win98, Win2000, Linux 为例,我先将硬盘以 spfdisk 切割成两个 FAT partition,分 别是 2GB 与 3GB ,预计安装 Win98 与 Win2000 (分别是 C: 与 D: ),然后再以 CD 开机后,分割最后的磁盘成为 / 与 Swap 两个!好了!如何安装: 1. 先以 Spfdisk 分割硬盘:由于 Windows 的 Fdisk 实在太慢了,我蛮喜欢使用 spfdisk 这个全中文的磁盘分割接口的!简单又方便!将硬盘切割成 C: 2GB, D: 3GB 即可!详细的 Spfdisk 执行范例可以到网络上搜寻一下教学文章吧! 2. 先安装 Win98 :这个简单吧!用 98 开机片开机之后,直接安装,并且选择安 装在 C 槽即可! 3. 再安装 Win2000:进入 Win98 之后,将 Win2000 的光盘片放进光驱中,屏幕 会自动的跑出一个窗口,问你要不要升级,选择『是』,然后会进行一些小动 作!在安装程序问到『升级安装或全新安装』的时候,请千万选择『全新安装』 这个项目,并且不要升级硬盘扇区!然后在出现一个『问你安装目录所在』的 问题时,进入选项里面,选择『要我自己挑选硬盘分割区』那个项目!然后接 下来一直按下『确定』或『是』即可!之后,计算机会重新开机,开机完成之 后会进入 Win2000 的安装画面,然后在出现『安装扇区』的时候,请选择 D 槽, 并且选择『不要更改扇区档案系统』即可!接下来就会完成一些程序啦! 4. 最后才安装 Linux distribution :是的,最后才安装 Linux !安装的过程就 如同上面提的,只不过在硬盘分割的地方会比较不一样就是了!! 5. 以 Lilo 或 grub 设定多重开机:是的,您必须选用 lilo 或 grub 来将您的 开机程序设定一下,这个动作我们会在后头再谈,或者您可以在了解 vi 之后, 直接翻到第十九章去瞧一瞧去! • 在既存的 Windows 系统中加装 Linux 系统: 另外再提供一个之前也曾经安装过的一个经验!恩!你可能会觉得奇怪,这个方法跟上 一个方法有什么不同!?呵呵呵呵!最大的不同在于: 我既存的 Windows 系统中的数据不想丢掉,并且我也没有新的硬盘来暂存我的系统或者 是备份数据!假设原本我的 20 GB 硬盘中分割成 10GB, 10GB 两槽,但是我还想要安装 Linux ,且是在『旧系统仍然可以存活』的情况下!那该如何是好?! 这真的是很有趣的问题!早先在 Windows 系统中, VBird 就犯了一个错!C 槽给的太 大了!基本上,系统文件不需要太大啦!通常我都喜欢 C 槽只给大约 4 GB 左右的空间 (甚至更小),这是因为 C 槽是很需要备份的!如果太大的话,备份很麻烦!所以系统 重置就会很花时间(因为所有的东西都要重新安装!我哩咧....!)!因此,我都习惯 将 C 槽只给一点点的空间,然后再安装完并设定完所有的系统之后,马上以 Ghost 来 备份我的系统!而所有的备份数据文件都摆放在 D 槽!此外,我的 OutLook Express 的 书信目录也都不是摆在 C 槽!呵呵所以我不会很害怕 C 槽挂掉,因为,直接以 Ghost 还 原即可啰!系统还原还不需要 30 分钟呢! 这里就发生一个问题啦,假如原本的系统是 10GB, 10GB 的两槽,不过全部的有用到的 资料量只有 10GB 不到!也就是还有空间来安装 Linux ,但是由于硬盘切割的不好,所 以伤脑筋!此外,我的原系统希望留下来,而且也希望可以安装 Linux ,要怎办?!我 曾经这样做过: o 由于 FAT 的扇区使用,其实只是在磁头区域(所谓的硬盘第零轨)规划而已, 所以,我就将我的数据先以『磁盘重组』的方式将数据都归结在一起; o 然后以 Spfdisk 将该硬盘的 FAT 表进行分割,注意喔!只是分割 FAT 表,并 没有 format 喔!不过这里的技术性很高,需要特别注意!因为你是将 FAT 表 重新划分,所以你的数据必须要在同一个扇区内!好了,我就将原本的 10GB 10GB 切割成 4GB、10GB 与 6GB 三槽!而且在 spfdisk 的帮助之下,顺利的 在没有任何数据遗失的状况下,将我的硬盘由原先的两槽分割成三槽啰!那么 一来,我就可以在我原本的 D 槽里面安装 Linux 啦!方法有点像底下的图示: 很神奇吧!数据还是在原来的地方,不过扇区的定位点改变了,还多出一个扇区!不过, 这里要提醒大家,虽然 VBird 曾经以这个方法成功的将硬盘数据在不毁损的情况下,顺 利的将硬盘切割完毕,不过,这个方法本身还是具有相当程度的风险,呵呵!因此不是 很建议您这样做!尤其是当你的数据还很重要的时候!切记切记! 课后练习( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 ) • Linux 的目录配置以『树状目录』来配置,至于磁盘分割区 ( partition ) 则需要与树状目录相 配合!请问,在预设的情况下,在安装的时候系统会要求你一定要分割出来的两个 Partition 为 何? 答: 就是根目录『/』与虚拟内存『Swap』 • 什么是 IDE 界面,一般而言,普通 PC 允许几个 IDE 界面与装置? 答: IDE 为用来传输硬盘数据的一个汇流界面; 共有 IDE1, IDE2 ,分别有 master 与 slave 所以共四个 IDE 装置支持! • IDE2 的 master 之第一个 logical 磁盘中,其装置代号(文件名称)为何? 答: /dev/hdc5 • 在硬盘分割 (Partition)时,最多有几个 primary + extended ? 答: Primary + Extended 共四个,其中 Extended 只有一个! ( 更详细的硬盘与 MBR 可以 参考 这里 这篇讨论 ) • 若在分割的时候,在 IDE1 的 slave 硬盘中,分割『六个有用』的扇区(具有 filesystem 的), 此外,有两个 primary 的扇区!请问六个扇区的代号? 答: /dev/hdb1(primary) /dev/hdb2(primary) /dev/hdb3(extended) /dev/hdb5(logical 底下皆为 logical) /dev/hdb6 /dev/hdb7 /dev/hdb8 请注意,5-8 这四个 logical 相加的总和为 3! • 一般而言,在 RAM 为 64MB 或 128 MB 的系统中, swap 要开多大? 答: Swap 可以简单的想成是虚拟内存,通常他的建议大小为 RAM 的两倍,但是实际上还是 得视您的主机规格配备与用途而定。约两倍的 RAM ,亦即为 128 MB 或 256 MB ,可获 得较佳效能! • 什么是 GMT 时间?台北时间差几个钟头? 答: GMT 时间指的是格林威治时间,为标准的时间,而台北时间较 GMT 快了 8 小时! • Tap, SCSI 硬盘, RAID, printer 的装置代号? 答: Tap : /dev/ht0 (IDE), /dev/st0 (SCSI); SCSI H.D.: /dev/sd[a-p], RAID : /dev/md[0-15]; printer : /dev/lp[0-2] • 如果我的磁盘分割时,设定了四个 Primary 扇区,但是磁盘还有空间,请问我还能不能使用这些 空间? 答: 不行!因为最多只有四个 Primary 的磁盘分割槽,没有多的可以进行分割了!且由于没 有 Extended ,所以自然不能再使用 Logical 分割说 • 我的 Mandrake 9.0 在安装的时候,进行 X-Window 的测试时都不会成功,要怎么办呢? 答: X-Window System 的!万一还是没有办法登入 X-Window 的话,没有关系!不要害怕!等到 后来『系统管理员篇』的时候,我们再来`入的谈一谈 X-Window 的设定吧!! ^_^。而,如果万 一不幸不小心按下了测试,要怎么办呢?屏幕已经一片漆黑了!@_@,没关系,此时可以按下 [Ctrl] + [Alt] + [F1] 就可以回到原先的画面啦! • 通常在安装 Linux 的时候,最重要的就是磁盘分割了!请问:磁盘分割通常要分成几个步骤? 答: 1. 进行磁盘分割 partition ; 2. 进行格式化 format ; • 磁盘分割之后会有所谓的 Primary, Extended 与 Logical 的磁盘分割槽,请问何者为可使用的 Partition ? 答: 只有 Primary 与 Logical 为可用, Extended 为不可直接使用的 Partition ,还需要 再次的分割成为 Logical 之后,才可以继续使用!而最大可分割出来的 Partition 应 该有 64 个才对! 开机关机、在线求助与指令下达方式 最近更新日期:2005/08/03 由于 Linux 在运作的过程中,会有很多的程序常驻在内存中来执行,此外, 由于 Linux 的磁盘使用效能 比较高,利用了异步的磁盘/内存数据传输的模式, 因此, Linux 系统是很怕不正常开关机的!因为,不 正常开关机的结果, 将可能造成磁盘数据的损毁啊!(其实各个操作系统都很怕这个问题!)。 所以,在 这个章节,鸟哥会跟大家介绍一下 Linux 正常开关机的步骤, 以及初次进入 Linux 的您,可以如何来操 作文字接口的指令呢!要注意啊! 学习文字接口真的是一件很不错的事喔! ^_^ 1. 首次登入系统 1.1 首次登入 FC 图形接口 1.2 KDE 的简易操作 1.3 X Window 与文字模式的切换 1.4 以文字模式登入 linux 2. 文字模式下指令的下达 2.1 开始下达指令 2.2 基础指令的操作 2.3 重要的几个热键[Tab], [ctrl]-c, [ctrl]-d 2.3 错误讯息的查看 3. Linux 系统上的在线求助 man page/info page 3.1 man page 3.2 info page 3.3 其它有用的文件(documents) 4. 正确的关机方法(shutdown, reboot, init, halt) 5. 开机过程的问题排解 6. 本章习题练习 7. 针对本文的建议:http://phorum.vbird.org/viewtopic.php?t=23877 首次登入系统 登入系统有这么难吗?呵呵!并不难,不过,虽然说是这样说,然而很多人第一次登入 Linux 的感觉都是 『接下来我要干啥?』 如果是以图形接口登入的话,或许还有很多好玩的事物,但是,要是以文字接口登 入的话, 面对着一片黑压压的屏幕,还真不晓得要干嘛呢!嗯!为了让大家更了解如何正确的使用 Linux , 正确的登入与离开系统还是需要说明的! 首次登入 FC 图形接口 啊开机就开机呀!怎么还有所谓的登入与离开呀!?呵呵!开什么玩笑,在 Linux 里面,正确的开关机可 是很重要的!因为, 不正常的关机可能会导致整个系统的扇区错乱,造成数据的毁损呢!这也是为什么通 常我们的 Linux 主机都会加挂一个不断电系统啰! 在顺利的安装完成之后,就是要快乐的进入 Linux 的世界啦,这个时候,按下电源, 如果您预设是有启 动图形接口的话,那么应该会出现如下的字样(这里是以 FC4 作为范例介绍的,各家版本多少会有点不同 的登入画面,这无所谓! 只是作为选择操作系统的一个画面而已。不过要注意的是,开机前如果想要加入 任何的参数, 就得在底下这个画面来增加喔! ^_^) 图 1 、 Linux 的 grub 开机选单画面 看到了吗?!这就是开机的选单啊!在上图的最上一行,告诉我们,如果想要进入额外的选单的话, 可以 按任意键来进入,而这就是 grub 这个程序的功能了。另外,如果您在预设的时间内没有按下任何按键( 在 这一版的 Fedora ,预设是 3 秒钟啦!),那么 grub 开机管理程序就会以系统预设的核心来开机。 事实 上, grub 的功能还有很多,包含可以在系统发生错误的时候,以额外的参数来强制开机, 以顺利进行系 统的修复等等功能呢!关于这个,我们留待后面的『系统管理员篇』再来详细的介绍这个玩意儿~ 此外,如果是以另一个开机管理程序( loader ),也就是 LILO 来设定你 MBR 的开机选单时, 那么预设 也是不会出现选单的!只会有出现『 boot: 』的画面而已,如果按下『 Enter 』 就会以预设的开机档 来开机,如果按下『Tab』按键,就会出现其它可能的开机档啦! 不过,在预设的情况下, FC4 并不会主 动的安装 Lilo 呢!但比较旧的版本还是存在的啦! 这部份我们同样在管理员篇再介绍! 假设我们是以 FC4 预设的开机核心来开机,那么接下来系统就会读取核心程序, 并且开始跑一些硬件搜 寻的数据, 然后是一些服务的开启动作,就像下图一般: 图 2 、 开机过程的文字画面 如果一切都顺利,嘿嘿!就会进入图形画面了!如同底下的模样!(要注意, 我们这里预设是以图形接口 来登入 Linux 的,所以才会有这样的画面, 如果您是以纯文字接口来登入 Linux ,那么就不会有这些画 面了。果真如此的话, 那么这部分您稍微瞧一瞧即可!) 图 3 、 开机过程的图形画面 如果在上图按下了『显示详细信息』时,就会显示出一些文字讯息了, 对于初学者来说,或许没有什么太 大的意义,不过,还是先告知一下呢, 这个时候,您可以看一看,到底有多少程序已经被启动呢? 图 4 、 开机过程的图形画面 怕了吧??有这么多不知名的咚咚已经在您的 Linux 里面启动了呢! 里面其实有很多是我们不需要的, 在未来您了解了 Linux 相关的知识之后, 就可以将那些不需要的程序( 或称为服务 )给他关掉了。目前 还不需要紧张, 因为我们还没有连上 Internet 哪!还不需要太紧张啦! ^_^ 另外,如果您是使用本书介绍的 FC4 ( Fedora Core IV )来安装您的 Linux , 并且也安装了预设 X Window 启动的状态,那么您就得要设定 X Window 的使用环境啰! 瞎密!?还需要设定 X Window 喔?没错啊! 因为您可以修改时区啊、选择语系啊、设定屏幕相关的分辨率与色泽度啊等等的, 这些都是 X Window 环 境下需要的咚咚呢,所以,当然得要设定一下啰。而且设定很简单啦! 用鼠标点一点就好了,别紧张喔! ^_^ 1. 欢迎画面与授权 首先,屏幕会出现如下的欢迎画面,主要分为左右两个画面,左边仅是介绍流程到哪里, 右边才是内容设 定的部分。至于最下方则是下个步骤与前个步骤的按钮。 我们按下『下一步』后,进入授权的说明。 图 5 、 X Window 设定的欢迎画面 在欢迎画面之后,会出现如下的授权声明,这个时候,当然给他『是的』就好了! 图 6 、 X Window 设定的授权同意书 2. 日期与时间的设定 接着下来,就是要设定目前的日期与时间了。您的系统时间可能会跑掉喔! 所以,这个时候请调整回来吧! ^_^ 画面左边可以点选正确的日期, 右方则可以填选正确的时间说! 图 7 、 X Window 设定的日期与时间 3. 分辨率与彩度的设定 接下来则是重头戏啦!就是 X Window 系统内的显示卡模块、屏幕分辨率与彩度设定。 一般来说,如果画 面上显示的是您正确的显示卡,那么问题就不大了!而鸟哥喜好的分辨率, 大概就是 1024x768 那种大大 的画面小小的字体~各人喜好啦! 而如果您的显示卡内存没有很大的话,彩度可以调小一点! 4. 建立一般账户 图 8 、 X Window 设定的分辨率与彩度 一般来说,我们在操作 Linux 系统时,除非必要,否则不要使用 root 的权限, 这是因为管理员(root) 的权限太大了!我们可能会随时不小心搞错了一个小咚咚, 结果却造成整个系统的挂点去.....所以,建 立一个一般身份使用者来操作,才是好习惯。 举例来说,鸟哥都会建立一个一般身份使用者的账号(例如 底下的 dmtsai), 用这个账号来操作 Linux ,而当我的主机需要额外的 root 权限来管理时, 才使用身 份转换指令(这个我们会在后面提到)来切换身份成为 root 来管理维护呢! ^_^ 如下图所示,登入的账号名称为 dmtsai ,而全名仅是一个简易的说明而已, 那个地方随便填没关系(不 填也无所谓!)。但是两个密码栏均需填写, 他并不会显示出您打入的字符,而是以 * 取代。两个必须打 相同的密码喔! 图 9 、 X Window 设定的建立一般账号使用者 5. 额外的音效与软件 如果您有声卡的话(或者是主机板内建的音效芯片),就会出现如下的图示。 如果确定音效芯片名称没有问 题,那就直接下一步即可。 图 10 、 X Window 设定的声卡确认 如果您还想要额外的安装其它的增强套件,这个时候可以在这里加入。 不过,我们使用预设的 FC4 ,不 需要额外的 CD 来安装啦! 图 11 、 X Window 设定的额外的 CD 这样就完成了首次 X Window 的设定啰! 图 12 、 X Window 设定完成 接下来呢?嘿嘿!等着进入 X Window 的美美的画面吧!如下图所示,这是 Fedora 预设的登入画面。您 可以看到中间请你输入『用户名称』,那就是账号啦! 目前我们 Linux 系统上面应该会有一个 root 与 刚刚才建立的 dmtsai 这两个账号呢。 你可以利用你刚刚自己建立的账号来登入喔! 图 13 、 等待登入的图形接口 另外,仔细看一下上图中的最下方还有四个选项呢,分别是『语言』、『作业阶段』、『重新开机』 与『关 机』。他们各有什么功能呢?首先,我们先来看看语言有啥功能吧? 用鼠标按下『语言』之后,就会出现 如下的画面。嘿嘿!没错!您可以使用多种语言的显示呢! 我们是使用繁体中文啊! 图 14 、 选择这次工作的语言 在接下来则是『作业阶段』,用鼠标按下他,出现如下画面。不要怀疑! 在这里你就可以选择你喜欢的 X Window Manager 了!亦即是窗口管理员啊! 因为鸟哥上次安装时,仅安装 KDE 而已,所以只会出现 KDE , 否则, 应该还有 GNOME 会出现在这个选单中喔! Tips: 什么是 KDE 呢?为了让 X Window 的显示效果更佳,很多团体开 始发展桌面应用的环境, KDE 就是其中一个。他们的目标就是发 展出类似 Windows 桌面的一整套可以工作的桌面环境, KDE 是架 构在 X Window 上面的,他可以进行窗口的定位、放大、缩小、 同 时还提供很多的桌面应用软件,详情请参考 http://www.kde.org/。GNOME 则是另外一个计划! 图 15 、 选择喜好的 Window Manager 各位观众!接下来,哈哈!终于来到了登入的阶段了!如同下面所示, 输入账号后按下『Enter』再出现 密码后,再输入密码,这里同样的, 屏幕上不会出现密码啦!会用星号(*)取代的喔! 图 16 、 登入时,账号的填入 图 17 、 登入时,密码的填入 接下来就能够进入 X Window 啦!不过,系统还会很好心的询问一下, 你要不要将这次的环境设定(KDE 啊、语言啊等等的)保留成为默认值呢? 通常鸟哥都是选择默认值啦!所以就给他保留成默认值吧! 图 18 、 是否保留此次登入的设定 KDE 的简易操作 嘿嘿嘿嘿!真是的,历经千辛万苦,终于还是给我进入了 KDE 的画面喔~ 整个画面如下所示,主要分为 两个区块,亦即上方深蓝色的桌面区, 以及下方的工作列(control panel)。在桌面上还有一些小图示 (icons) 可以用来快速连结到某些内容。 其实跟微软的 Windows 桌面很像啦!那些小图示就是快捷方式 啰! 图 19 、 KDE 的桌面环境 整个桌面的使用方法几乎跟 Windows 一模一样,你可以在桌面上按下右键, 就可以有额外的选单出现; 您也可以直接按下桌面上的『家目录』,就会出现类似 Windows 的 『档案总管』的档案/目录管理窗口, 里面则出现您自己的工作目录;至于最下方的工作列, 最左边出现的三个小图示中,那个红色的帽子的功 能(KDE menu),就跟 Windows 的『开始』一样, 你按下红帽后,就会出现一个下拉式选单出来,您就可 以选择其它的相关程序来执行了。 Tips: 最左边的图示中,其实在 KDE 原本的图示,是以一个大 K 来展现 的。 Fedora 则修订成为小红帽。某些版本还是保留 KDE 的 K 图 示呢! 另外,关于家目录,记得我们之前说过 Linux 是多人多任 务的操作系统吧? 那么每个人自然应该都会有自己的『工作目 录』,这个目录是使用者可以完全掌控的, 所以就称为『使用者 个人家目录』了。一般来说,家目录都在 /home 底下, 以我的这 次登入为例,我的账号是 dmtsai ,那么我的家目录就应该在 /home/dmtsai 啰! 至于工作列左边数来第二个 icon ,则是一个浏览器喔(Konqueror, 中文翻译为『征服家』) 。他是 KDE 发 展的一个浏览器, 如果未来您可以连上 Internet 后,就可以利用这个浏览器来浏览网站了!而第三个 icon 则是信件收发软件,功能有点类似 Windows 的 outlook express 啰! 总之,如果您用过 Windows 的 话,嘿嘿!这个 KDE 的环境几乎与 Windows 相同, 你可以开始玩弄 X Window 啰。 且慢且慢!不知道您有没有发现在第三个 icon 的右边还有个四方形的咚咚, 里面还分成四个小方格,那 是个什么咚咚?其实,他被称为虚拟桌面(Virtual Desktop), 在你进入 KDE 后,应该是到『1』的画面, 但是我们的 KDE 提供了四个虚拟桌面, 你还可以分别到其它三个桌面去瞧一瞧呢!这预设的四个桌面都 可以有自己的底图, 而如果你有很多窗口时,就可以放在不同的桌面中,还不会互相影响呢! 赶紧去试 看看吧!^_^ 最后,在工作列的最右方有个小小的警告标志(惊叹号),那是什么啊?! 没有任何一个操作系统是绝对安 全的!我们的 Linux 当然也是~ 而为了保持我们 Linux 的所有程序、套件的安全性,随时将套件更新到 最新版本, 是一个很好的习惯啊!在 Fedora 当中,我们使用的是 Red Hat 发展的 up2date 更新方法, 但是需要注册才能使用。由于我们还没有连上 Internet ,当然也就尚未注册资料, 所以这里才会显示一 个惊叹号啦!无论如何,我们还可以透过其它较为快速的方法来升级, 不一定要用这个机制,所以,这个 图形就先让他摆在这里,先不要理他。 Tips: 这里说不要理他,并不是不重要喔!设定系统的自动升级是目前所 有知名的操作系统 都在努力进行的工作,我们 Fedora 可以利用 社群提供的 yum 或 apt 等机制来更新, 不需要透过远在美国的 Fedora 计划的主机来更新啦!不过,因为这个图示判断是以 有没 有注册来判定,所以,常常我们自己升级了,但这里还是会出现有 问题的惊叹号~ 因此,鸟哥才说,先不要理他。另外,这么说您 也就知道了,系统可能并不十分安全, 因此,在尚未提到更新方 法之前,连上 Internet 可是很危险的喔! 至于更多的 X window 相关的使用技巧,以及相关的软件应用,鸟哥这里就不多说了, 因为鸟哥着重在 Linux 网络服务器的应用啊! ^_^ 如果您还真的有兴趣, 建议您可以前往杨老师的网站上看看喔! http://apt.nc.hcc.edu.tw/docs/FC3_X/ 。 如果使用 KDE 完毕后,想要离开,那么按下工作列最左方的小红帽,选择最下方的『注销』, 会出现底 下的画面,按下『End current session』就可以回到等待登入的画面啰。 图 20 、 注销 KDE 同时给他注意一下,如果不想要玩 Linux 了,想要关机时,务必按下那个『关机』的选项, 以出现如下 画面后,选择关闭计算机,这样才行喔!不要直接按电源啊!拜托拜托! 图 21 、 关闭 Linux 主机 例题:(很简单的,请读者们自行操作找出答案喔) • 如何在工作列 (Control panel) 上新增其它的 icons ? • 尝试浏览一下 /etc 这个目录内,有哪些档案/目录存在? • 请将 /etc/crontab 这个档案『复制』到您的家目录中; • 尝试修改屏幕分辨率; • 请尝试『搜寻』档案,档名为 crontab • 在您按下桌面的『家目录』后,出现的窗口中,最右上角有个小钉子, 按下他之后,发生什么现 象? • 请修改四个 Virtual Desktop 的底色图案,让他们都不相同; • 工作列的最右方原本是数字形态的时钟,请将他改为图形显示的时钟; • 如何叫出控制台?控制台的『区域性』里面的『键盘对应』有何用处? 特殊小技巧: 一般来说,我们是可以手动来直接修改 X Window 的设定档的,不过, 修改完成之后 X Window 并不会立 刻加载,必须要重新启动 X 才行 (特别注意,不是重新开机,而是重新启动 X !) 。那么如何重新启动 X 呢? 最简单的方法就是在 X 的画面中直接按下 [Alt] + [Ctrl] + [Backspace], 亦即是退格键,这样 就可以直接重新启动 X 啰!也就可以直接读入设定档啰! 另外,如果您的 X Window 因为不明原因导致 有点问题时, 也可以利用这个方法来重新启动 X 喔! ^_^ X window 与文字模式的切换 我们前面一直谈到的是 X Window 的 KDE 环境,那么在这个环境里面有没有纯文字接口的环境啊? 当然 有啊!但是,要怎么切换 X Window 与文字模式呢?注意喔,通常我们也称文字模式为 终端机接口, terminal 或 console 喔! Linux 预设的情况下, 会提供六个 Terminal 来让使用者登入,切换的方式 为使用:[Ctrl] + [Alt] + [F1]~[F6] 的组合按钮。 同时,系统为了判断,会将 [F1] ~ [F6] 定义为 tty1 ~ tty6 的操作接口环境。也就是说,当您按下 [crtl] + [Alt] + [F1] 这三个组合按钮时,就会进入到 tty1 的 terminal 界面中了。同样的 [F2] 就是 tty2 啰!那么如何回到刚刚的 KDE 呢? 很简单啊!按下 [Ctrl] + [Alt] + [F7] 就可以了! Tips: 注:某些 Linux distribution 会使用到 F8 这个终端接口做为他 的桌面终端机,例如 OpenLinux Server 3.1.1 ,所以这部份还不 是很统一!无论如何,尝试按按 F7 or F8 就可以知道啰! • [Ctrl] + [Alt] + [F1] ~ [F6] :文字接口登入 tty1 ~ tty6 终端机; • [Ctrl] + [Alt] + [F7] :图形接口桌面。 这也就是说,如果您是以文字接口登入的话,那么您可以有 tty1 ~ tty6 这六个文字接口的终端机玩,但 是图形接口 则没有任何东西。 至于以图形接口登入的话,就可以使用图形接口跟文字接口啰! 而如果您 是以文字接口启动 Linux 的,也就是说,您的 tty7 预设是没有东西的, 那您可以直接下达: [root@linux ~]# startx 『理论上』就可以启动图形接口啦!当然,『前提是您的 X Window 需要设定 OK,且您有安装 KDE/GNOME 等桌面系统才行』。 好啦,我们知道在 Linux 开机之后,可以进入 X Window 或者是纯文字接口环境, 那 么这两种环境是否可以变更呢?呵呵!那就涉及所谓的『Run Level』了! 你可以将预设启动的 X Window (Run level 等级为 5)改为不启动(Run level 3), 只要修订一下 /etc/inittab 这个档案的内容,就能 够决定呢! 因为我们尚未提到 vi 以及开机过程的详细信息,所以啊, 这部分得到系统管理员篇幅的时 候再说明!别担心,再仔细的看下去吧! 以文字模式登入 linux 好了,刚刚我们有提到按下 [Ctrl] + [Alt] + [F1] 可以来到 tty1 的 terminal 当中, 而如果您是使 用纯文字接口 ( 其实是 run level 3 ) 启动 Linux 主机的话, 那么预设就是会来到 tty1 这个环境中。 这个环境的等待登入的画面有点像这样: Fedora Core release 3 (Heidelberg) Kernel 2.6.11-1.27_FC3 on an i686 linux login: root Password: [root@linux ~]# _ 上面显示的内容是这样的: • 第一行显示的是您的 Linux distribution 与版本; • 第二行显示的是您的 Linux 核心版本 (2.6.11-1.27_FC3) ,以及您的硬件等级 ( i686 )。 • 第三行显是您的主机名称 (linux) ,至于 login 后面则是需要你输入登入者的账号。 在这里请 输入您想要登入的使用者账号。我们直接以 root 来登入。注意, 那个 root 就是『系统管理员』, 也就是『超级使用者, Super User』, 在 Linux 主机之内,这个账号代表的是『无穷的权力!』, 任何事都可以进行的, 因此,使用这个账号要『粉小心!』 • 第四行则在第三行输入后才会出现,要你输入密码啰!请注意,在输入密码的时候, 屏幕上面『不 会显示任何的字样!』, 所以不要以为你的键盘坏掉去! • 第五行则是正确登入之后才显示的讯息,最左边的 root 显示的是『目前使用者的账号』, 而 @ 之后接的 linux 则是『主机名称』,至于最右边的 ~ 则指的是 『目前所在的目录』,那么那个 # 则是我们常常讲的『提示字符』啦! Tips: 那个 ~ 符号代表的是『使用者的家目录』的意思,他是个『变量!』 这相关的意义我们会在后续的章节依序介绍到。举例来说, root 的家目录在 /root, 所以 ~ 就代表 /root 的意思~而 dmtsai 的家目录在 /home/dmtsai, 所以如果您以 dmtsai 登入时,他看 到的 ~ 就会等于 /home/dmtsai 喔! 至于提示字符方面,在 Linux 当中,预设 root 的提示字符为 # , 而一般身份使用者的提示字符为 $ 。 还有,上面的第一、第二行的内容其实是来自于 /etc/issue 这个 档案喔! 好了这样就是登入主机了!很快乐吧!耶~ 另外,在上面的例子当中,鸟哥是以 root 这个系统管理员身份的账号来登入的。 但是,在一般时刻的 Linux 使用情况中,为了『系统与网络安全』的考虑,通常我们都希望大家不要以 root 身份来登入主机 的。这是因为系统管理员账号 root 具有无穷大的权力, 例如他可以删除任何一个档案或目录,因此,若 您以 root 身份登入 Linux 系统,一个不小心下错指令, 这个时候可不是『欲哭无泪』就能够解决的了 问题的~因此,一个称职的网络/系统管理人员, 通常都会具有两个账号,平时以自己的一般账号来使用 Linux 主机的任何资源, 有需要动用到系统功能修订时,才会转换身份成为 root 呢!所以, 鸟哥强烈 建议您建立一个普通的账号来供自己平时使用喔! 更详细的账号讯息,我们会在后续的『账号管理』章节 中再次提及! 这里先有概念即可! 那么如何离开系统呢?其实应该说『注销 Linux』才对!注销很简单,直接这样做: [root@linux ~]# exit 就能够注销 Linux 了。但是请注意:『离开系统并不是关机!』 基本上,Linux 本身已经有相当多的工 作在进行,您的登入也仅是其中的一个『工作』而已, 所以当您离开时,那么该工作就停止了,不过其它 的工作但此时 Linux 其它的工作是还是进行的!在后面我们再来提如何正确的关机,这里先建立起这个概 念即可! 文字模式下指令的下达 其实我们所谓的『文字模式』就是指你在登入 Linux 的时候,得到的一个 Shell 啦! 那么什么是 Shell 呢?关于这个 Linux 重要的 bash Shell 的作用我们会在后面提到, 这里您先有个概念就好了。 Shell 提供我们使用者一些工具,可以透过这个工具, 来控制 kernel 的动作啰! ^_^。好吧!开始来练一练打 字了先! 开始下达指令 其实整个指令下达的方式很简单,您只要记得几个重要的概念就可以了。 举例来说,你可以这样下达指令 的: [root@linux ~]# command [-options] parameter1 parameter2 ... 指令 选项 参数(1) 参数(2) 说明: 0. 一行指令中第一个输入的绝对是『指令(command)』或『可执行档案』 1. command 为指令的名称,例如变换路径的指令为 cd 等等; 2. 中刮号[]并不存在于实际的指令中,而加入参数设定时,通常为 - 号,例如 -h; 有时候完整参数名称会输入 -- 符号,例如 --help; 3. parameter1 parameter2.. 为依附在 option 后面的参数, 或者是 command 的参数; 4. command, -options, parameter1.. 这几个咚咚中间以空格来区分, 不论空几格 shell 都视为一格; 5. 按下 [Enter] 按键后,该指令就立即执行。[Enter] 按键为 字符, 他代表着一行指令的开始启动。 6. 指令太长的时候,可以使用 \ 符号来跳脱 [Enter] 符号, 使指令连续到下一行。注意! \ 后就立刻接特殊字符。 其它: a. 在 Linux 系统中,英文大小写字母是不一样的。举例来说, cd 与 CD 并不同。 b. 更多的介绍等到 bash 时,再来详述。 注意到上面的说明当中,『第一个被输入的数据绝对是指令或者是可执行的档案』! 这个是很重要的概念 喔!还有,按下 [Enter] 键表示要开始执行此一命令的意思。来,我们实际操作: 以 ls 这个『指令』 列出『/root』这个目录下的『所有隐藏文件与相关的档案属性』, 档案的属性的 option 为 -al ,所以: [root@linux ~]# ls -al /root [root@linux ~]# ls -al /root 上面这两个指令的下达方式是一模一样的执行结果喔!为什么?请参考上面的说明吧! 关于更详细的文字 模式使用方式,我们会在『Shell 与 Shell Scripts』篇幅中再来强调喔! 此外,请特别留意,在 Linux 的环境中, 『大小写字母是不一样的东西!』也就是说,在 Linux 底下, VBird 与 vbird 这两个档案 是『完全不一样的』档案呢!所以, 您在下达指令的时候千万要注意到您的指令是大写还是小写。例如当 您输入底下这个指令的时候,看看有什么现象: [root@linux ~]# date [root@linux ~]# Date [root@linux ~]# DATE 很好玩吧!不一样的大小写显示的结果会有错误讯息发生呢! 因此,请千万记得这个状态呦!好啰,底下 我们来练习一下一些简单的指令,好让您可以了解指令下达方式的模式: 另外,很多时候您会发现,咦!怎么我输入指令之后出现的是乱码?? 这跟鸟哥说的不一样啊!呵呵!不 要紧张~我们前面提到过, Linux 是支持多国语系的,若可能的话, 屏幕的讯息是会以该支持语系来输 出的。但是,我们的终端机接口 (terminal) 在预设的情况下, 无法支持以中文编码输出数据的。这个时 候,我们就得将支持语系改为英文,才能够显示出正确的讯息。 那怎么做呢?您可以这样做: [root@linux ~]# LANG=en [root@linux ~]# LANGUAGE=en [root@linux ~]# LC_ALL=en [root@linux ~]# LC_CTYPE=en [root@linux ~]# LC_TIME=en 注意一下,上面每一行指令都是用等号『 = 』连接并且等号两边没有空格喔!是连续输入的! 这样一来, 就能够在『这次的登入』察看英文讯息啰!为什么说是『这次的登入』呢? 因为,如果您注销 Linux 后, 刚刚下达的指令就没有用啦! ^_^,这个我们会在 bash shell 章节中好好聊一聊的! 基础指令的操作 底下我们立刻来操作几个简单的指令看看啰! • 显示日期的指令: date • 显示日历的指令: cal • 简单好用的计算器: bc 1. 显示日期的指令: date 如果在文字接口上面,想要知道目前的时间,那么就直接在指令列模式输入 date 即可显示: [root@linux ~]# date Thu Jun 23 11:32:02 CST 2005 上面是显示:星期四, 六月二十三日, 11:32 分, 02 秒,在 2005 年的 CST 时区!请赶快动手做做看呦! 好了,那么如果我想要让这个程序显示出『 2005/06/23 』这样的日期显示方式呢? 那么就使用 date 的 相关功能吧! [root@linux ~]# date +%Y/%m/%d 2005/06/23 [root@linux ~]# date +%H:%M 11:35 那个『 +%Y%m%d 』就是 date 的一些参数功能啦!很好玩吧!那你问我, 鸟哥怎么知道这些参数的啊? 要背起来吗?当然不必啦!底下再告诉你! 2. 显示日历的指令: cal 那如果我想要列出目前这个月份的月历呢?呵呵!直接给他下达 cal 即可! [root@linux ~]# cal June 2005 Su Mo Tu We Th Fr Sa 1234 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 基本上, cal (calendar) 这个指令可以做的事情还很多,你可以显示整年的月历情况: [root@linux ~]# cal 2005 2005 January Su Mo Tu We Th Fr Sa 1 2345678 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 April Su Mo Tu We Th Fr Sa 12 3456789 10 11 12 13 14 15 16 17 18 19 20 21 22 23 February Su Mo Tu We Th Fr Sa 12345 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 May Su Mo Tu We Th Fr Sa 1234567 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 March Su Mo Tu We Th Fr Sa 12345 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 June Su Mo Tu We Th Fr Sa 1234 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 24 25 26 27 28 29 30 29 30 31 26 27 28 29 30 July Su Mo Tu We Th Fr Sa 12 3456789 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 October Su Mo Tu We Th Fr Sa 1 2345678 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 August Su Mo Tu We Th Fr Sa 123456 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 November Su Mo Tu We Th Fr Sa 12345 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 September Su Mo Tu We Th Fr Sa 123 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 December Su Mo Tu We Th Fr Sa 123 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 也就是说,基本上, cal 接的语法为: [root@linux ~]# cal [month] [year] 所以,我想要知道 2005 年 7 月的月历,可以直接下达: [root@linux ~]# cal 7 2005 July 2005 Su Mo Tu We Th Fr Sa 12 3456789 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 所以,未来您可以很轻易的就以 cal 来取得日历上面的日期啰!简直就是万年历啦! ^_^ 3. 简单好用的计算器: bc 如果我想要使用简单的计算器呢?很容易呀!就使用 bc 即可!在输入 bc 之后, 显示出版本信息之后, 就进入到等待指示的阶段。如下所示: [root@linux ~]# bc bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. _<==这个时候,光标会停留在这里等待您的输入 事实上,我们是『进入到 bc 这个指令的工作环境当中』了! 就好像我们在 Windows 里面使用『小算盘』 一样!所以,我们底下尝试输入的数据, 都是在 bc 程序当中在进行运算的动作。所以啰,您输入的数据 当然就得要符合 bc 的要求才行! 在基本的 bc 计算器操作之前,先告知几个使用的运算子好了: • + 加法 • - 减法 • * 乘法 • / 除法 • ^ 指数 • % 余数 好!让我们来使用 bc 计算一些咚咚吧! [root@linux ~]# bc bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. 1+2+3+4 <==只有加法时 10 7-8+3 2 10*52 520 10%3 <==计算『余数』 1 10^2 100 10/100 <==这个最奇怪!不是应该是 0.1 吗? 0 quit <==离开 bc 这个计算器 在上表当中,粗体字表示输入的数据,而在每个粗体字的底下就是输出的结果。 咦!每个计算都还算正确, 怎么 10/100 会变成 0 呢?这是 因为 bc 预设仅输出整数,如果要输出小数点下位数,那么就必须要执 行 scale=number ,那个 number 就是小数点位数,例如: [root@linux ~]# bc bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. scale=3 <==没错!就是这里!! 1/3 .333 340/2349 .144 quit 好了!就是这样子啦!简单的很吧!以后你可以轻轻松松的进行加减乘除啦! Tips: 如果照前面说的,我们执行 bc 会进入 bc 的软件功能, 那么我 怎么知道目前等待输入的地方是某个软件的功能还是 shell 的可 输入指令的环境下? 其实,在你进入 Linux 的时候,就会出现提 示字符了不是吗?以我们上头的例子来说, 提示字符就是 『 [root@linux ~]# 』,如果你发现在你等待输入的地方并非提 示字符, 那通常就是已经进入到某个软件的功能当中啦!要注意 喔! 重要的几个热键[Tab], [ctrl]-c, [ctrl]-d 在继续后面的章节之前,这里很需要跟大家再来报告一件事,那就是我们的文字模式里头具有很多的功能 按键, 这些按键可以辅助我们进行指令的编写与程序的中断呢!这几个按键请大家务必要记住的!很重要 喔! • [Tab] 按键 [Tab] 按键就是在键盘的大写灯切换按键([Caps Lock])上面的那个按键! 在各种 Unix-Like 的 Shell 当中,这个 [Tab] 按键算是 Linux 的 Bash shell 最棒的功能之一了! 他具有『命令补全』与『档案补 齐』的功能喔!可以让我们少打很多字,但重点是, 可以避免我们打错指令或文件名称呢!很棒吧!但是 [Tab] 按键在不同的地方输入,会有不一样的结果喔! 我们举下面的例子来说明。上一小节我们不是提到 cal 这个指令吗?如果我在指令列输入 ca 再按两次 [tab] 按键,会出现什么讯息? [root@linux ~]# ca[tab][tab] <==[tab]按键是紧接在 a 字母后面! # 上面的 [tab] 指的是『按下那个 tab 键』,不是要您输入 ca[... 的意思喔! cadaver callgrind_control capiinit case cal cancel capinfos cat calibrate_ppa cancel.cups captoinfo catchsegv caller capifax card callgrind capifaxrcvd cardctl callgrind_annotate capiinfo cardmgr 发现什么事?所有以 ca 为开头的指令都被显示出来啦!很不错吧! 那如果你输入 ls -al ~/.bash 两个 [tab] 会出现什么? [root@linux ~]# ls -al ~/.bash[tab][tab] .bash_history .bash_logout .bash_profile .bashrc 咦!在该目录下面所有以 .bash 的文件名称都会被显示出来了呢!注意看上面两个例子喔, 我们按 [tab] 按键的地方如果是在 command (第一个输入的数据) 后面时,他就代表着 『命令补全』,如果是接在第二 个字以后的,就会变成『档案补齐』的功能了! • [Tab] 接在一串指令的第一个字的后面,则为命令补全; • [Tab] 接在一串指令的第二个字以后时,则为『档案补齐』! 善用 [tab] 按键真的是个很好的习惯!可以让您避免掉很多输入错误的机会!!! • [Ctrl]-c 按键 在 Linux 底下,如果您输入了错误的指令或参数, 有的时候这个指令或程序会在系统底下『跑不停』这 个时候怎么办?别担心,如果您想让当前的程序『停掉』的话,可以输入:[Ctrl] 与 c 按键 (先按着 [Ctrl] 不放,且再按下 c 按键,是组合按键!), 那就是 中断目前程序 的按键啦! 举例来说,如果您输入了 『 find / -type vbird 』这个指令时, 系统会开始跑一些东西 (先不要理会这个指令串的意义),此时 你给他按下 [Ctrl]-c 组合按键,嘿嘿!是否立刻发现这个指令串被终止了!就是这样的意思啦! 不过你应该要注意的是,这个组合键是可以将正在运作中的指令中断的, 如果您正在运作比较重要的指令, 可别急着使用这个组合按键喔! ^_^ • [Ctrl]-d 按键 那么 [Ctrl]-d 是什么呢?就是 [Ctrl] 与 d 按键的组合啊!这个组合按键通常代表着: 『键盘输入结 束 (End Of File, EOF 或 End Of Input)』的意思! 另外,他也可以用来取代 exit 的输入呢!例如您 想要直接离开文字接口, 可以直接按下 [Ctrl]-d 就能够直接离开了(相当于输入 exit 啊!)。 总之,在 Linux 底下,文字接口的功能是很强悍的!要多多的学习他, 而要学习他的基础要诀就是...... 多使用、多熟悉啦! 错误讯息的察看 万一我下达了错误的指令怎么办?不要紧呀!您可以 藉由屏幕上面显示的错误讯息来了解你的问题点, 那 就很容易知道如何改善这个错误讯息啰!举个例子来说,假如想执行 date 却打错成为 DATE 时,这个错 误的讯息是这样显示的: [root@linux ~]# DATE -bash: DATE: command not found 上面那个 bash: 表示的是我们的 Shell 的名称,那么什么是 Shell 呢?还记不记得我们在 什么是 Linux 的时候提到的『使用者、使用者接口、核心、硬件』的架构呢?呵呵!那个 shell 就是使用者接口 啰!在 Linux 底下预设的使用者接口就是 bash shell 啰! 好了,那么上面的例子说明了, bash 有错误,什么错误呢? bash告诉你: DATE: command not found 字面上的意思是说『指令找不到』,那个指令呢?就是 DATE 这个指令啦! 所以说,系统上面可能并没有 DATE 这个指令啰!就是这么简单!那如果是底下的样子呢? [root@linux ~]# cal 13 2005 cal: illegal month value: use 1-12 呵呵!这下子换到 cal 警告你啦, illegal month value: use 1-12,看不懂英文? 没关系,又不是考 试,赶快拿本英文字典在旁边对照着看呀!意思是说『 不合法的月份值,应该使用 1-12 之间的数字!』 所以各位看倌您看看,跟着屏幕的错误讯息瞧,很容易知道问题的错误是什么吧! 因此,以后如果出现了 问题,屏幕上的讯息真的是很重要的呢!不要忽略了他呦! 先介绍这几个指令让您玩一玩先,更详细的指令操作方法我们会在第三篇的时候再进行介绍!好了,万一 我在操作 date 这个指令的时候,手边又没有这本书,我要怎么知道要如何加参数, 好让输出的结果符合 我想要的输出格式呢?嘿嘿!到下一节鸟哥来告诉你怎么办吧! Linux 系统上的在线求助 man page/info page 先来了解一下, Linux 有多少指令呢?在文字模式下,你可以直接按下两个 [Tab] 按键,看看总共有多 少指令??呵呵!少说也有 2000 多个以上的指令!! 那在 Linux 里面到底要不要背『指令』啊?可以 啊!你背啊!这种事,鸟哥这个『忘性』特佳的老人家, 实在是背不起来 @_@ ~当然啦,有的时候为了 要考试 (例如一些认证考试等等的) 还是需要背一些重要的指令。 不过,鸟哥主要还是以理解『在什么情 况下,应该要使用哪方面的指令』为准的! 既然不需要背指令,那么鸟哥如何知道每个指令的详细用法?还有,某些设定档的内容到底是什么? 这个 可不需要担心啊!因为在 Linux 开发的软件大多数都是自由软件,而这些软件的开发者为了让大家能够了 解指令的用法, 都会自行制作很多的文件,而这些文件也可以直接在在线就能够轻易的被使用者查询出来 喔!很不赖吧! 这根本就是『在线说明文件』嘛!哈哈!没错!确实如此。 我们底下就来谈一谈,Linux 到底有多少的在线文件数据呢? man page 嗄?不知道怎么使用 date 这个指令?嘿嘿嘿!不要担心,我们 Linux 上面的在线求助系统已经都帮您想 好要怎么办了,所以你只要使用简单的方法去寻找一下说明的内容, 马上就清清楚楚的知道该指令的用法 了!怎么看呢?就是找男人( man ) 呀!?喔!不是啦!这个 man 是 manual (操作说明) 的简写啦!只 要下达: 『man date』 马上就会有清楚的说明出现在你面前喔!如下所示: [root@linux ~]# LANG="en" # 还记得这个咚咚的用意吧?前面提过了,是为了『语系』的需要啊!下达过一次即可! [root@linux ~]# man date DATE(1) User Commands DATE(1) NAME date - print or set the system date and time SYNOPSIS date [OPTION]... [+FORMAT] date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] DESCRIPTION Display the current time in the given FORMAT, or set the system date. -d, --date=STRING display time described by STRING, not 'now' -f, --file=DATEFILE like --date once for each line of DATEFILE -ITIMESPEC, --iso-8601[=TIMESPEC] output date/time in ISO 8601 format. TIMESPEC='date' for date only, 'hours', 'minutes', or 'seconds' for date and time to the indicated precision. --iso-8601 without TIMESPEC defaults to 'date'. ................(略).... AUTHOR Written by David MacKenzie. REPORTING BUGS Report bugs to . COPYRIGHT Copyright ?2004 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. SEE ALSO The full documentation for date is maintained as a Texinfo manual. If the info and date programs are properly installed at your site, the command info coreutils date should give you access to the complete manual. date (coreutils) 5.2.1 May 2005 DATE(1) 看!马上就知道一大堆的用法了!如此一来,不就可以知道 date 的相关参数了吗?呵呵!真方便! 而出 现的这个屏幕画面,我们称呼他为 man page , 您可以在里头查询他的用法与相关的参数说明。如果仔细 一点来看这个 man page 的话, 您会发现几个有趣的东西。 首先,在上个表格的第一行,您可以看到的是:『DATE(1)』, DATE 我们知道是指令的名称, 那么 (1) 代 表什么呢?他代表的是『一般使用者可使用的指令』的意思!咦!还有这个用意啊!!呵呵! 没错~在查 询数据的后面的数字是有意义的喔!他可以帮助我们了解或者是直接查询相关的资料。 常见的几个数字的 意义是这样的: 代号 代表内容 1 使用者可以操作的指令或可执行文件 2 系统核心可呼叫的函数与工具等 3 一些常用的函数(function)与函式库(library) 4 装置档案的说明 5 设定档或者是某些档案的格式 6 游戏(games) 惯例与协议等,例如 Linux 标准档案系统、 网络协议、ASCII code 等等的说明内 7 容 8 系统管理员可用的管理指令 9 跟 kernel 有关的文件 所以,未来您如果使用 man page 在察看某些数据时,就会知道该指令/档案所代表的基本意义是什么了。 举例来说,如果您下达了 man null 时,会出现的第一行是:『NULL(4)』,对照一下上面的数字意义, 嘿 嘿!原来 null 这个玩意儿竟然是一个『装置档案』呢!很容易了解了吧!? 再来,man page 的内容也分成好几个部分来加以介绍该指令呢!就是上头 man date 那个表格内, 以 NAME 作为开始介绍,最后还有个 SEE ALSO 来作为结束。基本上, man page 大致分成底下这几个部分: 代号 NAME SYNOPSIS DESCRIPTION OPTIONS COMMANDS FILES SEE ALSO EXAMPLE BUGS 内容说明 简短的指令、数据名称说明 简短的指令下达语法(syntax)简介 较为完整的说明,这部分最好仔细看看! 针对 SYNOPSIS 部分中,有列举的所有可用的参数说明 当这个程序(软件)在执行的时候,可以在此程序(软件)中下达的指令 这个程序或数据所使用或参考或连结到的某些档案 可以参考的,跟这个指令或数据有相关的其它说明! 一些可以参考的范例 是否有相关的臭虫! 有时候除了这些外,还可能会看到 Authors 与 Copyright 等等,不过也有很多时候仅有 NAME 与 DESCRIPTION 等部分。 通常鸟哥在查询某个数据时,一定会察看 NAME 约略看一下这个数据的意思,再详 看一下 DESCRIPTION ,这个 DESCRIPTION 会提到很多相关的资料与使用时机,从这个地方可以学到很多 小细节呢!而如果这个指令其实很熟悉了 (例如上面的 date ),那么鸟哥主要就是查询关于 OPTIONS 的 部分了!可以知道每个参数的意思, 这样就可以下达比较细部的指令内容呢!最后,鸟哥会再看一下,啊 跟这个资料有关的还有哪些东西可以使用的? 举例来说,上面的 SEE ALSO 就告知我们还可以利用『info coreutils date』来进一步查阅资料, 某些说明内容还会列举有关的档案 (FILES 部分) 来提供我们参考! 这些都是很有帮助的! 好了,大致上了解了 man page 的内容后,那么,在 man page 当中我还可以利用哪些按键来帮忙查阅呢? 首先,如果要向下翻页的话,可以按下键盘的 空格键 ,也可以使用 [Page Up] 与 [Page Down] 来翻页 呢!同时,如果您知道某些关键词的话, 那么可以在任何时候输入『 /word 』,来主动搜寻关键词!例 如在上面的搜寻当中, 我输入了 /date 会变成怎样? DATE(1) User Commands DATE(1) NAME date - print or set the system date and time SYNOPSIS date [OPTION]... [+FORMAT] date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] DESCRIPTION Display the current time in the given FORMAT, or set the system date. ...........(中间省略)........ /date 看到了吗?您按下『/』之后,光标应该就会移动到屏幕的最下面一行, 并等待您输入搜寻的字符串了。 此时,输入 date 后, man page 就会开始搜寻跟 date 有关的字符串, 并且移动到该区域呢!很方便吧! 最后,如果要离开 man page 时,直接按下『 q 』就能够离开了。 我们将一些在 man page 常用的按键 给他整理整理: 按键 空格键 [Page Down] [Page Up] [Home] [End] /string ?string n, N q 进行工作 向下翻一页 向下翻一页 向上翻一页 去到第一页 去到最后一页 向『下』搜寻 string 这个字符串,如果要搜寻 vbird 的话,就输入 /vbird 向『上』搜寻 string 这个字符串 利用 / 或 ? 来搜寻字符串时,可以用 n 来继续下一个搜寻 (不论是 / 或 ?) ,可以利用 N 来进行『反向』搜寻。举例来说,我以 /vbird 搜寻 vbird 字符串, 那么可以 n 继续往下查询,用 N 往上查询。若以 ?vbird 向上查 询 vbird 字符串, 那我可以用 n 继续『向上』查询,用 N 反向查询。 结束这次的 man page 要注意喔!上面的按键是在 man page 的画面当中才能使用的! 比较有趣的是那个搜寻啦!我们可以往下 或者是往上搜寻某个字符串,例如要在 man page 内搜寻 vbird 这个字符串, 可以输入 /vbird 或者 是 ?vbird ,只不过一个是往下而一个是往上来搜寻的。而要 重复搜寻 某个字符串时,可以使用 n 或者 是 N 来动作即可呢! 很方便吧!^_^ 既然有 man page ,自然就是因为有一些文件数据,所以才能够以 man page 来读出来啰! 那么这些 man page 的数据 放在哪里呢?不同的 distribution 通常可能有点差异性,不过,通常是放在 /usr/share/man 这个目录里头,然而,我们可以透过修改他的 man page 搜寻路径来改善这个目录的问题!修改 /etc/man.config ( 有的版本为 man.conf 或 manpath.conf) 即可啰!至于更多的关于 man 的讯息您可 以使用『 man man 』来查询呦!关于更详细的设定,我们会在 Shell 的章节当中继续的说明喔! man 还有一些有趣的使用方式呢!举例来说,如果您还想要知道更多跟 man 有较相关的讯息, 可以下达: [root@linux ~]# man -f man man (1) - format and display the on-line manual pages man (7) - macros to format man pages man.conf [man] (5) - configuration data for man 看到了吗?使用 -f 的参数,可以取得更多的 man 的相关信息,而上头这个表格当中,也有提示了 (数字) 的内容, 举例来说,第二行的『 man (7) 』表示有个 man (7) 的说明文件存在喔!但是却有个 man (1) 存在啊! 那当我们下达『 man man 』的时候,到底是找到哪一个说明档呢?嘿嘿!混乱了吧?! 其实, 您可以指定不同的文件的,举例来说,上表当中的两个 man 您可以这样将他的文件叫出来: [root@linux ~]# man 1 man <==这里是用 man(1) 的文件数据 [root@linux ~]# man 7 man <==这里是用 man(7) 的文件数据 你可以自行将上面两个指令输入一次看看,就知道,两个指令输出的结果是不同的。 那个 1, 7 就是分别 取出在 man page 里面关于 1 与 7 相关数据的文件档案啰! 好了,那么万一我真的忘记了下达数字,只 有输入『 man man 』时,那么取出的数据到底是 1 还是 7 啊? 这个就跟搜寻的顺序有关了。搜寻的顺 序是记录在 /etc/man.conf 这个设定档当中, 先搜寻到的那个说明档,就会先被显示出来! 一般来说, 通常会先找到数字较小的那个啦!因为排序的关系啊!所以, man man 会跟 man 1 man 结果相同! 这样 说,可以明白了吗?! 除此之外,我们还可以利用『关键词』找到更多的说明文件数据喔!例如: [root@linux ~]# man -k man . [builtins] (1) - bash built-in commands, see bash(1) alias [builtins] (1) - bash built-in commands, see bash(1) ........(中间省略).... xsm (1x) - X Session Manager zshall (1) - the Z shell meta-man page zshbuiltins (1) - zsh built-in commands zshzle (1) - zsh command line editor 看到了吧!很多对吧!因为这个是利用关键词将说明文件里面只要含有 man 那个字眼的(不见得是完整字 符串) 就将他取出来!很方便吧! ^_^ 事实上,还有两个指令与 man page 有关呢!而这两个指令是 man 的简略写法说~ 就是这两个: [root@linux ~]# whatis [指令或者是数据] <==相当于 man -f [指令或者是数据] [root@linux ~]# apropos [指令或者是数据] <==相当于 man -k [指令或者是数据] Tips: 一般来说,鸟哥是真的不会去背指令的,只会去记住几个常见的指 令而已。那么鸟哥是怎么找到所需要的指令呢? 举例来说,打印 的相关指令,鸟哥其实仅记得 lp (line print)而已。那我就由 man lp 开始,去找相关的说明, 然后,再以 lp[tab][tab] 找到任何 以 lp 为开头的指令,找到我认为可能有点相关的指令后, 再以 man 去查询指令的用法!呵呵!所以,如果是实际在管理 Linux , 那么真的只要记得几个很重要的指令即可,其它需要的,嘿嘿!努 力的找男人(man)吧! info page 在所有的 Unix Like 系统当中,都可以利用 man 来查询指令或者是相关档案的用法; 但是,在 Linux 里 面则又额外提供了一种在线求助的方法,那就是利用 info 这个好用的家伙啦! 基本上, info 与 man 其 实差不多,而且,文件数据必须要以 info 写成的,才会比较完整。 而这个支持 info 指令的文件是放置 在 /usr/share/info/ 这个目录当中的。 举例来说,info 的说明文件有写成 info 格式,所以,你使用 info info 可以得到: [root@linux ~]# info info File: info.info, Node: Top, Next: Getting Started, Up: (dir) Info: An Introduction ********************* The GNU Project distributes most of its on-line manuals in the "Info format", which you read using an "Info reader". You are probably using an Info reader to read this now. There are two primary Info readers: `info', a stand-alone program designed just to read Info files, and the `info' package in GNU Emacs, a general-purpose editor. At present, only the Emacs reader supports using a mouse. If you are new to the Info reader and want to learn how to use it, type the command `h' now. It brings you to a programmed instruction sequence. To read about expert-level Info commands, type `n' twice. This brings you to `Info for Experts', skipping over the `Getting Started' chapter. * Menu: * Getting Started:: Getting started using an Info reader. * Expert Info:: * Creating an Info File:: * Index:: Info commands for experts. How to make your own Info file. An index of topics, commands, and variables. --zz-Info: (info.info.gz)Top, 29 lines --All--------------------------------Welcome to Info version 4.8. Type ? for help, m for menu item. 仔细的看到上面这个表,您可以发现最后一行显示出目前的 info 这个程序的版本信息, 你可以按下 m 这 个按键,就可以有更多的指令说明。 而第一行则显示目前这个 info page 的檔名, 注意到我将他显示成 为特殊字体的那几个部分,第一行的 Node 显示,这个画面是『在第几层?』的意思, 因为 info page 将 所有有关的资料都进行了连结,因此,他可以利用分层的架构来说明每个文件数据呢! 而且还有下一层数 据,因此,您会看到第一行还有 Next 这个字眼。这表示, 您只要输入『n』这个按键后,就可以跑到下 一层, 也就是 Getting Started 那个章节去了!呵呵!很方便吧! 再来,你也会看到有『Menu』那个咚咚吧!底下共分为四小节,分别是 Getting Started 等等的, 我们 可以将光标移动到该文字或者 * 上面,按下 Enter , 就可以前往该小节了!而,利用 [Tab] 按键,就 可以快速的将光标在上表的画面中的 node 间移动,真的是很方便啦!不过,什么是 node 呢?就是各个 入口点称为 node 。举例来说,上个表格当中,按下 n 或者是将游标游动到 Next 这个字上,按下 Enter , 就可以前往下个说明了。 这就是 node 啊! 不过,就如同前面说的, info 需要文件有支持才行,如果我们以没有支持的 man 来看的话, info man 的 结果与 man man 的结果就一样了~没有不同啊! 至于 info page 当中可以使用的按键,可以整理成这样: 按键 空格键 [Page Down] [Page Up] [tab] [Enter] b e n p u s(/) h ? q 进行工作 向下翻一页 向下翻一页 向上翻一页 在 node 之间移动,有 node 的地方,通常会以 * 显示。 当光标在 node 上面时,按下 Enter 可以进入该 node 。 移动光标到该 info 画面当中的第一个 node 处 移动光标到该 info 画面当中的最后一个 node 处 前往下一个 info page 处 前往上一个 info page 处 向上移动一层 在 info page 当中进行搜寻 显示求助选单 指令一览表 结束这次的 info page info page 也是很不错用啦!有兴趣的话,可以多多去查询查询哩! ^_^ 其它有用的文件(documents) 刚刚前面说,一般而言,指令或者软件制作者,都会将自己的指令或者是软件的说明制作成『在线说明文 件』! 但是,毕竟不是每个咚咚都需要做成在线说明文件的,还有相当多的说明需要额外的文件!此时, 这个所谓的 How-To ( 如何做的意思 ) 就很重要啦!还有,某些软件不只告诉你『如何做』, 还会有一 些相关的原理会说明,那么这些说明文件要摆在哪里呢?哈哈!就是摆在这个目录 /usr/share/doc 啦! 所以说,其实,您只要到这个目录底下,就会发现好多好多的说明文件档啦!还不需要到网络上面找数据 呢!厉害吧! ^_^ 举例来说,您想要知道这一版的 Fedora 相关的各项信息,可以直接到: • /usr/share/doc/fedora-release-4 这个目录来查阅一下即可了解!如果想要知道 bash 是什么,则可以到 /usr/share/doc/bash-3.0 这个目 录中! 很多东西呦!而且, /usr/share/doc 这个目录下的数据主要是以套件 (packages) 为主的, 例 如 GCC 这个套件的相关信息在 /usr/share/doc/gcc-xxx (那个 xxx 表示版本的意思!)。 未来可得多多 查阅这个目录喔! ^_^ 记住喔!在文字接口下,有任何你不知道的玩意儿,但是你想要了解他,请赶快使用 man 或者是 info 来 查询这个玩意儿!此外,如果你想要架设一些其它的服务时,请赶快到 /usr/share/doc 底下查一查有没 有该服务的说明档喔!另外,再次的强调,因为 Linux 毕竟是外国人发明的,所以中文文件确实是比较少 的!但是不要害怕,拿本英文字典在身边吧! 随时查阅!不要害怕英文喔! 正确的关机方法(shutdown, reboot, init, halt) OK!大概知道开机的方法,也知道基本的指令操作,而且还已经知道在线查询了,好累呦! 想去休息呢! 那么如何关机呢?我想,很多朋友在 DOS 的年代已经有在玩计算机了!在当时我们关掉 DOS 的系统时, 常常是直接关掉电源开关,而 Windows 在你不爽的时候,按着电源开关四秒也可以关机!但是在 Linux 则 相当的不建议这么做! Why?在 Windows (非 NT 主机系统) 系统中,由于是单人假多任务的情况,所以即使你的计算机关机, 对 于别人应该不会有影响才对!不过呢,在 Linux 底下,由于每个程序(或者说是服务) 都是在在背景下 执行的,因此,在你看不到的屏幕背后其实可能有相当多人同时在你的主机上面工作, 例如浏览网页啦、 传送信件啦以 FTP 传送档案啦等等的,如果你直接按下电源开关来关机时, 则其它人的数据可能就此中 断!那可就伤脑筋了!此外,最大的问题是, 若不正常关机,则可能造成档案系统的毁损 (因为来不及 将数据回写到档案中,所以有些服务的档案会有问题!)。正常情况下,要关机时需要注意底下几件事: • 观察系统的使用状态:如果要看目前有谁在在线,可以下达 who 这个指令,而如果要看网络的联 机状态,可以下达 netstat -a 这个指令,而要看背景执行的程序可以执行 ps -aux 这个指令。 使用这些指令可以让你稍微了解主机目前的使用状态!当然啰,就可以让你判断是否可以关机了 (这些指令在后面 Linux 常用指令中会提及喔!) • 通知在线使用者关机的时刻: 要关机前总得给在线的使用者一些时间来结束他们的工作,所以, 这个时候你可以使用 shutdown 的特别指令来达到此一功能。 • 正确的关机指令使用:例如 shutdown 与 reboot 两个指令! 所以底下我们就来谈一谈关于这个关机的正确指令用法啰! • 将数据同步写入硬盘中的指令: sync • 惯用的关机指令: shutdown • 重新开机,关机: reboot, halt, poweroff 数据同步写入磁盘: sync 在 Linux 系统中,为了加快数据的读取速度,所以,预设的情况中, 某些数据将不会直接被写入硬盘, 而是先暂存在内存当中,如此一来, 如果一个数据被你重复的改写,那么由于他尚未被写入硬盘中,因此 可以直接由内存当中读取出来, 在速度上一定是快上相当多的! 不过,如此一来也造成些许的困扰,那就是,万一当你重新开机,或者是关机,或者是不正常的断电的情 况下, 由于数据尚未被写入硬盘当中,哇!所以就会造成数据的更新不正常啦!那要怎么办呢?这个时候 就需要 sync 这个指令来进行数据的写入动作啦!直接在文字接口下输入 sync , 那么在内存中尚未被更 新的数据,就会被写入硬盘中!所以,这个指令在系统关机或重新开机之前, 很重要喔!最好多执行几次! (注:这个指令也只有 root 可以执行喔! ) 虽然目前的 shutdown/reboot/halt 等等指令均已经在关机前进行了 sync 这个工具的呼叫, 不过,多做 几次总是比较放心点~呵呵~ [root@linux ~]# sync 惯用的关机指令: shutdown 好了,由于关机有种种的限制因子在,所以只有 root 有权力关机而已喔! 嗯!那么就来关机试试看吧! 我们较常使用的是 shutdown 这个指令,而这个指令会通知系统内的各个程序( processes ),并且将通知 系统中的 run-level 内的一些服务来关闭( run-level 会在后面告知喔 )。shutdown 可以达成: • 可以自由选择关机模式:是要关机、重新开机或进入单人操作模式均可; • 可以设定关机时间: 可以设定成现在立刻关机, 也可以设定某一个特定的时间才关机。 • 可以自订关机讯息:在关机之前,可以将自己设定的讯息传送给在线 user 。 • 可以仅发出警告讯息:有时有可能你要进行一些测试,而不想让其它的使用者干扰, 或者是明白 的告诉使用者某段时间要注意一下!这个时候可以使用 shutdown 来吓一吓使用者,但却不是真 的要关机啦! • 可以选择是否要 fsck 检查档案系统 。 那么 shutdown 的语法是如何呢?聪明的读者大概已经开始找『男人』了!没错,随时随地的 man 一下, 是很不错的举动!好了,简单的语法规则为: [root@linux ~]# /sbin/shutdown [-t 秒] [-arkhncfF] [时间] [警告讯息] 实例: [root@linux ~]# /sbin/shutdown -h 10 'I will shutdown after 10 mins' 告诉大家,这部机器会在十分钟后关机!并且会显示在目前登入者的屏幕前方! 至于参数有哪些呢?以下介绍几个吧! -t sec : -t 后面加秒数,亦即『过几秒后关机』的意思 -k : 不要真的关机,只是发送警告讯息出去! -r : 在将系统的服务停掉之后就重新开机 -h : 将系统的服务停掉后,立即关机。 -n : 不经过 init 程序,直接以 shutdown 的功能来关机 -f : 关机并开机之后,强制略过 fsck 的磁盘检查 -F : 系统重新开机之后,强制进行 fsck 的磁盘检查 -c : 取消已经在进行的 shutdown 指令内容。 此外,需要注意的是,时间参数请务必加入,否则会自动跳到 run-level 1 (就是单人维护的登入情况), 这样就伤脑筋了!底下提供几个例子吧! [root@linux ~]# shutdown -h now 立刻关机,其中 now 相当于时间为 0 的状态 [root@linux ~]# shutdown -h 20:25 系统在今天的 20:25 分会关机 [root@linux ~]# shutdown -h +10 系统再过十分钟后自动关机 [root@linux ~]# shutdown -r now 系统立刻重新开机 [root@linux ~]# shutdown -r +30 'The system will reboot' 再过三十分钟系统会重新开机,并显示后面的讯息。 [root@linux ~]# shutdown -k now 'This system will reboot' 仅发出警告信件的参数!系统并不会关机啦!吓唬人! 重新开机,关机: reboot, halt, poweroff 这三个指令差不多,用途上有些不同而已!那个 reboot 其实与 shutdown -r now 几乎相同!不过,建议 在关机之前还是将数据回填的指令下达一次再说: [root@linux ~]# sync; sync; sync; reboot 就可以啦!通常我如果忘记 shutdown 的指令,或者是怕麻烦,都是使用上面说的这一个指令来重新开机, 并且在听到『逼』的一声时,立刻将 Linux 主机的总电源关闭!如此亦可达到关机的目的呀! 此外, halt 与 poweroff 也具有相同的功能喔!不要担心,使用 man 去查询一下下吧! ^_^ 开机过程的问题排解 事实上, Linux 主机是很稳定的,除非是硬件问题与系统管理员不小心的动作,否则, 很难会造成一些 无法挽回的错误的。但是,毕竟我们目前使用的可能是练习机,会常常开开关关的, 所以确实可能会有一 些小问题发生。好了,我们先来简单的谈一谈,如果无法顺利开机时, 您应该如何解决。要注意的是,底 下说到的内容很多都还没有开始介绍, 因此,看不懂也不要太紧张~在本书全部都读完且看第二遍时,您 自然就会有感觉了! ^_^ 扇区错乱的问题 在开机的过程中最容易遇到的问题就是硬盘可能有坏轨或扇区错乱(数据损毁)的情况, 这种情况虽然不 容易发生在稳定的 Linux 系统下,不过由于不当的开关机 还是可能会造成的,原因可能有: • 最可能发生的原因是因为断电或不正常关机所导致的硬盘磁道错乱, 鸟哥的主机就曾经发生过多 次因为跳电,家里的主机又没有安装不断电系统, 结果就导致硬盘磁道错乱了! • 硬盘使用率过高也是一个可能的原因,例如你开放了一个 FTP 服务,里面有些数据很有用, 所 以一堆人抢着下载,如果你又不是使用较稳定的 SCSI 接口硬盘,仅使用 IDE 接口的硬盘, 虽 然机率真的不高,但还是有可能造成磁道错乱的(这个问题其实在 Windows 系统下更容易发生 哩!)。 解决的方法其实很简单,也可能很困难,如果您的根目录『/』并没有损毁,那就很容易解决, 如果根目 录已经损毁了,那就比较麻烦! • 如果根目录没有损毁:假设你发生错误的磁盘区块是在 /dev/hda7 这一块,那么在开机的时候, 屏幕应该会告诉你: press root pass word or ctrl+D : 这时候请输入 root 的密码登入系统: o 在光标处输入 root 密码登入系统,进行单人单机的维护工作; o 输入 fsck /dev/hda7 (fsck 为指令, /dev/hda7 为错误的磁盘区块,请依你的情况 下达参数), 这时屏幕会显示开始修理硬盘的讯息,如果有发现任何的错误时,屏幕会 显示: clear [Y/N]? 的询问讯息,就直接输入 Y 吧! o 修理完成之后,以 reboot 重新开机啰! • 如果根目录损毁了: 一般初学者喜欢将自己的硬盘只划分为一个大区块,亦即只有根目录, 那 硬盘区块错乱一定是根目录的问题啰!这时你可以将硬盘拔掉,接到另一台 Linux 系统的计算机 上,并且不要挂载(mount)该硬盘,然后以 root 的身份执行 fsck /dev/hdb1 (/dev/hdb1 指 的是你的硬盘装置名称,你要依你的实际状况来设定),这样就 OK 啰! 另外,也可以使用近年来很热门的 Live CD ,也就是利用光盘开机就能够进入 Linux 操作系统 的特性, 您可以前往:『http://knoppix.tnc.edu.tw/』 这个网站来下载,并且烧录成为 CD , 这个时候用光盘开机,再加以 mount 原本的 / , 以 fsck /dev/hda1 就能够就回来了! • 如果硬盘整个坏掉: 如果硬盘实在坏的离谱时,那就换一颗吧,如果不愿意换硬盘,那就重灌 Linux 吧,并且在重灌的时候,于 Format 项目中,选取『error check』项目,只是如此一来, format 会很慢,并且,何时会再坏掉也不确定!最好还是换一颗吧! 预防的方法: • 妥善保养硬盘:例如: 主机通电之后不要搬动,避免移动或震动硬盘;尽量降低硬盘的温度,可 以加装风扇来冷却硬盘; 或者可以换装 SCSI 硬盘。 • 划分不同的磁盘区块: 如果诸位看官还记得的话,应该知道 Fedora 安装的方法可以分为四五种, 有 upgrad, Server, Workstation 等等的,这些咚咚不一样的地方就在于磁盘划分的不同啦!通 常我们会建议划分下列的磁盘区块: o/ o /boot o /usr o /home o /var 这样划分有些好处,例如 /var 是系统预设的一些数据暂存或者是 cache 数据的储存目录, 像 e-mail 就含在这里面。如果还有使用 proxy 时,因为常常存取,所以有可能会造成磁盘损坏, 而 当这部份的磁盘损坏时,由于其它的地方是没问题的,因此资料得以保存,而且在处理时也比较 容易! 忘记 root 密码: 常常有些朋友在设定好了 Linux 之后,结果 root 密码给他忘记去!要重新安装吗?! 不需要的,你只 要以单人维护模式登入即可更改你的 root 密码喔!不过,目前的开机选单主要有 LILO 与 Grub 两种, 这两种模式并不相同,有必要来说明一下: • LILO 您只要在出现 Lilo 选单的时候,输入:(请注意,如果是 Red Hat 7.0 以后的版本,会出现图形接口的 lilo ,这个时候请按下 [Ctrl] + x 即可进入纯文字接口的 lilo 啰!) boot: linux -s 以进入单人单机维护模式(即为 run-level 1 ),然后再输入 passwd 这个指令,就可以直接更改 root 的 密码啰!同时,如果图形接口无法登入的时候,也可以使用此一方法来进入单人单机的维护工作,然后再 去修改 /etc/inittab 改变一下登入的预设模式,如此一来就可以在下次开机的时候以文字模式登入啰! 同时请注意!如果您在设定启动的名称的时候,已经改变了启动的名称,例如我都喜欢在名称之后加上核 心码, 例如:Red-Hat-2.4.7,这个时候我就必须在 boot: 底下输入: boot: Red-Hat-2.4.7linux -s boot: Red-Hat-2.4.7linux single 另外,您可能会遇到 Lilo 的开机问题,这个时候建议您先参考一下底下这一篇讨论,未来还会再次提到 lilo 的设定问题! • http://phorum.vbird.org/viewtopic.php?t=150 • Grub grub 做为开机管理程序,要进入单人维护模式就比较麻烦一些! 在开机的过程当中,会有读秒的时刻, 此时请按下任意按键,就会进入选单画面。 这个时候只要选择相对的核心档案,并且按下『e』,就可以 进入编辑画面了。此时,你看到的画面有点像: root (hd0,0) kernel /boot/vmlinuz-2.4.19 root=/dev/hda1 此时,请将光标移动到 kernel 那一行,再按一次『 e 』进入 kernel 该行的编辑画面中, 然后在出现 的画面当中,最后方输入 single : root (hd0,0) kernel /boot/vmlinuz-2.4.19 root=/dev/hda1 single 再按下『 Enter 』确定之后,按下 b 就可以 boot 看看啦! 关于 LILO 与 grub 我们会在后面继续加以介绍,这里先有概念即可!不过,并非所有版本的 Linux 皆可 使用此一方法!例如 OpenLinux 就无法进入单人维护模式,因为他的单人维护模式 『仍然需要输入 root 的密码!』哇!真是可怕吶!这个时候怎么办?呵呵!别担心,现在你还不会, 看完了后面几个章节之后, 您就一定会啦! ^_^ 本章习题练习 ( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看) • 请问如果我以文字模式登入 Linux 主机时,我有几个终端机接口可以使用?如何切换各个不同的 终端机接口? 共有六个, tty1 ~ tty6 ,切换的方式为 Crtl + Alt + [F1]~[F6],其中, [F7] 为图形接口 的使用。 • 在 Linux 系统中, /VBird 与 /vbird 是否为相同的档案? 两者为不同的档案,因为 Linux 系统中,大小写字母代表意义不一样! • 我想要知道 date 如何使用,应该如何查询? 最简单的方式就是使用 man date 或 info date 来查看,如果该套件有完整说明的话,那么应该 也可以在 /usr/share/doc 里面找到说明档! • 我想要在今天的 1:30 让系统自己关机,要怎么做? shutdown -h 1:30 • 如果我 Linux 的 X Window 突然发生问题而挂掉,但 Linux 本身还是好好的,那么我可以按下 哪三个按键来让 X window 重新启动? [crtl]+[alt]+[backspace] • man page 的设定档在哪里? Fedora 的设定档在 /etc/man.conf 有的 distribution 会定义为 /etc/man.config 或 /etc/manpath.conf • 我想要知道 2005 年 5 月 2 日是星期几?该怎么做? 最简单的方式直接使用 cal 5 2005 即可找出 2003 年 5 月份的月历。 • 使用 man date 然后找出显示目前的日期与时间的参数,成为类似:2002/10/16-20:03 date +%Y/%m/%d-%H:%M • 若以 X-Window 为预设的登入方式,那请问如何进入 Virtual console 呢? 可以按下 [Ctrl] + [Alt] + [F1] ~ [F6] 进入 Virtual console ( 共六个 ); 而按下 [Ctrl] + [Alt] + [F8] 或 [F7] 可回到 X-Window 的 desktop 中! • 简单说明在 bash shell 的环境下, [tab] 按键的用途? [Tab] 按键可做为命令补齐或档案补齐的功能,与所接的指令位置有关。 接在一串指令的第一个 单字后面,则为命令补齐,否则则为档案补齐! • 如何强制中断一个程序的进行?(利用按键,非利用 kill 指令) 可以利用 [Ctrl] + c 来中断! • Linux 提供相当多的在线查询,称为 man page,请问,我如何知道系统上有多少关于 passwd 的 说明?又,可以使用其它的程序来取代 man 的这个功能吗? 可以利用 man -f passwd 来查询,另外,如果有提供 info 的文件数据时 (在 /usr/share/info/ 目录中) ,则能够利用 info passwd 来查询之! • man -k passwd 与 man -K passwd 有什么差异(大小写的 K )? 小写的 -k 为查询关键词,至于 -K 则是整个系统的 man page 查询~ 每个被检查到有关键词的 man page file 都会被询问是否要显示, 您可以输入『ynq』,来表示:y:要显示到屏幕上;n: 不显示;q:结束 man 的查询。 • 在 man 的时候, man page 显示的内容中,指令(或档案)后面会接一组数字,这个数字若为 1, 5, 8 ,表示该查询的指令(或档案)意义为何? 代表意义为 1) 一般使用者可以使用的指令或可执行档案 5)一些设定档的档案内容格式 8)系统 管理员能够使用的管理指令。 • man page 显示的内容的档案是放置在哪些目录中? 放置在 /usr/share/man/ 与 /usr/local/man 等预设目录中。 • 请问这一串指令『 foo1 -foo2 foo3 foo4 』中,各代表什么意义? foo1 一定是指令, -foo2 则是 foo1 这个指令的选择项目参数, foo3 与 foo4 则不一定, 可 能是 foo1 的参数设定值,也可能是额外加入的 parameters。 • 当我输入 man date 时,在我的终端机却出现一些乱码,请问可能的原因为何?如何修正? 如果没有其它错误的发生,那么发生乱码可能是因为语系的问题所致。 可以利用 LANG=en 或者 是 LANG=en_US 等设定来修订这个问题。 • 我输入这个指令『ls -al /vbird』,系统回复我这个结果:『ls: /vbird: No such file or directory』 请问发生了什么事?』 不要紧张,很简单的英文,因为系统根本没有 /vbird 这个档案的存在啊! ^_^ • 你目前的 Linux 底下,预设共有多少可以被你执行的指令? 最简单的做法,直接输入两次 [tab] 按键即可知道有多少指令可以被执行。 • 我想知道目前系统有多少指令是以 bz 为开头的,可以怎么作? 直接输入 bz[tab][tab] 就可以知道了! • 承上题,在出现的许多指令中,请问 bzip2 是干嘛用的? 在使用 man bzip2 之后,可以发现到,其实 bzip2 是用来作为压缩与解压缩档案用的! • Linux 提供一些在线文献数据,这些数据通常放在那个目录当中 通常放在 /usr/share/doc 当中! • 在终端机里面登入后,看到的提示字符 $ 与 # 有何不同?平时操作应该使用哪一个? # 代表以 root 的身份登入系统,而 $ 则代表一般身份使用者。依据提示字符的不同, 我们可 以约略判断登入者身份。一般来说,建议日常操作使用一般身份使用者登入,亦即是 $ ! Linux 的档案属性与目录配置 最近更新日期:2006/08/05 Linux 最优秀的地方之一,就在于他的多人多任务的环境。 而为了让各个使用者具有较安全的管理机制, 因此档案的权限管理就变的很重要了。 Linux 一般将档案可存取的方式分为三个类别,分别是 owner/group/other, 且各有 read/write/excute 等权限。若管理得当,将会让您的 Linux 主机变的较为安全。 另外,您如果首次接触 Linux 的话,那么, 在 Linux 底下这么多的目录/档案,到底代表什么意义呢? 底 下我们就来一一介绍呢! 1. 使用者与群组 2. Linux 档案权限概念 2.1 Linux 档案属性 2.2 如何改变档案权限: chgrp, chown, chmod 2.3 目录属性的意义 2.4 Linux 档案种类与附档名 3. Linux 目录配置 3.1 Linux 目录配置的依据 FHS 3.2 目录配置的内容 3.3 需要特别注意的目录 3.4 一般主机 partition 与目录的配置情况 4. Linux 支持的档案系统 5. 本章习题练习 6. 参考数据 7. 针对本文的建议:http://phorum.vbird.org/viewtopic.php?t=23878 使用者与群组 经过前面一章的洗礼之后,您应该可以在 Linux 的指令列模式底下输入指令了吧?! 呵呵!接下来,当 然是要让您好好的浏览一下 Linux 系统里面有哪些重要的档案啰。 不过,每个档案都有相当多的属性, 其中最重要的可能就是档案的拥有者的概念了。 所以,在开始档案相关信息的介绍前,鸟哥先就简单的使 用者及群组的概念作个说明吧~ 好让您快点进入状况的哩! ^_^ • 档案拥有者 初次接触 Linux 的朋友大概会觉得很怪异,怎么『Linux 有这么多使用者,还分什么群组,有什么用?』。 这个『使用者与群组』的功能可是相当健全而好用的一个安全防护呢!怎么说呢? 由于 Linux 是个多人 多任务的系统 ( 已经提过若干次啰! ),因此可能常常会有多人同时使用这部主机来进行工作的情况发生, 为了考虑每个人的隐私权以及每个人的喜好的工作环境, 因此,这个『档案拥有者』的角色就显的相当的 重要了! 例如当你将你的 e-mail 情书转存成档案之后,放在您自己的家目录,您总不希望被其它人看见自己的情 书吧? 这个时候,你就把该档案设定成『只有档案拥有者,就是我,才能看与修改这个档案的内容』, 那 么即使其它人知道你有这个相当『有趣』的档案,不过由于您有设定适当的权限, 所以其它人自然也就无 法知道该档案的内容啰! • 群组概念 那么群组呢?为何要设定档案还有所属的群组?其实, 群组最简单的功能之一,就是当您在团队开发资源 的时候最有用啦! 举个例子来说好了,假如在我的主机上面有两个团体,这第一个团体名称为 testgroup 而他的成员是 test1, test2, test3 三个,第二个团体名称为 treatgoup 他的团员为 treat1, treat2, treat3,这两个团体之间是互相有竞争性质的, 但是却又要缴交同一份报告,然而每组团员又需要同时可 以修改自己的团体内任何人所建立的档案, 且不能让非自己团体的其它人看到自己的档案内容!这个时候 怎么办? 呵呵!在 Linux 底下可就很简单啦!我可以经由简易的档案权限设定,就能限制非自己团队( 亦即是群组 啰 )的其它人不能够阅览内容啰!而且亦可以让自己的团队成员可以修改我所建立的档案! 同时,如果我 自己还有私人隐密的文件,仍然可以设定成让自己的团队成员也看不到我的档案数据。 很方便吧! 另外,如果 teacher 这个账号是 testgroup 与 treatgroup 这两个群组的老师, 他想要同时观察两者的 进度,因此需要两边的群组都能够进去观看,这个时候,您可以设定 teacher 这个账号,『同时支持 testgroup 与 treatgroup 这两个群组!』,也就是说, 每个人都可以有多个群组的支持呢! 这样说或许你还不容易理解这个使用者与群组的关系吧?没关系,我们可以使用目前『家庭』的观念来进 行解说喔! 假设有一家人,家里只有三兄弟,分别是王大毛、王二毛与王三毛三个人, 而这个家庭是登 记在王大毛的名下的!所以,『王大毛家有三个人,分别是王大毛、王二毛与王三毛』, 而且这三个人都 有自己的房间,并且共同拥有一个客厅喔! • 由于王家三个人各自拥有自己的房间,所以,王二毛虽然可以进入王三毛的房间, 但是二毛不能 翻三毛的抽屉喔!那样会被三毛 K 的!因为抽屉里面可能有三毛自己私人的东西,例如情书啦, 日记啦等等的, 这是『私人的空间』,所以当然不能让二毛拿啰! • 由于共同拥有客厅,所以王家三兄弟可以在客厅打开电视机啦、翻阅报纸啦、坐在沙发上面发呆 啦等等的! 反正,只要是在客厅的玩意儿,三兄弟都可以使用喔!因为大家都是一家人嘛! 这样说来应该有点晓得了喔!那个『王大毛家』就是所谓的『群组』啰, 至于三兄弟就是分别为三个『使 用者』,而这三个使用者是在同一个群组里面的喔! 而三个使用者虽然在同一群组内,但是我们可以设定 『权限』, 好让某些使用者个人的信息不被群组的所有人查询,以保有个人『私人的空间』啦! 而设定 群组共享,则可让大家共同分享喔! • 其它人的概念 好了,那么今天又有个人,叫做张小猪,他是张小猪家的人,与王家没有关系啦! 这个时候,除非王家认 识张小猪,然后开门让张小猪进来王家,否则张小猪永远没有办法进入王家, 更不要说进到王三毛的房间 啦!不过,如果张小猪透过关系认识了三毛,并且跟王三毛成为好朋友, 那么张小猪就可以透过三毛进入 王家啦!呵呵!没错!那个张小猪就是所谓的『其它人, Others 』啰! 因此,我们就可以知道啦,在 Linux 里面,任何一个档案都具有『User, Group 及 Others』三个权限! 我们可以将上面的说明以底下的图示来解释: 图一、每个档案的拥有者、群组与其它人的示意图 此时,以王三毛为例,王三毛这个『档案』的拥有者为王三毛,他属于王大毛这个群组, 而张小猪相对于 王三毛,则只是一个『其它人(others)』而已。 不过,这里有个特殊的人物要来介绍的,那就是『万能的天神』!这个天神具有无限的神力, 所以他可以 到达任何他想要去的地方,呵呵!那个人在 Linux 系统中的身份代号是『 root 』啦!所以要小心喔!那 个 root 可是『万能的天神』喔! 无论如何,『使用者身份』,与该使用者所支持的『群组』概念,在 Linux 的世界里面是相当的重要的, 他可以帮助您让您的多任务 Linux 环境变的更容易管理!更详细的 『身份与群组』 设定,我们将在 账 号管理 再进行解说。底下我们将针对档案系统与档案权限来进行说明。 • Linux 使用者身份与群组记录的档案 在我们 Linux 系统当中,预设的情况下,所有的系统上的账号与一般身份使用者,还有那个 root 的相关 信息,都是记录在 /etc/passwd 这个档案内的。至于密码则是记录在 /etc/shadow 这个档案下。 此外, Linux 所有的群组名称都纪录在 /etc/group 内!这三个档案可以说是 Linux 系统里面账号、密码、群组 信息的集中地啰!不要随便删除这三个档案啊! ^_^ 至于更多的与账号群组有关的设定,还有这三个档案的格式,不要急,我们在第四篇讲到账号时, 会再跟 大家详细的介绍的!这里先有概念即可。 Linux 档案权限概念 大致了解了 Linux 的使用者与群组之后,接着下来,我们要来谈一谈, 那么这个档案的权限要如何针对 这些所谓的『使用者』与『群组』来设定该档案的权限呢? 这个部分是相当的重要的,尤其对于初学者来 说,因为档案的权限与属性是学习 Linux 的一个相当重要的关卡,如果没有这部份的概念,那么您将老是 听不懂别人在讲什么呢! 尤其是当您在您的屏幕前面出现了『Permission deny』的时候,不要担心,『肯 定是权限设定错误』啦!呵呵!好了,闲话不多聊,赶快来瞧一瞧先: Linux 档案属性 嗯!既然要让你了解 Linux 的档案属性,那么有个重要的也是常用的指令就必须要先跟你说啰!那一个?! 就是『 ls 』这一个 list 档案的指令啰!在你以 root 的身份登入 Linux 之后,下达『ls -al 』看看, 会看到底下的几个咚咚: [root@linux ~]# ls -al total 248 drwxr-x--- 9 root root 4096 Jul 11 14:58 . drwxr-xr-x 24 root root 4096 Jul 9 17:25 .. -rw------- 1 root root 1491 Jun 25 08:53 anaconda-ks.cfg -rw------- 1 root root 13823 Jul 10 23:12 .bash_history -rw-r--r-- 1 root root 24 Dec 4 2004 .bash_logout -rw-r--r-- 1 root root 191 Dec 4 2004 .bash_profile -rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc -rw-r--r-- 1 root root 100 Dec 4 2004 .cshrc drwx------ 3 root root 4096 Jun 25 08:35 .ssh -rw-r--r-- 1 root root 68495 Jun 25 08:53 install.log -rw-r--r-- 1 root root 5976 Jun 25 08:53 install.log.syslog [ 1 ][ 2 ][ 3 ][ 4 ][ 5 ][ 6 ][ 7 ] [ 属性 ][连结][拥有者][群组][档案容量][ 修改日期 ][ 檔名 ] ls 是『list』的意思,与在早期的 DOS 年代的指令 dir 类似功能。 而参数『-al』则表示列出所有的档 案 ( 包含隐藏档,就是档名前面第一个字符为 . 的那种档案 ) 。如上所示,在你第一次以 root 身份登 入 Linux 时,如果你输入指令后,应该有上列的几个东西, 先解释一下上面七个字段个别的意思: 图二、档案属性的示意图 1. 第一栏代表这个档案的属性: 这个地方最需要注意了!仔细看的话,你应该可以发现这一栏其实 共有十个属性: 图三、档案的十个属性内容 o 第一个属性代表这个档案是『目录、档案或连结文件等等』: ƒ 当为[ d ]则是目录,例如上表的第 11 行; ƒ 当为[ - ]则是档案,例如上表的第 5 行; ƒ 若是[ l ]则表示为连结档(link file); ƒ 若是[ b ]则表示为装置文件里面的可供储存的接口设备; ƒ 若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标。 o 接下来的属性中,三个为一组,且均为『rwx』 的三个参数的组合。其中,[ r ]代表可 读(read)、[ w ]代表可写(write)、[ x ]代表可执行(excute): ƒ 第一组为『拥有人的权限』,以第 5 行为例,该档案的拥有人可以读写,但不 可执行; ƒ 第二组为『同群组的权限』; ƒ 第三组为『其它非本群组的权限』。 范例:若有一个档案的属性为『-rwxr-xr--』,简单的可由下面说明之: [-][rwx][r-x][r--] 1 234 567 890 1 为:代表这个文件名为目录或档案(上面为档案) 234 为:拥有人的权限(上面为可读、可写、可执行) 567 为:同群组使用者权限(上面为可读可执行) 890 为:其它使用者权限(上面为仅可读) 上面的属性情况代表一个档案、这个档案的拥有人可读可写可执行、但同群组的人仅可读与执行, 非同群组的使用者仅可读的意思! 除此之外,需要特别留意的是 x 这个标号! 若文件名为一个目录的时候,例如上表中的 .ssh 这 个目录: drwx------ 3 root root 4096 Jun 25 08:35 .ssh 可以看到这是一个目录,而且只有 root 可以读写与执行。但是若为底下的样式时,请问非 root 的其它人是否可以进入该目录呢? drwxr--r-- 3 root root 4096 Jun 25 08:35 .ssh 咦!似乎好像是可以喔!因为有可读[ r ]存在嘛!『错!』答案是非 root 这个账号的其它使用 者均不可进入 .ssh 这个目录,为什么呢? 因为 x 与 目录 的关系相当的重要, 如果您在该目 录底下不能执行任何指令的话,那么自然也就无法进入了,因此, 请特别留意的是,如果您想要 开放某个目录让一些人进来的话, 请记得将该目录的 x 属性给开放呦!至于目录的权限相关说 明, 我们会在底下继续介绍的。 另外,你也必须要更加的小心的是,在 Windows 底下一个档案是否具有执行的能力是藉由『 附 檔名 』来判断的, 例如:.exe, .bat, .com 等等,但是在 Linux 底下, 我们的档案是否能执 行,则是藉由是否具有 x 这个属性来决定的!所以,跟档名是没有绝对的关系的! 这点还请特 别留意呢!稍后我们还会针对目录来稍作说明的 2. 第二栏表示为连结占用的节点 (i-node): 这个跟连结档 (link file) 比较有关系,我们在未来 的章节会再加以介绍的。 如果是目录的话,那么就与该目录下还有多少目录有关。 3. 第三栏表示这个档案(或目录)的『拥有人』。 4. 第四栏表示拥有人的群组。 这里再次解释一下,在 Linux 中,你的 ID ( 如 root 或 test 等账号均是所谓的 ID ) 即是你 的身份,而且你还可以附属在一个或多个群组之下,例如刚刚我们上面提到的,你有一个团体 ( 即 群组 ) 代号为 testgroup ,且这个群体里有三个人,其代号分别是 test1, test2, 与 test3, 则这三个人为同一群组即 testgroup!那么如果以上图的的档案属性(-rwxrwx---) 来看,如果该 档案属于 test1 所有,那么 test2, test3 亦有读、写、执行的权力,因为他们都属于同一个 group 呀!而如果您不是属于 test1, test2, test3 的任何一个人,也不属于 testgroup 这个 群组时,那么您将不具备读、写、执行这个档案的权限了! 5. 第五栏为这个档案的容量大小。 6. 第六栏为这个档案的建档日期或者是最近的修改日期, 分别为月份、日期及时间。请特别留意, 如果您是以繁体中文来进行安装您的 Linux 时,那么预设的语系可能会被改为中文。而 由于中 文无法显示在文字型态的终端机上面, 所以这一栏会成为怪怪的乱码,这个时候,请修改一下 /etc/sysconfig/i18n 这个档案,里面的『 LC_TIME 』修改为:『 LC_TIME=en 』再储存离开, 再登入一次,就可以得到英文字形显示的日期了! 那么如何修改该档案呢?呵呵!以 root 身份 用 vi 修改。 另外,也可以使用『 LANG=en ls -al 』之类的语法来显示。 7. 第七栏为这个档案的档名, 如果档名之前多一个『 . 』,则代表这个档案为『隐藏档』, 例如 上表第 6 行的『.bashrc_history』档名即是隐藏档,由于我们有下一个参数为 ls -al,所以连 隐藏档都列出来,如果你只输入 ls 则档名有加『 . 』的档案就不会被显示出来! Tips: 对于更详细的 ls 用法,还记得怎么查询吗?对啦!使用 man ls 或 info ls 去看看他的基础用法去!自我进修是很重要的, 因为 『师傅带进门,修行在个人!』,自古只有天才学生,没有天才老 师呦!加油吧!^_^ 这七个字段的意义是很重要的!务必清楚的知道各个字段代表的意义呢!尤其是第一个字段的十个权限, 那 是整个 Linux 档案权限的重点之一。底下我们来做几个简单的练习,您就会比较清楚啰! 假设 test1, test2, test3 同属于 testgroup 这个群组: 例题一:如果有下面的两个档案,请说明两个档案的拥有者与其相关的权限为何? -rw-r--r-- 1 root root 238 Jun 18 17:22 test.txt -rwxr-xr-- 1 test1 testgroup 5238 Jun 19 10:25 ping_tsai 答: • 档案『 test.txt 』的拥有人为 root ,群组为 root 。至于权限方面则只有 root 这 个账号可以存取此档案,其它人则仅能读此档案; • 另一个档案『 ping_tsai 』的拥有人为 test1 ,而群组为 testgroup。其中, test1 可以针对此档案具有可读可写可执行的权力,而同群组的 test2, test3 两个人与 test1 同样是 testgroup 的群组账号,则仅可读可执行但不能写 (亦即不能修改), 至于非 testgoup 这一个群组的人则仅可以读,不能写也不能执行! 例题二:如果我的目录为底下的样式,请问 testgroup 这个群组的成员与其它人( others )是 否可以进入本目录? drwxr-xr-- 1 test1 testgroup 5238 Jun 19 10:25 groups/ 答: • 档案拥有者 test1 可以在本目录中进行任何工作; • 而 testgroup 这个群组的账号,例如 test2, test3 亦可以进入本目录进行工作, 但 是不能在本目录下进行写入的动作; • 至于 other 的权限中虽然有 r ,但是由于没有 x 的权限,因此 others 的使用者, 并不能进入此目录! • Linux 档案属性的重要性: 与 Windows 系统不一样的是,在 Linux 系统(或者说 Unix-Like 系统)当中,每一个档案都多加了很多 的属性进来,尤其是群组的概念,这样有什么用途呢? 基本上,最大的用途是在『安全性』上面的。举个 简单的例子,在你的系统中,关于系统服务的档案通常只有 root 才能读写,或者是执行,例如 /etc/shadow 这一个账号管理的档案,由于该档案记录了你的系统中的所有账号的数据,因此是很重要的一个信息文件, 当然不能让任何人读取,只有 root 才能够来读取啰!所以该档案的属性就会成为 [ -rw------- ]啰! 那么,如果你有一个开发团队,在你的团队中,你希望每个人都可以使用某一些目录下的档案, 而非你的 团队的其它人则不予以开放呢?以上面的例子来说,testgroup 的团队共有三个人,分别是 test1, test2, test3 !那么我就可以将 test1 的档案属性订为 [ -rwxrwx--- ] 来提供给 testgroup 的工作团队使用 啰!这可是相当重要的。 再举个例子来说,如果你的目录权限没有作好的话,可能造成其它人都可以在你的系统上面乱搞啰!例如 本来只有 root 才能做的开关机、ADSL 的拨接程序、新增或删除使用者等等的指令,若被你改成任何人都 可以执行的话, 那么如果使用者不小心给你重新开机啦!重新拨接啦!等等的!那么你的系统不就会常常 莫名其妙的挂掉啰! 而且万一你的使用者的密码被其它不明人士取得的话,只要他登入你的系统就可以轻 而易举的执行一些 root 的工作!可怕吧!因此,在你修改你的 linux 档案与目录的属性之前, 一定要 先搞清楚,什么是可变的,什么是不可变的!千万注意啰! 如何改变档案权限 好了,我们已经知道档案权限对于一个系统的安全重要性了,也知道档案的权限对于使用者与群组的相关 性了, 好了,那么如何修改一个档案的权限呢?又!有多少档案的权限我们可以修改呢? 其实一个档案 的权限很多嘛!大致上我们先介绍几个简单的,例如:群组、拥有者、各种身份的权限等等。 • chgrp :改变档案所属群组 • chown :改变档案所属人 • chmod :改变档案的属性、 SUID 、等等的特性 • 改变所属群组, chgrp 改变一个档案的群组真是很简单的,直接以 chgrp 来改变即可,咦!这个指令就是 change group 的缩写 嘛!对啦!这样就很好记了吧! ^_^。不过,请记得, 要改变成为的群组名称必须要在 /etc/group 里面 存在的名称才行,否则就会显示错误! 假设您是以 root 的身份登入 FC4 ,那么在您的家目录内有一个 install.log 的档案, 如何将该档案的 群组改变一下呢?假设您已经知道在 /etc/group 里面已经存在一个名为 users 的群组,但是 testing 这个群组名字就不存在 /etc/group 当中了, 此时改变群组成为 users 与 testing 会有什么现象发生 呢? [root@linux ~]# chgrp [-R] dirname/filename ... 参数: -R : 进行递归( recursive )的持续变更,亦即连同次目录下的所有档案、目录 都更新成为这个群组之意。常常用在变更某一目录的情况。 范例: [root@linux ~]# chgrp users install.log [root@linux ~]# ls -l -rw-r--r-- 1 root users 68495 Jun 25 08:53 install.log [root@linux ~]# chgrp testing install.log chgrp: invalid group name `testing' <== 发生错误讯息啰~找不到这个群组名~ 发现了吗?档案的群组被改成 users 了,但是要改成 testing 的时候, 就会发生错误~注意喔!发生错 误讯息还是要努力的查一查错误讯息的内容才好! • 改变档案拥有者, chown 好了,那么如何改变一个档案的拥有者呢?很简单呀!既然改变群组是 change group ,那么改变拥有者 就是 change owner 啰!BINGO,对啦!那就是 chown 这个指令的用途,要注意的是,使用者必须是已经 存在系统中的,也就是在 /etc/passwd 这个档案中有纪录的使用者名称才行改变。 chown 的用途还满多的,他还可以顺便直接修改群组的名称呢!此外, 如果要连目录下的所有次目录或档 案同时更改档案拥有者的话,直接加上 -R 的参数即可!我们来看看语法与范例: [root@linux ~]# chown [-R] 账号名称 档案或目录 [root@linux ~]# chown [-R] 账号名称:群组名称 档案或目录 参数: -R : 进行递归( recursive )的持续变更,亦即连同次目录下的所有档案、目录 都更新成为这个群组之意。常常用在变更某一目录的情况。 范例: [root@linux ~]# chown bin install.log [root@linux ~]# ls -l -rw-r--r-- 1 bin users 68495 Jun 25 08:53 install.log [root@linux ~]# chown root:root install.log [root@linux ~]# ls -l -rw-r--r-- 1 root root 68495 Jun 25 08:53 install.log 嗯!知道如何改变档案的群组与拥有者了,那么什么时候要使用 chown 或 chgrp 呢?!或许您会觉得奇 怪吧?!是的,确实有时候需要变更档案的拥有者的, 最常见的例子就是在 copy 档案给你之外的其它人 时,我们使用最简单的 cp 来说明好了: [root@linux ~]# cp 来源档案 目的档案 假设您今天要将 .bashrc 这个档案拷贝成为 .bashrc_test ,且是要给 bin 这个人,您可以这样做: [root@linux ~]# cp .bashrc .bashrc_test [root@linux ~]# ls -al .bashrc* -rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc -rw-r--r-- 1 root root 395 Jul 13 11:31 .bashrc_test 哇!怎么办? .bashrc_test 还是属于 root 所有,如此一来,即使你将档案拿给 bin 这个使用者了,那 他仍然无法修改的( 看属性就知道了吧! ), 所以你就必须要将这个档案的拥有者与群组修改一下啰!知 道如何修改了吧!?呵呵! • 改变九个属性, chmod 档案属性的改变使用的是 chmod 这个指令,但是,属性的设定方法有两种, 分别可以使用数字或者是符 号来进行属性的变更。我们就来谈一谈: • 数字类型改变档案权限 Linux 档案的基本属性就有九个,分别是 owner/group/others 组别的 read/write/excute 属性, 先复 习一下刚刚上面提到的数据: -rwxrwxrwx 这九个属性是三个三个一组的!其中,我们可以使用数字来代表各个属性,各属性的对照表如下: r:4 w:2 x:1 同一组 (owner/group/others) 的三个属性 (r/w/x) 是需要累加的,例如当属性为 [-rwxrwx---] 则是: owner = rwx = 4+2+1 = 7 group = rwx = 4+2+1 = 7 others= --- = 0+0+0 = 0 所以等一下我们设定属性的变更时,该属性的数字就是 770 啦!变更属性的指令 chmod 的语法是这样的: [root@linux ~]# chmod [-R] xyz 档案或目录 参数: xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。 -R : 进行递归( recursive )的持续变更,亦即连同次目录下的所有档案、目录 都更新成为这个群组之意。常常用在变更某一目录的情况。 举例来说,如果要将 .bashrc 这个档案所有的属性都打开,那么就下达: [root@linux ~]# ls -al .bashrc -rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc [root@linux ~]# chmod 777 .bashrc [root@linux ~]# ls -al .bashrc -rwxrwxrwx 1 root root 395 Jul 4 11:45 .bashrc 看到了吗?属性改变了喔!由于一个档案有三组属性,所以你可以发现上面 777 为三组,而由于我们将所 有的属性都打开,所以数字都相加,亦即『 r+w+x = 4+2+1 = 7』 那如果要将属性变成『 -rwxr-xr-- 』呢?那么就成为 [4+2+1][4+0+1][4+0+0]=754 啰!所以你需要下达 chmod 754 filename。 最常发生的一个问题就是,常常我们以 vi 编辑一个 shell 的文字文件后,他的 属性通常是 -rw-rw-rw- 也就是 666 的属性,如果要将他变成可执行档,并且不要让其它人修改此一档案 的话, 那么就需要 -rwxr-xr-x 这一个 755 的属性,所以 chmod 755 test.sh 就需要这样做啰! 另外,有些档案你不希望被其它人看到,例如 -rwxr-----,那么就下达 chmod 740 filename 吧! 例题三:将刚刚您的 .bashrc 这个档案的属性改回原来的 -rw-r--r-答: chmod 644 .bashrc • 符号类型改变档案权限 还有一个改变属性的方法呦!从之前的介绍中我们可以发现,基本上就九个属性分别是(1)user (2)group (3)others 三群啦!那么我们就可以藉由 u, g, o 来代表三群的属性!此外, a 则代表 all 亦即全部的 三群!那么读写的属性就可以写成了 r, w, x 啰!也就是可以使用底下的方式来看: u +(加入) r g chmod -(除去) w o =(设定) x a 档案或目录 来实作一下吧!假如我们要『设定』一个档案的属性为『-rwxr-xr-x』时,基本上就是: • user (u):具有可读、可写、可执行的权限; • group 与 others (g/o):具有可读与执行的权限。 所以就是: [root@linux ~]# chmod u=rwx,go=rx .bashrc # 注意喔!那个 u=rwx,go=rx 是连在一起的,中间并没有任何空格符! [root@linux ~]# ls -al .bashrc -rwxr-xr-x 1 root root 395 Jul 4 11:45 .bashrc 请注意, u=rwx,og=rx 这一段文字之间并没有空格符隔开呦!不要搞错啰! 那么假如是『 -rwxr-xr-- 』? 可以使用『 chmod u=rwx,g=rx,o=r filename 』来设定。此外,如果我不知道原先的档案属性,而我只想 要增加 .bashrc 这个档案的每个人均可写入的权限,那么我就可以使用: [root@linux ~]# ls -al .bashrc -rwxr-xr-x 1 root root 395 Jul 4 11:45 .bashrc [root@linux ~]# chmod a+w .bashrc [root@linux ~]# ls -al .bashrc -rwxrwxrwx 1 root root 395 Jul 4 11:45 .bashrc 而如果是要将属性去掉而不更动其它的属性呢?!例如要拿掉所有人的 x 的属性,则: [root@linux ~]# chmod a-x .bashrc [root@linux ~]# ls -al .bashrc -rw-rw-rw- 1 root root 395 Jul 4 11:45 .bashrc 知道 +, -, = 的不同点了吗?对啦! + 与 – 的状态下,只要是没有指定到的项目, 则该属性『不会被 变动』,例如上面的例子中,由于仅以 – 拿掉 x 则其它两个保持当时的值不变!呵呵!多多实作一下, 你就会知道如何改变属性啰! 这在某些情况底下很好用的~举例来说,您想要教一个朋友如何让一个程序 可以拥有执行的权限, 但您又不知道该档案原本的权限为何,此时,利用 chmod a+x filename ,就可以 让该程序拥有执行的权限了。 是否很方便? 目录属性的意义: 刚刚上面我们提到的属性几乎都是针对一般档案的特性在说明,那么如果是针对目录时, 那个 r, w, x 对 目录是什么意义呢?简单的说: • r (read contents in directory): 表示具有读取目录结构清单的权限,所以当您具有读取 (r) 一个目录的权限时, 您就可以利用 ls 这个指令将该目录的内容列表显示出来! • w (modify contents of directory): 这个可写入的权限对目录来说,是很了不起的! 因为他 表示您将具有异动该目录结构清单的权限,也就是底下这些权限: o 建立新的档案与目录; o 删除已经存在的档案与目录(不论该档案是属于谁的!) o 将已存在的档案或目录进行更名; o 搬移该目录内的档案、目录位置。 所以说,如果您是一般身份使用者,例如鸟哥的账号 dmtsai ,那么在 /home/dmtsai 这个家目 录内, 无论是谁 (包括 root) 建立的档案,无论该档案属于谁,无论该档案的属性是什么, dmtsai 这个使用者都『有权力将该档案删除』的喔! • x (access directory): 这个在上头我们已经稍微提过了,这个 x 与能否进入该目录有关呢! 好了,那么我们来简单的做个测试看看,底下可能会有很多您没有见过的指令, 不要担心,先照著作看看, 等到未来提到该指令时,您自然就会了解了。 [root@linux ~]# cd /tmp [root@linux tmp]# mkdir testing [root@linux tmp]# chmod 744 testing [root@linux tmp]# touch testing/testing [root@linux tmp]# chmod 600 testing/testing # 这个 mkdir 是在建立目录用的指令!是 make directory 的缩写。 # 我们用 root 的身份在 /tmp 底下建立一个名为 testing 的目录, # 并且将该目录的权限变为 744 ,该目录的拥有者为 root 喔! # 另外, touch 可以用来建立一个没有内容的档案,因此, touch testing/testing # 可以建立一个空的 /tmp/testing/testing 档案喔! [root@linux tmp]# ls -al drwxr--r-- 2 root root 4096 Jul 14 01:05 testing # 仔细看一下,目录的权限是 744 ,且所属群组与使用者均是 root 喔! # 接下来,我们将 root 的身份切换成为一般身份使用者。 # 鸟哥的系统里面有个 dmtsai 的一般身份使用者账号,所以切换身份成为 dmtsai [root@linux tmp]# su dmtsai # 那个 su 的指令是用来『变换身份』的一个指令,我们未来会详细介绍。 # 注意看,底下这一行中,发现使用者变为 dmtsai 了,而且提示字符变成 $ 了! # 也就是说,现在操作系统的人变成 dmtsai 了!那么 dmtsai 这个人对于 # /tmp/testing 是属于 others 的权限,那他可以对 /tmp/testing 干嘛? [dmtsai@linux tmp]$ ls -l testing <== 此时身份为 dmtsai total 0 ?--------- ? ? ? ? ? testing # 可以查阅里面的信息喔!因为 dmtsai 具有 r 的权限,不过,毕竟权限不够, # 很多资料竟然是问号 (?) 来的~怪怪的紧~ [dmtsai@linux tmp]$ cd testing <== 此时身份为 dmtsai bash: cd: testing/: Permission denied # 发现了吗?即使我们具有 r 的权限,但是没有 x ,所以 # dmtsai 无法进入 /tmp/testing 喔! [dmtsai@linux tmp]$ exit [root@linux tmp]# chown dmtsai testing # 使用 exit 就可以离开 su 的功能了。我们将这个 testing 目录的拥有者设定为 # dmtsai ,此时 dmtsai 就成为 owner 了,那么这个使用者又能干麻呢? [root@linux tmp]# su dmtsai [dmtsai@linux tmp]$ cd testing <== 此时身份为 dmtsai [dmtsai@linux testing]$ ls -l <== 此时身份为 dmtsai -rw------- 1 root root 0 Jul 14 01:13 testing # 再切换身份成为 dmtsai ,此时就能够进入 testing 了!查阅一下内容。 # 发现了 testing 这个档案存在喔!权限是只有 root 才能够存取~ # 那我们测试一下能否删除呢? [dmtsai@linux testing]$ rm testing <== 此时身份为 dmtsai rm: remove write-protected regular empty file `testing'? y # 竟然可以删除!这样理解了吗?! 透过上面这个简单的步骤,您就可以清楚的知道, x 在目录当中是与『能否进入该目录』有关, 至于那 个 w 则具有相当重要的权限,因为他可以让使用者删除、更新、新建档案或目录, 是个很重要的参数啊! 这样可以理解了吗?! ^_^ Linux 档案种类与附档名 我们在学习 Linux 之前,就跟大家灌输过一个概念,那就是,任何装置在 Linux 底下都是档案, 不仅如 此,连数据沟通的接口也有专属的档案在负责~所以,您会了解到, Linux 的档案种类真的很多~ 除了 前面提到的那个 -, d 亦即所谓的一般档案与目录档案之外,还有哪些种类的档案呢? • 档案种类: 我们在刚刚的属性介绍中提到了最前面的标志 ( d 或 - ) 可以代表目录或档案,那就是不同的档案种类 啦!Linux 的档案种类主要有底下这几种: • 正规档案 (regular file ): 就是一般我们在进行存取的类型的档案,在由 ls –al 所显示出 来的属性方面,第一个属性为 [ - ],例如 [-rwxrwxrwx ]。另外,依照档案的内容,又大略可 以分为: o 纯文字文件(ASCII):这是 Unix 系统中最多的一种档案类型啰,称为纯文字文件是因为 内容为我们人类可以直接读到的数据, 例如数字、字母等等。几乎只要我们可以用来做 为设定的档案都属于这一种档案类型。 举例来说,您可以下达『 cat ~/.bashrc 』就 可以看到该档案的内容。 (cat 是将一个档案内容读出来的指令) o 二进制文件(binary):还记得我们在『 Linux 是什么 』那一章里面的 GNU 发展史中提 过, 我们的系统其实仅认识且可以执行二进制档案 (binary file) 吧?没错~ 您的 Linux 当中的可执行档 (scripts, 文字型批次文件不算) 就是这种格式的啦~ 举例来 说,刚刚下达的指令 cat 就是一个 binary file 。 o 数据格式文件(data): 有些程序在运作的过程当中会读取某些特定格式的档案,那些特 定格式的档案可以被称为数据文件 (data file)。举例来说,我们的 Linux 在使用者登 入时,都会将登录的数据记录在 /var/log/wtmp 那个档案内,该档案是一个 data file ,他能够透过 last 这个指令读出来! 但是使用 cat 时,会读出乱码~因为他是 属于一种特殊格式的档案。瞭乎? • 目录 (directory):就是目录啰~第一个属性为 [ d ],例如 [drwxrwxrwx]。 • 连结档 (link):就是类似 Windows 底下的快捷方式啦!第一个属性为 [ l ], 例如 [lrwxrwxrwx] ; • 设备与装置文件 (device):与系统周边及储存等相关的一些档案, 通常都集中在 /dev 这个目 录之下!通常又分为两种: o 区块 (block) 设备档 :就是一些储存数据, 以提供系统存取的接口设备,简单的说就 是硬盘啦!例如你的一号硬盘的代码是 /dev/hda1 等等的档案啦!第一个属性为 [ b ]; o 字符 (character) 设备档 :亦即是一些串行端口的接口设备, 例如键盘、鼠标等等! 第一个属性为 [ c ]。 • 资料接口文件 (sockets):既然被称为数据接口文件, 想当然尔,这种类型的档案通常被用在网 络上的数据承接了。我们可以启动一个程序来监听客户端的要求, 而客户端就可以透过这个 socket 来进行数据的沟通了。第一个属性为 [ s ], 最常在 /var/run 这个目录中看到这种档 案类型了。 • 数据输送文件 (FIFO, pipe): FIFO 也是一种特殊的档案类型,他主要的目的在解决多个程序同 时存取一个档案所造成的错误问题。 FIFO 是 first-in-first-out 的缩写。第一个属性为 [p] 。 那么使用刚刚的『 ls -al 』这个指令,你就可以简单的经由判断每一个档案的 第一个属性来了解这个档 案是何种类型!很简单吧! 除了设备文件是我们系统中很重要的档案,最好不要随意修改之外(通常他也 不会让你修改的啦!), 另一个比较有趣的档案就是连结档。如果你常常将应用程序捉到桌面来的话,你 就应该知道在 Windows 底下有所谓的『快捷方式』。同样的,你可以将 linux 下的连结档简单的视为一 个档案或目录的快捷方式。至于 socket 与 FIFO 档案比较难理解, 因为这两个咚咚与程序 (process) 比 较有关系,这个等到未来您了解 process 之后,再回来查阅吧!此外,也可以透过 man fifo 及 man socket 来查阅系统上的说明! • Linux 档案附档名: 基本上, Linux 的档案是没有所谓的『附档名』的,因为由前面的说明我们可以知道, 一个 Linux 档案 能不能被执行,与他的第一栏的十个属性有关, 与文件名根本一点关系也没有。这个观念跟 Windows 的 情况不相同喔!在 Windows 底下,能被执行的档案附档名通常是 .com .exe .bat 等等,而在 Linux 底 下, 只要你的属性当中有 x 的话,例如 [ -rwx-r-xr-x ] 即代表这个档案可以被执行喔! 不过,可以被执行跟可以执行成功是不一样的~举例来说,在 root 家目录下的 install.log 是一个纯文 字文件,如果经由修改权限成为 -rwxrwxrwx 后,这个档案能够被执行吗? 当然不行~因为他的内容根本 就没有可以执行的数据。所以说,这个 x 代表这个档案具有可执行的能力, 但是能不能执行成功,当然 就得要看该档案的内容啰~ 虽然附档名没有什么真的帮助,不过,由于我们仍然希望可以藉由附档名来了解该档案是什么东西?!所 以, 通常我们还是会以适当的附档名来表示该档案是什么种类的。底下有数种常用的附档名: • *.sh : 批次檔 ( scripts ),因为批次档为使用 shell 写成的,所以附档名就编成 .sh 啰; • *Z, *.tar, *.tar.gz, *.zip, *.tgz: 经过打包的压缩档。这是因为压缩软件分别为 gunzip, tar 等等的,由于不同的压缩软件,而取其相关的附档名啰! • *.html, *.php:网页相关档案,分别代表 HTML 语法与 PHP 语法的网页档案啰! .html 的档案 可使用网页浏览器来直接开启,至于 .php 的档案, 则可以透过 client 端的浏览器来 server 端浏览,以得到运算后的网页结果呢! 另外,还有程序语言如 perl 的档案,其附档名也可能取成 .pl 这种档名!基本上, Linux 上面的档名 真的只是让你了解该档案可能的用途而已, 真正的执行与否仍然需要属性的规范才行!例如虽然有一个档 案为可执行文件,如有名的代理服务器软件 squid ,不过,如果这个档案的属性被修改成无法执行时,那 么他就变成不能执行啰! 这种问题最常发生在档案传送的过程中。例如你在网络上下载一个可执行档,但 是偏偏在你的 Linux 系统中就是无法执行!呵呵!那么就是可能档案的属性被改变了!不要怀疑,从网络 上传送到你的 Linux 系统中,档案的属性确实是会被改变的喔! 再提个另外!在 Linux 底下,每一个档案或目录的文件名最长可以到达 255 的字符,加上完整路径时, 最长可达 4096 个字符,是相当长的档名喔!我们希望 Linux 的文件名称可以一看就知道该档案在干嘛的, 所以档名通常是很长很长!而用惯了 Windows 的人可能会受不了,因为文件名称通常真的都很长,对于用 惯 Windows 而导致打字速度不快的朋友来说,嗯!真的是很困扰.....不过,只得劝您好好的加强打字的 训练啰! 而由前面一章的热键您也会知道,其实可以透过 [tab] 按键来确认档案的文件名的!这很好用 啊! 当然啦,如果您已经读完了本书第三篇关于 BASH 的用法,那么您将会发现 『哇!变量真是一个相 当好用的东西吶!』 嗯!看不懂,没关系,到第三篇谈到 bash 再说! • Linux 文件名称的限制: 由于 Linux 在文字接口下的一些指令操作关系,一般来说,您在设定 Linux 底下的文件名称时, 最好可 以避免一些特殊字符比较好!例如底下这些: *?><;&![]|\'"`(){} 因为这些符号在文字接口下,是有特殊意义的!另外,文件名称的开头为小数点『.』时, 代表这个档案 为『隐藏档』喔!同时,由于指令下达当中,常常会使用到 -option 之类的参数, 所以您最好也避免将 档案档名的开头以 - 或 + 来命名啊! Linux 目录配置 在了解了每个档案的相关种类与属性,以及了解了如何更改档案属性的相关信息后,再来要了解的就是, 为 什么每套 Linux distributions 他们的设定档啊、执行文件啊、每个目录内放置的咚咚啊,其实都差不多? 原来是有一套标准依据的哩!我们底下就来瞧一瞧。 Linux 目录配置的依据 FHS 因为 Linux 的开发者实在太多了,如果每个人都发展出属于自己的目录配置方法, 那么将可能会造成很 多管理上的困扰。您能想象,您进入一个企业之后,所接触到的 Linux 目录配置方法竟然跟您以前学的完 全不同吗?!很难想象吧~所以,后来就有所谓的 Filesystem Hierarchy Standard (FHS) 标准的出炉了! 这个 FHS ( http://www.pathname.com/fhs/ ) 事实上仅是规范出在根目录 ( / ) 底下各个主要的目录应 该是要放置什么样的档案而已。 FHS 定义出两层规范出来,第一层是 / 底下的各个目录应该要放置什么 样内容的档案数据,例如 /etc 应该要放置设定档, /bin 与 /sbin 则应该要放置可执行档等等。第二层 则是针对 /usr 及 /var 这两个目录的次目录来定义的。 例如 /var/log 放置系统登录文件、 /usr/share 放置共享数据等等。 由于 FHS 仅是定义出最上层 (/) 及次层 (/usr, /var) 的目录内容应该要放置的档案数据, 因此,在其 它个次目录层级内,就可以随开发者自行来配置了。举例来说, FC4 的网络设定数据放在 /etc/sysconfig/network-script/ 目录下,但是 SuSE Server 9 则是将网络放置在 /etc/sysconfig/network/ 目录下,目录名称可是不同的呢! 另外,在 Linux 底下,所有的档案与目录都是由根目录 / 开始的!那是所有目录与档案的源头~ 然后再 一个一个的分支下来,有点像是树枝状啊~因此,我们也称这种目录配置方式为:『目录树 (directory tree)』 这个目录树有什么特性呢?他主要的特性有: • 目录树的启始点为根目录 (/, root); • 每一个目录不止能使用本地端的 partition 的档案系统,也可以使用网络上的 filesystem 。举 例来说, 可以利用 Network File System (NFS) 服务器挂载某特定目录等。 • 每一个档案在此目录树中的文件名(包含完整路径)都是独一无二的。 此外,根据档名写法的不同,也可将所谓的路径 (path) 定义为绝对路径 (absolute) 与相对路径 (relative)。 绝对路径为:由根目录 (/) 开始写起的文件名或目录名称, 例如 /home/dmtsai/.bashrc; 相对路径为相对于目前路径的文件名写法。 例如 ./home/dmtsai 或 ../../home/dmtsai/ 等等。反正开 头不是 / 就属于相对路径的写法, 而您必须要了解,相对路径是以『您当前所在路径的相对位置』来表 示的。举例来说,您目前在 /home 这个目录下, 如果想要进入 /var/log 这个目录时,可以怎么写呢? • cd /var/log (absolute) • cd ../var/log (relative) 因为您在 /home 底下,所以要回到上一层 (../) 之后,才能继续往 /var 来移动的! 特别注意这两个特 殊的目录: • . :代表当前的目录,也可以使用 ./ 来表示; • .. :代表上一层目录,也可以 ../ 来代表。 这个 . 与 .. 目录概念是很重要的,您常常会看到 cd .. 或 ./command 之类的指令下达方式, 就是代 表上一层与目前所在目录的工作状态喔!很重要的吶!此外,针对『档名』与『完整档名 (由 / 开始写起 的文件名)』 的字符限制大小为: • 单一档案或目录的最大容许文件名为 255 个字符; • 包含完整路径名称及目录 (/) 之完整档名为 4096 个字符。 我们知道 /var/log/ 底下有个文件名为 message ,这个 message 档案的最大的档名可达 255 个字符。 var 与 log 这两个上层目录最长也分别可达 255 个字符。但总的来说,由 /var/log/messages 这样完整 档名最长则可达 4096 个字符。这样可以理解了吧!? ^_^ Tips: 这个 root 在 Linux 里面的意义真的很多很多~多到让人搞不懂 那是啥玩意儿。 如果以『账号』的角度来看,所谓的 root 指的 是『系统管理员!』的身份, 如果以『目录』的角度来看,所谓 的 root 意即指的是根目录,就是 / 啦~ 要特别留意喔! 目录配置的内容 从前一小节的说明,您可以了解的是, FHS 定义出两层目录内的规范,那么如果您来到根目录查阅目录数 据, 会显示什么呢? [root@linux ~]# ls -l / drwxr-xr-x 2 root root 4096 Jul 14 05:22 bin drwxr-xr-x 3 root root 4096 Jul 9 05:18 boot drwxr-xr-x 9 root root 4880 Jul 11 00:45 dev drwxr-xr-x 6 root root 4096 Jun 29 01:06 disk1 drwxr-xr-x 3 root root 4096 Jun 25 08:53 disk2 drwxr-xr-x 83 root root 12288 Jul 14 05:23 etc drwxr-xr-x 6 root root 4096 May 30 20:07 home drwxr-xr-x 10 root root 4096 Jul 14 05:23 lib drwx------ 2 root root 16384 Jun 25 16:21 lost+found drwxr-xr-x 3 root root 4096 Jun 25 19:34 media drwxr-xr-x 2 root root 4096 Apr 25 23:54 misc drwxr-xr-x 2 root root 4096 May 23 12:28 mnt drwxr-xr-x 2 root root 4096 May 23 12:28 opt dr-xr-xr-x 59 root root 0 Jul 10 01:25 proc drwx------ 9 root root 4096 Jul 13 11:31 root drwxr-xr-x 2 root root 4096 Jul 14 05:22 sbin drwxr-xr-x 2 root root 4096 Jun 25 08:23 selinux drwxr-xr-x 2 root root 4096 May 23 12:28 srv drwxr-xr-x 10 root root 0 Jul 10 01:25 sys drwxr-xr-x 10 root root 4096 Jun 25 20:24 system drwxrwxrwt 10 root root 4096 Jul 14 05:23 tmp drwxr-xr-x 14 root root 4096 Jun 25 08:27 usr drwxr-xr-x 24 root root 4096 Jun 25 20:16 var 从属性的角度来看,上面的档名每个都是『目录名称』,较为特殊的是 root ,由于 root 这个目录是管 理员 root 的家目录,这个家目录可重要了! 所以一定要设定成较为严密的 700 ( rwx------ )这个属性 才行吶!如果以较为完整的树状目录来视察的话, 可以将整个 Linux 的树状目录绘制成下图: 图四、根据 FHS 定义的各层目录相关性 请注意,每个目录都是依附在 / 这个根目录底下的,所以我们在安装的时候一定要有一个 / 对应的 partition 才能安装的原因即在于此!这也就是我们俗称的『树状目录』啰!而根据 FHS 定义出来的每个 目录内应该放置的档案内容为: 目录 / 应放置档案内容 根目录 root (/),一般建议在根目录底下只接目录,不要直接有档案在 / 底下。 根目录是开机的时候系统第一个挂载的 partition ,所以,所有开机过程会用到 的档案, 应该都要放置在这个 partition 当中。举例来说, /etc, /bin, /dev, /lib, /sbin 这五个次目录都应该要与根目录连在一起,不可独立成为某个 partition 呢! /bin, /usr/bin, /usr/local/bin 除了 /bin 之外, /usr/local/bin, /usr/bin 也是放置『使用者可执行的 binary file 的目录』喔!举例来说, ls, mv, rm, mkdir, rmdir, gzip, tar, cat, cp, mount 等等重要指令都放在这个目录当中。 /boot 这个目录主要的目的是放置 Linux 系统开机会用到的档案。 开机会用到什么呢? 没错~就是 Linux 的核心档案。这个目录底下文件名为 vmlinuz 的就是 Linux 的 Kernel 啦!粉重要的东西!而如果你的开机管理程序 (loader) 选择 grub 的 话,那么这个目录内还有 /boot/grub 这个次目录呦! /dev 在 Linux 系统上,任何装置与接口设备都是以档案的型态存在于这个目录当中的。 您只要透过存取这个目录底下的某个档案,就等于存取某个装置啰~ 主要又分为 接口设备 (character device),例如键盘、鼠标等;以及储存设备 (block device), 例如硬盘、光盘等等。在此目录下的档案会多出两个属性,分别是 major device number , 与 minor device number 。我们的系统核心就是透过这两个 number 来 判断装置的呢! 比要重要的档案有 /dev/null, /dev/tty[1-6], /dev/ttyS*, /dev/lp*, /dev/hd*, /dev/sd* 等等 系统主要的设定文件几乎都放置在这个目录内,例如人员的账号密码文件、 各种 服务的启始档等等。一般来说,这个目录下的各档案属性是可以让一般使用者查阅 的, 但是只有 root 有权力修改。并且在此目录下的档案几乎都是 ASCII 的纯文 本文件哩。 不过, FHS 建议不要放置可执行文件在这个目录中喔。比较重要的档 案有: /etc/inittab, /etc/init.d/, /etc/modprobe.conf, /etc/X11, /etc/fstab, /etc/sysconfig/ 等等。另外,其下重要的目录有: /etc • /etc/init.d/:所有服务的预设启动 script 都是放在这里的,例如要启 动或者关闭 iptables 的话: /etc/init.d/iptables start /etc/init.d/iptables stop • /etc/xinetd.d/:这就是所谓的 super daemon 管理的各项服务的设定文 件目录。 • /etc/X11:与 X Window 有关的各种设定档都在这里,尤其是 xorg.conf 或 XF86Config 这两个 X Server 的设定档。 /home 这是系统预设的使用者家目录 (home directory)。在你新增一个一般使用者账号 时, 预设的使用者家目录都会规范到这里来。比较重要的是,家目录有两种代号 喔: ~:代表目前这个使用者的家目录,而 ~dmtsai :则代表 dmtsai 的家目录! /lib, /usr/lib, /usr/local/lib 系统会使用到的函式库放置的目录。 程序在运作的过程中,可能会呼叫一些额外 的功能参数,那需要函式库的协助! 这些函式库就放在此处。比较重要的是 /lib/modules 这个目录内会摆放 kernel 的相关模块喔! /lost+found 系统不正常产生错误时,会将一些遗失的片段放置于此目录下, 通常这个目录会 自动出现在某个 partition 最顶层的目录下。例如你加装一棵硬盘于 /disk 中, 那在这个目录下就会自动产生一个这样的目录 /disk/lost+found /mnt /media 这是软盘与光盘预设挂载点的地方;通常软盘挂在 /mnt/floppy 下,而光盘挂在 /mnt/cdrom 下,不过也不一定啦!只要你高兴,随便找一个地方来挂载也可以呀! 另外,目前也规划出另一个 /media 的目录呢!与 /mnt 有点类似啦~ /opt 这是给主机额外安装软件所摆放的目录。举例来说, FC4 使用的是 Fedora 社群 开发的软件, 如果您今天想要自行安装新的 KDE 桌面软件的话,可以将该软件安 装在这个目录下的意思。 不过,以前的 Linux 系统中,我们还是习惯放置在 /usr/local 目录下呢! /proc 这个目录本身是一个『虚拟档案系统』喔!他放置的数据都是在内存当中, 例如 系统核心、形成信息、接口设备的状态及网络状态等等。因为这个目录下的数据都 是在内存当中, 所以本身不占任何硬盘空间啊!比较重要的档案例如: /proc/cpuinfo, /proc/dma, /proc/interrupts, /proc/ioports, /proc/net/* 等 等。 /root 系统管理员 (root) 的家目录。之所以放在这里, 是因为我们提过,系统第一个 开机就被挂载的 partition 为 / , 而我们希望 /root 能够与 / 放在同一块 partition 上面之故。 放置一些系统管理员才会动用到的执行指令,例如: fdisk, mke2fs, fsck, /sbin, mkswap, mount 等等。与 /bin 不太一样的地方,这几个目录是给 root 等系统管 /usr/sbin, 理用的。但是本目录下的执行文件还是可以让一般使用者用来『察看』而不能设定 /usr/local/sbin 喔! /srv 一些服务启动之后,这些服务所需要取用的数据目录。举例来说,WWW 服务器需要 的网页资料就可以放置在 /srv/www 里面。 /tmp 这是让一般使用者或者是正在执行的程序暂时放置档案的地方。 这个目录是任何 人都能够存取的,所以您需要定期的清理一下。当然,重要数据不可放置在此目录 啊! 由 FHS 规范的第二层内容,在 /usr 此目录下,包含系统的主要程序、 图形接口 所需要的档案、额外的函式库、本机端所自行安装的软件,以及共享的目录与文件 等等, 都可以在这个目录当中发现。事实上,他有点像是 Windows 操作系统当中 的『Program files』与 『WinNT』这两个目录的结合!在此目录下的重要次目录 有: /usr • /usr/bin, /usr/sbin:一般身份使用者与系统管理员可执行的档案放置 目录; • /usr/include:c/c++等程序语言的档头 (header) 与包含档(include) 放置处, 当我们以 tarball 方式 (*.tar.gz 的方式安装软件) 安装某 些数据时,会使用到里头的许多包含档喔!; • /usr/lib:各应用软件的函式库档案放置目录; • /usr/local:本机端自行安装的软件预设放置的目录。目前也适用于 /opt 目录。 在你安装完了 Linux 之后,基本上所有的配备你都有了,但是软 件总是可以升级的, 例如你要升级你的 proxy 服务,则通常软件预设的 安装地方就是在 /usr/local (local 是『当地』的意思),同时,安装完 毕之后所得到的执行文件,为了与系统原先的执行文件有分别, 因此升 /var 级后的执行档通常摆在 /usr/local/bin 这个地方。给个建议啦, 通常 鸟哥都会将后来才安装上去的软件放置在这里,因为便于管理呦; • /usr/share:共享文件放置的目录,例如底下两个目录: • /usr/share/doc:放置一些系统说明文件的地方,例如你安装了 grub 了, 那么在该目录底下找一找,就可以查到 lilo 的说明文件了!很是便利! • /usr/share/man:manpage 的文件档案目录;那是什么?呵呵! 就是你 使用 man 的时候,会去查询的路径呀!例如你使用 man ls 这个指令时, 就会查出 /usr/share/man/man1/ls.1.gz 这个说明档的内容啰! • /usr/src:Linux 系统相关的程序代码放置目录,例如 /usr/src/linux 为核心原始码! • /usr/X11R6:系统内的 X Window System 所需的执行档几乎都放在这! 这个目录也很重要,也是 FHS 规范的第二层目录内容。他主要放置的是针对系统 执行过程中,常态性变动的档案放置的目录。举例来说,例如快取档案 (cache) 或 者是随时变更的登录档 (log file) 都是放在这个目录中的。此外,某些软件执行 过程中会写入的数据库档案, 例如 MySQL 数据库,也都写入在这个目录中!很重 要吧!他底下的重要目录有: • /var/cache:程序档案在运作过程当中的一些暂存盘; • /var/lib:程序本身执行的过程中,需要使用到的数据文件放置的目录, 举例来说, locate 这个数据库与 MySQL 及 rpm 等数据库系统,都写在 这个目录内。 • /var/log:登录文件放置的目录。很重要啊!例如 /var/log/messages 就 是总管所有登录档的一个档案! • /var/lock:某些装置具有一次性写入的特性,例如 tab (磁带机), 此 时,为了担心被其它人干扰而破坏正在运作的动作,因此,会将该装置 lock (锁住)起来, 以确定该装置只能被单一个程序所使用啊! • /var/run:某些程序或者是服务启动后,会将他们的 PID 放置在这个目 录下喔! • /var/spool:是一些队列数据存放的地方。举例来说,主机收到电子邮件 后, 就会放置到 /var/spool/mail 当中,若信件暂时发不出去,就会放 置到 /var/spool/mqueue 目录下, 使用者工作排程 (cron) 则是放置在 /var/spool/cron 当中! 需要特别注意的目录 在上一节当中我们大约了解了各个目录下所放置的档案的用途。或许您会看得很吃力,不过,不要担心, 等 到后面的章节看完后,再回来这里瞧一瞧,就会很清楚的知道每个目录的意义啰!而这些目录当中, 有几 个比较有趣的目录还是需要特别来提醒一下的: • 建议不可与 root partition 分开的目录 我们在 安装 FC4 那个章节里面,有提到磁盘分割 (partition) 的概念对吧!在 Linux 的安装里面,最 重要的就是根目录 / 所在的那个 partition 了。 我们也可以将其它的例如 /home 放在不同的 partition 里面。那么是否有『一定』要放在 root partition 内的目录呢?有啊!那就是: /etc/, /sbin/, /bin/, /dev/ 以及 /lib/ 这几个目录了。 为什么呢?因为我们的 Linux 系统在开机的时候,一开始进行核心加载时, 只会挂载一个 partition , 那就是 / 。但是开机的时候会用到很多的指令与函式库,举例来说,要挂载, 就得需要 mount 这支程序, 而且我们也需要 init 这支程序,还需要用到很多的设定档,例如 /etc/inittab 等等。而我们核心的模 块则是放置在 /lib 里面。当然, /dev 是所有装置放置的目录, 也需要在开机的时候使用到的。因此, 这些目录都需要跟 / 绑在一起喔! 先有概念即可,下面两章会跟您介绍所谓的 partition 概念的! • 建议最好独立成为单一 partition 的目录 上面提到的是最好不要跟 / 这个 partition 分离的目录。至于有些目录则是因为安全性与特殊功能性, 而希望能够独立成为一个自己的 partition 呢!例如: /home, /usr, /var, /tmp 等等。 我们必须要先知道的,系统上的使用者个人家目录在 /home 里面, 这个目录也是可能被使用的最频繁的 目录之一。此外,为了资源分配较为平均, 我们可能会希望针对每个人限制他可以使用的最大硬盘总量 (quota),在这个前提之下, 您就必须要将 /home 独立出来,而且最好这个 partition 能够大一点,尤 其是您的 Linux 是作为档案服务器 (file server) 时,就更形重要了。 至于 /usr 则是一些程序安装的目录,也可以独立出来的;还有 /var/, 这个目录由于记录了相当多的常 用数据,读取真的是很频繁,所以是『很容易挂点的 partition 一!』如果能够将他独立出来,那么当 /var/ 真的、万一、不小心挂点时,就不会影响到其它的 partition , 最起码能有一定程度的安全性啦! • 特别重要的几个目录 除了针对 partition 的观念来谈目录的重要性之外,有几个比较重要的目录您也需要了解一下: • /etc:这个目录是系统设定文件放置的地方, 包括您系统上的账号与密码 (/etc/passwd, /etc/shadow),还有开机时所要用到的各项设定值 (/etc/sysconfig/*) ,还有各主要的网络服 务的设定文件,都在这个目录中。 意思就是说,如果这个目录底下的档案被删除或者是死掉了, 嘿嘿~ 您的系统大概也就需要『很花功夫』的重建了~ ^_^。因此, 一般鸟哥都会定期将这个 目录的所有档案给他备份下来, 反正这个目录的大小应该不会超过 50MB 才对,多多备份,有备 无患啊! • /usr/local:虽然说目前已经将这个目录的重要性移动到 /opt 了, 但是鸟哥还是比较习惯将我 自己开发或自行额外安装的软件放置在这个 /usr/local 目录下。 如果您的 Linux 系统是多人 共管的话,那么,养成一个良好的操作习惯是有必要的。 那么安装软件的习惯也要好好建立起来 啊~不要随意安装呢! 统一放置在 /usr/local 或者是 /opt 底下吧! ^_^ • /var:在上面提过一次,这里再次强调。 这个目录是在管理系统运作过程中的重要中间暂存数据 的,例如 /var/lib 与 /var/run 。 此外,最终的数据例如邮件 /var/spool/mail 也是放置在 这个目录中~ 另外,几乎所有服务的登录文件 (可以记录谁、什么时候、由哪里登入主机、做了 什么事等等信息!) 都放在 /var/log 这个目录下,因此,这个目录也很重要。记得常常去检查 /var/log/messages 这个档案是否有异常啊~ 一般主机 partition 与目录的配置情况 好了,知道了 Linux 的档案权限,目前也知道了各个档案内可能摆放的数据是什么了, 那么再来说说你 的目录与磁盘分割之间的相关性。通常一般的大型主机都不会将所有的数据放置在一个磁盘中 ( 就是只有 一个『 / 』根目录 ),这有几个目的: • 安全性考虑: 你的系统通常是在 /usr/ 中,而个人数据则可能放置在 /home 当中,至于一些开机数据则放置 在 /etc 当中。如果将所有的数据放在一起,当你的系统不小心被黑客破坏,或者不小心自己砍 了一个小东西, 则所有的咚咚也都跟着不见了.....这对于我们市井小民或许无所谓,再安装一 次就好了, 但是对于一些大型企业可不行这样!因此需要将数据分别放置于不同的磁盘中,会比 较保险些。 • 便利性: 如果你需要升级你的系统的话,是否需要重新 format 安装呢?有些数据例如 /home 里面的数据 为个人用户的数据,似乎与系统无关!所以如果你将这些数据分别放置于不同的磁盘, 则你要升 级或者进行一些系统更动时,将比较有弹性。 你或许可以将你的系统做成这样的 partition 分布: / /boot /usr /home /var 这是比较常见的磁盘分布情况,其中: • / 根目录可以分配约 1 GB 以内; • /boot 大概在 50 MB 就可以了,因为开机档案并不大; • /var 就至少需要 1GB 以上,因为你的 mail 、 proxy 预设的储存区都在这个目录中,除非你要 将一些设定改变! • /home 与 /usr 通常是最大的,因为你所安装的数据都是在 /usr/ 当中,而用户数据则放置在 /home 当中,因此通常大家都会建议你将所剩下的磁盘空间平均分配给这两个目录说! 不过也不 一定啦! /usr 大概给个 10G 就很多了~其它的可以都给 /home ,也可以保留一些剩余空间来 作为以后的安装与设定用啊! 无论如何,每部主机的环境与功能用途都不相同,自然其磁盘的分配就会不太一样,因此, 上面的设定您 就看看就好,等您将整本书或者整个网页内容全 K 完了,那么大概就知道怎样设定您的主机最恰当啦! Linux 支持的档案系统 我们在本章前面提到的都是单一档案的属性与相关信息,以及单一目录在 Filesystem Hierarchy Standard (FHS) 当中的定义,还没有提到所谓的 partition 的相关概念。底下我们就约略来谈一谈,那么我们前面 提到的这些档案、目录, 是放在什么样的档案系统内呢? 什么是档案系统 (filesystem) 呢?目前的操作系统大多数是将数据由硬盘读出来的, 那么每个操作系统 使用的硬盘在 x86 架构上的,都一样啊!都是同样的硬盘。 但是,每种操作系统都有其独特的读取档案 的方法,也就是说, 每种操作系统对硬盘读取的方法不同,所以就造就了不同的档案系统了。 举例来说, Windows 98 预设的档案系统是 FAT (或 FAT16) 档案系统, Windows 2000 有所谓的 NTFS 档 案系统,至于 Linux 的正统档案系统则为 ext2 ( Linux second extended file system, ext2fs ) 这一 个。 我们的系统能不能读取某个档案系统,与前面提过的『核心功能』有关。 Linux 核心必须要能够认 识某种档案系统后,我们的 Linux 才能读取该档案系统的数据内容啊! 也就是说,你必须要将你所想要 支持的档案系统编译到你的核心当中才能被支持 。因此,您可以发现, Windows 与 Linux 安装在同一个 硬盘的不同 partition 时, Windows 将不能取用 Linux 的硬盘数据, Why ? 就因为 Windows 的核心不 认识 Linux 的档案系统呀! 目前 Fedora Core IV 预设的档案系统为 ext3 (Third Extended File System), 他是 Ext2 的升级版, 主要是增加了日志 (journaling) 的功能,但是 ext3 还是向下支持 ext2 等。 另外,如果你需要将你原 有的 Windows 系统也挂载在 Linux 底下的话,那么 Linux 同时也支持 MS-DOS, VFAT, FAT, BSD 等等的 档案系统。至于 Window NT 的 NTFS 档案系统则不见得每一个 Linux distribution 都有支持,例如我们 的 FC4 预设就没有支持了。 问我怎么看出来的?呵呵! Linux 能够支持的档案系统与核心是否有编译进 去有关, 所以你可以到你的 Linux 系统的: /lib/modules/`uname -r`/kernel/fs 该目录底下看一看,如果有你想要的档案系统,那么这个核心就有支持啦! 很多 Linux 所需要的功能都 可以在 ext2 上面完成,不过 ext2 缺乏日志管理系统, 如果发生问题时,修复过程会比较慢一些。所以 最近释出的 Linux distribution 大多已经预设采用 ext3 或 reiserfs 这种具有日志式管理的档案系统 了。 那么什么是日志式档案系统呢?举例来说, ext3 与 ext2 有啥不同? ext3 其实只是多做了一个日志式 数据的纪录。当我们要在将数据写入硬盘时, ext2 是直接将数据写入,但是 ext3 则会将这个『要开始 写入』的讯息写入日志式记录区, 然后才开始进行数据的写入。在数据写入完毕后,又将『完成写入动作』 的讯息写入日志式记录区, 这有什么好处呢?最大的好处就是数据的完整性与『恢复力』。 什么是『恢复力』呢?早期的 ext2 档案系统如果发生类似断电后时,档案系统就得要检查档案一致性。 这 个检查的过程要将整个 partition 内的档案做一个完整的比较,哇!很慢很慢、很久很久啊~ 如果是 ext3 的话,那么只要透过检查『日志记录区』就可以知道断电时,是否有哪些档案正在进行写入的动作, 只要 检查这些地方即可~这样就能够节省很多档案检查的时间呢! 这样知道为何要选择 ext3 了吧?我们还可以引用 Red Hat 公司中,首席核心开发者 Michael K. Johnson 的话: 『为什么你想要从 ext 2 转换到 ext3 呢?有四个主要的理由:可利用性、数据完整性、速度 及易于转换』『可利用性』,他指出,这意味着从系统中止到快速重新复原而不是持续的让 e2fsck 执行长时间的修复。ext3 的日志式条件可以避免数据毁损的可能。他也指出:『除了写入若干 数据超过一次时,ext3 往往会较快于 ext2,因为 ext3 的日志使硬盘读取头的移动能更有效 的进行』然而或许决定的因素还是在 Johnson 先生的第四个理由中。 『它是可以轻易的从 ext2 变更到 ext3 来获得一个强而有力的日志式档案系统而不需要重新 做格式化』。『那是正确的,为了体验一下 ext3 的好处是不需要去做一种长时间的,冗长乏 味的且易于产生错误的备份工作及重新格式化的动作』。 上列资料可在 Whitepaper: Red Hat's New Journaling File System: ext3 ( http://www.redhat.com/support/wpapers/redhat/ext3/ ) 查阅得到。 所以啰,使用 ext3 或者是其 它的日志式档案系统是有好处的,最大的好处当然是错误问题的排除效率比较高。 无论如何,您只要先晓 得 ext2 是 Linux 正规的档案系统,而近年来的 ext3 等日志式档案系统则有取代的趋势。 • Linux 的 VFS (Virtual Filesystem Switch): 了解了我们使用的档案系统之后,再来则是要提到,那么 Linux 的核心又是如何管理这些认识的档案系统 呢? 其实,整个 Linux 的系统都是透过一个名为 Virtual Filesystem Switch 的核心功能去读取 filesystem 的。 也就是说,整个 Linux 认识的 filesystem 其实都是 VFS 在进行管理, 我们使用者并 不需要知道每个 partition 上头的 filesystem 是什么~ VFS 会主动的帮我们做好读取的动作呢~ 这无疑是个很好用的功能~为什么呢?因为只要系统管理员一开始就设定好各主要 filesystem 对应的档 案系统模块后, 核心的 VFS 就会主动接管该 filesystem 的存取模式。使用者可以在不晓得每个 filesystem 是什么的情况下, 就能自由的运用系统上的各种 filesystem 。很方便~不是吗?! ^_^ 本章习题练习 ( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 ) • 早期的 Unix 系统文件名最多允许 14 个字符,而新的 Unix 与 Linux 系统中,文件名最多可以 容许几个字符? 单一文件名可达 255 字符,完整文件名 (包含路径) 可达 4096 个字符 • 当一个档案属性为 –rwxrwxrwx 则表示这个档案的意义为? 任何人皆可读取、可写入亦可删除。 • 我需要将一个档案的属性改为 –rwxr-xr-- 请问该如何下达指令? chmod 754 filename 或 chmod u=rwx,g=rx,o=r filename • 若我需要更改一个档案的拥有者与群组,该用什么指令? chown, chgrp • Linux 传统的档案系统为何?此外,常用的 Journaling 档案格式有哪些? 传统档案格式为:ext2, Journaling 有 ext3 及 Reiserfs 等 • 请问底下的目录与主要放置什么数据: /etc/, /etc/init.d, /boot, /usr/bin, /bin, /usr/sbin, /sbin, /dev, /var/log o /etc/:几乎系统的所有设定档案均在此,尤其 passwd,shadow o /etc/init.d:系统开机的时候加载服务的 scripts 的摆放地点 o /boot:开机设定档,也是预设摆放核心 vmlinuz 的地方 o /usr/bin, /bin:一般执行档摆放的地方 o /usr/sbin, /sbin:系统管理员常用指令集 o /dev:摆放所有系统装置档案的目录 o /var/log:摆放系统登录档案的地方 • 若一个档案的档名开头为『 . 』,例如 .bashrc 这个档案,代表什么?另外,如何显示出这个 文件名与他的相关属性? 有『 . 』为开头的为隐藏档,需要使用 ls –a 这个 –a 的参数才能显示出隐藏档案的内容, 而使用 ls –al 才能显示出属性。 参考数据 • 关于 Journaling 日志式文章的相关说明 http://www.linuxplanet.com/linuxplanet/reports/3726/1/ Linux 磁盘与档案系统管理 最近更新日期:2006/06/28 我们在前面的档案权限介绍的章节当中,提到很多的权限与属性的观念,那么接下来要了解的是, 这些属 性是记录在硬盘的那个地方?这里就要特别了解到 Linux 档案系统( filesystem )是如何记录档案, 与档案 是如何被读取的啰!而要了解整个档案系统的观念,就不能不知道硬盘的组成组件! 所以,在这个章节当 中,我们由最基础的硬盘组成组件介绍起,并介绍 inode 与连结文件等基本知识, 以及如何利用开机即 可挂载的方式来使我们的各个 partition 可以在开机时就已经进行好挂载的动作喔! 1. 认识 EXT2 档案系统 1.1 硬盘物理组成 1.2 磁盘分割 1.3 档案系统 1.4 Linux 的 EXT2 档案系统(inode) 1.5 EXT2/EXT3 档案的存取与日志式档案系统的功能: dumpe2fs 1.6 Linux 档案系统的运作 1.7 挂载点的意义 (mount point) 1.8 其它 Linux 支持的档案系统 2. 档案系统的简单操作: 2.1 磁盘与目录的容量: df, du 2.2 连结档的介绍: ln 3. 磁盘的分割、格式化、检验与挂载 3.1 磁盘分割: fdisk 3.2 磁盘格式化: mke2fs, mkbootdisk, fdformat 3.3 磁盘检验: fsck, badblocks, sync 3.4 磁盘挂载与卸载: mount, umount 3.5 磁盘参数修订: mknod, e2label, tune2fs, hdparm 4. 设定开机挂载: 4.1 各式磁盘挂载与中文编码挂载还有 USB 随身碟! 4.2 开机挂载 /etc/fstab 及 /etc/mtab 4.3 特殊装置 loop 挂载 5. 虚拟内存之建置: 5.1 建立虚拟内存装置 5.2 建立虚拟内存档案 5.3 虚拟内存的限制 6. 本章习题练习 7. 针对本文的建议:http://phorum.vbird.org/viewtopic.php?t=23881 认识 EXT2 档案系统 既然这个章节主要在探讨 Linux 的磁盘档案系统,所以我们当然就需要先来了解一下硬盘是个什么东西 啦! 首先,我们就来看一看硬盘的物理组成,了解了物理组成之后,再来说明一下怎么样进行硬盘的分割 (partition) 吧! 硬盘物理组成: 就硬盘的物理组件来说,硬盘其实是由许许多多的圆形硬盘盘所组成的, 依据硬盘盘能够容纳的数据量, 而有所谓的单碟 (一块硬盘里面只有一个硬盘盘) 或者是多碟 (一块硬盘里面含有多个硬盘盘)的硬盘。在 这里我们以单一个硬盘盘来说明,硬盘盘可由底下的图形来示意: 图一、硬盘盘示意图 图二、磁柱示意图 首先,硬盘里面一定会有所谓的磁头 ( Head ) 在进行该硬盘盘上面的读写动作,而磁头是固定在机械手 臂上面的,机械手臂上有多个磁头可以进行读取的动作。 而当磁头固定不动 (假设机械手臂不动) ,硬盘 盘转一圈所画出来的圆就是所谓的磁道( Track );而如同我们前面刚刚提到的,一块硬盘里面可能具有多 个硬盘盘, 所有硬盘盘上面相同半径的那一个磁道就组成了所谓的磁柱( Cylinder )。 例如上图二所示意,在两个硬盘盘上面的同一个磁道就是一个磁柱啦! 这个磁柱也是磁盘分割( partition ) 时的最小单位了; 另外,由圆心向外划直线,则可将磁道再细分为一个一个的扇区( Sector ),这个扇区 就是硬盘盘上面的最小储存物理量了! 通常一个 sector 的大小约为 512 Bytes 。以上就是整个硬盘的 基本组件。 在计算整个硬盘的储存量时,简单的计算公式就是:Cylinder x Head x Sector x 512 Bytes。另外,硬 盘在读取时,主要是『硬盘盘会转动, 利用机械手臂将磁头移动到正确的数据位置(单方向的前后移动), 然后将数据依序读出。』 在这个操作的过程当中,由于机械手臂上的磁头与硬盘盘的接触是很细微的空间, 如果有抖动或者是脏污在磁头与硬盘盘之间时,就会造成数据的损毁或者是实体硬盘整个损毁~ 因此,正确的使用计算机的方式,应该是在计算机通电之后,就绝对不要移动主机,并免抖动到硬盘, 而 导致整个硬盘数据发生问题啊!另外,也不要随便将插头拔掉就以为是顺利关机! 因为机械手臂必须要归 回原位,所以使用操作系统的正常关机方式,才能够有比较好的硬盘保养啊! 因为他会让硬盘的机械手臂 归回原位啊! 磁盘分割 ( Partition ): 在了解了硬盘的物理组件之后,再接着下来介绍的就是硬盘的分割( Partition )啰! 为什么要进行硬盘 分割啊?!因为我们必须要告诉操作系统:『 我这块硬盘可以存取的区域是由 A 磁柱到 B 磁柱』,如此 一来,操作系统才能够控制硬盘磁头去 A-B 范围内的磁柱存取数据;如果没有告诉操作系统这个信息,那 么操作系统就无法利用我们的硬盘来进行数据的存取了, 因为操作系统将无法知道他要去哪里读取数据 啊!这就是磁盘分割( Partition )的重点了: 也就是记录每一个分割区( Partition )的起始与结束磁柱! 好了,那么这个分割区的起始与结束磁柱的数据放在哪里呢?!那就是我们在 Linux 安装与多重开机技巧 那个章节提到的 主要开机扇区( Master Boot Recorder, MBR )啰!事实上, MBR 就是在一块硬盘的第 零轨上面,这也是计算机开机之后要去利用该硬盘时, 必须要读取的第一个区域!在这个区域内记录的就 是硬盘里面的所有分割信息, 以及开机的时候可以进行开机管理程序的写入的处所啊!所以,当一个硬盘 的 MBR 坏掉时,由于分割的数据不见了,呵呵,那么这个硬盘也就几乎可以说是寿终正寝了, 因为操作 系统不知道该去哪个磁柱上读取数据啊~~ 那么 MBR 有什么限制呢?他最大的限制来自于他的大小不够大到储存所有分割与开机管理程序的信息, 因此,MBR 仅提供最多四个 partition 的记忆,这就是所谓的 Primary (P)与 Extended (E) 的 partition 最多只能有四个的原因了。所以说,如果你预计分割超过 4 个 partition 的话,那么势必需要使用 3P + 1E ,并且将所有的剩余空间都拨给 Extended 才行( 记得呦! Extended 最多只能有一个 ),否则只要 3P + E 之后还有剩下的空间, 那么那些容量将成为废物而浪费了,所以结论就是『 如果您要分割硬盘时, 并且已经预计规划使用掉 MBR 所提供的 4 个 partition ( 3P + E 或 4P )那么磁盘的全部容量需要使用 光,否则剩下的容量也不能再被使用』。 不过,如果您仅是分割出 1P + 1E 的话,那么剩下的空间就还 能再分割两个 primary partition ! 档案系统: 在告知系统我的 partition 所在的起始与结束磁柱之后,再来则是需要将 partition 格式化为『我的操 作系统认识的档案系统( Filesystem )』啰!因为每个操作系统认识的 filesystem 并不相同!例如 Windows 操作系统在预设状态下就无法认识 Linux 的档案系统 ( 这里指 Linux 的标准档案系统 ext2 )。所以当 然要针对我们的操作系统来格式化 partition 啰! 我们可以说,每一个 partition 就是一个 Filesystem ,那么一个 partition 是否可以具有两个 Filesystem 呢?!理论上应该是不行的!因为每个档案系统都有其独特的支持方式,例如 Linux 的 ext3 就无法被 Windows 系统所读取!而你将一个 partition 格式化的时候,总不能格式化为 ext3 也同时格 式化为 fat32 吧?!那是不可能的啊! 不论是哪一种 filesystem ,数据总是需要储存的吧!既然硬盘是用来储存数据的,想当然尔, 数据就必 须写入硬盘啦!刚刚我们提到硬盘的最小储存单位是 sector ,不过数据所储存的最小单位并不是 sector 喔,因为用 sector 来储存太没有效率了。怎么说呢?因为一个 sector 只有 512 Bytes ,而磁头是一个 一个 sector 的读取,也就是说,如果我的档案有 10 MBytes ,那么为了读这个档案, 我的磁头必须要 进行读取 (I/O) 20480 次! 为了克服这个效率上的困扰,所以就有逻辑区块( Block )的产生了! 逻辑区块是在 partition 进行 filesystem 的格式化时, 所指定的『最小储存单位』,这个最小储存单位当然是架构在 sector 的大小 上面( 因为 sector 为硬盘的最小物理储存单位啊! ),所以啦, Block 的大小为 sector 的 2 的次方 倍数。此时,磁头一次可以读取一个 block ,如果假设我们在格式化的时候,指定 Block 为 4 KBytes ( 亦 即由连续的八个 sector 所构成一个 block ),那么同样一个 10 MBytes 的档案, 磁头要读取的次数则 大幅降为 2560 次,这个时候可就大大的增加档案的读取效能啦! 不过,Block 单位的规划并不是越大越好喔!怎么说呢?因为一个 Block 最多仅能容纳一个档案 (这里指 Linux 的 ext2 档案系统)!这有什么问题呢?举例来说好了,假如您的 Block 规划为 4 KBytes ,而您 有一个档案大小为 0.1 KBytes ,这个小档案将占用掉一个 Block 的空间,也就是说,该 Block 虽然可 以容纳 4 Kbytes 的容量,然而由于档案只占用了 0.1 Kbytes ,所以,实际上剩下的 3.9 KBytes 是不 能再被使用了,所以,在考虑 Block 的规划时,需要同时考虑到: • 档案读取的效能 • 档案大小可能造成的硬盘空间浪费 因此,在规划您的磁盘时,需要留意到您主机的用途来进行规划较佳!例如 BBS 主机由于文章较短, 也 就是说档案较小,那么 Block 小一点的好;而如果您的主机主要用在储存大容量的档案, 那么考虑到效 能,当然 Block 理论上,规划的大一点会比较妥当啦! Superblock:如同前面说的,当我们在进行磁盘分割( partition )时,每个磁盘分割槽( partition )就 是一个档案系统( filesystem ), 而每个档案系统开始的位置的那个 block 就称为 superblock , superblock 的作用是储存像是档案系统的大小、空的和填满的区块,以及他各自的总数和其它诸如此类的 信息等等, 这也就是说,当您要使用这一个磁盘分割槽( 或者说是档案系统 )来进行数据存取的时候,第 一个要经过的就是 superblock 这个区块了,所以啰, superblock 坏了,您的这个磁盘槽大概也就回天 乏术了! Linux 的 EXT2 档案系统( inode ): 看完了上面的说明,您应该对于硬盘有一定程度的认识了!好了,那么接下来就是要谈一谈 Linux 的档案 系统( Filesystem )啰!我们这里以 Linux 最标准的 ext2 这个档案系统来作为说明。还记得我们在 Linux 档案属性与目录配置 那个章节提到的,在 Linux 系统当中,每个档案不止有档案的内容数据,还包括档 案的种种属性,例如:所属群组、 所属使用者、能否执行、档案建立时间、档案特殊属性等等。由于 Linux 操作系统是一个多人多任务的环境,为了要保护每个使用者所拥有数据的隐密性, 所以具有多样化的档案 属性是在所难免的!在标准的 ext2 档案系统当中,我们将每个档案的内容分为两个部分来储存,一个是 档案的属性,另一个则是档案的内容。 为了应付这两个不同的咚咚,所以 ext2 规划出 inode 与 Block 来分别储存档案的属性( 放在 inode 当 中 )与档案的内容( 放置在 Block area 当中 )。当我们要将一个 partition 格式化( format )为 ext2 时,就必须要指定 inode 与 Block 的大小才行,也就是说,当 partition 被格式化为 ext2 的档案系统 时,他一定会有 inode table 与 block area 这两个区域。 Block 已经在前面说过了,他是数据储存的最小单位。那么 inode 是什么?!简单的说, Block 是记录 『档案内容数据』的区域,至于 inode 则是记录『该档案的相关属性,以及档案内容放置在哪一个 Block 之内』的信息。 简单的说, inode 除了记录档案的属性外,同时还必须要具有指向( pointer )的功能, 亦即指向档案内容放置的区块之中,好让操作系统可以正确的去取得档案的内容啊! 底下几个是 inode 记 录的信息(当然不止这些): • 该档案的拥有者与群组(owner/group); • 该档案的存取模式(read/write/excute); • 该档案的类型(type); • 该档案建立或状态改变的时间(ctime)、最近一次的读取时间(atime)、最近修改的时间(mtime); • 该档案的容量; • 定义档案特性的旗标(flag),如 SetUID...; • 该档案真正内容的指向 (pointer); 我们在前一章 Linux 档案与目录管理 当中提到过利用 ls 查询档案所记载的时间,就是 atime / ctime / mtime 三种时间。这三种时间的意义我们已经在前一章的 touch 指令介绍时提过,这三种时间就是记录在 inode 里面的啦~ 如果回到前一章,您会发现,我们可以利用 ls 的相关功能来查询到时间喔!而预设的 显示时间是 mtime 。 [root@linux ~]# ls -la --time=atime PATH 那个 PATH 是您所想要查询的档案或目录名称。利用上面的 ls 相关参数,就可以取得您想要知道的档案 相关的三种时间啰~ 至于一个 inode 的大小为 128 bytes 这么大 (可以使用底下要介绍的 dumpe2fs 来查阅 inode 的大小喔!) !好了,那么我的 Linux 系统到底是如何读取一个档案的内容呢?底下我们 分别针对目录与档案来说明: • 目录: 当我们在 Linux 下的 ext2 档案系统建立一个目录时, ext2 会分配一个 inode 与至少一块 Block 给该目录。其中,inode 记录该目录的相关属性,并指向分配到的那块 Block ;而 Block 则是记录在这个目录下的相关连的档案(或目录)的关连性! • 档案: 当我们在 Linux 下的 ext2 建立一个一般档案时, ext2 会分配至少一个 inode 与相对于该档 案大小的 Block 数量给该档案。例如:假设我的一个 Block 为 4 Kbytes ,而我要建立一个 100 KBytes 的档案,那么 linux 将分配一个 inode 与 25 个 Block 来储存该档案! 要注意的是, inode 本身并不纪录文件名,而是记录档案的相关属性,至于文件名则是记录在目录所属的 block 区域! 那么档案与目录的关系又是如何呢?就如同上面的目录提到的,档案的相关连结会记录在目 录的 block 数据区域, 所以当我们要读取一个档案的内容时,我们的 Linux 会先由根目录 / 取得该档 案的上层目录所在 inode , 再由该目录所记录的档案关连性 (在该目录所属的 block 区域) 取得该档案 的 inode , 最后在经由 inode 内提供的 block 指向,而取得最终的档案内容。我们以 /etc/crontab 这 个档案的读取为例, 他的内容数据是这样取得的: 图三、读取 /etc/crontab 的简易流程示意。 一块 partition 在 ext2 底下会被格式化为 inode table 与 block area 两个区域, 所以在图三里面, 我们将 partition 以长条的方式来示意,会比较容易理解的啦!而读取 /etc/crontab 的流程为: 1. 操作系统根据根目录( / )的相关资料可取得 /etc 这个目录所在的 inode ,并前往读取 /etc 这 个目录的所有相关属性; 2. 根据 /etc 的 inode 的资料,可以取得 /etc 这个目录底下所有档案的关连数据是放置在哪一个 Block 当中,并前往该 block 读取档案的关连性内容; 3. 由上个步骤的 Block 当中,可以知道 crontab 这个档案的 inode 所在地,并前往该 inode ; 4. 由上个步骤的 inode 当中,可以取得 crontab 这个档案的所有属性,并且可前往由 inode 所指 向的 Block 区域,顺利的取得 crontab 的档案内容。 整个读取的流程大致上就是这样,如果您想要实作一下以了解整个流程的话,可以这样试做看看: 1. 察看一下根目录所记载的所有档案关连性数据 [root@linux ~]# ls -lia / 2 drwxr-xr-x 24 root root 4096 Jul 16 23:45 . 2 drwxr-xr-x 24 root root 4096 Jul 16 23:45 .. 719489 drwxr-xr-x 83 root root 12288 Jul 21 04:02 etc 523265 drwxr-xr-x 24 root root 4096 Jun 25 20:16 var # 注意看一下,在上面的 . 与 .. 都是连结到 inode 号码为 2 的那个 inode , # 也就是说, / 与其上层目录 .. 都是指向同一个 inode number 啊!两者是相同的。 # 而在根目录所记载的档案关连性 (在 block 内) 得到 /etc 的 inode number # 为 719489 那个 inode number 喔! 2. 察看一下 /etc/ 内的档案关连性的数据 [root@linux ~]# ls -liad /etc/crontab /etc/. 719489 drwxr-xr-x 83 root root 12288 Jul 21 04:02 /etc/. 723496 -rw-r--r-- 1 root root 663 Jul 4 12:03 /etc/crontab # 瞧!此时就能够将 /etc/crontab 找到关连性啰! 所以您知道,目录的最大功能就是在提供档案的关连性,在关连性里面, 当然最主要的就是『档名与 inode 的对应数据』啰!另外,关于 EXT2 档案系统,这里有几点小事情要提醒一下: • ext2 与 ext3 档案在建立时 (format) 就已经设定好固定的 inode 数与 block 数目了; • 格式化 Linux 的 ext2 档案系统,可以使用 mke2fs 这个程序来执行! • ext2 允许的 block size 为 1024, 2048 及 4096 bytes; • 一个 partition (filesystem) 所能容许的最大档案数,与 inode 的数量有关, 因为一个档案 至少要占用一个 inode 啊! • 在目录底下的档案数如果太多而导致一个 Block 无法容纳的下所有的关连性数据时,Linux 会给 予该目录多一个 Block 来继续记录关连数据; • 通常 inode 数量的多寡设定为 (partition 的容量) 除以 (一个 inode 预计想要控制的容量)。 举例来说,若我的 block 规划为 4Kbytes,假设我的一个 inode 会控制两个 block ,亦即是假 设我的一个档案大致的容量在 8Kbytes 左右时,假设我的这个 partition 容量为 1GBytes, 则 inode 数量共有:( 1G * 1024M/G * 1024K/M ) / ( 8K ) = 131072 个。而一个 inode 占用 128 bytes 的空间,因此格式化时就会有 ( 131072 个 * 128bytes/个 ) = 16777216 byes = 16384 Kbytes 的 inode table 。也就是说,这一个 1GB 的 partition 在还没有储存任何数据前, 就 已经少了 16MBytes 的容量啊! • 因为一个 inode 只能记录一个档案的属性,所以 inode 数量比 block 多是没有意义的! 举上 面的例子来说,我的 Block 规划为 4 Kbytes ,所以 1GB 大概就有 262144 个 4Kbytes 的 block ,如果一个 block 对应一个 inode 的话,那么当我的 inode 数量大于 262144 时,多的 inode 将没有任何用处,徒然浪费硬盘的空间而已!另外一层想法,如果我的档案容量都很大, 那 么一个档案占用一个 inode 以及数个 block ,当然 inode 数量就可以规划的少很多啦! • 当 block 大小越小,而 inode 数量越多,则可利用的空间越多,但是大档案写入的效率较差; 这 种情况适合档案数量多,但是档案容量小的系统,例如 BBS 或者是新闻群组( News )这方面服务 的系统; • 当 Block 大小越大,而 inode 数量越少时,大档案写入的效率较佳,但是可能浪费的硬盘空间 较多; 这种状况则比较适合档案容量较大的系统! 简单的归纳一下, ext2 有几个特色: • Blocks 与 inodes 在一开始格式化时 (format) 就已经固定了; • 一个 partition 能够容纳的档案数与 inode 有关; • 一般来说,每 4Kbytes 的硬盘空间分配一个 inode ; • 一个 inode 的大小为 128 bytes; • Block 为固定大小,目前支持 1024/2048/4096 bytes 等; • Block 越大,则损耗的硬盘空间也越多。 • 关于单一档案: 若 block size=1024,最大容量为 16GB,若 block size=4096,容量最大为 2TB; • 关于整个 partition : 若 block size=1024,则容量达 2TB,若 block size=4096,则容量达 32TB。 • 文件名最长达 255 字符,完整文件名长达 4096 字符。 另外,关于 partition 的使用效率上,当您的一个 partition 规划的很大时,例如 100GB 这么大, 由 于硬盘上面的数据总是来来去去的,所以,整个 partition 上面的档案通常无法连续写在一起, 而是填 入式的将数据填入没有被使用的 block 当中。如果档案写入的 block 真的分的很散, 此时就会有所谓的 档案离散的问题发生了。虽然我们的 ext2 在 inode 处已经将该档案所记录的 block number 都记上了, 所以资料可以一次性读取,但是如果档案真的太过离散,确实还是会发生读取效率低落的问题。 果真如此, 那么可以将整个 partition 内的数据全部复制出来,将该 partition 重新格式化, 再将数据给他复制回 去即可解决。 此外,如果 partition 真的太大了,那么当一个档案分别记录在这个 partition 的最前面与最后面的 block, 此时会造成硬盘的机械手臂移动幅度过大,也会造成数据读取效能的低落。因此, partition 的 规划并不是越大越好, 而是真的要针对您的主机用途来进行规划才行!^_^ EXT2/EXT3 档案的存取与日志式档案系统的功能 综合上面谈的种种,我们可以知道,当一个 ext2 的 filesystem 被建立时, 他拥有 superblock / group description / block bitmap / inode bitmap / inode table / data blocks 等等区域。要注意的是, 每个 ext2 filesystem 在被建立的时候,会依据 partition 的大小, 给予数个 block group ,而每个 block group 就有上述的这些部分。整个 filesystem 的架构可以下图展现: 图四、整个 filesystem 的展现示意图 我们将整个 filesystem 简单化, 假设仅有一个 block group ,那么上面的各个部分分别代表什么呢? • SuperBlock:如前所述, Superblock 是记录整个 filesystem 相关信息的地方, 没有 Superblock ,就没有这个 filesystem 了。他记录的信息主要有: o block 与 inode 的总量; o 未使用与已使用的 inode / block 数量; o 一个 block 与一个 inode 的大小; o filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间 等档案系统的相关信息; o 一个 valid bit 数值,若此档案系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为 1 。 • Group Description:纪录此 block 由由何处开始记录; • Block bitmap:此处记录那个 block 有没有被使用; • Inode bitmap:此处记录那个 inode 有没有被使用; • Inode table:为每个 inode 数据存放区; • Data Blocks:为每个 block 数据存放区。 如果想要知道某个 ext2/ext3 的档案系统内,关于上述提到的相关信息时,可以使用 dumpe2fs 这个指令 来读取,举例来说,鸟哥将我自己的主机 /dev/hda1 读出 ext3 的讯息: [root@linux ~]# dumpe2fs /dev/hda1 Filesystem volume name: / Filesystem state: clean Errors behavior: Continue Filesystem OS type: Linux Inode count: 1537088 Block count: 1536207 Free blocks: 735609 Free inodes: 1393089 First block: 0 Block size: 4096 Filesystem created: Sat Jun 25 16:21:13 2005 Last mount time: Sat Jul 16 23:45:04 2005 Last write time: Sat Jul 16 23:45:04 2005 Last checked: Sat Jun 25 16:21:13 2005 First inode: 11 Inode size: 128 Journal inode: 8 Group 0: (Blocks 0-32767) Primary superblock at 0, Group descriptors at 1-1 Reserved GDT blocks at 2-376 Block bitmap at 377 (+377), Inode bitmap at 378 (+378) Inode table at 379-1400 (+379) 0 free blocks, 32424 free inodes, 11 directories Free blocks: Free inodes: 281-32704 Group 1: (Blocks 32768-65535) Backup superblock at 32768, Group descriptors at 32769-32769 Reserved GDT blocks at 32770-33144 Block bitmap at 33145 (+377), Inode bitmap at 33146 (+378) Inode table at 33147-34168 (+379) 18 free blocks, 24394 free inodes, 349 directories Free blocks: 37882-37886, 38263-38275 Free inodes: 38084-38147, 39283-39343, 41135, 41141-65408 # 因为数据很多,所以鸟哥略去了一些信息了~上面是比较精简的显示内容。 # 在 Group 0 之前的都是 Superblock 的内容,记录了 inode/block 的总数, # 还有其它相关的讯息。至于由 Group 0 之后,则是说明各个 bitmap 及 inode table # 与 block area 等等。 透过这些记录,我们可以很轻易的就知道哪些 inode 没有被使用,哪些 block 还可以记录, 如此一来, 在新增、建立档案与目录时,系统就会根据这些记录来将数据分别写入尚未被使用的 inode 与 block area 了! 不过,要注意的是,当我们新增一个档案(目录)时: 1. 根据 inode bitmap / block bitmap 的信息,找到尚未被使用的 inode 与 block , 进而将档 案的属性与数据分别记载进 inode 与 block ; 2. 将刚刚被利用的 inode 与 block 的号码 (number) 告知 superblock、inode bitmap、block bitmap 等,让这些 metadata 更新信息。 一般来说,我们将 inode table 与 block area 称为数据存放区域,至于其它的例如 superblock、 block bitmap 与 inode bitmap 等记录就被称为 metadata 啰。经由上面两个动作,我们知道一笔数据写入硬盘 时, 会有这两个动作。 • 数据的不一致 (Inconsistent) 状态 那么万一您的档案在写入硬盘时,因为不知名原因导致系统中断(例如突然的停电啊、 系统核心发生错误 啊~等等的怪事发生时),所以数据就只有纪录到动作一,而动作二尚未进行~ 这就会产生 metadata 与 数据存放区产生不一致 (Inconsistent) 的情况发生了。 在早期的 EXT2 档案系统中,如果发生这个问题,那么系统在重新开机的时候, 就会藉由 Superblock 当 中记录的 valid bit 与 filesystem state 等状态来判断是否强制进行数据一致性的检查!检查则以 e2fsck 这支程序来进行的。 不过,这样的检查真的是很费时~因为要针对 metadata 区域与实际数据存 放区来进行比对, 呵呵~得要搜寻整个 partition 呢~哇!系统真忙碌~而且在对 Internet 提供服务 的服务器主机上面, 这样的检查真的会造成主机复原时间的拉长~真是麻烦~这也就造成后来所谓日志式 档案系统的兴起了。 稍微了解了所谓数据不一致的状态后,再来要了解的,就是,那么为何要有日志式档案系统的产生呢? 我 们已经在 Linux 档案属性与目录配置 当中提到过一些档案系统的注意事项, 也提过日志式 (Journal) 档案系统的相关功能,这里我们再稍微深入的讨论一下。 刚刚提到了,在 EXT2 档案系统当中,要进行档案的写入时,会将数据分别在数据存放区与 metadata 区 记录下来, 若当这两个动作无法一次完成时,就会造成所谓的不一致现象。若发生不一致现象, 因为系 统不知道是那个档案发生不一致现象,所以就会将整个 filesystem 做一致性的检查,如此一来,很费时 啊! 想一想,如果在我们的 filesystem 当中,要是能够规划出一个区块,专门来记录写入或修订档案时 的步骤, 那不就可以简化一致性检查的步骤了?也就是说: 1. 当系统要写入一个档案的时候,会先在日志记录区块中纪录:某个档案准备要写入磁盘了; 2. 开始写入档案的权限与数据; 3. 开始更新 metadata 的数据; 4. 完成数据与 metadata 的更新后,在日志记录区块当中完成该档案的纪录。 在这样的程序当中,万一数据的纪录过程当中发生了问题,那么我们的系统只要去检查日志记录区块, 就 可以知道那个档案发生了问题,针对该问题来做一致性的检查即可,而不必针对整块 filesystem 去检查, 真的就可以达到快速修复 filesystem 的能力了!这就是日志式档案最基础的功能啰~ 那么我们的 ext2 可达到这样的功能吗?当然可以啊! 就透过 ext3 即可! ext3 是 ext2 的升级版本,并且可向下兼容 ext2 版本呢! 所以啰,目前我们才建议大家,可以直接使用 ext3 这个 filesystem 啊! ^_^ 如果您对于 EXT2 / EXT3 系统还有更多的兴趣,可以参考底下这几篇文章: • Design and Implementation of the Second Extended Filesystem http://e2fsprogs.sourceforge.net/ext2intro.html • The Second Extended File System - An introduction http://www.freeos.com/articles/3912/ • ext3 or ReiserFS? Hans Reiser Says Red Hat's Move Is Understandable http://www.linuxplanet.com/linuxplanet/reports/3726/1/ 或者参考鸟哥由网络上面找到的相关中文翻译,不过.....原发文者的文章出处已经找不到了~ 真是不好 意思~请参考:附录 B:EXT2/EXT3 档案系统。 Linux 档案系统的运作: 好了,我们知道整个 ext2/ext3 的数据存取是透过 journal 与 metadata 还有数据存放区在纪录的。 不 过,实际上, Linux 档案系统在运作的时候,真的要将数据直接存放到硬盘上面吗?! 有没有更有效率 的作法? 我们来看看整部计算机的运作当中,那个数据的存取速度最慢呢?数据处理最快速的地方应该是 CPU 了, 接下来则是主存储器 (RAM) ,至于硬盘,哈哈!没错,速度可是比 CPU 还有 RAM 要慢的很多很多。 为 了让 Linux 加快整个系统的存取效率,因此在 Linux 上面通常采取异步处理( asynchronously )的方式。 什么是异步呢?举例来说:『当系统读取了某一个档案, 则该档案所在的区块数据会被加载到内存当中, 所以该磁盘区块就会被放置在主存储器的缓冲快取区中, 若这些区块的数据被改变时,刚开始数据仅有主 存储器的区块数据会被改变, 而且在缓冲区当中的区块数据会被标记为『 Dirty 』,这个时候磁盘实体 区块尚未被修正! 所以亦即表示,这些『 Dirty 』区块的数据必需回写到磁盘当中, 以维持磁盘实体区 块上的数据与主存储器中的区块数据的一致性。』 为什么要这么做呢?这是因为主存储器的运作速度比起硬盘来实在是快太多了, 万一系统当中有一个档案 相当的大,而又持续性的存取,那么由于较慢的硬盘存取速度,将使得整个 Linux 速度被拖垮,所以才会 使用异步方式的数据处理啊!不过, 也由于硬盘与主存储器的数据可能没有同步化,因此,如果 Linux 不 正常关机( 例如跳电或者是当机 )时,则由于数据尚未回写入磁盘当中,会导致系统在再次开机时,会花 相当多的时间进行磁盘检验, 同时也有可能造成磁盘的损毁啊! 挂载点的意义 (mount point): 我们上面提到的都是关于档案系统 (filesystem),但是要能够让我们的 Linux 使用的话, 非得『挂载 (mount)』上我们的 Linux 系统才行啊! 刚刚我们上面提到了目录可以记录文件名与 inode 的相关信息, 此外, 目录也是让我们得以跟 filesystem 产生对应的入口点。因此,我们称那个入口点目录为『 挂载 点 (mount point) 』 举例来说,在鸟哥的 安装 FC4 范例当中,我们将硬盘分割为几大部分, 同时主要将 / 与 /home 设定为 两个 partition 的挂载点。假设 / 是接在 /dev/hda1 , 而 /home 是接在 /dev/hda2 上面,那么,也 就是说,在 /home 底下的所有次目录,使用的都是 /dev/hda2 那个 partition 的资料呢!而非 /home 的 则都是使用 /dev/hda1 的数据! 那么来看看系统中如果主要分为 / 与 /home 时,他们对应的 inode 会有什么现象呢? [root@linux ~]# ls -lid / /home 2 drwxr-xr-x 26 root root 4096 7 月 21 09:08 / 2 drwxr-xr-x 42 root root 4096 7 月 14 23:37 /home 看到了吧?咦!怎么 / 与 /home 的 inode number 都是 2 啊??这太不合理了~ 原因很简单啊!因为 / 是 /dev/hda1 而 /home 是 /dev/hda2 ,这两个 partition 都有 inode number 为 2 的号码啊!所以啊, 请注意, 挂载点一定是『目录』而不是档案喔! 也就是说,这个挂载点就是进入该 filesystem 的入口 啦! 其它 Linux 支持的档案系统 虽然 Linux 的标准档案系统是 ext2 ,且还有增加了日志功能的 ext3 之外,事实上,Linux 还有支持很 多档案格式的, 尤其是最近这几年推出了好几种速度很快的日志式档案系统,包括 SGI 的 XFS 档案系统, 可以适用更小型档案的 Reiserfs 档案系统,以及 Windows 的 FAT 档案系统等等, 都能够被 Linux 所 支持喔!常见的支持档案系统有: • 传统档案系统:ext2 / minix / MS-DOS / FAT (用 vfat 模块) / iso9660 (光盘)等等; • 日志式档案系统: ext3 / ReiserFS / Windows' NTFS / IBM's JFS / SGI's XFS • 网络档案系统: NFS / SMBFS 想要知道您的 Linux 支持的档案系统有哪些,可以察看底下这个目录: [root@linux ~]# ls -l /lib/modules/`uname -r`/kernel/fs 系统目前已启用的档案系统则有: [root@linux ~]# cat /proc/filesystems 假设您的 / 使用的是 /dev/hda1 ,用 ext3 ,而 /home 使用 /dev/hda2 ,用 reiserfs , 那么您取用 /home/dmtsai/.bashrc 时,有特别指定要用的什么档案系统的模块来读取吗?! 应该是没有吧!嘿嘿! 这个就是我们 Linux kernel 的 Virtual Filesystem Switch (VFS) 的功能啦!透过这个 VFS 的功能来 管理所有的 filesystem, 省去我们需要自行设定读取档案系统的定义啊~方便很多! 档案系统的简单操作: 在了解了一些简单的硬盘与档案系统的概念之后,并且知道如何以 ls 查询档案系统相关的信息后, 接下 来就是得要了解如何知道整个磁盘的剩余容量与总容量啰~此外,也得要知道一下,前一章还没有介绍到 的连结档 (link file) 啰~ 磁盘与目录的容量: 在文字接口底下有什么方法可以查看目前的磁盘最大容许容量、已经使用掉的容量、 目前所在目录的已使 用容量?还有还有,怎么知道目前目录底下使用掉的硬盘容量呢? 以及如何查询目前的 inodes 数目?呵 呵!底下我们就来谈一谈主要的两个指令: • df [root@linux ~]# df [-ahikHTm] [目录或文件名] 参数: -a :列出所有的档案系统,包括系统特有的 /proc 等档案系统; -k :以 KBytes 的容量显示各档案系统; -m :以 MBytes 的容量显示各档案系统; -h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示; -H :以 M=1000K 取代 M=1024K 的进位方式; -T :连同该 partition 的 filesystem 名称 (例如 ext3) 也列出; -i :不用硬盘容量,而以 inode 的数量来显示 范例: 范例一:将系统内所有的 partition 列出来! [root@linux ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/hda1 5952252 3012332 2632680 54% / /dev/shm 192836 0 192836 0% /dev/shm /dev/hda5 9492644 221604 8781060 3% /home # 特别注意,在 Linux (FC4) 底下,如果 df 没有加任何参数, # 那么预设会将系统内所有的 (不含特殊内存内的档案系统与 swap) 都以 Kbytes # 的容量来列出来!至于那个 /dev/shm 是与内存有关的挂载,先不要理他! 范例二:将容量结果以易读的容量格式显示出来 [root@linux ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/hda1 5.7G 2.9G 2.6G 54% / /dev/shm 189M 0 189M 0% /dev/shm /dev/hda5 9.1G 217M 8.4G 3% /home # 不同于范例一,这里会以 G/M 等容量格式显示出来,比较容易看啦! 范例三:将系统内的所有特殊档案格式及名称都列出来 [root@linux ~]# df -aT Filesystem Type 1K-blocks Used Available Use% Mounted on /dev/hda1 ext3 5952252 3012332 2632680 54% / /dev/proc proc 0 0 0 - /proc /dev/sys sysfs 0 0 0 - /sys /dev/devpts devpts 0 0 0 - /dev/pts /dev/shm tmpfs 192836 0 192836 0% /dev/shm /dev/hda5 ext3 9492644 221604 8781060 3% /home none binfmt_misc 0 0 0 - /proc/sys/fs/binfmt_misc # 看到了吧!系统里面其实还有很多的特殊档案系统在跑得! # 不过,那些比较特殊的档案系统几乎都是在内存当中,例如 /proc 这个挂载点。 # 因此,这些特殊的档案系统都不会占据硬盘空间喔! ^_^ 范例四:将 /etc 底下的可用的磁盘容量以易读的容量格式显示 [root@linux ~]# df -h /etc Filesystem Size Used Avail Use% Mounted on /dev/hda1 5.7G 2.9G 2.6G 54% / # 这个范例比较有趣一点啦,在 df 后面加上目录或者是档案时, df # 会自动的分析该目录或档案所在的 partition ,并将该 partition 的容量显示出来, # 所以,您就可以知道某个目录底下还有多少容量可以使用了! ^_^ 范例五:将目前各个 partition 当中可用的 inode 数量列出 [root@linux ~]# df -ih Filesystem Inodes IUsed IFree IUse% Mounted on /dev/hda1 1.5M 141K 1.4M 10% / /dev/shm 48K 1 48K 1% /dev/shm /dev/hda5 2.4M 67 2.4M 1% /home 这是用来显示目前磁盘的总容量与剩余可用容量的指令!需要注意的是, 由于我们的档案或者是外挂的磁 盘都是加在『 / 』底下,所以当根目录没有空间的时候, 嘿嘿!你的 Linux 系统可能大概就要挂了吧~ 当然啰!你可以将你的资料放置在加挂的硬盘中, 那么如何知道目前哪一个磁盘还有多少空间呢?! Tips: 说个笑话!当初我们系上有个研究生在管理 Sun 的工作站,是别 研究室的, 他的硬盘明明有好几 GB ,但是就是没有办法将几 MB 的数据 copy 进去, 他就去跟老板讲说机器坏了!嘿!明明才来 维护过几天而已为何会坏了! 结果老板将维护商叫来骂了 2 小时 左右吧!后来,维护商发现原来硬盘的『总空间』还有很多, 只 是某个扇区填满了,偏偏该研究生就是要将数据 copy 去那个扇 区!呵呵! 后来那个研究生就被命令『再也不许碰 Sun 主机』 了~~ 这里要请大家再复习一下,我们的硬盘扇区规划中, primary 扇区每一颗硬盘最多只允许 4 个,其它的 就放置在 Extended 扇区中了!而,硬盘的代号与 IDE 的插槽是有关系的! 如果忘记了,那就回去安装 Linux 那一章复习一下吧!好了!假设我只有一棵硬盘,且放在 IDE 的 master ,那么我的硬盘就是 /dev/hda 啰!而在这颗硬盘中的分割扇区就可以由 /dev/hda1 开始向上加! OK,那么使用 df -k 之后,假设我的硬盘分为 /dev/hda1, /dev/hda2, /dev/hda3, /dev/hda5 与 /dev/hda6 ,咦! /dev/hda4 跑去哪里了!呵呵!其实 /dev/hda4 通常就是 Extended 扇区啦!而后面 的 /dev/hda5, /dev/hda6 等扇区就是由 /dev/hda4 所切出来的!所以 /dev/hda5 + /dev/hda6 = /dev/hda4 !当然,如果还有没有显示出来的,例如 Swap ,则 /dev/hda4 还有可能更大呦! 那么来解释一下上面的数据吧! • Filesystem:代表该档案系统是在那个 partition 啊,所以列出装置名称; • 1k-blocks:说明底下的数字单位是 1KB 呦!可利用 -h 或 -m 来改变容量; • Used:顾名思义,就是使用掉的硬盘空间啦! • Available:也就是剩下的磁盘空间大小; • Use%:就是磁盘的使用率啦!如果使用率高达 90% 以上时, 最好需要注意一下了,免得容量不 足造成系统问题喔! (例如最容易被灌爆的 /var/spool/mail 这个放置邮件的磁盘) • Mounted on:就是磁盘挂载的目录所在啦!(挂载点啦!) 另外,需要注意的是,如果使用 -a 这个参数时,系统会出现 /proc 这个扇区,但是里面的东西都是 0 , 不要紧张! /proc 的东西都是 Linux 系统所需要加载的系统数据,而且是挂载在『内存当中』的, 所以 当然没有占任何的硬盘空间啰! • du [root@linux ~]# du [-ahskm] 档案或目录名称 参数: -a :列出所有的档案与目录容量,因为预设仅统计目录底下的档案量而已。 -h :以人们较易读的容量格式 (G/M) 显示; -s :列出总量而已,而不列出每个各别的目录占用容量; -k :以 KBytes 列出容量显示; -m :以 MBytes 列出容量显示; 范例: 范例一:列出目前目录下的所有档案容量 [root@linux ~]# du [root@vbird ~]# du 16 ./.gnome2 16 ./.ssh .......中间省略........ 292 . # 直接输入 du 没有加任何参数时,则 du 会分析『目前所在目录』 # 的档案与目录所占用的硬盘空间。但是,实际显示时,仅会显示目录容量, # 但我的 . 目录有很多档案没有被列出来,所以,全部的目录相加不会等于 . 的容量喔! 范例二:同范例一,但是将档案的容量也列出来 [root@linux ~]# du -a 12 ./install.log.syslog 16 ./.gnome2 16 ./.ssh 76 ./install.log 16 ./.bash_history 4 ./.bashrc .......中间省略........ 292 . # 加上这个 -a 参数后,就会将目录底下的档案也一起列示出来, # 而不是仅列出档案信息而已!注意啰~ ^_^ 范例三:检查根目录底下每个目录所占用的容量 [root@linux ~]# du -sm /* 7 /bin 14 /boot .......中间省略........ 385 /proc .......中间省略........ 1 /tmp 2944 /usr 79 /var # 这是个很常被使用的功能啰~利用万用字符 * 来代表每个目录, # 所以,如果想要检查某个目录下,那个次目录占用最大的容量,就可以用这个方法找出来 # 值得注意的是,如果您刚刚安装好 Linux 时,那么整个系统容量最大的应该是 /usr # 那个目录,而 /proc 虽然有列出容量,但是那个容量是在内存中,不占硬盘空间。 在 Windows 底下可以使用档案总管来管理你的磁盘,在 Linux 底下也可以轻易的以 du 来知道目前磁盘 的档案容量耶!在预设的情况下,容量的输出是以 KB 来设计的, 如果你想要知道目录占了多少 MB ,那 么就使用 -m 这个参数即可啰!而, 如果你只想要知道该目录占了多少容量的话,呵呵,使用 -s 就可以 啦!另外, 如同上面的范例三,可以利用万用字符 * 来加快你的搜寻喔! 连结档的介绍: ln 什么是连结档呢?其实连结档有点类似 Windows 底下的『快捷方式』!也就是很多的连结档案( link file ) 其实都指向同一个来源档案( source file )!不过,在所有的档案类型当中, 连结档算是比较难理解的 一部份了!因为连结档还分成 Hard link 与 symbolic link 两种,这两种连结档在架构上是完全不一样 的咚咚,底下就来好好的谈一谈先! • Hard Link (硬式连结或实际连结) 在前一节当中,我们提到档案的读取方式为: 1. 先由一层一层的目录取得档案相关的关连数据, 2. 再到对应的 inode 取得档案的属性,以及档案内容数据所在的 Block , 3. 最后到 Block area 取得档案的数据。 那么 hard link 怎么制作档案的连结呢?!很简单, Hard Link 只是在某个目录下新增一个该档案的关 连数据而已! 举个例子来说,假设我的 /root/crontab 为一个 hard link 的档案,他连结到 /etc/crontab 这个档案, 也就是说,其实 /root/crontab 与 /etc/crontab 是同一个档案,只是有两个目录( /etc 与 /root )记 录了 crontab 这个档案的关连数据罢了!也就是说,我由 /etc 这个目录所记录的关连数据可知道 crontab 的 inode 放置在 A 处,而由 /root 这个目录下的关连数据, crontab 同样也指到 A 处的 inode !所以啰, crontab 这个档案的 inode 与 block 都没有改变, 有的只是有两个目录记录了关连 数据。 那这样有什么好处呢?最大的好处就是『安全!』如同上面提到的 /root/crontab 与 /etc/crontab 中, 不管哪一个档案被删除了,其实仅是移除一笔目录底下的档案关连性数据,并没有更动到原本档案的 inode 与 block 数据呢!而且,不论由那个目录连结到正确的 crontab 的 inode 与 block , 都可以正确无误 的进行数据的修改喔! ^_^ 一般来说,使用 hard link 设定连结文件时,磁盘的空间与 inode 的数目都不会改变! 由上面的说明来 看,我们可以知道, hard link 只是在某个目录下的 block 多写入一个关连数据,所以当然不会用掉 inode 与磁盘空间啰! Tips: 其实可能会改变的,那就是当目录的 Block 被用完时,就可能会 新加一个 block 来记录,而导致磁盘空间的变化!不过,一般 hard link 所用掉的关连数据量很小,所以通常不会改变 inode 与磁盘 空间的大小喔! 由于 hard link 是在同一个 partition 上面进行数据关连的建立,所以 hard link 是有限制的: • 不能跨 Filesystem; • 不能 link 目录。 不能跨 Filesystem 还好理解,因为 hard link 本来就是在一个 partition 内建立关连性的, 那不能 hard link 到目录又是怎么回事呢?这是因为如果使用 hard link 连结到目录时, 连结的数据被需要连 同被连结目录底下的所有数据都建立连结,举例来说,如果你要将 /etc 使用硬式连结建立一个 /etc_hd 的目录时,那么在 /etc_hd 底下的所有数据同时都与 /etc 底下的数据要建立 hard link 的,而不能仅 是连结到 /etc_hd 与 /etc 而已。 并且,未来如果需要在 /etc_hd 底下建立新档案时,连带的, /etc 底 下的数据又得要建立一次 hard link ,因此造成环境相当大的复杂度。 所以啰,目前 hard link 对于目 录暂时还是不支持的啊! • Symbolic Link (符号连结,亦即是快捷方式) 相对于 hard link , Symbolic link 可就好理解多了,基本上, Symbolic link 就是在建立一个独立的 档案, 而这个档案会让数据的读取指向他 link 的那个档案内容!由于只是利用档案来做为指向的动作, 所以,当来源档被删除之后,symbolic link 的档案会『开不了』, 会一直说『无法开启某档案!』。这 里还是得特别留意,这个 Symbolic Link 与 Windows 的快捷方式可以给他划上等号,由 Symbolic link 所 建立的档案为一个独立的新的档案,所以会占用掉 inode 与 block 喔! 由上面的说明来看,似乎 hard link 比较安全,因为即使某一个目录下的关连数据被杀掉了, 也没有关 系,只要有任何一个目录下存在着关连数据,那么该档案就不会不见!举上面的例子来说,我的 /etc/crontab 与 /root/crontab 指向同一个档案,如果我删除了 /etc/crontab 这个档案,该删除的动 作其实只是将 /etc 目录下关于 crontab 的关连数据拿掉而已, crontab 所在的 inode 与 block 其实 都没有被变动喔! 不过,不幸的是,由于 Hard Link 的限制太多了,包括无法做『目录』的 link , 所以在用途上面是比 较受限的!反而是 Symbolic Link 的使用方面较广喔!好了, 说的天花乱坠,看您也差不多快要昏倒了! 没关系,实作一下就知道怎么回事了!要制作连结档就必须要使用 ln 这个指令呢! [root@linux ~]# ln [-sf] 来源文件 目标文件 参数: -s :如果 ln 不加任何参数就进行连结,那就是 hard link,至于 -s 就是 symbolic link -f :如果 目标文件 存在时,就主动的将目标文件直接移除后再建立! 范例: 范例一:将 /etc/passwd 复制到 /tmp 底下,并且观察 inode 与 block [root@linux ~]# cd /tmp [root@linux tmp]# cp -a /etc/passwd . [root@linux tmp]# du -sb ; df -i . 26948 . <== 先注意一下,这里的容量是多少! Filesystem Inodes IUsed IFree IUse% Mounted on /dev/hda1 1537088 144016 1393072 10% / # 利用 du 与 df 来检查一下目前的参数~那个 du -sb # 是计算整个 /tmp 底下有多少 bytes 的容量啦! 范例二:将 /tmp/passwd 制作 hard link 成为 passwd-hd 档案 [root@linux tmp]# ln passwd passwd-hd [root@linux tmp]# du -sb ; df -i . 26948 . Filesystem Inodes IUsed IFree IUse% Mounted on /dev/hda1 1537088 144016 1393072 10% / # 仔细看,即使多了一个档案在 /tmp 底下,整个 inode 与 block 的容量并没有改变! [root@linux tmp]# ls -il passwd* 1242760 -rw-r--r-- 2 root root 1746 Jun 29 01:03 passwd 1242760 -rw-r--r-- 2 root root 1746 Jun 29 01:03 passwd-hd # 原来是指向同一个 inode 啊!这是个重点啊!另外,那个第二栏的连结数也会增加! 范例三:将 /tmp/passwd 建立一个符号连结 [root@linux tmp]# ln -s passwd passwd-so [root@linux tmp]# ls -li passwd* 1242760 -rw-r--r-- 2 root root 1746 Jun 29 01:03 passwd 1242760 -rw-r--r-- 2 root root 1746 Jun 29 01:03 passwd-hd 1242806 lrwxrwxrwx 1 root root 6 Jul 23 20:02 passwd-so -> passwd # 仔细看喔,这个 passwd-so 指向的 inode number 不同了!这是一个新的档案~ # 这个档案的内容是指向 passwd 的,你可以看到这个档案的大小,是 6bytes , # 怎么来的?因为 passwd 共有六个字符啊!哈哈!没错~这个连结档的内容只是填写 # 连结的目标档案文件名而已!所以,你的连结档档名 (有时候含路径) 有多长,档案就多大! [root@linux tmp]# du -sb ; df -i . 26954 . Filesystem Inodes IUsed IFree IUse% Mounted on /dev/hda1 1537088 144017 1393071 10% / # 呼呼!整个容量与 inode 使用数都改变啰~确实如此啊! 范例四:删除源文件 passwd ,其它两个档案是否能够开启? [root@linux tmp]# rm passwd [root@linux tmp]# cat passwd-hd ......正常显示完毕! [root@linux tmp]# cat passwd-so cat: passwd-so: No such file or directory # 怕了吧?!竟然无法正常的开启这个档案呢~ Tips: 还记得上一章当中,我们提到的 /tmp 这个目录是干嘛用的吗?是 给大家作为暂存盘用的啊! 所以,您会发现,过去我们在进行测 试时,都会将数据移动到 /tmp 底下去练习~ 嘿嘿!因此,有事 没事,记得将 /tmp 底下的一些怪异的数据清一清先! 要注意啰!使用 ln 如果不加任何参数的话,那么就是 Hard Link 啰!如同上面的情况,增加了 hard link 之后,可以发现使用 ls -l 时,显示的 link 那一栏属性增加了!而如果这个时候砍掉 passwd 会发生什 么事情呢?呵呵! passwd-hd 的内容还是会跟原来 passwd 相同,但是 passwd-so 就会找不到该档案啦! 就是这样!了解了吗?! 而如果 ln 使用 -s 的参数时,就做成差不多是 Windows 底下的『快捷方式』的意思( Symbolic Link, 较常用! )。当你修改 Linux 下的 link 档案时,则更动的其实是『原始档』,呵呵, 所以不论你的这 个原始档被连结到哪里去,只要你修改了连结档,呵呵!原始档就跟着变啰! 以上面为例,由于你使用 -s 的参数建立一个名为 passwd-so 的档案,则你修改 passwd-so 时,其内容与 passwd 完全相同,并且, 当你按下储存之后,被改变的将是 passwd 这个档案! 此外,如果你做了底下这样的连结: ln -s /bin /root/bin 那么如果你进入 /root/bin 这个目录下,『请注意呦!该目录其实是 /bin 这个目录,因为你做了连结档 了!』所以,如果你进入 /root/bin 这个刚刚建立的连结目录, 并且将其中的数据杀掉时,嗯! /bin 里 面的数据就通通不见了!这点请千万注意!并不是 /root 底下的资料都是 root 的!还需要注意一下该属 性才行!(其实可以透过 pwd -P 去观察!) 基本上, Symbolic link 的用途比较广,所以您要特别留意 symbolic link 的用法呢!未来一定还会常 常用到的啦! • 关于目录的 link 数量: 或许您已经发现了,那就是,当我们以 hard link 进行『档案的连结』时,可以发现,在 ls -l 所显示 的第二字段会增加一才对,那么请教,如果建立目录时,他预设的 link 数量会是多少? 让我们来想一想, 一个『空目录』里面至少会存在些什么?呵呵!就是存在 . 与 .. 这两个目录啊! 那么,当我们建立一 个新目录名称为 /tmp/testing 时,基本上会有三个东西,那就是: • /tmp/testing • /tmp/testing/. • /tmp/testing/.. 而其中 /tmp/testing 与 /tmp/testing/. 其实是一样的!都代表该目录啊~而 /tmp/testing/.. 则代表 /tmp 这个目录,所以说,当我们建立一个新的目录时, 『新的目录的 link 数为 2 ,而上层目录的 link 数则会增加 1 』 不信的话,我们来作个测试看看: [root@linux ~]# ls -ld /tmp drwxrwxrwt 5 root root 4096 Oct 11 05:15 /tmp [root@linux ~]# mkdir /tmp/testing1 [root@linux ~]# ls -ld /tmp drwxrwxrwt 6 root root 4096 Oct 11 13:58 /tmp [root@linux ~]# ls -ld /tmp/testing1 drwxr-xr-x 2 root root 4096 Oct 11 13:58 /tmp/testing1 瞧!原本的所谓上层目录 /tmp 的 link 数量由 5 增加为 6 ,至于新目录 /tmp/testing 则为 2 ,这样 可以理解目录的 link 数量的意义了吗?! ^_^ 磁盘的分割、格式化、检验与挂载: 对于一个系统管理者 ( root ) 而言,磁盘的的管理是相当重要的一环,尤其近来硬盘已经渐渐的被当成 是消耗品了 ..... 好了,如果我们想要在系统里面新增一颗硬盘时,应该有哪些动作需要做的呢?有几个 动作啰: 1. 对磁盘进行分割,以建立可用的 partition ; 2. 对该 partition 进行格式化( format ),以建立系统可用的 filesystem; 3. 若想要仔细一点,则可对刚刚建立好的 filesystem 进行检验; 4. 在 Linux 系统上,需要建立挂载点 ( 亦即是目录 ),并将他挂载上来; 当然啰,在上述的过程当中,还有很多需要考虑的,例如磁盘分割槽 (partition) 需要定多大? 是否需 要加入 journal 的功能?inode 与 block 的数量应该如何规划等等的问题。但是这些问题的决定, 都需 要与您的主机用途来加以考虑的~所以,在这个小节里面,鸟哥仅会介绍几个动作而已, 更详细的设定值, 则需要以您未来的经验来参考啰! 磁盘分割: fdisk [root@linux ~]# fdisk [-l] 装置名称 参数: -l :输出后面接的装置所有的 partition 内容。若仅有 fdisk -l 时, 则系统将会把整个系统内能够搜寻到的装置的 partition 均列出来。 范例: 范例:查阅您的第一颗硬盘内的相关信息 [root@linux ~]# fdisk /dev/hda <== 仔细看,不要加上数字喔! The number of cylinders for this disk is set to 2494. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) # 在你进入 fdisk 这支程序的工作画面后,如果您的硬盘太大的话,就会出现如上讯息。 # 这个讯息仅是在告知你,因为某些旧版的软件与操作系统并无法支持大于 1024 # 磁柱 (cylinter) 后的扇区使用,不过我们 Linux 是没问题啦! Command (m for help): m <== 输入 m 后,就会看到底下这些指令介绍 Command action a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibility flag d delete a partition l list known partition types m print this menu n add a new partition o create a new empty DOS partition table p print the partition table q quit without saving changes s create a new empty Sun disklabel t change a partition's system id u change display/entry units v verify the partition table w write table to disk and exit x extra functionality (experts only) # 这里注意一下,使用 fdisk 这支程序是完全不需要背指令的,因为按下 m 之后, # 立刻就会有一堆指令说明跑出来了!在上面的指令当中,比较重要的有: # d 删除一个磁盘分割槽、 n 新增一个磁盘分割槽、 p 将目前的磁盘分割槽列出来、 # q 不储存离开!这个重要! w 写入磁盘分割表后离开!这个危险! Command (m for help): p <== 这里可以输出目前磁盘的状态 Disk /dev/hda: 20.5 GB, 20520493056 bytes <== 硬盘的信息在这底下三行 255 heads, 63 sectors/track, 2494 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/hda1 * 1 765 6144831 83 Linux /dev/hda2 766 1147 3068415 83 Linux /dev/hda3 1148 1274 1020127+ 82 Linux swap /dev/hda4 1275 2494 9799650 5 Extended /dev/hda5 1275 2494 9799618+ 83 Linux # 由上面的信息,您可以知道,我的硬盘是 20GB 的,而 Head/Sector/Cylinder # 的数量为 255/63/2494 ,另外,可以看到上头的 Boot 吗?那个地方代表有开机信息的 # partition !另外,那个 start 与 end 则是指每一个 partition 的开始与结束的 # Cylinder 号码!这样可以了解我们前面一直强调的, partition 最小单位为 cylinder # 此外,上头显示的那个 Id 为主要档案格式的代号,你可以按下 l ( L 的小写 ) # 就可以知道我们 linux 的 fdisk 认识多少档案系统啰! ^_^ # 至于 Blocks 则以 KBytes 来显示该 partition 的容量的 Command (m for help): q # 想要不储存离开吗?按下 q 就对了!不要随便按 w 啊! 范例:查阅目前系统内的所有 partition 有哪些? [root@linux ~]# fdisk -l Disk /dev/hda: 20.5 GB, 20520493056 bytes 255 heads, 63 sectors/track, 2494 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot /dev/hda1 * /dev/hda2 /dev/hda3 /dev/hda4 /dev/hda5 Start 1 766 1148 1275 1275 End 765 1147 1274 2494 2494 Blocks Id System 6144831 83 Linux 3068415 83 Linux 1020127+ 82 Linux swap 9799650 5 Extended 9799618+ 83 Linux Disk /dev/hdb: 30.7 GB, 30735581184 bytes 255 heads, 63 sectors/track, 3736 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/hdb1 * 1 3633 29182041 83 Linux # 由于我的这个系统有两颗硬盘,下达 fdisk -l 的话,所有的 partition 都看到了! # 另外,我可以确定我的 /dev/hdb 还有剩余空间喔!因为由上面的信息看来, # 我的 /dev/hdb 的磁柱应该可以到 3736 ,但是目前只用到 3633 ,所以, # 就肯定还有剩余空间拉!等一下我们就用这个来测试啰! 还记得我们刚刚在 认识 EXT2 档案系统 里面提到的 partition 部分内容吗?其实 fdisk 最主要的工作 就是在修改『 partition table 』 而已,并没有实际的将硬盘切切割割的啦!他会定义出某一个 partition 是由 n1 磁柱到 n2 磁柱之间这样的信息!因此,如果硬盘分割错误时,只要在 format 之前将 partition tables 复原,那么就可以将硬盘原来的数据救回来啰!所以,一个好的管理员,有时候也会将自己的 partition table 记录下来,以备不时之需呀! 这个 fdisk 只有 root 才能执行,此外,请注意, 使用的『装置名称』请不要加上数字,因为 partition 是针对『整个硬盘装置』而不是某个 partition 呢!所以执行 fdisk /dev/hdb1 就会发生错误啦!要使 用 fdisk /dev/hdb 才对!那么我们知道可以利用 fdisk 来查阅硬盘的 partition 信息外,底下再来说 一说进入 fdisk 之后的几个常做的工作! Tips: 你可以使用 fdisk 在您的硬盘上面胡搞瞎搞的进行实际操作,都 不打紧, 但是请『千万记住,不要按下 w 即可!』离开的时候按 下 q 就万事无妨啰! • 删除磁盘分割槽 刚刚的 fdisk 结果当中,我知道我的 /dev/hdb 仅有 /dev/hdb1 而已, 那么假设我要将这个 /dev/hdb1 删除的话,可以怎么做? 1. fdisk /dev/hdb :先进入 fdisk 画面; 2. p :先看一下扇区的信息,假设要杀掉 /dev/hdb1; 3. d :这个时候会要你选择一个 partition ,就选 1 啰! 4. w (or) q :按 w 可储存到磁盘数据表中,并离开 fdisk ;当然啰, 如果你反悔了,呵呵,直 接按下 q 就可以取消刚刚的删除动作了! [root@linux ~]# fdisk /dev/hdb 1. 先看看整个结果是如何~ Command (m for help): p Disk /dev/hdb: 30.7 GB, 30735581184 bytes 255 heads, 63 sectors/track, 3736 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot /dev/hdb1 * Start 1 End 3633 Blocks Id System 29182041 83 Linux 2. 按下 d 给他删除吧! Command (m for help): d Selected partition 1 # 因为我们这个磁盘仅有 1 个 partition ,所以系统会自动帮我们~ Command (m for help): p Disk /dev/hdb: 30.7 GB, 30735581184 bytes 255 heads, 63 sectors/track, 3736 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System # 『看』不见了! partition 就这样不见了! Command (m for help): q # 鸟哥这里仅是做一个练习而已,所以,按下 q 就能够离开啰~ • 新增磁盘分割槽 那么如何新增 partition 呢?以鸟哥刚刚的 /dev/hdb 为例, 我的 /dev/hdb 有一个 /dev/hdb1 ,而且 还有剩余空间,那我如何利用? 1. fdisk /dev/hdb :先进入 fdisk 画面中; 2. n:新增一个扇区,这个时候系统会问你, 如果您已经具有 extended 扇区时,那么系统会问您, 您要新增的是 Primary 还是 Logical ,而如果您还没有 extended ,那么系统仅会问你要新增 Primary 还是 Extended。除此之外,如果您已经用完了四个 P + E 的话,那么就仅有 Logical 可 以选择啦!请再回到刚刚说明硬盘的地方再次的复习一下吧!如果是选择 primary 的话,请按 p , 否则请按 e (extended) 或 l (logical)。 3. p :由于选 择为 primary 所以就会按下 p 啰! 4. 1-4 :primary 只允许四个, 所以这里请按尚未被使用的那一个扇区啰! 5. w :同样的储存离开啰! 好了,假设鸟哥想要将我刚刚的 /dev/hdb 剩余空间分为两个分割槽, 一个是 primary ,另一个则是 logical ,且 primary 只要 100MBytes 就够了! 其它的都分给 logical ,那可以这么做! [root@linux ~]# fdisk /dev/hdb Command (m for help): n Command action e extended p primary partition (1-4) p <==就是这里!可以自行决定是 p 还是 e 喔! Partition number (1-4): 4 <==编号可以随意! First cylinder (3634-3736, default 3634): <==这里按下 Enter 就会使用默认值 Using default value 3634 Last cylinder or +size or +sizeM or +sizeK (3634-3736, default 3736): +100M # 这个地方有趣了!我们知道 partition 是由 n1 到 n2 的磁柱 (cylinder), # 但是我们对于磁柱的大小不容易掌握!这个时候可以填入 +100M 来让系统自动帮我们找出 # 『最接近 100M 的那个 cylinder 号码』!因为不可能刚好等于 100MBytes 啦! Command (m for help): p Disk /dev/hdb: 30.7 GB, 30735581184 bytes 255 heads, 63 sectors/track, 3736 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/hdb1 * 1 3633 29182041 83 Linux /dev/hdb4 3634 3646 104422+ 83 Linux # 这个就是刚刚建立起来的 primary partition 啰!再继续吧! Command (m for help): n Command action e extended p primary partition (1-4) e Partition number (1-4): 2 First cylinder (3647-3736, default 3647): <==这里按下 Enter 就会使用默认值 Using default value 3647 Last cylinder or +size or +sizeM or +sizeK (3647-3736, default 3736): <==Enter Using default value 3736 Command (m for help): p Disk /dev/hdb: 30.7 GB, 30735581184 bytes 255 heads, 63 sectors/track, 3736 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/hdb1 * 1 3633 29182041 83 Linux /dev/hdb2 3647 3736 722925 5 Extended /dev/hdb4 3634 3646 104422+ 83 Linux # 仔细看,我们说过, 1-4 号是磁盘保留的号码,所以这个号码可以随意设定, # 不一定要由 1 开始呢!但是,等一下做的 logical 就一定是由 5 开始累加了! Command (m for help): n Command action l logical (5 or over) p primary partition (1-4) l <== 使用的是 logical 的 partition 喔! First cylinder (3647-3736, default 3647):<==Enter Using default value 3647 Last cylinder or +size or +sizeM or +sizeK (3647-3736, default 3736):<==Enter Using default value 3736 Command (m for help): p Disk /dev/hdb: 30.7 GB, 30735581184 bytes 255 heads, 63 sectors/track, 3736 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/hdb1 * 1 3633 29182041 83 Linux /dev/hdb2 3647 3736 722925 5 Extended /dev/hdb4 3634 3646 104422+ 83 Linux /dev/hdb5 3647 3736 722893+ 83 Linux # 这可就 OK 啰~虽然新作出三个 partition ,不过仅有 /dev/hdb4 与 # /dev/hdb5 可以用啊! Command (m for help): w The kernel still uses the old table. The new table will be used at the next reboot. Syncing disks. # 有的时候,磁盘分割表变动之后,得要重新开机,有的则不需要~ # 上面的讯息告诉我们,需要重新开机呢!那就 reboot 吧! 透过上面的例子,您可以清楚的看到,呵呵!第一个 logical 是在 5 号呦!OK!在 fdisk 完成之后,请 记得使用 mke2fs 格式化啰!另外,请注意,如果过程中进行错误时, 那么赶紧按下 q 离开即可! • 操作环境的说明 以 root 的身份进行硬盘的 partition 时,最好是在单人维护模式底下比较安全一些, 此外,在进行 fdisk 的时候,如果该硬盘某个 partition 还在使用当中, 那么很有可能系统核心会无法重新加载硬盘 的 partition table ,解决的方法就是将该使用中的 partition 给他卸载,然后再重新进入 fdisk 一遍, 重新写入 partition table ,那么就可以成功啰! • 注意事项: 另外,请注意一下,虽然一颗硬盘最大的逻辑扇区可以到达 63 号( 总数,包含 1~4 的 primary partition ),但是并非所有的 Linux distribution 都会将所有的逻辑扇区对应的磁盘代号都写入系统当 中,以 Red Hat 为例,他仅列出 1~16 个代码,其它的您就得自己动手做啦!至于 Fedora 的话,他则是 使用自己侦测的,当您以 fdisk 设定好了 partition table 之后,磁盘对应的磁盘代号就会自动的在您 的 /dev/ 里头设定完成啰!不过,有的时候您还是得自己设定一下磁盘代码啦!如何设定呢?就使用 mknod 这个指令吧! 磁盘格式化 [root@linux ~]# mke2fs [-bicLj] 装置名称 参数: -b :可以设定每个 block 的大小,目前支持 1024, 2048, 4096 bytes 三种; -i :多少容量给予一个 inode 呢? -c :检查磁盘错误,仅下达一次 -c 时,会进行快速读取测试; 如果下达两次 -c -c 的话,会测试读写(read-write),会很慢~ -L :后面可以接表头名称 (Label),这个 label 是有用的喔!后面会讲~ -j :本来 mke2fs 是 EXT2 ,加上 -j 后,会主动加入 journal 而成为 EXT3。 范例: 范例一:将刚刚建立的 /dev/hdb5 格式化成为 ext3 吧!且名称为 logical [root@linux ~]# mke2fs -j -L "logical" /dev/hdb5 mke2fs 1.37 (21-Mar-2005) Filesystem label=logical OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 90432 inodes, 180723 blocks 9036 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=188743680 6 block groups 32768 blocks per group, 32768 fragments per group 15072 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840 Writing inode tables: done Creating journal (4096 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 27 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. # 这样子就能够将我们的系统给他建立起来啰~ 范例二:承上题,如果将 block 改为 2048 ,且 inode 改为 4096? [root@linux ~]# mke2fs -j -L "logical" -b 2048 -i 4096 /dev/hdb5 # 呈现出来的结果大致与范例一相似~不过就是 block 大小与 inode 数量会改变! 这是用来将磁盘格式化成 Linux 系统文件的指令。基本上,只要写入对的装置档案就可以了。 例如我们 要格式化软盘的话,或是新的硬盘 /dev/hda5 等等! 这个指令通常是在新的硬盘上面切割完之后,再加 以格式化的!另外,如果要将旧的扇区格式化成 ext2 格式的话,就使用这个指令吧!进行当中显示的讯 息有点像上面的最后几行, 系统会显示目前的格式化的默认值! 而如果要设定不同的 Block ,就可以使用 -b 这个参数!请注意啰,预设的情况下, Block 是 4096!此 外,您也可以自订 inode table 呢!而,当没有指定的时候, mke2fs 使用 ext2 为格式化档案格式,若 加入 –j 时,则格式化为 ext3 这个 Journaling 的 filesystem 呦! 上面提到的是关于将磁盘给他格式化成为 ext2/ext3 档案系统的指令, 那么如果想要格式化成为其它的 档案系统呢?可以直接使用 mkfs 这个指令喔! 这个指令其实是将几个指令整合的一个功能而已!实际上, 你可以参考:『 ls -l /sbin/mkfs* 』来看看系统有的、可以支持的档案格式呢!利用 man mkfs 就能够 查阅啰! 接下来,如果我想要制作一个可以开机进入 Linux 的软盘片呢? 可以有底下这个作法喔! • mkbootdisk (制作软盘开机片) [root@linux ~]# mkbootdisk --device /dev/fd0 `uname -r` 这是制作开机磁盘的指令,其中,『 `uname -r` 』是目前 Linux 系统所使用的核心版本, 如果你有多 个核心版本的话,你可以直接输入核心版本。例如在鸟哥的系统中, 旧的核心还是有保留的,所以我都会 至少有两个核心,在我管理的某部主机中,核心为 2.6.11-1.1369_FC4 及 2.6.12-1.1398_FC4 ,那么如 果我要直接以 2.6.11-1.1369_FC4 来开机的话,就可以使用: mkbootdisk --device /dev/fd0 2.6.11-1.1369_FC4 这个时候, mkbootdisk 就会以 /lib/modules 目录下的数据,配合 /boot 底下的 kernel 档案,来建立 可开机的磁盘啰~建立软盘开机片一直是个好主意! 他可以在你求助无门的时候给你莫大的帮助喔!所以, 建立一个新的软盘开机片是一个好主意啦! • fdformat (进行软盘低阶格式化) [root@linux ~]# fdformat /dev/fd0H1440 这是用来『低阶格式化』软盘的指令。( 注意:软盘的装置文件为 /dev/fd0 )!在上面的装置档案为 /dev/fd0H1440 , 其中加在 /fd0 之后的 H1440 为表示 1.44MB 的软盘容量! 在低阶格式化之后,还要 将软盘的档案格式化为 Linux 的 ext2 之型态,则需要使用 mke2fs 指令! 磁盘检验: fsck, badblocks 现在也建立好了新的 partition 了,也 format 好了,那么有没有其它的关于硬盘的工作需要来进行呢? 有的,就是需要怎样来检查硬盘有没有坏轨呢?那个就是 fsck 这个工具的用途啦!此外,您会发现到, 在 / 这个目录底下 ( 其实只要有挂载硬盘的那个目录底下都有这个目录 ) 会有一个特殊的目录,就是 『 lost+found 』这个目录啦!对的!就是当你处理完 fsck 之后,如果程序有发现到任何的错误的档案, 就会将该档案的数据给他丢到这个目录当中,嘿嘿! 所以当你发现你的 Linux 目录当中有这个档案时, 不要担心,那个是正常的啦!而且 只有挂载 partition 的目录 (就是挂载点) 才会有这个预设的目录啰! 还有,由于在 Linux 系统当中,为了增加系统效能,通常系统预设就是一些数据会写在内存当中, 并不 会直接将数据写入硬盘里面,这是因为内存的速度要比硬盘快上若干倍呀! 但是有个问题就发生了,万一 系统由于『跳电』或者是其它的莫名原因,造成系统的 shutdown 时,唉呀!怎么办?!系统就完蛋啦! 所以啰,我们需要在某些特定的时候让数据直接回存到硬盘之中呀! 瞭乎!这里提供几个惯用的指令,其 中,那个 fsck 是相当重要的,请参考其用法啰! • fsck [root@linux ~]# fsck [-AtCary] 装置名称 参数: -t :fsck 可以检查好几种不同的 filesystem ,而 fsck 只是一支综合程序而已。 个别的 filesystem 的检验程序都在 /sbin 底下,您可以使用 ls -l /sbin/fsck* 去检查看看,就知道有几种 filesystem 啰。预设的 FC4 情况下,至少有: ext2, ext3, vfat, msdos 等等 filesystem。 -A :依据 /etc/fstab 的内容,将所有的装置都扫瞄一次 (通常开机过程中就会执行此一指令) -a :自动修复检查到的有问题的扇区,所以你不用一直按 y 啰! -r :一定要让使用者决定是否需要修复,这与上一个 -a 刚好相反! -y :与 -a 类似,但是某些 filesystem 仅支持 -y 这个参数,所以您也可以利用 -y 啦! -C :可以在检验的过程当中,使用一个长条图来显示目前的进度! -f :强制检查!一般来说,如果 fsck 没有发现任何 unclean 的旗标,不会主动进入 细部检查的,如果您想要强制 fsck 进入细部检查,就得加上 -f 旗标啰! 范例: 范例一:将前面我们建立的 /dev/hdb5 这个装置给他检验一下! [root@linux ~]# fsck -C -t ext3 /dev/hdb5 fsck 1.37 (21-Mar-2005) e2fsck 1.37 (21-Mar-2005) logical: clean, 11/181056 files, 21706/361446 blocks # 如果一切没有问题,就会出现上述的讯息~ 这是用来检查与修正硬盘错误的指令。注意:通常只有身为 root 且你的系统有问题的时候才使用这个指 令,否则在正常状况下使用此一指令, 可能会造成对档案的危害!通常使用这个指令的场合都是在系统出 现极大的问题,导致你在 Linux 开机的时候得进入单人单机模式下进行维护的行为时,才必须使用此一指 令! 另外,如果你怀疑刚刚格式化成功的硬盘有问题的时后,也可以使用 fsck 来检查一下硬盘呦!其实 就有点像是 Windows 的 scandisk 啦!此外,由于 fsck 在扫瞄硬盘的时候,可能会造成部分 filesystem 的损坏,所以『执行 fsck 时, 被检查的 partition 务必不可挂载到系统上!亦即是需要在卸载的状态 喔!』 常常我们会发现,在比较老旧的机器上 ( 例如鸟哥的 p-166 ),如果主机不正常的关机 (例如跳电啰!), 那么硬盘很可能会出现错误的状况!这个时候 Linux 就无法正常的开机!这个时候就需要输入 root 的密 码,以登入单人维护模式 (run level 1),然后下达 fsck -y /dev/hdxxx 来检查你的硬盘!等到确认成 功之后,就使用 reboot 来重新启动吧! • badblocks [root@linux ~]# badblocks -[svw] 装置名称 参数: -s :在屏幕上列出进度 -v :可以在屏幕上看到进度 -w :使用写入的方式来测试,建议不要使用此一参数,尤其是待检查的装置已有档案时! 范例: [root@linux ~]# badblocks -sv /dev/hdb5 Checking blocks 0 to 722893 Checking for bad blocks (read-only test): done 893 Pass completed, 0 bad blocks found. 这是用来检查硬盘或软盘扇区有没有坏轨的指令!跟 Windows 的 scandisk 相同功能啦!不过由于 fsck 的功能比较强,所以目前大多已经不使用这个指令了! • sync 在正常的状况中,由于为了增加系统的效率,因此, 很多时候进行中的程序产生的程序之临时文件都不会 直接存至磁盘驱动器当中, 而是记忆在内存当中!由于内存的数据传递速度比磁盘驱动器快了几十倍, 所 以如此一来将有助于整个系统的效率!!然而这也产生了一个困扰, 那就是当你的系统不正常关机的时候, 可能会使得一些已经经过改变,却还没有存入磁盘中的数据遗失(因为还在内存当中!)所以这个时候 sync 的功能就相当的大了! 因为他可以直接将系统暂存在内存当中的数据回存写入磁盘当中,呵呵! 很棒吧! 但是需要注意你的系统核心 (kernel) 必须要有支持 sync 才行(目前几乎一定都会支持的啦!) 磁盘挂载与卸载 要将上面我们所建立起来的磁盘档案系统或软盘正式的在 Linux 上面启用时,一定需要将他挂载上档案系 统! 而所谓的『挂载点』则是该 partition 所在的目录,且在该目录下的所有目录都归在该 partition 所 有!假设一个情况好了,我们的 / 为 /dev/hda1 而 /home 为 /dev/hda2 ,那么在 /home/test 底下的 咚咚就也都归 /dev/hda2 这个 partition 所有啰!而需要特别留意的是,由于挂载档案系统需要挂载点, 所以挂载的时候得先建立起挂载的目录才行! 除此之外,如果您要用来挂载的目录里面并不是空的,那么挂载了档案系统之后, 那么原目录下的东西就 会暂时的消失。举个例子来说,假设您的 /home 原本是属于根目录 / 底下的 partition 所有,底下原本 就有 /home/test 与 /home/vbird 两个目录。然后你想要加入新的硬盘,并且直接挂载 /home 底下,那 么当您挂载上新的 partition 时,则 /home 目录显示的是该 partition 的内容,至于原先的 test 与 vbird 这两个目录就会暂时的被隐藏掉了!注意喔!并不是被覆盖掉, 而是暂时的隐藏了起来,等到 partition 被 umount 之后, 则该目录的内容就会再次的跑出来啦! 而要将档案系统挂载到我们的 Linux 系统上,就要使用 mount 这个指令啦! 不过,这个指令真的是博大 精深~粉难啦!我们学简单一点啊~ ^_^ [root@linux ~]# mount -a [root@linux ~]# mount [-tonL] 装置名称代号 挂载点 参数: -a :依照 /etc/fstab 的内容将所有相关的磁盘都挂上来! -n :一般来说,当我们挂载档案系统到 Linux 上头时, Linux 会主动的将 目前的 partition 与 filesystem 还有对应的挂载点,都记录到 /etc/mtab 那个档案中。不过,有些时刻 (例如不正常关机导致一些问题,而进入单人模式) 系统无法写入 /etc/mtab 时,就可以加上 -n 这个参数来略过写入 mtab 的动作。 -L :系统除了利用装置名称代号 (例如 /dev/hda1) 之外,还可以利用 partition 的表头名称 ( Label ) 来进行挂载喔!所以,最好为您的 partition 取一个 在您系统当中独一无二的名称吧! -t :您的 Linux 支持的档案格式,就写在这里吧!举例来说,我们在上面建立 /dev/hdb5 是 ext3 档案系统,那么要挂载时,就得要加上 -t ext3 来告知系统,用 ext3 的档案格式来挂载该 partition 呢! 至于系统支持的 filesystem 类型在 /lib/modules/`uname -r`/kernel/fs 当中。 常见的有: ext2, ext3, reiserfs, 等 Linux 惯用 filesystem vfat, msdos 等 Windows 常见 filesystem iso9660 为光盘片的格式 nfs, smbfs 等为网络相关档案系统。这部分未来我们会在网络方面提及! 若 mount 后面没有加 -t 档案系统格式时,则 Linux 在预设的情况下, 会主动以 /etc/filesystems 这个档案内规范的档案系统格式 来尝试主动的挂载喔! -o :后面可以接一些挂载时,额外加上的参数喔!比方说账号、密码、读写权限等: ro, rw: 此 partition 为只读(ro) 或可擦写(rw) async, sync: 此 partition 为同步写入 (sync) 或异步 (async),这个与我们 之前提到的档案系统运作方式有关,预设是 async auto, noauto: 允许此 partition 被以 mount -a 自动挂载(auto) dev, nodev: 是否允许此 partition 上,可建立装置档案? dev 为可允许 suid, nosuid: 是否允许此 partition 含有 suid/sgid 的档案格式? exec, noexec: 是否允许此 partition 上拥有可执行 binary 档案? user, nouser: 是否允许此 partition 让 user 执行 mount ?一般来说, mount 仅有 root 可以进行,但下达 user 参数,则可让 一般 user 也能够对此 partition 进行 mount 。 defaults: 默认值为:rw, suid, dev, exec, auto, nouser, and async remount: 重新挂载,这在系统出错,或重新更新参数时,很有用! 范例: 范例一:将刚刚建立的 /dev/hdb5 挂载到 /mnt/hdb5 上面! [root@linux ~]# mkdir /mnt/hdb5 [root@linux ~]# mount -t ext3 /dev/hdb5 /mnt/hdb5 [root@linux ~]# df Filesystem 1K-blocks Used Available Use% Mounted on ....中间省略..... /dev/hdb5 700144 20664 643336 4% /mnt/hdb5 范例二:挂载光盘! [root@linux ~]# mount -t iso9660 /dev/cdrom /mnt/cdrom [root@linux ~]# mount /dev/cdrom # 上面的参数当中提到,如果没有加上 -t 这个参数时,系统会主动的以 # /etc/filesystems 里面规范的内容给他测试一下是否挂载~另外, # 因为我们的 /etc/fstab 里面会规范 /dev/cdrom 应该挂载到那个挂载点, # 因此,直接下达 mount /dev/cdrom 也是可以的喔!(当然要看/etc/fstab 设定啦!) 范例三:挂载 Window fat 软盘! [root@linux ~]# mount -t vfat /dev/fd0 /mnt/floppy 范例四:将 / 重新挂载,并加入参数为 rw ! [root@linux ~]# mount -o remount,rw / 范例五:将 Label 名为 logical 的 partition 挂载到 /mnt/hdb5 中 [root@linux ~]# mount -t ext3 -L logical /mnt/hdb5 范例六:将系统所有的以挂载的 partition 数据列出来 [root@linux ~]# mount /dev/hda1 on / type ext3 (rw) /dev/proc on /proc type proc (rw) /dev/shm on /dev/shm type tmpfs (rw) /dev/hda5 on /home type ext3 (rw) /dev/hdb5 on /mnt/hdb5 type ext3 (rw) # 嗯!不加任何参数,则 mount 会将目前系统的所有 partition # 与相关对应的 filesystem 及 mount point 都列出来! 在预设的情况下, mount 这个指令只有 root 才能执行! 如果您想要将整个系统里面记录的 filesystem 与 mount point 对应的数据 (记录在 /etc/fstab 文件中!), 全部都挂载上来,那么请执行: mount -a 就可以依照 /etc/fstab 的参数内容将所有的磁盘给他重新挂上去!此外,需要注意的是,由于 Linux 系 统中,每一个路径都有可能是一个独立的扇区系统, 所以需要将每个扇区系统都挂上各自的挂载点!详细 的内容请回去参考一下上一篇 Linux 档案系统 的说明。另外, 由于各个扇区的档案系统可能并不相同, 所以您必须先要了解该扇区的档案系统, 这样才可以进行 mount 的工作!如何知道该磁盘的档案格式呢? 可以使用 fdisk 来显示的功能即可! 另外,如果您没有加上 -t 的参数,那么系统会预设尝试以 /etc/filesystems 内的档案系统格式来测试 一下是否可以将装置挂载上来呢! 请注意呦!由于 mount 之后的 partition 就已经被设定在使用了, 所以,您不可以使用 fsck 检查该 partition 呢!否则可能会造成 filesystem 的损毁~ 因此,你就必须要将该 partition 给卸载才行!可 以利用 umount 来卸载喔! 另外,我们也可以利用 mount 来将某个目录挂载到另外一个目录去喔! 这并不是挂载档案系统,而是额 外挂载某个目录的方法! 其实可以利用 link file 来达到底下范例的功能啦! ^_^ 范例一:将 /home 这个目录暂时挂载到 /tmp/home 底下: [root@linux ~]# mkdir /tmp/home [root@linux ~]# mount --bind /home /tmp/home [root@linux ~]# ls -lid /home/ /tmp/home 159841 drwxr-xr-x 6 root root 4096 May 30 20:07 /home/ 159841 drwxr-xr-x 6 root root 4096 May 30 20:07 /tmp/home 范例二:将 /tmp/home 卸载: [root@linux ~]# umount /tmp/home 看起来,其实两者连结到同一个 inode 嘛!! ^_^ 没错啦!透过这个 mount --bind 的功能, 您可以将 某个目录挂载到其它目录去喔!而并不是整块 filesystem 的啦! • umount (将装置档案卸载) [root@linux ~]# umount 装置代号或挂载点 [root@linux ~]# umount /dev/hdb5 [root@linux ~]# umount /mnt/hdb5 就是直接将 mount 上来的档案系统给他卸载即是!卸载之后,可以使用 df 看看是否还存在呢?! 此外, 也可以利用 -f 参数将想要卸载的 partition 强制卸载!此外, 卸载的方式,可以下达装置 (如 /dev/hdb5) 或挂载点 (如 /mnt/hdb5),均可接受啦! 磁盘参数修订: 某些时刻,您可能会希望修改一下目前磁盘的一些相关信息,举例来说,磁盘的 Label , 或者是 journal 的参数,或者是其它硬盘运作时的相关参数 (例如 DMA 启动与否~)。 这个时候,就得需要底下这些相关 的指令功能啰~ • mknod [root@linux ~]# mknod 装置名称 [bcp] [Major] [Minor] 参数: 装置种类: b :设定装置名称成为一个周边储存设备档案,例如硬盘等; c :设定装置名称成为一个周边输入设备档案,例如鼠标/键盘等; p :设定装置名称成为一个 FIFO 档案; Major :主要装置代码; Minor :次要装置代码; 范例: 范例一:建立 /dev/hda10 这个磁盘储存装置 [root@linux ~]# mknod /dev/hda10 b 3 10 # 上面那个 3 与 10 是有意义的,不要随意设定啊! 还记得我们说过,在 Linux 底下所有的装置都以档案来代表吧!? 但是那个档案如何代表该装置呢?很 简单!就是透过档案的 major 与 minor 数值来替代的~所以,那个 major 与 minor 数值是有特殊意义 的, 不是随意设定的喔!举例来说,如果以硬盘装置来说明,那么 /dev/hda 到 /dev/hdd 的 major 与 minor 代码是: 硬盘代号 /dev/hda /dev/hdb /dev/hdc /dev/hdd Major 3 3 22 22 Minor 0~63 64~127 0~63 64~127 此外, mknod 也可以用来制作 FIFO 类型的档案喔!更多与 Linux 核心有关的装置及装置代号可以参考: • http://www.kernel.org/pub/linux/docs/device-list/devices.txt • e2label [root@linux ~]# e2label 装置名称 新的 Label 名称 [root@linux ~]# e2label /dev/hdb5 hdb5 [root@linux ~]# dumpe2fs -h /dev/hdb5 Filesystem volume name: hdb5 .....其它省略..... 这个东西也挺有趣的,主要的功能是用来修改『磁盘的表头数据』,也就是 label 啦。 那是甚么东西呢? 如果你使用过 Windows 的档案总管的话,那么应该会晓得, 每个磁盘驱动器代号后面都有个名称吧,呵 呵!那个就是 label 啰。这个东西除了有趣之外, 也会被使用到一些设定档案当中,举例来说,当我们 在挂载磁盘的时候,除了利用磁盘的代号之外 (/dev/hdxx) 也可以直接利用磁盘的 label 来作为挂载的 磁盘挂载点喔!基本上, 就是那个 /etc/fstab 档案的设定啰! 因为某些 distribution 为了方便,他们是以 Label 来做为磁盘挂载的依据, 这样有好有坏啦! • 优点:不论硬盘代号怎么变,不论您将硬盘插在那个 IDE 接口 (IDE1 或 IDE2 或 master 或 slave 等),由于系统是透过 Label ,所以,磁盘插在那个接口将不会有影响。 • 缺点:如果插了两颗硬盘,刚好两颗硬盘的 Label 有重复的,那就惨了~ 因为系统会无法判断 那个磁盘分割槽才是正确的! 所以,鸟哥通常还是比较喜欢直接利用磁盘代号来挂载啦! 不过,如果没有特殊需求的话,那么利用 Label 来挂载也成! 但是您就不可以随意修改 Label 的名称了! • tune2fs [root@linux ~]# tune2fs [-jlL] 装置代号 参数: -j :将 ext2 的 filesystem 转换为 ext3 的档案系统; -l :类似 dumpe2fs -h 的功能~将 superblock 内的数据读出来~ -L :类似 e2label 的功能,可以修改 filesystem 的 Label 喔! 范例: [root@linux ~]# tune2fs -l /dev/hdb5 这个指令的功能其实很广泛啦~上面鸟哥仅列出很简单的一些参数而已, 更多的用法请自行参考 man tune2fs 。比较有趣的是,如果您的某个 partition 原本是 ext2 的档案系统,如果想要将他更新成为 ext3 档案系统的话, 利用 tune2fs 就可以很简单的转换过来啰~ • hdparm 如果您的硬盘是有 DMA 模式功能的,但是系统却没有启动他,那么您的硬盘存取效能可能会降低一半以 上~ 所以,当然要启动 DMA 啦~那么如何启动?就用 hdparm 啊! 不过, hdparm 里头有很多很进阶的 参数设定值,一般来说, 不很建议大家随意修订~很容易造成硬盘的挂点喔! 用这个指令时,最多是启 动 DMA 模式,以及测试硬盘的存取效能就好了~ 真的不要随意更动其它参数喔!除非您真的知道自己在 干嘛~ [root@linux ~]# hdparm [-icdmXTt] 装置名称 参数: -i :系统在开机的过程当中,会利用本身核心的驱动程序(模块)来测试硬盘, 利用 -i 参数,可将这些测试值取出来,这些值不一定是正确的, 不过,却可以提供我们一个参考值的依据! -c :设定 32-bit (32 位)存取模式。这个 32 位存取模式指的是在硬盘在与 PCI 接口之间传输的模式,而硬盘本身是依旧以 16 位模式在跑得! 预设的情况下,这个设定值都会被打开,建议直接使用 c1 即可! -d :设定是否启用 dma 模式, -d1 为启动, -d0 为取消; -m :设定同步读取多个 sector 的模式。一般来说,设定此模式,可降低系统因为 读取磁盘而损耗的效能~不过, WD 的硬盘则不怎么建议设定此值~ 一般来说,设定为 16/32 是最佳化,不过,WD 硬盘建议值则是 4/8 。 这个值的最大值,可以利用 hdparm -i /dev/hda 输出的 MaxMultSect 来设定喔!一般如果不晓得,设定 16 是合理的! -X :设定 UtraDMA 的模式,一般来说, UDMA 的模式值加 64 即为设定值。 并且,硬盘与主机板芯片必须要同步,所以,取最小的那个。一般来说: 33 MHz DMA mode 0~2 (X64~X66) 66 MHz DMA mode 3~4 (X67~X68) 100MHz DMA mode 5 (X69) 如果您的硬盘上面显示的是 UATA 100 以上的,那么设定 X69 也不错! -T :测试暂存区 cache 的存取效能 -t :测试硬盘的实际存取效能 (较正确!) 范例: 范例一:取得我硬盘的最大同步存取 sector 值与目前的 UDMA 模式 [root@linux ~]# hdparm -i /dev/hda Model=ST320430A, FwRev=3.07, SerialNo=7BX02236 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% } RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=0 BuffType=unknown, BuffSize=512kB, MaxMultSect=16, MultSect=16 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=40079088 IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120} PIO modes: pio0 pio1 pio2 pio3 pio4 DMA modes: mdma0 mdma1 mdma2 UDMA modes: udma0 udma1 udma2 udma3 *udma4 AdvancedPM=no WriteCache=enabled Drive conforms to: device does not report version: 1 2 3 4 # 在输出的数据中,有几个比较重要的,除了 MaxMultSec 这个数值外, # 那个 UDMA modes: 会显示目前的 UDMA 模式 (有 * 号的那个为目前的值)。 范例二:取得我主机板上面关于 IDE 的速度限制 [root@linux ~]# lspci -v 00:07.1 IDE interface: VIA Technologies, Inc. VT82C586/B/686A/B PIPC Bus Master IDE (rev 10) (prog-if 8a [Master SecP PriP]) Subsystem: VIA Technologies, Inc. VT8235 Bus Master ATA133/100/66/33 IDE Flags: bus master, medium devsel, latency 32 I/O ports at d000 [size=16] Capabilities: [c0] Power Management version 2 # 我可以透过 lspci 来直接取得 PCI 接口上的各个装置设备。 # 其中,可以找到 IDE 接口,并从中找到关于这个接口可接受的速度呢! 范例三:启动我的 UDMA 在 mode 4 喔~ [root@linux ~]# hdparm -d1 -c1 -X68 /dev/hda # 由范例一与范例二,鸟哥的主机板上面大概仅能支持到 UDMA 66 吧~ # 那就是 mode4 啰~所以, X = 64+4 = 68 ,因此,设定就是 -X68 啰~ 范例四:测试这颗硬盘的读取效能 [root@linux ~]# hdparm -Tt /dev/hda /dev/hda: Timing cached reads: 544 MB in 2.01 seconds = 270.28 MB/sec Timing buffered disk reads: 80 MB in 3.01 seconds = 26.56 MB/sec # 我的机子没有很好啦~这样的速度.....差强人意~ 我们都知道目前的 IDE 硬盘主要的传输模式为 ATA 模式,最近 (2002 年)已经出到了 ATA 133 了!不 过,传统上, ATA 66 就已经很厉害了!新的 IDE 硬盘也没有办法完全利用 ATA 100 呢!但是,你知道 吗?有没有开启 ATA 这个传输信道的 DMA 模式, 对于硬盘的存取效率差很大呦! 这个指令必须要 root 才能执行!此外,需要特别注意, -X 这个参数是很危险的参数设定, 除非您非常 了解您的硬盘架构,否则不建议自行设定,因为 manual page 上面就有说明到这一点~~不过,无论如何, 目前大于 2GB 以上的硬盘至少都已经支持了 DMA 33 了!因此,使用 -X66 应该都是可行的!而如果您的 硬盘是很新的, 那么 -X69 应该是没有问题才是!不过,还是要 hdparm -i /dev/hd[a-d] 去检查看看! 设定开机挂载: 在上一小节里面,我们提到了硬盘的分割与格式化,同时还提到了如何挂载的问题等等, 在这个小节当中, 我们就持续的来讨论,那么 mount 还可以做哪些事情呢? 还有,如果想要一开机就让系统自动的帮我们 将 partition 挂载起来,又该如何呢? 各式磁盘挂载与 中文编码挂载还有 USB 随身碟: 这里再次强调一个观念,在 Windows 底下,磁盘分割是以 A, B, C, D, .... 等等的方式来划分的,然而 在 Linux 或 Unix 系统之下,却是以目录来代表,也就是说, 一个目录很可能就是一个扇区了! 举个例 子来说,通常 Linux 预设的软盘挂载的地点在 /mnt/floppy 这里!呵呵!那么如果你需要软盘的数据时, 就将 /dev/fd0 这一个装置(前面提过啰!这个是周边存取装置的一个设备档案类型)挂上 /mnt/floppy 就 可以啦!然后你进入到 /mnt/floppy 就可以读取软盘的数据啰! • 挂载软盘 很多朋友常常会使用到软盘,尤其是在网络有问题的时候,那么如何使用 Linux 将软盘挂上来呢?!首先, 您给先了解你的磁盘档案的格式,例如 Linux 的档案格式( ext2 )与 Windows 的档案格式( vfat ) 是不一样的!分别可以使用如下的方式挂上来: [root@linux ~]# mount -t ext2 /dev/fd0 /media/floppy [root@linux ~]# mount -t vfat /dev/fd0 /media/floppy [root@linux ~]# umount /media/floppy 所以啰!即使是 Windows 格式的档案,在 Linux 底下仍然是可以读取的到的呦!另外, 要注意的是,即 使你使用软盘完毕之后,一定要将 /media/floppy 卸载之后才可以取出软盘片喔!不然系统会一直告诉你 发生错误啰!而在卸载 /media/floppy 的时候,你一定不能在该目录底下,否则会发生错误讯息喔! 而 如果加载的格式不符合,系统也不会将该软盘挂上来的呦!好了,那么怎么制作 ext2 的软盘呢?简单的 很,就使用 mke2fs /dev/fd0 就行啦! • 挂载 Windows 磁盘 如果万一你在安装系统的时候忘记将 Windows 的 VFAT 格式的扇区 mount 上你的 Linux 时,该怎么 办?!这种现象最常发生在多系统共存的环境中!例如在原有的 Windows 98 或 Win2000 上面安装 Linux ,但是结果却忘记将该扇区挂载上来!嗯!这样需要重新安装吗?! 当然不需要了!又不是被入侵! 那么该如何挂载上来呢?! 就如同前面说的,由于一个目录可能代表了一个扇区,因此你必须要先建立一个目录, 然后再将此扇区挂 载上你的 Linux 目录,就可以啦!另外,由于需要将扇区挂在目录下, 所以你还得需要了解你的 Windows 扇区是在哪一个硬盘周边中喔!如何知道你的 Windows 扇区呢?就使用 fdisk 吧!使用 fdisk -l 就能 够知道啰~ 那么假设我的 windows 的 VFAT filesystem 是在 /dev/hda1 ,而我想要将该 partition 挂载到 /mnt/win98 ,该如何做? [root@linux ~]# mkdir /mnt/win98 [root@linux ~]# mount -t vfat /dev/hda1 /mnt/win98 [root@linux ~]# mount -t vfat -o iocharset=cp950 /dev/hda1 /mnt/win98 如此一来就将 Windows 的系统挂到 Linux 里面啰!简单吧!请注意, 上面那个第三行所使用的参数可以 让您的 Windows 98 的扇区当中的档案显示出正确的中文呦! 因为加入了中文编码啊! ^_^ • 挂载 USB 随身碟 以现在的科技来说(2005 年),软盘与光盘不再是最佳的携带工具了~ 最佳的携带储存设备应该是 USB 随 身碟或者是随身硬盘~那么我们可以挂载 USB 随身碟吗?!呵呵!当然可以啊~不过.....要我们的 Linux 捉的到 USB 才行~ 不过,您不需要担心,因为,目前的 distribution 均会主动的加载 USB 的模块, 所 以,您只要插入 USB 随身碟,嘿嘿!我们的 Linux 几乎没有问题,一定可以捉到的! 捉到 USB 随身碟之后,再利用 fdisk -l 列出所有的 partition ,您会发现, 系统中怎么会多出 /dev/sda[??] 的 SCSI 硬盘啊?!不会吧!系统这么好?? 呵呵!不是啦~其实 USB 硬盘的代号也是 /dev/sd[a-??] 的代号, 第一个 USB 代号为 /dev/sda ,而如果该 USB 硬盘还有 partition 的话, 那 就会有一些号码出现了~如果是随身碟,通常只有 /dev/sda1 而已啦~ 好,那就假设您的随身碟是 /dev/sda1 好了,那么将他挂载到 /mnt/usb ,要怎么做? [root@linux ~]# mkdir /mnt/usb [root@linux ~]# mount -t vfat /dev/sda1 /mnt/usb 上头是假设您的 USB 随身碟使用的是 FAT 的 Windows 档案格式而设定的。 如果您的随身碟是 NTFS 的 Windows 2000 档案格式,那就比较麻烦, 因为 FC4 预设情况下,并不支持这个档案系统的~ 如果您执 意要挂载 NTFS 的档案格式,那么..... 请参考底下这个计划的网站啰~ • Linux-NTFS Project: http://linux-ntfs.sourceforge.net/ 开机挂载 /etc/fstab 及 /etc/mtab 刚刚上面说了许多,那么可不可以在开机的时候就将我要的扇区都挂好呢?!这样我就不需要每次进入 Linux 系统都还要在挂载一次呀!当然可以啰!那就直接到 /etc/fstab 里面去修修就行啰!不过,在开 始说明前,这里要先跟大家说一说系统挂载的一些限制: • 根目录 / 是必须挂载的﹐而且一定要先于其它 mount point 被挂载进来。 • 其它 mount point 必须为已建立的目录﹐可任意指定﹐但一定要遵守必须的系统目录架构原则 • 所有 mount point 在同一时间之内﹐只能挂载一次。 • 所有 partition 在同一时间之内﹐只能挂载一次。 • 如若进行卸载﹐您必须先将工作目录移到 mount point(及其子目录) 之外。 好了,那么我们进入 /etc/fstab 看一看吧: [root@linux ~]# cat /etc/fstab # Device Mount point filesystem parameters dump fsck LABEL=/ / ext3 defaults 11 /dev/hda5 /home ext3 defaults 12 /dev/hda3 swap swap defaults 00 /dev/hdc /media/cdrom auto pamconsole,exec,noauto,managed 0 0 /dev/devpts /dev/pts devpts gid=5,mode=620 0 0 /dev/shm /dev/shm tmpfs defaults 00 /dev/proc /proc proc defaults 00 /dev/sys /sys sysfs defaults 00 其实这个 /etc/fstab 就是将我们使用 mount 来挂载一个装置到系统的某个挂载点, 所需要下达的指令 内容,将这些内容通通写到 /etc/fstab 里面去,而让系统一开机就主动挂载啰~ 那么 mount 下达指令 时,需要哪些参数?不就是『装置代号、挂载点、档案系统类别、参数』等等, 而我们的 /etc/fstab 则 加入了两项额外的功能,分别是备份指令 dump 的执行与否, 与是否开机进行 fsck 扫瞄磁盘呢~ 我这个人比较龟毛一点,因为某些 distributions 的 /etc/fstab 档案排列方式蛮丑的, 虽然每一栏之 间只要以空格符分开即可,但就是觉得丑,所以通常鸟哥就会自己排列整齐, 并加上批注符号,就是 # 字 号,来帮我记忆这些信息!由上面的说明,我们知道 /etc/fstab 内总共有六栏,分别来谈一谈每一栏的 内容吧! 1. 磁盘装置代号或该装置的 Label: 这个就是装置代号啦!将您需要的装置代号给他填上去吧!! 不过,还记得我们的 filesystem 可 以拥有标头名称吧 (Label)? 没错,我们也可以利用 Label 来挂载档案系统喔!例如上表当中 的特殊字体的第一行, 我的根目录 (/) 就是以 Label 名称为 / 的磁盘分割槽来挂载的啊! 利 用 label 挂载时,您必须要知道您的磁盘内的 label 名称,可以利用 dumpe2fs 来读取, 也可 以利用 e2label 来更改标头名称啊。 在知道了 label 名称后,最后就可以利用 LABEL=(your label name) 来设定您的装置啰~ Tips: 记得有一次有个网友写信给鸟哥,他说,依照 e2label 的设定去 练习修改自己的 partition 的 Label name 之后,却发现,再也 无法顺利开机成功! 后来才发现,原来他的 /etc/fstab 就是以 Label name 去挂载的。但是因为在练习的时候,将 Label name 改 名字过了,导致无法在开机的过程当中顺利搜寻到~所以啦, 各 位亲爱的朋友,这里再次的强调,利用装置名称 (ex> /dev/hda1) 来挂载 partition 时, 虽然是被固定死的,所以您的硬盘不可以 随意插在任意的插槽,不过他还是有好处的。 而使用 Label name 来挂载,虽然就没有插槽方面的问题,不过,您就得要随时注意您 的 Label name 喔!尤其是新增硬盘的时候! ^_^ 2. 挂载点 (mount point):: 就是挂载点啊!挂载点是什么?一定是目录啊~要知道啊!!! 3. 磁盘分割槽的档案系统: 就如同我们在这个章节一开始就谈到的, Linux 在传统上面,使用的是 ext2/ext3 等档案系统, 目前则加入了很多日志式档案系统,例如 reiserfs 及 XFS 等档案系统的支持。 此外,存在已 久的 Windows vfat, msdos 及 iso9660 的光盘档案系统, 还有网络档案系统如 nfs, smbfs 等 等,都可以被支持。这个字段就是写这些档案系统的地方啊! 4. 档案系统参数: 每个档案系统还有很多参数可以加入的,例如中文编码的 iocharset=big5,codepage=950 之类 的,当然还有很多常见的参数, 虽然之前在 mount 已经提过一次,这里我们利用表格的方式再 次的说明一下: 参数 async/sync 异步/同步 auto/noauto 自动/非自动 rw/ro 可擦写/只读 exec/noexec 可执行/不可执行 user/nouser 内容意义 是否允许磁盘与内存中的数据以同步写入的动作?使用 async 这 个异步写入的方式会比较快速一些。 在开机的时候是否自动挂载该扇区?既然设定在这个区域内了, 当然希望开机的时候自动挂载啰! 让该扇区以可擦写或者是只读的型态挂载上来,如果是 vfat 之类 的非 Linux 传统扇区,您不想让 Linux 变更的话,那么使用 ro 也不错!能够提供有效的保护呢! 限制在此档案系统内是否可以进行『执行』的工作?如果是纯粹用 来储存资料的, 那么可以设定为 noexec 会比较安全,相对的, 会比较麻烦! 是否允许使用者使用 mount 指令来挂载呢?一般而言,我们当然 允许/不允许使用者挂载 suid/nosuid 具有/不具有 suid 权限 usrquota grpquota defaults 不希望一般身份的 user 能使用 mount 啰,因为太不安全了,因 此这里应该要设定为 nouser 啰! 该档案系统是否允许 SUID 的存在?一般而言,如果不是 Linux 系统的扇区,而是一般数据的 partition ,那么设定为 nosuid 确 实比较安全一些!毕竟有 SUID 是蛮可怕的一件事。 注意名称是『 usrquota 』不要拼错了!这个是在启动 filesystem 支持磁盘配额模式,更多数据我们在第四篇再谈。 注意名称是『grpquota』,启动 filesystem 对群组磁盘配额模式 的支持。 同时具有 rw, suid, dev, exec, auto, nouser, async 等参数。 基本上,预设情况使用 defaults 设定即可! 5. 6. 能否被 dump 备份指令作用: 在 Linux 当中,可以利用 dump 这个指令来进行系统的备份的。而 dump 指令则会针对 /etc/fstab 的设定值,去选择是否要将该 partition 进行备份的动作呢! 0 代表不要做 dump 备份, 1 代表要进行 dump 的动作。 2 也代表要做 dump 备份动作, 不过,该 partition 重 要度比 1 小。 7. 是否以 fsck 检验扇区: 开机的过程中,系统预设会以 fsck 检验我们的 partition 内的 filesystem 是否完整 (clean)。 不过,某些 filesystem 是不需要检验的,例如虚拟内存 swap ,或者是特殊档案系 统, 例如 /proc 与 /sys 等等。所以,在这个字段中,我们可以设定是否要以 fsck 检验该 filesystem 喔。 0 是不要检验, 1 是要检验, 2 也是要检验,不过 1 会比较早被检验啦! 一 般来说,根目录设定为 1 ,其它的要检验的 filesystem 都设定为 2 就好了。 所以说,如果我想要将我们刚刚练习时,建立的 /dev/hdb5 这个 ext3 的 filesystem 挂载到 /mnt/hdb5 时, 并且在开机的时候就已经自动的挂载好,那么就可以将底下这一行写入到 /etc/fstab 当中了: /dev/hdb5 /mnt/hdb5 ext3 defaults 2 2 很简单吧!所以啦,以后您自己建立的磁盘档案系统想在开机的时候挂载好时,就在 /etc/fstab 加入吧! 此外,这个 /etc/fstab 还有什么特殊功能呢?还记得使用 mount -a 时,我们提到的该参数参考档案 吧?!没错啊!就是这个 /etc/fstab 啊!而且,一般来说, 当我们编辑 /etc/fstab 后,为了避免可能 的错误,通常就会以 mount -a 这个指令来测试看看呢!这是很重要的一个测试动作喔! 另外,您也必须要了解到,除了这些磁盘档案格式之外, 其实在系统里面还有一些特殊的格式可以挂载来 帮助系统的运作的! 例如上表当中非特殊字体的那几行字! 而 /etc/fstab 是开机时的设定档,不过,实际 filesystem 的挂载是记录到 /etc/mtab 与 /proc/mounts 这两个档案当中的。每次我们在更动 filesystem 的挂载时,也会同时更动这两个档案喔!但是,万一发 生您在 /etc/fstab 输入的数据错误,导致无法顺利开机成功,而进入单人维护模式当中,那时候的 / 可 是 read only 的状态,当然您就无法修改 /etc/fstab ,也无法更新 /etc/mtab 啰~那怎么办? 没关系, 可以利用底下这一招: [root@linux ~]# mount -n -o remount,rw / 加上 -n 则不更新 /etc/mtab ,加上 -o 则提供额外的参数设定。 利用这一动作,嘿嘿!您的 / 就可以 读写,那么自然就能够更新档案内容啰~ 特殊装置 loop 挂载 除了常见的软、硬盘挂载之外,我们还可以挂载特殊装置喔!举例来说,利用我们的硬盘内的档案仿真出 来的装置! 也就是说,当我的硬盘内有一个 2GB 的档案时,我可以将这个档案『模拟』成为一个独立的 装置, 然后用这个装置来挂载使用喔!当然啦,这个 2GB 的大档案要能够被挂载时, 他必须是一个『被 格式化过的档案』才行!底下我们就来玩一玩这个咚咚。 建立大型档案 首先,我们得先有一个大的档案吧!怎么建立这个大档案呢?在 Linux 底下我们有一支很好用的程序 dd 可以用来建立空的档案喔!详细的说明请先翻到后面一章 压缩指令的运用 来查阅,这里鸟哥仅作一个简 单的范例而已。 假设我要建立一个空的档案在 /tmp/loopdev ,那可以这样做: [root@linux ~]# dd if=/dev/zero of=/tmp/loopdev bs=1024k count=2048 2048+0 records in 2048+0 records out # 这个指令在下一小节也会谈到,那个 if 是 input file, # of 是 output file ,至于 bs 是每个 block 大小, # count 则是总共几个 bs 的意思。不过,测试时,注意 /tmp # 那个 partition 的大小啊! 格式化 很简单就建立起一个 2GB 的档案了吶!!接下来当然是格式化啰! [root@linux ~]# mke2fs -j /tmp/loopdev mke2fs 1.35 (28-Feb-2004) loopdev is not a block special device. Proceed anyway? (y,n) y Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 262144 inodes, 524288 blocks 26214 blocks (5.00%) reserved for the super user ....以下省略..... 挂载 那要如何挂载啊?利用 mount 的特殊参数,那个 -o loop 的参数来处理! [root@linux ~]# mount -t ext3 -o loop /tmp/loopdev /media/cdrom/ [root@linux ~]# df Filesystem /tmp/loopdev 1K-blocks 2064208 Used Available Use% Mounted on 35880 1923472 2% /media/cdrom 多了个独立的装置给您使用喔!其实就是那个 2GB 的档案内容啦! 这东西看起来似乎没有什么用途的样 子,不过,如果您未来想要玩 Linux 上面的『虚拟主机』的话, 也就是以一部 Linux 主机再切割成为数 个独立的主机系统时,类似 VMware 这类的软件, 在 Linux 上使用 xen 这个软件,他就可以配合这种 loop device 的档案类型来进行根目录的挂载, 真的非常有用的喔! ^_^ 虚拟内存之建置 我们前面谈了很多各式各样的 filesystem ,不过,您晓得在安装的时候设定的那一个『 虚拟内存 (swap) 』要如何增加吗?举个简单的例子吧,鸟哥的 Sun 主机上面,由于跑的程序太庞大了,通常 swap 需要开启到 1GB 左右,但是呢,有的时候还是会不够的!在 Linux 当中,如果您需要使用到很大量的虚 拟内存,偏偏当初给的 swap 扇区不够大,那要怎么办呢? 有什么方法可以来达成: • 设定一个 swap partition ? • 建立一个虚拟内存的档案? 怎么说呢?基本上,虚拟内存就是将硬盘规划出一个区间,让内存的数据可以经由硬盘来读取罢了, 那么 如果有 swap file 也就够了对不对!是呀!所以这里我们使用两种方法来尝试建立一下 swap 的扩增吧! 另外, swap 的建立其实也很简单啊!同样的需要先建立出 swap 这个装置或者是档案后, 将他格式化成 为 swap 的格式,最后将他挂载到系统上即可!那就来实作看看吧! 建立虚拟内存装置 第一种正规的方法是『直接再加一棵硬盘,并且将其中某个扇区规划为 swap 的 filesystem 』, 呵呵, 说的容易,做起来更容易!实际的动作为: 1. 以『 fdisk /dev/hd[a-d] 』先建立一个 partition ,还记得 fdisk 怎么做吗?回去复习一下 吧!简单的来说,就是先 (1)建立一个 partition,然后 (2)将该 partition 的 ID 改为 82 这 一个 swap 的磁盘档案格式代号就对 啦!这样这一步骤就 OK 啰! 2. 以『 mkswap /dev/hd[a-d][1-16] 』的方式来将您刚刚建置出来的 partition 『格式化为 swap 的档案格式』,很简单吧!这样就格式化 OK 啰! 3. 再来则是将 swap 启动,启动的指令为『 swapon /dev/hd[a-d][1-16] 』,这样就能启动了!很 简单吧!这样 swap 就自动加入到内存容量里头去了! 那么如何将 swap 关掉呢?呵呵!很简单呀!就是直接给他 swapoff 就对了! 例题一:如果您的系统是以鸟哥建议的方式来安装的,那么系统应该有一块剩余的空间。请将 该剩余的空间格式化成为一个 swap device ,并且挂载到系统上! 建立虚拟内存档案 那么万一我不想新增加一个扇区呢?可不可以使用 swap file 的方式来新增硬盘呀!当然可以啰! 而且 步骤还蛮简单的呢!基本的流程就是: 1. 以 dd 指令来建立 swapfile ; 2. 以 mkswap 来将 swapfile 格式化为 swap 的档案格式; 3. 以 swapon 来启动该档案,使成为 swap ; 4. 以 swapoff 来关闭该档案! 嗯!多说无益!我们来实际的将您的主机系统上面新增 64MB 的虚拟内存吧!如果可能的话, 请您在您的 系统上面实际的操作一次底下的步骤,我想,您应该马上会了解实际的操作流程的! (底下的步骤是可以 复原的!!别担心,不过 mkswap 这个指令的下达要小心一点就是了!) 1. 使用 dd 这个指令来新增一个 64MB 的档案在 /tmp 底下: [root@linux ~]# dd if=/dev/zero of=/tmp/swap bs=4k count=16382 16382+0 records in 16382+0 records out # dd 这个指令是用来转换档案并且 copy 用的; # if 指的是要被转换的输入档案格式 /dev/zero 可以由 man zero 来查看内容; # of 指的是输出的档案,我们将之输出到 /tmp/swap 这个档案; # bs 指的是一个扇区占用几个 kb ; # count 指的是要使用多少个 bs ,所以最后的容量为 bs*count = 4k * 16382 ~ 64MB 如上所述,我们将建立一个档名为 /tmp/swap 的档案,且其内容共有 64MB 左右大小的档案; 2. 使用 mkswap 将 /tmp/swap 这个档案格式化为 swap 的档案格式: [root@linux ~]# mkswap /tmp/swap Setting up swapspace version 1, size = 67096576 bytes # 请注意,这个指令在下达的时候请『特别小心』,因为下错字元控制, # 将可能使您的 filesystem 挂掉! 3. 使用 swapon 来将 /tmp/swap 启动啰! [root@linux ~]# free total Mem: 62524 -/+ buffers/cache: Swap: 127004 used 60200 39992 2620 free 2324 22532 124384 shared 0 buffers 716 cached 19492 [root@linux ~]# swapon /tmp/swap # 不要怀疑!这样就已经将虚拟内存增加 64 MB 啰!如果您需要每次都启动该档案, 那么将 swapon /tmp/swap 写入 /etc/rc.d/rc.local 当中即可! [root@linux ~]# free total Mem: 62524 -/+ buffers/cache: Swap: 192524 used 60240 40024 2620 free 2284 22500 189904 shared 0 buffers 724 cached 19492 4. 使用 swapoff 关掉 swap file [root@linux ~]# swapoff /tmp/swap 没错,就这么简单的将虚拟内存给他新增啰!赶快来去试试看去! 不过,如果您的 FC4 从来没有经过 update 的话,那么可能会发生一些小困扰, 困扰的原因在此: https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=164937 , 因为我们尚未学习如何以 rpm 安 装软件,所以这里的练习您可以先略过! 虚拟内存的限制 说实话,虚拟内存在目前的桌上型计算机来讲,存在的意义已经不大了!这是因为目前的 x86 主机所含的 内存实在都太大了 (一般入门级至少也都有 256MB 了),所以,我们的 Linux 系统大概都用不到虚拟内存 (swap) 这个玩意儿的。不过, 如果是针对服务器或者是工作站这些常年上线的系统来说的话,那么,无 论如何,swap 还是需要建立的。 因为 swap 主要的功能是当物理内存不够时,则某些在内存当中所占的程序会暂时被移动到 swap 当中, 让物理内存可以被需要的程序来使用。另外,如果您的主机支持电源管理模式, 也就是说,您的 Linux 主 机系统可以进入『休眠』模式的话,那么, 运作当中的程序状态泽会被纪录到 swap 去,以作为『唤醒』 主机的状态依据!。 另外,有某些程序在运作时,本来就会利用 swap 的特性来存放一些数据段, 所以, swap 来是需要建立的!只是不需要太大! 不过, swap 在被建立时,是有限制的喔! • 在核心 2.4.10 版本以后,单一 swap 量已经没有 2GB 的限制了, • 但是,最多还是仅能建立到 32 个 swap 的数量! • 而且,由于目前 x86_64 (64 位) 最大内存寻址到 64GB, 因此, swap 总量最大也是仅能达 64GB 就是了! 本章习题练习: ( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 ) • 如何增加一颗新的硬盘在你的 Linux 系统当中?请详述流程: 安装硬盘:关掉 Linux 主机电源,调整 Hard Disk 的 Jump (master 或 slave),串接在 IDE 的接口,请注意,留意你增加的硬盘所串接的 IDE 接口为哪一个插槽,例如你插在 IDE2 的 Master ,则你的硬盘应为 hdc;此外,需要特别留意的是,目前的机器中,如果是 ATA 66 以上 的排线(那种很密的排线),那么 master 或者是 slave 在排在线的顺序是固定的!底端的是 Mater 而中间的是 Slave ,这点请稍微注意呦! 新增硬件于 BIOS:开启计算机后,按 del 键进入 BIOS,选择 IDE Hard Disk Detector 字样的 选项, 让 BIOS 去捉硬盘,然后再选择 Save and Exit;不过,较新的机器通常都可以自动侦测 了!但是, 如果你的机器是旧型的,那么还是手动来增加硬盘吧! Linux 系统侦测:如果你的 Linux 系统有启动 kudzu 这个服务时,那么开机就会自动去侦测新 的硬件装置! Fedora Core IV 预设是有开启这项服务的,除非你关掉他了!OK,假设你有开启 这项服务,那么开机进入 Linux 的时候,系统会告诉你有捉到一个新的硬件,你可以按 『configure』由系统直接安装即可; 格式化硬盘:以 root 的身份进入 Linux 后,执行以下两个程序:fdisk /dev/hd[a-d] 与 mke2fs /dev/hd[a-d][1-16] 。 建立 mount point:假设我的这颗硬盘要挂在 /disk3 下面,那么就需要 : mkdir /disk3 开机自动加载( mount ):再来则是以 vi 修改 /etc/fstab 档案,让每次开机把这个硬盘直接挂 入系统中。 安装完成:你可以使用 mount -a 来将全部的装置重新挂载一遍,或者是重新开机就可以啦! • 假设条件:我原先规划的 /home 只有 1GB ,但是目前的使用者日众,所以容量不足!我想要增 加一棵 8GB 的旧硬盘,要如何作?! 将硬盘加入 Linux 系统中:利用刚刚上一题的方式将你的硬盘加入到 Linux 系统中,亦即是使 用 fdisk 与 mke2fs 建立了 ext2 的档案格式的硬盘!好了,假设该硬盘的代号为 /dev/hdc1 好 了! 挂载新硬盘:由于我需要将新旧扇区都挂上来,这样才有办法将数据由旧硬盘移到新硬盘上面, OK! 我就建立一个暂存的目录,称为 /disk-tmp: mkdir /disk-tmp mount -t ext2 /dev/hdc1 /disk-tmp 如此一来则 /disk-tmp 就是新挂上来那颗 8 GB 的硬盘啦! 移动数据:好了!现在开始将数据 copy 到新挂上的硬盘上面吧! cd /home tar -zcvf /disk-tmp/home.tar.gz * cd /disk-tmp tar -zxvf home.tar.gz 上面的指令会将目前旧有的 /home 底下的东西完全的压缩之后移动到 /disk-tmp/home.tar.gz 这个压缩档,然后再到 /disk-tmp 底下将他解压缩!这样数据就复制到新挂上来的硬盘啦! 卸 载旧的,挂上新的:好了,那么我们就开始来测试一下吧!你可以这样做: umount /home mount -t ext2 /dev/hdc1 /home 注意呦!如果你的 /home 底下原本就没有挂载扇区的话,那么你就可以直接将 /home 底下的数 据都砍掉,然后在挂上新的那颗硬盘就好了!而 home.tar.gz 这个档案就可以用作为备份之用! 开机执行:同样的,如果要设定成开机就挂上这颗新的硬盘,那就修改 /etc/fstab 档案吧! • 如果扇区 /dev/hda3 有问题,偏偏他是被挂载上的,请问我要如何修理此一扇区? umount /dev/hda3 fsck /dev/hda3 • 我们常常说,开机的时候,『发现硬盘有问题』,请问,这个问题的产生是『filesystem 的损毁』, 还是『硬盘的损毁』? 特别需要注意的是,如果您某个 filesystem 里面,由于操作不当,可能会造成 Superblock 数 据的损毁, 或者是 inode 的架构损毁,或者是 block area 的记录遗失等等,这些问题当中, 其实您的『硬盘』还是好好的, 不过,在硬盘上面的『档案系统』则已经无法再利用!一般来说, 我们的 Linux 很少会造成 filesystem 的损毁, 所以,发生问题时,很可能整个硬盘都损毁了。 但是,如果您的主机常常不正常断电,那么, 很可能硬盘是没问题的,但是,档案系统则有损毁 之虞。此时,重建档案系统 (reinstall) 即可! 不需要换掉硬盘啦! ^_^ • 当我有两个档案,分别是 file1 与 file2 ,这两个档案互为 hard link 的档案,请问, 若我 将 file1 删除,然后再以类似 vi 的方式重新建立一个名为 file1 的档案, 则 file2 的内容 是否会被更动? 这是来自网友的疑问。当我删除 file1 之后, file2 则为一个正规档案,并不会与他人共同分 享同一个 inode 与 block ,因此,当我重新建立一个档名为 file1 时,他所利用的 inode 与 block 都是由我们的 filesystem 主动去搜寻 meta data ,找到空的 inode 与 block 来建立 的, 与原本的 file1 并没有任何关连性喔!所以,新建的 file1 并不会影响 file2 呢! 参考数据: • 硬盘的相关认识:http://www.linwei.com.tw/knowhdd.html • Linux System Administrator's Survival Guide http://sunsite.iisc.ernet.in/virlib/linux/survival/ewtoc.html • Design and Implementation of the Second Extended Filesystem http://e2fsprogs.sourceforge.net/ext2intro.html • 小木偶的汇编语言教学之硬盘知识: http://home.educities.edu.tw/wanker742126/asm/ch32.html • Linux 核心所支持的装置代号查询: http://www.kernel.org/pub/linux/docs/device-list/devices.txt Linux 档案与目录管理 最近更新日期:2005/08/22 在前一章节里面我们认识了 Linux 系统下的档案权限概念以及目录的配置说明。 在这个章节当中,我们 就直接来进一步的操作与管理档案与目录吧!包括在不同的目录间变换、 建立与删除目录、建立与删除档 案,还有寻找档案、查阅档案内容等等, 都会在这个章节作个简单的介绍啊! 1. 目录与路径 1.1 相对路径与绝对路径 1.2 目录的相关操作: cd, pwd, mkdir, rmdir 1.3 关于执行文件路径的变量: $PATH 2. 档案与目录管理 2.1 档案与目录的检视: ls 2.2 复制、移动与删除: cp, rm, mv 2.3 取得路径的文件名称与目录名称 3. 档案内容查阅: 3.1 直接检视档案内容: cat, tac, nl 3.2 可翻页检视: more, less 3.3 资料撷取: head, tail 3.4 非纯文字文件: od 3.5 修改档案时间与建置新档: touch 4. 档案与目录的预设权限与隐藏权限 4.1 档案预设权限:umask 4.2 档案隐藏属性: chattr, lsattr 4.4 档案特殊权限:SUID/SGID/Sticky Bit 4.3 档案类型:file 5. 档案的搜寻:which, whereis, locate, find 6. 本章习题练习 7. 针对本文的建议:http://phorum.vbird.org/viewtopic.php?t=23879 目录与路径: 由前一章节『Linux 的档案权限与目录配置』中约略了解到 Linux 的『树状目录』概念之后,接下来就得 要实际的来搞定一些基本的路径问题了!这些目录的问题当中, 最重要的莫过于『绝对路径』与『相对路 径』的意义啦!赶紧来了解一下! 相对路径与绝对路径: 在开始目录的切换之前,你必须要先了解一下所谓的『路径 (PATH)』, 有趣的是:什么是『相对路径』 与『绝对路径』? 虽然前一章已经稍微针对这个议题提过一次,不过,这里不厌其烦的再次的强调一下! 如果你还记得前一章的内容的话,那么应该还记得 Linux 里面的目录是呈现『树状目录』 的情况,就是 有分支的啦!好了,假设你需要在任意一个目录下变换到根目录的 etc 底下,那么你就应该要使用『 cd /etc 』这个情况, 这也就是所谓的『绝对路径』,他是从根目录连续写上来的一个情况, 所以不论你在 哪一个路径现执行这一个指令,都会将你移动到该路径下。那如果我是使用 『cd etc 』呢?那表示你要 切换到『目前这个目录下的 etc 目录中』,情况可是不一样的呦!通常第一次接触 Linux 的使用者常会 搞错这一个路径的观念! • 绝对路径:路径的写法『一定由根目录 / 写起』,例如: /usr/share/doc 这个目录。 • 相对路径:路径的写法『不是由 / 写起』,例如由 /usr/share/doc 要到 /usr/share/man 底下 时,可以写成: 『cd ../man』这就是相对路径的写法啦!相对路径意指『相对于目前工作目录 的路径!』 那么相对路径与绝对路径有什么了不起呀!?喝!那可真的是了不起了!假设您写了一个套件, 这个套件 共需要三个目录,分别是 etc, bin, man 这三个目录,然而由于不同的人喜欢安装在不同的目录之下, 假 设甲安装的目录是 /usr/local/packages/etc, /usr/local/packages/bin 及 /usr/local/packages/man ,不过乙却喜欢安装在 /home/packages/etc, /home/packages/bin, /home/packages/man 这三个目录中,请问如果需要用到绝对路径的话,那么是否很麻烦呢?是的! 如此 一来每个目录下的东西就很难对应的起来!这个时候相对路径的写法就显的特别的重要了! 此外,如果您跟鸟哥一样,喜欢将路径的名字写的很长,好让自己知道那个目录是在干什么的,例如: /data4/staiwan19961109/models-3/smoke 这个目录,而另一个目录在 /data4/staiwan19961109/models-3/cctm ,那么我从第一个要到第二个目录去的话,怎么写比较方便? 当 然是『 cd ../cctm 』比较方便啰!对吧! 但是对于档案的正确性来说,『绝对路径的正确度要比较好~』。 一般来说,鸟哥会建议您,如果是在写 程序 (shell scripts) 的条件下,务必使用绝对路径的写法。 怎么说呢?因为绝对路径的写法虽然比较 麻烦,但是可以肯定这个写法绝对不会有问题。 如果使用相对路径在程序当中,则可能由于您执行的工作 环境不同,导致一些问题的发生。 这个问题在例行性命令当中尤其重要!这个现象我们在 shell script 时,会再次的提醒您喔! ^_^ 目录的相关操作: 在之前我们稍微提到这个变换目录的指令是 cd ,还有哪些可以进行目录操作的指令呢? 例如建立目录 啊、删除目录之类的~还有,得要先知道的,就是有哪些比较特殊的目录呢? 举例来说,底下这些就是比 较特殊的目录,得要用力的记下来才行: . 代表此层目录 .. 代表上一层目录 - 代表前一个工作目录 ~ 代表『目前使用者身份』所在的家目录 ~account 代表 account 这个使用者的家目录 而在目录底下有两个目录是一定会存在的!那就是 . 与 .. 啰~ 分别代表此层与上层目录的意思。那我 们在前一章 Linux 档案属性与目录配置 里面也知道根目录 (/) 是所有目录的最顶层,那么 / 有 .. 吗?!您可以使用 ls -al / 去看看, 答案是『有的!』不过,您也可以查阅到,根目录的 . 与 .. 属 性完全一模一样,哈哈! 原来根目录的顶层 (..) 与他自己 (.) 是同一个目录啦! ^_^ 底下我们就来谈一谈几个常见的处理目录的指令吧: • cd:变换目录 • pwd:显示目前的目录 • mkdir:建立一个新的目录 • rmdir:删除一个空的目录 • cd (变换目录) 我们知道 dmtsai 这个使用者的家目录是 /home/dmtsai ,而 root 家目录则是 /root ,假设我以 root 身份在 Linux 系统中,那么简单的说明一下这几个特殊的目录的意义是: [root@linux ~]# cd [相对路径或绝对路径] # 最重要的就是目录的绝对路径与相对路径,还有一些特殊目录的符号啰! [root@linux ~]# cd ~dmtsai # 代表去到 dmtsai 这个使用者的家目录,亦即 /home/dmtsai [root@linux dmtsai]# cd ~ # 表示回到自己的家目录,亦即是 /root 这个目录 [root@linux ~]# cd # 没有加上任何路径,也还是代表回到自己家目录的意思喔! [root@linux ~]# cd .. # 表示去到目前的上层目录,亦即是 /root 的上层目录的意思; [root@linux /]# cd # 表示回到刚刚的那个目录,也就是 /root 啰~ [root@linux ~]# cd /var/spool/mail # 这个就是绝对路径的写法!直接指定要去的完整路径名称! [root@linux mail]# cd ../mqueue # 这个是相对路径的写法,我们由 /var/spool/mail 去到 /var/spool/mqueue 就这样写! cd 是 Change Directory 的缩写,这是用来变换工作目录的指令。注意,目录名称与 cd 指令之间存在一 个空格。 一登入 Linux 系统后,root 会在 root 的家目录,亦即 /root 下,OK!那回到上一层目录可 以用『 cd .. 』。 利用相对路径的写法必须要确认您目前的路径才能正确的去到想要去的目录。例如上 表当中最后一个例子, 您必须要确认您是在 /var/spool/mail 当中,并且知道在 /var/spool 当中有个 mqueue 的目录才行啊~ 这样才能使用 cd ../mqueue 去到正确的目录说,否则就要直接输入 cd /var/spool/mqueue 啰~ 其实,我们的提示字符,亦即那个 [root@linux ~]# 当中,就已经有指出目前的目录了, 刚登入时会到 自己的家目录,而家目录还有一个代码,那就是『 ~ 』符号! 例如上面的例子可以发现,使用『 cd ~ 』 可以回到个人的家目录里头去呢! 另外,针对 cd 的使用方法,如果仅输入 cd 时,代表的就是『 cd ~ 』 的意思喔~ 亦即是会回到自己的家目录啦!而那个『 cd - 』比较难以理解,请自行多做几次练习, 就 会比较明白了。 Tips: 还是要一再地提醒,我们的 Linux 的预设指令列模式 (bash shell) 具有档案补齐功能, 您要常常利用 [tab] 按键来达成您 的目录完整性啊!这可是个好习惯啊~ 可以避免您按错键盘输入 错字说~ ^_^ • pwd (显示目前所在的目录) [root@linux ~]# pwd [-P] 参数: -P :显示出确实的路径,而非使用连结 (link) 路径。 范例: [root@linux ~]# pwd /root <== 显示出目录啦~ [root@linux ~]# cd /var/mail [root@linux mail]# pwd /var/mail [root@linux mail]# pwd -P /var/spool/mail <== 怎么回事?有没有加 -P 差很多~ [root@linux mail]# ls -l /var/mail lrwxrwxrwx 1 root root 10 Jun 25 08:25 /var/mail -> spool/mail # 看到这里应该知道为啥了吧?因为 /var/mail 是连结档,连结到 /var/spool/mail # 所以,加上 pwd -P 的参数后,会不以连结文件的数据显示,而是显示正确的完整路径啊! pwd 是 Print Working Directory 的缩写,也就是显示目前所在目录的指令, 例如在上个表格最后的目 录是 /var/mail 这个目录,但是提示字符仅显示 mail, 如果你想要知道目前所在的目录,可以输入 pwd 即可。此外,由于很多的套件所使用的目录名称都相同,例如 /usr/local/etc 还有 /etc ,但是通常 Linux 仅列出最后面那一个目录而已,这个时候你就可以使用 pwd 来知道你的所在目录啰!免得搞错目录,结 果…… 其实有趣的是那个 -P 的参数啦!他可以让我们取得正确的目录名称,而不是以连结文件的路径来显示的。 如果您是 Fedora Core 4 的话,刚刚好, /var/mail 是 /var/spool/mail 的连结档, 所以,透过到 /var/mail 下达 pwd -P 就能够知道这个参数的意义啰~ ^_^ • mkdir (建立新目录) [root@linux ~]# mkdir [-mp] 目录名称 参数: -m :设定档案的权限喔!直接设定,不需要看预设权限 (umask) 的脸色~ -p :帮助你直接将所需要的目录递归建立起来! 范例: [root@linux ~]# cd /tmp [root@linux tmp]# mkdir test <== 建立一名为 test 的新目录 [root@linux tmp]# mkdir test1/test2/test3/test4 mkdir: cannot create directory `test1/test2/test3/test4': No such file or directory <== 没办法直接建立此目录啊! [root@linux tmp]# mkdir -p test1/test2/test3/test4 # 加了这个 -p 的参数,可以自行帮您建立多层目录! [root@linux tmp]# mkdir -m 711 test2 [root@linux tmp]# ls -l drwxr-xr-x 3 root root 4096 Jul 18 12:50 test drwxr-xr-x 3 root root 4096 Jul 18 12:53 test1 drwx--x--x 2 root root 4096 Jul 18 12:54 test2 # 仔细看上面的权限部分,如果没有加上 -m 来强制设定属性,系统会使用预设属性。 # 那么您的预设属性为何?这要透过底下介绍的 umask 才能了解喔! ^_^ 如果想要建立新的目录的话,那么就使用 mkdir (make directory) 吧! 不过,请注意呦!在预设的情况 下,你所需要的目录得一层一层的建立才行!例如:假如你要建立一个目录为 /home/bird/testing/test1, 那么首先必须要有 /home 然后 /home/bird ,再来 /home/bird/testing 都必须要存在,才可以建立 /home/bird/testing/test1 这个目录!假如没有 /home/bird/testing 时,就没有办法建立 test1 的目 录啰!不过,现在有个更简单有效的方法啦!那就是加上 -p 这个参数喔!你可以直接下达:『 mkdir -p /home/bird/testing/test1 』 则系统会自动的帮你将 /home, /home/bird, /home/bird/testing 依序的 建立起目录!并且, 如果该目录本来就已经存在时,系统也不会显示错误讯息喔!挺快乐的吧! ^_^ 另外,有个地方您必须要先有概念,那就是『预设权限』的地方。我们可以利用 -m 来强制给予一个新的 目录相关的属性, 例如上表当中,我们给予 -m 711 来给予新的目录 drwx--x--x 的属性。不过,如果没 有给予 -m 属性时, 那么预设的新建目录属性又是什么呢?这个跟 umask 有关,我们在后头会加以介绍 的。 • rmdir (删除『空』的目录) [root@linux ~]# rmdir [-p] 目录名称 参数: -p :连同上层『空的』目录也一起删除 范例: [root@linux tmp]# ls -l drwxr-xr-x 3 root root 4096 Jul 18 12:50 test drwxr-xr-x 3 root root 4096 Jul 18 12:53 test1 drwx--x--x 2 root root 4096 Jul 18 12:54 test2 [root@linux tmp]# rmdir test [root@linux tmp]# rmdir test1 rmdir: `test1': Directory not empty [root@linux tmp]# rmdir -p test1/test2/test3/test4 [root@linux tmp]# ls -l drwx--x--x 2 root root 4096 Jul 18 12:54 test2 # 瞧!利用 -p 这个参数,立刻就可以将 test1/test2/test3/test4 一次删除~ # 不过要注意的是,这个 rmdir 仅能『删除空的目录』喔! 如果想要建立删除旧有的目录时,就使用 rmdir 吧!例如将刚刚建立的 test 杀掉,使用 rmdir test 即 可!请注意呦!目录需要一层一层的删除才行!而且 被删除的目录里面必定不能还有其它的目录或档案! 这也是所谓的空的目录 (empty directory) 的意思啊!那如果要将所有目录下的东西都杀掉呢?! 这个 时候就必须使用 rm -rf test 啰!不过,还是使用 rmdir 比较不危险!不过,你也可以尝试以 -p 的参 数加入,来删除上层的目录喔! 关于执行文件路径的变量: $PATH 在提过了绝对路径、相对路径与指令的下达方式之后,您应该会稍微注意到一件事情,那就是:『 为什么 我可以在任何地方执行 /bin/ls 这个指令呢? 』对呀! 为什么我可以直接执行 ls 就一定可以显示出一 些讯息而不会说找不到该 /bin/ls 指令呢? 这是因为环境变量 PATH 的帮助所致呀!当我们在执行一个 指令的时候, 系统会依照 PATH 的设定去每个 PATH 定义的路径下搜寻执行文件,先搜寻到的指令先被执 行之!现在,请下达 echo $PATH , echo 有『显示、印出』的意思,而 PATH 前面加的 $ 表示后面接的 是变量,所以即会显示出目前的 PATH 了! [root@linux ~]# echo $PATH /sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin 注意到了吗?对啦! /bin 在 PATH 的设定之中,所以自然就可以找的到 ls 啦! PATH 对于执行档来说, 是个很重要的『变量』,他主要是用来规范指令搜寻的目录。 而每个目录是有顺序的,每个目录中间以冒 号『:』来分隔,就如同上面范例中提到的啰! 那么 PATH 这个变量还有什么地方重要呢? • 如果你将 ls 移动到 /root 底下的话 (mv /bin/ls /root) ,然后你自己本身也在 /root 底下 (cd /root) ,但是当你执行 ls 的时候,他就是不理你?怎么办?这是因为 PATH 这个变量没有 /root 这个目录,而你又将 ls 移动到 /root 底下了,自然系统就找不到可执行文件了,因此就 会告诉你, command not found !那么该怎么克服这种问题呢?有两个方法,其一:直接将 /root 的路径加入 PATH 当中!如何增加?可以使用: [root@linux ~]# PATH="$PATH":/root 这种方式来增加 PATH 搜寻目录即可!另一种方式则是使用完整文件名来下达指令, 亦即直接使 用相对或绝对路径来执行,例如: [root@linux ~]# /root/ls [root@linux ~]# ./ls 因为在同一个目录中,而我们又知道在同一个目录中的目录符号为『 . 』,因此,就以上面的 ./ls 来执行也可以!这种执行方式以后您应该会很常见到才对! • 如果我有两个 ls 档案在不同的目录中,例如 /usr/local/bin/ls 底下与 /bin/ls 那么当我下 达 ls 的时候,哪个 ls 会被执行?那还用说,就找出 PATH 里面哪个目录先被查询,则那个目 录下的档案就会被先执行了! • 咦!既然如此的话,那么为何不要在 PATH 里面加入 . 这个目录,如此一来的话, 不就可以直 接在所在目录执行档案了吗?因为 . 代表所在目录嘛!是这样没错!但是有没有想过,如果某天, 某个怪怪的使用者在 /tmp 里面写了一个 ls 的档案,偏偏他是有害的档案,那么当你在 /tmp 底 下执行 ls 时,怎么办?!没错,可能会『中标』,所以啰,为了安全起见,不建议将『 . 』加 入 PATH 的搜寻当中! 关于更多的 PATH 与相关的『变量』及『环境变量』概念,我们会在第三篇 bash shell 时, 再更深入的 介绍啰~而经过上面的说明,您应该也能够比较了解的是:『 为什么绝对路径下达指令的方法比相对路径 要正确的多 』这句话的意义啰~ ^_^ 因为是直接找到该指令来执行,而不是透过 PATH 这个变量的内容 去搜寻的啊! 档案与目录管理: 谈了谈目录与路径之后,再来讨论一下关于档案的一些基本管理吧!档案与目录的管理上,不外乎『显示 属性』、 『拷贝』、『删除档案』及『移动档案或目录』等等,由于档案与目录的管理在 Linux 当中是 很重要的! 尤其是每个人自己家目录的数据也都需要注意管理!由于我们在执行程序的时后,系统预设有 一个搜寻的路径顺序, 如果有两个以上相同档名的执行档分别在不同的路径时,呵呵,就需要特别留意啰! 这里我们来谈一谈有关档案与目录的一些基础管理部分吧! 档案与目录的检视: ls [root@linux ~]# ls [-aAdfFhilRS] 目录名称 [root@linux ~]# ls [--color={none,auto,always}] 目录名称 [root@linux ~]# ls [--full-time] 目录名称 参数: -a :全部的档案,连同隐藏档( 开头为 . 的档案) 一起列出来~ -A :全部的档案,连同隐藏档,但不包括 . 与 .. 这两个目录,一起列出来~ -d :仅列出目录本身,而不是列出目录内的档案数据 -f :直接列出结果,而不进行排序 (ls 预设会以档名排序!) -F :根据档案、目录等信息,给予附加数据结构,例如: *:代表可执行档; /:代表目录; =:代表 socket 档案; |:代表 FIFO 档案; -h :将档案容量以人类较易读的方式(例如 GB, KB 等等)列出来; -i :列出 inode 位置,而非列出档案属性; -l :长数据串行出,包含档案的属性等等数据; -n :列出 UID 与 GID 而非使用者与群组的名称 (UID 与 GID 会在账号管理提到!) -r :将排序结果反向输出,例如:原本档名由小到大,反向则为由大到小; -R :连同子目录内容一起列出来; -S :以档案容量大小排序! -t :依时间排序 --color=never :不要依据档案特性给予颜色显示; --color=always :显示颜色 --color=auto :让系统自行依据设定来判断是否给予颜色 --full-time :以完整时间模式 (包含年、月、日、时、分) 输出 --time={atime,ctime} :输出 access 时间或 改变权限属性时间 (ctime) 而非内容变更时间 (modification time) 范例: 在 Linux 系统当中,这个 ls 指令可能是最常被执行的吧!因为我们随时都要知道档案或者是目录的相关 信息啊~ 不过,我们 Linux 的档案所记录的信息实在是太多了, ls 没有需要全部都列出来呢~ 所以, 当您只有下达 ls 时,预设显示的只有:非隐藏档的档名、 以档名进行排序及文件名代表的颜色显示;如 此而已。举例来说, 您下达 ls /etc 之后,只有经过排序的文件名以及以蓝色显示目录及白色显示一般 档案,如此而已。 那如果我还想要加入其它的显示信息时,可以加入上头提到的那些有用的参数呢~ 举例来说,我们之前一 直用到的 -l 这个长串显示数据内容,以及将隐藏档也一起列示出来的 -a 参数等等。 范例一:将家目录下的所有档案列出来(含属性与隐藏文件) [root@linux ~]# ls -al ~ total 252 drwxr-x--- 9 root root 4096 Jul 16 23:40 . drwxr-xr-x 24 root root 4096 Jul 16 23:45 .. -rw------- 1 root root 1491 Jun 25 08:53 anaconda-ks.cfg -rw------- 1 root root 12543 Jul 18 01:23 .bash_history -rw-r--r-- 1 root root 24 Dec 4 2004 .bash_logout -rw-r--r-- 1 root root 191 Dec 4 2004 .bash_profile -rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc -rw-r--r-- 1 root root 68495 Jun 25 08:53 install.log -rw-r--r-- 1 root root 5976 Jun 25 08:53 install.log.syslog drwx------ 2 root root 4096 Jul 4 16:03 .ssh -rw------- 1 root root 12613 Jul 16 23:40 .viminfo # 这个时候您会看到以 . 为开头的几个档案,以及目录文件 ./../.ssh 等等, # 不过,目录文件都是以深蓝色显示,有点不容易看清楚就是了。 范例二:承上题,不显示颜色,但在文件名末显示出该文件名代表的类型(type) [root@linux ~]# ls -alF --color=never ~ total 252 drwxr-x--- 9 root root 4096 Jul 16 23:40 ./ drwxr-xr-x 24 root root 4096 Jul 16 23:45 ../ -rw------- 1 root root 1491 Jun 25 08:53 anaconda-ks.cfg -rw------- 1 root root 12543 Jul 18 01:23 .bash_history -rw-r--r-- 1 root root 24 Dec 4 2004 .bash_logout -rw-r--r-- 1 root root 191 Dec 4 2004 .bash_profile -rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc -rw-r--r-- 1 root root 68495 Jun 25 08:53 install.log -rw-r--r-- 1 root root 5976 Jun 25 08:53 install.log.syslog drwx------ 2 root root 4096 Jul 4 16:03 .ssh/ -rw------- 1 root root 12613 Jul 16 23:40 .viminfo # 注意看到显示结果的第一行,嘿嘿~知道为何我们会下达类似 ./command # 之类的指令了吧?因为 ./ 代表的是『目前目录下』的意思啊!至于什么是 FIFO/Socket ? # 请参考前一章节的介绍啊! 范例三:完整的呈现档案的修改时间 *(modification time) [root@linux ~]# ls -al --full-time ~ total 252 drwxr-x--- 9 root root 4096 2005-07-16 23:40:13.000000000 +0800 . drwxr-xr-x 24 root root 4096 2005-07-16 23:45:05.000000000 +0800 .. -rw------- 1 root root 1491 2005-06-25 08:53:37.000000000 +0800 anaconda-ks.cfg -rw------- 1 root root 12543 2005-07-18 01:23:33.000000000 +0800 .bash_history -rw-r--r-- 1 root root 24 2004-12-04 05:44:13.000000000 +0800 .bash_logout -rw-r--r-- 1 root root 191 2004-12-04 05:44:13.000000000 +0800 .bash_profile -rw-r--r-- 1 root root 395 2005-07-04 11:45:16.000000000 +0800 .bashrc -rw-r--r-- 1 root root 68495 2005-06-25 08:53:34.000000000 +0800 install.log -rw-r--r-- 1 root root 5976 2005-06-25 08:53:28.000000000 +0800 install.log.syslog drwx------ 2 root root 4096 2005-07-04 16:03:24.000000000 +0800 .ssh -rw------- 1 root root 12613 2005-07-16 23:40:13.000000000 +0800 .viminfo # 请仔细看,上面的『时间』字段变了喔!变成较为完整的格式。 # 一般来说, ls -al 仅列出目前短格式的时间,有时不会列出年份, # 藉由 --full-time 可以查阅到比较正确的完整时间格式啊! 其实 ls 的用法还有很多,包括查阅档案所在 i-node 的 ls -i 参数,以及用来进行档案排序的 -S 参数, 还有用来查阅不同时间的动作的 --time=atime 等参数。而这些参数的存在都是因为 Linux 档案系统记录 了很多有用的信息的缘故。那么 Linux 的档案系统中,这些与权限、属性有关的数据放在哪里呢? 放在 i-node 里面。关于这部分,我们会在下个章节继续跟您作比较深入的介绍啊! 无论如何, ls 最常被使用到的功能还是那个 -l 的参数,为此,很多 distribution 在预设的情况中, 已 经将 ll (L 的小写) 设定成为 ls -l 的意思了!其实,那个功能是 Bash shell 的 alias 功能呢~ 也 就是说,我们直接输入 ll 就等于是输入 ls -l 是一样的~关于这部分,我们会在第三章 bash shell 时 再次的强调滴~ 复制、移动与删除: cp, rm, mv 要复制档案,请使用 cp (copy) 这个指令即可~不过, cp 这个指令的用途可多了~ 除了单纯的复制之 外,还可以建立连结档 (就是快捷方式啰),比对两档案的新旧而予以更新, 以及复制整个目录等等的功 能呢!至于移动目录与档案,则使用 mv (move), 这个指令也可以直接拿来作更名 (rename) 的动作喔! 至于移除吗?那就是 rm (remove) 这个指令啰~底下我们就来瞧一瞧先~ • cp (复制档案或目录) [root@linux ~]# cp [-adfilprsu] 来源档(source) 目的檔(destination) [root@linux ~]# cp [options] source1 source2 source3 .... directory 参数: -a :相当于 -pdr 的意思; -d :若来源文件为连结文件的属性(link file),则复制连结文件属性而非档案本身; -f :为强制 (force) 的意思,若有重复或其它疑问时,不会询问使用者,而强制复制; -i :若目的檔(destination)已经存在时,在覆盖时会先询问是否真的动作! -l :进行硬式连结 (hard link) 的连结档建立,而非复制档案本身; -p :连同档案的属性一起复制过去,而非使用预设属性; -r :递归持续复制,用于目录的复制行为; -s :复制成为符号连结文件 (symbolic link),亦即『快捷方式』档案; -u :若 destination 比 source 旧才更新 destination ! 最后需要注意的,如果来源档有两个以上,则最后一个目的文件一定要是『目录』才行! 范例: 范例一:将家目录下的 .bashrc 复制到 /tmp 下,并更名为 bashrc [root@linux ~]# cd /tmp [root@linux tmp]# cp ~/.bashrc bashrc [root@linux tmp]# cp -i ~/.bashrc bashrc cp: overwrite `basrhc'? n # 重复作两次动作,由于 /tmp 底下已经存在 bashrc 了,加上 -i 参数, # 则在覆盖前会询问使用者是否确定!可以按下 n 或者 y 呢! # 但是,反过来说,如果不想要询问时,则加上 -f 这个参数来强制直接覆盖! 范例二:将 /var/log/wtmp 复制到 /tmp 底下 [root@linux tmp]# cp /var/log/wtmp . <==想要复制到目前的目录,最后的 . 不要忘 [root@linux tmp]# ls -l /var/log/wtmp wtmp -rw-rw-r-- 1 root utmp 71808 Jul 18 12:46 /var/log/wtmp -rw-r--r-- 1 root root 71808 Jul 18 21:58 wtmp # 注意到了吗?!在不加任何参数的情况下,档案的所属者会改变,连权限也跟着改变了~ # 这是个很重要的特性!要注意喔!还有,连档案建立的时间也不一样了! # 如果您想要将档案的所有特性都一起复制过来,可以加上 -a 喔! [root@linux tmp]# cp -a /var/log/wtmp wtmp_2 [root@linux tmp]# ls -l /var/log/wtmp wtmp_2 -rw-rw-r-- 1 root utmp 71808 Jul 18 12:46 /var/log/wtmp -rw-rw-r-- 1 root utmp 71808 Jul 18 12:46 wtmp_2 # 瞭了吧!整个资料特性完全一模一样ㄟ!真是不赖~这就是 -a 的特性! 范例三:复制 /etc/ 这个目录下的所有内容到 /tmp 底下 [root@linux tmp]# cp /etc/ /tmp cp: omitting directory `/etc' <== 如果是目录,不能直接复制,要加上 -r 的参数 [root@linux tmp]# cp -r /etc/ /tmp # 还是要再次的强调喔! -r 是可以复制目录,但是,档案与目录的权限会被改变~ # 所以,也可以利用 cp -a /etc /tmp 来下达指令喔! 范例四:将范例一复制的 bashrc 建立一个连结档 (symbolic link) [root@linux tmp]# ls -l bashrc -rw-r--r-- 1 root root 395 Jul 18 22:08 bashrc [root@linux tmp]# cp -s bashrc bashrc_slink [root@linux tmp]# cp -l bashrc bashrc_hlink [root@linux tmp]# ls -l bashrc* -rw-r--r-- 2 root root 395 Jul 18 22:08 bashrc -rw-r--r-- 2 root root 395 Jul 18 22:08 bashrc_hlink lrwxrwxrwx 1 root root 6 Jul 18 22:31 bashrc_slink -> bashrc # 那个 bashrc_slink 是由 -s 的参数造成的,建立的是一个『快捷方式』, # 所以您会看到在档案的最右边,会显示这个档案是『连结』到哪里去的! # 至于那个 bashrc_hlink 有趣了!建立了这个档案之后, bashrc 与 bashrc_hlink # 所有的参数都一样,只是,第二栏的 link 数改变成为 2 了~而不是原本的 1 喔! # 这两种连结的方式的异同,我们会在下一章里面进行介绍的! 范例五:若 ~/.bashrc 比 /tmp/bashrc 新才复制过来 [root@linux tmp]# cp -u ~/.bashrc /tmp/bashrc # 这个 -u 的特性,是在目标档案与来源档案有差异时,才会复制的。 # 所以,比较常被用于『备份』的工作当中喔! ^_^ 范例六:将范例四造成的 bashrc_slink 复制成为 bashrc_slink_2 [root@linux tmp]# cp bashrc_slink bashrc_slink_2 [root@linux tmp]# ls -l bashrc_slink* lrwxrwxrwx 1 root root 6 Jul 18 22:31 bashrc_slink -> bashrc -rw-r--r-- 1 root root 395 Jul 18 22:48 bashrc_slink_2 # 这个例子也是很有趣喔!原本复制的是连结档,但是却将连结档的实际档案复制过来了 # 也就是说,如果没有加上任何参数时,复制的是源文件,而非连结文件的属性! # 若要复制连结文件的属性,就得要使用 -d 或者 -a 的参数了! 范例七:将家目录的 .bashrc 及 .bash_history 复制到 /tmp 底下 [root@linux tmp]# cp ~/.bashrc ~/.bash_history /tmp # 可以将多个数据一次复制到同一个目录去! 这个 cp 的功能很多,而由于我们常常在进行一些数据的复制,所以也会常常用到这个指令的。 一般来说, 我们如果去复制别人的数据 (当然,该档案您必须要有 read 的权限才行啊! ^_^) 时, 总是希望复制到 的数据最后是我们自己的,所以,在预设的条件中, cp 的来源档与目的档的权限是不同的,目的档的拥 有者通常会是指令操作者本身。举例来说, 上面的范例二中,由于我是 root 的身份,因此复制过来的档 案拥有者与群组就改变成为 root 所有了! 这样说,可以明白吗?! ^_^ 由于具有这个特性,因此,当我们在进行备份的时候,某些需要特别注意的特殊权限档案, 例如密码文件 (/etc/shadow) 以及一些设定档,就不能直接以 cp 来复制,而必须要加上 -a 或者是 -p 等等可以完整 复制档案权限的参数才行!另外,如果您想要复制档案给其它的使用者, 也必须要注意到档案的权限(包 含读、写、执行以及档案拥有者等等), 否则,其它人还是无法针对您给予的档案进行修订的动作喔!注 意注意! 至于上面的范例当中,第四个范例是最有趣的,使用 -l 及 -s 都会建立所谓的连结档 (link file), 但 是这两种连结档确有不一样的展现情况。这是怎么一回事啊? 那个 -l 就是所谓的 hard link ,至于 -s 则是 symbolic link ,鸟哥这里先不介绍, 因为这个涉及 i-node 的相关知识,我们还没有介绍到,下 一章再来讨论这个 link 的问题喔! 总之,由于 cp 有种种的档案属性与权限的特性,所以,在复制时, 您必须要清楚的了解到: • 是否需要完整的保留来源档案的信息? • 来源档案是否为连结档 (symbolic link file)? • 来源档是否为特殊的档案,例如 FIFO, socket 等? • 来源文件是否为目录? • rm (移除档案或目录) [root@linux ~]# rm [-fir] 档案或目录 参数: -f :就是 force 的意思,强制移除; -i :互动模式,在删除前会询问使用者是否动作 -r :递归删除啊!最常用在目录的删除了 范例: 范例一:建立一档案后予以删除 [root@linux ~]# cd /tmp [root@linux tmp]# cp ~/.bashrc bashrc [root@linux tmp]# rm -i bashrc rm: remove regular file `bashrc'? y # 如果加上 -i 的参数就会主动询问喔!那么如果不要询问呢?就加 -f 参数啊! 范例二:删除一个不为空的目录 [root@linux tmp]# mkdir test [root@linux tmp]# cp ~/.bashrc test/ <== 将档案复制到此目录去,就不是空的目录了 [root@linux tmp]# rmdir test rmdir: `test': Directory not empty <== 删不掉啊!因为这不是空的目录! [root@linux tmp]# rm -rf test 范例三:删除一个带有 - 开头的档案 [root@linux tmp]# ls *aa* -rw-r--r-- 1 root root 0 Aug 22 10:52 -aaa- [root@linux tmp]# rm -aaa- rm: invalid option -- a Try `rm --help' for more information. <== 因为 "-" 是参数嘛! [root@linux tmp]# rm ./-aaa- 这是移除的指令( remove ),相当于 dos 下的 del 指令!这里要注意的是,通常在 Linux 系统下,为了 怕档案被误杀,所以很多 distributions 都已经预设有 -i 这个参数, -i 是指每个档案被杀掉之前都会 让使用者确认一次,以预防误杀档案!而如果要连目录下的东西都一起杀掉的话, 例如子目录里面还有子 目录时,那就要使用 -rf 这个参数了!不过,使用『 rm -rf 』这个指令之前,请千万注意了,因为,该 目录或档案『肯定』会被 root 杀掉!因为系统不会再次询问你是否要砍掉呦!所以那是个超级严重的指 令下达呦! 得特别注意!不过,如果你确定该目录不要了,那么使用 rm -rf 来循环杀掉是不错的方式! 另外,范例三也是很有趣的例子,我们在之前就谈过,档名最好不要使用 "-" 号开头, 因为 "-" 后面接 的是参数,因此,单纯的使用『 rm -aaa- 』系统的指令就会误判啦! 那如果使用后面会谈到的正规表示 法时,还是会出问题的!所以,只能用避过首位字符是 "-" 的方法啦! 就是加上本目录『 ./ 』即可! 如果 man rm 的话,其实还有一种方法,那就是『 rm -- -aaa- 』也可以啊! • mv (移动档案与目录,或更名) [root@linux ~]# mv [-fiu] source destination [root@linux ~]# mv [options] source1 source2 source3 .... directory 参数: -f :force 强制的意思,强制直接移动而不询问; -i :若目标档案 (destination) 已经存在时,就会询问是否覆盖! -u :若目标档案已经存在,且 source 比较新,才会更新 (update) 范例: 范例一:复制一档案,建立一目录,将档案移动到目录中 [root@linux ~]# cd /tmp [root@linux tmp]# cp ~/.bashrc bashrc [root@linux tmp]# mkdir mvtest [root@linux tmp]# mv bashrc mvtest # 将某个档案移动到某个目录去,就是这样做! 范例二:将刚刚的目录名称更名为 mvtest2 [root@linux tmp]# mv mvtest mvtest2 <== 这样就更名了!简单~ # 其实在 Linux 底下还有个有趣的指令,名称为 rename , # 该指令则专职进行档案的更名呢!用途也是不少~可以参阅 man rename 喔! 范例三:再建立两个档案,再全部移动到 /tmp/mvtest2 当中 [root@linux tmp]# cp ~/.bashrc bashrc1 [root@linux tmp]# cp ~/.bashrc bashrc2 [root@linux tmp]# mv bashrc1 bashrc2 mvtest2 # 注意到这边,如果有多个来源档案或目录,则最后一个目标文件一定是『目录!』 # 意思是说,将所有的数据移动到该目录的意思! 这是搬移 (move) 的意思!当你要移动档案或目录的时后,呵呵!这个指令就很重要啦! 同样的,你也可 以使用 -u ( update )来测试新旧档案,看看是否需要搬移啰! 另外一个用途就是『变更档名!』,我们 可以很轻易的使用 mv 来变更一个档案的档名呢!不过,在 Linux 才有的指令当中,有个 rename , 可 以用来更改大量档案的档名,您可以利用 man rename 来查阅一下,也是挺有趣的指令喔! 取得路径的文件名称与目录名称 我们前面介绍的完整文件名 (包含目录名称与文件名称) 当中提到,完整档名最长可以到达 4096 个字符。 那么您怎么知道那个是档名?那个是目录名?嘿嘿!就是利用斜线 (/) 来分辨啊! 其实,取得文件名或 者是目录名称,一般的用途应该是在写程序的时候,用来判断之用的啦~ 所以,这部分的指令可以用在第 三篇内的 shell scripts 里头喔! 底下我们简单的以几个范例来谈一谈 basename 与 dirname 的用途! [root@linux ~]# basename /etc/sysconfig/network network <== 很简单!就取得最后的档名~ [root@linux ~]# dirname /etc/sysconfig/network /etc/sysconfig <== 取得的变成目录名了! 很简单的应用吧! 档案内容查阅: 刚刚我们提到的都只是在于显示档案的属性与权限,或者是移动与复制一个档案或目录而已, 那么如果我 们要查阅一个档案的内容时,该如何是好呢?!这里有相当多有趣的指令可以来分享一下: 最常使用的显 示档案内容的指令可以说是 cat 与 more 及 less 了!此外,如果我们要查看一个很大型的档案 ( 好几 百 MB 时 ),但是我们只需要后端的几行字而已,那么该如何是好?呵呵!用 tail 呀,此外, tac 这个 指令也可以达到!好了,说说各个指令的用途吧! • cat 由第一行开始显示档案内容 • tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写! • nl 显示的时候,顺道输出行号! • more 一页一页的显示档案内容 • less 与 more 类似,但是比 more 更好的是,他可以往前翻页! • head 只看头几行 • tail 只看尾巴几行 • od 以二进制的方式读取档案内容! 直接检视档案内容 直接查阅一个档案的内容可以使用 cat/tac/nl 这几个指令啊! • cat (concatenate) [root@linux ~]# cat [-AEnTv] 参数: -A :相当于 -vET 的整合参数,可列出一些特殊字符~ -E :将结尾的断行字符 $ 显示出来; -n :打印出行号; -T :将 [tab] 按键以 ^I 显示出来; -v :列出一些看不出来的特殊字符 范例: 范例一:检阅 /etc/issue 这个档案的内容 [root@linux ~]# cat /etc/issue Fedora Core release 4 (Stentz) Kernel \r on an \m 范例二:承上题,顺便打印出行号时! [root@linux ~]# cat -n /etc/issue 1 Fedora Core release 4 (Stentz) 2 Kernel \r on an \m 3 # 看到了吧!可以印出行号呢!这对于大档案要找某个特定的行时,有点用处! 范例三:将 /etc/xinetd.conf 的内容完整的显示出来(包含特殊字符) [root@linux ~]# cat -A /etc/xinetd.conf #$ # Simple configuration file for xinetd$ #$ # Some defaults, and include /etc/xinetd.d/$ $ defaults$ {$ ^Iinstances = 60$ log_type = SYSLOG authpriv$ log_on_success^I^I= HOST PID$ log_on_failure^I^I= HOST$ ^Icps^I^I^I= 25 30$ }$ $ includedir /etc/xinetd.d$ # 在一般的环境中,打印出来的结果在有 [tab] 与空格键,其实看不出来, # 那么使用 cat -A 时,会将 [tab] 按键以 ^I 显示,而断行字符也会显示出来~ # 最特殊的当然就是断行字符了!这个段行字符在 Linux 与 Windows 是不一样的。 # 在 Linux 是以 $ 为断行字符,而在 Windows 则是以 ^M$ 为断行字符。 # 这部分我们会在 vi 软件的介绍时,再次的说明到喔! 嘿嘿! Linux 里面有『猫』?!喔!不是的, cat 是 Concatenate (连续)的简写, 主要的功能是将 一个档案的内容连续的印出在屏幕上面!例如上面的例子中,我们将 /etc/issue 印出来!如果加上 -n 的 话,则每一行前面还会加上行号呦!鸟哥个人是比较少用 cat 啦!毕竟当你的档案内容的行数超过 40 行 以上,嘿嘿!根本来不及看!所以,配合等一下要介绍的 more 或者是 less 来执行比较好!此外,如果 是一般的 DOS 档案时,就需要特别留意一些奇奇怪怪的符号了, 例如断行与 [tab] 等,要显示出来,就 得加入 -A 之类的参数了! • tac (反向列示) [root@linux ~]# tac /etc/issue Kernel \r on an \m Fedora Core release 4 (Stentz) # 嘿嘿!与刚刚上面的范例一比较,是由最后一行先显示喔! tac 这个好玩了!怎么说呢?详细的看一下, cat 与 tac ,有没有发现呀!对啦! tac 刚好是将 cat 反 写过来,所以他的功能就跟 cat 相反啦, cat 是由『第一行到最后一行连续显示在屏幕上』,而 tac 则 是『 由最后一行到第一行反向在屏幕上显示出来 』,很好玩吧! • nl (添加行号打印) [root@linux ~]# nl [-bnw] 档案 参数: -b :指定行号指定的方式,主要有两种: -b a :表示不论是否为空行,也同样列出行号; -b t :如果有空行,空的那一行不要列出行号; -n :列出行号表示的方法,主要有三种: -n ln :行号在屏幕的最左方显示; -n rn :行号在自己字段的最右方显示,且不加 0 ; -n rz :行号在自己字段的最右方显示,且加 0 ; -w :行号字段的占用的位数。 范例: 范例一:列出 /etc/issue 的内容 [root@linux ~]# nl /etc/issue 1 Fedora Core release 4 (Stentz) 2 Kernel \r on an \m # 注意看,这个档案其实有三行,第三行为空白(没有任何字符), # 因为他是空白行,所以 nl 不会加上行号喔!如果确定要加上行号,可以这样做: [root@linux ~]# nl -b a /etc/issue 1 Fedora Core release 4 (Stentz) 2 Kernel \r on an \m 3 # 呵呵!行号加上来啰~那么如果要让行号前面自动补上 0 呢?可这样 [root@linux ~]# nl -b a -n rz /etc/issue 000001 Fedora Core release 4 (Stentz) 000002 Kernel \r on an \m 000003 # 嘿嘿!自动在自己字段的地方补上 0 了~预设字段是六位数,如果想要改成 3 位数? [root@linux ~]# nl -b a -n rz -w 3 /etc/issue 001 Fedora Core release 4 (Stentz) 002 Kernel \r on an \m 003 # 变成仅有 3 位数啰~ nl 可以将输出的档案内容自动的加上行号!其结果与 cat -n 有点不太一样, nl 可以将行号做比较多的 显示设计,包括位数与是否自动补齐 0 等等的功能呢~ 可翻页检视 前面提到的 nl 与 cat, tac 等等,都是一次性的将数据显示到屏幕上面,那有没有可以进行一页一页翻 动的指令啊? 让我们可以一页一页的观察,才不会前面的看不到啊~呵呵!有的!那就是 more 与 less 啰~ • more (一页一页翻动) [root@linux ~]# more /etc/man.config # # Generated automatically from man.conf.in by the # configure script. # # man.conf from man-1.5p # .......中间省略....... --More--(28%) <== 重点在这一行喔! 仔细的给他看到上面的范例,如果 more 后面接的档案长度大于屏幕输出的行数时, 就会出现类似上面的 图示。重点在最后一行,最后一行会显示出目前显示的百分比, 而且还可以在最后一行输入一些有用的指 令喔!在 more 这个程序的运作过程中,你有几个按键可以按的: • 空格键 (space):代表向下翻一页; • Enter :代表向下翻『一行』; • /字符串 :代表在这个显示的内容当中,向下搜寻『字符串』; • :f :立刻显示出文件名以及目前显示的行数; •q :代表立刻离开 more ,不再显示该档案内容。 要离开 more 这个指令的显示工作,可以按下 q 就能够离开了。而要向下翻页,就使用空格键即可。 比 较有用的是搜寻字符串的功能,举例来说,我们使用『 more /etc/man.config 』来观察该档案, 若想要 在该档案内搜寻 MANPATH 这个字符串时,可以这样做: [root@linux ~]# more /etc/man.config # # Generated automatically from man.conf.in by the # configure script. # # man.conf from man-1.5p # .......中间省略....... /MANPATH <== 输入了 / 之后,光标就会自动跑到最底下一行等待输入! 如同上面的说明,输入了 / 之后,光标就会跑到最底下一行,并且等待您的输入, 您输入了字符串之后, 嘿嘿! more 就会开始向下搜寻该字符串啰~而重复搜寻同一个字符串, 可以直接按下 n 即可啊!最后, 不想要看了,就按下 q 即可离开 more 啦! • less (一页一页翻动) [root@linux ~]# less /etc/man.config # # Generated automatically from man.conf.in by the # configure script. # # man.conf from man-1.5p ......中间省略........ : <== 这里可以等待您输入指令! less 的用法比起 more 又更加的有弹性,怎么说呢?在 more 的时候,我们并没有办法向前面翻, 只能 往后面看,但若使用了 less 时,呵呵!就可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看 文件,您瞧,是不是更容易使用来观看一个档案的内容了呢!? 除此之外,在 less 里头可以拥有更多的『搜寻』功能喔!不止可以向下搜寻,也可以向上搜寻~ 实在是 很不错用~基本上,可以输入的指令有: • 空格键 :向下翻动一页; • [pagedown]:向下翻动一页; • [pageup] :向上翻动一页; • /字符串 :向下搜寻『字符串』的功能; • ?字符串 :向上搜寻『字符串』的功能; •n :重复前一个搜寻 (与 / 或 ? 有关!) •N :反向的重复前一个搜寻 (与 / 或 ? 有关!) •q :离开 less 这个程序; 查阅档案内容还可以进行搜寻的动作~瞧~ less 是否很不错用啊! 其实 less 还有很多的功能喔!详细 的使用方式请使用 man less 查询一下啊! ^_^ 资料撷取 我们可以将输出的资料作一个最简单的撷取,那就是取出前面 (head) 与取出后面 (tail) 文字的功能。 不过,要注意的是, head 与 tail 都是以『行』为单位来进行数据撷取的喔! • head (取出前面几行) [root@linux ~]# head [-n number] 档案 参数: -n :后面接数字,代表显示几行的意思 范例: [root@linux ~]# head /etc/man.config # 预设的情况中,显示前面十行!若要显示前 20 行,就得要这样: [root@linux ~]# head -n 20 /etc/man.config head 的英文意思就是『头』啦,那么这个东西的用法自然就是显示出一个档案的前几行啰! 没错!就是 这样!若没有加上 -n 这个参数时,预设只显示十行,若只要一行呢?那就加入『 head -n 1 filename 』 即可! • tail (取出后面几行) [root@linux ~]# tail [-n number] 档案 参数: -n :后面接数字,代表显示几行的意思 范例: [root@linux ~]# tail /etc/man.config # 预设的情况中,显示最后的十行!若要显示最后的 20 行,就得要这样: [root@linux ~]# tail -n 20 /etc/man.config 那么有 head 自然就有 tail ( 尾巴 ) 啰!没错!这个 tail 的用法跟 head 的用法差不多类似,只是显 示的是后面几行就是了!预设也是显示十行,若要显示非十行,就加 -n number 的参数! 例题一:假如我想要显示 ~/.bashrc 的第 11 到第 20 行呢? 答: 这个应该不算难,想一想,在第 11 到第 20 行,那么我取前 20 行,再取后十行, 所以结果就是:『 head –n 20 ~/.bashrc | tail –n 10 』,这样就可以得到第 11 到第 20 行之间的内容了!但是里面涉及到管线命令,需要在第三篇的时候才讲的到! 非纯文字文件: od 我们上面提到的,都是在查阅纯文字文件 (ASCII 格式的档案) 的内容。 那么万一我们想要查阅非文字文 件,举例来说,例如 /usr/bin/passwd 这个执行档的内容时, 又该如何去读出信息呢?事实上,由于执 行档通常是 binary file ,使用上头提到的指令来读取他的内容时, 确实会产生类似乱码的数据啊!那 怎么办?没关系,我们可以利用 od 这个指令来读取喔! [root@linux ~]# od [-t TYPE] 档案 参数: -t :后面可以接各种『类型 (TYPE)』的输出,例如: a :利用预设的字符来输出; c :使用 ASCII 字符来输出 d[size] :利用十进制(decimal)来输出数据,每个整数占用 size bytes ; f[size] :利用浮点数值(floating)来输出数据,每个数占用 size bytes ; o[size] :利用八进位(octal)来输出数据,每个整数占用 size bytes ; x[size] :利用十六进制(hexadecimal)来输出数据,每个整数占用 size bytes ; 范例: [root@linux ~]# od -t c /usr/bin/passwd 0000000 177 E L F 001 001 001 \0 \0 \0 \0 \0 \0 \0 \0 \0 0000020 002 \0 003 \0 001 \0 \0 \0 260 225 004 \b 4 \0 \0 \0 0000040 020 E \0 \0 \0 \0 \0 \0 4 \0 \0 \a \0 ( \0 0000060 035 \0 034 \0 006 \0 \0 \0 4 \0 \0 \0 4 200 004 \b 0000100 4 200 004 \b 340 \0 \0 \0 340 \0 \0 \0 005 \0 \0 \0 .....中间省略....... 利用这个指令,可以将 data file 或者是 binary file 的内容数据给他读出来喔! 虽然读出的来数值预 设是使用非文字文件,亦即是 16 进位的数值来显示的, 不过,我们还是可以透过 -t c 的参数来将数据 内的字符以 ASCII 类型的字符来显示, 虽然对于一般使用者来说,这个指令的用处可能不大,但是对于 工程师来说, 这个指令可以将 binary file 的内容作一个大致的输出,他们可以看得出东西的啦~ ^_^ 修改档案时间与建置新档: touch 我们在 ls 这个指令的介绍时,有稍微提到每个档案在 linux 底下都会记录三个主要的变动时间, 咦! 那么三个时间是哪三个呢? • modification time (mtime):当该档案的『内容数据』变更时,就会更新这个时间! 内容数据 指的是档案的内容,而不是档案的属性喔! • status time (ctime):当该档案的『状态 (status)』改变时,就会更新这个时间,举例来说, 像 是权限与属性被更改了,都会更新这个时间啊~ • access time (atime):当『该档案的内容被取用』时,就会更新这个读取时间 (access)。 举例 来说,我们使用 cat 去读取 ~/.bashrc ,就会更新 atime 了。 这是个挺有趣的现象,举例来说,我们来看一看您自己的 /etc/man.config 这个档案的时间吧! [root@linux ~]# ls -l /etc/man.config -rw-r--r-- 1 root root 4506 Apr 8 19:11 /etc/man.config [root@linux ~]# ls -l --time=atime /etc/man.config -rw-r--r-- 1 root root 4506 Jul 19 17:53 /etc/man.config [root@linux ~]# ls -l --time=ctime /etc/man.config -rw-r--r-- 1 root root 4506 Jun 25 08:28 /etc/man.config 看到了吗?在预设的情况下, ls 显示出来的是该档案的 mtime ,也就是这个档案的内容上次被更动的时 间。 至于我的系统是在 6/25 的时候安装的,因此,这个档案被产生但是状态被更动的时间就回溯到那个 时间点了! 而还记得刚刚我们使用的范例当中,有使用到这个档案啊,所以啊,他的 atime 就会变成刚 刚使用的时间了! 档案的时间是很重要的,因为,如果档案的时间误判的话,可能会造成某些程序无法顺利的运作~ OK!那 么万一我发现了一个档案来自未来(嘿嘿!不要怀疑!很多时候会有这个问题的!这个我们在安装的时候, 提到的 GMT 时间就是那个意思啦~),那该如何让该档案的时间变成『现在』的时刻呢? 很简单啊!就用 『touch』这个指令即可! [root@linux ~]# touch [-acdmt] 档案 参数: -a :仅修订 access time; -c :仅修改时间,而不建立档案; -d :后面可以接日期,也可以使用 --date="日期或时间" -m :仅修改 mtime ; -t :后面可以接时间,格式为[YYMMDDhhmm] 范例: 范例一:新建一个空的档案 [root@linux ~]# cd /tmp [root@linux tmp]# touch testtouch [root@linux tmp]# ls -l testtouch -rw-r--r-- 1 root root 0 Jul 19 20:49 testtouch # 注意到,这个档案的大小是 0 呢!在预设的状态下,如果 touch 后面有接档案, # 则该档案的三个时间 (atime/ctime/mtime) 都会更新为目前的时间。若该档案不存在, # 则会主动的建立一个新的空的档案喔!例如上面这个例子! 范例二:将 ~/.bashrc 复制成为 bashrc,假设复制完全的属性,检查其日期 [root@linux tmp]# cp ~/.bashrc bashrc [root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc -rwxr-xr-x 1 root root 395 Jul 4 11:45 bashrc <==这是 mtime -rwxr-xr-x 1 root root 395 Jul 19 20:44 bashrc <==这是 atime -rwxr-xr-x 1 root root 395 Jul 19 20:53 bashrc <==这是 ctime # 在这个案例当中,我们使用了 ; 这个指令分隔符,他的用法我们会在 Bash shell 中提到。 # 此外, ll 是 ls -l 的命令别名,这个我们也会在 bash shell 当中再次提及, # 您目前可以简单的想成, ll 就是 ls -l 的简写即可!至于 ; 则是同时下达两个指令, # 且让两个指令『依序』执行的意思。上面的结果当中我们可以看到,该档案变更的日期 # Jul 4 11:45,但是 atime 与 ctime 不一样啰~ 范例三:修改案例二的 bashrc 档案,将日期调整为两天前 [root@linux tmp]# touch -d "2 days ago" bashrc [root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc -rwxr-xr-x 1 root root 395 Jul 17 21:02 bashrc -rwxr-xr-x 1 root root 395 Jul 17 21:02 bashrc -rwxr-xr-x 1 root root 395 Jul 19 21:02 bashrc # 跟上个范例比较看看,本来是 19 日的变成了 17 日了 (atime/mtime)~ # 不过, ctime 并没有跟着改变喔! 范例四:将上个范例的 bashrc 日期改为 2005/07/15 2:02 [root@linux tmp]# touch -t 0507150202 bashrc [root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc -rwxr-xr-x 1 root root 395 Jul 15 02:02 bashrc -rwxr-xr-x 1 root root 395 Jul 15 02:02 bashrc -rwxr-xr-x 1 root root 395 Jul 19 21:05 bashrc # 注意看看,日期在 atime 与 mtime 都改变了,但是 ctime 则是记录目前的时间! 透过 touch 这个指令,我们可以轻易的修订档案的日期与时间。并且,也可以建立一个空的档案喔! 不 过,要注意的是,即使我们复制一个档案时,复制所有的属性,但也没有办法复制 ctime 这个属性的。ctime 可以记录这个档案最近的状态 (status) 被改变的时间。无论如何,还是要告知大家, 我们平时看的档案 属性中,比较重要的还是属于那个 mtime 啊!我们关心的常常是这个档案的『内容』 是什么时候被更动 的说~瞭乎? 无论如何, touch 这个指令最常被使用的情况是: • 建立一个空的档案; • 将某个档案日期修订为目前 (mtime 与 atime) 档案与目录的预设权限与隐藏权限 由前一章的 Linux 档案属性 的内容我们可以知道一个档案有若干个属性,包括 ( r, w, x ) 等基本属性, 及是否为目录 (d) 与档案 (-) 或者是连结档 (l) 等等的属性!那么要修改属性的方法在前面也约略提过 了,这里再加强补充一下! 此外,由于 Linux 还可以设定其它的系统安全属性,使用 chattr 来设定, 而以 lsattr 来查看,最重要的属性就是可以设定其不可修改的特性!让连档案的拥有者都不能进行修改! 这个属性可是相当重要的,尤其是在安全机制上面 ( security )! 首先,先来复习一下上一章谈到的权限概念,将底下的例题看一看先~ 例题二:你的系统有个一般身份使用者 dmtsai,他的群组为 users,他的家目录在 /home/dmtsai,你想将你的 ~/.bashrc 复制给他(假设你是 root),可以怎么作? 答: cp ~/.bashrc ~dmtsai/bashrc chown dmtsai:users ~dmtsai/bashrc 在上面这个范例当中,我为了怕覆盖掉 dmtsai 自己的 ~dmtsai/.bashrc ,所以将档名更名了~ 而复制 给他后,还要修正这个档案的拥有者与群组才行喔! 例题三:我想在 /tmp 底下建立一个目录,这个目录名称为 chap2_2_ex1 ,并且,这个目录拥 有者为 dmtsai,群组为 users ,此外,任何人都可以进入该目录浏览档案,不过除了 dmtsai 之外,其它人都不能修改该目录下的档案。 答: 因为除了 dmtsai 之外,其它人不能修改该目录下的档案,此外, dmtsai 可以修改, 所以整个目录的权限应该是 drwxr-xr-x 才对!因此 mkdir /tmp/chap2_2_ex1 chown -R dmtsai:users /tmp/chap2_2_ex1 chmod -R 755 /tmp/chap2_2_ex1 在上面这个例题当中,如果您知道 755 那个分数是怎么计算出来的,那么您应该对于权限有一定程度的概 念了。 如果您不知道 755 怎么来的?那么.....赶快回去前一章看看 chmod 那个指令的介绍部分啊!这 部分很重要喔!您得要先清楚的了解到才行~否则就进行不下去啰~ 假设您对于权限都认识的差不多了, 那么底下我们就要来谈一谈, 『新增一个档案或目录时,预设的权限是什么?』这个议题! 档案预设权限:umask OK!那么现在我们知道如何建立或者是改变一个目录或档案的属性了,不过, 您知道当你建立一个新的档 案或目录时,他的预设属性会是什么吗?呵呵!那就与 umask 这个玩意儿有关了!那么 umask 是在搞什 么呢?基本上, umask 就是指定 『目前使用者在建立档案或目录时候的属性默认值』, 那么如何得知或 设定 umask 呢?他的指定条件以底下的方式来指定: [root@linux ~]# umask 0022 [root@linux ~]# umask -S u=rwx,g=rx,o=rx 查阅的方式有两种,一种可以直接输入 umask ,就可以看到数字型态的权限设定分数, 一种则是加入 -S (Symbolic) 这个参数,就会以符号类型的方式来显示出权限了!奇怪的是,怎么 umask 会有四组数字啊? 不是只有三组吗?是没错啦~ 第一组是特殊权限用的,我们先不要理他,所以先看后面三组即可。 在预设权限的属性上,目录与档案是不一样的。由于档案我们不希望他具有可执行的权力, 预设情况中, 档案是没有可执行 (x) 权限的。因此: • 若使用者建立为『档案』则预设『没有可执行 ( x ) 项目』,亦即只有 rw 这两个项目,也就是 最大为 666 分,预设属性如下: -rw-rw-rw- • 若使用者建立为『目录』,则由于 x 与是否可以进入此目录有关,因此预设为所有权限均开放, 亦即为 777 分,预设属性如下: drwxrwxrwx 那么 umask 指定的是『该默认值需要减掉的权限!』因为 r、w、x 分别是 4、2、1 分,所以啰!也就是 说,当要拿掉能写的权限,就是输入 2 分,而如果要拿掉能读的权限,也就是 4 分,那么要拿掉读与写 的权限,也就是 6 分,而要拿掉执行与写入的权限,也就是 3 分,这样了解吗?请问您, 5 分是什么? 呵呵! 就是读与执行的权限啦!如果以上面的例子来说明的话,因为 umask 为 022 ,所以 user 并没有 被拿掉属性,不过 group 与 others 的属性被拿掉了 2 ( 也就是 w 这个属性 ),那么由于当使用者: • 建立档案时:(-rw-rw-rw-) – (-----w--w-) ==> -rw-r--r-• 建立目录时:(drwxrwxrwx) – (d----w--w-) ==> drwxr-xr-x 不相信吗?我们就来测试看看吧! [root@linux ~]# umask 0022 [root@linux ~]# touch test1 [root@linux ~]# mkdir test2 [root@linux ~]# ll -rw-r--r-- 1 root root 0 Jul 20 00:36 test1 drwxr-xr-x 2 root root 4096 Jul 20 00:36 test2 呵呵!瞧见了吧?!确定属性是没有错的。好了,假如我们想要让与使用者同群组的人也可以存取档案呢? 也就是说,假如 dmtsai 是 users 这个群组的人,而 dmtsai 作的档案希望让 users 同群组的人也可以 存取, 这也是常常被用在团队开发计划时,常常会考虑到的权限问题。在这样的情况下, 我们的 umask 自 然不能取消 group 的 w 权限,也就是说,我们希望制作出来的档案应该是 -rw-rw-r-- 的模样,所以啰, umask 应该是要 002 才好 (仅拿掉 others 的 w 权限)。那么如何设定 umask 呢? 简单的很,直接在 umask 后面输入 002 就好了! [root@linux ~]# umask 002 [root@linux ~]# touch test3 [root@linux ~]# mkdir test4 [root@linux ~]# ll -rw-rw-r-- 1 root root 0 Jul 20 00:41 test3 drwxrwxr-x 2 root root 4096 Jul 20 00:41 test4 所以说,这个 umask 对于档案与目录的预设权限是很有关系的!这个概念可以用在任何服务器上面, 尤 其是未来在您架设档案服务器 (file server) ,举例来说, SAMBA Server 或者是 FTP server 时, 都 是很重要的观念!这牵涉到您的使用者是否能够将档案进一步利用的问题喔!不要等闲视之! 例题四:假设您的 umask 为 003 ,请问该 umask 情况下,建立的档案与目录权限为? 答: umask 为 003 ,所以拿掉的属性为 --------wx,因此: 档案: (-rw-rw-rw-) - (--------wx) = -rw-rw-r-目录: (drwxrwxrwx) - (--------wx) = drwxrwxr-- Tips: 关于 umask 与权限的计算方式中,教科书喜欢使用二进制的方式 来进行 AND 与 NOT 的计算, 不过,鸟哥还是比较喜欢使用符号 方式来计算~联想上面比较容易一点~ 但是,有的书籍或者是 BBS 上面的朋友,有的人喜欢使用档案预设属性 666 与目录预设 属性 777 来与 umask 进行相减的计算~这是不好的喔!以上面例 题四的案例来看, 如果使用预设属性相加减,则档案变成: 666-003=663,亦即是 -rw-rw--wx ,这可是完全不对的喔! 想想 看,原本档案就已经去除 x 的预设属性了,怎么可能突然间冒出 来了? 所以,这个地方得要特别小心喔! 在预设的情况中, root 的 umask 会拿掉比较多的属性,root 的 umask 预设是 022 , 这是基于安全的 考虑啦~至于一般身份使用者,通常他们的 umask 为 002 ,亦即保留同群组的写入权力! 其实,关于预 设 umask 的设定可以参考 /etc/bashrc 这个档案的内容,不过,不建议修改该档案, 您可以参考 bash shell 提到的环境参数设定档 (~/.bashrc) 的说明~这部分我们在第三章的时候会提到! 档案隐藏属性: 什么?档案还有隐藏属性?光是那九个权限就快要疯掉了,竟然还有隐藏属性,真是要命~ 但是没办法, 就是有档案的隐藏属性存在啊!不过,这些隐藏的属性确实对于系统有很大的帮助的~ 尤其是在系统安全 (Security) 上面,重要的紧呢!底下我们就来谈一谈如何设定与检查这些隐藏的属性吧! • chattr (设定档案隐藏属性) [root@linux ~]# chattr [+-=][ASacdistu] 档案或目录名称 参数: + :增加某一个特殊参数,其它原本存在参数则不动。 - :移除某一个特殊参数,其它原本存在参数则不动。 = :设定一定,且仅有后面接的参数 A :当设定了 A 这个属性时,这个档案(或目录)的存取时间 atime (access) 将不可被修改,可避免例如手提式计算机容易有磁盘 I/O 错误的情况发生! S :这个功能有点类似 sync 的功能!就是会将数据同步写入磁盘当中! 可以有效的避免数据流失! a :当设定 a 之后,这个档案将只能增加数据,而不能删除,只有 root 才能设定这个属性。 c :这个属性设定之后,将会自动的将此档案『压缩』,在读取的时候将会自动解压缩, 但是在储存的时候,将会先进行压缩后再储存(看来对于大档案似乎蛮有用的!) d :当 dump(备份)程序被执行的时候,设定 d 属性将可使该档案(或目录)不具有 dump 功能 i :这个 i 可就很厉害了!他可以让一个档案『不能被删除、改名、设定连结也无法写入 或新增资料!』对于系统安全性有相当大的帮助! j :当使用 ext3 这个档案系统格式时,设定 j 属性将会使档案在写入时先记录在 journal 中!但是当 filesystem 设定参数为 data=journalled 时,由于已经设定了 日志了,所以这个属性无效! s :当档案设定了 s 参数时,他将会被完全的移除出这个硬盘空间。 u :与 s 相反的,当使用 u 来设定档案时,则数据内容其实还存在磁盘中, 可以使用来 undeletion. 注意:这个属性设定上面,比较常见的是 a 与 i 的设定值,而且很多设定值必须要身为 root 才能够设定的喔! 范例: [root@linux ~]# cd /tmp [root@linux tmp]# touch attrtest [root@linux tmp]# chattr +i attrtest [root@linux tmp]# rm attrtest rm: remove write-protected regular empty file `attrtest'? y rm: cannot remove `attrtest': Operation not permitted # 看到了吗?呼呼!连 root 也没有办法将这个档案删除呢!赶紧解除设定! [root@linux tmp]# chattr -i attrtest 这这个指令是重要的,尤其是在系统的安全性上面!由于这些属性是隐藏的性质,所以需要以 lsattr 才 能看到该属性呦!其中,个人认为最重要的当属 +i 这个属性了,因为他可以让一个档案无法被更动,对 于需要强烈的系统安全的人来说, 真是相当的重要的!里头还有相当多的属性是需要 root 才能设定的呢! 此外,如果是 log file 这种的登录档,就更需要 +a 这个可以增加,但是不能修改旧有的数据与删除的 参数了! 怎样?很棒吧!未来提到登录档的认知时,我们再来聊一聊如何设定他吧! • lsattr (显示档案隐藏属性) [root@linux ~]# lsattr [-aR] 档案或目录 参数: -a :将隐藏文件的属性也秀出来; -R :连同子目录的数据也一并列出来! 范例: [root@linux tmp]# chattr +aij attrtest [root@linux tmp]# lsattr ----ia---j--- ./attrtest 使用 chattr 设定后,可以利用 lsattr 来查阅隐藏的属性。不过, 这两个指令在使用上必须要特别小心, 否则会造成很大的困扰。例如:某天你心情好,突然将 /etc/shadow 这个重要的密码记录档案给他设定成 为具有 i 的属性,那么过了若干天之后, 你突然要新增使用者,却一直无法新增!别怀疑,赶快去将 i 的 属性拿掉吧! 档案特殊权限: SUID/SGID/Sticky Bit 我们前面一直提到关于档案的重要权限,那就是 rwx 这三个读、写、执行的权限。 但是,眼尖的朋友们 一定注意到了一件事,那就是,怎么我们的 /tmp 权限怪怪的? 还有,那个 /usr/bin/passwd 也怪怪的? 怎么回事啊?看看先: [root@linux ~]# ls -ld /tmp ; ls -l /usr/bin/passwd drwxrwxrwt 5 root root 4096 Jul 20 10:00 /tmp -r-s--x--x 1 root root 18840 Mar 7 18:06 /usr/bin/passwd 不是只有 rwx 吗?还有其它的特殊权限啊?啊.....头又开始昏了~ @_@ 呵呵,不要担心啦,我们这里先 不谈这两个权限,只是先介绍一下而已。 因为要了解这几个特殊的权限,必须要先具有账号的 ID 概念, 以及程序的程序 (process) 概念后, 才能够进一步的了解这个特殊权限所代表的意义。 • Set UID 会制作出 s 与 t 的权限,是为了让一般使用者在执行某些程序的时候, 能够暂时的具有该程序拥有者的 权限。 举例来说好了,我们知道账号与密码的存放档案其实是 /etc/passwd 与 /etc/shadow 。 而 /etc/shadow 这个档案的权限是什么?是『-r--------』。且他的拥有者是 root 喔!在这个权限中,仅 有 root 可以『强制』储存,其它人是连看都没有办法看的吶! 但是偏偏鸟哥使用 dmtsai 这个一般身份使用者去更新自己的密码时,使用的就是 /usr/bin/passwd 这个 程序, 却是可以更新自己的密码的,也就是说, dmtsai 这个一般身份使用者可以存取 /etc/shadow 这 个密码文件!但!怎么可能?明明 /etc/shadow 就是没有 dmtsai 可以存取的权限啊!呵呵~这就是 s 这 个权限的帮助啦! 当 s 这个权限在 user 的 x 时,也就是类似上表的 -r-s--x--x ,称为 Set UID , 简称为 SUID , 这个 UID 代表的是 User 的 ID ,而 User 代表的则是这个程序 (/usr/bin/passwd) 的 拥有者 (root 啊!)。 那么由上面的定义中,我们知道了,当 dmtsai 这个使用者执行 /usr/bin/passwd 时,他就会『暂时』的得到档案拥有人 root 的权限。 SUID 仅可用在『二进制制档案(binary file)』上, SUID 因为是程序在执行的过程中拥有档案拥有者的 权限,因此,他仅可用于 binary file , 不能够用在批次档 (shell script) 上面的!这是因为 shell script 只是将很多的 binary 执行档叫进来执行而已!所以 SUID 的权限部分,还是得要看 shell script 呼叫进来的程序的设定, 而不是 shell script 本身。当然,SUID 对于目录也是无效的~这点要特别留 意。 • Set GID 进一步来说,如果 s 的权限是在 group 时,那么就是 Set GID ,简称为 SGID。 SGID 可以用在两个部 分喔! • 档案:如果 SGID 是设定在 binary file 上面,则不论使用者是谁,在执行该程序的时候, 他 的有效群组 (effective group) 将会变成该程序的群组所有人 (group id)。 • 目录:如果 SGID 是设定在 A 目录上面,则在该 A 目录内所建立的档案或目录的 group ,将会 是 此 A 目录的 group ! 一般来说, SGID 应该是比较多用在特定的多人团队的项目开发上, 在系统当中应该会比较少这个设定才 对~ • Sticky Bit 这个 Sticky Bit 目前只针对目录有效,对于档案已经没有效果了。 SBit 对于目录的作用是:『在具有 SBit 的目录下,使用者若在该目录下具有 w 及 x 的权限, 则当使用者在该目录下建立档案或目录时, 只有档案拥有者与 root 才有权力删除』。换句话说:当甲这个使用者于 A 目录下是拥有 group 或者是 other 的项目,并且拥有 w 的权限, 这表示『甲使用者对该目录内任何人建立的目录或档案均可进行 " 删除/更名/搬移" 等动作。』 不过,如果将 A 目录加上了 Sticky bit 的权限项目时, 则甲只能够针对 自己建立的档案或目录进行删除/更名/移动等动作。 举例来说,我们的 /tmp 本身的权限是『drwxrwxrwt』, 在这样的权限内容下,任何人都可以在 /tmp 内 新增、修改档案,但仅有该档案/目录建立者与 root 能够删除自己的目录或档案。这个特性也是挺重要的 啊!你可以这样做个简单的测试: 1. 以 root 登入系统,并且进入 /tmp 当中; 2. touch test,并且更改 test 权限成为 777 ; 3. 以一般使用者登入,并进入 /tmp; 4. 尝试删除 test 这个档案! 更多关于 SUID/SGID/Sticky Bit 的介绍,我们会在 程序与资源管理 中再次提及的,目前,您先有个简 单的基础概念就好了!当然,也可以参考鸟园讨论区的这一篇讨论: http://phorum.vbird.org/viewtopic.php?t=20256 • SUID/SGID/SBIT 权限设定 前面介绍过 SUID 与 SGID 的功能,那么如何开启档案使成为具有 SUID 与 SGID 的权限呢?! 这就需要 刚刚的数字更改权限的方法了!现在你应该已经知道数字型态个更改权限方式为『三个数字』的组合, 那 么如果在这三个数字之前再加上一个数字的话,那最前的面数字就代表这几个属性了! ( 注:通常我们使 用 chmod xyz filename 的方式来设定 filename 的属性时,则是假设没有 SUID, SGID 及 Sticky bit 啦! ) • 4 为 SUID • 2 为 SGID • 1 为 Sticky bit 假设要将一个档案属性改为『-rwsr-xr-x』时,由于 s 在使用者权限中,所以是 SUID ,因此, 在原先 的 755 之前还要加上 4 ,也就是:『 chmod 4755 filename 』来设定!此外,还有大 S 与大 T 的产生 喔!参考底下的范例啦!(注意:底下的范例只是练习而已, 所以鸟哥使用同一个档案来设定,您必须了 解 SUID 不是用在目录上,而 SBIT 不是用在档案上的喔!) [root@linux ~]# cd /tmp [root@linux tmp]# touch test [root@linux tmp]# chmod 4755 test; ls -l test -rwsr-xr-x 1 root root 0 Jul 20 11:27 test [root@linux tmp]# chmod 6755 test; ls -l test -rwsr-sr-x 1 root root 0 Jul 20 11:27 test [root@linux tmp]# chmod 1755 test; ls -l test -rwxr-xr-t 1 root root 0 Jul 20 11:27 test [root@linux tmp]# chmod 7666 test; ls -l test -rwSrwSrwT 1 root root 0 Jul 20 11:27 test # 这个例子就要特别小心啦!怎么会出现大写的 S 与 T 呢?不都是小写的吗? # 因为 s 与 t 都是取代 x 这个参数的,但是你有没有发现阿,我们是下达 # 7666 喔!也就是说, user, group 以及 others 都没有 x 这个可执行的标志 # ( 因为 666 嘛! ),所以,这个 S, T 代表的就是『空的』啦!怎么说? # SUID 是表示『该档案在执行的时候,具有档案拥有者的权限』,但是档案 # 拥有者都无法执行了,哪里来的权限给其它人使用?当然就是空的啦! ^_^ 档案类型:file 如果你想要知道某个档案的基本数据,例如是属于 ASCII 或者是 data 档案,或者是 binary , 且其中 有没有使用到动态函式库 (share library) 等等的信息,就可以利用 file 这个指令来检阅喔! 举例来 说: [root@linux ~]# file ~/.bashrc /root/.bashrc: ASCII text <== 告诉我们是 ASCII 的纯文字文件啊! [root@linux ~]# file /usr/bin/passwd /usr/bin/passwd: setuid ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped # 数据可多了~包括这个日 Set UID 2 的档案,使用 shared libs, # 适合于 Intel 的 386 以上机种的硬件,很清楚吧! [root@linux ~]# file /var/lib/slocate/slocate.db /var/lib/slocate/slocate.db: data <== 这是 data 档案! 透过这个指令,我们可以简单的先判断这个档案的格式为何喔! 档案的搜寻: 档案的搜寻可就厉害了!因为我们常常需要知道那个档案放在哪里,所以来谈一谈怎么搜寻吧!在 Linux 底 下也有相当优异的搜寻系统呦!通常 find 不很常用的!因为速度慢之外,也很操硬盘!通常我们都是先 使用 whereis 或者是 locate 来检查,如果真的找不到了,才以 find 来搜寻呦!为什么呢?因为 whereis 与 locate 是利用数据库来搜寻数据,所以相当的快速,而且并没有实际的搜寻硬盘,比较省时间啦! • which (寻找『执行档』) [root@linux ~]# which [-a] command 参数: -a :将所有可以找到的指令均列出,而不止第一个被找到的指令名称 范例: [root@linux ~]# which passwd /usr/bin/passwd [root@linux ~]# which traceroute -a /usr/sbin/traceroute /bin/traceroute 这个指令是根据『PATH』这个环境变量所规范的路径,去搜寻『执行档』的档名~ 所以,重点是找出『执 行档』而已!且 which 后面接的是『完整档名』喔!若加上 -a 参数,则可以列出所有的可以找到的同名 执行文件,而非仅显示第一个而已! • whereis (寻找特定档案) [root@linux ~]# whereis [-bmsu] 档案或目录名 参数: -b :只找 binary 的档案 -m :只找在说明文件 manual 路径下的档案 -s :只找 source 来源档案 -u :没有说明档的档案! 范例: [root@linux ~]# whereis passwd passwd: /usr/bin/passwd /etc/passwd /etc/passwd.OLD /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz # 任何与 passwd 有关的档名都会被列出来~ [root@linux ~]# whereis -b passwd passwd: /usr/bin/passwd /etc/passwd /etc/passwd.OLD [root@linux ~]# whereis -m passwd passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz 等一下我们会提到 find 这个搜寻指令, find 是很强大的搜寻指令,但时间花用的很大! (因为 find 是 直接搜寻硬盘,为如果你的硬盘比较老旧的话,嘿嘿!有的等的!) 这个时候 whereis 就相当的好用了! 另外, whereis 可以加入参数来找寻相关的资料, 例如如果你是要找可执行档 ( binary ) 那么加上 -b 就可以啦!例如上面的范例针对 passwd 这支程序来说明!如果不加任何参数的话,那么就将所有的数据 列出来啰! 那么 whereis 到底是使用什么咚咚呢?为何搜寻的速度会比 find 快这么多?! 其实那也没有什么!这 是因为 Linux 系统会将系统内的所有档案都记录在一个数据库档案里面, 而当使用 whereis 或者是底下 要说的 locate 时,都会以此数据库档案的内容为准, 因此,有的时后你还会发现使用这两个执行档时, 会找到已经被杀掉的档案! 而且也找不到最新的刚刚建立的档案呢! 这就是因为这两个指令是由数据库 当中的结果去搜寻档案的所在啊! 另外,基本上 Linux 每天会针对 Linux 主机上所有档案的所在进行搜寻数据库的更新, 更新的程序就是 updatedb ,你可以在 FC4 系统的 /etc/cron.daily/slocate.cron 这个档案找到相关的机制呦!当然, 也可以直接使用 /usr/bin/updatedb 来更新数据库档案呢! • locate [root@linux ~]# locate filename [root@linux ~]# locate passwd /lib/security/pam_passwdqc.so /lib/security/pam_unix_passwd.so /usr/lib/kde3/kded_kpasswdserver.so /usr/lib/kde3/kded_kpasswdserver.la .......中间省略....... 这个 locate 的使用更简单,直接在后面输入『档案的部分名称』后,就能够得到结果。 举上面的例子来 说,我输入 locate passwd ,那么在完整文件名 (包含路径名称) 当中,只要有 passwd 在其中, 就会 被显示出来的!这也是个很方便好用的指令,如果您忘记某个档案的完整档名时~~ 但是,这个东西还是有使用上的限制呦!为什么呢?您会发现使用 locate 来寻找数据的时候特别的快,这 是因为 locate 寻找的数据是由『已建立的数据库 /var/lib/slocate/』 里面的数据所搜寻到的,所以不 用直接在去硬盘当中存取数据,呵呵!当然是很快速啰! 那么有什么限制呢?就是因为他是经由数据库来 搜寻的,而数据库的建立预设是在每天执行一次 (每个 distribution 都不同, FC4 是每天更新数据库一 次!),所以当您新建立起来的档案, 却还在数据库更新之前搜寻该档案,那么 locate 会告诉您『找不 到!』呵呵!因为必须要更新数据库呀! 那么我到底要建立哪些数据库呢?是否全部都要建立?似乎不需要,这个时候, 你可以自己选择需要建立 档案数据库的目录呢!你可以在 /etc/updatedb.conf 这个档案内设定。 建议您使用默认值就好了,不过, 在 /etc/updatedb.conf 里面,请把『DAILY_UPDATE=no』改成 『DAILY_UPDATE=yes』就好了。至于修改 的方法等到我们第三章提完 vi 后,您就会晓得啰~ 当然啦,也可以自行手动执行 updatedb 即可! • find [root@linux ~]# find [PATH] [option] [action] 参数: 1. 与时间有关的参数: -atime n :n 为数字,意义为在 n 天之前的『一天之内』被 access 过的档案; -ctime n :n 为数字,意义为在 n 天之前的『一天之内』被 change 过状态的档案; -mtime n :n 为数字,意义为在 n 天之前的『一天之内』被 modification 过的档案; -newer file :file 为一个存在的档案,意思是说,只要档案比 file 还要新, 就会被列出来~ 2. 与使用者或群组名称有关的参数: -uid n :n 为数字,这个数字是使用者的账号 ID,亦即 UID ,这个 UID 是记录在 /etc/passwd 里面与账号名称对应的数字。这方面我们会在第四篇介绍。 -gid n :n 为数字,这个数字是群组名称的 ID,亦即 GID,这个 GID 记录在 /etc/group,相关的介绍我们会第四篇说明~ -user name :name 为使用者账号名称喔!例如 dmtsai -group name:name 为群组名称喔,例如 users ; -nouser :寻找档案的拥有者不存在 /etc/passwd 的人! -nogroup :寻找档案的拥有群组不存在于 /etc/group 的档案! 当您自行安装软件时,很可能该软件的属性当中并没有档案拥有者, 这是可能的!在这个时候,就可以使用 -nouser 与 -nogroup 搜寻。 3. 与档案权限及名称有关的参数: -name filename:搜寻文件名称为 filename 的档案; -size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的档案。这个 SIZE 的规格有: c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB 还要大的档案,就是『 -size +50k 』 -type TYPE :搜寻档案的类型为 TYPE 的,类型主要有:一般正规档案 (f), 装置档案 (b, c), 目录 (d), 连结档 (l), socket (s), 及 FIFO (p) 等属性。 -perm mode :搜寻档案属性『刚好等于』 mode 的档案,这个 mode 为类似 chmod 的属性值,举例来说, -rwsr-xr-x 的属性为 4755 ! -perm -mode :搜寻档案属性『必须要全部囊括 mode 的属性』的档案,举例来说, 我们要搜寻 -rwxr--r-- ,亦即 0744 的档案,使用 -perm -0744, 当一个档案的属性为 -rwsr-xr-x ,亦即 4755 时,也会被列出来, 因为 -rwsr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。 -perm +mode :搜寻档案属性『包含任一 mode 的属性』的档案,举例来说,我们搜寻 -rwxr-xr-x ,亦即 -perm +755 时,但一个档案属性为 -rw------- 也会被列出来,因为他有 -rw.... 的属性存在! 4. 额外可进行的动作: -exec command :command 为其它指令,-exec 后面可再接额外的指令来处理搜寻到 的结果。 -print :将结果打印到屏幕上,这个动作是预设动作! 范例: 范例一:将过去系统上面 24 小时内有更动过内容 (mtime) 的档案列出 [root@linux ~]# find / -mtime 0 # 那个 0 是重点!0 代表目前的时间,所以,从现在开始到 24 小时前, # 有变动过内容的档案都会被列出来!那如果是三天前的 24 小时内? # find / -mtime 3 ,意思是说今天之前的 3*24 ~ 4*24 小时之间 # 有变动过的档案都被列出的意思!同时 -atime 与 -ctime 的用法相同。 范例二:寻找 /etc 底下的档案,如果档案日期比 /etc/passwd 新就列出 [root@linux ~]# find /etc -newer /etc/passwd # -newer 用在分辨两个档案之间的新旧关系是很有用的! 范例三:搜寻 /home 底下属于 dmtsai 的档案 [root@linux ~]# find /home -user dmtsai # 这个东西也很有用的~当我们要找出任何一个使用者在系统当中的所有档案时, # 就可以利用这个指令将属于某个使用者的所有档案都找出来喔! 范例四:搜寻系统中不属于任何人的档案 [root@linux ~]# find / -nouser # 透过这个指令,可以轻易的就找出那些不太正常的档案。 # 如果有找到不属于系统任何人的档案时,不要太紧张, # 那有时候是正常的~尤其是您曾经以原始码自行编译软件时。 范例五:找出档名为 passwd 这个档案 [root@linux ~]# find / -name passwd # 利用这个 -name 可以搜寻档名啊! 范例六:搜寻档案属性为 f (一般档案) 的档案 [root@linux ~]# find /home -type f # 这个 -type 的属性也很有帮助喔!尤其是要找出那些怪异的档案, # 例如 socket 与 FIFO 档案,可以用 find /var -type p 或 -type s 来找! 范例七:搜寻档案当中含有 SGID/SUID/SBIT 的属性 [root@linux ~]# find / -perm +7000 # 所谓的 7000 就是 ---s--s--t ,那么只要含有 s 或 t 的就列出, # 所以当然要使用 +7000 ,使用 -7000 表示要含有 ---s--s--t 的所有三个权限, # 因此,就是 +7000 ~瞭乎? 范例八:将上个范例找到的档案使用 ls -l 列出来~ [root@linux ~]# find / -perm +7000 -exec ls -l {} \; # 注意到,那个 -exec 后面的 ls -l 就是额外的指令, # 而那个 {} 代表的是『由 find 找到的内容』的意思~所以, -exec ls -l {} # 就是将前面找到的那些档案以 ls -l 列出长的数据!至于 \; 则是表示 # -exec 的指令到此为止的意思~意思是说,整个指令其实只有在 # -exec (里面就是指令下达) \; # 也就是说,-exec 最后一定要以 \; 结束才行!这样了解了吗?! 范例九:找出系统中,大于 1MB 的档案 [root@linux ~]# find / -size +1000k # 虽然在 man page 提到可以使用 M 与 G 分别代表 MB 与 GB, # 不过,俺却试不出来这个功能~所以,目前应该是仅支持到 c 与 k 吧! 如果你要寻找一个档案的话,那么使用 find 会是一个不错的主意! 他可以根据不同的参数来给予档案的 搜寻功能!例如你要寻找一个档名为 httpd.conf 的档案,你知道他应该是在 /etc 底下,那么就可以使 用『 find /etc -name httpd.conf 』噜! 那如果你记得有一个档案档名包含了 httpd ,但是不知道全 名怎办?!呵呵,就用万用字符 * 吧,如上以:『 find /etc -name '*httpd*' 』就可将档名含有 httpd 的档案都列出来啰!不过,由于 find 在寻找数据的时后相当的耗硬盘!所以没事情不要使用 find 啦! 有更棒的指令可以取代呦!那就是 whereis 与 locate 啰!! 但,不管怎么说, find 在找寻特殊的档案属性,以及特殊的档案权限 (SUID/SGID等等) 时, 是相当有 用的工具程序之一!重要重要! 本章习题练习: ( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 ) • 什么是绝对路径与相对路径 绝对路径的写法为由 / 开始写,至于相对路径则不由 / 开始写!此外,相对路径为相对于目前 工作目录的路径! • 如何更改一个目录的名称?例如由 /home/test 变为 /home/test2 mv /home/test /home/test2 • PATH 这个环境变量的意义? 这个是用来指定执行档执行的时候,档案搜寻的目录路径。 • umask 有什么用处与优点? umask 可以拿掉一些属性,因此,适当的定义 umask 有助于系统的安全, 因为他可以用来建立 预设的目录或档案的权限。 • 当一个使用者的 umask 分别为 033 与 044 他所建立的档案与目录的权限为何? 在 umask 为 033 时,则预设是拿掉 group 与 other 的 w(2)x(1) 权限,因此权限就成为『档 案 -rw-r--r-- , 目录 drwxr--r-- 』而当 umask 044 时,则拿掉 r 的属性,因此就成为『档 案 -rw--w--w-,目录 drwx-wx-wx』 • 什么是 SUID ? 当一个指令具有 SUID 的功能时,则当其它人使用这个指令时,该程序将具有指令拥有者的权限。 • 当我要查询 /usr/bin/passwd 这个档案的一些属性时,可以使用什么指令来查询? ls -al, file, lsattr • 尝试用 find 找出目前 linux 系统中,所有具有 SUID 的档案有哪些? find / -type f -perm -4000 -print 档案的压缩与打包 最近更新日期:2005/08/29 在 Linux 底下有相当多的压缩指令可以运作喔!这些压缩指令可以让我们更方便从网络上面下载大型的档 案呢! 此外,我们知道在 Linux 底下的附档名是没有什么很特殊的意义的,不过,针对这些压缩指令所 做出来的压缩档, 为了方便记忆,还是会有一些特殊的命名方式啦!就让我们来看看吧! 1. 压缩档案的用途与技术: 2. Linux 系统常见的压缩指令: 2.1 compress 2.2 gzip, zcat 2.3 bzip2, bzcat 2.4 tar 2.5 dd 2.6 cpio 3. 本章习题练习 4. 针对本文的建议:http://phorum.vbird.org/viewtopic.php?t=23882 压缩档案的用途与技术: 您是否有过文件档案太大,导致无法以一片软盘将他复制完成的困扰? 又,您是否有过,发现一个软件里 面有好多档案,这些档案要将他复制与携带都很不方便的问题? 还有,您是否有过要备份某些重要数据, 偏偏这些数据量太大了,耗掉了你很多的硬盘与磁盘空间呢? 这个时候,那个好用的『档案压缩』技术可 就派的上用场了! 因为这些比较大型的档案透过所谓的档案压缩技术之后,可以将他的磁盘使用量降低, 可以达到减低档案容量的效果,此外,有的压缩程序还可以进行容量限制, 使一个大型档案可以分割成为 数个小型档案,以方便软盘片携带呢! 那么什么是『档案压缩』呢?我们来稍微谈一谈他的原理好了。目前我们使用的计算机系统中都是使用所 谓的 bytes 单位来计量的!不过,事实上,计算机最小的计量单位应该是 bits 才对啊,此外,我们也知 道 1 byte = 8 bits 。但是如果今天我们只是记忆一个数字,亦即是 1 这个数字呢?他会如何记录?假 设一个 byte 可以看成底下的模样: □□□□□□□□ Tips: 由于 1 byte = 8 bits ,所以每个 byte 当中会有 8 个空格,而 每个空格可以是 0, 1 ,这里仅是做为一个约略的介绍,读者不必 刻意记忆。 而由于我们记录数字是 1 ,考虑计算机所谓的二进制喔,如此一来, 1 会在最右边占据 1 个 bit ,而 其它的 7 个 bits 将会自动的被填上 0 啰!你看看,其实在这样的例子中,那 7 个 bits 应该是『空的』 才对!不过,为了要满足目前我们的操作系统数据的存取,所以就会将该数据转为 byte 的型态来记录了! 而一些聪明的计算机工程师就利用一些复杂的计算方式, 将这些没有使用到的空间『丢』出来,以让档案 占用的空间变小!这就是压缩的技术啦! 简单的说,你可以将他想成,其实档案里面有相当多的『空间』存在,并不是完全填满的, 而『压缩』的 技术就是将这些『空间』填满,以让整个档案占用的容量下降! 不过,这些『压缩过的档案』并无法直接 被我们的操作系统所使用的,因此, 若要使用这些被压缩过的档案数据,则必须将他『还原』回来未压缩 前的模样, 那就是所谓的『解压缩』啰!而至于压缩前与压缩后的档案所占用的磁盘空间大小, 就可以 被称为是『压缩比』啰!更多的技术文件或许你可以参考一下: • RFC 1952 文件:http://www.faqs.org/rfcs/rfc1952.html • 鸟哥站上的备份: http://linux.vbird.org/linux_basic/0240tarcompress/0240tarcompress_gzip.php 这个『压缩』与『解压缩』的动作有什么好处呢?最大的好处就是压缩过的档案容量变小了, 所以你的硬 盘容量无形之中就可以容纳更多的数据,此外,在一些网络数据的传输中,也会由于数据量的降低, 好让 网络频宽可以用来作更多的工作!而不是老是卡在一些大型的档案上面呢!目前很多的 WWW 网站也是利用 档案压缩的技术来进行数据的传送,好让网站的可利用率上升喔! Tips: 这种技术蛮有趣的!他让您网站上面『看的到的数据』在经过网络 传输时,使用的是『压缩过的数据』, 等到这些压缩过的数据到 达你的计算机主机时,再进行解压缩,由于目前的计算机运算速度 相当的快速, 因此其实在网页浏览的时候,时间都是花在『数据 的传输』上面,而不是 CPU 的运算啦!,如此一来,由于压缩过 的数据量降低了,自然传送的速度就会增快不少! 若您是一位软件工程师,那么相信您也会喜欢将你自己的软件压缩之后提供大家下载来使用, 毕竟没有人 喜欢自己的网站天天都是频宽满载的吧?!举个例子来说, Linux 2.4.19 完整的核心大小约有 200 MB 左 右,而由于核心主要多是 ASCII code 的纯文字型态档案,这种档案的『多余空间』最多了。而一个提供 下载的压缩过的 2.4.19 核心大约仅有 30MB 左右,差了几倍呢?您可以自己算一算喔! Linux 系统常见的压缩指令: 如果您常常在网络上面捉 Linux 的数据下来玩的话,大概会晓得的是,这些供人下载的档案通常都是『压 缩』过的! 为了什么?上面已经稍微提过啦!呵呵!压缩过的档案具有节省频宽、节省磁盘空间等等的优 点,并且还方便携带呢! ^_^ !而,您应该也会知道,这些被压缩过的档案,通常其附档名都是『 *.tar, *.tar.gz, *.tgz, *.gz, *.Z, *.bz2 』 等等的,为什么要订定这些压缩档案附档名为这样的模样呢? 这是因为在 Linux 上面压缩的指令相当的多,并且,这些压缩指令可能无法针对每种压缩档案都可以解的 开, 毕竟目前的压缩技术五花八门,每种压缩计算的方法都不是完全相同的,所以啰,当你捉到某个压缩 档时, 自然就需要知道压缩他的是那个指令啦,好用来对照着解压缩啊! ^_^!也就是说,虽然 Linux 档 案的属性基本上是与文件名没有绝对关系的,能不能执行与他的档案属性有关而已, 与档名的关系很小! 但是,为了帮助我们小小的人类脑袋瓜子,所以适当的文件名称附档名还是必要的! 因此,目前就有一些 常常见到的压缩档案的附档名啦!我们仅列出常见的几样在底下,给大家权做参考之用: • *.Z compress 程序压缩的档案; • *.bz2 bzip2 程序压缩的档案; • *.gz gzip 程序压缩的档案; • *.tar tar 程序打包的数据,并没有压缩过; • *.tar.gz tar 程序打包的档案,其中并且经过 gzip 的压缩 目前常见的压缩程序主要就是如同上面提到的附档名对应的那些指令啦!最早期的要算是 compress 这个 家伙了,不过这个 compress 指令目前已经不再是预设的压缩软件了~ 而后,后来的 GNU 计划开发出新 一代的压缩指令 gzip ( GNU zip ) 用来取代 compress 这个老牌的压缩指令,再来还有 bzip2 这个压缩 比更好的压缩指令呢!不过,这些指令通常仅能针对一个档案来压缩与解压缩,如此一来, 每次压缩与解 压缩都要一大堆档案,岂不烦人?此时,那个所谓的『打包软件』就显的很重要啦! 在 Unix-Like 当中,有个软件很好玩,他就是 tar 这支程序!这个 tar 可以将很多档案『打包』成为一 个档案! 甚至是目录也可以这么玩。不过,单纯的 tar 功能仅是『打包』而已,亦即是将很多档案集结 成为一个档案,事实上,他并没有提供压缩的功能,后来, GNU 计划中,将整个 tar 与压缩的功能结合 在一起,如此一来提供使用者更方便并且更强大的压缩与打包功能! 底下我们就来谈一谈这些在 Linux 底 下基本的压缩指令吧! compress [root@linux ~]# compress [-dcr] 档案或目录 参数: -d :用来解压缩的参数 -r :可以连同目录下的档案也同时给予压缩呢! -c :将压缩数据输出成为 standard output (输出到屏幕) 范例: 范例一:将 /etc/man.config 复制到 /tmp ,并加以压缩 [root@linux ~]# cd /tmp [root@linux tmp]# cp /etc/man.config . [root@linux tmp]# compress man.config [root@linux tmp]# ls -l -rw-r--r-- 1 root root 2605 Jul 27 11:43 man.config.Z 范例二:将刚刚的压缩档解开 [root@linux tmp]# compress -d man.config.Z 范例三:将 man.config 压缩成另外一个档案来备份 [root@linux tmp]# compress -c man.config > man.config.back.Z [root@linux tmp]# ll man.config* -rw-r--r-- 1 root root 4506 Jul 27 11:43 man.config -rw-r--r-- 1 root root 2605 Jul 27 11:46 man.config.back.Z # 这个 -c 的参数比较有趣!他会将压缩过程的数据输出到屏幕上,而不是写入成为 # file.Z 档案。所以,我们可以透过数据流重导向的方法将数据输出成为另一个档名。 # 关于数据流重导向,我们会在 bash shell 当中详细谈论的啦! 这是用来压缩与解压缩附档名为 *.Z 的指令!所以看到 *.Z 的档案时,就应该要知道他是经由 compress 这个程序压缩的呦!这是最简单的压缩指令啰!不过,使用的时候需要特别留意的是, 当你以 compress 压 缩之后,如果没有下达其它的参数,那么原本的档案就会被后来的 *.Z 所取代!以上面的案例来说明:原 本压缩的档案为 man.config ,那么当压缩完成之后,将只会剩下 man.config.Z 这个经过压缩的档案啰! 那么解压缩呢?呵呵,则是将 man.config.Z 解压缩成 man.config ! 使用上很简单啦!解压缩除了可以 使用 compress –d 这个参数之外,也可以直接使用 uncompress !意思相同啦! 另外,如果不想让原本的档案被更名成为 *.Z ,而想制作出另外的一个档名时,就可以利用数据流重导向, 亦即是那个大于 (>) 的符号,将原本应该在屏幕上面出现的数据给他储存到其它档案去。 当然,这要加 上 -c 的参数才行~关于数据流重导向,我们会在第三篇提到的!此外, compress 已经很少人在使用了, 因为这支程序无法解开 *.gz 的档案,而 gzip 则可以解决 *.Z 的档案, 所以,如果您的 distribution 上面没有 compress 的话,没有关系的喔! Tips: compress 使用的频率越来越低了,如果您还是想要练习这个指令 的话, 在 FC4 里头,他是在 ucompress 这个套件名称的套件内。 您可以参考 RPM 的方式来安装! gzip, zcat [root@linux ~]# gzip [-cdt#] 檔名 [root@linux ~]# zcat 檔名.gz 参数: -c :将压缩的数据输出到屏幕上,可透过数据流重导向来处理; -d :解压缩的参数; -t :可以用来检验一个压缩档的一致性~看看档案有无错误; -# :压缩等级,-1 最快,但是压缩比最差、-9 最慢,但是压缩比最好!预设是 -6 ~ 范例: 范例一:将 /etc/man.config 复制到 /tmp ,并且以 gzip 压缩 [root@linux ~]# cd /tmp [root@linux tmp]# cp /etc/man.config . [root@linux tmp]# gzip man.config # 此时 man.config 会变成 man.config.gz ! 范例二:将范例一的档案内容读出来! [root@linux tmp]# zcat man.config.gz # 此时屏幕上会显示 man.config.gz 解压缩之后的档案内容!! 范例三:将范例一的档案解压缩 [root@linux tmp]# gzip -d man.config.gz 范例四:将范例三解开的 man.config 用最佳的压缩比压缩,并保留原本的档案 [root@linux tmp]# gzip -9 -c man.config > man.config.gz gzip 是用来压缩与解压缩附档名为 *.gz 的指令!所以看到 *.gz 的档案时,就应该要知道他是经由 gzip 这个程序压缩的呦!另外, gzip 也提供 压缩比的服务! -1 是最差的压缩比,但是压缩速度最快,而 -9 虽然可以达到较佳的压缩比 (经过压缩之后,档案比较小一些!) ,但是却会损失一些速度!预设是 -6 这 个数值! gzip 也是相当常使用的一个压缩指令呢! 至于 zcat 则是用来读取压缩文件数据内容的指令!假如我们刚刚压缩的档案是一个文字文件, 那么你还 记得如何读取文字文件吗?!没错!就是使用 cat ,那么读取压缩档呢?呵呵!就是使用 zcat 啰!由于 gzip 这个压缩指令主要想要用来取代 compress 的,所以 compress 的压缩档案也可以使用 gzip 来解开 喔!同时, zcat 这个指令可以同时读取 compress 与 gzip 的压缩档呦! bzip2, bzcat [root@linux ~]# bzip2 [-cdz] 檔名 [root@linux ~]# bzcat 檔名.bz2 参数: -c :将压缩的过程产生的数据输出到屏幕上! -d :解压缩的参数 -z :压缩的参数 -# :与 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快! 范例: 范例一:将刚刚的 /tmp/man.config 以 bzip2 压缩 [root@linux tmp]# bzip2 -z man.config # 此时 man.config 会变成 man.config.bz2 ! 范例二:将范例一的档案内容读出来! [root@linux tmp]# bzcat man.config.bz2 # 此时屏幕上会显示 man.config.bz2 解压缩之后的档案内容!! 范例三:将范例一的档案解压缩 [root@linux tmp]# bzip2 -d man.config.bz2 范例四:将范例三解开的 man.config 用最佳的压缩比压缩,并保留原本的档案 [root@linux tmp]# bzip2 -9 -c man.config > man.config.bz2 使用 compress 附档名自动建立为 .Z ,使用 gzip 附档名自动建立为 .gz 。这里的 bzip2 则是自动的 将附档名建置为 .bz2 啰!所以当我们使用具有压缩功能的 bzip2 -z 时,那么刚刚的 man.config 就会 自动的变成了 man.config.bz2 这个档名啰! 好了,那么如果我想要读取这个档案的内容呢? 是否一定要解开?当然不需要啰!可以使用简便的 bzcat 这个指令来读取内容即可!例如上面的例子中, 我们可以使用 bzcat man.config.bz2 来读取数据而不需 要解开!此外,当您要解开一个压缩档时, 这个档案的名称为 .bz, .bz2, .tbz, .tbz2 等等,那么就可 以尝试使用 bzip2 来解看看啦!当然啰,也可以使用 bunzip2 这个指令来取代 bzip2 -d 啰。 tar [root@linux ~]# tar [-cxtzjvfpPN] 档案与目录 .... 参数: -c :建立一个压缩档案的参数指令(create 的意思); -x :解开一个压缩档案的参数指令! -t :查看 tarfile 里面的档案! 特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在! 因为不可能同时压缩与解压缩。 -z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩? -j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩? -v :压缩的过程中显示档案!这个常用,但不建议用在背景执行过程! -f :使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数! 例如使用『 tar -zcvfP tfile sfile』就是错误的写法,要写成 『 tar -zcvPf tfile sfile』才对喔! -p :使用原档案的原来属性(属性不会依据使用者而变) -P :可以使用绝对路径来压缩! -N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的档案中! --exclude FILE:在压缩的过程中,不要将 FILE 打包! 范例: 范例一:将整个 /etc 目录下的档案全部打包成为 /tmp/etc.tar [root@linux ~]# tar -cvf /tmp/etc.tar /etc <==仅打包,不压缩! [root@linux ~]# tar -zcvf /tmp/etc.tar.gz /etc <==打包后,以 gzip 压缩 [root@linux ~]# tar -jcvf /tmp/etc.tar.bz2 /etc <==打包后,以 bzip2 压缩 # 特别注意,在参数 f 之后的档案档名是自己取的,我们习惯上都用 .tar 来作为辨识。 # 如果加 z 参数,则以 .tar.gz 或 .tgz 来代表 gzip 压缩过的 tar file ~ # 如果加 j 参数,则以 .tar.bz2 来作为附档名啊~ # 上述指令在执行的时候,会显示一个警告讯息: # 『tar: Removing leading `/' from member names』那是关于绝对路径的特殊设定。 范例二:查阅上述 /tmp/etc.tar.gz 档案内有哪些档案? [root@linux ~]# tar -ztvf /tmp/etc.tar.gz # 由于我们使用 gzip 压缩,所以要查阅该 tar file 内的档案时, # 就得要加上 z 这个参数了!这很重要的! 范例三:将 /tmp/etc.tar.gz 档案解压缩在 /usr/local/src 底下 [root@linux ~]# cd /usr/local/src [root@linux src]# tar -zxvf /tmp/etc.tar.gz # 在预设的情况下,我们可以将压缩档在任何地方解开的!以这个范例来说, # 我先将工作目录变换到 /usr/local/src 底下,并且解开 /tmp/etc.tar.gz , # 则解开的目录会在 /usr/local/src/etc 呢!另外,如果您进入 /usr/local/src/etc # 则会发现,该目录下的档案属性与 /etc/ 可能会有所不同喔! 范例四:在 /tmp 底下,我只想要将 /tmp/etc.tar.gz 内的 etc/passwd 解开而已 [root@linux ~]# cd /tmp [root@linux tmp]# tar -zxvf /tmp/etc.tar.gz etc/passwd # 我可以透过 tar -ztvf 来查阅 tarfile 内的文件名称,如果单只要一个档案, # 就可以透过这个方式来下达!注意到! etc.tar.gz 内的根目录 / 是被拿掉了! 范例五:将 /etc/ 内的所有档案备份下来,并且保存其权限! [root@linux ~]# tar -zcvpf /tmp/etc.tar.gz /etc # 这个 -p 的属性是很重要的,尤其是当您要保留原本档案的属性时! 范例六:在 /home 当中,比 2005/06/01 新的档案才备份 [root@linux ~]# tar -N '2005/06/01' -zcvf home.tar.gz /home 范例七:我要备份 /home, /etc ,但不要 /home/dmtsai [root@linux ~]# tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc 范例八:将 /etc/ 打包后直接解开在 /tmp 底下,而不产生档案! [root@linux ~]# cd /tmp [root@linux tmp]# tar -cvf - /etc | tar -xvf # 这个动作有点像是 cp -r /etc /tmp 啦~依旧是有其有用途的! # 要注意的地方在于输出档变成 - 而输入档也变成 - ,又有一个 | 存在~ # 这分别代表 standard output, standard input 与管线命令啦! # 这部分我们会在 Bash shell 时,再次提到这个指令跟大家再解释啰! 这是一个多用途的压缩指令!刚刚我们提到的 compress 与 gzip 是可以适用在一个档案的压缩上面, 但 是如果是要将一个目录压缩成一个档案呢?!这时该如何是好?!呵呵! tar 就派上用场了! tar 可以 将整个目录或者是指定的档案都整合成一个档案!例如上面的范例一,他可以将 /etc 底下的档案全部整 合成一个档案!同时, tar 可以配合 gzip (这个 gzip 的功能已经已经附加上 tar 里面去了) ,同时整 合并压缩!呵呵!很方便吧! 『 tar 用来作备份是很重要的指令! 』而由于 tar 整合过后的档案我们通常会取名为 *.tar ,而如果 还含有 gzip 的压缩属性,那么就取名为 *.tar.gz 啰!取这个文件名只是为了方便我们记忆这个档案是 什么属性罢了!并没有实际的意义在! • 绝对路径与权限的问题 另外,需要注意的是,在使用的参数方面,有还有几个有用的参数需要来了解一番,亦即是 -p 与 -P 这 两个!在我们的范例一当中,有提到一个警告讯息,那就是『 tar: Removing leading `/' from member names』 意思是说, tar 将 /etc 目录的那个 / 拿掉了!这是因为担心未来你在解开压缩的时候,会产生一些困 扰, 因为在 tar 里面的档案如果是具有『绝对路径』的话,那么你解开的档案将会『一定』在该路径下 也就是 /etc,而不是相对路径 (这里请用心的想一想!) 。 这样子的最大困扰是,万一有人拿走了你的这个档案,并且将该档案在他的系统上面解开!万一他的系统 上面正巧也有 /etc 这个目录 (那当然是一定有的啊!),哈哈!他的档案就会『正巧』被覆盖了! 所以 啰,在预设的情况中,如果是以『绝对路径』来建立打包档案,那么 tar 将会自动的将 / 拿掉!这是为 了刚刚说明的『安全』为前提所做的默认值。好了!但是你就是要以绝对路径来建立打包的档案!那么就 加入 -P 这个参数吧 (请注意!是大写字符) !这样就可以啦! 那么 -p 是什么 (小写字符) ?呵呵!那个 -p 是 permission 的意思,也就是『权限』啦!使用 -p 之 后,被打包的档案将不会依据使用者的身份来改变权限喔! • 关于档案的更新日期: 这里还有一个值得注意的参数呦!那就是在备份的情况中很常使用的 -N 的这个参数! 你可以参考一下上 面的例子就可以知道啦!在这个例子当中,相当重要的就是那个日期啦! 在备份的情况当中,我们都希望 只要备份较新的档案就好了,为什么呢?因为旧的档案我们已经有备份啰! 干嘛还要再备份一次,浪费时 间也浪费系统资源!这个时候此一参数就显的相当的重要了啊! • 关于 standard input/standard output: 在上面的例子中,最后一个例子很有趣『tar cvf - /etc | tar -xvf - 』!他是直接以管线命令『 pipe 』 来进行压缩、解压缩的过程!在上面的例子中,我们想要『将 /etc 底下的资料直接 copy 到目前所在的 路径,也就是 /tmp 底下来』,但是又觉得使用 cp -r 有点麻烦,那么就直接以这个打包的方式来打包, 其中,指令里面的 - 就是表示那个被打包的档案啦!由于我们不想要让中间档案存在,所以就以这一个方 式来进行复制的行为啦! • 什么是 tarfile 与 tarball? tar 的功能相当的多,而由于他是经由『打包』之后再处理的一个过程,所以常常我们会听到 tarball 的 档案,那就是经由 tar 打包再压缩的档案啦!而如果仅是打包而没有压缩的话,我们就称为 tarfile 啰~ 此外, tar 也可以用在备份的储存媒体上面,最常见的就是磁带机了!假设我的磁带机代号为 /dev/st0 , 那么我要将我的 /home 底下的数据都给他备份上去时,就是使用 tar /dev/st0 /home 就可以啦!很不错 吧! 在 Linux 当中, gzip 已经被整合在 tar 里面了!但是 Sun 或者其它较旧的 Unix 版本中, 当中的 tar 并没有整合 gzip ,所以如果你需要解压缩的话,就需要这么做: gzip -d testing.tar.gz tar -xvf testing.tar 第一个步骤会将档案解压缩,第二个步骤才是将数据解出来!与其它压缩程序不太一样的是, bzip2, gzip 与 compress 在没有加入特殊参数的时候,原先的档案会被取代掉,但是使用 tar 则原来的与后来的档案 都会存在呦! dd 我们在上一章当中,在制作出 swap file 时,使用过 dd 这个指令对吧?! 不过,这个指令可不只是制 作一个档案而已喔~这个 dd 指令最大的功效,鸟哥认为,应该是在于『备份』啊! 因为 dd 可以读取装 置的内容,然后将整个装置备份成一个档案呢!真的是相当的好用啊~ dd 的用途有很多啦~但是我们仅 讲一些比较重要的参数,如下: [root@linux ~]# dd if="input_file" of="outptu_file" bs="block_size" \ count="number" 参数: if :就是 input file 啰~也可以是装置喔! of :就是 output file 喔~也可以是装置; bs :规划的一个 block 的大小,如果没有设定时,预设是 512 bytes count:多少个 bs 的意思。 范例: 范例一:将 /etc/passwd 备份到 /tmp/passwd.back 当中 [root@linux ~]# dd if=/etc/passwd of=/tmp/passwd.back 3+1 records in 3+1 records out [root@linux ~]# ll /etc/passwd /tmp/passwd.back -rw-r--r-- 1 root root 1746 Aug 25 14:16 /etc/passwd -rw-r--r-- 1 root root 1746 Aug 29 16:57 /tmp/passwd.back # 仔细的看一下,我的 /etc/passwd 档案大小为 1746 bytes,因为我没有设定 bs , # 所以预设是 512 bytes 为一个单位,因此,上面那个 3+1 表示有 3 个完整的 # 512 bytes,以及未满 512 bytes 的另一个 block 的意思啦! # 事实上,感觉好像是 cp 这个指令啦~ 范例二:备份 /dev/hda 的 MBR [root@linux ~]# dd if=/dev/hda of=/tmp/mbr.back bs=512 count=1 1+0 records in 1+0 records out # 这就得好好了解一下啰~我们知道整颗硬盘的 MBR 为 512 bytes, # 就是放在硬盘的第一个 sector 啦,因此,我可以利用这个方式来将 # MBR 内的所有数据都纪录下来,真的很厉害吧! ^_^ 范例三:将整个 /dev/hda1 partition 备份下来。 [root@linux ~]# dd if=/dev/hda1 of=/some/path/filenaem # 这个指令很厉害啊!将整个 partition 的内容全部备份下来~ # 后面接的 of 必须要不是在 /dev/hda1 的目录内啊~否则,怎么读也读不完~ # 这个动作是很有效用的,如果改天你必须要完整的将整个 partition 的内容填回去, # 则可以利用 dd if=/some/file of=/dev/hda1 来将数据写入到硬盘当中。 # 如果想要整个硬盘备份的话,就类似 Norton 的 ghost 软件一般, # 由 disk 到 disk ,嘿嘿~利用 dd 就可以啦~厉害厉害! 你可以说, tar 可以用来备份关键数据,而 dd 则可以用来备份整颗 partition 或 整颗 disk ,很不错 啊~不过,如果要将数据填回到 filesystem 当中, 可能需要考虑到原本的 filesystem 才能成功啊! cpio 这个指令可有趣了!他是透过数据流重导向的方法来将档案进行输出/输入的一个方式~ 因为我们尚未提 到数据流重导向,所以,您可以先略过这的指令的练习。等到后续的章节读完后, 再来这个章节瞧一瞧! [root@linux ~]# cpio -covB > [file|device] <==备份 [root@linux ~]# cpio -icduv < [file|device] <==还原 参数: -o :将数据 copy 输出到档案或装置上 -i :将数据自档案或装置 copy 出来系统当中 -t :查看 cpio 建立的档案或装置的内容 -c :一种较新的 portable format 方式储存 -v :让储存的过程中文件名称可以在屏幕上显示 -B :让预设的 Blocks 可以增加至 5120 bytes ,预设是 512 bytes ! 这样的好处是可以让大档案的储存速度加快(请参考 i-nodes 的观念) -d :自动建立目录!由于 cpio 的内容可能不是在同一个目录内, 如此的话在反备份的过程会有问题! 这个时候加上 -d 的话, 就可以自动的将需要的目录建立起来了! -u :自动的将较新的档案覆盖较旧的档案! 范例: 范例一:将所有系统上的数据通通写入磁带机内! [root@linux ~]# find / -print | cpio -covB > /dev/st0 # 一般来说,使用 SCSI 接口的磁带机,代号是 /dev/st0 喔! 范例二:检查磁带机上面有什么档案? [root@linux ~]# cpio -icdvt < /dev/st0 [root@linux ~]# cpio -icdvt < /dev/st0 > /tmp/content # 第一个动作当中,会将磁带机内的文件名列出到屏幕上面,而我们可以透过第二个动作, # 将所有的文件名通通纪录到 /tmp/content 档案去! 范例三:将磁带上的数据还原回来~ [root@linux ~]# cpio -icduv < /dev/st0 # 一般来说,使用 SCSI 接口的磁带机,代号是 /dev/st0 喔! 范例四:将 /etc 底下的所有『档案』都备份到 /root/etc.cpio 中! [root@linux ~]# find /etc -type f | cpio -o > /root/etc.cpio # 这样就能够备份啰~您也可以将数据以 cpio -i < /root/etc.cpio # 来将资料捉出来!!!! 这个 cpio 还蛮神奇的呢!他最适用于备份的时候使用的一个指令了!为什么呢?因为他并不像 cp 一样, 可以直接的将档案给他 copy 过去,例如 cp * /tmp 就可以将所在目录的所有档案 copy 到 /tmp 底下, 在 cpio 这个指令的用法中,由于 cpio 无法直接读取档案, 而是需要『每一个档案或目录的路径连同文 件名一起』才可以被记录下来!因此, cpio 最常跟 find 这个指令一起使用了! 这个 cpio 好像不怎么好用呦!但是,嘿嘿!他可是备份的时候的一项利器呢!因为他可以备份任何的档 案, 包括 /dev 底下的任何装置档案!呵呵!所以他可是相当重要的呢!!您说是吧! 而由于 cpio 必 需要配合其它的程序,例如 find 来建立档名,所以, cpio 与管线命令及数据流重导向的相关性就相当 的重要了! vi 文字处理器 最近更新日期:2005/08/01 每个系统管理员都应该至少要学会一种文字接口的文书处理器,以方便系统日常的管理行为。 在 Linux 上 头的文字处理软件非常的多,不过,鸟哥还是建议使用 vi 这个正规的文书处理器。 这是因为 vi 几乎在 任何一个 Unix Like 的机器都存在,学会他,轻松很多啊! 此外,后来 GNU 计划有推出 vim 这个 vi 的 进阶版本,可以用的额外功能更多了! vi 是未来我们进行 shell script 程序的编写与服务器设定的重要工 具喔! 而且是非常非常重要的工具,一定要学会才行啊! ^_^ 1. vi 与 vim 2. vi 的使用: 2.1 简易执行范例 2.2 命令列内容说明 2.3 一个案例的练习 2.4 关于档案的回复与暂存盘 3. vim 的额外功能: 3.1 区块选择(Visual Block) 3.2 多档案编辑 3.3 多窗口功能 3.4 vim 环境设定 4. 利用 vi 编辑前面章节的练习 5. DOS 与 Linux 的断行字符 6. 本章习题练习 7. 参考数据 8. 针对本文的建议:http://phorum.vbird.org/viewtopic.php?t=23883 vi 与 vim 由前面一路走来,我们一直建议使用文字模式来处理 Linux 的系统设定问题,因为不但可以让您比较容易 了解到 Linux 的运作状况,也比较容易了解整个设定的基本精神,更能『保证』您的修改可以顺利的被运 作。 所以,在 Linux 的系统中使用文字编辑器来编辑您的 Linux 参数设定档,嗯!可是一件很重要的事 情呦!所以说嘛!系统管理员至少应该要熟悉一种文书处理器的! Tips: 这里要再次的强调,不同的 Linux distribution 各有其不同的附 加软件,例如 Red Hat 与 Fedora 的 userconf, Linuxconf, ntsysv 与 setup 等等,而 SuSE 则有 YOU 管理工具等等, 因此, 如果您只会使用此种类型的软件来控制您的 Linux 系统时,当接 管不同的 Linux distributions 时,呵呵!那可就苦恼了! 由 Linux是什么 介绍中,我们知道 Linux 与 Unix 系统中的参数文件几乎都是 ASCII 码的『纯文字』文 件!因此,利用简单的文字编辑软件就可以马上修改 Linux 的参数档啰!然而,与 Windows 不同的是, 如果您用惯了 Microsoft Word 或 Corel Wordperfect 的话,那么除了 X window 里面的编辑程序(如 xemacs )用起来尚可应付外,于 Linux 的文字模式下,会觉得档案编辑程序都没有 Windows 程序那么方 便。 Tips: 还记得什么是纯文字文件吗?忘记的话,回到 Linux 的档案属性 与目录配置 里头去瞧一瞧先~该档案格式以 ASCII 格式码为主。 说穿了,就是您『不论使用什么编辑器』来开启那个档案时,都可 以将内容给您看到,而不是呈现乱码的档案, 那就是纯文字文件 了!当您以 Windows 的 word 存一个档案时,在 DOS 的情况下使 用 type 这个指令来查阅数据,嗯!完全不知到内容是什么?因为 会出现很多的乱码,那并非是纯文字文件,而如果以 word 在存盘 时,选择『纯文字类型』,嗯!那就可以使用 type 看到该档案的 内容了! 由于纯文字文件在任何操作系统底下都可以被取用,是 相当方便的一种设定格式啊! 无论如何,要管理好 Linux 系统时,纯文字的手工设定仍是需要的!那么在 Linux 底下有哪些文书编辑 器呢? 可多了~例如 vi, emacs, xemacs, joe, e3, xedit, kedit, pico .... 多的很~ 各家处理器各 有其优缺点,您当然可以选择任何一个您觉得适用的文书处理器来使用。不过,鸟哥还是比较建议使用 vi 啦!这是因为 vi 是 Unix Like 的机器上面预设都有安装的软件,也就是说,您一定可以接触到这个软件 就是了。 另外,在较新的 distributions 上,您也可以使用较新较先进的 vim 这个文书处理器! vim 可 以看做是 vi 的进阶软件,他可以具有颜色显示,很方便程序开发人员在进行程序的撰写呢! 简单的来说, vi 是老式的文书处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可 以说是程序开发者的一项很好用的工具,就连 vim 的官方网站 (http://www.vim.org) 自己也说 vim 是 一个『程序开发工具』而不是文字处理软件~^_^。 因为 vim 里面加入了很多额外的功能,例如支持正规 表示法的搜寻架构、多档案编辑、区块复制等等。 这对于我们在 Linux 上面进行一些设定档的修订工作 时,是很棒的一项功能呢! 底下鸟哥会先就简单的 vi 做个介绍,然后再跟大家报告一下 vim 的额外功能与用法呢! vi 的使用 基本上 vi 共分为三种模式,分别是『一般模式』、 『编辑模式』与『指令列命令模式』三种! 这三种 模式的作用是: • 一般模式: 以 vi 处理一个档案的时后,一进入该档案就是一般模式了。在这个模式中, 你可以使用『上下 左右』按键来移动光标,您可以使用『删除字符』或『删除整行』来处理档案内容, 也可以使用 『复制、贴上』来处理您的文件数据。 • 编辑模式: 在一般模式中可以处理删除、复制、贴上等等的动作,但是却无法编辑的! 要等到您按下『i, I, o, O, a, A, r, R』等字母之后才会进入编辑模式。注意了!通常在 Linux 中,按下上述的字母 时,在画面的左下方会出现『 INSERT 或 REPLACE 』的字样,才可以输入任何字来输入到您的档 案中!而如果要回到一般模式时, 则必须要按下『Esc』这个按键即可退出编辑模式。 • 指令列命令模式: 在一般模式当中,输入『 : 或 / 或 ? 』就可以将光标移动到最底下那一行,在这个模式当中, 可以提供您『搜寻资料』的动作,而读取、存盘、大量取代字符、离开 vi 、显示行号 等等的动 作则是在此模式中达成的! 简单的说,我们可以将这三个模式想成底下的图标来表示之: 图一、 vi 三种模式的相互关系 闲话不多说,我们底下以一个简单的例子来进行说明吧! 简易执行范例 我们怎么使用 vi 建立一个档名为 test.txt 的资料呢?也是很简单的啦, 整个步骤可以是这样: 1. 使用 vi 进入一般模式; [root@linux ~]# vi test.txt 直接输入『 vi 档名』即可进入 vi 了!如下图所示,左下角还会显示这个档案目前的状态!如 果是新建档案会显示 [New File],如果是已存在的档案,则会显示目前的文件名、行数与字符数, 例如:『"/etc/man.config" 145L, 4614C』 图二、 利用 vi 开启一个档案 2. 按下 i 进入编辑模式,开始编辑文字; 在一般模式之中,只要按下 I, o, a 等字符,就可以进入编辑模式了!在编辑模式当中,您可以 发现在左下角会出现 –INSERT- 的画面,那就是可以输入任意字符的提示啰!这个时候,键盘上 除了 [Esc] 这个按键之外,其它的按键都可以视作为一般的输入按钮了,所以您可以进行任何的 编辑啰! ( 注:在 vi 里面, [tab] 这个按钮所得到的结果与空格符所得到的结果是不一样的, 特别强调一下! ) 图三、 进入 vi 的编辑模式 3. 按下 [ESC] 按钮回到一般模式; 好了,假设我已经按照上面的样式给他编辑完毕了,那么应该要如何退出呢?是的!没错!就是 给他按下 [Esc] 这个按钮即可!马上你就会发现画面左下角的 – INSERT – 不见了! 4. 在一般模式中按下 :wq 储存后离开 vi ! OK,我们要存档了,存盘并离开的指令很简单,输入『:wq』即可存档离开!(注意了,按下 : 该 光标就会移动到最底下一行去!)这时你在提示字符后面输入『 ls -l 』即可看到我们刚刚建立 的 test.txt 档案啦!整个图示有点像底下这样: 图四、利用 vi 储存档案 如此一来,您的档案 test.txt 就已经建立起来啰!很简单吧!需要注意的是,如果您的档案权限不对, 例如为 -r--r--r-- 时,那么可能会无法写入,那么可以使用『强制写入』的方式吗?可以!使用『:wq!』 多加一个惊叹号即可!不过,需要特别注意呦!那个是在『您的权限可以改变』的情况下才能成立的! 关 于权限的概念,请参考一下 Linux 的档案权限概念 啰! 命令列内容说明 如前所述,所谓的命令列或命令模式,就是在最下面一行没有显示 『--INSERT--』或者『--REPLACE--』 字 样的时候。通常在命令列中的指令有下面几种:(注意,当按下 『:』 时,光标会自动移动到屏幕的最下 面一行!) 一般模式: 移动光标的方法 h 或 向左方向键(←) 光标向左移动一个字符 j 或 向下方向键(↓) 光标向下移动一个字符 k 或 向上方向键(↑) 光标向上移动一个字符 l 或 向右方向键(→) 光标向右移动一个字符 如果想要进行多次移动的话,例如向下移动 30 行,可以使用 "30j" 或 "30↓" 的组合按键, 亦即 加上想要进行的次数(数字)后,按下动作即可! [Ctrl] + [f] 屏幕『向下』移动一页,相当于 [Page Down]按键 (常用) [Ctrl] + [b] 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用) [Ctrl] + [d] 屏幕『向下』移动半页 [Ctrl] + [u] + - n 0 $ H M L G nG gg n 一般模式: 搜寻与取代 /word ?word n N :n1,n2s/word1/word2/g :1,$s/word1/word2/g :1,$s/word1/word2/gc 屏幕『向上』移动半页 光标移动到非空格符的下一列 光标移动到非空格符的上一列 那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标 会向右移动这一行的 n 个字符。例如 20 则光标会向后面 移动 20 个字符距离。 这是数字『 0 』:移动到这一行的最前面字符处 (常用) 移动到这一行的最后面字符处(常用) 光标移动到这个屏幕的最上方那一行 光标移动到这个屏幕的中央那一行 光标移动到这个屏幕的最下方那一行 移动到这个档案的最后一行(常用) n 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个 档案的第 20 行(可配合 :set nu) 移动到这个档案的第一行,相当于 1G 啊! (常用) n 为数字。光标向下移动 n 行(常用) 向光标之下寻找一个字符串名称为 word 的字符串。例如要在档案 内搜寻 vbird 这个字符串,就输入 /vbird 即可! (常用) 向光标之上寻找一个字符串名称为 word 的字符串。 这个 n 是英文按键。代表『重复前一个搜寻的动作』的意思。举 例来说, 如果刚刚我们执行 /vbird 去向下搜寻 vbird 这个字符 串,则按下 n 后,会向下继续搜寻下一个名称为 vbird 的字符串。 如果是执行 ?vbird 的话,那么按下 n 则会向上继续搜寻名称为 vbird 的字符串! 这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻 动作。 例如 /vbird 后,按下 N 则表示『向上』搜寻 vbird 。 n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符 串,并将该字符串取代为 word2 !举例来说,在 100 到 200 行 之间搜寻 vbird 并取代为 VBIRD 则: 『:100,200s/vbird/VBIRD/g』。(常用) 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !(常用) 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给使用者确认 (conform) 是否 需要取代!(常用) 一般模式: 删除、复制与贴上 x, X 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用) n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 nx 个字符, 『10x』。 dd 删除游标所在的那一整列(常用) n 为数字。删除光标所在的向下 n 列,例如 20dd 则是删除 20 列 ndd (常用) d1G 删除光标所在到第一行的所有数据 dG 删除光标所在到最后一行的所有数据 d$ 删除游标所在处,到该行的最后一个字符 d0 那个是数字的 0 ,删除游标所在处,到该行的最前面一个字符 yy 复制游标所在的那一行(常用) n 为数字。复制光标所在的向下 n 列,例如 20yy 则是复制 20 列 nyy (常用) y1G 复制光标所在列到第一列的所有数据 yG 复制光标所在列到最后一列的所有数据 y0 复制光标所在的那个字符到该行行首的所有数据 y$ 复制光标所在的那个字符到该行行尾的所有数据 p, P p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则 按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变 成 30 行。 (常用) J 将光标所在列与下一列的数据结合成同一列 c 重复删除多个数据,例如向下删除 10 行,[ 10cj ] u 复原前一个动作。(常用) [Ctrl]+r 重做上一个动作。(常用) 这个 u 与 [Ctrl]+r 是很常用的指令!一个是复原,另一个则是重做一次~ 利用这两个功能按键, 您的编辑,嘿嘿!很快乐的啦! 不要怀疑!这就是小数点!意思是重复前一个动作的意思。 如果 . 您想要重复删除、重复贴上等等动作,按下小数点『.』就好了! (常 用) 进入编辑模式 i, I 插入:在目前的光标所在处插入输入之文字,已存在的文字会向后 退; 其中, i 为『从目前光标所在处插入』, I 为『在目前所 在行的第一个非空格符处开始插入』。 (常用) a, A a 为『从目前光标所在的下一个字符处开始插入』, A 为『从光 标所在行的最后一个字符处开始插入』。(常用) o, O 这是英文字母 o 的大小写。o 为『在目前光标所在的下一行处插 入新的一行』; O 为在目前光标所在处的上一行插入新的一行!(常 用) r, R 取代:r 会取代光标所在的那一个字符;R 会一直取代光标所在的 文字,直到按下 ESC 为止;(常用) 上面这些按键中,在 vi 画面的左下角处会出现『--INSERT--』或『--REPLACE--』的字样。 由名称 就知道该动作了吧!!特别注意的是,我们上面也提过了,你想要在档案里面输入字符时, 一定要 在左下角处看到 INSERT/REPLACE 才能输入喔! Esc 退出编辑模式,回到一般模式中(常用) 指令列命令模式 :w 将编辑的数据写入硬盘档案中(常用) 若档案属性为『只读』时,强制写入该档案。不过,到底能不能写 :w! 入, 还是跟您对该档案的档案权限有关啊! :q 离开 vi (常用) :q! 若曾修改过档案,又不想储存,使用 ! 为强制离开不储存档案。 注意一下啊,那个惊叹号 (!) 在 vi 当中,常常具有『强制』的意思~ :wq 储存后离开,若为 :wq! 则为强制储存后离开 (常用) :e! 将档案还原到最原始的状态! 若档案没有更动,则不储存离开,若档案已经经过更动,则储存后 ZZ 离开! :w [filename] 将编辑的数据储存成另一个档案(类似另存新档) :r [filename] 在编辑的数据中,读入另一个档案的数据。亦即将 『filename』 这 个档案内容加到游标所在行后面 :n1,n2 w [filename] 将 n1 到 n2 的内容储存成 filename 这个档案。 :! command 暂时离开 vi 到指令列模式下执行 command 的显示结果!例如 『:! ls /home』即可在 vi 当中察看 /home 底下以 ls 输出的档 案信息! :set nu 显示行号,设定之后,会在每一行的前缀显示该行的行号 :set nonu 与 set nu 相反,为取消行号! 特别注意,在 vi 中,『数字』是很有意义的!数字通常代表重复做几次的意思! 也有可能是代表去到第 几个什么什么的意思。举例来说,要删除 50 行,则是用 『50dd』 对吧! 数字加在动作之前~那我要向 下移动 20 行呢?那就是『20j』或者是『20↓』即可。 OK!会这些指令就已经很厉害了,因为常用到的指令也只有不到一半!通常 vi 的指令除了上面鸟哥注明 的常用的几个外,其它是不用背的,你可以做一张简单的指令表在你的屏幕墙上, 一有疑问可以马上的查 询呦! 一个案例练习 来来来!测试一下您是否已经熟悉 vi 这个指令呢?请依照底下的需求进行您的指令动作。 (底下的操作 为使用 FC4 的预设档案来进行练习的。您可以在这里下载: http://linux.vbird.org/linux_basic/0310vi/man.config。) 看看您的显示结果与鸟哥的结果是否相同 啊?! 1. 请在 /tmp 这个目录下建立一个名为 vitest 的目录; 2. 进入 vitest 这个目录当中; 3. 将 /etc/man.config 拷贝到本目录底下(或由上述的连结下载 man.config 档案); 4. 使用 vi 开启本目录下的 man.config 这个档案; 5. 在 vi 中设定一下行号; 6. 移动到第 58 行,向右移动 40 个字符,请问您看到的双引号内是什么目录? 7. 移动到第一行,并且向下搜寻一下『 bzip2 』这个字符串,请问他在第几行? 8. 接着下来,我要将 50 到 100 行之间的 man 改为 MAN,并且一个一个挑选是否需要修改,如何 下达指令? 9. 修改完之后,突然反悔了,要全部复原,有哪些方法? 10. 我要复制 51 到 60 行这十行的内容,并且贴到最后一行之后; 11. 删除 11 到 30 行之间的 20 行; 12. 将这个档案另存成一个 man.test.config 的檔名; 13. 去到第 29 行,并且删除 15 个字符; 14. 储存后离开吧! 整个步骤可以如下显示: 1. 『mkdir /tmp/vitest』 2. 『cd /tmp/vitest』 3. 『cp /etc/man.config .』 4. 『vi man.config』 5. 『:set nu』 6. 先按下『58G』再按下『40→』会看到『/dir/bin/foo』这个字样在双引号内; 7. 先执行『1G』或『gg』后,直接输入『/bzip2』,则会去到第 116 行才对! 8. 直接下达『 :50,100s/man/MAN/gc 』即可! 9. (1)简单的方法可以一直按『 u 』回复到原始状态,(2)使用不储存离开『 :q! 』之后,再重新 读取一次该档案; 10. 『51G』 然后再『 10yy 』之后按下『 G 』到最后一行,再给他『 p 』贴上十行! 11. 『11G』 之后,再给他『 20dd 』即可删除 20 行了; 12. :w man.test.config 13. 『29G』 之后,再给他『 15x 』即可删除 15 个字符; 14. 『:wq!』 如果您的结果都可以查的到,那么 vi 的使用上面应该没有太大的问题啦!剩下的问题会是在…..打字练 习…。 关于档案的回复与暂存盘 另外,其实 vi 是具有『可回复』功能的呢!那么 vi 凭什么帮我们进行回复的功能呢? 很简单啊!凭暂 存档啊!举例来说,当我们编辑一个档案时,假设名称为 /tmp/passwd , 那么在这个 /tmp 底下就会有 一个临时文件,档名为『 /tmp/.passwd.swp 』,这是一个隐藏档, 我们所进行的一些修改都会暂时存在 这个档案当中,万一在档案修改过程中, 系统挂了,那么下次你再重新 vi /tmp/passwd 时,系统就会告 诉您,是否需要回复『Recovery』成修改过程中的模样? 如果您按下 (R) ,嘿嘿!就可以将数据回复到 修改过程的样子,而不是源文件啰! 这是个很有用的功能喔! ^_^ 这也就是说,如果有一天,您去 /tmp 底下,执行 ls -al 时,发现到底下有两个档案, 档名分别为 passwd 与 .passwd.swp 的话,那么 (1) 可能有人在编辑这个档案; (2) 之前您在编辑这个档案时,因为某些不 知名的因素导致 vi 程序中断,则该暂存档就会存在。 如果是状态 (2) ,则此时您可以将该 .passwd.swp 档案删除,或者是,直接 vi /tmp/passwd , 在 vi 出现是否回复时,选择回复,然后储存更新 /tmp/passwd ,之后再将这个 /tmp/.passwd.swp 档案删除即可! 如果不删除的话,那么每次编辑这个档 案,都会告知您该档案有问题啊! @_@ vim 的额外功能 其实,目前大部分的 distributions 都以 vim 取代 vi 的功能了! 如果您使用 vi 后,却看到画面的右 下角有显示目前光标所在的行列号码, 那么您的 vi 已经被 vim 所取代啰~ 为什么要用 vim 呢?因为 vim 具有颜色显示的功能,并且还支持许多的程序语法 (syntax), 因此,当您使用 vim 编辑程序时( 不 论是 C 语言,还是 shell script ), 我们的 vim 将可帮您直接进行『程序除错 (debug)』的功能!真 的很不赖吧!^_^ 如果您在文字模式下,输入 alias 时,出现这样的画面: [root@linux ~]# alias alias vi='vim' 这表示当您使用 vi 这个指令时,其实就是执行 vim 啦!如果您没有这一行,那么您就必须要使用 vim filename 来启动 vim 啰!基本上, vim 的一般用法与 vi 完全一模一样~没有不同啦!那么我们就来看 看 vim 的画面是怎样啰!假设我想要编辑 /etc/man.config ,则输入『vim /etc/man.config』 # # Generated automatically from man.conf.in by the # configure script. # # man.conf from man-1.5p # # For more information about this file, see the man pages man(1) # and man.conf(5). "man.config" 138L, 4506C 1,1 Top 上面的图示是 vim 一画面一角~他有几个特色要讲: 1. 最底下一行说明这个档案的特色,包括 138 行,共 4506 字符等等。 2. 那个 1,1 代表目前光标在第一行的第一个字符上。您可以看到第一行有个光标的存在啊! 3. 那个 Top 则表示,这个画面是整个档案的最上方! 至少就有这些信息。而在您移动光标时,那个 1,1 的游标定位也会跟着变动,是否很方便啊! 好了,底 下我们就来谈一谈其它 vim 的用法吧! 区块选择(Visual Block) 刚刚我们提到的简单的 vi 操作过程中,几乎提到的都是以行为单位的操作。那么如果我想要搞定的是一 个区块范围呢? 举例来说,像底下这种格式的档案: 192.168.1.1 host1.class.net 192.168.1.2 host2.class.net 192.168.1.3 host3.class.net 192.168.1.4 host4.class.net .....中间省略...... 这个档案我将他放置到 http://linux.vbird.org/linux_basic/0310vi/hosts ,您可以自行下载来看一看 这个档案啊!如果我想要复制的只是前面的 IP 数字部分,后面的主机名称部分就不给他复制,那怎么办? 这个时候就得需要使用区块选择(Visual Block)的功能了。当我们按下 v 或者 V 或者 [Ctrl]+v 时, 这 个时候光标移动过的地方就会开始反白,这三个按键的意义分别是: v V [Ctrl]+v y d 区块选择的按键意义 字符选择,会将光标经过的地方反白选择! 行选择,会将光标经过的行反白选择! 区块选择,可以用长方形的方式选择资料 将反白的地方复制起来 将反白的地方删除掉 我们以上面的 IP 对应主机名称为范例,如果想要复制的是 IP 的话,而且仅想要前面四行, 那么我可以: 1. 将光标移动到第一行的第一个字符 ( 1G ); 2. 然后按下 [Ctrl]+v (按着 [ctrl] 不放,再按下 v ); 3. 然后移动方向键,向下向右移动数格,让整个反白区域涵盖 191.168.1.1 到 192.168.1.4 ; 4. 按下 y 复制 (此时反白会自动的不见) ; 5. 移动到任何想要插入的区域,按下 p 就可以插入刚刚复制的区块内容!举例来说,移动到第 1 行 的第 13 个字符处按下小写的 p ,看看会怎样? 这个区块选择在已经格式的档案中,就会显的很有帮助喔!尤其是我们想要大量复制其中一个区块, 而不 是整行复制的场合中,就会很有用的啦! 多档案编辑 假设一个例子,你想要将刚刚我们的 hosts 内的 IP 复制到您的 /etc/hosts 这个档案去, 那么该如何 编辑?我们知道在 vi 内可以使用 :r filename 来读入某个档案的内容, 不过,这样毕竟是将整个档案 读入啊!如果我只是想要部分内容呢?呵呵!这个时候多档案同时编辑就很有用了。 我们可以使用 vim 后 面同时接好几个档案来同时开启喔!相关的按键有: :n :N :files 多档案编辑的按键 编辑下一个档案 编辑上一个档案 列出目前这个 vim 的开启的所有档案 这个功能也很棒啊!现在您可以做一下练习看看说!假设您要将刚刚鸟哥提供的 hosts 内的 IP 复制到您 的 /etc/hosts 档案内,那可以怎么进行呢?可以这样啊: [root@linux ~]# vi hosts /etc/hosts # 在这个档案中利用上个小节提到的区块选择,按下 [ctrl]+v 来进行区块选择,并复制。 # 然后按下 :n 在指令列的地方输入这玩意儿,就会转到下一个档案去,这个时候, # 就可以按下 p 将刚刚复制的 IP 给贴到您的档案中啰!如果您按下 :files ,则: 192.168.1.4 host4.class.net 192.168.1.5 host5.class.net ~ ~ :files 1 %a "hosts" 2 # "/etc/hosts" Hit ENTER or type command to continue line 1 line 1 # 看到否?在指令列输入 :files 就可以显示目前所编辑的档案信息啰! 看到了吧?利用多档案编辑的功能,可以让您很快速的就将需要的资料复制到正确的档案内。 当然啰,这 个功能也可以利用窗口接口来达到,那就是底下要提到的多窗口功能。 多窗口功能 想象两个情况: • 当我有一个档案非常的大,我查阅到后面的数据时,想要『对照』前面的数据,是否需要使用 [ctrl] +f 与 [ctrl]+b 来跑前跑后查阅? • 我有两个需要对照着看的档案,不想使用前一小节提到的多档案编辑功能; 这样的情况下,开一个 vim 里头有两个窗口的环境,就有需要啦!那么如何开启新窗口呢? 很简单啊! 在指令列模式输入:『:sp {filename}』,那个 filename 可有可无, 如果想要在新窗口启动另一个档案, 就加入档名,否则仅输入 :sp 时, 出现的则是同一个档案在两个窗口间!例如鸟哥使用 vim hosts 后, 再以 :sp /etc/hosts , 结果出现如下图示: # Do not remove the following line, or various programs # that require network functionality will fail. 127.0.0.1 localhost.localdomain localhost 192.168.1.11 vbird-work 192.168.1.2 vbird-server ~ /etc/hosts 5,1 All 192.168.1.1 host1.class.net 192.168.1.2 host2.class.net 192.168.1.3 host3.class.net 192.168.1.4 host4.class.net 192.168.1.5 host5.class.net hosts 1,1 Top 怎样?帅吧!两个档案同时在一个屏幕上面显示,您还可以利用『[ctrl]+w+j』及『[ctrl]+w+k』 在两个 窗口之间移动呢!这样的话,复制啊、查阅啊等等的,就变的很简单啰~ 指令的功能有很多,不过,您只 要记得这几个就好了: :sp [filename] [ctrl]+wj [ctrl]+wk [ctrl]+wq 多窗口情况下的按键功能 开启一个新窗口,如果有加 filename, 表示在新窗口开启一个新档案, 否则表示两个窗口为同一个档案内容(同步显示)。 按键的按法是:先按下 [ctrl] 不放, 再按下 w 后放开所有的按键, 然后再按下 j ,则光标可移动到下方的窗口。 同上,不过光标移动到上面的窗口。 其实就是 :q 结束离开啦! 举例来说,如果我想要结束下方的窗口,那 么利用 [ctrl]+wj 移动到下方窗口后,按下 :q 即可离开, 也可以按 下 [ctrl]+wq 啊! vim 环境设定 有没有发现,如果我们以 vim 软件来搜寻一个档案内部的某个字符串时,这个字符串会被反白, 而下次 我们再次以 vim 编辑这个档案时,该搜寻的字符串还是存在呢!甚至于, 编辑其它档案时,如果其它档 案也存在这个字符串,哇!!竟然还是主动反白耶! 另外,当我们重复编辑同一个档案时,当第二次进入 该档案时, 光标竟然就在上次离开的那一行上头呢!真是好方便啊~但是,怎么会这样呢? 这是因为我们的 vim 会主动的将您曾经做过的行为登录下来,好让您下次可以轻松的作业啊! 那个记录 动作的档案就是: ~/.viminfo 这个档案啦!每个人的家目录都应该会存在这个档案才对~这个档案是自 动产生的, 您不必自行建立。而你在 vim 里头所做过的动作,就可以在这个档案内部查询到啰~ ^_^ 此外,某些 distributions 的 vim 当中,利用搜寻时,他并不会显示反白, 有些 distributions 则会 主动的帮您进行缩排的行为 (所谓的缩排, 就是当您按下 Enter 编辑新的一行时,光标不会在行首,而 是在与上一行的第一个非空格符处对齐!)。这些其实都可以进行设定的,那就是 vim 的环境设定啰~ vim 的环境设定参数有很多,如果您想要知道目前的设定值,可以在一般模式时输入:『 :set all 』 来查阅, 不过.....设定项目实在太多了~所以,鸟哥在这里仅列出一些平时比较常用的一些简单的设定值, 提供 给您参考啊: :set nu :set hlsearch :set autoindent :set backup :set ruler :set showmode :set backspace=(012) :set all :syntax (off|on) vim 的环境设定参数 还记得这个吧?!就是设定行号啊!取消的话,就是 :set nonu 这个就是设定是否将搜寻的字符串反白的设定值。 默认值就是 hlsearch ,如果不想要反白,就 :set nohlsearch 。 是否自动缩排?autoindent 就是自动缩排, 不想要缩排就 :set noautoindent 。 是否自动储存备份档?一般是 nobackup 的, 如果设定 backup 的 话,那么当你更动任何一个档案时,则源文件会被另存成一个档名为 filename~ 的档案。 举例来说,我们编辑 hosts ,设定 :set backup ,那么当更动 hosts 时,在同目录下,就会产生 hosts~ 文 件名的档案,记录原始的 hosts 档案内容~ 还记得我们提到的右下角的一些状态列说明吗? 这个 ruler 就是 在显示或不显示该设定值的啦! 这个则是,是否要显示 --INSERT-- 之类的字眼在左下角的状态列。 一般来说, 如果我们按下 i 进入编辑模式后,可以利用退格键 (backspace) 来删除任意字符的。 但是,某些 distribution 则不 许如此。此时,我们就可以透过 backspace 来设定啰~ 当 backspace 为 2 时,就是可以删除任意值;0 或 1 时,仅可删除刚 刚输入的字符, 而无法删除原本就已经存在的文字了! 显示目前所有的环境参数设定值。 是否依据程序相关语法显示不同颜色? 举例来说,在编辑一个纯文 字文件时,如果开头是以 # 开始,那么该行就会变成蓝色。 如果您 懂得写程序,那么这个 :syntax on 还会主动的帮您除错呢!但是, 如果您仅是编写纯文本文件,要避免颜色对您的屏幕产生的干扰,则 可以取消这个设定 :syntax off 。 总之,这些设定值很有用处的啦!但是......我是否每次使用 vim 都要重新设定一次各个参数值? 这不 太合理吧?!没错啊!所以,我们可以透过设定档来直接规定我们习惯的 vim 操作环境呢! 整体 vim 的 设定值一般是放置在 /etc/vimrc 这个档案,不过,不建议您修改他!你可以修改 ~/.vimrc 这个档案 (预 设不存在,请您自行手动建立!),将您所希望的设定值写入! 举例来说,可以是这样的一个档案: [root@linux ~]# vi ~/.vimrc :set hlsearch :set backspace=2 :set autoindent :set ruler :set showmode :syntax on 这样,当您下次重新以 vim 编辑某个档案时,该档案的预设环境设定就是上头写的啰~ 这样,是否很方 便您的操作啊!多多利用 vim 的环境设定功能呢!^_^ 利用 vi 编辑前面章节的练习 我们前面提到很多的数据,例如 man 与 updatedb 等等的内容,对于设定档都是简单的提过而已。 在这 里,我们就透过 vi 的编辑功能,来直接对我们前面提到的章节来进行一些练习吧!OK!来啰~ 例题一:我今天自己安装了一套软件,这套软件的 man page 放置在 /opt/vbirdsoft/man 这 个目录下,那我希望未来只要输入类似 man vbirdcommand 就可以查阅到我这个软件的说明文 件,该如何是好? 答: 我以 FC4 为例, FC4 的 man page 设定档在 /etc/man.config 底下我可以找到该档 案大约 47 行的地方,新增如下的数据: MANPATH /opt/vbirdsoft/man 储存后离开,从此以后,就可以查询到属于我自己的指令的在线说明文件了。 例题二:我知道查询档案可以利用 locate 来进行查询,但是,该程序必须要配合数据库的更 新才行 (updatedb)。现在,我想让我的 FC4 每天进行档案数据库的更新,并且『不要更新 /var/cache 』这个目录,该如何是好? 答: 以 FC4 为例,他的 updatedb 数据库更新设定文件在 /etc/updatedb.conf 这个档案 中。我以 vi 开启这个档案后将该档案修订成为: DAILY_UPDATE=yes PRUNEFS="selinuxfs usbdevfs NFS nfs afs sfs smbfs cifs autofs auto iso9660 udf" PRUNEPATHS="/tmp /usr/tmp /var/spool/cups /var/spool/squid /var/tmp /afs /net /sfs /selinux /udev /media /var/cache" 上列粗体部分为新加入的部分。那个 DAILY_UPDATE=yes 代表每日进行更新,至于 PRUNEPATHS 后面则接『不要更新的目录』,所以,这样就能够达到我们的需求啰! 例题三:在 partition 格式化的那个章节中,假设我有一个 partition 为 /dev/hdb5 ,这个 partition 挂载到 /disk2 上面,且目录 /disk2 已经建立好了。该 partition 使用的 filesystem 为 ext3 ,请问,如果我想要在开机的时候就挂载这个 partition ,该怎么办? 答: 开机挂载可以修改 /etc/fstab 这个档案,我在这个档案新增如下信息即可: /dev/hdb5 /disk2 ext3 defaults 2 2 这样修改完毕后,下达 mount -a 测试看看能否正确挂载,之后就可以开机自动挂载 啰~ vi 很重要的啦!上面的设定档都与 vi 编辑有关呢!重要重要喔! ^_^ DOS 与 Linux 的断行字符 我们在 Linux 档案与目录管理 谈到 cat 时,曾经提到过 DOS 与 Linux 断行字符的不同。 而我们也可 以利用 cat -A 来观察以 DOS (Windows 系统) 建立的档案的特殊格式, 也可以发现在 DOS 使用的断行 字符为 ^M$ ,我们称为 CR 与 LF 两个符号。 而在 Linux 底下,则是仅有 LF ($) 这个断行符号。这个 断行符号对于 Linux 的影响很大喔! 为什么呢? 我们说过,在 Linux 底下的指令在开始执行时,他的判断依据是 『Enter』,而 Linux 的 Enter 为 LF 符 号, 不过,由于 DOS 的断行符号是 CRLF ,也就是多了一个 ^M 的符号出来, 在这样的情况下,如果是 一个 shell script 的程序档案,呵呵~将可能造成『程序无法执行』的状态~ 因为他会误判程序所下达 的指令内容啊!这很伤脑筋吧! 那怎么办啊?很简单啊,将格式转换成为 Linux 即可啊!『废话』,这当然大家都知道,但是, 要以 vi 进入该档案,然后一个一个删除 CR 吗?当然没有这么没人性啦! 我们可以透过简单的指令来进行格式的 转换啊! [root@linux ~]# dos2unix [-kn] file [newfile] [root@linux ~]# unix2dos [-kn] file [newfile] 参数: -k :保留该档案原本的 mtime 时间格式 (不更新档案上次内容经过修订的时间) -n :保留原本的旧档,将转换后的内容输出到新档案,如: dos2unix -n old new 范例: 范例一:将我们提供的 hosts 档案格式更新为 dos 格式。 [root@linux ~]# unix2dos -k hosts unix2dos: converting file hosts to DOS format ... # 此时 hosts 这个档案的时间不会改变,但是内容主要将断行字符修改成为 DOS 的 CRLF 了。 范例二:将范例一已经变成 DOS 格式的 hosts 改名成为 hosts.dos ,并且转换 Linux 格式到 hosts.linux [root@linux ~]# mv hosts hosts.dos [root@linux ~]# dos2unix -k -n hosts.dos hosts.linux dos2unix: converting file hosts.dos to file hosts.linux in UNIX format ... [root@linux ~]# ll -rw-r--r-- 1 root root 288 Aug 1 13:30 hosts.dos -rw------- 1 root root 279 Aug 1 13:30 hosts.linux # 嘿嘿!由于 DOS 格式当中多了 CR 字符,所以,档案比较大的啦! 因为断行字符以及 DOS 与 Linux 操作系统底下一些字符的定义不同,因此, 不建议您在 Windows 系统 当中将档案编辑好之后,才上传到 Linux 系统,会容易发生错误问题。 而且,如果您在不同的系统之间 复制一些纯文本文件时,千万记得要使用 unix2dos 或 dos2unix 来转换一下格式啊! 本章与 LPI 的关系: 在 http://www.lpi.org 所提供的 topic 当中, LPI 101 的 Topic 103 之 1.103.8 提到:『应试者应 该能够学会使用 vi 文书编辑器,学习的目标包含了 vi 的插入、编辑、删除、复制与搜寻等功能的练习!』 至于使用到的指令与 vi 当中所会用到的数据与指令为: • vi • /, ? (请看搜寻部分) • h, j, k, l (移动光标的部分,这个较常考!) • G, H, L (移动光标的部分) • i, c, d, dd, p, o, a (删除、编辑与贴上的部分) • ZZ, :w!, :q!, :e! • :! 本章习题练习: (要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看) • 我要在某个档案的第 34 行向右移动 15 个字符,应该在一般模式下达什么指令? • 先按下 34G 到第 24 行; • 再按下 [ 15 + 向右键 ],或 [ 15l ] 亦可! • 在 vi 里面, PageDown 按钮可以使用什么组合键来取代? [Ctrl] + f 可以向后翻一页 • 如何去到 vi 该档案里面的页首或页尾? 去页首按下 1G ;去页尾按下 G 即可 • 如何在一行中,移动到行头及行尾? 移动到行头,按 0 ,移动到行尾按 $ 即可! • vi 里面, r 有什么功能? 取代光标所在的那个字符 • 如何将目前的页面另存新档? :w filename • 在 linux 底下最常使用的文书编辑器为 vi ,请问如何进入编辑模式? 在一般模式底下输入: i, I, a, A 为在本行当中输入新字符;(出现 –Insert- ) 在一般模式当中输入: o, O 为在一个新的一行输入新字符; 在一般模式当中输入: r, R 为取代字符!(左下角出现 –Replace-) • 如何由编辑模式跳回一般模式? 可以按下[Esc] • 若上下左右键无法使用时,请问如何在一般模式移动光标? [h, j, k, l]分别代表[左、下、上、右] • 若 [pagedown] [ pageup] 在一般模式无法使用时,如何往前或往后翻一页? 向下翻 [Ctrl] + [f] 向前翻 [Ctrl] + [b] • 如何到本档案的最后一行、第一行;本行的第一个字符、最后一个字符? 分别为:G, 1G, 0, $ • 如何删除一行、n 行;如何删除一个字符? 分别为 dd, ndd, x 或 X (dG 及 d1G 分别表示删除到页首及页尾) • 如何复制一行、n 行并加以贴上? 分别为 yy, nyy, p 或 P • 如何搜寻 string 这个字符串? ?string (往前搜寻) /string (往后搜寻) • 如何取代 word1 成为 word2,而若需要使用者确认机制,又该如何? :1,$s/word1/word2/g 或 :1,$s/word1/word2/gc (需要使用者确认) • 如何读取一个档案 filename 进来目前这个档案? :r filename • 如何另存新档成为 newfilename? :w newfilename • 如何存档、离开、存档后离开、强制存档后离开? :w; :q: :wq; :wq! • 在 vi 底下作了很多的编辑动作之后,却想还原成原来的档案内容,应该怎么进行? 直接按下 :e! 即可恢复成档案的原始状态! • 我在 vi 这个程序当中,不想离开 vi ,但是想执行 ls /home 这个指令,vi 有什么额外的功能可以 达到这个目的: 事实上,可以使用[ :! ls /home ]不过,如果你学过后面的章节之后,你会发现,执行[ ctrl + z ]亦可 暂时退出 vi 让你在指令列模式当中执行指令喔! • 如何设定与取消行号? :set nu :set nonu 参考数据 • 关于 vim 是什么的『中文』说明:http://www.vim.org/6k/features.zh.txt。 • 李果正兄的:大家来学 vim (http://info.sayya.org/~edt1023/vim/) 认识 BASH Shell 最近更新日期:2005/08/30 文字模式 (command line) 这种指令下达的方式,在 Linux 里面,其实就相当于是 bash 的工具与接口! 因 为 Linux 就是以 bash 为预设的 shell 的!那么前几章我们都已经很快乐的进行了很多的指令下达啰~ 所 以说, bash shell 根本就不难吧~是啦!只要能够熟悉的话,那么确实他也不是这么不可亲近的一项工具 啊~ 这个章节中,鸟哥会由变量谈起,先讲到环境变量的功能与修改的问题, 然后会继续提到历史指令 的运用。接下来,就会谈一下『数据流重导向』这个重要概念, 最后就是管线命令的利用啦!好好清一清 脑门,准备用功去啰~ ^_^ 这个章节几乎是所有 command line 与未来主机维护与管理的重要基础,一定 要好好仔细的阅读喔! 1. Bash shell 1.1 什么是 shell ? 1.2 系统的 shell 与 /etc/shells 功能 1.3 Bash shell 的功能 1.4 Bash shell 的内建命令: type 1.5 指令的下达 2. Shell 的变量功能 2.1 变量的取用与设定:echo, 变量设定规则, unset 2.2 变数的用途? 2.3 环境变量的功能: env, 一些重要的环境变量, set, export 2.4 语系档案的变量 (locale) 2.5 变量的有效范围: 2.6 变量键盘读取、数组与宣告: read, declare, array 2.7 与档案系统及程序的限制关系: ulimit 2.8 其它额外变量功能 3. 命令别名与历史命令: 3.1 命令别名设定: alias, unalias 3.2 历史命令: history, HISTSIZE 4. Bash shell 使用环境: 4.1 绝对路径与相对路径 4.2 登录讯息显示数据: /etc/issue, /etc/motd 4.3 环境设定档: bashrc, ~/.bashrc, ~/.profile, profile...,/etc/inputrc, source 4.4 终端机的环境设定: stty, set 4.5 万用字符与特殊符号: 5. 数据流重导向 (redirecte) 5.1 何谓数据流重导向? 5.2 命令执行的判断依据: ; , &&, || 6. 管线命令 (pipe): 6.1 撷取命令: cut, grep 6.2 排序命令: sort, wc, uniq 6.3 双向重导向: tee 6.4 字符转换命令: tr, col, join, paste, expand 6.5 分割命令: split 6.6 参数代换: xargs 6.7 关于减号 - 的用途 7. 本章习题练习 8. 针对本文的建议:http://phorum.vbird.org/viewtopic.php?t=23884 Bash shell 我们在前面的 什么是 Linux 那个章节当中,提到了, 管理整个硬件的其实是核心 (kernel),那我们一 般使用者 (user) 则是以 shell 来跟核心沟通~ 让核心达到我们所想要达到的工作目的。那么系统有多 少 shell 可用呢? 为什么我们要使用 bash 啊?!底下分别来谈一谈喔! 什么是 Shell? 这应该是个蛮有趣的话题:『什么是 Shell ?』相信只要摸过计算机,对于操作系统 ( 不论是 Linux 、 Unix 或者是 Windows ) 有点概念的朋友们大多听过这个名词,因为只要有『操作系统』那么就离不开 Shell 这个东西。不过,在讨论 Shell 之前,我们先来了解一下计算机的运作状况吧! 举个例子来说: 当你要计算机传输出来『音乐』的时候,你的计算机需要什么东西呢? 1. 当然就是需要你的硬件有『声卡芯片』这个硬件配备,否则怎么会有声音; 2. 操作系统的核心可以支持这个芯片组,当然还需要提供芯片的驱动程序啰; 3. 需要使用者(就是你)输入发生声音的指令啰! 这就是基本的一个输出声音的需要的步骤!那么也就是说,你必须要『输入』一个指令之后, 『硬件』才 会透过你下达的指令来工作!嘿嘿!那么硬件如何知道你下达的指令呢?那就是 kernel (核心)的控制 工作了!了解了吗?没错!也就是说,我们必须要透过『 Shell 』将我们输入的指令与 Kernel 沟通,好 让 Kernel 可以控制硬件来正确无误的工作! 基本上,我们可以透过底下这两张图来说明一下: 图一、硬件、核心与使用者的相关性图示 图二、硬件、核心与使用者的相关性图示 基本上,替我们工作的是『硬件』,而控制硬件的是『核心』,再来,我们使用者乃是利用『Shell』控制 一些 kernel 提供的 『工具 (Utility)』来操控硬件替我们正确的工作。再进一步来说,由于 kernel 听 不懂人类的语言,而人类也没有办法直接记得 kernel 的语言,所以两者的沟通就得藉由 shell 来支持了! (其实早期的 DOS 的文字接口也是使用 shell 来沟通呀!那个 shell 的名称就叫做 command.com ,还记 得吗? ^_^) 以字面上的意思来说, kernel 是『核心』的意思,而 Shell 是『壳』的意思,呵呵!也就是说, shell 是最外头的咚咚!而 kernel 乃是最内层的的咚咚啦!核心是操作系统的最底层的东西! 这个核心里头包 括了各种的支持硬件的工具!当然啰,如果你的硬件太新,而你的 kernel 并没有支持的话,那么很抱歉, 你的 Shell 能力再怎么强,也没有办法使硬件工作的! 这样可以了解了吗?呵呵!没错!使计算机主机 工作的正是核心的任务,但是操作核心来替使用者工作的,却是 shell 喔!因此,有时候你的 shell 搞 了老半天,硬件却不能工作的时候,请注意, 您的『核心』是否正确呢?阿!扯远了!这是 kernel 章节 才要说的东西。 • 我干嘛要学习文字模式的 Shell 呢? 我们常常提到的 shell 其实是比较狭隘的定义,一般来说,在 Linux 里头,所谓的 shell 就是指 BASH 这 个文字模式的 shell 啰。但是,广义的 shell 也可以是 KDE 之类的图形接口控制软件呢! 因为他也可 以帮我们与 kernel 进行沟通啊!不过,在鸟哥的 Linux 私房菜里面, 如果没有特别说明的话,那么我 们的 shell 指的是比较狭义的,也就是文字模式的 shell 喔! 另外,鸟哥常常听到这个问题:『我干嘛要学习 shell 呢? 不是已经有很多的工具可以提供我设定我的 主机了?我为何要花这么多时间去学指令呢?不是以 X Window 按一按几个按钮就可以搞定了吗?为什么 要这么麻烦?』唉~还是得一再地强调, X Window 还有 Web 接口的设定工具例如 webmin 是真的好用的 家伙, 他真的可以帮助我们很简易的设定好我们的主机,甚至是一些很进阶的设定都可以帮我们搞定。 但是鸟哥在序章里面也已经提到过相当多次了, X Window 的接口虽然亲善,功能虽然强大,而 web 接口 的工具也可以提供我们很友善的服务,但是毕竟他是将所有利用到的套件都整合在一起的一个套件而已, 并非是一个完整的套件,所以某些时候当你升级或者是使用其它套件管理模块( 例如 tarball 而非 rpm 档案等等 )时,就会造成设定的困扰了。 此外,远程联机时,文字接口的传输速度一定比较快, 而且,较不容易出现断线或者是信息外流的问题, 因此, shell 真的是得学习的一项工具。而且,他可以让您更深入 Linux ,更了解他, 而不是只会按一 按鼠标而已!所谓『天助自助者!』多摸一点文字模式的东西,会让你与 Linux 更亲近呢! 有些朋友也很可爱,常会说:『我学这么多干什么? 又不常用,也用不到!』嘿嘿!有没有听过『书到用 时方恨少?』 当你的主机一切安然无恙的时候,您当然会觉得好像学这么多的东西一点帮助也没有呀! 万 一,某一天真的不幸给他中标了,您该如何是好?是直接重新安装? 还是先追踪入侵来源后进行漏洞的修 补?或者是干脆就关站好了?这当然涉及很多的考虑, 但就以鸟哥的观点来看,多学一点总是好的,尤其 我们可以有备而无患嘛!甚至学的不精也没有关系,了解概念也就 OK 啦!毕竟没有人要您一定要背这么 多的内容啦!了解概念就很了不起了! 此外,如果您真的有心想要将您的主机管理的好,那么良好的 shell 程序编写是一定需要的啦!就鸟哥自 己来说,我管理的主机虽然还不算多, 只有区区不到十部,但是如果每部主机都要花上几十分钟来查阅他 的 log file 以及相关的信息,那么我可能会疯掉!基本上,也太没有效率了!这个时候,如果能够藉由 shell 提供的命令重导向( 或称数据流重导向 ),以及管线命令,呵呵!那么我分析 log file 只要花费 不到十分钟就可以看完所有的主机之重要信息了!相当的好用呢! 由于学习 shell 的好处真的是多多啦!所以,如果您是个系统管理员,或者有心想要管理系统的话,那么 shell 这个东西与 shell scripts 这个东西,真的真的有必要看一看! 系统的 shell 与 /etc/shells 功能 知道什么是 Shell 之后,那么我们来了解一下 Linux 使用的是哪一个 shell 呢?什么!哪一个?难道说 shell 不就是『一个 shell 吗?』哈哈!那可不!由于早年的 Unix 年代,发展者众,所以由于 shell 依 据发展者的不同就有许多的版本,例如常听到的 Bourne SHell (sh) 、在 Sun 里头预设的 C SHell、 商 业上常用的 K SHell、, 还有 TCSH 等等,每一种 Shell 都各有其特点。至于 Linux 使用的这一种版本 就称为『 Bourne Again SHell (简称 bash) 』,这个 Shell 是 Bourne Shell 的增强版本,也是基准于 GNU 的架构下发展出来的呦! 在介绍 shell 的优点之前,先来说一说 shell 的简单历史吧:第一个流行的 shell 是由 Steven Bourne 发展出来的,为了纪念他所以就称为 Bourne shell ,或直接简称为 sh !而后来另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计依附于 BSD 版的 Unix 系统中的 shell ,这个 shell 的语法有点类似 C 语言,所以才得名为 C shell ,简称为 csh !由于在学术界 Sun 主机势力相当的庞大,而 Sun 主要 是 BSD 的分支之一,所以 C shell 也是另一个很重要而且流传很广的 shell 之一 ( 因为太多的程序设 计师使用的就是 C 语言啦! )!(还记得我们在 Linux 是什么那一章提到的吧? Sun 公司的创始人就是 Bill Joy,而 BSD 最早就是 Bill Joy 发展出来的啊!)。 那么目前我们的 Linux (以 FC4 为例) 有多少我们可以使用的 shells 呢? 你可以检查一下 /etc/shells 这个档案,至少就有底下这几个可以用的 shells: • /bin/sh (已经被 /bin/bash 所取代) • /bin/bash (就是 Linux 预设的 shell) • /bin/ksh (Kornshell 由 AT&T Bell lab. 发展出来的,兼容于 bash) • /bin/tcsh (整合 C Shell ,提供更多的功能) • /bin/csh (已经被 /bin/tcsh 所取代) • /bin/zsh (基于 ksh 发展出来的,功能更强大的 shell) 由上面的说明中,我们大概可以发现,其实各主要 shell 的功能都差不多, 有的只是语法上面的不同而 已。目前一般的使用者使用习惯上,似乎是以 bash 及 csh 为主要的两个 shell 。OK!这么多的 shell 我 要使用哪一个啊?呵呵!使用 Linux 支持最广泛的 bash 就好了! 不要想太多!另外,咦!为什么我们 系统上的 shell 要写入 /etc/shells 这个档案啊? 这是因为系统某些服务在运行过程中, 会去检查使 用者能够使用的 shells ,而这些 shell 的查询就是藉由 /etc/shells 这个档案啰! 举例来说,某些 FTP 网站会去检查使用者的可用 shell ,而如果你不想要让这些使用者使用 FTP 以外的 主机资源时,可能会给予该使用者一些怪怪的 shell,让使用者无法以其它服务登入主机。 这个时候,你 就得将那些怪怪的 shell 写到 /etc/shells 当中了。举例来说,我们的 FC4 的 /etc/shells 里头就有 个 /sbin/nologin 档案的存在,这个就是我们说的怪怪的 shell 啰~ 那么,再想一想,我这个使用者什么时候可以取得 shell 来工作呢?还有, 我这个使用者预设会取得哪 一个 shell 啊?!还记得我们在 首次进入 Linux -- 以文字方式登入 那个章节当中提到的登入动作吧? 当我登入的时候,系统就会给我一个 shell 让我来工作了。 而这个登入取得的 shell 就记录在 /etc/passwd 这个档案内!这个档案的内容是啥? [root@linux ~]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin .....(中间省略)..... 如上所示,在每一行的最后一个数据,就是您登入后,可以取得的预设的 shell 啦! 那你也会看到, root 是 /bin/bash ,不过,系统账号 bin 与 daemon 等等,就使用那个怪怪的 /sbin/nologin 啰~关于使用 者这部分的内容,我们留在 账号管理 时提供更多的说明。 Bash shell 的功能 既然 /bin/bash 是 Linux 预设的 shell ,那么总是得了解一下这个玩意儿吧! BASH 是怎么一回事呢? 这个 shell 是 GNU 计划中重要的工具软件之一,目前也是 GNU 操作系统中标准的 shell ,他主要兼容 于 sh ,并且依据一些使用者需求,而加强的 shell 版本,可以说目前几乎所有的 Linux distribution 都 是使用 bash 作为管理核心的主要 shell !因此,不论您使用的是那个 distribution ,你都难逃需要学 习 bash 的宿命啦!那么这个 shell 有什么好处,干嘛 Linux 要使用他作为预设的 shell 呢? BASH 主 要的优点有底下几个: • 命令编修能力(类似 DOS 的 doskey 功能): 使用 bash 里头,个人认为相当棒的一个功能就是『他能记忆使用过的指令!』 这功能真的相当的棒!因 为我只要在指令列按『上下键』就可以找到前一个输入的指令!而在很多 distribution 里头,预设的指 令记忆功能可以到达 1000 个!也就是说, 你曾经下达过的指令都被记录下来了,记录的档案在你的家目 录内的 .bash_history !不过,需要留意的是, ~/.bash_history 记录的是前一次登入以前所执行过的 指令, 而至于这一次登入所执行的指令都被暂存在暂内存中,当您成功的注销系统后,该指令记忆才会记 录到 .bash_history 当中! 这有什么功能呢?最大的好处就是可以『查询曾经做过的举动!』, 如此可以知道你的执行步骤,那么就 可以追踪您曾下达的指令,以作为除错的工具! 但如此一来也有个烦恼,就是如果被黑客入侵了,那么他 只要翻你曾经执行过的指令, 刚好你的指令又跟系统有关(例如直接输入 MySQL 的密码在指令列上面) 那么很容易就被破解你的 Linux 主机!所以,最好是将记录的指令数目减小一点较好! • 命令与档案补全功能: 还记得我们在 首次进入 Linux 的热门按键 一节当中提到的 [tab] 这个按键吗?!这个按键的功能就是 在 bash 里头才有的啦!常常在 bash 环境中使用 [tab] 是个很棒的习惯喔!因为至少可以让你 1)少打 很多字; 2)确定输入的数据是正确的! 使用 [tab] 按键的时机依据 [tab] 接在指令后或参数后而有所 不同。我们再复习一次: • [Tab] 接在一串指令的第一个字的后面,则为命令补全; • [Tab] 接在一串指令的第二个字以后时,则为『档案补齐』! 所以说,如果我想要知道我的环境中,所有可以执行的指令有几个? 就直接在 bash 的提示字符后面输入 两个 [tab][tab] 就能够输出所有的可执行指令了。 那如果想要知道系统当中所有以 c 为开头的指令 呢?就按下 c[tab][tab] 就好啦! ^_^ 是的!真的是很方便的功能,所以,有事没事,在 bash shell 底下,多按几次 [tab] 是一个不错的习惯 啦! • 命令别名(alias)设定功能: 假如我需要知道这个目录底下的所有档案(包含隐藏档)及所有的档案属性,那么我就必须要下达 ls -al 这样的指令列,唉!真麻烦,有没有更快的取代方式?呵呵!就使用命令别名呀!例如我最喜欢直接以 lm 这个自订的命令来取代上面的命令,也就是说, lm 会等于 ls -al 这样的一个功能,嘿!那么要如何作 呢?就使用 alias 即可!你可以在指令列输入 alias 就可以知道目前的命令别名有哪些了!也可以直接 下达命令来设定别名呦: alias lm='ls -al' • 工作控制(jobs)、前景背景控制: 这部分我们在之后的资源管理章节中会再提及! 使用前、背景的控制可以让工作进行的更为顺利!至于工 作控制(jobs)的用途则更广, 可以让我们随时将工作丢到背景中执行!而不怕不小心使用了 [Ctrl] + c 来 停掉该程序!真是好样的!此外,也可以在单一登入的环境中,达到多任务的目的呢! • Shell scripts 的强大功能: 在 DOS 年代还记得将一堆指令写在一起的所谓的『批次档』吧?在 Linux 底下的 shell scripts 则发挥 的更为强大的功能,可以将您日常生活当中常需要下达的连续指令写成一个档案, 该档案并且可以透过对 谈交互式的方式来进行主机的侦测工作!也可以藉由 shell 提供的环境变量及相关指令来进行设计,哇! 整个设计下来几乎就是一个小型的程序语言了!该 scripts 的功能真的是超乎我的想象之外!以前在 DOS 底下需要程序语言才能写的东西,在 Linux 底下使用简单的 shell scripts 就可以帮你达成了!真的厉 害!!这部分我们在后续章节再来谈! • 万用字符! 除了完整的字符串之外, bash 还支持许多的万用字符来帮助使用者查询与指令下达。 举例来说,想要知 道 /usr/X11R6/bin 底下有多少以 xt 为开头的档案吗?使用: ls -l /usr/X11R6/bin/xt* 就能够知道 啰~此外,还有其它可供利用的万用字符, 这些都能够加快使用者的操作呢! Bash shell 的内建命令: type 我们在首次进入 Linux 章节当中,提到关于 Linux 的在线说明文件 部分,也就是 man page 的内容,那 么 bash 有没有什么说明文件啊?开玩笑~ 这么棒的东西怎么可能没有说明文件!请您在 shell 的环境 下,直接输入 man bash 瞧一瞧, 嘿嘿!不是盖的吧!让您看个几天几夜也无法看完的 bash 说明文件, 可是很详尽的数据啊! ^_^ 不过,在这个 man bash 所出现的 man page 当中,不知道您是否有察觉到,咦! 怎么这个说明文件里面 有其它的档案说明啊?举例来说,那个 cd 指令的说明就在这个 man page 内? 然后我直接输入 man cd 时,怎么出现的画面中,最上方竟然出现一堆指令的介绍??这是怎么回事? 为了方便 shell 的操作, 其实 bash 已经『内建』了很多指令了,例如上面提到的 cd , 还有例如 umask 等等的指令,都是内建 在 bash 当中的呢! 那我怎么知道这个指令是来自于外部指令(指的是其它非 bash 套件所提供的指令) 或是内建在 bash 当 中的呢? 嘿嘿!利用 type 这个指令来观察即可!举例来说: [root@linux ~]# type [-tpa] name 参数: :不加任何参数时,则 type 会显示出那个 name 是外部指令还是 bash 内建的指令! -t :当加入 -t 参数时,type 会将 name 以底下这些字眼显示出他的意义: file :表示为外部指令; alias :表示该指令为命令别名所设定的名称; builtin :表示该指令为 bash 内建的指令功能; -p :如果后面接的 name 为指令时,会显示完整文件名(外部指令)或显示为内建指令; -a :会将由 PATH 变量定义的路径中,将所有含有 name 的指令都列出来,包含 alias 范例: 范例一:查询一下 ls 这个指令是否为 bash 内建? [root@linux ~]# type ls ls is aliased to `ls --color=tty' # 没有加上任何参数,仅列出 ls 这个指令的最主要使用情况 [root@linux ~]# type -t ls alias # -t 参数则仅列出 ls 这个指令的最主要使用情况说明 [root@linux ~]# type -a ls ls is aliased to `ls --color=tty' ls is /bin/ls # 利用所有方法找出来的 ls 相关信息都会被列出来! 范例二:那么 cd 呢? [root@linux ~]# type cd cd is a shell builtin 透过 type 这个指令的用途,我们可以知道每个指令是否为 bash 的内建指令。 此外,由于利用 type 搜 寻后面的名称时,如果后面接的名称并不能以执行档的状态被找到, 那么该名称是不会被显示出来的。举 例来说,您的 FC4 应该不会有 vbird 这个指令吧?! 输入 type -p vbird 看一下,果然没有输出任何 数据!而如果您输入的是 type -p touch 呢? 则会出现 /bin/touch !呵呵!所以,这个 type 也可以 用来作为类似 which 指令的用途啦!找指令用的! 指令的下达 我们在 首次进入 Linux 一节当中,已经提到过在 shell 环境下的指令下达方式,不过,因为这个部分实 在很重要,所以,我们还是再次的提醒一次! [root@linux ~]# command [-options] parameter1 parameter2 ... 指令 选项 参数(1) 参数(2) 说明: 0. 一行指令中第一个输入的绝对是『指令(command)』或『可执行档案』 1. command 为指令的名称,例如变换路径的指令为 cd 等等; 2. 中刮号[]并不存在于实际的指令中,而加入参数设定时,通常为 - 号,例如 -h; 有时候完整参数名称会输入 -- 符号,例如 --help; 3. parameter1 parameter2.. 为依附在 option 后面的参数, 或者是 command 的参数; 4. command, -options, parameter1.. 这几个咚咚中间以空格来区分, 不论空几格 shell 都视为一格; 5. 按下 [Enter] 按键后,该指令就立即执行。[Enter] 按键为 字符, 他代表着一行指令的开始启动。 6. 指令太长的时候,可以使用 \ 符号来跳脱 [Enter] 符号, 使指令连续到下一行。注意! \ 后就立刻接特殊字符。 7. 在 Linux 系统中,英文大小写字母是不一样的。举例来说, cd 与 CD 并不同。 范例: 范例一:列出 /root 底下的各文件名称 [root@linux ~]# ls -al /root [root@linux ~]# ls -al /root # 不论指令与参数中间空几格,都是可以接受的! 范例二:如果指令太长的话,如何使用两行来输出? [root@linux ~]# cp /var/spool/mail/root /etc/crontab \ > /etc/fstab /root # 上面这个指令,就是将三个档案复制到 /root 这个目录下而已。不过,因为指令太长, # 于是鸟哥就利用 \[Enter] 来将 [Enter] 这个按键『跳脱!』开来,让 # [Enter] 按键不再具有上述说明的第 5 点功能!好让指令继续在下一行输入。 # 需要特别留意, [Enter] 按键是紧接着反斜线 (\) 的,两者中间没有其它字符。 # 因为 \ 仅跳脱『紧接着的下一个字符』而已!所以,万一我写成: # \ [Enter] ,亦即 [Enter] 与反斜线中间有一个空格时,则 \ 跳脱的是『空格键』 # 而不是 [Enter] 按键!这个地方请在仔细的看一遍!很重要! # 如果顺利跳脱 [Enter] 后,下一行最前面就会主动出现 > 的符号, # 您可以继续输入指令啰!也就是说,那个 > 是系统自动出现的,你不需要输入。 总之,当我们顺利的在终端机 (tty) 上面登入后, Linux 就会依据 /etc/passwd 档案的设定给我们一个 shell ,预设就是 bash ,然后我们就可以依据上面的指令下达方式来操作 shell, 之后,我们就可以透 过 man 这个在线查询来查询指令的使用方式与参数说明, 很不错吧!那么我们就赶紧更进一步来操作 bash 这个好玩的东西啰! Shell 的变量功能 在继续研究 BASH 之前,我们得要先就 变量 这个东西来讨论一番。 为什么要讨论变数呢?又,变数是啥 玩意儿啊?!先来谈一谈国中数学好了,您是否依稀记得, 我们国中时候学过所谓的『 y = ax + b 』这 东西?其中, y 是变量, x 则是这个变量的内容啊! 讲的更简单一点,我们可以『用一个简单的 "字眼 " 来取代另一个比较复杂或者是容易变动的数据』。这有什么好处啊?最大的好处就是『方便!』。 如果以 Linux 主机的运作来说明好了,因为在主机里面有太多的数据需要进行存取了, 而这些数据都是 一些服务所必须的,例如某个名为 dmtsai 的账号,他的 mail 的存取路径预设是在 /var/spool/mail/dmtsai 、家目录预设在 /home/dmtsai 等等。那如果换了另外一个账号呢? 假设另一 个账号名称为 vbird ,你猜他的邮件与家目录在哪?应该是在 /var/spool/mail/vbird 与 /home/vbird 对吧! 那么我们主机的邮件服务是否要记录好几个不同的路径啊?会不会太麻烦?这当然很麻烦啰~ 所 以为了简化整个运作流程,我们就可以透过某个变量功能,让这个变量可以依据不同的使用者而变更内容, 如此一来,系统的邮件服务只要依据那个变量去取得所需要的数据即可,就不需要记录不同的路径啰。 举例来说,我们每个账号的邮件信箱预设是以 MAIL 这个变量来进行存取的, 当 dmtsai 这个使用者登入 时,他便会取得 MAIL 这个变量,而这个变量的内容其实就是 /var/spool/mail/dmtsai,那如果 vbird 登 入呢?他取得的 MAIL 这个变量的内容其实就是 /var/spool/mail/vbird 。 而我们使用信件读取指令 mail 来读取自己的邮件信箱时,嘿嘿,这支程序可以直接读取 MAIL 这个变量的内容, 就能够自动的分 辨出属于自己的信箱信件啰!这样一来,设计程序的设计师就真的很方便的啦! 当然我们可以改变这些个变量,但是如果该变量是直接深植于套件当中, 那么当你修改了某些参数之后, 嘿嘿!你的套件就必须要『由原始码直接更新再编译』 才行!这样似乎很麻烦,所以啰,变量真的是很方 便的啦! Tips: 举个简单的例子来说, sendmail 的 smtp 存放 mail 路径是经由 /etc/profile 里头的: MAIL="/var/spool/mail/$USER" 来设定的,而当我修改了上面这一个咚咚,然后重新开机之后,嘿 嘿嘿嘿! 我的邮件就可以存放到不同的路径去了!而且不会有问 题!可以顺利的『在 Linux 主机上面』收发。然而问题发生在 pop3 这个服务上面,由于 pop3 的预设路径是在 source code 里头, 而且就正是 /var/spool/mail 这个路径,也就是说,不论我怎么 修正我的『变量』, pop3 都不为所动!唉~真惨,所以就无法直 接以 pop3 来收信了(例如 OutLook 就不能工作了)!会发生密 码不接受的问题呢! 再来继续讲到其它的变量功能好了,我们前面已经提到过很多次,能不能执行某个指令, 与 PATH 这个变 量也有很大的关系的。举例来说,我们在任何地方下达 ls 这个指令时,系统就是透过 PATH 这个变量里 面的内容所记录的路径顺序来搜寻指令的呢!如果在搜寻完 PATH 变量内的路径还找不到 ls 这个指令时, 就会在屏幕上显示『 command not found 』的错误讯息了。 这些还都只是系统预设的变量的目的,如果是个人的设定方面的应用呢:例如你要写一个大型的 script (批次文件)时,有些数据因为可能由于使用者习惯的不同而有差异,比如说路径好了,由于该路径在 script 被使用在相当多的地方,如果下次换了一部主机,都要修改 script 里面的所有路径,那么我一定 会疯掉! 这个时候如果使用变量,而将该变量的定义写在最前面,后面相关的路径名称都以变量来取代, 嘿嘿!那么你只要修改一行就等于修改整篇 script 了!方便的很!所以,良好的程序设计师都会善用变 量的定义! ( 这个部分我们在后续的 shell script 再次提及的!) 如果说的学理一点,那么由于在 Linux System 下面,所有的执行续都是需要一个执行码, 而就如同上面 提到的,你『真正以 shell 来跟 Linux 沟通,是在正确的登入 Linux 之后!』这个时候你就有一个 bash 的执行程序,也才可以真正的经由 bash 来跟系统沟通啰!而在进入 shell 之前,也正如同上面提到的, 由于系统需要一些变量来提供他数据的存取(或者是一些环境的设定参数值, 例如是否要显示彩色等等 的),所以就有一些所谓的『环境变量』 需要来读入系统中了!这些环境变量例如 PATH、HOME、MAIL、 SHELL 等等,都是很重要的, 为了区别与自订变量的不同,环境变量通常以大写字符来表示呢! 好了,那么我们就简单的来对『什么是变量』作个简单的定义好了: 『变量就是以一组文字或符号等,来 取代一些设定或者是一串保留的数据!』, 例如:我设定了『myname』就是『VBird』,所以当你读取 myname 这个变量的时候,系统自然就会知道!哈!那就是 VBird 啦!最简单的例子可以取 PATH 来说明!如果你 对于『相对路径与绝对路径』还有点印象的话, 那么应该晓得『要下达正确的指令,应该需要指定路径与 文件名』才行!例如你的 ls 指令应该需要以『/bin/ls』来下达指令才对,那么为何你在任意的路径下都 可以执行 ls 呢?而不需要指定路径呢?这是因为系统已经预设了一些『搜寻路径(PATH)』了, 所以当你 需要执行一些指令的时候,系统就会依照该 PATH 的设定来进行指令的搜寻!而这个 PATH 就是所谓的变 量了! 那么如何『显示变量』呢?这就需要使用到 echo 这个指令啦! 变量的取用与设定:echo, 变量设定规则, unset 说的口沫横飞的,也不知道『变量』与『变量代表的内容』有啥关系? 当然啦,那我们就将『变量』的『内 容』拿出来给您瞧瞧就好了。利用 echo 这个指令来取用变量, 但是,变量在被取用时,前面必须要加上 $ 才行,举例来说,要知道 PATH 的内容,该如何是好? [root@linux ~]# echo $variable [root@linux ~]# echo $PATH /bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin [root@linux ~]# echo ${PATH} 变量的取用就如同上面的范例,利用 ehco 就能够读出,只是需要在变量名称前面加上 $ , 或者是以 ${variable} 的方式来取用都可以!当然啦,那个 echo 的功能可是很多的, 我们这里单纯是拿 echo 来 读出变量的内容而已,更多的 echo 使用,请自行给他 man echo 吧! ^_^ 例题一:请在屏幕上面显示出您的环境变量 HOME 与 MAIL: 答: echo $HOME echo $MAIL OK!现在我们知道了变量与变量内的之间的相关性了,好了,那么我要如何『设定』或者是『修改』 某个 变量的内容啊?!很简单啦!用『等号(=)』连接变量与他的内容就好啦!举例来说: 我要将 myname 这 个变量名称的内容设定为 VBird ,那么: [root@linux ~]# echo $myname <==这里并没有任何数据~因为这个变量尚未被设定!是空的! [root@linux ~]# myname=VBird [root@linux ~]# echo $myname VBird <==出现了!因为这个变量已经被设定了! 瞧!如此一来,这个变量名称 myname 的内容就带有 VBird 这个数据啰~ 而由上面的例子当中,我们也 可以知道: 当一个变量名称尚未被设定时,预设的内容是『空』的。 另外,变量在设定时,还是需要符 合某些规定的,否则会设定失败喔! 这些规则如下所示啊! 1. 变量与变量内容以等号『=』来连结; 2. 等号两边不能直接接空格符; 3. 变量名称只能是英文字母与数字,但是数字不能是开头字符; 4. 若有空格符可以使用双引号『 " 』或单引号『 ' 』来将变量内容结合起来,但须要特别留意, 双 引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符; 5. 必要时需要以跳脱字符『 \ 』来将特殊符号 ( 如 Enter, $, \, 空格符, ' 等 ) 变成一般符号; 6. 在一串指令中,还需要藉由其它的指令提供的信息,可以使用 quote 『 ` command` 』;(特别 特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号!) 7. 若该变量为扩增变量内容时,则需以双引号及 $变量名称 如:『 "$PATH":/home』继续累加内容; 8. 若该变量需要在其它子程序执行,则需要以 export 来使变量变成环境变量, 如『export PATH』; 9. 通常大写字符为系统预设变量,自行设定变量可以使用小写字符,方便判断 ( 纯粹依照使用者兴 趣与嗜好 ) ; 10. 取消变量的方法为:『unset 变量名称』。 底下我们举几个例子来让您试看看,就知道怎么设定好您的变量啰! 范例一:设定一变量 name ,且内容为 VBird 。 [root@linux ~]# 12name=VBird -bash: 12name=VBird: command not found <==屏幕会显示错误!因为不能以数字开头! [root@linux ~]# name = VBird <==还是错误!因为有空白! [root@linux ~]# name=VBird <==OK 的啦! 范例二:承上题,若变量内容为 VBird's name 呢? [root@linux ~]# name=VBird's name # 因为单引号可以将 Enter 这个特殊字符取消,所以,您可以继续在下一行输入内容~ # 不过,这与我们要达到的功能不同,所以,算是失败的啦! [root@linux ~]# name="VBird's name" <==OK 的啦! [root@linux ~]# name=VBird\'s\ name # 利用反斜线 (\) 跳脱特殊字符,例如单引号与空格键,这也是 OK 的啦! 范例三:我要在 PATH 这个变量当中『累加』:/home/dmtsai/bin 这个目录 [root@linux ~]# PATH=$PATH:/home/dmtsai/bin [root@linux ~]# PATH="$PATH":/home/dmtsai/bin # 上面这两种格式在 PATH 里头的设定都是 OK 的!但是底下的例子就不见得啰! 范例四:呈范例三,我要将 name 的内容多出 "yes" 呢? [root@linux ~]# name=$nameyes # 知道了吧?如果没有双引号,那么变量成了啥?name 的内容是 $nameyes 这个变量! # 呵呵!我们可没有设定过 nameyes 这个变量吶!所以,应该是底下这样才对! [root@linux ~]# name="$name"yes [root@linux ~]# name=${name}yes 范例五:如何让我刚刚设定的 name=VBird 可以用在下个 shell 的程序? [root@linux ~]# name=VBird [root@linux ~]# bash <==进入到所谓的子程序 [root@linux ~]# echo $name <==嘿嘿!并没有刚刚设定的内容喔! [root@linux ~]# exit <==离开刚刚的子程序 [root@linux ~]# export name [root@linux ~]# bash <==进入到所谓的子程序 [root@linux ~]# echo $name <==出现了设定值了! [root@linux ~]# exit <==离开刚刚的子程序 # 什么是『子程序』呢?就是说,在我目前这个 shell 的情况下, # 去启用另一个新的 shell ,新的那个 shell 就是子程序啦!在一般的状态下, # 父程序的自订变量是无法在子程序内使用的。但是透过 export 将变量变成 # 环境变量后,就能够在子程序底下应用了!很不赖吧!至于程序的相关概念, # 我们会在『程序与资源管理』章节当中提到的喔! 范例六:如何进入到您目前核心的模块目录? [root@linux ~]# cd /lib/modules/`uname -r`/kernel # 每个操作系统核心版本都不相同,以 FC4 为例,他的预设核心版本是 # 2.6.11-1.1369_FC4 所以,他的模块目录在 /lib/modules/2.6.11-1.1369_FC4/kernel 。 # 因为每个 distributions 的这个值都不相同,但是我们却可以利用 uname -r 这个指令 # 先取得版本信息,所以啰,就可以透过上面指令当中的内含指令 `uname -r` # 先取得版本输出到 cd .. 那个指令当中,就能够顺利的进入目前核心的驱动程序所放置 # 的目录啰!很方便吧! 范例七:取消刚刚设定的 name 这个变量内容 [root@linux ~]# unset name 根据上面的案例你可以试试看!就可以了解变量的设定啰!这个是很重要的呦!请勤加练习!! 其中,较 为重要的一些特殊符号的使用啰!例如单引号、双引号、跳脱字符、钱字号、quote 符号等等,底下的例 题想一想吧! 例题二:在变量的设定当中,单引号与双引号的用途有何不同? 答: 单引号与双引号的最大不同在于双引号仍然可以保有变量的内容,但单引号内仅能是 一般字符 ,而不会有特殊符号。我们以底下的例子做说明:假设您定义了一个变量, name=VBird ,现在想以 name 这个变量的内容定义出 myname 显示 VBird its me 这 个内容,要如何订定呢? [root@linux ~]# name=VBird [root@linux ~]# echo $name VBird [root@linux ~]# myname="$name its me" [root@linux ~]# echo $myname VBird its me [root@linux ~]# myname='$name its me' [root@linux ~]# echo $myname $name its me 发现了吗?没错!使用了单引号的时候,那么 $name 将失去原有的变量内容, 仅为 一般字符的显示型态而已!这里必需要特别小心在意! 例题三:在指令下达的过程中, quote ( ` ) 这个符号代表的意义为何? 答: 在一串指令中,在 ` 之内的指令将会被先执行,而其执行出来的结果将做为外部的输 入信息!例如 uname -r 会显示出目前的核心版本,而我们的核心版本在 /lib/modules 里面,因此,你可以先执行 uname -r 找出核心版本,然后再以『 cd 目录』到该目 录下,当然也可以执行如同上面范例六的执行内容啰。 另外再举个例子,我们也知道, locate 指令可以列出所有的相关档案档名,但是, 如 果我想要知道各个档案的权限呢?举例来说,我想要知道每个 crontab 相关档名的权 限: [root@linux ~]# ls -l `locate crontab` 如此一来,先以 locate 将文件名数据都列出来,再以 ls 指令来处理的意思啦!瞭 了吗? ^_^ 变数的用途 我们知道 PATH 这个变量是我们在执行指令的时候,所需要具备的指令搜寻目录数据, 没有他,我们就得 要使用绝对路径来下达指令才行。当然,还有很多变量都有他特别的意义存在。 除此之外,『我为何需要 设定变量』呢? 要跟大家介绍这个『变量』,当然是因为他有相当程度的意义存在的啊! 底下就跟大家 介绍一下,鸟哥设定变量的时机喔! 我的案例一:最简单的例子就是 『简化路径名称』啰!以鸟哥为例,我的工作在 Unix 系统之下 进行一些数值模式的仿真工作,偏偏由于数据量太大, 为了怕日后忘记这个目录的内容与主要的 意义,所以我的档名都取的很长, 偏偏在执行模式的过程中,常常会切换目录!我哩ㄌㄟ,光是 打那几行路径名称就快要疯掉了! 所以我就设定那几行目录名称成为一个四个字符的变量,如此 一来我只要输入『 cd $VARI 』这个指令,嘿嘿!马上就移动到该路径下了!很方便吧!当然变 量的意义还不止于此, 不过这是最简单的实例说明啰! 我的案例二:另外一个常常需要变量的咚咚是在 scripts 里面,例如我写的一个侦测登录文件的 小程序 logfile.sh 这个咚咚, 由于里头常常需要用到『储存路径』,偏偏可能每个人的存取路 径都不太一样, 而如果要修改存取路径的话,嘿嘿!好几十行要同时修改呢!还可能会改错! 那 么我只要定义一个变量,然后后续的所有数据都使用这个变量的内容!嘿嘿! 那么只要大家修改 了这个变量的内容(只要一行),后续的动作就不需要修正了!这个动作常在程序或者是 script 当中看到的! 所以啰,有很多的时候为了方便或者是使用于 scripts 的意义,我们必须要设定变量! 当然啰,如果是 跟系统终端机环境有关的设定值,很多也是利用变量来帮助达成的~ 底下我们就来谈一谈所谓的『环境变 量』吧! 环境变量的功能 环境变量可以帮我们达到很多功能~包括家目录的变换啊、提示字符的显示啊、执行文件搜寻的路径啊等 等的, 还有很多很多啦!那么,既然环境变量有那么多的功能,问一下,目前我的 shell 环境中, 有多 少变量啊?!呵呵!我们可以利用两个指令来查阅,分别是 env 与 export 呢! • 一些环境变量的说明: env 范例一:列出目前的 shell 环境下的所有环境变量与其内容。 [root@linux ~]# env HOSTNAME=linux.dmtsai.tw <== 这部主机的主机名称 SHELL=/bin/bash <== 目前这个环境下,使用的 Shell 是哪一个程序? TERM=xterm <== 这个终端机使用的环境是什么类型 HISTSIZE=1000 <== 这个就是『记录指令的笔数』在 FC4 预设可记录 1000 笔 USER=root <== 使用者的名称啊! LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01: or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=0 0;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz= 00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.bz=00;3 1:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00 ;35:*.xpm=00;35:*.png=00;35:*.tif=00;35: <== 一些颜色显示 ENV=/root/.bashrc <== 使用的个人环境设定档 MAIL=/var/spool/mail/root <== 这个使用者所取用的 mailbox 位置 PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin: /root/bin <== 不再多讲啊!是执行文件指令搜寻路径 INPUTRC=/etc/inputrc <== 与键盘按键功能有关。可以设定特殊按键! PWD=/root <== 目前使用者所在的工作目录 (利用 pwd 取出!) LANG=en_US.UTF-8 <== 这个与语系有关,底下会再介绍! HOME=/root <== 这个使用者的家目录啊! _=/bin/env <== 上一次使用的指令的最后一个参数(或指令本身) env 是 environment (环境) 的简写啊~ 上面的例子当中,是列出来所有的环境变量。当然,如果使用 export 也会是一样的内容~ 只不过, export 还有其它额外的功能就是了,我们等一下再提这个 export 指令。 那么上面这些变量有些什么功用呢?底下我们就一个一个来分析分析! • HOME : 代表使用者的家目录。还记得我们可以使用 cd ~ 去到使用者的家目录吗?或者利用 cd 就可以直接回到使用者家目录了。那就是取用这个功能啦~ 有很多程序都可能会取用到这个变量 的值喔! • SHELL : 告知我们,目前这个环境使用的 SHELL 是哪支程序? 如果是 bash 的话,预设是 /bin/bash 的啦! • HISTSIZE : 这个与『历史命令』有关,亦即是, 我们曾经下达过的指令可以被系统记录下来, 而记录的『笔数』则是由这个值来设定的。 • ENV : 这个使用者所使用的个人化环境设定档的读取档案。 • MAIL : 当我们使用 mail 这个指令在收信时,系统会去读取的邮件信箱档案 (mailbox)。 • PATH : 就是执行文件搜寻的路径啦~目录与目录中间以冒号(:)分隔, 由于档案的搜寻是依序 由 PATH 的变量内的目录来查询,所以,目录的顺序也是重要的喔。 • LANG : 这个重要!就是语系档案啰~很多数据都会用到他, 举例来说,当我们在启动某些 perl 的程序语言档案时,他会主动的去分析语系数据文件, 如果发现有他无法解析的编码语系,可能 会产生错误喔!一般来说,我们中文编码通常是 zh_TW.Big5 或者是 zh_TW.UTF-8,这两个编码 偏偏不容易被解译出来,所以,有的时候,可能需要修订一下语系数据。 这部分我们会在下个小 节做介绍的! • RANDOM : 这个玩意儿就是『随机随机数』的变量啦!目前大多数的 distributions 都会有随机 数产生器,那就是 /dev/random 这个档案。 我们可以透过这个随机数档案相关的变量 ($RANDOM) 来随机取得随机数值喔。在 BASH 的环境下,这个 RANDOM 变量的内容,介于 0~32767 之间,所 以,你只要 echo $RANDOM 时,系统就会主动的随机取出一个介于 0~32767 的数值。万一我想要 使用 0~9 之间的数值呢?呵呵~利用 declare 宣告数值类型, 然后这样做就可以了: [root@linux ~]# declare -i number=$RANDOM*10/32767 ; echo $number 8 <== 此时会随机取出 0~9 之间的数值喔! 大致上是有这些环境变量啦~里面有些比较重要的参数,在底下我们都会另外进行一些说明的~ • 其它所有的变量说明: set 而除了这些环境变量之外,还有没有什么重要的变量呢?当然有啊! 我们在 bash 的环境下,其实还有一 些挺重要的变量,这些变量是『在这个 shell 环境下有效』的, 如果是在『子程序』,这些变量值就不 会相同了。 那么如何观察目前 shell 环境下的所有变量呢?很简单啊,就用 set 即可!set 这个指令除 了会将环境变量列出来之外,其它我们的自订变量,与所有的变量,都会被列出来喔!信息多好多。 底下 仅列出几个重要的内容。 [root@linux ~]# set BASH=/bin/bash <== bash 的主程序放置路径 BASH_VERSINFO=([0]="3" [1]="00" [2]="16" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu") <== bash 的版本啊! BASH_VERSION='3.00.16(1)-release' <== bash 的版本啊! COLORS=/etc/DIR_COLORS.xterm <== 使用的颜色纪录档案 COLUMNS=115 <== 在目前的终端机环境下,使用的字段有几个字符长度 HISTFILE=/root/.bash_history <== 历史命令记录的放置档案,隐藏档 HISTFILESIZE=1000 <== 存起来(与上个变量有关)的档案之指令的最大纪录笔数。 HISTSIZE=1000 <== 目前环境下,可记录的历史命令最大笔数。 HOSTTYPE=i386 <== 主机安装的软件主要类型。我们用的是 i386 兼容机器软件 IFS=$' \t\n' <== 预设的分隔符 LINES=35 <== 目前的终端机下的最大行数 MACHTYPE=i386-redhat-linux-gnu <== 安装的机器类型 MAILCHECK=60 <== 与邮件有关。每 60 秒去扫瞄一次信箱有无新信! OLDPWD=/home <== 上个工作目录。我们可以用 cd - 来取用这个变量。 OSTYPE=linux-gnu <== 操作系统的类型! PPID=20046 <== 父程序的 PID (会在后续章节才介绍) PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\007"' <== 上面这个是命令提示字符!与底下也有关。 PS1='[\u@\h \W]\$ ' <== PS1 就厉害了。这个是命令提示字符,也就是我们常见的 [root@linux ~]# 或 [dmtsai ~]$ 的设定值啦!可以更动的! RANDOM=13586 <== 随机数啊!上面已经提过啰~ SUPPORTED=zh_TW.UTF-8:zh_TW:zh:en_US.UTF-8 <== 本系统所支持的语系 name=VBird <== 刚刚设定的自订变量也可以被列出来喔! $ <== 目前这个 shell 所使用的 PID ? <== 刚刚执行完指令的回传值。 一般来说,不论是否为环境变量,只要跟我们目前这个 shell 的操作接口有关的变量, 通常都会被设定 为大写字符,也就是说,『基本上,在 Linux 预设的情况中,使用{大写的字母}来设定的变量一般为系统 内定需要的变量』。 使用 set 除了会将系统的默认值秀出来之外,连带的所有的你自己设定的变量也会被秀出来! 同时需要 注意的是,若当时有相当多人同时在在线的话,那么 你的变量只能给自己使用 ( 除非改的是系统的预设 参数档,如 /etc/profile ),而不会干扰到别人的!就如同前面所说的, 由于你登入 Linux 之后会取得 一个 PID ,而你的设定将只对这个 PID 与子程序有关!此外, 这次登入所进行的变量设定,如果没有更 动到设定档, 那么这次设定的变量在下次登入时将被取消掉 ( 因为程序 PID 不见啰! ) !所以啰, 如 果你想要你的变量每次都能在你登入的时候自动就设定好了,那么就必须将你的设定写入登入时加载的设 定档! ( 更多的程序相关的说明,不要急~我们会在后面的 程序与资源管理 当中好好的提一提的! ) OK!OK!那么上头那些变量当中,有哪些是比较重要的?大概有这几个吧! • PS1:(提示字符的设定) 这是 PS1 (数字的 1 不是英文字母!),这个东西就是我们的『命令提示字符』啊! 当我们每次 按下 [Enter] 按键去执行某个指令后,最后要再次出现提示字符时, 就会主动去读取这个变数 值了。上头 PS1 内显示的是一些特殊符号,每个版本 bash 的 PSI 变量内的特殊符号可能有些 许的差异, 你应该主动的以 man bash 去查询一下相关的变数。底下我列出 FC4 的环境下, 预 设的 bash 的 PS1 变量内的特殊符号代表意义: o \d :代表日期,格式为 Weekday Month Date,例如 "Mon Aug 1" o \H :完整的主机名称。举例来说,鸟哥的练习机 linux.dmtsai.tw ,那么这个主机名 称就是 linux.dmtsai.tw o \h :仅取主机名称的第一个名字。以上述来讲,就是 linux 而已, .dmtsai.tw 被省 略。 o \t :显示时间,为 24 小时格式,如: HH:MM:SS o \T :显示时间,12 小时的时间格式! o \A :显示时间,24 小时格式, HH:MM o \u :目前使用者的账号名称; o \v :BASH 的版本信息; o \w :完整的工作目录名称。家目录会以 ~ 取代; o \W :利用 basename 取得工作目录名称,所以仅会列出最后一个目录名。 o \# :下达的第几个指令。 o \$ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $ 啰~ OK!所以,由预设的 PS1 内容为: '\[\u@\h \W\]\$ ' 就可以了解为何我们的提示字符会是: [root@linux ~]# 了吧!好了,那么假设我想要有类似底下的提示字符: [root@linux /home/dmtsai 16:50 #12]# ,那个 # 代表第 12 次下达的指令。 那么应该如何设定 PS1 呢?可以这样啊: [root@linux home]# PS1='[\u@\h \w \A #\#]\$ ' [root@linux /home 17:02 #85]# # 看到了吗?提示字符变了!变的很有趣吧!其中,那个 #85 比较有趣, # 如果您按下 [Enter] 后,该数字就会增加喔!为啥?上面有说明ㄇㄟ! • $:(关于本 shell 的 PID) 其实这个咚咚代表的是『目前这个 Shell 的执行绪代号』,亦即是所谓的 PID (Process ID)。 更 多的程序观念,我们会在第四章的时候提及。想要知道我们的 shell 的 PID ,就可以: echo $$ 即可! • ?:(关于上个执行指令的回传码) 虾密?问号也是一个特殊的变数?没错!在 bash 里面这个变量可重要的很! 这个变数是:『上 个执行的指令所回传的值』, 上面这句话的重点是『上一个指令』与『回传值』两个地方。当我 们执行某些指令时, 这些指令都会回传一个执行后的代码。一般来说,如果成功的执行该指令, 则会回传一个 0 值,如果执行过程发生错误,就会回传『错误代码』才对!一般就是以非为 0 的 数值来取代。 我们以底下的例子来看看: [root@linux ~]# echo $SHELL /bin/bash [root@linux ~]# echo $? 0 # 因为上个指令执行过程中,并没有错误,为成功的执行完毕,所以回传 0 。 [root@linux ~]# 12name=VBird -bash: 12name=VBird: command not found [root@linux ~]# echo $? 127 # 发生错误啦!所以 echo $? 时,就会出现错误的代码! # 我们可以利用这个代码来搜寻错误的原因喔! [root@linux ~]# echo $? 0 # 咦!怎么又变成正确了?这是因为 "?" 只与『上一个执行指令』有关, # 所以,我们上一个指令是执行『 echo $? 』,当然没有错误,所以是 0 没错! • OSTYPE, HOSTTYPE, MACHTYPE:(主机硬件与核心的等级) 这几个东西与程序的安装有关。我们在『Linux 主机规划』 里面提到过关于主机的等级方面的问 题,当我们在安装软件的时候, 需要透过编译器来将原始码编译成为二进制的档案 (binary file)。但是, 我们可以针对硬件的配备来进行编译的最佳化,此时,这些参数就可以被用到了! 基本上,目前主要的 distribution 都是针对 i386 亦即最低等级的机器进行最佳化, 这样才能 够安装在较高阶的机器上,如果以 686 的机型来最佳化, 那么,可就无法向下兼容的喔!(早期 的 OpenLinux 是针对 686 机器来释出软件, 所以,当时的 OpenLinux 是无法安装在 P-166 的 机器上的。 ) 自订变量转成环境变量: export 好了,上面我们环境变量也提过了,一些自订变量也提过了,那么,这两者有啥不同? 他的不同处,我们 在 变量设定规则 当中稍微提过, 主要是由于变量可否被子程序所引用。 当你取得一个 bash 之后,亦即得到了一个程序了,但是若你再次的执行一次 bash ,那么你将进入『子 程序』,这个程序的概念我们在资源管理章节中再详谈,这里您先有个概念即可。 那么由于您已经进入了 该子程序,所以在父程序中的自订变量设定将不再继续的存在。 会存在子程序中的,仅有『环境变量』。 换个角度来想,也就是说,如果我能将自订变量变成环境变量的话,那不就可以让该变量值继续存在于子 程序了? 呵呵!没错!此时,那个 export 指令就很有用啦! 如您想要让该变量内容继续的在子程序中 使用,那么就请执行: export 变数 这个东西用在『引用他人的档案或者其它程序』时,相当的重要的! 尤其像鸟哥常常两三个档案互相引用 来引用去的,如果忘记设定 export 的话,那么不同的档案中的相同变量值,将需要一再地重复设定才行! 所以,我只要在头一个档案使用 export 的话,那么后续的档案引用时,将会把该变量内容读进来!好用 的很,如果仅下达 export 而没有接变量时,那么此时将会把所有的『环境变量』秀出来喔!例如: [root@linux ~]# export declare -x ENV="/root/.bashrc" declare -x HISTSIZE="1000" declare -x HOME="/root" declare -x HOSTNAME="linux.dmtsai.tw" declare -x INPUTRC="/etc/inputrc" declare -x LANG="en_US.UTF-8" declare -x MAIL="/var/spool/mail/root" declare -x SHELL="/bin/bash" # 很多都直接省略了!不然....重复性太高,浪费版面~ ^_^ 语系档案的变量 (locale) 还记得我们在首次进入 Linux 那个章节里面提到的,关于语系编码的问题吗? 就是当我们使用 man command 的方式去查询某个数据的说明文件时,该说明档的内容可能会因为我们使用的语系, 而产生一些 乱码。另外,利用 ls 查询档案的时间时,也可能会有乱码出现在时间的部分。 那个问题其实就是语系的 问题啦。 目前大多数的 Linux distributions 已经都是支持万国码,此外,也都支持大部分的语言语系了。 这有 赖于 i18n 支援的帮助呢! 那么我们的 Linux 到底支持了多少的语系呢?这可以由 locale 这个指令来 查询到喔! [root@linux ~]# locale -a aa_DJ aa_DJ.iso88591 en_US en_US.iso88591 en_US.iso885915 en_US.utf8 zh_TW zh_TW.big5 zh_TW.euctw zh_TW.utf8 # 其实输出的内容有很多,鸟哥将一些信息舍弃了~ # 从上面的输出中,我们也不难看出,系统是有支持 big5, utf8 等中文语系数据的! 中文语系至少支持了两种以上的编码,一种是目前还是很常见的 big5 ,另一种则是越来越热门的 utf-8 编码。 那么我们如何修订这些编码呢?其实可以透过底下这些变量的说: [root@linux ~]# LANG <==主语言的环境 [root@linux ~]# LC_CTYPE <==字符辨识的编码 [root@linux ~]# LC_NUMERIC <==数字系统的显示讯息 [root@linux ~]# LC_TIME <==时间系统的显示数据 [root@linux ~]# LC_COLLATE <==字符串的比较与排序等 [root@linux ~]# LC_MONETARY <==币值格式的显示等 [root@linux ~]# LC_MESSAGES <==讯息显示的内容,如菜单、错误讯息等 [root@linux ~]# LC_ALL <==语言环境的整体设定。 基本上,你可以逐一设定每个与语系有关的变量数据,但事实上,如果其它的语系变量都未设定, 且您有 设定 LANG 或者是 LC_ALL 时,则其它的语系变量就会被这两个变量所取代! 这也是为什么我们在 FC4 当 中,通常仅设定 LANG 这个变量而已!因为他是最主要的设定变量。 好了,那么你应该要觉得奇怪的是, 为什么在 Linux 主机的终端机接口 (tty1 ~ tty6) 的环境下,如果 LANG=zh_TW.big5 这个设定值生效后, 使用 man 或者其它讯息输出时, 都会有一堆乱码,尤其是使用 ls -l 这个参数时? 因为在 Linux 主机的终端机接口下,那个环境是无法显示像中文这么复杂的编码的文字, 所以,就会产 生乱码了。也就是如此,所以,我们才会必须要在 tty1 ~ tty6 的环境下, 加装一些中文化接口的软件, 才能够看到中文啊!不过,如果您是在 Windows 主机以远程联机服务器的软件联机到主机的话,那么,嘿 嘿!其实文字接口确实是可以看到中文的。 所以,此时反而您得要在 LANG 设定中文编码才好呢! 无论如何,如果发生一些乱码的问题,那么设定系统里面保有的语系编码, 例如: en_US 或 en_US.utf8 等等的设定,应该就 OK 的啦!好了,那么系统预设支持多少种语系呢? 当我们使用 locale 时,系统是 列出目前 Linux 主机内保有的语系档案, 这些语系档案都放置在: /usr/lib/locale/ 这个目录中。 但 是,目前的这个 shell 环境所支持的语系,则是要看 SUPPORTED 这个变数才对喔! 那么,如果我想要修订系统的语系支持呢?可以修订 /etc/sysconfig/i18n 这个档案呢! 这个档案的内 容有点像这样: [root@linux ~]# vi /etc/sysconfig/i18n LANG="en_US.UTF-8" SYSFONT="latarcyrheb-sun16" SUPPORTED="zh_TW.UTF-8:zh_TW:zh:en_US.UTF-8" 你可以在这个档案当中加入 LC_TIME 或者其它语系相关变量的设定内容, 也可以直接修改 LANG 那个变 量即可啊! ^_^ 但,事实上,我们还可以透过个人的环境设定档来设定 LANG 呢! 如此一来,则不必修 订系统的语系档案,比较安全啦! Tips: 假设你用 vi 编辑一个纯文字文件,这个纯文字文件在编辑的时 候,是在 Windows 上面编辑的, 那么这个档案的预设编码应该是 以 zh_TW.big5 所编辑的才对。但是,如果你的 shell 环境中,却 是使用 LANG=en_US 时,则当你编辑该档案时,就可能会看到『乱 码』, 或者输入的中文可能会变成『乱码』了。此时,只要你离 开 vi ,然后执行 LANG=zh_TW.big5 , 然后再重新以 vi 编辑该 档案,呵呵!应该就能够看到中文啦!但是请注意, 这个方法当 然不适用 tty1 ~ tty6 的环境,原因上面已经提过啰~ 仅适合以 类似 putty 软件由 Windows 计算机联机到 linux 主机上的做 业! 变量的有效范围 虾密??变量也有使用的『范围』?没错啊~我们在上头的 export 指令说明中,就提到了这个概念了。 如果在跑程序的时候,有父程序与子程序的不同程序关系时, 则『变量』可否被引用是 export 有关。被 export 后的变量,我们可以称他为『环境变量』! 环境变量可以被子程序所引用,但是其它的自订变量 内容就不会存在于子程序中。也就是说: 我们自行设定的变量,只在目前这个 shell 环境当中存在, 在 子程序中将不会存在此一变量。除非使用 export 将自订变量变成环境变量。 其实除了 shell 的父、子程序外,在脚本( scripts )的编写当中,由于有的软件会使用到 2 个以上的 scripts 做为一个完整的套件!也就是说,假如你有两支程序,一支为 scripts1.sh 以及 scripts2.sh , 而 scripts2.sh 会去引用 scripts1.sh 的变数,这个时候,嘿嘿!你在 scripts1.sh 当中设定的变量请 『千万记得以 export 设定』, 否则你的变量将无法在两个 scripts 之间互相被引用喔!当这个 scripts 执行完毕之后,刚刚在 scripts 当中设定的变量也就『失效了!』。 其实,要了解不同程序之间变量的变换,应该要先了解『程序』的概念比较好, 但是我们还没有讲到..... 没关系~等你念到程序章节后,还可以再回来好好的看一看。 基本上,环境变量可以让子程序继续引用的 原因,是因为: • 当启动一个 shell ,操作系统分配一记忆区块给 shell 使用,此区域之变量可以让子程序存取; • 利用 export 功能,可以让变量的内容写到上述的记忆区块当中(环境变量); • 当加载另一个 shell 时 (亦即启动子程序,而离开原本的父程序了),子 shell 可以将父 shell 的环境变量所在的记忆区块导入自己的环境变量区块当中。 透过这样的关系,我们就可以让某些变量可以在相关的程序之间存在,以帮助自己更方便的操作环境喔! 变量键盘读取、数组与宣告: read, array, declare 我们上面提到的变量设定功能,都是直接由指令列直接设定的,那么,可不可以让使用者能够经由键盘输 入? 什么意思呢?是否记得某些程序执行的过程当中,会等待使用者输入 "yes/no" 之类的讯息啊!? 在 bash 里面也有相对应的功能喔!此外,我们还可以宣告这个变量的属性, 例如:数组或者是数字等等的。 底下就来看看吧! • read 要读取来自键盘输入的变量,就是用 read 这个指令了。这个指令最常被用在 shell script 的撰写当中, 以跟使用者进行对谈。关于 script 的写法,我们会在后面章节介绍,底下先来瞧一瞧 read 的相关语法 吧! [root@linux ~]# read [-pt] variable 参数: -p :后面可以接提示字符! -t :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者啦! 范例: 范例一:让使用者由键盘输入一内容,将该内容变成 atest 变量 [root@linux ~]# read atest This is a test [root@linux ~]# echo $atest This is a test 范例二:提示使用者 30 秒内输入自己的大名,将该输入字符串做成 named 变量 [root@linux ~]# read -p "Please keyin your name: " -t 30 named Please keyin your name: VBird Tsai [root@linux ~]# echo $named VBird Tsai read 之后不加任何参数,直接加上变量名称,那么底下就会主动出现一个空白行,等待您输入。 如果加 上 -t 后面接秒数之后,例如上面的范例当中,那么 30 秒之内没有任何动作时,该指令就会自动略过了~ 如果是加上 -p ,嘿嘿!后面就会有比较多可以用的提示字符给我们参考! 在指令的下达里面,比较美观 啦! ^_^ • declare / typeset declare 或 typeset 是一样的功能,就是在宣告变量的属性。如果使用 declare 后面并没有接任何参数, 那么 bash 就会主动的将所有的变量名称与内容通通叫出来,就好像使用 set 一样啦! 那么 declare 还 有什么语法呢?看看先: [root@linux ~]# declare [-aixr] variable 参数: -a :将后面的 variable 定义成为数组 (array) -i :将后面接的 variable 定义成为整数数字 (integer) -x :用法与 export 一样,就是将后面的 variable 变成环境变量; -r :将一个 variable 的变量设定成为 readonly ,该变量不可被更改内容,也不能 unset 范例: 范例一:让变量 sum 进行 100+300+50 的加总结果 [root@linux ~]# sum=100+300+50 [root@linux ~]# echo $sum 100+300+50 <==咦!怎么没有帮我计算加总?因为这是文字型态的变量属性啊! [root@linux ~]# declare -i sum=100+300+50 [root@linux ~]# echo $sum 450 <==瞭乎?? 范例二:将 sum 变成环境变量 [root@linux ~]# declare -x sum 范例三:让 sum 变成只读属性,不可更动! [root@linux ~]# declare -r sum [root@linux ~]# sum=tesgting -bash: sum: readonly variable <==老天爷~不能改这个变数了! declare 也是个很有用的功能~尤其是当我们需要使用到底下的数组功能时, 他也可以帮我们宣告数组的 属性喔!不过,老话一句,数组也是在 shell script 比较常用的啦! • 数组属性 array 说明 某些时候,我们必须使用数组来宣告一些变量,这有什么好处啊?在一般人的使用上, 果然是看不出来有 什么好处的!不过,如果您曾经写过程序的话,那才会比较了解数组的意义~ 数组对写数值程序的设计师 来说,可是不能错过学习的重点之一哩!好!不啰唆~ 那么要如何设定数组的变量与内容呢?在 bash 里 头,数组的设定方式是: var[index]=content 意思是说,我有一个数组名为 var ,而这个数组的内容为 var[1]=小明,var[2]=大明,var[3]=好明 .... 等等,那个 index 就是一些数字啦,重点是用中刮号 ([ ]) 来设定的。 目前我们 bash 提供的是一维数 组。老实说,如果您不必写一些复杂的程序, 那么这个数组的地方,可以先略过,等到有需要再来学习即 可!因为要制作出数组, 通常与循环或者其它判断式交互使用才有比较高的意义存在! 范例:设定上面提到的 var[1] ~ var[3] 的变数。 [root@linux ~]# var[1]="small min" [root@linux ~]# var[2]="big min" [root@linux ~]# var[3]="nice min" [root@linux ~]# echo "${var[1]}, ${var[2]}, ${var[3]}" 比较有趣的地方在于『读取』,一般来说,建议直接以 ${数组} 的方式来读取, 比较正确无误的啦! 与档案系统及程序的限制关系: ulimit 想象一个状况:我的 Linux 主机里面同时登入了十个人,这十个人不知怎么搞的, 同时开启了 100 个档 案,每个档案的大小约 10MBytes ,请问一下,我的 Linux 主机的内存要有多大才够? 10*100*10 = 10000 MBytes ~~ 老天爷,这样,系统不挂点才有鬼哩!为了要预防这个情况的发生,所以, 我们的 bash 是 可以『限制使用者的某些系统资源』的,包括可以开启的档案数量, 可以使用的 CPU 时间,可以使用的 内存总量等等。如何设定?用 ulimit 吧! [root@linux ~]# ulimit [-SHacdflmnpstuv] [配额] 参数: -H :hard limit ,严格的设定,必定不能超过设定的值; -S :soft limit ,警告的设定,可以超过这个设定值,但是会有警告讯息, 并且,还是无法超过 hard limit 的喔!也就是说,假设我的 soft limit 为 80 , hard limit 为 100 ,那么我的某个资源可以用到 90 , 可以超过 80 ,还是无法超过 100 ,而且在 80~90 之间,会有警告讯息的意思。 -a :列出所有的限制额度; -c :可建立的最大核心档案容量 (core files) -d :程序数据可使用的最大容量 -f :此 shell 可以建立的最大档案容量 (一般可能设定为 2GB)单位为 Kbytes -l :可用于锁定 (lock) 的内存量 -p :可用以管线处理 (pipe) 的数量 -t :可使用的最大 CPU 时间 (单位为秒) -u :单一使用者可以使用的最大程序(process)数量。 范例: 范例一:列出所有的限制数据 [root@linux ~]# ulimit -a 范例二:限制使用者仅能建立 1MBytes 以下的容量的档案 [root@linux ~]# ulimit -f 1024 还记得我们在 Linux 磁盘档案系统 里面提到过,单一 filesystem 能够支持的单一档案大小与 block 的 大小有关。例如 block size 为 1024 byte 时,单一档案可达 16GB 的容量。但是,我们可以用 ulimit 来 限制使用者可以建立的档案大小喔! 利用 ulimit -f 就可以来设定了!例如上面的范例二,要注意单位 喔!单位是 Kbytes。 若改天你一直无法建立一个大容量的档案,记得瞧一瞧 ulimit 的信息喔!( 不过, 要注意的是,一般身份使用者如果以 ulimit 设定了 -f 的档案大小, 那么他『只能减小档案大小,不能 增加档案大小喔!』) 额外的变量设定功能 刚刚我们提到了两种变量取用的方法,分别是这样: [root@linux ~]# echo $HOME [root@linux ~]# echo ${HOME} 那么,在那个 ${variable} 的使用方法中,其实,我们还可以将变量进行一些修订的工作喔! 只要加上 一些字符标志,后面再接着使用比对字符串,就能够修改变量的内容了! 我们取底下的例子来说明:在底 下的例子中,假设我的变量名称为 vbird ,且内容为 /home/vbird/testing/testing.x.sh。 1. 完整呈现 vbird 这个变量的内容; [root@linux ~]# vbird="/home/vbird/testing/testing.x.sh" [root@linux ~]# echo ${vbird} /home/vbird/testing/testing.x.sh 2. 在 vbird 变量中,从最前面开始比对,若开头为 / ,则删除两个 / 之间的所有数据,亦即 /*/ [root@linux ~]# echo ${vbird##/*/} testing.x.sh <==删除了 /home/vbird/testing/ [root@linux ~]# echo ${vbird#/*/} vbird/testing/testing.x.sh <==仅删除 /home/ 而已 # 这两个小例子有趣了~变量名称后面如果接了两个 ## ,表示在 ## # 后面的字符串取『最长的』那一段;如果仅有一个 # ,表示取『最小的那一段』喔! 3. 承上题,如果是从后面开始,删除 /* 呢? [root@linux ~]# echo ${vbird%%/*/} /home/vbird/testing/testing.x.sh <==都没被删除 [root@linux ~]# echo ${vbird%%/*} <==被删除光了! [root@linux ~]# echo ${vbird%/*} /home/vbird/testing <==只删除 /testing.x.sh 部分 # 这个例子当中需要特别注意,那个 % 比对的是『最后面那个字符』的意思, # 所以啰,第一个方式当然不对~因为 vbird 这个变量的内容最后面是 h 而不是 / 啊! # 至于 %%/* 则是删除『最长的那个 /* 』,当然就是全部喔!而 %/* 则是最短的那个! 4. 将 vbird 变数中的 testing 取代为 TEST [root@linux ~]# echo ${vbird/testing/TEST} /home/vbird/TEST/testing.x.sh [root@linux ~]# echo ${vbird//testing/TEST} /home/vbird/TEST/TEST.x.sh # 如果变量后面接的是 / 时,那么表示后面是进行『取代』的工作~而且仅取代『第一个』 # 但如果是 // ,则表示全部的字符串都取代啊! 这里您稍微留意一下就好了~反正就是变量后面可以接 #, ##, %, %%, /, // , 而他们存在的意义并不 相同的啦~ 另外,几个不同的变量内容还可以进行判断呢!举例来说,目前我需要用到两个变量,分别是 var 与 str , 那我想要针对 str 这个变量内容是否有设定成一个字符串,亦即 "expr" 来决定 var 的内容。 那我可以 使用什么方法来进行判断呢?如果您会写 shell script 的话, 直接用 shell script 就好了,如果不会 写,那么我们就透过简单的变量判断吧! Tips: 底下的例子当中,那个 var 与 str 为变量,我们想要针对 str 是 否有设定来决定 var 的值喔! 一般来说, str: 代表『str 没设 定或为空的字符串时』;至于 str 则仅为『没有该变数』。 变量设定方式 str 没有设定 str 为空字符串 str 已设定非为空字符串 var=${str-expr} var=${str:-expr} var=${str+expr} var=${str:+expr} var=${str=expr} var=${str:=expr} var=${str?expr} var=${str:?expr} var=expr var=expr var=expr var=expr str=expr var=expr str=expr var=expr expr 输出至 stderr expr 输出至 stderr var= var=expr var=expr var= str 不变 var= str=expr var=expr var= expr 输出至 stderr var=$str var=$str var=expr var=expr str 不变 var=$str str 不变 var=$str var=str var=str 根据上面这张表,我们来进行几个范例的练习吧! ^_^ 范例一:若 str 这个变量内容存在,则 var 设定为 str ,否则 var 设定为 "newvar" [root@linux ~]# unset str; var=${str-newvar} [root@linux ~]# echo var="$var", str="$str" var=newvar, str= <==因为 str 不存在,所以 var 为 newvar [root@linux ~]# str="oldvar"; var=${str-newvar} [root@linux ~]# echo var="$var", str="$str" var=oldvar, str=oldvar <==因为 str 存在,所以 var 等于 str 的内容 范例二:若 str 不存在,则 var 与 str 均设定为 newvar,否则仅 var 为 newvar [root@linux ~]# unset str; var=${str=newvar} [root@linux ~]# echo var="$var", str="$str" var=newvar, str=newvar <==因为 str 不存在,所以 var/str 均为 newvar [root@linux ~]# str="oldvar"; var=${str=newvar} [root@linux ~]# echo var="$var", str="$str" var=oldvar, str=oldvar <==因为 str 存在,所以 var 等于 str 的内容 范例三:若 str 这个变量存在,则 var 等于 str ,否则输出 "novar" [root@linux ~]# unset str; var=${str?novar} -bash: str: novar <==因为 str 不存在,所以输出错误讯息 [root@linux ~]# str="oldvar"; var=${str?novar} [root@linux ~]# echo var="$var", str="$str" var=oldvar, str=oldvar <==因为 str 存在,所以 var 等于 str 的内容 # 上面这三个案例都没有提到当 str 有设定,且为空字符串的情况喔! # 您可以自行测试一下哩! 虽然猛一看,觉得变量没有什么奇特的地方,但是,如果仔细瞧一瞧,嘿!一堆环境变量与系统资源方面 的变量, 可是会影响到我们在 bash 里头是否能够顺利作业的呢!例如 PATH 啊、ulimit 之类的~ 所以, 您还是得要了解变量这个玩意才行喔! ^_^ 命令别名与历史命令: 我们知道在早期的 DOS 年代,清除屏幕上的信息可以使用 cls 来清除,但是在 Linux 里面, 我们则是 使用 clear 来清除画面的。那么可否让 cls 等于 clear 呢?可以啊!用啥方法? link file 还是什么 的?别急!底下我们介绍不用 link file 的命令别名来达成。那么什么又是历史命令? 曾经做过的举动 我们可以将他记录下来喔!那就是历史命令啰~底下分别来谈一谈这两个玩意儿。 命令别名设定: alias, unalias 命令别名是一个很有趣的东西,特别是你的惯用指令特别长的时候!还有, 增设预设的属性在一些惯用的 指令上面,可以预防一些不小心误杀档案的情况发生的时候! 举个例子来说,如果你要查询隐藏档,并且 需要长的列出与一页一页翻看,那么需要下达『 ls -al | more 』这个指令,我是觉得很烦啦! 要输入 好几个单字!那可不可以使用 lm 来简化呢?!当然可以,你可以在命令列下面下达: [root@linux ~]# alias lm='ls -l | more' 嘿嘿!我立刻多出了一个可以执行的指令喔!这个指令名称为 lm ,且其实他是执行 ls -al | more 啊! 真是方便。不过, 要注意的是:『alias 的定义规则与变量定义规则几乎相同』, 所以你只要在 alias 后 面加上你的 {『别名』='指令 参数' }, 以后你只要输入 lm 就相当于输入了 ls -al|more 这一串指令! 很方便吧! 另外,命令别名的设定还可以取代既有的指令喔!举例来说,我们知道 root 可以移除( rm )任何数据! 所以当你以 root 的身份在进行工作时,需要特别小心, 但是总有失手的时候,那么 rm 提供了一个参数 来让我们确认是否要移除该档案,那就是 -i 这个参数!所以,你可以这样做: [root@linux ~]# alias rm='rm -i' 嘿嘿!那么以后使用 rm 的时候,就不用太担心会有错误删除的情况了!这也是命令别名的优点啰! 那么 如何知道目前有哪些的命令别名呢?就使用 alias 呀! [root@linux ~]# alias alias l.='ls -d .* --color=tty' alias ll='ls -l --color=tty' alias lm='ls -al | more' alias ls='ls --color=tty' alias vi='vim' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' 由上面的资料当中,您也会发现一件事情啊,我们在 vi 文书编辑器 里面提到 vi 与 vim 是不太一样的, vi 是比较老,而 vim 可以用来取代 vi 喔。我们的 FC4 明明就同时有 vi/vim , 为何我执行 vi 会是 进入 vim 呢?呵呵!那就是因为上面的表格当中的『 alias vi='vim' 』这个设定啦! 至于如果要取消 命令别名的话,那么就使用 unalias 吧!例如要将刚刚的 lm 命令别名拿掉,就使用: [root@linux ~]# unalias lm 那么命令别名与变量有什么不同呢?基本上,他们的意义就不太一样了! alias 这种命令别名,你可以将 他想成是建立一个新的指令名称, 至于变量则仅是将一个数值或者字符串存在某个代表意义当中!举个例 子好了,我们知道以前的 DOS 年代,列出目录与档案就是 dir ,而清除屏幕就是 cls ,那么如果我想要 在 linux 里面也使用相同的指令呢?那就以 alias 来进行指令的别名设定: alias cls='clear' alias dir='ls -l' 只要加入这两行,以后你输入 cls 及 dir 就可以执行了!很方便吧! 历史命令:history 前面我们提过 bash 有提供指令历史的服务!那么如何查询我们曾经下达过的指令呢?就使用 history 啰!当然,如果觉得 histsory 要输入的字符太多太麻烦,可以使用命令别名来设定呢! 不要跟我说还不 会设定呦! ^_^ alias h='history' 如此则输入 h 等于输入 history 啰!好了,我们来谈一谈 history 的用法吧! [root@linux ~]# history [n] [root@linux ~]# history [-c] [root@linux ~]# history [-raw] histfiles 参数: n :数字,意思是『要列出最近的 n 笔命令列表』的意思! -c :将目前的 shell 中的所有 history 内容全部消除 -a :将目前新增的 history 指令新增入 histfiles 中,若没有加 histfiles , 则预设写入 ~/.bash_history -r :将 histfiles 的内容读到目前这个 shell 的 history 记忆中; -w :将目前的 history 记忆内容写入 histfiles 中! 范例: 范例一:列出目前内存内的所有 history 记忆 [root@linux ~]# history # 前面省略 1017 man bash 1018 ll 1019 history 1020 history # 列出的信息当中,共分两栏,第一栏为该指令在这个 shell 当中的代码, # 另一个则是指令本身的内容喔!至于会秀出几笔指令记录,则与 HISTSIZE 有关! 范例二:列出目前最近的 3 笔资料 [root@linux ~]# history 3 1019 history 1020 history 1021 history 3 范例三:立刻将目前的资料写入 histfile 当中 [root@linux ~]# history -w # 在预设的情况下,会将历史纪录写入 ~/.bash_history 当中! [root@linux ~]# echo $HISTSIZE 1000 在正常的情况下,当我们以 bash 登入 Linux 主机之后,系统会主动的由家目录的 ~/.bash_history 读 取以前曾经下过的指令,那么 ~/.bash_history 会记录几笔数据呢?这就与你 bash 的 HISTSIZE 这个变 量设定值有关了!在预设的 FC4 底下,是会记录 1000 笔数据的! 那么假设我这次登入主机后,共下达 过 100 次指令,『等我注销时, 系统就会将 101~1100 这总共 1000 笔历史命令更新到 ~/.bash_history 当中。』 也就是说,历史命令在我注销时,会将最近的 HISTSIZE 笔记录到我的纪录文件当中啦! 当然, 也可以用 history -w 强制立刻写入的!那为何用『更新』两个字呢? 因为 ~/.bash_history 记录的笔 数永远都是 HISTSIZE 那么多,旧的讯息会被主动的拿掉! 仅保留最新的! 那么 history 这个历史命令只可以让我查询命令而已吗?呵呵!当然不止啊! 我们可以利用相关的功能 来帮我们执行命令呢!举例来说啰: [root@linux ~]# !number [root@linux ~]# !command [root@linux ~]# !! 参数: number :执行第几笔指令的意思; command :由最近的指令向前搜寻『指令串开头为 command』的那个指令,并执行; !! :就是执行上一个指令(相当于按↑按键后,按 Enter) 范例: [root@linux ~]# history 66 man rm 67 alias 68 man history 69 history [root@linux ~]# !66 <==执行第 66 笔指令 [root@linux ~]# !! <==执行上一个指令,本例中亦即 !66 [root@linux ~]# !al <==执行最近以 al 为开头的指令(上头列出的第 67 个) 经过上面的介绍,瞭乎?历史命令用法可多了!如果我想要执行上一个指令, 除了使用上下键之外,我可 以直接以『 !! 』 来下达上个指令的内容,此外, 我也可以直接选择下达第 n 个指令,『 !n 』来执行, 也可以使用指令标头,例如 『 !vi 』来执行最近指令开头是 vi 的指令列!相当的方便而好用!基本上 history 的用途很大的!但是需要小心安全的问题!尤其是 root 的历史纪录档案,这是 Cracker 的最爱! 因为不小心的 root 会将很多的重要数据在执行的过程中会被纪录在 ~/.bash_history 当中,如果这个档 案被解析的话,后果不堪吶!无论如何,使用 history 配合『 ! 』曾经使用过的指令下达是很有效率的 一个指令方法! Bash Shell 使用环境: 是否记得我们登入主机的时候,屏幕上头会有一些说明文字,告知我们的 Linux 版本啊什么的, 还有, 登入的时候,我们还可以给予使用者一些讯息或者欢迎文字呢。此外, 我们习惯的环境变量、命令别名等 等的,是否可以登入就主动的帮我设定好? 这些都是需要来注意的。另外,这些设定值又可以分为系统整 体设定值与各人喜好设定值, 仅是一些档案放置的地点不同啦!这我们后面也会来谈一谈的! 绝对路径与相对路径 这个议题说到快要烂掉了~从一开始到现在,这个绝对路径与相对路径的问题我们就提到不知道多少次了, 因为他实在很重要~这与 PATH 这个变量关系很大!老实说, 万一你的 PATH 没有设定完整的时候,下达 指令就必须要以『 一长列的指令连带根目录都要列出来 』,呵呵那就是绝对路径的设定法啦! 基本上, 这个『 绝对路径』与『相对路径 』的观念是很重要的!否则你将常常会找不到档案说! 所谓的『绝对路 径』就是以根目录开始写入到档案的一种命令写定方法,举例来说,我目前在 /home/test 这个 test 使 用者的家目录中,我想要看看里面的 .bashrc 这个档案的数据,使用的是 more 这个指令,而这个指令在 /bin/more 当中,则正确的下达指令的方法为: [root@linux ~]# /bin/more .bashrc 我在的目录为 /home/test !这是绝对路径写法! 而如果你还记得我们在 Linux 档案与目录管理 那一篇 文章中提到的观念的话,那么应该记得使用 ls -al 时会出现两个一定存在的目录,分别是『.』与『..』, 分别代表是『这个路径』,与『上一层路径』! [root@linux ~]# ls -al drwxrwxr-x 2 root root drwxrwxr-x 2 root root 4096 Aug 15 11:05 . 4096 Aug 14 23:26 .. 所以说,要执行上一层目录中的命令,可以下达『../command 』那个 command 指的是存在的可执行档! 那么我因为在 /home/test 里面,距离 /bin 有两层上层目录,所以我要使用 /bin/more 这个执行档,并 且使用相对路径的方法,就必须使用: [root@linux ~]# ../../bin/more .bashrc 这种相对路径的方法相当广泛的被运用于 script 当中,这是因为如前面提到的, 每个人的安装预设的目 录都不相同,则使用相对路径的话, 很容易就可以找到套件之间相依软件或者是设定档案的相关性! 例题:关于路径搜寻的问题!为何不执行目前所在目录下的档案? 答: 咦!刚刚不是提到『.』与『..』吗?那么那个『 . 』是干嘛用的?!眼尖的朋友应 该已经发现了,就是『我在执行档案的时候,基本上,并不会主动搜寻目前目录下的 档案』举个例子来说,我安装的 squid 这个执行档在 /usr/local/squid/bin/squid 这个档案,然而我在 /usr/local/squid/bin 下达 squid 的时候,系统会告诉你『查 不到这个档案!』真是见鬼了!明明有这个档案的呀!这是因为系统预设的 PATH (路 径) 并没有执行目前目录下的设定,也就是『.』这个路径!你可以使用『 echo $PATH 』 看看,就可以知道为什么了! 那么为何不要设定这个路径呢?这是因为『 安全』的考虑。由于系统预设是允许任何 人在 /tmp 底下写入任何档案的,那么万一有居心不良的使用者或者是 Cracker 入侵 你的计算机,并在你的 /tmp 里头埋了一个小木马,并取名为 ls ,好了,改天你以 root 身份登入后,到 /tmp 底下,并执行 ls ,你看会有什么结果?!这个 /tmp/ls 由其它身份的人来执行或许没有问题,但是由 root 来执行却可能会导致 Cracker 所 乐意见到的结果!那晓得为何了吧?! 当然啰!您还是可以选择在 ~/.bashrc 当中设定你的 . 在你的 PATH 当中,不过并 不这么建议就是了! 好了,由于系统预设并不主动搜寻目前目录下的执行文件,那么你应该如何执行『目前目录下的执行文件』 呢? 很简单呀!就是以相对路径的观念,由于『 .. 』是上层,而『 . 』是这一层,所以要执行这一层 目录的命令就使用『 ./command 』即可!例如你的 /usr/local/squid/bin 底下执行 squid 则可以写成: [root@linux ~]# ./squid 请特别留意这方面的问题!『新手特别容易犯这个错误呢!』 登录讯息显示数据: /etc/issue, /etc/motd 还记得我们在终端机接口 (tty1 ~ tty6) 登入的时候,会有几行提示的字符串吗? 那个字符串写在哪里 啊?呵呵!在 /etc/issue 里面啊!先来看看: [root@linux ~]# cat /etc/issue Fedora Core release 4 (Stentz) Kernel \r on an \m 在 FC4 里面预设有三行,这个在我们本机登入时就会显示在 title 的地方呢~ 咦!那么那个 \r 及 \m 是啥?您可以使用 man issue 配合 man mingetty 就能够知道: issue 内的各代码意义 \d 本地端时间的日期; \l 显示第几个终端机接口; \m 显示硬件的等级 (i386/i486/i586/i686...); \n 显示主机的网络名称; \o 显示 domain name; \r 操作系统的版本 (相当于 uname -r) \t 显示本地端时间的时间; \s 操作系统的名称; \v 操作系统的版本。 所以,如果您想要显示终端机的号码,就可以加上 \l 在 /etc/issue 档案内啰~就能够修改登入字符。 咦!但是还有个 /etc/issue.net 呢!这是啥?没啥啦!这个是提供给 telnet 这个远程登入程序用的。 当 我们使用 telnet 连接到主机时,主机的登入画面就会显示 /etc/issue.net 而不是 /etc/issue 呢! 至于如果您想要让使用者登入后取得一些讯息,例如您想要让大家都知道的讯息, 那么可以将讯息加入 /etc/motd 里面去!例如:当登入后,告诉登入者, 系统将会在某个固定时间进行维护工作,可以这样做: [root@linux ~]# vi /etc/motd Hello everyone, Our server will be maintained at 2005/10/10 0:00 ~ 24:00. Please don't login at that time. ^_^ 那么当你的使用者登入主机后,就会显示这样的讯息出来: Last login: Mon Aug 15 10:17:10 2005 from 127.0.0.1 Hello everyone, Our server will be maintained at 2005/10/10 0:00 ~ 24:00. Please don't login at that time. ^_^ 是否很方便啊!? ^_^ 环境设定档: bashrc, ~/.bashrc, ~/.profile, profile...,/etc/inputrc, source 关于取得 bash 的环境变量等数据,其实可以有系统规划与各人喜好, 一般来说,建议使用者直接修改个 人设定值即可,不需要更动到系统啦~ 底下我们分别来谈一谈几个有趣的设定档喔!要注意的是,在指令 列输入的变量也好、命令别名也罢, 都是针对该次登入的设定而已,所以只要您一注销,那么上次的设定 值就会不见去! 因此,我们需要有几个档案来帮助我们,每次登入的时候,就已经帮我们搞定了环境的设 定啰! • 系统设定值 所谓的系统设定值,也就是说每个使用者进入到 bash shell 之后,会先读取的设定档案! 预设的设定档 案有下列几个: • /etc/sysconfig/i18n 记得我们在几个重要变量内谈到的语系数据吗?! 那个语系是由 i18n 所维护的,而 FC4 预设的系统语 系设定文件就在 /etc/sysconfig/i18n 当中。 这个档案有点像这样: [root@linux ~]# cat /etc/sysconfig/i18n LANG="zh_TW.UTF-8" SYSFONT="latarcyrheb-sun16" SUPPORTED="zh_TW.UTF-8:zh_TW:zh:en_US.UTF-8" 我预设使用 zh_TW.UTF-8 来作为我的整体语系,当然,我可以在这里修改 LANG 以及其它相关的语系变量, 例如 LC_CTYPE 或者是 LC_TIME 等等的。不过,一般来说,使用者自己个人的设定不建议在这里做更动啦! 他们可以自行设定他们自己的设定档啊! • /etc/profile 这个档案设定了几个重要的变量,例如:『PATH、USER、MAIL、 HOSTNAME、HISTSIZE、umask』等等,也 同时规划出 /etc/inputrc 这个针对键盘热建设定的档案的数据内容。你可以在这里设定总体的 PATH 等 等的信息! 同时,这个档案也规划出 /etc/profile.d 及 /etc/inputrc 这两个目录与档案! 总之,你可以了解到刚刚我们学会的变量设定方式,在这个档案中也可以设定呢! 但是设定上需要特别小 心,因为所有的使用者皆会使用到这个档案的信息。通常我都喜欢将 /usr/local/bin 这个路径加成最前 面,这是因为通常自己安装的套件自己最喜欢, 所以当然是最先搜寻啰! ^_^!此外,请注意一下,可以 将 HISTSIZE 的大小改变一下,改成 50 就可以啦!比较安全!( 注:这个档案不论在那个 Linux distributions 当中均存在 /etc/profile 当中,所以,请特别留意此一档案即可! )。 • /etc/bashrc 这个档案在规划 umask 的功能,也同时规划出提示字符的内容 (就是里头那个 PS1 啦!) 。特别留意的 是,这个档案在不同的 Linux distribution 里面,摆放的位置可能不太一样呢! 所以需要查询一下才行 呦! • /etc/profile.d/*.sh /etc/profile.d 是一个目录,里面针对 bash 及 C-shell 规范了一些数据。 以 FC4 为例,这个目录里 面就针对了颜色、语系、vim 及 which 等指令进行一些额外的设定, 例如 alias 之类的规范值。我们的 vim 被用 alias 命名为 vi 就是在这个目录下被设定好的。 当然啦,这个目录的由来其实是在 /etc/profile 这个档案内规范的啦! 你可以自行设定一些 *.sh 的文件名的档案来书写自己的系统设定 值喔! • /etc/man.config 这个档案乍看之下好像跟 bash shell 没相关性,但是对于系统管理员来说, 却也是很重要的一个档案! 这的档案的内容『规范了使用 man 的时候, man page 的路径到哪里去寻找!』所以说的简单一点,这个 档案规定了下达 man 的时候,该去哪里查看数据的路径设定!那么什么时候要来修改这个档案呢?如果你 是以 tarball 的方式来安装你的数据,那么你的 man page(指令说明档案)可能会放置在 /usr/local/softpackage/man 里头,那个 softpackage 是你的套件名称, 这个时候你就得以手动的方式 将该路径加到 /etc/man.config 里头,否则使用 man 的时候就会找不到相关的说明档啰。 事实上,这个档案内最重要的其实是 MANPATH 这个变量设定啦! 我们搜寻 man page 时,会依据 MANPATH 的路径去分别搜寻啊!另外,要注意的是, 这个档案在各大不同版本 Linux distributions 中,檔名都 不太相同,例如 FC4 用的是 /etc/man.config ,而 SuSE 用的则是 /etc/manpath.config , 可以利用 [tab] 按键来进行文件名的补齐啦! 这就是系统在设定的时候常常会使用的档案!需要特别留意的是,通常设定完了这几个档案之后,都需要 先 logout 在 login 之后才会将设定整个启动起来! • 个人设定值 那么个人的喜好设定在哪里?嘿嘿嘿嘿!那就是在个人家目录的几个隐藏文件当中啰! 分别会使用到底下 的几个档案啦!( 注意!底下的档案都是隐藏档,需要使用 ls -al 方能显示出来 ) ,另外,注意一下啰! 底下那个『 ~ 』代表的是『家目录』的意思: • ~/.bash_profile, ~/.bash_login, ~/.profile 这三个档案通常只要一个就够了,一般预设是以 ~/.bash_profile 的檔名存在。 会有这么多的档案,其 实是因应其它 shell 转换过来的使用者的习惯而已。 这个档案可以定义个人化的路径 (PATH) 与环境变 量等等。不过,还是有顺位上的差异, bash 启动时,会先去读取 ~/.bash_profile,找不到时,就去读 取 ~/.bash_login ,然后才是 ~/.profile。 • ~/.bashrc 鸟哥一般都是将自己的需要输入在这个档案里面的呢! 我的个人化设定值都会写在这里说~例如命令别 名、路径等等。 这个档案在您每次执行 shell script 的时候都会被重新使用一遍,所以是最完整的。 而 上头的 ~/.bash_profile 则只有在登入的时候会被读取一次。 • ~/.bash_history 还记得我们在历史命令提到过这个档案吧?!呵呵!没错~预设的情况下, 我们的历史命令就记录在这里 啊!而这个档案能够记录几笔数据,则与 HISTSIZE 这个变数有关啊。每次登入 bash 后,bash 会先读取 这个档案,将所有的历史指令读入内存, 因此,当我们登入 bash 后就可以查知上次使用过哪些指令啰。 至于更多的历史指令, 请自行回去参考喔! • ~/.bash_logout 这个档案则记录了『当我注销 bash 后,系统再帮我做完什么动作后才离开』的意思。 你可以去读取一下 这个档案的内容,预设的情况下,注销时, bash 只是帮我们清掉屏幕的讯息而已。 不过,你也可以将一 些备份或者是其它你认为重要的工作写在这个档案中(例如清空暂存盘), 那么当你离开 Linux 的时候, 就可以解决一些烦人的事情啰! 好了,我们知道在变量的设定规范当中,后输入的设定值可以取代先输入的设定值, 那么在我们登入 bash 的时候,这些设定档到底是如何读取的呢?他是这样读取的: 1. 先读取 /etc/profile ,再根据 /etc/profile 的内容去读取其它额外的设定档, 例如 /etc/profile.d 与 /etc/inputrc 等等设定档; 2. 根据不同的使用者,到使用者家目录去读取 ~/.bash_profile 或 ~/.bash_login 或 ~/.profile 等设定档; 3. 根据不同使用者,到他家目录去读取 ~/.bashrc 。 所以啰,当我登入 bash 后,最终读取的设定档竟然是 ~/.bashrc 呢! 也就是说,在 ~/.bashrc 里面的 设定会是最终的设定值!所以啰, 通常鸟哥我喜欢将个人的一些常用 alias 或 PATH 等环境变量或自订 变量都写到这个档案去, 如此一来,不论原来系统帮我们做了什么设定值,我都可以使用属于自己熟悉的 环境呢! 鸟哥的 ~/.bashrc 有点像这样: [root@linux ~]# vi ~/.bashrc # .bashrc # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi # User specific aliases and functions PATH="/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin" PATH="$PATH":/usr/X11R6/bin:/home/dmtsai/bin LANG=zh_TW.big5 LC_TIME=C export PATH LC_TIME LANG umask 022 alias alias alias alias rm='rm -i' cp='cp -i' mv='mv -i' ll='ls -l' alias lm='ls -al|more' alias h='history' 仔细看到上头这个档案,会不会觉得奇怪啊!为什么会有第五行的『 . /etc/bashrc 』呢? 那个小数点 (.) 代表什么意思啊??其实 if [ ... ]; then .... fi 是 shell script 当中的程序写法, 这个我们会在 下一章当中介绍。不过,那个 . 则需要好好的谈一谈喔!一般来说,如果修改完了设定档,通常就是 logout 后再重新 login 到 bash 内,就能够将环境设定档重读了!不过, 我们可以使用底下的方式来让该设定 档立即生效: [root@linux ~]# source file 范例: [root@linux ~]# source ~/.bashrc [root@linux ~]# . ~/.bashrc 利用 source 或小数点 (.) 都可以将设定档的内容读进来目前的 shell 环境中! 举例来说,我修改了 ~/.bashrc ,那么不需要注销,立即以 source ~/.bashrc 就可以将刚刚最新设定的内容读进来目前的环 境中!很不错吧!此外,什么时候会使用到不同的设定档呢? 最常发生在一个人的工作环境分为多重的时 候了!举个例子来说,在我的大型主机中, 我常常需要负责两到三个不同的案子,每个案子所需要处理的 环境变量订定并不相同, 那么我就将这两三个案子分别编写属于该案子的环境变量设定档案,当我需要该 环境时,就直接『 source 变量文件 』,如此一来,环境变量的设定就变的更简便而灵活了! • login shell 与 non-login shell 事实上,这些环境设定档在读取时,还是有一些差异的,这就得要谈到所谓的『login shell』与 『non-login shell』的差异了。基本上,就字面上的意义来解释的话,所谓的 loign shell 指的就是当使用者登入 Linux 系统时,所取得的那个 shell 称为 login shell。 当登入后,再去执行其它的 shell 时,其它的 shell 就是 non-login shell 了。举例来说,我以 dmtsai 这个使用者身份登入 Linux 后,然后为了要执行一 些数值模拟的工作,而去执行 csh 这个 C shell , 那么此时我就取得了 non-login shell 了。 另外一个例子是,当我以 X Window 的环境登入 Linux 时,我们不是可以使用『终端机』来开启 shell 吗? 当登入 Linux 的时候所取得的那个 X 的环境也可以读入 login shell 的。因此,在 X 环境下所启动的 终端机,那些 shell 都是 non-login shell 喔! login 与 non-login shell 的差异除了取得的时机不同之外,其实他们读取的环境设定档也不相同。 我 们上头说过一些个人的环境设定档案了吧?那么这两种类型的 shell 该读取什么档案呢? 当登入 Linux ,亦即是取得 login shell 时,会读取 ~/.bash_profile, ~/.bash_login, ~/.profile, 这三个 档案的优先级已经在上面提过,自行参考一下。至于在取得 login shell 后继续动作的其它 non-login shell ,读取的就是仅有 ~/.bashrc 啰~。而大部分的 linux distributions 都会将 ~/.bash_profile 的内容指到 ~/.bashrc 去,这样比较简单啰~ 终端机的环境设定: stty, set 什么叫做『终端机环境』啊?!我们在 首次登入 Linux 时就提过,可以在 tty1 ~ tty6 这六个文字接口 的终端机 (terminal) 环境中登入,那么登入的时候我们可以取得一些字符设定的功能喔! 举例来说,我 们可以利用退格键 (backspace,就是那个←符号的按键) 来删除命令列上的字符, 也可以使用 [ctrl]+c 来强制终止一个指令的运行,当输入错误时,就会有声音跑出来警告。这是怎么办到的呢? 很简单啊!因 为登入终端机的时候,会自动的取得一些终端机的输入环境的设定啊! 事实上,目前我们使用的 Linux distributions 都帮我们作了最棒的使用者环境了, 所以大家可以不用 担心操作环境的问题。不过,在某些 Unix like 的机器中,还是可能需要动用一些手脚, 才能够让我们 的输入比较快乐~举例来说,利用 [backspace] 删除,要比利用 [Del] 按键来的顺手吧! 但是某些 Unix 偏偏是以 [del] 来进行字符的删除啊!所以,这个时候就可以动动手脚啰~ 那么如何查阅目前的一些按键内容呢?可以利用 stty (setting tty 终端机的意思) 呢! stty 也可以帮 助设定终端机的输入按键代表意义喔! [root@linux ~]# stty [-a] 参数: -a :将目前所有的 stty 参数列出来; 范例: 范例一:列出所有的按键与按键内容 [root@linux ~]# stty -a speed 38400 baud; rows 40; columns 80; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ; eol2 = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; -parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke 我们可以利用 stty -a 来列出目前环境中所有的按键列表,在上头的列表当中,需要注意的是特殊字体那 几个, 此外,如果出现 ^ 表示 [Ctrl] 那个按键的意思。举例来说, intr = ^C 表示利用 [ctrl] + c 来 达成的。 几个重要的代表意义是: • eof : End of file 的意思,代表『结束输入』。 • erase : 向后删除字符, • intr : 送出一个 interrupt (中断) 的讯号给目前正在 run 的程序; • kill : 删除在目前指令列上的所有文字; • quit : 送出一个 quit 的讯号给目前正在 run 的程序; • start : 在某个程序停止后,重新启动他的 output • stop : 停止目前屏幕的输出; • susp : 送出一个 terminal stop 的讯号给正在 run 的程序。 记不记得我们讲过 Linux 底下的几个热键 啊?没错! 就是这个 stty 设定值内的 intr / eof 啰~至于 删除字符,就是 erase 那个设定值啦! 如果你想要用 [ctrl]+h 来进行字符的删除,那么可以下达: [root@linux ~]# stty erase ^h 那么从此之后,你的删除字符就得要使用 [ctrl]+h 啰,按下 [backspace] 则会出现 ^? 字样呢! 如果 想要回复利用 [backspace] ,就下达 stty erase ^? 即可啊! 至于更多的 stty 说明,记得参考一下 man stty 的内容喔! 除了 stty 之外,其实我们的 bash 还有自己的一些终端机设定值呢!那就是利用 set 来设定的! 我们 之前提到一些变量时,可以利用 set 来显示,除此之外,其实 set 还可以帮我们设定整个指令输出/输入 的环境。 例如记录历史命令、显示错误内容等等。 [root@linux ~]# set [-uvCHhmBx] 参数: -u :预设不启用。若启用后,当使用未设定变量时,会显示错误讯息; -v :预设不启用。若启用后,在讯息被输出前,会先显示讯息的原始内容; -x :预设不启用。若启用后,在指令被执行前,会显示指令内容(前面有 ++ 符号) -h :预设启用。与历史命令有关(下节介绍); -H :预设启用。与历史命令有关(下节介绍); -m :预设启用。与工作管理有关(未来介绍); -B :预设启用。与刮号 [] 的作用有关; -C :预设不启用。若使用 > 等,则若档案存在时,该档案不会被覆盖。 范例: 范例一:显示目前所有的 set 设定值 [root@linux ~]# echo $himBH # 那个 $- 变量内容就是 set 的所有设定啦! bash 预设是 himBH 喔! 范例二:设定 "若使用未定义变量时,则显示错误讯息" [root@linux ~]# set -u [root@linux ~]# echo $vbirding -bash: vbirding: unbound variable # 预设情况下,未设定/未宣告 的变量都会是『空的』,不过,若设定 -u 参数, # 那么当使用未设定的变量时,就会有问题啦!很多的 shell 都预设启用 -u 参数。 # 若要取消这个参数,输入 set +u 即可! 范例三:执行前,显示该指令内容。 [root@linux ~]# set -x [root@linux ~]# echo $HOME + echo /root /root ++ echo -ne '\033]0;root@linux:~\007' # 看见否?要输出的指令都会先被打印到屏幕上喔!前面会多出 + 的符号! 另外,其实我们还有其它的按键设定功能呢!就是在 /etc/inputrc 这个档案里面设定。 [root@linux ~]# cat /etc/inputrc # do not bell on tab-completion #set bell-style none set meta-flag on set input-meta on set convert-meta off set output-meta on .....以下省略..... 还有例如 /etc/DIR_COLORS* 与 /etc/termcap 等,也都是与终端机有关的环境设定档案呢! 不过,事实 上,鸟哥并不建议您修改 tty 的环境呢,这是因为 bash 的环境已经设定的很亲和了, 我们不需要额外 的设定或者修改,否则反而会产生一些困扰。不过,写在这里的数据, 只是希望大家能够清楚的知道我们 的终端机是如何进行设定的喔! ^_^ 万用字符与特殊符号: 嘿嘿!在 bash 里头还支持一些万用字符喔 (wild card) !多了这些万用字符, 我们利用 bash 处理数 据就更方便了!底下我们列出一些常用的万用字符喔: 符号 * ? # \ | ; ~ $ & ! / >, >> ' " `` () [] {} 组合按键 Ctrl + C Ctrl + D Ctrl + M 内容 万用字符,代表 0 个或多个字符(或数字) 万用字符,代表『一定有』一个字母 批注,这个最常被使用在 script 当中,视为说明! 跳脱符号,将『特殊字符或万用字符』还原成一般字符 分隔两个管线命令的界定; 连续性命令的界定(注意!与管线命令并不相同) 使用者的家目录 亦即是变量之前需要加的变量取代值 将指令变成背景下工作 逻辑运算意义上的『非』 not 的意思! 路径分隔的符号 输出导向,分别是『取代』与『累加』 单引号,不具有变量置换的功能 具有变量置换的功能! 两个『 ` 』中间为可以先执行的指令! 在中间为子 shell 的起始与结束 在中间为字符的组合 在中间为命令区块的组合! 执行结果 终止目前的命令 输入结束(EOF),例如邮件结束的时候; 就是 Enter 啦! Ctrl + S Ctrl + Q Ctrl + U Ctrl + Z 暂停屏幕的输出 恢复屏幕的输出 在提示字符下,将整列命令删除 『暂停』目前的命令 在上面的『按键组合』当中,有没有发现跟上个小节很相似的内容啊!? 呵呵~没错啦!那些组合键都可 以在 stty 当中来进行不同的设定的!好玩吧! 至于上面的万用字符当中,最常用的就属 *, ?, [] 及 ` 了!我们提几个简单的例子: [root@linux ~]# ls test* <==那个 * 代表后面不论接几个字符都予以接受 [root@linux ~]# ls test? <==那个 ? 代表后面『一定』要接『一个』字符 [root@linux ~]# ls test??? <==那个 ??? 代表『一定要接三个』字符! [root@linux ~]# cp test[1-5] /tmp # 将 test1, test2, test3, test4, test5 若存在的话,就拷贝到 /tmp [root@linux ~]# cp test[!1-5] /tmp # 只要不是 test1, test2, test3, test4, test5 之外的其它 test? , # 若存在的话,就拷贝到 /tmp [root@linux ~]# cd /lib/modules/`uname -r`/kernel/drivers # 被 ` ` 括起来的内容『会先执行』 上面几个例子相当的有趣!尤其是最后面两个!需要注意的是, [1-5] 里面『代表只有一个字符』但是范 围可以由 1-5 ,这样来说的话,那么我们如果允许『只要档名里面含有至少一个大写字符』时,就可以将 档案 copy 出来的话,可以这样做: cp *[A-Z]* /tmp 很有趣吧?!也就是说『 [ ] 谨代表一个字符,而这个字符的定义可以是范围(-), 可以是指定项目,也 可以是两者并存。 』举例来说,我想要找出在 /etc/ 底下所有含有数字的档案, 可以这样: ls -lda /etc/*[0-9]* 但如果我只想要找出含有 3 及 5 的档名的档案呢?就会是这样: ls -lda /etc/*[35]* 如果是『不想要』某些范围或者是单字呢?就使用 [!] 即可!例如不想要有小写字符为开头的档案: ls -lda /etc/[!a-z]* 很好玩吧!至于那个 ` 是啥?在一串指令当中, `command` 内的指令会先被执行, 执行完的讯息再回传 到外部指令来处理!也就是说: 1. 系统先执行 uname -r 找出输出的结果; 2. 将结果累加在目录上面,来执行 cd 的功能! 很棒吧!!另外,这个 quot (`) 的功能,也可以利用 $() 来取代喔!例如: cd /lib/modules/$(uname -r)/kernel 这些基本的功能需要特别来了解一下才行呦!至于更多的使用方式, 我们会在后续的正规表示法当中在详 谈的! 数据流重导向 数据流重导向 (redirect) 由字面上的意思来看,好像就是将『数据给他传导到其它地方去』的样子? 呵 呵!是啊是啊!没错~数据流重导向就是将某个指令执行后应该要出现在屏幕上的数据, 给他传输到其它 的地方,例如档案或者是装置 (例如打印机之类的!)!这玩意儿在 Linux 的文字模式底下可重要的! 尤 其是如果我们想要将某些数据储存下来时,就更有用了! 什么是数据流重导向 好家伙!什么是数据流重导向啊?这得要由指令的执行结果谈起! 一般来说,如果你要执行一个指令,通 常他会是这样的: 图三、指令执行过程的数据传输情况 我们执行一个指令的时候,这个指令可能会由档案读入资料,经过处理之后,再将数据输出到屏幕上。 在 图三当中, standard output 与 standard error 分别代表标准输出与标准错误输出, 这两个玩意儿预 设都是输出到屏幕上面来的啊!举个简单例子来说, 我们下达『 cat /etc/crontab /etc/vbirdsay 』这 个指令时,cat 会由 /etc/crontab 与 /etc/vbirdsay 读入数据, 然后再将数据输出到屏幕上,不过, 因为系统本来就不存在 /etc/vbirdsay 这个档案, 所以就会显示错误讯息,这个错误讯息也会输出到屏 幕上来喔! 在这样的过程当中,我们可以将 standard error (简称 stderr) 与 standard output (简称 stdout) 给 他传送到其它不同的地方,而不是屏幕上头!传送的目标处,通常是档案或者是装置! 而传送的指令则是 如下所示: 1. 标准输入(stdin) :代码为 0 ,使用 < 或 << ; 2. 标准输出(stdout):代码为 1 ,使用 > 或 >> ; 3. 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ; 举例来说,如果我想要将我目前根目录下所有的目录都记录下来的话,也就是说,将 ls -l / 这个指令的 输出结果储存下来,就可以: [root@linux ~]# ls -l / > ~/rootfile # 本来 ls -l / 会将根目录的数据列出到屏幕上; # 现在我使用了 > ~/rootfile 后,则本来应该在屏幕上出现的数据 # 就会被『重新导向』到 ~/rootfile 档案内了!就可以将该数据储存! 此时,原本应该在屏幕上面出现的数据通通不见去~因为那些资料都被写入到 ~/rootfile 去了! 当然, 那个档案的档名随便你取啦~如果你下达:『 cat ~/rootfile 』就可以看到原本应该在屏幕上面的数据 啰。 那么如果我再次下达:『 ls -l /home > ~/rootfile 』后,那么那个 ~/rootfile 档案的内容变成 什么? 呵呵!变成『仅有 ls -l /home 的数据』而已!咦!原本的 ls -l / 数据就不见了吗?是的! 因 为该档案的建立方式是: 1. 该档案 (本例中是 ~/rootfile) 若不存在,系统会自动的将他建立起来,但是, 2. 当这个档案存在的时候,那么系统就会先将这个档案内容清空,然后再将数据写入! 3. 也就是若以 > 输出到一个既存盘案中,呵呵,那个档案就会被覆盖掉啰! 那如果我想要将数据累加,不想要将旧的数据删除,那该如何是好? 呵呵!就利用 >> 就好啦!例如上面 的例子中,就变成『ls -l / >> ~/rootfile』 如此一来,当 ~/rootfile 不存在时,系统会主动建立这 个档案,若该档案已存在, 则数据会在该档案的最下方累加进去!基本上,指令的下达方式: > 1> command 2> 2>> < 装置或档案 当然啦,一串指令的最左边一定是指令,而在 >,2>,< 右边的,必须是档案或装置才行! 此外,那个 > 会 等于 1> ,因为 standard output 代码是 1 ,可以省略啦! 再者, 1 与 > 之间并没有空格喔!是紧接 在一起的!注意注意!我们底下来玩几个东西好了: 范例一:将目前目录下的档案信息全部储存到 list.txt 档案中 [root@linux ~]# ls -al > list.txt 范例二:将根目录下的数据也储存到 list.txt 档案中 [root@linux ~]# ls -al / >> list.txt 好了,对于『 > , >> 』这两个东西有一定的概念之后,我们来深入的谈一谈『数据流重导向』的观念吧! 如前所述,基本上, Linux 执行的结果中,可以约略的分成『正确输出』与『错误输出』两种数据。 例 如,当你以一般身份执行 find 这个指令时,例如执行『 find / -name testing 』时,由于你是一般身 份,又有些数据夹是不允许一般身份者进入的, 所以啰,当你使用 find 时,就会有错误讯息发生了!但 同时如果有 testing 这个档案在你可以进入的资料夹当中,那么屏幕也会输出到给你看!因此, 就具有 正确的与错误的输出两种啰!(分别称为 Stdout 与 Stderror)例如下面为执行结果: 里面的『 find: /home/root: Permission denied 』就告诉你该数据夹你没有权限进入, 这就是错误的输出了,那么 『 /home/dmtsai/tseting 』就是正确的输出了! [dmtsai@linux ~]$ find /home -name testing find: /home/test1: Permission denied <== Starndard error find: /home/root: Permission denied <== Starndard error find: /home/masda: Permission denied <== Starndard error /home/dmtsai/testing <== Starndard output 好了,那么假如我们想要将数据输出到 list 这个档案中呢?执行『 find / -name testing > list 』 会 有什么结果?呵呵,你会发现 list 里面存了刚刚那个『正确』的输出数据, 至于屏幕上还是会有错误的 讯息出现呢!伤脑筋!如果想要将正确的与错误的数据分别存入不同的档案中需要怎么做?! 呵呵!其实 在数据的重导向方面,正确的写法应该是『 1> 』与『 2> 』才对!但是如果只有 > 则预设是以 1> 来进 行数据的!那个 1> 是输出正确数据, 2> 则是错误数据输出项目。也就是说: • 1> :是将正确的数据输出到指定的地方去 • 2> :是将错误的数据输出到指定的地方去 好了,那么上面的例子中,我们如何将数据输出到不同的地方去呢?可以这么写: [dmtsai@linux ~]$ find /home -name testing > list_right 2> list_error 这样一来,刚刚执行的结果中,有 Permission 的那几行错误信息都会跑到 list_error 这个档案中,至 于正确的输出数据则会存到 list_right 这个档案中啰!这样可以了解了吗? 如果有点混乱的话,去休息 一下再来看看吧!! 再来,如果我只要正确的数据,错误的信息我不要了呢?呵呵,这个时候 /dev/null 这个垃圾桶就很重要 了!/dev/null 是什么呢? 基本上,那就有点像是一个『黑洞』的垃圾桶功能!当你输入的任何东西导向 到这个虚拟的垃圾桶装置时, 『他就会凭空消失不见了~~』,这个东西有用的很!例如上面的例子中, 我们可以这么做,来将错误的信息丢掉! [dmtsai@linux ~]$ find /home -name testing > list_right 2> /dev/null 很神奇呦! error message 就会『不见了!』呵呵!真高兴!另外, 如果我要将数据都写到同一个档案 中呢?这个时候写法需要用到特殊写法,请注意底下的写法呦! [dmtsai@linux ~]$ find /home -name testing > list 2> list <==错误写法 [dmtsai@linux ~]$ find /home -name testing > list 2>&1 <==正确写法 请特别留意这一点呢!同时写入同一个档案需要使用 2>&1 才对呦! OK!了解了 >, 2>, >> 与 /dev/null 之后,那么那个 < 又是什么呀!?呵呵!以最简单的说法来说, 那 就是『将原本需要由键盘输入的数据,经由档案来读入』的意思。 举例来说,我们可以使用 cat 在键盘 上面输入一些数据,然后写入一个档案内,例如: [root@linux ~]# cat > catfile testing cat file test <==这里按下 [ctrl]+d 结束输入来离开! 此时就会有 catfile 这个档案产生,而且该档案的内容就是刚刚输入的内容喔。 那么,我是否可以使用 其它档案来取代键盘输入呢?可以啊!这样做! [root@linux ~]# cat > catfile < somefile 我可以先编辑 somefile ,然后再以上述的指令来将数据输出到 catfile 去呢!这样可以理解了吗? 能 够理解 < 之后,再来则是怪可怕一把的 << 这个连续两个小于的符号了~ 他代表的是『结束的输入字符』 的意思!举例来讲:『我要用 cat 直接将输入的讯息输出到 catfile 中, 且当输入 eof 时,该次输入 就结束』,那我可以这样做: [root@linux ~]# cat > catfile < This is a test testing > OK now stop > eof <==输入这个玩意儿,嘿!立刻就结束了! 看到了吗?利用 << 右侧的控制字符,我们可以终止一次输入, 而不必输入 [crtl]+d 来结束哩!这对程 序写作很有帮助喔!好了,那么为何要使用命令输出重导向呢? 这个问题一定会困扰你一下下的,如果你 从来都没有写过 script 的话!好了,我们来说一说吧! • 当屏幕输出的信息很重要,而且我们需要将他存下来的时候; • 背景执行中的程序,不希望他干扰屏幕正常的输出结果时; • 一些系统的例行命令(例如写在 /etc/crontab 中的档案)的执行结果,希望他可以存下来时; • 一些执行命令,我们已经知道他可能的错误讯息,所以想以『 2> /dev/null 』将他丢掉时; • 错误讯息与正确讯息需要分别输出时。 当然还有很多很多的功能的,最简单的就是网友们常常问到的:『 为何我的 root 都会收到系统 crontab 寄来的错误讯息呢』这个咚咚是常见的错误, 而如果我们已经知道这个错误讯息是可以忽略的时候,嗯! 『 2> errorfile 』这个功能就很重要了吧! 了解了吗?? 命令执行的判断依据: ; , &&, || 在某些时候,我们希望可以一次执行多个指令,例如关机时,希望我可以先执行两次 sync ,然后才 shutdown 计算机,那么可以怎么作呢?这样做呀: [root@linux ~]# sync; sync; shutdown -h now 在指令与指令中间利用分号 (;) 来隔开,这样一来,分号前的指令执行完后, 就会立刻接着执行后面的 指令了。这真是方便啊~再来,换个角度来想, 万一我想要在某个目录底下建立一个档案,也就是说,如 果该目录存在的话, 那我才建立这个档案,如果不存在,那就算了~目录是否存在可以使用一些 bash 提 供的判断式功能, 但这里假设我不晓得那个指令,但我知道我可以使用 ls 来判断是否有该目录的存在, 也就是说,我可以利用 ls directoryname 判断是否存在,然后以 touch 建立一个档案, 这两个指令有 相关性,那该如何写呢?呵呵!可以利用 && 来作喔! [root@linux ~]# ls /tmp && touch /tmp/testingagin 是否记得我们在变量的章节里面谈过这个奇怪的变数『 $? 』呢? 如果指令执行结果没有错误讯息,那就 会回传 $?=0 ,如果有错误, 那回传值就不会是 0 啊!经由这样的判断,我们也可以利用 && 来决定, 当 前面的指令执行结果为正确 (例如:仅有 standard output 时),就可以接着执行后续的指令, 否则就予 以略过!因此,当 ls /tmp 没有问题,那么就会接着执行 touch /tmp/testingagin 了! 万一是这样: [root@linux ~]# ls /vbird && touch /vbird/test 因为我的系统里面根本就不可能存在 /vbird 这个目录呢!所以,执行 ls /vbird 就会回传错误, 那么 后续的 touch /vbird/test 自然就不会动作啰!了解吗? 再换个角度来想,如果我想要当某个档案不存在时,就去建立那个档案, 否则就略过呢?很简单啊~可以 这样做: [root@linux ~]# ls /tmp/vbirding || touch /tmp/vbirding 那个 || 刚好完全跟 && 相反,当前一个指令有错误时,在 || 后面的指令才会被执行! (要注意,那个 | 是两个 | ,而 | 按键则是反斜线 \ 同一个按键, 因此,按下 [Shift] 加上 [\] 就会出现那个 | 啰!) 因此,简单的来说,当 ls /tmp/vbirding 发生错误时,才会使用 touch /tmp/vbirding 去建立这个档案 的意思。 是否很有趣啊?这个 || 及 && 对于系统管理员在管理某些档案权限、存在等问题时, 可是很 有用的东西喔!好了,现在我们来玩比较难一点的,看看底下的例题: 例题:以 ls 测试 /tmp/vbirding 是否存在,若存在则显示 "exist" ,若不存在,则显示 "not exist"! 答: 这又牵涉到逻辑判断的问题,如果存在就显示某个数据,若不存在就显示其它数据, 那我可以这样做: ls /tmp/vbirding && echo "exist" || echo "not exist" 意思是说,当 ls /tmp/vbirding 执行后,若正确,就执行 echo "exist" ,若有问 题,就执行 echo "not exist" !那如果我写成: ls /tmp/vbirding || echo "not exist" && echo "exist" 对不对啊?这其实是有问题的,为什么呢?因为指令是一个一个往下执行,因此,在 上面的例子当中,如果 /tmp/vbirding 不存在时,他会: 1. 若 ls /tmp/vbirding 不存在,因此回传一个非为 0 的数值; 2. 接下来经过 || 的判断,发现前一个指令回传非为 0 的数值,因此,程序开 始执行 echo "not exist" ,而 echo "not exist" 程序肯定可以执行成功, 因此会回传一个 0 值给后面的指令; 3. 经过 && 的判断,咦!是 0 啊!所以就开始执行 echo "exist" 。 所以啊,嘿嘿!第二个例子里面竟然会同时出现 not exist 与 exist 呢!真神奇~ 经过这个范例的练习,您应该会了解,由于指令是一个接着一个去执行的,因此,如果真要使用判断, 那 么这个 && 与 || 的顺序就不能搞错~一般来说,判断式最多会有三个,也就是: command1 && command2 || command3 而且顺序通常不会变,因为一般来说, command2 与 command3 会放置肯定可以执行成功的指令, 因此, 依据上面例题的逻辑分析,您就会晓得为何要如此放置啰~这很有用的啦! 而且.....考试也很常考~ 管线命令 (pipe) 就如同前面所说的, bash 命令执行的时候有输出的数据会出现! 那么如果这群数据必需要经过几道手续 之后才能得到我们所想要的格式,应该如何来设定? 这就牵涉到管线命令的问题了 (pipe) ,管线命令使 用的是『 | 』这个界定符号! 另外,管线命令与『连续下达命令』是不一样的呦! 这点底下我们会再说 明。底下我们先举一个例子来说明一下简单的管线命令。 假设我们想要知道 /etc/ 底下有多少档案,那么可以利用 ls /etc 来查阅,不过, 因为 /etc 底下的档 案太多,导致一口气就将屏幕塞满了~不知道前面输出的内容是啥?此时,我们可以透过 less 指令的协 助,利用: [root@linux ~]# ls -al /etc | less 嘿嘿!如此一来,使用 ls 指令输出后的内容,就能够被 less 读取, 并且利用 less 的功能,我们就能 够前后翻动相关的信息了!很方便是吧?呵呵! 我们就来了解一下这个管线命令『 | 』的用途吧! 这个管线命令『 | 』仅能处理经由前面一个指令传来的正确信息,也就是 standard output ( STDOUT ) 的 信息,对于 stdandard error 并没有直接处理的能力,请记得。那么整体的管线命令可以使用下图表示之: 图四、管线命令的处理示意图 在每个管线的前后部分都是『指令』呢!而后一个指令的输入乃是由前一个指令的输出而来的! 不过,要 注意的是,在 Linux 的环境中,很多的讯息处理都是以『行』为单位~ 也就是以是否具有 [Enter] 标志 (CR) 来作为一段处理的依据喔! 底下我们来谈一谈一些基本的管线命令指令介绍: 撷取命令: cut, grep 什么是撷取命令啊?说穿了,就是将一段数据经过分析后,取出我们所想要的。 或者是,经由分析关键词, 取得我们所想要的那一行! 不过,要注意的是,一般来说,撷取讯息通常是针对『一行一行』来分析的, 并不是整篇讯息分析的喔~底下我们介绍两个很常用的讯息撷取命令: • cut cut 不就是『切』吗?没错啦!这个指令可以将一段讯息的某一段给他『切』出来~ 处理的讯息是以『行』 为单位喔!底下我们就来谈一谈: [root@linux ~]# cut -d'分隔字符' -f fields [root@linux ~]# cut -c 字符区间 参数: -d :后面接分隔字符。与 -f 一起使用; -f :依据 -d 的分隔字符将一段讯息分割成为数段,用 -f 取出第几段的意思; -c :以字符 (characters) 的单位取出固定字符区间; 范例: 范例一:将 PATH 变量取出,我要找出第三个路径。 [root@linux ~]# echo $PATH /bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games: [root@linux ~]# echo $PATH | cut -d ':' -f 5 # 嘿嘿!如此一来,就会出现 /usr/local/bin 这个目录名称! # 因为我们是以 : 作为分隔符,第五个就是 /usr/local/bin 啊! # 那么如果想要列出第 3 与第 5 呢?,就是这样: [root@linux ~]# echo $PATH | cut -d ':' -f 3,5 范例二:将 export 输出的讯息,取得第 12 字符以后的所有字符串 [root@linux ~]# export declare -x HISTSIZE="1000" declare -x INPUTRC="/etc/inputrc" declare -x KDEDIR="/usr" declare -x LANG="zh_TW.big5" ......其它省略...... [root@linux ~]# export | cut -c 12HISTSIZE="1000" INPUTRC="/etc/inputrc" KDEDIR="/usr" LANG="zh_TW.big5" ......其它省略...... # 知道怎么回事了吧?用 -c 可以处理比较具有格式的输出数据! # 我们还可以指定某个范围的值,例如第 12-20 的字符,就是 cut -c 12-20 等等! 范例三:用 last 将这个月登入者的信息中,仅留下使用者大名 [root@linux ~]# last vbird tty1 192.168.1.28 Mon Aug 15 11:55 - 17:48 (05:53) vbird tty1 192.168.1.28 Mon Aug 15 10:17 - 11:54 (01:37) [root@linux ~]# last | cut -d ' ' -f 1 # 用 last 可以取得最近一个月登入主机的使用者信息, # 而我们可以利用空格符的间隔,取出第一个信息,就是使用者账号啰! # 但是因为 vbird tty1 之间空格有好几个,并非仅有一个,所以,如果要找出 # tty1 其实不能以 cut -d ' ' -f 1,2 喔!输出的结果会不是我们想要的。 这个 cut 实在很好用!不过,说真的,除非你常常在分析 log 档案,否则使用到 cut 的机会并不多!好 了! cut 主要的用途在于将『同一行里面的数据进行分解!』, 最常使用在分析一些数据或文字数据的 时候!这是因为有时候我们会以某些字符当作分割的参数, 然后来将数据加以切割,以取得我们所需要的 数据。我也很常使用这个功能呢!尤其是在分析 log 档案的时候!不过, cut 在处理多空格相连的数据 时,可能会比较吃力一点~ • grep 刚刚的 cut 是将一行讯息当中,取出某部分我们想要的,而 grep 则是分析一行讯息, 若当中有我们所 需要的信息,就将该行拿出来~简单的语法是这样的: [root@linux ~]# grep [-acinv] '搜寻字符串' filename 参数: -a :将 binary 档案以 text 档案的方式搜寻数据 -c :计算找到 '搜寻字符串' 的次数 -i :忽略大小写的不同,所以大小写视为相同 -n :顺便输出行号 -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行! 范例: 范例一:将 last 当中,有出现 root 的那一行就取出来; [root@linux ~]# last | grep 'root' 范例二:与范例一相反,只要没有 root 的就取出! [root@linux ~]# last | grep -v 'root' 范例三:在 last 的输出讯息中,只要有 root 就取出,并且仅取第一栏 [root@linux ~]# last | grep 'root' |cut -d ' ' -f1 # 在取出 root 之后,利用上个指令 cut 的处理,就能够仅取得第一栏啰! grep 是个很棒的指令喔!他支持的语法实在是太多了~用在正规表示法里头, 能够处理的数据实在是多 的很~不过,我们这里先不谈正规表示法~下一章再来说明~ 您先了解一下, grep 可以解析一行文字, 取得关键词,若该行有存在关键词, 就会整行列出来! 排序命令: sort, wc, uniq 很多时候,我们都会去计算一次数据里头的相同型态的数据总数,举例来说, 使用 last 可以查得这个月 份有登入主机者的身份。那么我可以针对每个使用者查出他们的总登入次数吗? 此时就得要排序与计算之 类的指令来辅助了!底下我们介绍几个好用的排序与统计指令喔! • sort sort 是很有趣的指令,他可以帮我们进行排序,而且可以依据不同的数据型态来排序喔! 例如数字与文 字的排序就不一样。此外,排序的字符与语系的编码有关,因此, 如果您需要排序时,建议使用 LC_ALL=C 来让语系统一,数据排序比较好一些。 [root@linux ~]# sort [-fbMnrtuk] [file or stdin] 参数: -f :忽略大小写的差异,例如 A 与 a 视为编码相同; -b :忽略最前面的空格符部分; -M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法; -n :使用『纯数字』进行排序(预设是以文字型态来排序的); -r :反向排序; -u :就是 uniq ,相同的数据中,仅出现一行代表; -t :分隔符,预设是 tab 键; -k :以那个区间 (field) 来进行排序的意思, 范例: 范例一:个人账号都记录在 /etc/passwd 下,请将账号进行排序。 [root@linux ~]# cat /etc/passwd | sort adm:x:3:4:adm:/var/adm:/sbin/nologin apache:x:48:48:Apache:/var/www:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin # 我省略很多的输出~由上面的数据看起来, sort 是预设『以第一个』数据来排序, # 而且预设是以『文字』型态来排序的喔!所以由 a 开始排到最后啰! 范例二:/etc/passwd 内容是以 : 来分隔的,我想以第三栏来排序,该如何? [root@linux ~]# cat /etc/passwd | sort -t ':' -k 3 root:x:0:0:root:/root:/bin/bash iiimd:x:100:101:IIIMF server:/usr/lib/iiim:/sbin/nologin uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin # 看到特殊字体的输出部分了吧?怎么会这样排列啊?呵呵!没错啦~ # 如果是以文字型态来排序的话,原本就会是这样,想要使用数字排序: # cat /etc/passwd | sort -t ':' -k 3 -n # 这样才行啊!用那个 -n 来告知 sort 以数字来排序啊! 范例三:利用 last ,将输出的数据仅取账号,并加以排序 [root@linux ~]# last | cut -d ' ' -f1 | sort sort 同样是很常用的指令呢!因为我们常常需要比较一些信息啦! 举个上面的第二个例子来说好了!今 天假设你有很多的账号,而且你想要知道最大的使用者 ID 目前到哪一号了!呵呵!使用 sort 一下子就 可以知道答案咯!当然其使用还不止此啦! 有空的话不妨玩一玩! • uniq 如果我排序完成了,想要将重复的资料仅列出一个显示,可以怎么做呢? [root@linux ~]# uniq [-ic] 参数: -i :忽略大小写字符的不同; -c :进行计数 范例: 范例一:使用 last 将账号列出,仅取出账号栏,进行排序后仅取出一位; [root@linux ~]# last | cut -d ' ' -f1 | sort | uniq 范例二:承上题,如果我还想要知道每个人的登入总次数呢? [root@linux ~]# last | cut -d ' ' -f1 | sort | uniq -c 这个指令用来将『重复的行删除掉只显示一个』,举个例子来说, 你要知道这个月份登入你主机的使用者 有谁,而不在乎他的登入次数,那么就使用上面的范例, (1)先将所有的数据列出;(2)再将人名独立出来; (3)经过排序;(4)只显示一个! 由于这个指令是在将重复的东西减少,所以当然需要『配合排序过的档案』 来处理啰! • wc 如果我想要知道 /etc/man.config 这个档案里面有多少字?多少行?多少字符的话, 可以怎么做呢?其 实可以利用 wc 这个指令来达成喔!他可以帮我们计算输出的讯息的整体数据! [root@linux ~]# wc [-lwm] 参数: -l :仅列出行; -w :仅列出多少字(英文单字); -m :多少字符; 范例: 范例一:那个 /etc/man.config 里面到底有多少相关字、行、字符数? [root@linux ~]# cat /etc/man.config | wc 138 709 4506 # 输出的三个数字中,分别代表: 『行、字数、字符数』 范例二:我知道使用 last 可以输出登入者,但是 last 最后两行并非账号内容, 那么请问,我该如何以一行指令串取得这个月份登入系统的总人次? [root@linux ~]# last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l # 由于 last 会输出空白行与 wtmp 字样在最底下两行,因此,我利用 # grep 取出非空白行,以及去除 wtmp 那一行,在计算行数,就能够了解啰! wc 也可以当作指令?呵呵!这可不是上洗手间的 WC 呢! 这是相当有用的计算档案内容的一个工具组喔! 举个例子来说, 当你要知道目前你的账号档案中有多少个账号时,就使用这个方法:『 cat /etc/passwd | wc -l 』啦!因为 /etc/passwd 里头一行代表一个使用者呀! 所以知道行数就晓得有多少的账号在里 头了!而如果要计算一个档案里头有多少个字符时,呵呵!就使用 wc -c 这个参数吧! 双向重导向: tee 想个简单的东西,我们由前一节知道 > 会将数据流整个传送给档案或装置, 因此我们除非去读取该档案 或装置,否则就无法继续利用这个数据流。 万一我想要将这个数据流的处理过程中,将某段讯息存下来, 应该怎么做?呵呵! 利用 tee 就可以啰~我们可以这样简单的看一下: 图五、tee 的工作流程 同时将数据流分送到档案去与屏幕 (screen);而输出到屏幕的,其实就是 stdout ,可以让下个指令继续 处理喔! [root@linux ~]# tee [-a] file 参数: -a :以累加 (append) 的方式,将数据加入 file 当中! 范例: [root@linux ~]# last | tee last.list | cut -d " " -f1 # 这个范例可以让我们将 last 的输出存一份到 last.list 档案中; [root@linux ~]# ls -l /home | tee ~/homefile | more # 这个范例则是将 ls 的数据存一份到 ~/homefile ,同时屏幕也有输出讯息! [root@linux ~]# ls -l / | tee -a ~/homefile | more # 要注意: tee 后接的档案会被覆盖,所以,我们要加上 -a # 这个参数才能将讯息累加。 有没有发现在命令重导向的时候,如果我们要将数据送出到档案的时候, 屏幕上就不会出现任何的数据! 那么如果我们需要将数据同时显示在屏幕上跟档案中呢?呵呵!这个时候就需要 tee 这个指令啰!使用 last 可以查看到这个月份的登入资料,而使用了 tee 之后,会将数据同时传给下一个命令去执行,也会 将数据写入 last.list 这个档案中!也是个好帮手! 字符转换命令: tr, col, join, paste, expand 我们在 vi 文书处理器 章节当中,提到过 DOS 断行字符与 Unix 断行字符的不同, 并且可以使用 dos2unix 与 unix2dos 来完成转换。好了,那么思考一下,是否还有其它常用的字符替代? 举例来说, 要将大写改成小写,或者是 [tab] 按键转成空格键?还有,如何将两篇讯息整合成一篇? 底下我们就来 介绍一下这些字符转换命令在管线当中的使用方法: • tr tr 可以用来删除一段讯息当中的文字,或者是进行文字讯息的替换! [root@linux ~]# tr [-ds] SET1 ... 参数: -d :删除讯息当中的 SET1 这个字符串; -s :取代掉重复的字符! 范例: 范例一:将 last 输出的讯息中,所有的小写变成大写字符: [root@linux ~]# last | tr '[a-z]' '[A-Z]' 范例二:将 /etc/passwd 输出的讯息中,将冒号 (:) 删除 [root@linux ~]# cat /etc/passwd | tr -d ':' 范例三:将 DOS 档案的断行字符 ^M 符号删除: [root@linux ~]# cat /home/test/dostxt | tr -d '\r' > dostxt-noM # 那个 /r 指的是 DOS 的断行字符,关于更多的字符,请参考 man tr 其实这个指令也可以写在『正规表示法』里头!因为他也是由正规表示法的方式来取代数据的! 以上面的 例子来说,使用 [] 可以设定一串字呢! 也常常用来取代档案中的怪异符号! 例如上面第三个例子当中, 可以去除 DOS 档案留下来的 ^M 这个断行的符号!这东西相当的有用!相信处理 Linux & Windows 系统 中的人们最麻烦的一件事就是这个事情啦!亦即是 DOS 底下会自动的在每行行尾加入 ^M 这个断行符号! 这个时候我们可以使用这个 tr 来将 ^M 去除! ^M 可以使用 \r 来代替之! • col [root@linux ~]# col [-x] 参数: -x :将 tab 键转换成对等的空格键 范例: [root@linux ~]# cat -A /etc/man.config <==此时会看到很多 ^I 的符号,那就是 tab [root@linux ~]# cat /etc/man.config | col -x | cat -A | more # 嘿嘿!如此一来, [tab] 按键会被取代成为空格键,输出就美观多了! 虽然 col 有他特殊的用途,不过,很多时候,他可以用来简单的处理将 [tab] 按键取代成为空格键! 例 如上面的例子当中,如果使用 cat -A 则 [tab] 会以 ^I 来表示。 但经过 col -x 的处理,则会将 [tab] 取代成为对等的空格键! • join join 看字面上的意义 (加入/参加) 就可以知道,他是在处理两个档案之间的数据, 而且,主要是在处理 『两个档案当中,有 "相同数据" 的那一行,将他加在一起』的意思。我们利用底下的简单例子来说明: [root@linux ~]# join [-ti12] file1 file2 参数: -t :join 预设以空格符分隔数据,并且比对『第一个字段』的数据, 如果两个档案相同,则将两笔数据联成一行,且第一个字段放在第一个! -i :忽略大小写的差异; -1 :这个是数字的 1 ,代表『第一个档案要用那个字段来分析』的意思; -2 :代表『第二个档案要用那个字段来分析』的意思。 范例: 范例一:用 root 的身份,将 /etc/passwd 与 /etc/shadow 相关数据整合成一栏 [root@linux ~]# join -t ':' /etc/passwd /etc/shadow bin:x:1:1:bin:/bin:/sbin/nologin:*:12959:0:99999:7::: daemon:x:2:2:daemon:/sbin:/sbin/nologin:*:12959:0:99999:7::: adm:x:3:4:adm:/var/adm:/sbin/nologin:*:12959:0:99999:7::: # 因为 /etc/shadow 的权限问题,所以这里必须是 root 才能动作!而 /etc/passwd # 与 /etc/shadow 都是以 : 来分隔字段,所以必须要使用 -t ':' 规范字段分隔字符。 # 且,因为 /etc/shadow 与 /etc/passwd 刚好都是以第一个字段为账号名称,所以, # 就可以将同一行的数据给他贴在一起了! # 另外,再仔细看一下 /etc/shadow 的内容与 /etc/passwd 的内容,您会发现, # 两者都以账号为开始,而上面的输出数据中您会发现特殊字体部分,那代表 # 第二个档案的内容。在第二个档案的内容部分,由于账号(第一个字段)与 # 第一的档案是相同的,所以当然就省略掉,因此就成为上面的输出。 范例二:我们知道 /etc/passwd 第四个字段是 GID ,那个 GID 记录在 /etc/group 当中的第三个字段,请问如何将两个档案整合? [root@linux ~]# join -t ':' -1 4 /etc/passwd -2 3 /etc/group 0:root:x:0:root:/root:/bin/bash:root:x: 1:bin:x:1:bin:/bin:/sbin/nologin:bin:x:root,bin,daemon 2:daemon:x:2:daemon:/sbin:/sbin/nologin:daemon:x:root,bin,daemon 4:adm:x:3:adm:/var/adm:/sbin/nologin:adm:x:root,adm,daemon # 这个例子就更明显了!原本的 /etc/passwd 的第一行内容应该是: # root:x:0:0:root:/root:/bin/bash # 至于 /etc/group 第一行内容应该是: # root:x:0: # 我将第一个档案的第四栏与第二个档案的第三栏取出,放置到输出的最前方, # 然后将剩下的数据给他加在一起!就成了上面的输出啦! 这个 join 在处理两个相关的数据文件时,就真的是很有帮助的啦! 例如上面的案例当中,我的 /etc/passwd, /etc/shadow, /etc/group 都是有相关性的, 其中 /etc/passwd, /etc/shadow 以账号为 相关性,至于 /etc/passwd, /etc/group 则以所谓的 GID (账号的数字定义) 来作为他的相关性。根据这 个相关性, 我们可以将有关系的资料放置在一起!这在处理数据可是相当有帮助的! 但是上面的例子有 点难,希望您可以静下心好好的看一看原因喔! • paste 这个 paste 就要比 join 简单多了!相对于 join 必须要比对两个档案的数据相关性, paste 就直接『将 两行贴在一起,且中间以 [tab] 键隔开』而已!简单的使用方法: [root@linux ~]# paste [-d] file1 file2 参数: -d :后面可以接分隔字符。预设是以 [tab] 来分隔的! - :如果 file 部分写成 - ,表示来自 standard input 的资料的意思。 范例: 范例一:将 /etc/passwd 与 /etc/shadow 同一行贴在一起 [root@linux ~]# paste /etc/passwd /etc/shadow bin:x:1:1:bin:/bin:/sbin/nologin bin:*:12959:0:99999:7::: daemon:x:2:2:daemon:/sbin:/sbin/nologin daemon:*:12959:0:99999:7::: adm:x:3:4:adm:/var/adm:/sbin/nologin adm:*:12959:0:99999:7::: # 注意喔!同一行中间是以 [tab] 按键隔开的! 范例二:先将 /etc/group 读出(用 cat),然后与范例一贴上一起!且仅取出前三行 [root@linux ~]# cat /etc/group|paste /etc/passwd /etc/shadow -|head -n 3 # 这个例子的重点在那个 - 的使用!那玩意儿常常代表 stdin 喔! • expand 这玩意儿就是在将 [tab] 按键转成空格键啦~可以这样玩: [root@linux ~]# expand [-t] file 参数: -t :后面可以接数字。一般来说,一个 tab 按键可以用 8 个空格键取代。 我们也可以自行定义一个 [tab] 按键代表多少个字符呢! 范例: 范例一:将 /etc/man.config 内行首为 MANPATH 的字样就取出;仅取前三行; [root@linux ~]# grep '^MANPATH' /etc/man.config | head -n 3 MANPATH /usr/man MANPATH /usr/share/man MANPATH /usr/local/man # 行首的代表标志为 ^ ,这个我们留待下节介绍!先有概念即可! 范例二:承上,如果我想要将所有的符号都列出来?(用 cat) [root@linux ~]# grep '^MANPATH' /etc/man.config | head -n 3 |cat -A MANPATH^I/usr/man$ MANPATH^I/usr/share/man$ MANPATH^I/usr/local/man$ # 发现差别了吗?没错~ [tab] 按键可以被 cat -A 显示成为 ^I 范例三:承上,我将 [tab] 按键设定成 6 个字符的话? [root@linux ~]# grep '^MANPATH' /etc/man.config | head -n 3 | \ > expand -t 6 - | cat -A MANPATH /usr/man$ MANPATH /usr/share/man$ MANPATH /usr/local/man$ 123456123456123456..... # 仔细看一下上面的数字说明,因为我是以 6 个字符来代表一个 [tab] 的长度,所以, # MAN... 到 /usr 之间会隔 12 (两个 [tab]) 个字符喔!如果 tab 改成 9 的话, # 情况就又不同了!这里也不好理解~您可以多设定几个数字来查阅就晓得! expand 也是挺好玩的~他会自动将 [tab] 转成空格键~所以,以上面的例子来说, 使用 cat -A 就会查 不到 ^I 的字符啰~此外,因为 [tab] 最大的功能就是格式排列整齐! 我们转成空格键后,这个空格键 也会依据我们自己的定义来增加大小~ 所以,并不是一个 ^I 就会换成 8 个空白喔!这个地方要特别注 意的哩! 此外,您也可以参考一下 unexpand 这个将空白转成 [tab] 的指令功能啊! ^_^ 分割命令: split 如果你有档案太大,导致一些携带式装置无法复制的问题,嘿嘿!找 split 就对了! 他可以帮你将一个 大档案,依据档案大小或行数来分割,就可以将大档案分割成为小档案了! 快速又有效啊!真不错~ [root@linux ~]# split [-bl] file PREFIX 参数: -b :后面可接欲分割成的档案大小,可加单位,例如 b, k, m 等; -l :以行数来进行分割。 范例: 范例一:我的 /etc/termcap 有七百多 K,若想要分成 300K 一个档案时? [root@linux ~]# cd /tmp; split -b 300k /etc/termcap termcap [root@linux tmp]# ls -l termcap* -rw-rw-r-- 1 root root 307200 8 月 17 00:25 termcapaa -rw-rw-r-- 1 root root 307200 8 月 17 00:25 termcapab -rw-rw-r-- 1 root root 184848 8 月 17 00:25 termcapac # 那个档名可以随意取的啦!我们只要写上前导文字,小档案就会以 # xxxaa, xxxab, xxxac 等方式来建立小档案的! 范例二:如何将上面的三个小档案合成一个档案,档名为 termcapback [root@linux tmp]# cat termcap* >> termcapback # 很简单吧?就用数据流重导向就好啦!简单! 范例三:使用 ls -al / 输出的信息中,每十行记录成一个档案 [root@linux tmp]# ls -al / | split -l 10 - lsroot # 重点在那个 - 啦!一般来说,如果需要 stdout/stdin 时,但偏偏又没有档案, # 有的只是 - 时,那么那个 - 就会被当成 stdin 或 stdout ~ 在 Windows 的情况下,你要将档案分割需要如何作?!伤脑筋吧!呵呵!在 Linux 底下就简单的多了! 你要将档案分割的话,那么就使用 -b size 来将一个分割的档案限制其大小,如果是行数的话,那么就使 用 -l line 来分割!好用的很!如此一来,你就可以轻易的将你的档案分割成 floppy 的大小,方便你 copy 啰! 参数代换: xargs xargs 是在做什么的呢?就以字面上的意义来看, x 是加减乘除的乘号,args 则是 arguments (参数) 的 意思,所以说,这个玩意儿就是在产生某个指令的参数的意思! xargs 可以读入 stdin 的数据,并且以 空格符或断行字符作为分辨,将 stdin 的资料分隔成为 arguments 。 因为是以空格符作为分隔,所以, 如果有一些档名或者是其它意义的名词内含有空格符的时候, xargs 可能就会误判了~他的用法其实也还 满简单的!就来看一看先! [root@linux ~]# xargs [-0epn] command 参数: -0 :如果输入的 stdin 含有特殊字符,例如 `, \, 空格键等等字符时,这个 -0 参数 可以将他还原成一般字符。这个参数可以用于特殊状态喔! -e :这个是 EOF (end of file) 的意思。后面可以接一个字符串,当 xargs 分析到 这个字符串时,就会停止继续工作! -p :在执行每个指令的 argument 时,都会询问使用者的意思; -n :后面接次数,每次 command 指令执行时,要使用几个参数的意思。看范例三。 当 xargs 后面没有接任何的指令时,预设是以 echo 来进行输出喔! 范例: 范例一:将 /etc/passwd 内的第一栏取出,仅取三行,使用 finger 这个指令将每个 账号内容秀出来 [root@linux ~]# cut -d':' -f1 < /etc/passwd |head -n 3| xargs finger Login: root Name: root Directory: /root Shell: /bin/bash Never logged in. No mail. No Plan. ......底下省略..... # 由 finger account 可以取得该账号的相关说明内容,例如上面的输出就是 finger root # 后的结果。在这个例子当中,我们利用 cut 取出账号名称,用 head 取出三个账号, # 最后则是由 xargs 将三个账号的名称变成 finger 后面需要的参数! 范例二:同上,但是每次执行 finger 时,都要询问使用者是否动作? [root@linux ~]# cut -d':' -f1 < /etc/passwd |head -n 3| xargs -p finger finger root bin daemon ?...y ......底下省略..... # 呵呵!这个 -p 的参数有趣了吧?!他可以让使用者的使用过程中,被询问到每个 # 指令是否执行! 范例三:将所有的 /etc/passwd 内的账号都以 finger 查阅,但一次仅查阅五个账号 [root@linux ~]# cut -d':' -f1 < /etc/passwd | xargs -p -n 5 finger finger root bin daemon adm lp ?...y ......底下省略..... # 在这里鸟哥使用了 -p 这个参数来让您对于 -n 更有概念。一般来说,某些指令后面 # 可以接的 arguments 是有限制的,不能无限制的累加,此时,我们可以利用 -n # 来帮助我们将参数分成数个部分,每个部分分别再以指令来执行!这样就 OK 啦!^_^ [root@linux ~]# 范例四:同上,但是当分析到 lp 就结束这串指令? [root@linux ~]# cut -d':' -f1 < /etc/passwd | xargs -p -e'lp' finger finger root bin daemon adm ?... # 仔细与上面的案例做比较。也同时注意,那个 -e'lp' 是连在一起的,中间没有空格键。 # 上个例子当中,第五个参数是 lp 啊,那么我们下达 -e'lp' 后,则分析到 lp # 这个字符串时,后面的其它 stdin 的内容就会被 xargs 舍弃掉了! 其实,在 man xargs 里面就有三四个小范例,您可以自行参考一下内容。 此外, xargs 真的是很好用的 一个玩意儿!您真的需要好好的参详参详! 关于减号 - 的用途 管线命令在 bash 的连续的处理程序中是相当重要的!另外,在 log file 的分析当中也是相当重要的一 环, 所以请特别留意!另外,在管线命令当中,常常会使用到前一个指令的 stdout 作为这次的 stdin , 某些指令需要用到文件名称 (例如 tar) 来进行处理时,该 stdin 与 stdout 可以利用减号 "-" 来替代, 举例来说: [root@linux ~]# tar -cvf - /home | tar -xvf 上面这个例子是说:『我将 /home 里面的档案给他打包,但打包的数据不是纪录到档案,而是传送到 stdout; 经过管线后,将 tar -cvf - /home 传送给后面的 tar -xvf - 』。后面的这个 - 则是取用前 一个指令的 stdout, 因此,我们就不需要使用 file 了!这是很常见的例子喔!注意注意! 本章习题练习 ( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 ) • 在 Linux 上可以找到哪些 shell(举出三个) ?那个档案记录可用的 shell ?而 Linux 预设的 shell 是? 1) /bin/bash, /bin/tcsh, /bin/csh 2) /etc/shells 3) bash ,亦即是 /bin/bash。 • 在 shell 环境下,有个提示字符 (prompt),他可以修改吗?要改什么?预设的提示字符内容是? 可以修改的,改 PS1 这个变量,这个 PS1 变量的预设内容为:『[\u@\h \W]\$』 • 如何显示 HOME 这个环境变量? echo $HOME • 如何得知目前的所有变量与环境变量的设定值? 环境变量用 env 而所有变量用 set 即可显示 • 我是否可以设定一个变量名称为 3myhome ? 不行!变量不能以数字做为开头,参考变量设定规则的内容 • 在这样的练习中『A=B』且『B=C』,若我下达『unset $A』,则取消的变数是 A 还是 B? 被取消的是 B 喔,因为 unset $A 相当于 unset B 所以取消的是 B ,A 会继续存在! • 如何取消变量与命令别名的内容? 使用 unset 及 unalias 即可 • 如何设定一个变量名称为 name 内容为 It's my name ? name=It\'s\ my\ name 或 name="It's my name" • 环境变量档案的加载顺序? 先由 /etc/passwd 取得 bash 这个 shell ,再到 /etc/profile 读取主要的环境变量,同时亦 会将 /etc/inputrc 及 /etc/profile.d 内容均读入。之后,再到个人的家目录读取 ~/.bash_profile 及 ~/.bashrc 等档案! • man page 的路径设定档案? /etc/man.config 或 /etc/man.conf • 试说明 ', ", 与 ` 这些符号在变量定义中的用途? 参考变量规则那一章节,其中, " 可以具有变量的内容属性, ' 则仅有一般字符,至于 ` 之内 则是可先被执行的指令。 • 跳脱符号 \ 有什么用途? 可以用来跳脱特殊字符,例如 Enter, $ 等等,使成为一般字符! • 连续命令中, ;, &&, || 有何不同? 分号可以让两个 command 连续运作,不考虑 command1 的输出状态, && 则前一个指令必需要没 有错误讯息,亦即回传值需为 0 则 command2 才会被执行, || 则与 && 相反! • 如何将 last 的结果中,独立出账号,并且印出本月份曾经登入过的账号? last | cut –d “ “ –f1 | sort | uniq • 请问 foo1 && foo2 | foo3 > foo4 ,这个指令串当中, foo1/foo2/foo3/foo4 是指令还是档案? 整串指令的意义为? foo1/foo2 与 foo3 都是指令, foo4 是装置或档案。整串指令意义为: 1. 当 foo1 执行结果有错误时,则该指令串结束; 2. 若 foo1 执行结果没有错误时,则执行 foo2 | foo3 > foo4 ; 1. foo2 将 stdout 输出的结果传给 foo3 处理; 2. foo3 将来自 foo2 的 stdout 当成 stdin ,处理完后将数据流重新导向 foo4 这个装置/档案 • 如何秀出在 /bin 底下任何以 a 为开头的档案文件名的详细资料? ls -l /bin/a* • 如何秀出 /bin 底下,文件名为四个字符的档案? ls -l /bin/???? • 如何秀出 /bin 底下,档名开头不是 a-d 的档案? ls -l /bin/[!a-d]* • 当我离开 bash 后,希望系统可以帮我将最近工作的:1.)工作日期; 2.)100 个历史命令独立 记 录到 ~/.bash_localcom 档案中,该如何设定? 我可以编辑 ~/.bash_logout ,将这个档案内容变成: # ~/.bash_logout date >> ~/.bash_localcom history 100 >> ~/.bash_localcom clear • 我想要让终端机接口的登入提示字符修改成我自己喜好的模样,应该要改哪里?(filename) /etc/issue • 承上题,如果我是想要让使用者登入后,才显示欢迎讯息,又应该要改哪里? /etc/motd 参考数据 • 卧龙小三的教学文件:http://linux.tnc.edu.tw/techdoc/shell/book1.html • GNU 计划的 BASH 说明:http://www.gnu.org/manual/bash-2.05a/html_mono/bashref.html 鸟哥的备份:http://linux.vbird.org/linux_basic/0320bash/0320bash_reference.php • man bash 正规表示法 Regular Expression, RE 最近更新日期:2005/09/05 正规表示法(或称为常规表示法)是透过一些特殊字符的排列,用以 搜寻/取代/删除 一列或多列文字字符 串, 简单的说,正规表示法就是用在字符串的处理上面的一项『表示式』。正规表示法并不是一个工具程 序, 而是一个字符串处理的标准依据,如果您想要以正规表示法的方式处理字符串,就得要使用支持正规 表示法的工具程序才行, 这类的工具程序很多,例如 vi, sed, awk 等等。 正规表示法对于系统管理员来说,实在是很重要。因为系统会产生很多的讯息,这些讯息有的重要,有的 仅是告知, 此时,管理员可以透过正规表示法的功能来将重要讯息撷取出来,并产生便于查阅的报表,简 化管理流程。此外, 很多的软件包也都支持正规表示法的分析,例如邮件服务器的过滤机制(过滤垃圾信 件)就是很重要的一个例子。 所以,您最好要了解正规表示法的相关技能,在未来管理主机时,才能够更 精简处理您的日常事务! 注:本章节使用者需要多加练习,因为目前很多的套件都是使用正规表示法来达成其『过滤、分析』的目 的, 为了未来主机管理的便利性,使用者至少要能看的懂正规表示法的意义! 1. 前言: 2. 基础正规表示法: 2.1 以 grep 撷取字符串 2.2 重要特殊字符(characters) 3. 延伸正规表示法: 4. 格式化打印: printf 5. sed 工具简介 6. awk 工具简介 7. 文件数据比对与打印的相关功能 7.1 档案比对: diff, cmp, patch 7.2 档案打印准备: pr 8. 重点回顾 9. 参考资源 10.本章习题练习 11. 针对本文的建议:http://phorum.vbird.org/viewtopic.php?t=23885 前言 约略了解了 Linux 的基本指令 ( Shell ) 并且熟悉了 vi 之后,相信您对于敲击键盘与指令比较不陌生了 吧?? 接下来,底下要开始介绍一个很重要的观念,那就是所谓的『正规表示法』啰! 什么是正规表示法 任何一个有经验的系统管理员,都会告诉您:『正规表示法真是挺重要的!』 为什么很重要呢?因为日常生 活就使用的到啊!举个例子来说, 在您日常处理文书作业时,应该会常常使用到『搜寻/取代』等等的功 能吧? 这些举动要作的漂亮,就是正规表示法的工作了! 简单的说,正规表示法就是处理字符串的方法,他是以行为单位, 来进行字符串的处理行为,他透过一些 特殊符号的辅助,可以让使用者轻易的达到 搜寻/取代 某特定字符串的处理程序! 举例来说,我要找到 VBird 或 Vbird 这个字样,但是不要其它的字符串,该如何办理? 如果在没有正规 表示法的环境中(例如 MS word),您或许就得要使用忽略大小写的办法, 或者是分别以 VBird 及 Vbird 搜寻两遍。但是,忽略大小写可能会搜寻到 VBIRD/vbird/VbIrD 等等的不需要的字符串,而造成使用者的 困扰。 再举个系统常见的例子好了,假设妳发现系统在开机的时候,老是会出现一个关于 mail 程序的错误, 而 开机过程的相关程序都是在 /etc/rc.d/ 底下,也就是说,在该目录底下的某个档案内具有 mail 这个关键词, 好了,此时,您怎么找出来含有这个关键词的档案??您当然可以一个档案一个档案的开启, 然后去搜寻 mail 这个关键词,只是.....该目录底下的档案可能不止 100 个说~ 如果了解正规表示法的相关技巧,那么 只要一行指令就找出来啦! 『grep 'mail' /etc/rc.d/*』 那个 grep 就是支持正规表示法的工具程序之一!如 何~很简单吧! ^_^y 谈到这里就得要进一步说明了,正规表示法基本上是一种『表示法』, 只要工具程序支持这种表示法,那 么该工具程序就可以用来作为正规表示法的字符串处理之用。也就是说,例如 vi, grep, awk ,sed 等等工具, 因为她们有支持正规表示法, 所以,这些工具就可以使用正规表示法的特殊字符来进行字符串的处理。 正规表示法对于系统管理员的用途 那么为何我需要学习正规表示法呢?对于一般使用者来说,由于使用到正规表示法的机会可能不怎么多, 因此感受不到他的魅力,不过,对于身为系统管理员的您来说, 正规表示法则是一个『不可不学的好东西! 』 怎么说呢?由于系统如果在繁忙的情况之下,每天产生的讯息信息会多到你无法想象的地步, 而我们 也都知道,系统的『错误讯息登录档案』 的内容(这部份我们在第五篇会详谈)记载了系统产生的所有讯息, 当然, 这包含你的系统是否被『入侵』的纪录数据。 但是系统的数据量太大了,要身为系统管理员的你每天去看这么多的讯息数据, 从千百行的资料里面找出 一行有问题的讯息,呵呵~光是用肉眼去看,想不疯掉都很难! 这个时候,我们就可以透过『正规表示法』 的功能,将这些登录的信息进行处理, 仅取出『有问题』的信息来进行分析,哈哈!如此一来,你的系统 管理工作将会 『快乐得不得了』啊!当然,正规表示法的优点还不止于此,等您有一定程度的了解之后, 您会爱上他喔! 正规表示法的广泛用途 正规表示法除了可以让系统管理员管理主机更为便利之外,事实上, 由于正规表示法强大的字符串处理能 力,目前一堆软件都支持正规表示法呢! 最常见的就是『邮件服务器』啦! 如果您留意因特网上的消息,那么应该不能发现,目前造成网络大塞车的主因之一就是『垃圾/广告信件』 了, 而如果我们可以在主机端,就将这些问题邮件剔除的话,客户端就会减少很多不必要的频宽耗损了。 那么如何剔除广告信件呢?由于广告信件几乎都有一定的标题或者是内容,因此, 只要每次有来信时,都 先将来信的标题与内容进行特殊字符串的比对,发现有不良信件就予以剔除! 嘿!这个工作怎么达到啊? 就使用正规表示法啊!目前两大邮件服务器软件 sendmail 与 postfix 以及支持邮件服务器的相关分析套 件,都支持正规表示法的比对功能! 当然还不止于此啦,很多的服务器软件、以及套件都支持正规表示法呢!当然, 虽然各家软件都支持他, 不过,这些『字符串』的比对还是需要系统管理员来加入比对规则的, 所以啦!身为系统管理员的你,为 了自身的工作以及客户端的需求, 正规表示法实在是很需要也很值得学习的一项工具呢! 正规表示法与 Shell 在 Linux 当中的角色定位 说实在的,我们在学数学的时候,一个很重要、但是粉难的东西是一定要『背』的, 那就是九九表,背成 功了之后,未来在数学应用的路途上,真是一帆风顺啊! 这个九九表我们在小学的时候几乎背了一整年才 背下来,并不是这么好背的呢! 但他却是基础当中的基础!您现在一定受惠相当的多呢 ^_^! 而我们谈 到的这个正规表示法,与前一章的 BASH shell 就有点像是数学的九九表一样,是 Linux 基础当中的基础, 虽然也是最难的部分, 不过,如果学成了之后,一定是『大大的有帮助』的!这就好像是金庸小说里面的 学武难关, 任督二脉,打通任督二脉之后,武功立刻成倍成长!所以啦, 不论是对于系统的认识与系统 的管理部分,他都有很棒的辅助啊!请好好的学习这个基础吧! ^_^ 延伸的正规表示法 正规表示法除了简单的一组字符串处理之外,还可以作群组的字符串处理, 例如进行搜寻 VBird 或 netman 或 lman 的搜寻,注意,是『或(or)』而不是『和(and)』的处理, 此时就需要延伸正规表示法的帮 助啦!藉由特殊的 ( 与 | 等字符的协助, 就能够达到这样的目的!好啦!清清脑门,咱们用功去啰! Tips: 有一点要向大家报告的,那就是:『正规表示法与万用字符是不一 样的东西!』 这很重要喔!因为万用字符 (wildcard) 所代表的意 义与正规表示法并不相同~ 要分的很清楚才行喔!所以,学习本 章,请将前一章 bash 的万用字符意义先忘掉吧! 基础正规表示法 既然正规表示法是处理字符串的一个标准表示方式,他需要支持的工具程序来辅助, 所以,我们这里就先 介绍一个最简单的字符串撷取功能的工具程序,那就是 grep 啰! 在介绍完 grep 的基本功能之后,就进 入正规表示法的特殊字符的处理能力了。 以 grep 撷取字符串 既然要使用 grep 当然就得要先了解一下 grep 的语法啰~ [root@test root]# grep [-acinv] '搜寻字符串' filename 参数说明: -a :将 binary 档案以 text 档案的方式搜寻数据 -c :计算找到 '搜寻字符串' 的次数 -i :忽略大小写的不同,所以大小写视为相同 -n :顺便输出行号 -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行! 范例: [root@test root]# grep 'root' /var/log/secure 将 /var/log/secure 这个档案中有 root 的那一行秀出来 [root@test root]# grep -v 'root' /var/log/secure 若该行没有 root 才将数据秀出来到屏幕上! [root@test root]# last | grep root 若该行有 root 才将数据秀出来到屏幕上! grep 是一个很常见也很常用的指令,他最重要的功能就是进行字符串数据的比对, 然后将符合使用者需 求的字符串打印出来。 需要说明的是『grep 在数据中查寻一个字符串时,是以 "整行" 为单位来进行数据 的撷取的!』也就是说,假如一个档案内有 10 行,其中有两行具有你所搜寻的字符串,则将那两行显示 在屏幕上,其它的就丢弃了! 而 grep 除了可以进行档案的资料搜寻之外,也常常被应用在 input/output 的数据处理当中,例如常见的 管线命令 ( pipe ) 就可以常常见到他的踪影! 以上面表格中的例子来看,我们可以发现前两个例子是查寻 档案的内容,有没有加上 -v 所显示出来的结果是『相反的!』,而第三个例子则是以 pipe 的功能进行数据 的处理的喔! 好了,我们就开始以 grep 来进行正规表示法的简易说明吧!我们先以底下这个档案来作为范例: [root@test root]# vi regular_express.txt "Open Source" is a good mechanism to develop programs. apple is my favorite food. Football game is not use feet only. this dress doesn't fit me. However, this dress is about $ 3183 dollars. GNU is free air not free beer. Her hair is very beauty. I can’t finish the test. Oh! The soup taste good. motorcycle is cheap than car. This window is clear. the symbol '*' is represented as start. Oh! My god! The gd software is a library for drafting programs. You are the best is mean you are the no. 1. The world is the same with "glad". I like dog. google is the best tools for search keyword. goooooogle yes! go! go! Let's go. # I am VBird 需要特别注意的是,上面这个档案鸟哥是在 Windows 的环境下编辑的, 并且经过特殊处理过,因此,他 虽然是纯文字文件,但是内含一些 Windows 环境下的软件常常自行加入的一些特殊字符,例如断行字符 (^M)就是一例! 所以,您可以直接将上面的文字以 vi 储存成 regular_express.txt 这个档案, 不过,比较 建议直接点底下的连结下载: http://linux.vbird.org/linux_basic/0330regularex/regular_express.txt 此外,因为不同的语系编码是不一样的,所以,您必须要将语系改成英文语系, 才能够进行底下的测试, 否则,可能会有显示的内容与底下的输出不符的状况喔! 修改语系的方法为: [root@test root]# LANG=en [root@test root]# export LANG 好了,现在开始我们一个案例一个案例的来介绍吧! • 例题一、搜寻特定字符串: 搜寻特定字符串很简单吧?假设我们要从刚刚的档案当中取得 the 这个特定字符串, 最简单的 方式就是这样: [root@test root]# grep -n 'the' regular_express.txt 8:I can't finish the test. 12:the symbol '*' is represented as start. 15:You are the best is mean you are the no. 1. 16:The world is the same with "glad". 18:google is the best tools for search keyword. 那如果想要『反向选择』呢?也就是说,当该行没有 'the' 这个字符串时,才显示在屏幕上,那就 直接使用: [root@test root]# grep -vn 'the' regular_express.txt 您会发现,屏幕上出现的行列为除了 8,12,15,16,18 五行之外的其它行列! 接下来,如果您想要 取得不论大小写的 the 这个字符串,则: [root@test root]# grep -in 'the' regular_express.txt 8:I can't finish the test. 9:Oh! The soup taste good. 12:the symbol '*' is represented as start. 14:The gd software is a library for drafting programs. 15:You are the best is mean you are the no. 1. 16:The world is the same with "glad". 18:google is the best tools for search keyword. • 例题二、利用 [] 来搜寻集合字符 如果我想要搜寻 test 或 taste 这两个单字时,可以发现到,其实她们有共通的 't?st' 存在~这个 时候,我可以这样来搜寻: [root@test root]# grep -n 't[ae]st' regular_express.txt 8:I can't finish the test. 9:Oh! The soup taste good. 了解了吧?其实 [] 里面不论有几个字符,他都谨代表某『一个』字符, 所以,上面的例子说明 了,我需要的字符串是『tast』或『test』两个字符串而已! 而如果想要搜寻到有 oo 的字符时, 则使用: [root@test root]# grep -n 'oo' regular_express.txt 1:"Open Source" is a good mechanism to develop programs. 2:apple is my favorite food. 3:Football game is not use feet only. 9:Oh! The soup taste good. 18:google is the best tools for search keyword. 19:goooooogle yes! 但是,如果我不想要 oo 前面有 g 的话呢?此时,可以利用在集合字符的反向选择 [^] 来达成 [root@test root]# grep -n '[^g]oo' regular_express.txt 2:apple is my favorite food. 3:Football game is not use feet only. 18:google is the best tools for search keyword. 19:goooooogle yes! 意思就是说,我需要的是 oo ,但是 oo 前面不能是 g 就是了! 仔细比较上面两个表格,妳会 发现,第 1,9 行不见了,因为 oo 前面出现了 g 所致! 第 2,3 行没有疑问,因为 foo 与 Foo 均 可被接受!但是第 18 行明明有 google 的 goo 啊~ 别忘记了,因为该行后面出现了 tool 的 too 啊!所以该行也被列出来~ 也就是说, 18 行里面虽然出现了我们所不要的项目 (goo) 但是由 于有需要的项目 (too) , 因此,是符合字符串搜寻的喔! 至于第 19 行,同样的,因为 goooooogle 里面的 oo 前面可能是 o ,例如: go(ooo)oogle ,所 以,这一行也是符合需求的! 再来,假设我 oo 前面不想要有小写字符,所以,我可以这样写 [^abcd....z]oo , 但是这样似乎 不怎么方便,由于小写字符的 ASCII 上编码的顺序是连续的, 因此,我们可以将之简化为底下 这样: [root@test root]# grep -n '[^a-z]oo' regular_express.txt 3:Football game is not use feet only. 也就是说,当我们在一组集合字符中,如果该字符组是连续的,例如大写英文/小写英文/数字等等, 就可以使用[a-z],[A-Z],[0-9]等方式来书写,那么如果我们的要求字符串是数字与英文呢? 呵呵! 就将他全部写在一起,变成:[a-zA-Z0-9] 例如,我们要取得有数字的那一行,就这样: [root@test root]# grep -n '[0-9]' regular_express.txt 5:However, this dress is about $ 3183 dollars. 15:You are the best is mean you are the no. 1. 这样对于 [] 以及 [^] 以及 [] 当中的 - 有了解了吗?! ^_^y • 例题三、行首与行尾字符 ^ $: 我们在例题一当中,可以查询到一行字符串里面有 the 的,那如果我想要让 the 只在行首列出 呢? 这个时候就得要使用定位字符了!我们可以这样做: [root@test root]# grep -n '^the' regular_express.txt 12:the symbol '*' is represented as start. 此时,就只剩下第 12 行,因为只有第 12 行的行首是 the 开头啊~此外, 如果我想要开头是 小写字符的那一行就列出呢?可以这样: [root@test root]# grep -n '^[a-z]' regular_express.txt 2:apple is my favorite food. 4:this dress doesn't fit me. 10:motorcycle is cheap than car. 12:the symbol '*' is represented as start. 18:google is the best tools for search keyword. 19:goooooogle yes! 如果我不想要开头是英文字母,则可以是这样: [root@test root]# grep -n '^[^a-zA-Z]' regular_express.txt 1:"Open Source" is a good mechanism to develop programs. 20:# I am VBird 注意到了吧?那个 ^ 符号,在字符集合符号(括号[])之内与之外是不同的! 在 [] 内代表『反向 选择』,在 [] 之外则代表定位在行首的意义!要分清楚喔! 那如果我想要找出来,行尾结束为小数点 (.) 的那一行,该如何处理: [root@test root]# grep -n '\.$' regular_express.txt 1:"Open Source" is a good mechanism to develop programs. 2:apple is my favorite food. 3:Football game is not use feet only. 4:this dress doesn't fit me. 10:motorcycle is cheap than car. 11:This window is clear. 12:the symbol '*' is represented as start. 15:You are the best is mean you are the no. 1. 16:The world is the same with "glad". 17:I like dog. 18:google is the best tools for search keyword. 特别注意到,因为小数点具有其它意义(底下会介绍),所以必须要使用跳脱字符(\)来加以解除其特 殊意义! 不过,您或许会觉得奇怪,但是第 5~9 行最后面也是 . 啊~怎么无法打印出来?? 这 里就牵涉到 Windows 平台的软件对于断行字符的判断问题了!我们使用 cat -A 将第五行拿出来 看, 您会发现: [root@test root]# cat -A regular_express.txt However, this dress is about $ 3183 dollars.^M$ 注意到了没?最后面的断行字符应该是 $ 才对,但是,因为 Windows 的 nodepad 会主动加上 ^M 作为断行的判断,因此,那个 . 自然就不是紧接在 $ 之前喔!这样可以了解 ^ 与 $ 的意义 吗? 好了,先不要看底下的解答,自己想一想,那么如果我想要找出来,哪一行是『空白行』, 也 就是说,该行并没有输入任何数据,该如何搜寻?? [root@test root]# grep -n '^$' regular_express.txt 21: 因为只有行首跟行尾( ^$ ),所以,这样就可以找出空白行啦!再来, 假设您已经知道在一个批次 脚本 (shell script) 或者是设定档当中, 空白行与开头为 # 的那一行是批注,因此如果您要将资 料列出给别人参考时, 可以将这些数据省略掉,以节省保贵的纸张,那么,您可以怎么作呢? 我 们以 /etc/syslog.conf 这个档案来作范例,您可以自行参考一下输出的结果: [root@test root]# cat /etc/syslog.conf [root@test root]# grep -v '^$' /etc/syslog.conf | grep -v '^#' 是否节省很多版面啊?? • 例题四、任意一个字符 . 与重复字符 * 在 bash 的章节当中,我们知道万用字符 * 可以用来代表任意(0 或多个)字符, 但是正规表示法 并不是万用字符,两者之间是不相同的! 至于正规表示法当中的『 . 』则代表『绝对有一个任 意字符』的意思!这样讲不好懂, 我们直接做个练习吧!假设我需要找出 g??d 的字符串,亦即 共有四个字符, 起头是 g 而结束是 d ,我可以这样做: [root@test root]# grep -n 'g..d' regular_express.txt 1:"Open Source" is a good mechanism to develop programs. 9:Oh! The soup taste good. 16:The world is the same with "glad". 因为强调 g 与 d 之间一定要存在两个字符,因此,第 13 行的 god 与第 14 行的 gd 就不会被 列出来啦!再来,如果我想要列出有 oo, ooo, oooo 等等的数据, 也就是说,至少要有两个 o 以 上,该如何是好??是 o* 还是 oo* 还是 ooo* 呢? 虽然您可以试看看结果, 不过结果太占版 面了 @_@ ,所以,我这里就直接说明。 因为 * 代表的是『重复 0 个或多个前面的 RE 字符』的意义, 因此,『o*』代表的是:『拥有 空字符或一个 o 以上的字符』, 特别注意,因为允许空字符(就是有没有字符都可以的意思), 因此, grep -n 'o*' regular_express.txt 将会把所有的数据都打印出来屏幕上! 那如果是『oo*』呢?则第一个 o 肯定必须要存在,第二个 o 则是可有可无的多个 o , 所以, 凡是含有 o, oo, ooo, oooo 等等,都可以被列出来~ 同理,当我们需要『至少两个 o 以上的字符串』时,就需要 ooo* ,亦即是: [root@test root]# grep -n 'ooo*' regular_express.txt 1:"Open Source" is a good mechanism to develop programs. 2:apple is my favorite food. 3:Football game is not use feet only. 9:Oh! The soup taste good. 18:google is the best tools for search keyword. 19:goooooogle yes! 这样理解 * 的意义了吗?!好了,现在出个练习,如果我想要字符串开头与结尾都是 g, 但是 两个 g 之间仅能存在至少一个 o ,亦即是 gog, goog, gooog.... 等等, 那该如何? [root@test root]# grep -n 'goo*g' regular_express.txt 18:google is the best tools for search keyword. 19:goooooogle yes! 如此了解了吗?好,再来一题,如果我想要找出 g 开头与 g 结尾的字符串, 当中的字符可有可 无,那该如何是好?是『g*g』吗? [root@test root]# grep -n 'g*g' regular_express.txt 1:"Open Source" is a good mechanism to develop programs. 3:Football game is not use feet only. 9:Oh! The soup taste good. 13:Oh! My god! 14:The gd software is a library for drafting programs. 16:The world is the same with "glad". 17:I like dog. 18:google is the best tools for search keyword. 19:goooooogle yes! 但测试的结果竟然出现这么多行??太诡异了吧? 其实一点也不诡异,因为 g*g 里面的 g* 代 表『空字符或一个以上的 g』 在加上后面的 g ,因此,整个 RE 的内容就是 g, gg, ggg, gggg , 因此,只要该行当中拥有一个以上的 g 就符合所需了! 那该如何得到我们的 g....g 的需求呢?呵呵!就利用任意一个字符『.』啊! 亦即是:『g.*g』的 作法,因为 * 可以是 0 或多个重复前面的字符,而 . 是任意字符,所以: 『.* 就代表零个或 多个任意字符』的意思啦! [root@test root]# grep -n 'g.*g' regular_express.txt 1:"Open Source" is a good mechanism to develop programs. 14:The gd software is a library for drafting programs. 18:google is the best tools for search keyword. 19:goooooogle yes! 因为是代表 g 开头与 g 结尾,中间任意字符均可接受,所以,第 1 与第 14 行是可接受的喔! 这个 .* 的 RE 表示任意字符是很常见的,希望大家能够理解并且熟悉! 再出一题,如果我想要找出『任意数字』的行列呢?因为仅有数字,所以就成为: [root@test root]# grep -n '[0-9][0-9]*' regular_express.txt 5:However, this dress is about $ 3183 dollars. 15:You are the best is mean you are the no. 1. 虽然使用 grep -n '[0-9]' regular_express.txt 也可以得到相同的结果, 但鸟哥希望大家能够理解上 面指令当中 RE 表示法的意义才好! • 例题五、限定连续 RE 字符范围 {} 在上个例题当中,我们可以利用 . 与 RE 字符及 * 来设定 0 个到无线多个重复字符, 那如果 我想要限制一个范围区间内的重复字符数呢?举例来说,我想要找出两个到五个 o 的连续字符 串,该如何作?这时候就得要使用到限定范围的字符 {} 了。 但因为 { 与 } 的符号在 shell 是 有特殊意义的,因此, 我们必须要使用跳脱字符 \ 来让他失去特殊意义才行。 至于 {} 的语法是这样的,假设我要找到两个 o 的字符串,可以是: [root@test root]# grep -n 'o\{2\}' regular_express.txt 1:"Open Source" is a good mechanism to develop programs. 2:apple is my favorite food. 3:Football game is not use feet only. 9:Oh! The soup taste good. 18:google is the best tools for search keyword. 19:goooooogle yes! 这样看似乎与 ooo* 的字符没有什么差异啊?因为第 19 行有多个 o 依旧也出现了! 好,那么 换个搜寻的字符串,假设我们要找出 g 后面接 2 到 5 个 o ,然后再接一个 g 的字符串, 他 会是这样: [root@test root]# grep -n 'go\{2,5\}g' regular_express.txt 18:google is the best tools for search keyword. 嗯!很好!第 19 行终于没有被取用了(因为 19 行有 6 个 o 啊!)。 那么,如果我想要的是 2 个 o 以上的 goooo....g 呢?除了可以是 gooo*g ,也可以是: [root@test root]# grep -n 'go\{2,\}g' regular_express.txt 18:google is the best tools for search keyword. 19:goooooogle yes! 呵呵!就可以找出来啦~ 重要特殊字符(characters) 经过了上面的几个简单的范例,我们可以将基础的正规表示法特殊字符汇整如下: RE 字符 ^word word$ . 意义与范例 待搜寻的字符串(word)在行首! 范例:grep -n '^#' regular_express.txt 搜寻行首为 # 开始的那一行! 待搜寻的字符串(word)在行尾! 范例:grep -n '!$' regular_express.txt 将行尾为 ! 的那一行打印出来! 代表『任意一个』字符,一定是一个任意字符! 范例:grep -n 'e.e' regular_express.txt \ * \{n,m\} 搜寻的字符串可以是 (eve) (eae) (eee) (e e), 但不能仅有 (ee) !亦即 e 与 e 中间『一定』仅有一个字符,而空格符也是字符! 跳脱字符,将特殊符号的特殊意义去除! 范例:grep -n \' regular_express.txt 搜寻含有单引号 ' 的那一行! 重复零个或多个的前一个 RE 字符 范例:grep -n 'ess*' regular_express.txt 找出含有 (es) (ess) (esss) 等等的字符串,注意,因为 * 可以是 0 个,所以 es 也是符合带搜寻字符串。另外,因为 * 为重复『前一个 RE 字符』的符号, 因此,在 * 之前必须要紧接着一个 RE 字符喔!例如任意字符则为 『.*』 ! 连续 n 到 m 个的『前一个 RE 字符』 若为 \{n\} 则是连续 n 个的前一个 RE 字符, 若是 \{n,\} 则是连续 n 个以上的前一个 RE 字符! 范例:grep -n 'go\{2,3\}g' regular_express.txt 在 g 与 g 之间有 2 个到 3 个的 o 存在的字符串,亦即 (goog)(gooog) 字符集合的 RE 特殊字符的符号 [list] 范例:grep -n 'g[ld]' regular_express.txt 搜寻含有 (gl) 或 (gd) 的那一行~ 需要特别留意的是,在 [] 当中『谨代表一个待搜寻的字符』, 例如: a[afl]y 代表搜寻的字符串可以是 aay, afy, aly 亦即 [afl] 代表 a 或 f 或 l 的意思! [ch1-ch2] 范例:grep -n '[0-9]' regular_express.txt 搜寻含有任意数字的那一行!需特别留意,在字符集合 [] 中的减号 - 是有 特殊意义的,他代表两个字符之间的所有连续字符!但这个连续与否与 ASCII [] 编码有关, 因此,您的编码需要设定正确(在 bash 当中,需要确定 LANG 与 LANGUAGE 的变量是否正确!) 例如所有大写字符则为 [A-Z] [^] 范例:grep -n 'oo[^t]' regular_express.txt 搜寻的字符串可以是 (oog) (ood) 但不能是 (oot) ,那个 ^ 在 [] 内时, 代表的意义是『反向选择』的意思~例如,我不要大写字符,则为 [^A-Z] ~ 但是,需要特别注意的是,如果以 grep -n [^A-Z] regular_express.txt 来 搜寻,却发现该档案内的所有行都被列出,为什么?因为这个 [^A-Z] 是『非 大写字符』的意思, 因为每一行均有非大写字符,例如第一行的 "Open Source" 就有 p,e,n,o.... 等等的小写字符, 以及双引号 (") 等字符,所 以当然符合 [^A-Z] 的搜寻! 请特别留意的是,『正规表示法的特殊字符』 与一般在指令列输入指令的『万用字符』并不相同, 例如, 在万用字符当中,* 代表的是 0 ~ 无限多个字符的意思,但是在正规表示法当中, * 则是重复 0 到多个 的前一个 RE 字符的意思~使用的意义并不相同,不要搞混了! (鸟哥我一开始摸正规表示法时就很容易 搞混!因为这里是新手最容易搞错的地方,特别小心啊!) 举例来说,不支持正规表示法的 ls 这个工具中,若我们使用 『ls -l * 』 代表的是任意档名的档案,而 『ls -l a* 』代表的是以 a 为开头的任何档名的档案, 但在正规表示法中,我们要找到含有以 a 为开头的档 案,则必须要这样:(需搭配支持正规表示法的工具) ls | grep -n '^a.*' 另外,例如万用字符的反向选择,为 [!range] ,至于正规表示法则是 [^range] 。 这样是否了解正规表示 法与万用字符的差异啦?? 延伸正规表示法 事实上,一般读者只要了解基础型的正规表示法大概就已经相当足够了,不过,某些时刻, 为了要简化整 个指令操作,了解一下使用范围更广的延伸型正规表示法的表示式,会更方便呢! 举个简单的例子好了, 在上节的例题三的最后一个例子中,我们要去除空白行与行首为 # 的行列, 使用的是 grep -v '^$' regular_express.txt | grep -v '^#' 需要使用到管线命令来搜寻两次! 那么如果使用延伸型的正规表示法,我们可以简化为: egrep -v '^$|^#' regular_express.txt 利用支持延伸型正规表示法的 egrep 与特殊字符 | 来区隔两组字符串,如此一来,是否方便很多呢? 这里必须要特别强调, grep 支持的是基础型的正规表示法,而 egrep 支持延伸正规表示法。 事实上, egrep 是 grep -E 的命令别名,为了方便使用,我们还是以 egrep 来跟 grep 区分吧! 熟悉了正规表示法之后,到这个延伸型的正规表示法,您应该也会想到, 不就是多几个重要的特殊符号吗? ^_^y 是的~所以,我们就直接来说明一下,延伸型正规表示法有哪几个特殊符号? RE 字符 + ? | () 意义与范例 重复『一个或一个以上』的前一个 RE 字符 范例:egrep -n 'go+d' regular_express.txt 搜寻 (god) (good) (goood)... 等等的字符串。那个 o+ 代表『一个以上的 o 』 所以,上面的执行成果会将第 1, 9, 13 行列出来。 『零个或一个』的前一个 RE 字符 范例:egrep -n 'go?d' regular_express.txt 搜寻 (gd) (god) 这两个字符串。 那个 o? 代表『空的或 1 个 o 』所以, 上面的执行成果会将第 13, 14 行列出来。 有没有发现到,这两个案例( 'go+d' 与 'go?d' )的结果集合与 'go*d' 相同? 想想看,这是为什么喔! ^_^ 用或( or )的方式找出数个字符串 范例:egrep -n 'gd|good' regular_express.txt 搜寻 gd 或 good 这两个字符串,注意,是『或』! 所以,第 1,9,14 这三 行都可以被打印出来喔!那如果还想要找出 dog 呢?就这样啊: egrep -n 'gd|good|dog' regular_express.txt 找出『群组』字符串 范例:egrep -n 'g(la|oo)d' regular_express.txt 搜寻 (glad) 或 (good) 这两个字符串,因为 g 与 d 是重复的,所以, 我 就可以将 la 与 oo 列于 ( ) 当中,并以 | 来分隔开来,就可以啦! 此外,这个功能还可以用来作为『多个重复群组』的判别喔!举例来说: echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C' 上面的例子当中,意思是说,我要找开头是 A 结尾是 C ,中间有一个以上 的 "xyz" 字符串的意思~ 以上这些就是延伸型的正规表示法的特殊字符。另外,要特别强调的是,那个 ! 在正规表示法当中并不是 特殊字符, 所以,如果您想要查出来档案中含有 ! 与 > 的字行时,可以这样: grep -n '[!>]' regular_express.txt 这样可以了解了吗?!常常看到有陷阱的题目写:『反向选择这样对否? '[!a-z]'?』, 呵呵!是错的呦~要 '[^a-z] 才是对的! 格式化打印: printf 在很多时候,我们可能需要将输出的数据给他格式化输出的~ 举例来说,考试卷分数的输出,姓名与科目 及分数之间,总是可以稍微作个比较漂亮的版面配置吧? 例如我想要输出底下的样式: Name Chinese English Math DmTsai 80 60 92 VBird 75 55 80 Ken 60 90 70 Average 77.33 70.00 73.33 分成五个字段,各个字段分配到正确的位置去!但是因为每个字段的原始数据其实并非是如此固定的, 而 我就是想要如此表示出这些数据,此时,就得需要打印格式管理员 printf 的帮忙了! printf 可以帮我们将 资料输出的结果格式化,而且而支持一些特殊的字符~底下我们就来看看! [root@linux ~]# printf '打印格式' 实际内容 参数: 关于格式方面的几个特殊样式: \a 警告声音输出 \b 退格键(backspace) \f 清除屏幕 (form feed) \n 输出新的一行 \r 亦即 Enter 按键 \t 水平的 [tab] 按键 \v 垂直的 [tabl] 按键 \xNN NN 为两位数的数字,可以转换数字成为字符。 关于 C 程序语言内,常见的变数格式 %ns 那个 n 是数字, s 代表 string ,亦即多少个字符; %ni 那个 n 是数字, i 代表 integer ,亦即多少整数字数; %N.nf 那个 n 与 N 都是数字, f 代表 floating (浮点),如果有小数字数, 假设我共要十个位数,但小数点有两位,即为 %10.2f 啰! 范例: 范例一:将刚刚上头的数据变成档案,仅列出姓名与成绩:(用 [tab] 分隔 [root@linux ~]# printf '%s\t %s\t %s\t %s\t %s\t \n' `cat printf.txt` Name Chinese English Math Average DmTsai 80 60 92 77.33 VBird 75 55 80 70.00 Ken 60 90 70 73.33 # 假设我将上面的档案存成 printf.txt 档案档名,则可利用上面的案例, # 将每个单字中间以 [tab] 按键隔开。由上面的输出来看,虽然第二行以后是 OK 的, # 但是第一行则因为某些单字长度较长,所以就无法对齐了!而 %s 表示以字符串 (string) # 的方式来展现该内容。而每个内容则以 \t 即 [tab] 来隔开啊! 范例二:将上述资料关于第二行以后,分别以字符串、整数、小数点来显示: [root@linux ~]# printf '%10s %5i %5i %5i %8.2f \n' `cat printf.txt |\ > grep -v Name` DmTsai 80 60 92 77.33 VBird 75 55 80 70.00 Ken 60 90 70 73.33 # 这个时候的输出可就有趣了!我将几个内容分成不同的数据格式来输出, # 最有趣的应该是 %8.2f 这个项目了!我可以针对不同的小数字数来进行格式输出, # 例如变成底下的样子时,您自己试看看,会是输出什么结果喔! # printf '%10s %5i %5i %5i %8.1f \n' `cat printf.txt | grep -v Name` 范例三:列出数值 45 代表的字符为何? [root@linux ~]# printf '\x45\n' E # 这东西也很好玩~他可以将数值转换成为字符,如果您会写 script 的话, # 可以自行测试一下,由 20~80 之间的数值代表的字符是啥喔! ^_^ printf 的使用相当的广泛喔!包括等一下后面会提到的 awk 以及在 C 程序语言当中使用的屏幕输出, 都 是利用 printf 呢!鸟哥这里也只是列出一些可能会用到的格式而已, 有兴趣的话,可以自行多作一些测 试与练习喔! ^_^ Tips: 打印格式化这个 printf 指令,乍看之下好像也没有什么很重要 的~ 不过,如果您需要自行撰写一些软件,需要将一些数据在屏 幕上头漂漂亮亮的输出的话, 那么 printf 可也是一个很棒的工具 喔! sed 工具简介 在了解了一些正规表示法的基础应用之后,再来呢?呵呵~两个东西可以玩一玩的,那就是 sed 跟 awk 了! 这两个家伙可是相当的有用的啊!举例来说,鸟哥写的 logfile.sh 分析登录文件的小程序, 绝大部 分分析关键词的取用、统计等等,就是用这两个宝贝蛋来帮我完成的! 那么你说,要不要玩一玩啊?! ^_^ 我们先来谈一谈 sed 好了,基本上, sed 可以分析 Standard Input (STDIN) 的数据, 然后将数据经过处 理后,再将他输出到 standrad out (STDOUT) 的一个工具。 至于处理呢?可以进行取代、删除、新增、撷 取特定行等等的功能呢!很不错吧~ 我们先来了解一下 sed 的用法,再来聊他的用途好了! [root@linux ~]# sed [-nefr] [动作] 参数: -n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到屏幕上。但如果加上 -n 参数后,则只有经过 sed 特殊处理的那一行(或者动作)才会被列出来。 -e :直接在指令列模式上进行 sed 的动作编辑; -f :直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的 sed 动作; -r :sed 的动作支持的是延伸型正规表示法的语法。(预设是基础正规表示法语法) 动作说明: [n1[,n2]]function n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作 是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』 function 有底下这些咚咚: a :新增, a 的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)~ c :取代, c 的后面可以接字符串,这些字符串可以取代 n1,n2 之间的行! d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚; i :插入, i 的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行); p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运作~ s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配 正规表示法!例如 1,20s/old/new/g 就是啦! 范例: 范例一:将 /etc/passwd 的内容列出,并且我需要打印行号,同时,请将第 2~5 行删除! [root@linux ~]# nl /etc/passwd | sed '2,5d' 1 root:x:0:0:root:/root:/bin/bash 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown .....(后面省略)..... # 看到了吧?因为 2-5 行给他删除了,所以显示的数据中,就没有 2-5 行啰~ # 另外,注意一下,原本应该是要下达 sed -e 才对,没有 -e 也行啦! # 同时也要注意的是, sed 后面接的动作,请务必以 '' 两个单引号括住喔! # 而,如果只要删除第 2 行,可以使用 nl /etc/passwd | sed '2d' 来达成, # 至于第 3 到最后一行,则是 nl /etc/passwd | sed '3,$d' 的啦! 范例二:承上题,在第二行后(亦即是加在第三行)加上『drink tea?』字样! [root@linux ~]# nl /etc/passwd | sed '2a drink tea' 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin drink tea 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin # 嘿嘿!在 a 后面加上的字符串就已将出现在第二行后面啰!那如果是要在第二行前呢? # nl /etc/passwd | sed '2i drink tea' 就对啦! 范例三:在第二行后面加入两行字,例如『Drink tea or .....』『drink beer?』 [root@linux ~]# nl /etc/passwd | sed '2a Drink tea or ......\ > drink beer ?' 1 root:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin Drink tea or ...... drink beer ? 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin # 这个范例的重点是,我们可以新增不只一行喔!可以新增好几行~ # 但是每一行之间都必须要以反斜线 \ 来进行新行的增加喔!所以,上面的例子中, # 我们可以发现在第一行的最后面就有 \ 存在啦!那是一定要的喔! 范例四:我想将第 2-5 行的内容取代成为『No 2-5 number』呢? [root@linux ~]# nl /etc/passwd | sed '2,5c No 2-5 number' 1 root:x:0:0:root:/root:/bin/bash No 2-5 number 6 sync:x:5:0:sync:/sbin:/bin/sync # 没有了 2-5 行,嘿嘿嘿嘿!我们要的数据就出现啦! 范例五:仅列出第 5-7 行 [root@linux ~]# nl /etc/passwd | sed -n '5,7p' 5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown # 为什么要加 -n 的参数呢?您可以自行下达 sed '5,7p' 就知道了!(5-7 行会重复输出) # 有没有加上 -n 的参数时,输出的数据可是差很多的喔! 范例六:我们可以使用 ifconfig 来列出 IP ,若仅要 eth0 的 IP 时? [root@linux ~]# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:51:FD:52:9A:CA inet addr:192.168.1.12 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::250:fcff:fe22:9acb/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 .....(以下省略)..... # 其实,我们要的只是那个 inet addr:..那一行而已,所以啰,利用 grep 与 sed 来捉 [root@linux ~]# ifconfig eth0 | grep 'inet ' | sed 's/^.*addr://g' | \ > sed 's/Bcast.*$//g' # 您可以将每个管线 (|) 的过程都分开来执行,就会晓得原因啰! # 去头去尾之后,就会得到我们所需要的 IP 亦即是 192.168.1.12 啰~ 范例七:将 /etc/man.config 档案的内容中,有 MAN 的设定就取出来,但不要说明内容。 [root@linux ~]# cat /etc/man.config | grep 'MAN'| sed 's/#.*$//g' | \ > sed '/^$/d' # 每一行当中,若有 # 表示该行为批注,但是要注意的是,有时候, # 批注并不是写在第一个字符,亦即是写在某个指令后方,如底下的模样: # 『shutdown -h now # 这个是关机的指令』,批注 # 就在指令的后方了。 # 因此,我们才会使用到将 #.*$ 这个正规表示法! 总之,这个 sed 不错用啦!而且很多的 shell script 都会使用到这个指令的功能~ sed 可以帮助系统管理 员管理好日常的工作喔!要仔细的学习呢! awk 工具简介 相较于 sed 常常作用于一整个行的处理, awk 则比较倾向于一行当中分成数个『字段』来处理。 因此, awk 相当的适合处理小型的数据数据处理呢!awk 通常运作的模式是这样的: [root@linux ~]# awk '条件类型 1{动作 1} 条件类型 2{动作 2} ...' filename awk 可以处理后续接的档案,也可以读取来自前个指令的 standard output 。 但如前面说的, awk 主要是 处理『每一行的字段内的数据』,而预设的『字段的分隔符为 "空格键" 或 "[tab]键" 』!举例来说,我们用 last 可以将登入者的数据取出来, 结果如下所示: [root@linux ~]# last dmtsai pts/0 192.168.1.12 root tty1 reboot system boot 2.6.11 dmtsai pts/0 192.168.1.12 Mon Aug 22 09:40 still logged in Mon Aug 15 11:38 - 11:39 (00:01) Sun Aug 14 18:18 (7+15:41) Fri Aug 12 12:07 - 12:08 (00:01) 若我想要取出账号与登入者的 IP ,且账号与 IP 之间以 [tab] 隔开,则会变成这样: [root@linux ~]# last | awk '{print $1 "\t" $3}' dmtsai 192.168.1.12 root Mon reboot boot dmtsai 192.168.1.12 因为不论哪一行我都要处理,因此,就不需要有 "条件类型" 的限制!我所想要的是第一栏以及第三栏, 但 是,第二行及第三行的内容怪怪的~这是因为数据格式的问题啊!所以啰~使用 awk 的时候,请先确认 一下您的数据当中,如果是连续性的数据,请不要有空格或 [tab] 在内,否则,就会像这个例子这样,会 发生误判喔! 另外,由上面这个例子您也会知道,在每一行的每个字段都是有变量名称的,那就是 $1, $2... 等变量名称, 以上面的例子来说,dmtsai 是 $1 ,因为他是第一栏嘛!至于 192.168.1.12 是第三栏,所以他就是 $3 啦! 后面以此类推~呵呵!还有个变数喔!那就是 $0 ,$0 代表『一整列资料』的意思~ 以上面的例子来说, 第一行的 $0 代表的就是『dmtsai pts/0.... 』那一行啊! 由此可知,刚刚上面四行当中,整个 awk 的处理 流程是: 1. 读入第一行,并将第一行的资料填入 $0, $1, $2.... 等变数当中; 2. 依据 "条件类型" 的限制,判断是否需要进行后面的 "动作"; 3. 做完所有的动作与条件类型; 4. 若还有后续的『行』的数据,则重复上面 1~3 的步骤,直到所有的数据都读完为止。 经过这样的步骤,您会晓得, awk 是『以行为一次处理的单位』, 而『以字段为最小的处理单位』。好了, 那么 awk 怎么知道我到底这个数据有几行?有几栏呢?这就需要 awk 的内建变量的帮忙啦~ 变量名称 代表意义 NF 每一行 ($0) 拥有的字段总数 NR 目前 awk 所处理的是『第几行』数据 FS 目前的分隔字符,预设是空格键 我们继续以上面例子来做说明,如果我想要列出每一行的账号,并且列出目前处理的行数, 并且说明,该 行有多少字段,则可以这样 (注意, awk 后续的所有动作以 ' 括住, 所以,内容如果想要以 print 打印 时,记得,非变量的文字部分,包含上一小节 printf 提到的格式中,都需要使用双引号来定义出来喔!) [root@linux ~]# last | awk '{print $1 "\t lines: " NR "\t columes: " NF}' dmtsai lines: 1 columes: 10 root lines: 2 columes: 9 reboot lines: 3 columes: 9 dmtsai lines: 4 columes: 10 这样可以了解 NR 与 NF 的差别了吧?好了,底下来谈一谈所谓的 "条件类型" 了吧! awk 的逻辑运算字符 既然有需要用到 "条件" 的类别,自然就需要一些逻辑运算啰~例如底下这些: 运算单元 > < >= <= == != 代表意义 大于 小于 大于或等于 小于或等于 等于 不等于 值得注意的是那个 == 的符号,因为在『逻辑运算』上面, 就是所谓的大于、小于、等于等等的判断式上 面,我们习惯上是以 == 来表示,而如果是直接给予一个值,例如变量设定时,就直接使用 = 而已。 好 了,我们实际来运用一下逻辑判断吧!举例来说,在 /etc/passwd 当中是以冒号 ":" 来作为字段的分隔, 那假设我要查阅,第三栏小于 10 以下的数据,并且仅列出账号与第三栏, 那么可以这样做: [root@linux ~]# cat /etc/passwd | \ > awk '{FS=":"} $3 < 10 {print $1 "\t " $3}' root:x:0:0:root:/root:/bin/bash bin 1 daemon 2 ......(以下省略)...... 有趣吧!不过,怎么第一行没有正确的显示出来呢?这是因为我们读入第一行的时候, 那些变数 $1, $2... 预设还是以空格键为分隔的,所以虽然我们定义了 FS=":" 了, 但是却仅能在第二行后才开始生效。那么 怎么办呢?我们可以预先设定 awk 的变量啊! 利用 BEGIN 这个关键词喔!这样做: [root@linux ~]# cat /etc/passwd | \ > awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}' root 0 bin 1 daemon 2 ......(以下省略)...... 很有趣吧!而除了 BEGIN 之外,我们还有 END 呢!另外,如果要用 awk 来进行『计算功能』呢?以 底下的例子来看, 假设我有一个薪资数据表,内容是这样的: Name 1st VBird 23000 DMTsai 21000 Bird2 43000 2nd 24000 20000 42000 3th 25000 23000 41000 如何帮我计算每个人的总额呢?而且我还想要格式化输出喔! 你可以将上面的数据储存成一个名称为 pay.txt 的档案,则: [root@linux ~]# cat pay.txt | \ > awk 'NR==1{printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total" } NR>=2{total = $2 + $3 + $4 printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}' Name 1st 2nd 3th Total VBird 23000 24000 25000 72000.00 DMTsai 21000 20000 23000 64000.00 Bird2 43000 42000 41000 126000.00 上面的例子有几个重要事项应该要先说明的: • 所有的动作,亦即在 {} 内的动作,如果有需要多个指令辅助时,可利用分号『;』间隔, 或者 直接以 [Enter] 按键来隔开每个指令,例如上面的 NR>=2 后面接的动作, 利用 total = ... 那个 指令来指定加总,而后续则以 printf 来格式化输出! • 逻辑运算当中,如果是『等于』的情况,则务必使用两个等号『==』! • 格式化输出时,在 printf 的格式设定当中,务必加上 \n ,才能进行分行! • 与 bash shell 的变量不同,在 awk 当中,变量可以直接使用,不需加上 $ 符号。 利用 awk 这个玩意儿,就可以帮我们处理很多日常工作了呢!真是好用的很~ 此外, awk 的输出格式 当中,常常会以 printf 来辅助,所以, 最好您对 printf 也稍微熟悉一下比较好啦!另外, awk 的动作内 {} 也是支持 if (条件) 的喔! 举例来说,上面的指令可以修订成为这样: [root@linux ~]# cat pay.txt | \ > awk '{if(NR==1) printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"} NR>=2{total = $2 + $3 + $4 printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}' 你可以仔细的比对一下上面两个输入有啥不同~从中去了解两种语法吧! 我个人是比较倾向于使用第一种 语法,因为会比较有统一性啊! ^_^ 除此之外, awk 还可以帮我们进行循环计算喔!真是相当的好用! 不过,那属于比较进阶的单独课程了, 我们这里就不再多加介绍。如果您有兴趣的话, 可以到中研院的网站查询喔: http://phi.sinica.edu.tw/aspac/reports/94/94011/ , 鸟 哥 这 里 也 有 一 份 pdf 档 的 备 份 : http://linux.vbird.org/linux_basic/0330regularex/awk.pdf。 您可以自行参阅一下该文章的内容,里头可以好好 的查阅一下关于数组与循环方面的介绍, 我认为该文章写的很棒喔!该介绍的都介绍了!很好~我喜欢~ ^_^ 文件数据比对与打印的相关功能 正规表示法是相当有用的工具,当然,那个 sed 还有 awk 也是很棒的工具程序, 不过,除此之外,我们 其实还有很多可以使用的工作来处理文件数据喔! 举例来说,假如我有两个档案,一个档案是原始档,一 个则是经过一些时间累积处理后的档案, 我想要知道这两个档案之间的差别,该如何运用正规表示法?呼 呼~可能要透过所谓的循环来一行一行比对检查呢~ 但是,我们可以透过 Linux 提供的 diff 及 cmp 指 令来进行比对即可喔!很棒的啊! 档案比对 什么时候会用到档案的比对啊?通常是『同一个软件包的不同版本之间,比较设定档与原始档的差异』, 所 以啰,很多时候所谓的档案比对,通常是用在 ASCII 纯文字文件的比对上的! 那么比对档案的指令有哪 些?最常见的就是 diff 啰! • diff diff 就是用在比对两个档案之间的差异的,一般是用在 ASCII 纯文字文件的比对上。 我们先预处理一下 一个档案好了。假设我要将 /etc/passwd 的内容,将第四行删除, 第六行则取代成为『no six line』,新的 档案放置到 /tmp/test 里面, 那么应该怎么做? [root@linux ~]# mkdir -p /tmp/test [root@linux ~]# cat /etc/passwd | \ > sed -e '4d' -e '6c no six line' > /tmp/test/passwd # 注意一下, sed 后面如果要接超过两个以上的动作时,每个动作前面得加 -e 才行! 接下来讨论一下关于 diff 的用法吧! [root@linux ~]# diff [-bBi] from-file to-file 参数: from-file :一个档名,作为原始比对档案的档名; to-file :一个档名,作为目的比对档案的档名; 注意,from-file 或 to-file 可以 - 取代,那个 - 代表『Standard input』之意。 -b :忽略一行当中,仅有多个空白的差异(例如 "about me" 与 "about -B :忽略空白行的差异。 -i :忽略大小写的不同。 范例: me" 视为相同 范例一:比对 /tmp/test/passwd 与 /etc/passwd 的差异: [root@linux ~]# diff /etc/passwd /tmp/test/passwd 4d3 <==这里是说,左边档案(/etc/passwd)第四行被删除 (d) < adm:x:3:4:adm:/var/adm:/sbin/nologin 6c5 <==这里是说,左边档案的第六行被取代成右边档案(/tmp/test/passwd)的第五行 < sync:x:5:0:sync:/sbin:/bin/sync --> no six line # 很聪明吧!用 diff 就把我们刚刚的处理给比对完毕了! 用 diff 比对档案真的是很简单喔!另外, diff 也可以比对整个目录下的差异喔! 举例来说,我们将两个 目录比对一下: [root@linux ~]# diff /etc /tmp/test ......(前面省略)..... Only in /etc: paper.config diff /etc/passwd /tmp/test/passwd 4d3 < adm:x:3:4:adm:/var/adm:/sbin/nologin 6c5 < sync:x:5:0:sync:/sbin:/bin/sync --> no six line Only in /etc: passwd......(后面省略)..... 我们的 diff 很聪明吧!还可以比对不同目录下的相同文件名的内容, 这样真的很方便喔~ • cmp 相对于 diff 的广泛用途, cmp 似乎就用的没有这么多了~ cmp 主要也是在比对两个档案,他主要利用 『位』单位去比对,因此, 当然也可以比对 binary file 啰~(还是要再提醒喔, diff 主要是以『行』为单 位比对, cmp 则是以『位』为单位去比对,这并不相同!) [root@linux ~]# cmp [-s] file1 file2 参数: -s :将所有的不同点的位处都列出来。因为 cmp 预设仅会输出第一个发现的不同点。 范例: 范例一:用 cmp 比较一下 /etc/passwd 与 /tmp/test/passwd [root@linux ~]# cmp /etc/passwd /tmp/test/passwd /etc/passwd /tmp/test/passwd differ: byte 106, line 4 看到了吗?第一个发现的不同点在第四行,而且位数是在第 106 个位处! 这个 cmp 也可以用来比对 binary 啦! ^_^ • patch patch 这个指令与 diff 可是有密不可分的关系啊!我们前面提到,diff 可以用来分辨两个版本之间的差异, 举例来说,刚刚我们所建立的 /tmp/test/passwd 与 /etc/passwd 就是两个不同版本之间的档案。那么,如果 要『升级』呢? 就是『将旧的档案升级成为新的档案』时,应该要怎么做呢? 举例来说,我们可以这样 做测试: [root@linux ~]# mkdir /tmp/old; cp /etc/passwd /tmp/old [root@linux ~]# mkdir /tmp/new; cp /tmp/test/passwd /tmp/new [root@linux ~]# cd /tmp ; diff -Naur old/ new/ > test.patch 此时,在 /tmp/test.patch 档案之中,就记录了新旧的档案之间的差异, 对了!您必须要了解的是,用 diff 制作这个档案时,旧的档案必须是在前面,亦即是 diff oldfile newfile 才行喔!此外,新旧档案的『相对目 录 位 置 』 最 好 也 是 一 样 比 较 好 喔 ! OK ! 那 么 如 何 将 旧 的 内 容 (/tmp/old/passwd) 更 新 到 新 版 (/tmp/new/passwd) 的内容呢? 简单的说,可以用这样: [root@linux ~]# patch -pN < patch_file 参数: -p :后面可以接『取消几层目录』的意思。 范例: 范例一:将刚刚制作出来的 patch file 用来更新旧版数据 [root@linux ~]# cd /tmp/old [root@linux ~]# patch -p1 < /tmp/test.patch patching file passwd # 为什么这里会使用 -p1 呢?因为我们在比对新旧版的数据时,是在 /tmp 底下, # 而实际的数据是在 /tmp/old 里面,因此,当我们进入到 /tmp/old 时, # 再查阅 /tmp/test.patch 的第一行如下: # diff -Naur old/passwd new/passwd (用 head -n 1 /tmp/test.patch) # 发现到,我们所在的目录其实是 old 里面,所以,就必须要减去一层目录。 更详细的 patch 用法我们会在后续的第五章跟大家介绍, 这里仅是介绍给您,呵呵!我们可以利用 diff 来 比对两个档案之间的差异, 更可进一步利用这个功能来制作修补档案 (patch file) ,让大家更容易进行比 对与升级呢! 很不赖吧! ^_^ 档案打印准备: pr 如果您曾经使用过一些图形接口的文字处理软件的话,那么很容易发现, 当我们在打印的时候,可以同时 选择与设定每一页打印时的标头吧! 也可以设定页码呢!那么,如果我是在 Linux 底下打印纯文字文件 呢 可不可以具有标题啊?可不可以加入页码啊?呵呵!当然可以啊! 使用 pr 就能够达到这个功能了。 不过, pr 的参数实在太多了, 我也说不完,一般来说,我都仅使用最简单的方式来处理而已。 举例来 说,如果想要打印 /etc/man.config 呢? [root@linux ~]# pr /etc/man.config 2003-02-10 23:20 /etc/man.config Page 1 # # Generated automatically from man.conf.in by the # configure script. .....以下省略...... 上面特殊字体那一行呢,其实就是使用 pr 处理后所造成的标题啦~ 标题中会有『档案时间』、『档案档名』 及『页码』三大项目。 更多的 pr 使用,请参考 pr 的说明啊! ^_^ 重点回顾 • 使用 grep 或其它工具进行正规表示法的字符串比对时,因为编码的问题会有不同的状态,因此, 您最好将 LANG 及 LANGUAGE 等变量设定为 C 或者是 en 等英文语系! • 正规表示法 ( Regular Expression ) 的用途主要是用来做为『搜寻』字符串之用,还可以用来过滤 特殊讯息等用途; • 由于严谨度的不同,正规表示法之上还有更严谨的延伸正规表示法; • 正规表示法的处理方式,经常是以『整行』或称为『整段』来进行处理的; • grep 与 egrep 在正规表示法里面是很常见的两支程序,其中, egrep 支持更严谨的正规表示法 的语法; 参考资源 • 洪朝贵老师的网页:http://www.cyut.edu.tw/~ckhung/olbook/gnulinux/regexp.shtml • PCRE 官方网站:http://www.perldoc.com/perl5.8.0/pod/perlre.html • 龙门少尉的窝:http://main.rtfiber.com.tw/~changyj/ • Study Area:http://www.study-area.org/linux/system/linux_shell.htm • 中研院计算中心 ASPAC 计划之 awk 程序介绍:http://phi.sinica.edu.tw/aspac/reports/94/94011/ 鸟哥备份:http://linux.vbird.org/linux_basic/0330regularex/awk.pdf • 中研院计算中心 ASPAC 计划之 sed 程序介绍:http://phi.sinica.edu.tw/aspac/reports/96/96005/ 本章习题练习 ( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 ) • 我想要知道某个档案里面含有 boot 的字眼,而这个档案在 /etc/ 底下,我要如何找出这个档案? 既然知道有这个字眼那就好办了!可以直接下达: grep boot /etc/* • 我想要知道,在 /etc 底下,只要含有 XYZ 三个字符的任何一个字符的那一行就列出来,要怎样 进行? 『只要』含有 X 或 Y 或 Z 就将该行列出来,因此,我们的范围很很广啦!这个时候就必需要 使用到 [] 这个咚咚!还记得中括号的用途吗?那就是『在中括号里面谨代表一个字符而已!』 而 这个中括号是一个『代表』,可以是一串字也可以是几个不连续的字!这里我们仅需要 XYZ 其中 任何一个,所以可以这样写: grep [XYZ] /etc/* 则只要在每一行当中,只要发现 X 或 Y 或 Z 任何一个,就会将他印出来!这个与 grep XYZ /etc/* 是『完全不一样』的!请仔细的思考一下ㄟ! • 我想要找出在 /etc 底下,档案内容含有 * 的文件名称? 由于 * 是特殊字符,在变量的订定法则里面曾经提过要将特殊字符移除,需要使用跳脱字符,亦 即是 \ 符号,所以我可以这样下达指令: grep \* /etc/* 学习 Shell Scripts 最近更新日期:2005/08/29 如果您真的很想要走信息这条路,并且想要好好的管理好属于您的主机,那么,别说鸟哥不告诉您, Shell Scripts 真的是必须要学习的一项课题呢!基本上, shell script 有点像是早期的批次档, 亦即是将一些指 令汇整起来一次执行,但是 Shell script 拥有更强大的功能,那就是, 他可以进行类似程序 (program) 的 撰写,并且,不需要经过编译 (compiler) 就能够执行, 真的很方便。加上,我们可透过 shell script 来简 化我们日常的工作管理, 而且,整个 Linux 环境中,一些服务 (services) 的启动都是透过 shell script 的, 如果您对于 script 不了解,嘿嘿!发生问题时,可真是会求助无门喔! 所以,好好的学一学他吧! 1. 什么是 Shell Script 1.1 干嘛学习 shell scripts? 1.2 第一支 script 的撰写与执行 1.3 撰写 shell script 的良好习惯建立 2. 简单的 shell script 练习: 3. 善用判断式: 3.1 利用 test 指令的测试功能 3.2 利用判断符号 [ ] 3.3 Shell script 的预设变数($0, $1...) 4. 条件判断式: 4.1 利用 if .... then 4.2 利用 case ..... esac 判断 4.3 利用 function 功能 5. 循环 (loop) 5.1 while....do....done, until....do....done 5.2 for...do...done 6. shell script 的追踪与 debug 7. 本章习题练习 8. 针对本文的建议:http://phorum.vbird.org/viewtopic.php?t=23886 什么是 Shell scripts ? 这个有趣的问题赶紧来回答看看,什么是 shell script 呢? shell 我们在 认识 bash 当中已经提过了, 那是一个文字接口底下让我们与系统沟通的一个工具接口,那么 script 是啥? 字面上的意义, script 是『脚本、剧本』的意思。整句话是说, shell script 是针对 shell 所写的『剧本!』 什么东西啊? 呵呵!其实, shell script 是利用 shell 的功能所写的一个『程序 (program)』,这个程序是使用纯文 字文件,将一些 shell 的语法与指令写在里面, 搭配正规表示法、管线命令与数据流重导向等功能,以 达到我们所想要的处理目的。 所以,简单的说, shell script 就像是早期 DOS 年代的批次檔 (.bat) ,最简单的功能就是将许多指令 汇整写在一起, 让使用者很轻易的就能够 one touch (执行一个档案 "shell script" ,就能够一次执行 多个指令), 而, shell script 更提供数组、循环、条件与逻辑判断等重要功能,让使用者也可以直接 以 shell 来撰写程序,而不必使用类似 C 程序语言等传统程序撰写的语法呢! 那,这么说您可以了解了吗?是的! shell script 可以简单的被看成是批次档, 也可以被说成是一个程 序语言,且这个程序语言由于都是利用 shell 与相关工具指令, 所以不需要编译即可执行,且拥有不错 的除错 (debug) 工具,所以,他可以帮助系统管理员快速的管理好主机。 干嘛学习 shell scripts? 这是个好问题,我又干嘛一定要学 shell script ?我又不是信息人,没有写程序的概念, 那我干嘛还要 学 shell script 呢?不要学可不可以啊?呵呵~如果 Linux 对您而言, 您只是想要『会用』而已,那 么,不需要学 shell script 也还无所谓,这部分先给他跳过去, 等到有空的时候,再来好好的瞧一瞧。 但是,如果您是真的想要玩清楚 Linux 的来龙去脉, 那么 shell script 就不可不知,为什么呢?因为: • 自动化管理的重要依据: 不用鸟哥说您也知道,管理一部主机真不是件简单的事情,每天要进行的任务就有: 查询登录档、追踪流 量、监控使用者使用主机状态、主机各项硬设备状态、 主机软件更新查询、更不要说得应付其它使用者的 突然要求了。而这些工作, 您想要自行手动处理,还是写个简单的程序来帮您每日自动处理分析,若有问 题才通知您呢? 当然是让系统自动工作比较好,对吧!呵呵~这就得要良好的 shell script 来帮忙的啦! • 追踪与管理系统的重要工作: 虽然我们还没有提到服务启动的方法,不过,这里可以先提一下,我们 Linux 系统的服务 ( services ) 启 动的接口,在 /etc/init.d/ 这个目录下,所有的档案都是 scripts ; 另外,包括开机 (booting) 过程 也都是利用 shell script 来帮忙搜寻系统的相关设定数据, 然后再代入各个服务的设定参数啊!举例来 说,如果我们想要重新启动系统登录文件, 可以使用:『/etc/init.d/syslogd restart』,那个 syslogd 档案就是 script 啦! 另外,我曾经在某一代的 FC 上面发现,启动 MySQL 这个数据库服务时,确实是 可以启动的, 但是屏幕上却老是出现『failure』,后来才发现,原来是启动 MySQL 那个 script 会主动 的以『空的密码』去尝试登入 MySQL ,但我修改过 MySQL 的密码啰~当然就登入失败~ 后来改了改 script ,就略去这个问题啦!如此说来, script 确实是需要学习的啊! • 简单入侵侦测功能: 当我们的系统有异状时,大多会将这些异状记录在系统记录器,也就是我们常提到的『系统登录文件』, 那 么我们可以在固定的几分钟内主动的去分析系统登录文件,若察觉有问题,就立刻通报管理员, 或者是立 刻加强防火墙的设定规则,如此一来,您的主机可就能够达到『自我保护』的聪明学习功能啦~ 举例来说, 我们可以通过 shell script 去分析『当该封包尝试几次还是联机失败之后,就予以抵挡住该 IP』之类的 举动,例如鸟哥写过一个关于抵挡砍站软件的 shell script , 就是用这个想法去达成的呢! • 连续指令单一化: 其实,对于新手而言, script 最简单的功能就是:『汇整一些在 command line 下达的连续指令,将他 写入 scripts 当中,而由直接执行 scripts 来启动一连串的 command line 指令输出入!』例如: 防火 墙连续规则 ( iptables ),开机加载程序的项目 ( 就是在 /etc/rc.d/rc.local 里头的数据 ) ,等等都 是相似的功能啦! 其实,说穿了,如果不考虑 program 的部分,那么 scripts 也可以想成,仅是帮我们 把一大串的指令汇整在一个档案里面, 而直接执行该档案就可以执行那一串又臭又长的指令段!就是这么 简单啦! • 简易的数据处理: 由前一章 正规表示法 的 awk 程序说明中, 您可以发现, awk 可以用来处理简单的数据数据呢!例如薪 资单的处理啊等等的。 shell script 的功能更强大,例如鸟哥曾经用 shell script 直接处理数据数据 的比对啊, 文字数据的处理啊等等的,撰写方便,速度又快(因为在 Linux 效能较佳), 真的是很不错用 的啦! • 跨平台支持与学习历程较短: 几乎所有的 Unix Like 上面都可以跑 shell script ,连 MS Windows 系列也有相关的仿真器可以用, 此 外, shell script 的语法是相当亲和的,看都看的懂得文字,而不是机器码, 很容易学习~这些都是您 可以加以考虑的学习点啊! 上面这些都是您考虑学习 shell script 的特点~此外, shell script 还可以简单的以 vi 来直接编写, 实在是很方便的好东西!所以,还是建议您学习一下啦。 不过,虽然 shell script 号称是程序 (program) ,但实际上, shell script 处理数据的速度上是不太 够的。因为 shell script 用的是外部的指令与 bash shell 的一些预设工具,所以,他常常会去呼叫外 部的函式库,因此,运算速度上面当然比不上传统的程序语言。 所以啰, shell script 用在系统管理上 面是很好的一项工具,但是用在处理大量数值运算上, 就不够好了~而且还很麻烦,因为:Shell scripts 的速度较慢, 且使用的 CPU 资源较多,造成主机资源的分配不良。还好, 我们确实很少看到利用 shell script 在进行大量数据运算的,所以,不必担心的啦! 第一支 script 的撰写与执行 如同前面讲到的, shell script 其实就是纯文字文件 (ASCII) ,我们可以编辑这个档案, 然后让这个 档案来帮我们一次执行多个指令,或者是利用一些运算与逻辑判断来帮我们达成某些功能。 所以啦,要编 辑这个档案的内容时,当然就需要具备有 bash shell 指令下达的相关认识。 我们说过,要下达指令需要 注意的事项在 bash 章节内已经提过, 在 shell script 的撰写同样需要用到这些注意事项的: 1. 如同前面 bash command 提到的,指令与参数间的多个空白会被忽略掉; 2. 而空白行也将被忽略掉!,并且 [tab] 也是不会被理会的! 3. 如果读取到一个 Enter 符号 ( CR )),就尝试开始执行该行命令; 4. 至于如果一行的内容太多,则可以使用 \[Enter] 来延伸至下一行; 5. 此外,使用最多的 # 可做为批注!任何加在 # 后面的字,将全部被视为批注文字而被忽略! 如此一来,我们在 script 内所撰写的程序,就会被一行一行的执行。好了,那么这个程序假设文件名是 shell.sh 好了,如何执行这个档案?很简单,可以有底下几个方法: • 将 shell.sh 加上可读与执行 (rx) 的权限,然后就能够以 ./shell.sh 来执行了; • 直接以 sh shell.sh 的方式来直接执行即可。 反正重点就是要让那个 shell.sh 内的指令可以被执行的意思啦!咦!那我为何需要使用 ./shell.sh 来 下达指令? 还记得我们在 bash 里面一直强调的,指令是否能够被执行与 PATH 这个环境变量有关, 所 以,要执行『目前这个目录下的某个档案』就需要加上 ./ 这个目录啦!另外,其实您也可以将 shell.sh 放在您家目录下的 ~/bin 这个目录中,然后利用 PATH="$PATH":~/bin 的设定, 嘿嘿,就能够直接执行 您的 script 啰~ ^_^ 那,为何 sh shell.sh 也可以执行呢?这是因为 /bin/sh 其实就是 /bin/bash , 使用 sh shell.sh 亦 即告诉系统,我想要直接以 bash 的功能来执行 shell.sh 这个档案内的相关指令的意思。 而我们也可以 利用 sh 的参数,如 -n 及 -x 来检查与追踪 shell.sh 的语法是否正确呢! ^_^ • 撰写第一支 script 不论是那个门派,要学武功要从扫地做起,那么要学程序呢?呵呵,肯定是由『秀出 Hello World!』 这 个字眼开始的!OK!那么鸟哥就先写一支 script 给大家瞧一瞧: [root@linux ~]# mkdir scripts; cd scripts [root@linux scripts]# vi sh01.sh #!/bin/bash # Program: # This program is used to show "Hello World !" in screen. # History: # 2005/08/23 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH echo -e "Hello World ! \a \n" exit 0 在我们这个章节当中,请将所有的撰写的 script 放置到您家目录的 ~/scripts 这个目录内, 比较好管 理啦!上面的写法当中,我主要将整个程序的撰写分成数段,大致是这样: 1. 第一行 #!/bin/bash 在宣告这个 script 使用的 shell 名称: 因为我们使用的是 bash ,所以,必须要以『 #!/bin/bash 』来宣告这个档案内的语法使用 bash 的语法!那么当这个程序被执行时,他就能够加载 bash 的相关环境设定档, 并且执行 bash 来 使我们底下的指令能够执行!这很重要的!(在很多状况中,如果没有设定好这一行, 那么该程 序很可能会无法执行,因为系统可能无法判断该程序需要使用什么 shell 来执行啊!) 2. 程序内容的宣告: 整个 script 当中,除了第一行的 #! 是用来宣告 shell 的之外,其它的 # 都是『批注』用途! 所以上面的程序当中,第二行以下就是用来说明整个程序的状态。一般来说, 建议您一定要养成 说明该 script 的:1. 内容与功能; 2. 版本信息; 3. 作者与联络方式; 4. 建檔日期;5. 历 史纪录 等等。这将有助于未来程序的改写与 debug 呢! 3. 主要环境变量的宣告: 建议务必要将一些重要的环境变量设定好,鸟哥个人认为, PATH 是当中最重要的! 如此一来, 则可让我们这支程序在进行时,可以直接下达指令, 而不必写绝对路径呢!比较好啦! 4. 主要程序部分 就将主要的程序写好即可!在这个例子当中,就是 echo 那一行啦! 5. 执行成果告知 是否记得我们在 bash 里面要讨论一个指令的执行成功与否,可以使用 $? 这个变量来观察~ 那 么我们也可以利用 exit 这个指令来让程序中断,并且回传一个数值给系统。 在我们这个例子当 中,我使用 exit 0 ,这代表离开 script ,并且回传一个 0 给系统, 所以我执行完这个 script 后,若接着下达 echo $? 则可得到 0 的值喔! 更聪明的读者应该也知道了,呵呵!利用这个 exit n 的功能,我们还可以自订错误讯息, 让这支程序变得更加的 smart 呢! 接下来执行看看结果是怎样吧? [root@linux scripts]# sh sh01.sh Hello World ! 您会看到屏幕是这样,而且应该还会听到『咚』的一声,为什么呢?还记得前一章提到的 printf 吧?用 echo 接着那些特殊的按键也可以发生同样的事情~ 不过, echo 必须要加上 -e 的参数才行! 呵呵!在 您写完这个小 script 之后,您就可以大声的说:『我也会写程序了』!哈哈! 很简单有趣吧~ ^_^ 另外,你也可以利用:『chmod a+x sh01.sh; ./sh01.sh』来执行这个 script 的呢! 撰写 shell script 的良好习惯建立 一个良好习惯的养成是很重要的~大家在刚开始撰写程序的时候,最容易忽略这部分, 认为程序写出来就 好了,其它的不重要。其实,如果程序的说明能够更清楚, 那么对您自己是有很大的帮助的。 举例来说,鸟哥自己为了自己的需求,曾经撰写了不少的 script 来帮我进行主机 IP 的侦测啊、 登录档 分析与管理啊、自动上传下载重要设定档啊等等的,不过,早期就是因为太懒了, 管理的主机又太多了, 常常同一个程序在不同的主机上面进行更改,到最后,到底哪一支才是最新的都记不起来, 而且,重点是, 我到底是改了哪里??为什么做那样的修改?都忘的一乾二净~真要命~ 所以,后来鸟哥在写程序的时候,通常会比较仔细的将程序的设计过程给他记录下来, 而且还会记录一些 历史纪录,如此一来,好多了~ 至少很容易知道我修改了哪些数据,以及程序修改的理念与逻辑概念等等, 在维护上面是轻松很多很多的喔! 另外,在一些环境的设定上面,毕竟每个人的环境都不相同,为了取得较佳的执行环境, 我都会自行先定 义好一些一定会被用到的环境变量,例如 PATH 这个玩意儿! 这样比较好啦~所以说,建议您一定要养成 良好的 script 撰写习惯, 在每个 script 的文件头处记录好: • script 的功能; • script 的版本信息; • script 的作者与联络方式; • script 的版权宣告方式; • script 的 History (历史纪录); • script 内较特殊的指令,使用绝对路径的方式来下达; • script 运作时需要的环境变量预先宣告与设定。 简单的 shell script 练习 在第一支 shell script 撰写完毕之后,相信您应该具有基本的撰写功力了。 接下来,在开始更深入的程 序概念之前,我们先来玩一些比较有趣的简单的小范例好了。 底下的范例中,达成结果的方式相当的多, 建议您先自行撰写看看,写完之后再与鸟哥写的内容比对, 这样才能更加深概念喔!好!不啰唆,我们就 一个一个来玩吧! • 变量内容由使用者决定 很多时候我们需要使用者输入一些内容,好让程序可以顺利运作。 简单的来说,大家应该都有安装过软件 的经验,安装的时候,他不是会问您『要安装到那个目录去?』吗? 那个让使用者输入的数据的动作,就 是让使用者输入变量内容啦。 你应该还记得在 bash 的时候,我们有学到一个 read 指令吧?忘记的话,请自行回头去阅读一番。 现在, 请你以 read 指令的用途,撰写一个 script ,他可以让使用者输入:1 first name 与 2. last name, 最 后并且在屏幕上显示:『Your full name is: 』的内容: [root@linux scripts]# vi sh02.sh #!/bin/bash # Program: # Let user keyin their first and last name, and show their full name. # History: # 2005/08/23 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH read -p "Please input your first name: " firstname read -p "Please input your last name: " lastname echo -e "\nYour full name is: $firstname $lastname" 将上面这个 sh02.sh 执行一下,你就能够发现使用者自己输入的变量可以被取用的哩! 很不错吧!加油! • 利用 date 进行档案的建立 想象一个状况,如果我每天要进行备份,而备份的数据又不想被覆盖掉,也就是说, 我想要将每天备份的 数据放在不同的档案中。哇!这真困扰啊?难道要我每天去修改 script ? 不需要啊!因为每天的『日期』 并不相同,所以我可以将档名取成类似: backup.20050802 , 不就可以每天一个不同档名了吗?呵呵! 确实如此。好了,接下来出个例子: 我想要建立三个空的档案,档名最开头由使用者输入决定,假设使用 者输入 filename 好了, 那今天的日期是 2005/08/23 ,我想要以前天、昨天、今天的日期来建立这个档 案,亦即 filename_20050821, filename_20050822, filename_20050823 ,该如何是好? [root@linux scripts]# vi sh03.sh #!/bin/bash # Program: # User can keyin filename to touch 3 new files. # History: # 2005/08/23 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH # 1. 让使用者输入文件名称,并取得 fileuser 这个变量; echo -e "I will use 'touch' command to create 3 files." read -p "Please input the filename what you want: " fileuser # 2. 为了避免使用者随意按 Enter ,利用变量功能分析文件名是否有设定? filename=${fileuser:-"filename"} # 3. 开始利用 date 指令来取得所需要的档名了; date1=`date --date='2 days ago' +%Y%m%d` date2=`date --date='1 days ago' +%Y%m%d` date3=`date +%Y%m%d` file1="$filename""$date1" file2="$filename""$date2" file3="$filename""$date3" # 4. 将档名建立吧! touch $file1 touch $file2 touch $file3 我透过一些简单的动作,这些动作都可以在 bash 那一章里面找到, 包括小指令 (`) 的取得讯息、变量 的设定功能、变量的累加以及利用 touch 指令辅助! 如果您开始执行这个 sh03.sh 之后,你可以进行两 次输入,一次直接按 [Enter] 来查阅档名是啥? 一次可以输入一些字符,这样来判断你的档案喔!关于 date 的指令应用,请 man date 吧! ^_^ • 数值运算的方法 各位看官应该还记得,我们可以使用 declare 来定义变量的类型吧?! 这样才能够进行加减运算啊!可 惜的是, bash shell 里头预设仅支持到整数的数据。 OK!那我们来玩玩看,如果我们要使用者输入两个 变量,然后将两个变量的内容相乘, 最后输出相乘的结果,那可以怎么做? [root@linux scripts]# vi sh04.sh #!/bin/bash # Program: # User can input 2 integer to cross by! # History: # 2005/08/23 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH echo -e "You SHOULD input 2 number, I will cross they! \n" read -p "first number: " firstnu read -p "second number: " secnu total=$(($firstnu*$secnu)) echo -e "\nThe number $firstnu x $secnu is ==> $total" 在数字的运算上,我们可以使用『 declare -i total=$firstnu*$secnu 』 也可以使用上面的方式来进行! 基本上,鸟哥比较建议使用这样的方式来进行运算: var=$((运算内容)) 不但容易记忆,而且也比较方便的多~未来您可以使用这种方式来计算的呀!至于数值运算上的处理, 则 有:+, -, *, /, %等等。 那个 % 是取余数啦~举例来说, 13 对 3 取余数,结果是 13=4*3+1,所以余 数是 1 啊!就是: [root@linux scripts]# nu=$((13%3)); echo $nu 1 这样了解了吧?!多多学习与应用喔! ^_^ 善用判断式 在 bash 章节中,我们提到过 $? 这个变量所代表的意义, 此外,也透过 && 及 || 来作为前一个指令是 否能够成功进行的一个参考。 那么,如果我想要知道 /dmtsai 这个目录是否存在时,难道一定要使用 ls 来执行, 然后再以 $? 来判断执行成果吗?呵呵!当然不需要! 我们可以透过『 test 』这个指令来侦 测呢! 利用 test 指令的测试功能 当我要检测系统上面某些档案或者是相关的属性时,利用 test 这个指令来工作, 真是好用得不得了,举 例来说,我要检查 /dmtsai 是否存在时,使用: [root@linux ~]# test -e /dmtsai 执行结果并不会显示任何讯息,但最后我们可以透过 $? 或 && 及 || 来展现整个结果呢! 例如我们在将 上面的例子改写成这样: [root@linux ~]# test -e /dmtsai && echo "exist" || echo "Not exist" 最终的结果可以告知我们是『exist』还是『Not exist』呢!那我知道 -e 是测试一个『东西』在不在, 如 果还想要测试一下该档名是啥玩意儿时,还有哪些标志可以来判断的呢?呵呵!有底下这些东西喔! 测试的标志 代表意义 1. 关于某个档名的『类型』侦测(存在与否),如 test -e filename -e 该『档名』是否存在?(常用) -f 该『档名』是否为档案(file)?(常用) -d 该『文件名』是否为目录(directory)?(常用) -b 该『文件名』是否为一个 block device 装置? -c 该『文件名』是否为一个 character device 装置? -S 该『档名』是否为一个 Socket 档案? -p 该『档名』是否为一个 FIFO (pipe) 档案? -L 该『档名』是否为一个连结档? 2. 关于档案的权限侦测,如 test -r filename -r 侦测该文件名是否具有『可读』的属性? -w 侦测该档名是否具有『可写』的属性? -x 侦测该档名是否具有『可执行』的属性? -u 侦测该文件名是否具有『SUID』的属性? -g 侦测该文件名是否具有『SGID』的属性? -k 侦测该文件名是否具有『Sticky bit』的属性? -s 侦测该档名是否为『非空白档案』? 3. 两个档案之间的比较,如: test file1 -nt file2 -nt (newer than)判断 file1 是否比 file2 新 -ot (older than)判断 file1 是否比 file2 旧 判断 file2 与 file2 是否为同一档案,可用在判断 hard link 的 -ef 判定上。 主要意义在判定,两个档案是否均指向同一个 inode 哩! 4. 关于两个整数之间的判定,例如 test n1 -eq n2 -eq 两数值相等 (equal) -ne 两数值不等 (not equal) -gt n1 大于 n2 (greater than) -lt n1 小于 n2 (less than) -ge n1 大于等于 n2 (greater than or equal) -le n1 小于等于 n2 (less than or equal) 5. 判定字符串的数据 test -z string 判定字符串是否为 0 ?若 string 为空字符串,则为 true 判定字符串是否非为 0 ?若 string 为空字符串,则为 false。 test -n string 注: -n 亦可省略 test str1 = str2 判定 str1 是否等于 str2 ,若相等,则回传 true test str1 != str2 判定 str1 是否不等于 str2 ,若相等,则回传 false 6. 多重条件判定,例如: test -r filename -a -x filename (and)两状况同时成立!例如 test -r file -a -x file,则 file 同 -a 时具有 r 与 x 权限时,才回传 true。 (or)两状况任何一个成立!例如 test -r file -o -x file,则 file -o 具有 r 或 x 权限时,就可回传 true。 ! 反相状态,如 test ! -x file ,当 file 不具有 x 时,回传 true OK!现在我们就利用 test 来帮我们写几个简单的例子。首先,判断一下, 让使用者输入一个档名,我们 判断: 1. 这个档案是否存在,若不存在则给予一个『Filename does not exist』的讯息,并中断程序; 2. 若这个档案存在,则判断他是个档案或目录,结果输出『Filename is regular file』或 『Filename is directory』 3. 判断一下,执行者的身份对这个档案或目录所拥有的权限,并输出权限数据! 你可以先自行创作看看,然后再跟底下的结果讨论讨论。注意利用 test 与 && 还有 || 等标志! [root@linux scripts]# vi sh05.sh #!/bin/bash # Program: # Let user input a filename, the program will search the filename # 1.) exist? 2.) file/directory? 3.) file permissions # History: # 2005/08/25 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH # 1. 让使用者输入档名,并且判断使用者是否真的有输入字符串? echo -e "The program will show you that filename is exist which input by you.\n\n" read -p "Input a filename : " filename test -z $filename && echo "You MUST input a filename." && exit 0 # 2. 判断档案是否存在? test ! -e $filename && echo "The filename $filename DO NOT exist" && exit 0 # 3. 开始判断档案类型与属性 test -f $filename && filetype="regulare file" test -d $filename && filetype="directory" test -r $filename && perm="readable" test -w $filename && perm="$perm writable" test -x $filename && perm="$perm executable" # 4. 开始输出信息! echo "The filename: $filename is a $filetype" echo "And the permission are : $perm" 很有趣的例子吧!您可以自行再以其它的案例来撰写一下可用的功能呢! 利用判断符号 [ ] 除了我们很喜欢使用的 test 之外,其实,我们还可以利用判断符号『 [ ] 』来进行数据的判断呢! 举 例来说,如果我想要知道 $HOME 这个变量是否为空的,可以这样做: [root@linux ~]# [ -z "$HOME" ] 但使用 [] 要特别注意的是,在上述的每个组件中间都需要有空格键来分隔,假设我空格键使用『□』来 表示, 那么,在这些地方你都需要有空格键: [ "$HOME" == "$MAIL" ] [□"$HOME"□==□"$MAIL"□] ↑ ↑↑ ↑ 上面的例子在说明,两个字符串 $HOME 与 $MAIL 是否相同的意思,相当于 test $HOME = $MAIL 的意思 啦! 而如果没有空白分隔,例如 [$HOME==$MAIL] 时,我们的 bash 就会显示错误讯息了!这可要很注意 啊! 所以说,您最好要注意: • 在中括号 [] 内的每个组件都需要有空格键来分隔; • 在中括号内的变量,最好都以双引号来设定; • 在中括号内的常数,最好都以单或双引号来设定。 举例来说,假如我设定了 name="VBird Tsai" ,然后这样判定: [root@linux ~]# name="VBird Tsai" [root@linux ~]# [ $name == "VBird" ] bash: [: too many arguments 为什么呢?因为 $name 如果没有使用双引号刮起来,那么上面的判定式会变成: [ VBird Tsai == "VBird" ] 而不是我们要的: [ "VBird Tsai" == "VBird" ] 这可是差很多的喔!另外,中括号的使用方法与标志与 test 几乎一模一样啊~ 只是中括号比较常用在条 件判断式 if ..... then ..... fi 的情况中就是了。 好,那我们也继续来做一个小案例好了: 1. 当执行一个程序的时候,这个程序会让使用者选择 Y 或 N , 2. 如果使用者输入 Y 或 y 时,就显示『 OK, continue 』 3. 如果使用者输入 n 或 N 时,就显示『 Oh, interrupt !』 4. 如果不是 Y/y/N/n 之内的其它字符,就显示『I don't know what is your choise』 利用中括号、 && 与 || 来继续吧! [root@linux scripts]# vi sh06.sh #!/bin/bash # Program: # This program will show the user's choice # History: # 2005/08/25 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH read -p "Please input (Y/N): " yn [ "$yn" == "Y" -o "$yn" == "y" ] && echo "OK, continue" && exit 0 [ "$yn" == "N" -o "$yn" == "n" ] && echo "Oh, interrupt!" && exit 0 echo "I don't know what is your choise" && exit 0 很有趣吧!利用这个字符串判别的方法,我们就可以很轻松的将使用者想要进行的工作分门别类呢! 接下 来,我们再来谈一些其它有的没有的东西吧! Tips: 为什么判断式里面下达等于要用 == 而不是一个 = 就好了呢?我 们在前一章正规表示法里面的 awk 提到, 只有一个 = 用来给予 一个变量设定其内容,逻辑判断时,则会给予两个等于, 亦即『比 较』而非『设定』的意思~这里要好好的分辨一下喔! ^_^ Shell script 的预设变数($0, $1...) 其实,当我们执行一个 shell script 时,在这个 shell script 里面就已将帮我们做好一些可用的变量 了。 举例来说,在不久的将来,您就会发现,当我们要启动一个系统服务时,可能会下达类似这样的指令: [root@linux ~]# /etc/init.d/crond restart 那是啥玩意儿?呵呵!就是『向 /etc/init.d/crond 这个 script 下达 restart 的指令』, 咦!我们不 是都使用 read 来读取使用者输入的变量内容吗?为啥我可以直接在 script 后面接上这个参数? 这是 因为 shell script 帮我们设定好一些指定的变量了!变量的对应是这样的: /path/to/scriptname opt1 opt2 opt3 opt4 ... $0 $1 $2 $3 $4 ... 这样够清楚了吧?!执行的文件名为 $0 这个变量,第一个接的参数就是 $1 啊~ 所以,只要我们在 script 里面善用 $1 的话,就可以很简单的立即下达某些指令功能了! 好了,来做个例子吧~假设我要 执行一个 script ,执行后,该 script 会自动列出自己的档名, 还有后面接的前三个参数,该如何是好? [root@linux scripts]# vi sh07.sh #!/bin/bash # Program: # The program will show it's name and first 3 parameters. # History: # 2005/08/25 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH echo "The script naem is ==> $0" [ -n "$1" ] && echo "The 1st paramter is ==> $1" || exit 0 [ -n "$2" ] && echo "The 2nd paramter is ==> $2" || exit 0 [ -n "$3" ] && echo "The 3th paramter is ==> $3" || exit 0 这支程序里面鸟哥加上了一些控制式,亦即利用 && 及 || 来加以判断 $1 ~ $3 是否存在? 若存在才显 示,若不存在就中断~执行结果如下: [root@linux scripts]# sh sh07.sh theone haha quot The script naem is ==> sh07.sh The 1st paramter is ==> theone The 2nd paramter is ==> haha The 3th paramter is ==> quot 上面这 7 个例子都很简单吧?几乎都是利用 bash 的相关功能而已~ 不难啦~底下我们就要使用条件判 断式来进行一些分别功能的设定了,好好瞧一瞧先~ 条件判断式: 只要讲到『程序』的话,那么条件判断式,亦即是『 if then 』这种判别式肯定一定要学习的! 因为很 多时候,我们都必须要依据某些数据来判断程序该如何进行。举例来说,我们在上头不是有练习当使用者 输入 Y/N 时,必须要执行不同的讯息输出吗?简单的方式可以利用 && 与 || ,但如果我还想要执行一堆 指令呢? 那真的得要 if then 来帮忙啰~底下我们就来聊一聊! 利用 if .... then 这个 if .... then 是最常见的条件判断式了~简单的说,就是当符合某个条件判断的时候, 就予以进行 某项工作就是了。我们可以简单的这样看: if [ 条件判断式 ]; then 当条件判断式成立时,可以进行的指令工作内容; fi 至于条件判断式的判断方法,与前一小节的介绍相同啊!较特别的是,如果我有多个条件要判别时, 除了 sh06.sh 那个案例,也就是将多个条件写入一个中括号内的情况之外, 我还可以有多个中括号来隔开喔! 而括号与括号之间,则以 && 或 || 来隔开,他们的意义是: • && 代表 AND ; • || 代表 or ; 所以,在使用中括号的判断式中, && 及 || 就与指令下达的状态不同了。举例来说, sh06.sh 那个例子 我可以改写成这样: [root@linux scripts]# vi sh06-2.sh #!/bin/bash # Program: # This program will show the user's choice # History: # 2005/08/25 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH read -p "Please input (Y/N): " yn if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then echo "OK, continue" exit 0 fi if [ "$yn" == "N" ] || [ "$yn" == "n" ]; then echo "Oh, interrupt!" exit 0 fi echo "I don't know what is your choise" && exit 0 不过,由这个例子看起来,似乎也没有什么了不起吧? sh06.sh 还比较简单呢~ 但是,如果我们考虑底 下的状态,您就会知道 if then 的好处了: if [ 条件判断式 ]; then 当条件判断式成立时,可以进行的指令工作内容; else 当条件判断式不成立时,可以进行的指令工作内容; fi 如果考虑更复杂的情况,则可以使用这个语法: if [ 条件判断式一 ]; then 当条件判断式一成立时,可以进行的指令工作内容; elif [ 条件判断式二 ]; then 当条件判断式二成立时,可以进行的指令工作内容; else 当条件判断式一与二均不成立时,可以进行的指令工作内容; fi 那我就可以将 sh06-2.sh 改写成这样: [root@linux scripts]# vi sh06-3.sh #!/bin/bash # Program: # This program will show the user's choice # History: # 2005/08/25 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH read -p "Please input (Y/N): " yn if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then echo "OK, continue" elif [ "$yn" == "N" ] || [ "$yn" == "n" ]; then echo "Oh, interrupt!" else echo "I don't know what is your choise" fi 是否程序变得很简单,而且依序判断,可以避免掉重复判断的状况,这样真的很容易设计程序的啦! ^_^ 好 了,那么如果我要侦测你所输入的参数是否为 hello 呢 , 也就是说,如果我想要知道,你在程序后面所 接的第一个参数 (就是 $1 啊!) 是否为 hello , 1. 如果是的话,就显示 "Hello, how are you ?"; 2. 如果没有加任何参数,就提示使用者必须要使用的参数下达法; 3. 而如果加入的参数不是 hello ,就提醒使用者仅能使用 hello 为参数。 整个程序的撰写可以是这样的: [root@linux scripts]# vi sh08.sh #!/bin/bash # Program: # Show "Hello" from $1.... # History: # 2005/08/28 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH if [ "$1" == "hello" ]; then echo "Hello, how are you ?" elif [ "$1" == "" ]; then echo "You MUST input parameters, ex> $0 someword" else echo "The only parameter is 'hello'" fi 然后您可以执行这支程序,分别在 $1 的位置输入 hello, 没有输入与随意输入, 就可以看到不同的输出 啰~是否还觉得挺简单的啊! ^_^。事实上, 学到这里,也真的很厉害了~好了,底下我们继续来玩一些 比较大一点的啰~ 我们在前一章已经学会了 grep 这个好用的玩意儿,那么多学一个叫做 netstat 的指 令, 这个指令可以查询到目前主机有开启的网络服务端口口 (service ports), 相关的功能我们会在服 务器架设篇继续介绍,这里您只要知道,我可以利用『 netstat -tuln 』来取得目前主机有启动的服务, 而且取得的信息有点像这样: [root@linux ~]# netstat -tuln Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address tcp 0 0 0.0.0.0:199 0.0.0.0:* tcp 0 0 :::80 :::* tcp 0 0 :::22 :::* tcp 0 0 :::25 :::* State LISTEN LISTEN LISTEN LISTEN 上面的重点是特殊字体的那个部分,那些特殊字体的部分代表的就是 port 啰~ 那么每个 port 代表的意 义为何呢?几个常见的 port 与相关网络服务的关系是: • 80: WWW • 22: ssh • 21: ftp • 25: mail 那我如何透过 netstat 去侦测我的主机是否有开启这四个主要的网络服务端口口呢? 我可以简单的这样 去写这个程序喔: [root@linux scripts]# vi sh09.sh #!/bin/bash # Program: # Using netstat and grep to detect WWW,SSH,FTP and Mail services. # History: # 2005/08/28 VBird First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH # 1. 先作一些告知的动作而已~ echo "Now, the services of your Linux system will be detect!" echo -e "The www, ftp, ssh, and mail will be detect! \n" # 2. 开始进行一些测试的工作,并且也输出一些信息啰! testing=`netstat -tuln | grep ":80 "` if [ "$testing" != "" ]; then echo "WWW is running in your system." fi testing=`netstat -tuln | grep ":22 "` if [ "$testing" != "" ]; then echo "SSH is running in your system." fi testing=`netstat -tuln | grep ":21 "` if [ "$testing" != "" ]; then echo "FTP is running in your system." fi testing=`netstat -tuln | grep ":25 "` if [ "$testing" != "" ]; then echo "Mail is running in your system." fi 这样又能够一个一个的检查啰~是否很有趣啊! ^_^。接下来,我们再来玩更难一点的。 我们知道可以利 用 date 来显示日期与时间,也可以利用 $((计算式)) 来计算数值运算。 另外, date 也可以用来显示 自 19710101 以来的『总秒数』 (请自行查阅 man date 及 info date) 。那么,您是否可以撰写一支小 程序,用来『计算退伍日期还剩几天?』也就是说: 1. 先让使用者输入他们的退伍日期; 2. 再由现在日期比对退伍日期; 3. 由两个日期的比较来显示『还需要几天』才能够退伍的字样。 似乎挺难的样子?其实也不会啦,利用『 date --date="YYYYMMDD" +%s 』就能够达到我们所想要的啰~ 如果您已经写完了程序,对照底下的写法试看看: [root@linux scripts]# vi sh10.sh #!/bin/bash # Program: # Tring to calculat