读书笔记之:鸟哥的Linux私房菜——基础学习篇(第三版) (1-7章)

<<鸟哥私房菜>>记录

第1章 计算机概论

  1. CPU的种类

    CPU主要分为两类:精简指令集RISC和复杂指令集CISC。

    对于精简指令集,常见系列有Sun公司的SPARC系列,IBM公司的PowerPC系列,和ARM系列

    复杂指令集主要有AMD,Intel 和VIA的x86系列的CPU

第3章 主机规划与磁盘分区

1. 磁盘介绍

整颗磁盘的第一个扇区特别重要,它记录了两个重要的信息:

(1) MBR (master boot record) 主要启动记录区: 可以安装开机管理程序的地方, 有446bytes

(2) 分区表 (partition table): 记录整个磁盘的分区状态, 有64bytes

MBR非常重要, 系统在开机的时候要主动读取这个分区的内容, 这样才知道如何引导开机

2. 磁盘分区表

在分区表所在的64 bytes 容量中,总共分为四组记录区,每组记录区记录了该区段的启始不结束的磁柱号码。 若将硬盘以长条形来看,然后将磁柱以柱形图来看,那么那64 bytes 的记录区段有点像底下图示:

假设上面的硬盘装置文件名为/dev/hda 时,在linux中得到的装置文件名称如下:

 P1:/dev/hda1

 P2:/dev/hda2

 P3:/dev/hda3

 P4:/dev/hda4

由于分区表就只有64 bytes 而已,最多只能容纳四笔分区的记录, 这四个分区的记录被称为主要(Primary)或扩展(Extended)分区槽。 根据上面的图示与说明,我们可以得到几个重点信息:

 (1) 其实所谓的『分区』只是针对那个64 bytes 的分区表进行设定而已!

 (2) 硬盘默认的分区表仅能写入四组分区信息

 (3) 这四组分区信息我们称为主要 (Primary) 或扩展 (Extended) 分区槽

 (4) 分区槽的最小单位为磁柱 (cylinder)

 (5) 当系统要写入磁盘时,一定会参考磁盘分区表,才能针对某个分区槽进行数据的处理

 

3. 磁盘分区的好处

(1) 数据的安全性

(2) 系统的效率考虑

由二分区槽将数据集中在某个磁柱的区段,例如上图当中第一个分区槽位二磁柱号码 1~100号,如此一来当有数据要读取自该分区槽时, 磁盘只会搜寻前面1~100的磁柱范围,由于数据集中了,将有利于数据读取的速度与效能!所以说,分区是很重要的!

4. 扩展分区

 

如果要多于4个分区可以使用扩展分区,将扩展分区进行划分. 上面提到的4个分区可以划为主分区或扩展分区

在上图当中,我们知道硬盘的四个分区记录区仅使用到两个,P1为主要分区,而 P2则为扩展分区。

请注意, 扩展分区的目的是使用额外的扇区来记录分区信息,扩展分区本身并不能被拿来格式化。 然

后我们可以透过扩展分区所指向的那个区块继续作分区的记录。

同样的,上述的分区槽在Linux系统中的装置文件名分别如下:

 P1:/dev/hda1

 P2:/dev/hda2

 L1:/dev/hda5

 L2:/dev/hda6

 L3:/dev/hda7

 L4:/dev/hda8

 L5:/dev/hda9

 

关于分区终结如下:

主要分区、扩展分区与逻辑分区的特性我们作个简单的终结如下:

(1) 主要分区与扩展分区最多可以有四笔(硬盘的限制)

(2) 扩展分区最多只能有一个 (操作系统的限制)

(3) 逻辑分区是由扩展分区持续切割出来的分区槽;

(4) 能够被格式化后,作为数据存取的分区槽为主要分区与逻辑分区。扩展分区无法格式化;

(5) 逻辑分区的数量依操作系统而不同,在Linux 系统中,IDE硬盘最多有59个逻辑分区 (5号到63号), SATA 硬盘则有11个逻辑分区(5 号到15 号)。

 

5. 开机流程与主要启动记录区 (MBR)

简单的说,整个开机流程到操作系统之前的动作应该是这样的:

(1). BIOS:开机主动执行的韧体,会认识第一个可开机的装置;

BIOS会去分析计算机里面有哪些储存设备,我们以硬盘为例,BIOS会依据使用者的设定去取得能够开机的硬盘,并且到该硬盘里面去读取第一个扇区的 MBR 位置。 MBR 这个仅有446 bytes 的硬盘容量里面会放置最基本的开机管理程序, 此时 BIOS 就功成圆满,而接下来就是MBR 内的开机管理程序的工作了。

(2). MBR:第一个可开机装置的第一个扇区内的主要启动记录区块,内含开机管理程序;

(3). 开机管理程序 (boot loader) :一支可读取核心档案来执行的软件;

这个开机管理程序的目的是在加载(load)核心档案, 由于开机管理程序是操作系统在安装的时候所提供的, 所以他会认识硬盘内的文件系统格式,因此就能够读取核心档案, 然后接下来就是核心档案的工作, 开机就完成了.

(4). 核心档案:开始操作系统的功能...

 

由上面的说明我们会知道,BIOS 与MBR 都是硬件本身会支持的功能,至于Boot loader则是操作系统安装在MBR 上面的一套软件了。由于 MBR 仅有 446 bytes 而已,因此这个开机管理程序是非常小而美的。 这个boot loader的主要仸务有底下这些项目:

(1) 提供选单:用户可以选择不同的开机项目,这也是多重引导的重要功能!

(2) 载入核心档案:直接指向可开机的程序区段来开始操作系统;

(3) 转交其他loader:将开机管理功能转交给其他 loader 负责。

开机管理程序除可以安装在MBR中外,还可以安装在其他分区的启动扇区。

6. 双系统引导

我们举一个例子来说,假设你的个人计算机只有一个硬盘,里面切成四个分割槽,其中第一、二分割槽分别安装了Windows 及Linux, 你要如何在开机的时候选择用Windows 还是Linux开机呢?假设MBR 内安装的是可同时认识Windows/Linux操作系统的开机管理程序, 那么整个流程可以图标如下:

在上图中我们可以发现,MBR 的开机管理程序提供两个选单,选单一(M1)可以直接加载Windows 的核心档案来开机; 选单二(M2)则是将开机管理工作交给第二个分割槽的启动扇区(boot sector)。当使用者在开机的时候选择选单二时, 那么整个开机管理工作就会交给第二分割槽的开机管理程序了。 当第二个开机管理程序启动后,该开机管理程序内(上图中)仅有一个开机选单,因此就能够使用Linux的核心档案来开机啰。 这就是多重引导的工作情况啦!我们将上图作个总结:

 (1) 每个分割槽都拥有自己的启动扇区 (boot sector)

(2) 图中的系统槽为第一及第二分割槽,

(3) 实际可开机的核心档案是放置到各分割槽内的!

(4) Loader只会认识自己的系统槽内的可开机核心档案,以及其他 loader而已;

(5) Loader可直接指向或者是间接将管理权转交给另一个管理程序。

为什么人家常常说:『如果要安装多重引导, 最好先安装Windows 再安装Linux』呢?这是因为:

 (1) Linux在安装的时候,你可以选择将开机管理程序安装在 MBR 或各别分割槽的启动扇区, 而且Linux的loader可以手动设定选单 (就是上图的 M1, M2...) ,所以你可以在 Linux 的boot loader里面加入Windows 开机的选项;

 (2) Windows 在安装的时候,他的安装程序会主动的覆盖掉 MBR 以及自己所在分割槽的启动扇区,你没有选择的机会, 而且他没有让我们自己选择选单的功能。

因此,如果先安装Linux再安装 Windows 的话,那 MBR 的开机管理程序就只会有Windows 的项目,而不会有Linux的项目 (因为原本在MBR 内的 Linux的开机管理程序就会被覆盖掉)。 那需要重新安装Linux 一次吗?当然不需要,你只要用尽各种方法来处理 MBR 的内容即可。 例如利用全中文的spfdisk(http://spfdisk.sourceforge.net/)软件来安装认识Windows/Linux 的管理程序, 也能够利用Linux的救援模式来挽救 MBR 即可。

 

 

第4章 安装CentOS

1. 磁盘分区

如同前面谈到的,磁盘分区是整个安装过程里面最重要的部分了。CentOS默认给了我们四种分割模式,分别为:

(1) 移除所选磁盘上的所有分割区,并建立默认分割模式: 如果选择这种模式,linux会将硬盘里面的分割全部被删除后, 以安装程序的默认方式重新建立分割槽

(2) 移除所选磁盘上的 Linux 分割区,并建立默认的分割模式: 在这个硬盘内,只有Linux 的分割槽会被删除,然后再以安装程序的默认方式重新建立分割槽。

(3) 使用所选取磁盘上的未使用空间,建立默认的分割模式: 如果你的这颗硬盘内还有未被分割的磁柱空间 (注意,是未被分割,而不是该分割槽内没有数据的意思!), 那么使用这个项目后,他不会更改原有的分割槽,只会就剩余的未分割区块进行预设分割的建置。

(4) 建立自定义的分割模式

 

2. 文件系统的选择

 

这几种文件系统类型分别是:

(1) Ext2/ext3:是Linux 适用的文件系统类型。由于 ext3 文件系统多了日志的记录, 对于系统的复原比较快速,因此建议你务必要选择新的 ext3 不要用ext2 了。

(2) Physical volume (LVM) :这是用来弹性调整文件系统容量的一种机制, 可以让你的文件系统容量变大或变小而不改变原有的档案数据内容!

(3) Software RAID:利用Linux操作系统的特性,用软件仿真出磁盘阵列的功能!

(4) Swap:就是内存置换空间!由于swap 并不会使用到目录树的挂载, 所以用swap 就不需要指定挂载点!

在传统的 Linux说明文件当中特别有指定到『swap 最好为物理内存的 1.5 到2倍之间』。swap置换空间是很重要的, 因为他可以避免因为物理内存不足而造成的系统效能低落的问题。但是如果你的物理内存有 4GB以上时, 老实说,swap也可以不必额外设定.

swap 内存置换空间的功能是:当有数据被存放在物理内存里面,但是这些数据又不是常被CPU所取用时, 那么这些不常被使用的程序将会被丢到硬盘的 swap 置换空间当中, 而将速度较快的物理内存空间释放出来给真正需要的程序使用! 所以,如果你的系统不很忙,而内存又很大,自然不需要 swap啰。

(5) Vfat:同时被Linux 与Windows 所支持的文件系统类型。 如果你的主机硬盘内同时存在Windows与Linux操作系统,为了数据的交换,确实可以建置一个 vfat 的文件系统!

 

3. SELinux

它是Security Enhanced Linux的缩写,这个软件是由美国国家安全局(National Security Agency, NAS)所开发的,这东西并不是防火墙喔!SELinux 是一个Linux系统讵问控制 (Access control) 的细部设定, 重点在于控制程序对于系统档案的讵问权限限制。由于 CentOS 5.x 以后的Linux版本对于SELinux的设定已经非常的妥当了, 因此建议您务必要打开这个功能!

4. Kdump

Kdump 就是,当核心出现错误的时候, 是否要将当时的内存内的讯息写到档案中,而这个档案就能够给核心开发者研究为啥会宕机之用。 我们并不是核心开发者,而且内存内的数据实在太大了,因此常常进行 Kdump 会造成硬盘空间的浪费。 所以,这里建议不要启动Kdump 的功能!

 

5. 双系统的安装

 

新主机仅有一颗硬盘

如果你的系统是新的,并且想要安装多重操作系统时,那么这个多重操作系统的安装将显的很简单啊! 假设以目前主流的 160GB 硬盘作为规划好了,而你想要有WindowsXP, WindowsXP的数据碟, Linux, swap 及一个共享分割槽, 那我们首先来规划一下硬盘分割吧!如果是这样的需求,那你可以这样规划:

安装一定要先装WindowsX 再装Linux才好!

  1. 安装Windows XP

    在这个阶段依旧使用Windows XP光盘开机来安装,安装到了分割时,记得依照上述表格的规划制作出两个主要分割槽, 并且将文件系统格式化为 NTFS,然后再将Windows XP装到 C 槽当中。理论上,此时仅有/dev/sda1, /dev/sda2 而已喔!

  2. 安装CentOS 5.x

    再来则是安装Linux,安装时要注意的地方也是在分割的地方,请回到前一小节的磁盘分区部分来进行分割设定。另外一个要注意的地方则是在开机管理程序的地方, 尤其是『默认开机』项目,是默认要Windows 还是Linux开机呢?这需要你的选择喔!而且 grub 务必要安装到MBR 上头。

  3. 后续维护的注意事项

    多重引导设定完毕后请特别注意, (1)Windows 的环境中最好将Linux的根目录与 swap取消挂载,否则未来你打开档案总管时, 该软件会要求你『格式化!』如果一个不留神,你的 Linux系统就毁了。 (2) 你的Linux不可以随便的删除! 因为grub 会去读取Linux根目录下的/boot/目录内容,如果你将 Linux移除了,你的Windows 也就无法开机了! 因为整个开机选单都会不见喔!

     

     

第5章 首次登陆与在线帮助

1. 关机/重新启动相关的指令

谈一谈几个与关机/重新启动相关的指令:

(1) 将数据同步写入硬盘中的指令: sync

 (2) 惯用的关机指令: shutdown

 (3) 重新启动,关机: reboot, halt, poweroff

2.切换执行等级: init

本章上头有谈到过关于 run level 的问题。之前谈到的是系统运作的模式,分为纯文本(run level 3)及图形接口模式(run level 5)。除了这两种模式外,有没有其他模式呢?其实 Linux 共有七种执行等级, 七种等级的意义我们在后面会再谈到。本章你只要知道底下四种执行等级就好了:

 run level 0:关机

 run level 3:纯文本模式

 run level 5:含有图形接口模式

 run level 6:重新启动

那如何切换各模式呢?可以使用 init 这个指令来处理喔!也就是说,如果你想要关机的话, 除了上述的 shutdown -h now 以及poweroff 之外,你也可以使用如下的指令来关机:

[root@www ~]# init 0

3. 保护硬盘

硬盘该如何预防发生文件系统错误的问题呢?

 (1) 妥善保养硬盘:

例如:主机通电之后部要搬动,避免移动或震动硬盘;尽量降低硬盘的温度,可以加装风扇来冷却硬盘; 或者可以换装 SCSI 硬盘。

 (2) 划分不同的partition:

为什么磁盘分区这么重要!因为Linux每个目录被读写的频率不同,妥善的分割将会让我们的Linux更安全! 通常我们会建议划分下列的磁盘区块:

o /

o /boot

o /usr

o /home

o /var

这样划分有些好处,例如/var是系统默认的一些数据暂存或者是 cache数据的储存目录, 像 e-mail 就含在这里面。如果还有使用 proxy 时,因为常常存取,所以有可能会造成磁盘损坏, 而当这部份的磁盘损坏时,由于其他的地方是没问题的,因此资料得以保存,而且在处理时也比较容易!

 

第六章、Linux 的档案权限与目录配置

1. 权限设置

 chgrp :改变档案所属群组

 chown :改变档案拥有者

 chmod :改变档案的权限, SUID, SGID, SBIT 等等的特性

 

事实上,chown 也可以使用『chown user.group file』,亦即在拥有者与群组间加上小数点『.』也行! 不过很多朋友在设定账号时,喜欢在账号当中加入小数点(例如vbird.tsai这样的账号格式),这就会造成系统的误判了! 所以我们比较建议使用冒号『:』来隔开拥有者与群组啦!此外,chown 也能单纯的修改所属群组呢! 例如『chown .sshd install.log』就是修改群组~看到了吗?就是那个小数点的用途!

2.  权限对档案的重要性

3.  权限对目录的重要性

Linux下的档案类型:一般文件(regular file)-,目录(directory)d,链接文件(link)l,设备文件(device)【区块设备b和字符设备c】,接口文件(socket)s,数据传输文件(pipe)p

4. Linux目录配置的依据—FHS

因为利用 Linux来开发产品或 distributions的社群/公司与个人实在太多了, 如果每个人都用自己的想法来配置档案放置的目录,那么将可能造成很多管理上的困扰。 你能想象,你进入一个企业之后,所接触到的 Linux目录配置方法竟然跟你以前学的完全不同吗? 所以,后来就有所谓的Filesystem Hierarchy Standard (FHS)标准!

根据 FHS(http://www.pathname.com/fhs/)的官方文件指出, 他们的主要目的是希望让使用者可以了解到已安装软件通常放置于那个目录下, 所以他们希望独立的软件开发商、操作系统制作者、以及想要维护系统的用户,都能够遵循 FHS的标准。 也就是说,FHS的重点在于规范每个特定的目录下应该要放置什么样子的数据而已。 这样做好处非常多,因为 Linux操作系统就能够在既有的面貌下(目录架构不变)发展出开发者想要的独特风格。

事实上,FHS是根据过去的经验一直再持续的改版的,FHS依据文件系统使用的频繁与否与是否允许使用者随意更动, 而将目录定义成为四种交互作用的形态,用表格来说有点像底下这样:

上表中的目录就是一些代表性的目录,该目录底下所放置的数据在底下会谈到,这里先略过不谈。 我们要了解的是,什么是那四个类型?

 可分享的:可以分享给其他系统挂载使用的目录,所以包括执行文件与用户的邮件等数据, 是能够分享给网络上其他主机挂载用的目录;

 不可分享的:自己机器上面运作的装置档案或者是与程序有关的 socket 档案等, 由于仅与自身机器有关,所以当然就不适合分享给其他主机了。

 不变的:有些数据是不会经常变动的,跟随着 distribution 而不变动。 例如函式库、文件说明文件、系统管理员所管理的主机服务配置文件等等;

 可变动的:经常改变的数据,例如登录文件、一般用户可自行收受的新闻组等。

事实上,FHS针对目录树架构仅定义出三层目录底下应该放置什么数据而已,分别是底下这三个目录的定义:

 / (root, 根目录):与开机系统有关;

 /usr (unix software resource):与软件安装/执行有关;

 /var (variable):与系统运作过程有关。

为什举要定义出这三层目录呢?其实是有意义的喔!每层目录底下所应该要放置的目录也都又特定的规定!

 5. 根目录 (/) 的意义与内容:

根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的, 同时根目录也与开机/还原/系统修复等动作有关。 由于系统开机时需要特定的开机软件、核心档案、开机所需程序、 函式库等等档案数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。 因为根目录是这么的重要,所以在 FHS的要求方面,他希望根目录不要放在非常大的分割槽内, 因为越大的分割槽妳会放入越多的数据,如此一来根目录所在分割槽就可能会有较多发生错误的机会。

因此 FHS标准建议:根目录(/)所在分割槽应该越小越好, 且应用程序所安装的软件最好不要与根目录放在同一个分割槽内,保持根目录越小越好。 如此不但效能较佳,根目录所在的文件系统也较不容易发生问题。

有鉴于上述的说明,因此 FHS定义出根目录(/)底下应该要有底下这些次目录的存在才好:

除了这些目录的内容之外,另外要注意的是,因为根目录与开机有关,开机过程中仅有根目录会被挂载, 其他分割槽则是在开机完成之后才会持续的进行挂载的行为。就是因为如此,因此根目录下与开机过程有关的目录, 就不能够与根目录放到不同的分割槽去!那哪些目录不可与根目录分开呢?有底下这些:

 /etc:配置文件

 /bin:重要执行档

 /dev:所需要的装置档案

 /lib:执行档所需的函式库与核心所需的模块

 /sbin:重要的系统执行文件

这五个目录千万不可与根目录分开在不同的分割槽!

 

6.  /usr 的意义与内容

依据 FHS的基本定义,/usr里面放置的数据属于可分享的与不可变动的(shareable, static), 如果你知道如何透过网络进行分割槽的挂载(例如在朋务器篇会谈到的 NFS朋务器),那么/usr 确实可以分享给局域网络内的其他主机来使用喔!

很多读者都会误会/usr 为user 的缩写,其实usr 是Unix Software Resource 的缩写, 也就是『Unix操作系统软件资源』所放置的目录,而不是用户的数据啦! FHS 建议所有软件开发者,应该将他们的数据合理的分别放置到这个目录下的次目录,而不要自行建立该软件自己独立的目录。 因为是所有系统默认的软件(distribution发布者提供的软件)都会放置到/usr底下,因此这个目录有点类似Windows 系统的『C:\Windows\ + C:\Program files\』这两个目录的综合体,系统刚安装完毕时,这个目录会占用最多的硬盘容量。 一般来说,/usr的次目录建议有底下这些:

7.  /var 的意义与内容:

如果/usr 是安装时会占用较大硬盘容量的目录,那么/var就是在系统运作后才会渐渐占用硬盘容量的目录。 因为/var 目录主要针对常态性变动的档案,包括快取(cache)、登录档(log file)以及某些软件运作所产生的档案, 包括程序档案(lock file, run file),或者例如MySQL 数据库的档案等等。常见的次目录有:

 

 针对FHS,各家distributions的异同由于 FHS仅是定义出最上层(/)及次层(/usr, /var)的目录内容应该要放置的档案与目录数据, 因此,在其他次目录层级内,就可以随开发者自行来配置了。举例来说,CentOS的网络设定数据放在 /etc/sysconfig/network-scripts/ 目录下,但是 SuSE 则是将网络放置在 /etc/sysconfig/network/ 目录下,目录名称可是不同的呢!不过只要记住大致的 FHS标准,差异性其实有限啦!

8. 目录树(directory tree)

另外,在 Linux底下,所有的档案与目录都是由根目录开始的!那是所有目录与档案的源头~ 然后再一个一个的分支下来,有点像是树枝状. 因此,我们也称这种目录配置方式为:『目录树(directory tree)』 这个目录树有什么特性呢?他主要的特性有:

  • 目录树的起始点为根目录 (/, root);

  • 每一个目录不止能使用本地端的 partition 的文件系统,也可以使用网络上的 filesystem 。举例来说, 可以利用 Network File System (NFS) 服务器挂载某特定目录等。

  • 每一个档案在此目录树中的文件名(包含完整路径)都是独一无二的。

如果我们将整个目录树以图标的方法来显示,并且将较为重要的档案数据列出来的话,那么目录树架构有点像这样:

根据 FHS 的定义,最好能够将/var 独立出来, 这样对于系统的数据还有一些安全性的保护!因为至少/var 死掉时,你的根目录还会活着! 还能够进入救援模式!

分区建议:

/boot

/:

/var:

/usr:

/home:

 

第7章 档案与目录管理

1. ls命令参数解析

 

2. 取得路径的文件名与目录名称

我们前面介绍的完整文件名 (包含目录名称与文件名) 当中提到,完整档名最长可以到达 4096 个字符。 那么你怎么知道那个是档名?那个是目录名?就是利用斜线 (/) 来分辨! 其实,取得文件名或者是目录名称,一般的用途应该是在写程序的时候,用来判断之用的~ 所以,这部分的指令可以用在第三篇内的 shell scripts 里头喔! 底下我们简单的以几个范例来谈一谈 basename 与 dirname 的用途!

3. 档案内容查阅:

如果我们要查阅一个档案的内容时,该如何是好呢?这里有相当多有趣的指令可以来分享一下: 最常使用的显示档案内容的指令可以说是 cat 与 more 及 less 了!此外,如果我们要查看一个很大型的档案 (好几百MB时),但是我们只需要后端的几行字而已,那么该如何是好?呵呵!用 tail 呀,此外, tac 这个指令也可以达到!好了,说说各个指令的用途吧!

 cat 由第一行开始显示档案内容

 tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!

 nl 显示的时候,顺道输出行号!

 more 一页一页的显示档案内容

 less 与 more 类似,但是比 more 更好的是,他可以往前翻页!

 head 只看头几行

 tail 只看尾巳几行

 od 以二进制的方式读取档案内容!

 

4. 修改档案时间或建置新档: touch

我们在 ls 这个指令的介绍时,有稍微提到每个档案在 linux底下都会记录讲多的时间参数, 其实是有三个主要的变动时间,那么三个时间的意义是什么呢?

  • modification time (mtime):

    当该档案的『内容数据』变更时,就会更新这个时间!内容数据指的是档案的内容,而不是档案的属性或权限喔!

  • status time (ctime):

    当该档案的『状态 (status)』改变时,就会更新这个时间,举例来说,像是权限与属性被更改了,都会更新这个时间啊。

  • access time (atime):

    当『该档案的内容被取用』时,就会更新这个读取时间 (access)。举例来说,我们使用 cat 去读取 /etc/man.config , 就会更新该档案的 atime 了。

 

 

5. umask用法

 

在默认权限的属性上,目录与档案是不一样的。从第六章我们知道 x 权限对于目录是非常重要的! 但是一般档案的建立则不应该有执行的权限,因为一般档案通常是用在于数据的记录嘛!当然不需要执行的权限了。 因此,预设的情况如下:

  • 若使用者建立为『档案』则预设『没有可执行( x )权限』,亦即只有 rw 这两个项目,也就是最大为 666 分,预设权限如下: -rw-rw-rw-

  • 若用户建立为『目录』,则由于 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为 777 分,预设权限如下: drwxrwxrwx

要注意的是,umask 指的是『该默认值需要减掉的权限!』如果以上面的例子来说明的话,因为 umask 为 022 ,所以 user 并没有被拿掉任何权限,不过 group 与others 的权限被拿掉了 2 (也就是 w 这个权限),那么当使用者:

 建立档案时:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--

 建立目录时:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x

6. find指令

find 的特殊功能就是能够进行额外的动作(action)。我们将范例八的例子以图解来说明如下:

第八章、Linux 磁盘与文件系统管理

1. 文件系统特性

2. 文件系统的运作方式

常常会听到所谓的『碎片整理』吧? 需要碎片整理的原因就是档案写入的 block 太过于离散了,此时档案读取的效能将会变的很差所致。 这个时候可以透过碎片整理将同一个档案所属的 blocks 汇整在一起,这样数据的读取会比较容易啊! 想当然尔,FAT 的文件系统需要三不五时的碎片整理一下,那么 Ext2 是否需要磁盘重整呢?

由于Ext2 是索引式文件系统,基本上不太需要常常进行碎片整理的。但是如果文件系统使用太久, 常常删除/编辑/新增档案时,那么还是可能会造成档案数据太过于离散的问题,此时或许会需要进行重整一下的. 不过,老实说,鸟哥倒是没有在 Linux 操作系统上面进行过 Ext2/Ext3 文件系统的碎片整理。

3. Linux 的 EXT2 文件系统(inode):

(1) data block (资料区块)

data block 是用来放置档案内容数据地方,在 xt2 文件系统中所支持的 block 大小有 1K, 2K 及 4K 三种而已。在格式化时 block 的大小就固定了,且每个 block 都有编号,以方便 inode 的记录啦。 不过要注意的是,由于 block 大小的差异,会寻致该文件系统能够支持的最大磁盘容量与最大单一档案容量并不相同。 因为 block 大小而产生的 Ext2 文件系统限制如下:(注2)

(2) inode table (inode表格)

基本上,inode 记录的档案数据至少有底下这些:(注4)

  • 该档案的存取模式(read/write/excute);

  • 该档案的拥有者与群组(owner/group);

  • 该档案的容量;

  • 该档案建立或状态改变的时间(ctime);

  • 最近一次的读取时间(atime);

  • 最近修改的时间(mtime);

  • 定义档案特性的旗标(flag),如 SetUID...;

  • 该档案真正内容的指向 (pointer);

inode 的数量与大小也是在格式化时就已经固定了,除此之外 inode 还有些什么特色呢?

  • 每个 inode 大小均固定为 128 bytes;

  • 每个档案都仅会占用一个 inode 而已;

  • 承上,因此文件系统能够建立的档案数量与 inode 的数量有关;

  • 系统读取档案时需要先找到 inode,并分析 inode 所记录的权限与用户是否符合,若符合才能够开始实际读取 block 的内容。

这样子 inode 能够指定多少个 block 呢?我们以较小的 1K block 来说明好了,可以指定的情况如下:

  • 12 个直接指向: 12*1K=12K

由于是直接指向,所以总共可记录 12 笔记录,因此总额大小为如上所示;

  • 间接: 256*1K=256K

每笔 block 号码的记录会花去 4bytes,因此 1K 的大小能够记录 256 笔记录,因此一个间接可以记录的档案大小如上;

  • 双间接: 256*256*1K=2562K

第一层 block 会指定 256 个第二层,每个第二层可以指定 256 个号码,因此总额大小如上;

  • 三间接: 256*256*256*1K=2563K

第一层 block 会指定 256 个第二层,每个第二层可以指定 256 个第三层,每个第三层可以指定256 个号码,因此总额大小如上;

 总额:将直接、间接、双间接、三间接加总,得到 12 + 256 + 256*256 + 256*256*256 (K) = 16GB

此时我们知道当文件系统将 block 格式化为 1K 大小时,能够容纳的最大档案为 16GB,比较一下文件系统限制表的结果可发现是一致的!但这个方法不能用在 2K 及 4K block 大小的计算中, 因为大于2K 的 block 将会受到 Ext2 文件系统本身的限制,所以计算的结果会不太符合之故。

(3) Superblock (超级区块)

Superblock 是记录整个 filesystem 相关信息的地方, 没有 Superblock ,就没有这个 filesystem 了。他记录的信息主要有:

  • block 与 inode 的总量;

  • 未使用与已使用的 inode / block 数量;

  • block 与inode 的大小 (block 为 1, 2, 4K,inode 为 128 bytes);

  • filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间等文件系统的相关信息;

  • 一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为1 。

Superblock 是非常重要的,因为我们这个文件系统的基本信息都写在这里,因此,如果 superblock死掉了, 你的文件系统可能就需要花费很多时间去挽救啦!一般来说,superblock 的大小为1024bytes。相关的 superblock 讯息我们等一下会以 dumpe2fs 指令来呼叫出来观察喔!

此外,每个 blockgroup 都可能含有 superblock 喔!但是我们也说一个文件系统应该仅有一个superblock 而已,那是怎么回事啊? 事实上除了第一个block group 内会含有 superblock 之外,后续的 block group 不一定含有 superblock , 而若含有 superblock 则该 superblock 主要是做为第一个 blockgroup 内 superblock 的备份,这样可以进行 superblock 的救援呢!

(4) Filesystem Description (文件系统描述说明)

这个区段可以描述每个 block group 的开始与结束的 block 号码,以及说明每个区段 (superblock, bitmap, inodemap, data block) 分别介于 哪一个 block 号码之间。这部份也能够用 dumpe2fs 来观察的。

(5) block bitmap (区块对照表)

如果你想要新增档案时总会用到 block 吧!那你要使用那个 block 来记录呢?当然是选择『空的block 』来记录新档案的数据啰。 那你怎么知道那个 block 是空的?这就得要透过 block bitmap 的辅助了。从 block bitmap 当中可以知道哪些 block 是空的,因此我们的系统就能够很快速的找到可使用的空间来处置档案啰。

同样的,如果你删除某些档案时,那么那些档案原本占用的 block 号码就得要释放出来, 此时在block bitmpap 当中相对应到该 block 号码的标志就得要修改成为『未使用中』啰!这就是 bitmap的功能。

(6)  inode bitmap (inode 对照表)

这个其实与 block bitmap 是类似的功能,只是 block bitmap 记录的是使用与未使用的 block 号码, 至于 inode bitmap 则是记录使用与未使用的 inode 号码啰!

 

4. 与目录树的关系

由前一小节的介绍我们知道在 Linux 系统下,每个档案(不管是一般档案还是目录档案)都会占用一个inode , 且可依据档案内容的大小来分配多个 block 给该档案使用。而由第六章的权限说明中我们知道目录的内容在记录文件名, 一般档案才是实际记录数据内容的地方。那么目录与档案在 Ext2 文件系统当中是如何记录数据的呢? 基本上可以这样说:

(1)  目录

当我们在 Linux 下的 ext2 文件系统建立一个目录时, ext2 会分配一个 inode 于至少一块 block 给该目录。其中,inode 记录该目录的相关权限与属性,并可记录分配到的那块 block 号码; 而 block 则是记录在这个目录下的文件名与该文件名占用的 inode 号码数据。也就是说目录所占用的 block 内容在记录如下的信息:

(2) 档案:

当我们在 Linux 下的 ext2 建立一个一般档案时, ext2 会分配一个 inode 与相对于该档案大小的block 数量给该档案。例如:假设我的一个 block 为 4 Kbytes ,而我要建立一个 100 KBytes 的档案,那么 linux 将分配一个 inode 与 25 个 block 来储存该档案! 但同时请注意,由于 inode 仅有 12个直接指向,因此还要多一个 block 来作为区块号码的记录喔!

5.  目录树读取:

inode 本身并不记录文件名,文件名的记录是在目录的 block 当中。 因此在第六章档案与目录的权限说明中, 我们才会提到『新增/删除/更名文件名与目录的 w 权限有关』的特色!那么因为文件名是记录在目录的 block 当中, 因此当我们要读取某个档案时,就务必会经过目录的 inode 与 block ,然后才能够找到那个待读取档案的 inode 号码, 最终才会读到正确的档案的 block 内的数据。

由于 目录树是由根目录开始读起,因此系统透过挂载的信息可以找到挂载点的 inode 号码(通常一个filesystem 的最顶层 inode 号码会由 2 号开始喔!),此时就能够得到根目录的 inode 内容,并依据该inode 读取根目录的 block 内的文件名数据,再一层一层的往下读到正确的档名。

举例来说,如果我想要读取 /etc/passwd 这个档案时,系统是如何读取的呢?

如上表所示,该档案的读取流程为(假设读取者身份为 vbird 这个一般身份使用者):

(1). / 的 inode:

透过挂载点的信息找到 /dev/hdc2 的 inode 号码为 2 的根目录 inode,且 inode 规范的权限让我们可以读取该 block 的内容(有 r与 x) ;

(2). / 的 block:

经过上个步骤取得 block 的号码,并找到该内容有 etc/ 目录的 inode 号码 (1912545);

(3). etc/ 的 inode:

读取 1912545 号 inode 得知 vbird 具有 r 与 x 的权限,因此可以读取 etc/ 的 block 内容;

(4). etc/ 的 block:

经过上个步骤取得 block 号码,并找到该内容有 passwd 档案的 inode 号码 (1914888);

(5). passwd 的 inode:

读取 1914888 号 inode 得知 vbird 具有 r 的权限,因此可以读取 passwd 的 block 内容;

(6). passwd 的 block:

最后将该 block 内容的数据读出来。

6. filesystem 大小与磁盘读取效能:
另外,关于 文件系统的使用效率上,当你的一个文件系统规划的很大时,例如 100GB 这么大时, 由于硬盘上面的数据总是来来去去的,所以,整个文件系统上面的档案通常无法连续写在一起(block 号码不会连续的意思), 而是填入式的将数据填入没有被使用的 block 当中。如果档案写入的 block 真的分的很散, 此时就会有所谓的档案数据离散的问题发生了。

如前所述,虽然我们的 ext2 在 inode 处已经将该档案所记录的 block 号码都记上了, 所以资料可以一次性读取,但是如果档案真的太过离散,确实还是会发生读取效率低落的问题。 因为磁盘读取头还是得要在整个文件系统中来来去去的频繁读取! 果真如此,那么可以将整个 filesystme 内的数据全部复制出来,将该 filesystem 重新格式化, 再将数据给他复制回去即可解决这个问题。

此外,如果 filesystem 真的太大了,那么当一个档案分别记录在这个文件系统的最前面与最后面的 block 号码中, 此时会造成硬盘的机械手臂移动幅度过大,也会造成数据读取效能的低落。而且读取头再搜寻整个 filesystem 时, 也会花费比较多的时间去搜寻!因此, partition 的规划并不是越大越好, 而是真的要针对您的主机用途来进行规划才行!

 

7. EXT2/EXT3 档案的存取与日志式文件系统的功能

上一小节谈到的仅是读取而已,那么如果是新建一个档案或目录时,我们的 Ext2 是如何处理的呢? 这个时候就得要 block bitmap 及 inode bitmap 的帮忙了!假设我们想要新增一个档案,此时文件系统的行为是:

(1). 先确定用户对于 欲新增档案的目录是否具有 w 与 x 的权限,若有的话才能新增;

(2). 根据 inode bitmap 找到没有使用的 inode 号码,并将新档案的权限/属性写入;

(3). 根据 block bitmap 找到没有使用中的 block 号码,并将实际的数据写入 block 中,且更新inode 的 block 指向数据;

(4). 将刚刚写入的 inode 与 block 数据同步更新 inode bitmap 与 block bitmap,并更新superblock 的内容。

一般来说,我们将 inode table 与 data block 称为数据存放区域,至于 其他例如 superblock、 block bitmap 与 inode bitmap 等区段就被称为 metadata (中介资料) 。因为 superblock, inode bitmap 及 block bitmap 的数据是经常变动的,每次新增、移除、编辑时都可能会影响到这三个部分的数据,因此才被称为中介数据的啦。

8. 日志式文件系统 (Journaling filesystem)

为了避免上述提到的文件系统不一致的情况发生,因此我们的前辈们想到一个方式, 如果在我们的filesystem 当中规划出一个区块,该区块专门在记录写入或修订档案时的步骤, 那不就可以简化一致性检查的步骤了?也就是说:

(1). 预备:当系统要写入一个档案时,会先在日志记录区块中记录某个档案准备要写入的信息;

(2). 实际写入:开始写入档案的权限不数据;开始更新 metadata 的数据;

(3). 结束:完成数据与 metadata 的更新后,在日志记录区块当中完成该档案的记录。

在这样的程序当中,万一数据的记录过程当中发生了问题,那么我们的系统只要去检查日志记录区块, 就可以知道那个档案发生了问题,针对该问题来做一致性的检查即可,而不必针对整块 filesystem 去检查, 这样就可以达到快速修复 filesystem 的能力了!这就是日志式档案最基础的功能.

9. Linux 文件系统的运作:

我们现在知道了目录树与文件系统的关系了,但是我们也知道, 所有的数据都得要加载到内存后 CPU 才能够对该数据进行处理。想一想,如果你常常编辑一个好大的档案, 在编辑的过程中又频繁的要系统来写入到磁盘中,由于 磁盘写入的速度要比内存慢很多, 因此你会常常耗在等待硬盘的写入/读取上。

为了解决这个效率的问题,因此我们的 Linux 使用的方式是透过一个称为异步处理 (asynchronously)的方式。所谓的异步处理是这样的:

当系统加载一个档案到内存后,如果该档案没有被更动过,则在内存区段的档案数据会被设定为干净(clean)的。 但如果内存中的档案数据被更改过了(例如你用 nano 去编辑过这个档案),此时该内存中的数据会被设定为脏的 (Dirty)。此时所有的动作都还在内存中执行,并没有写入到磁盘中! 系统会不定时的将内存中设定为『Dirty』的数据写回磁盘,以保持磁盘与内存数据的一致性。 也可以利用 sync指令来手动强迫写入磁盘。

我们知道内存的速度要比硬盘快的多,因此如果能够将常用的档案放置到内存当中,这不就会增加系统性能吗? 没错!是有这样的想法!因此我们 Linux 系统上面文件系统与内存有非常大的关系喔:

  • 系统会将常用的档案数据放置到主存储器的缓冲区,以加速文件系统的读/写;

  • 承上,因此 Linux 的物理内存最后都会被用光!这是正常的情况!可加速系统效能;

  • 你可以手动使用 sync 来强迫内存中设定为 Dirty 的档案回写到磁盘中;

  • 若正常关机时,关机指令会主动呼叫 sync 来将内存的数据回写入磁盘内;

  • 但若不正常关机(如跳电、当机或其他不明原因),由于 数据尚未回写到磁盘内, 因此重新启动后可能会花很多时间在进行磁盘检验,甚至可能寻致文件系统的损毁(非磁盘损毁)。

10. 挂载点的意义 (mount point):

每个 filesystem 都有独立的 inode / block / superblock 等信息,这个文件系统要能够链接到目录树才能被我们使用。 将文件系统与目录树结合的动作我们称为『挂载』。 关于 挂载的一些特性我们在第三章稍微提过, 重点是:挂载点一定是目录,该目录为进入该文件系统的入口。 因此并不是你有任何文件系统都能使用,必项要『挂载』到目录树的某个目录后,才能够使用该文件系统的。

举例来说,如果你是依据鸟哥的方法安装你的 CentOS 5.x 的话, 那么应该会有三个挂载点才是,分别是 /, /boot, /home 三个 (鸟哥的系统上对应的装置文件名为 /dev/hdc2, /dev/hdc1, /dev/hdc3)。

那如果观察这三个目录的 inode 号码时,我们可以发现如下的情况:

看到了吧!由于 filesystem 最顶层的目录之 inode 一般为 2 号,因此可以发现 /, /boot, /home 为三个不同的 filesystem (因为每一行的文件属性并不相同,且三个目录的挂载点也均不相同之故。)

我们在第七章一开始的路径中曾经提到根目录下的 . 与 .. 是相同的东西, 因为权限是一模一样嘛!如果使用文件系统的观点来看,同一个 filesystem 的某个 inode 只会对应到一个档案内容而已(因为一个档案占用一个 inode 之故), 因此我们可以透过判断 inode 号码来确认不同文件名是否为相同的档案喔!

所以可以这样看:

上面的信息中由于挂载点均为 / ,因此三个档案 (/, /., /..) 均在同一个 filesystem 内,而这三个档案的 inode 号码均为 2 号,因此这三个档名都指向同一个 inode 号码,当然这三个档案的内容也就完全一模一样了! 也就是说,根目录的上层 (/..) 就是他自己!

11. 其他 Linux 支持的文件系统与 VFS

虽然 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

第9章 档案与文件系统的压缩与打包

第11章 认识与学习Bash

1. bash 的环境配置文件

你是否会觉得奇怪,怎么我们什么动作都没有进行,但是一进入 bash 就取得一堆有用的变量了? 这是因为系统有一些环境配置文件案的存在,让 bash 在启动时直接读取这些配置文件,以规划好 bash 的操作环境啦! 而这些配置文件又可以分为全体系统的配置文件以及用户个人偏好配置文件。要注意的是, 我们前几个小节谈到的命令删名啦、自定义的变数啦,在你注销 bash 后就会失效,所以你想要保留你的设定, 就得要将这些设定写入配置文件才行。

  • login 与 non-login shell

 login shell:取得 bash 时需要完整的登入流程的,就称为 login shell。举例来说,你要由 tty1~ tty6 登入,需要输入用户的账号与密码,此时取得的 bash 就称为『 login shell 』啰;

 non-login shell:取得 bash 接口的方法不需要重复登入的举动,举例来说,(1)你以 X window登入 Linux 后, 再以 X 的图形化接口启动终端机,此时那个终端接口并没有需要再次的输入账号不密码,那个 bash 的环境就称为 non-login shell了。(2)你在原本的 bash 环境下再次下达bash 这个指令,同样的也没有输入账号密码, 那第二个 bash (子程序) 也是 non-login shell 。

为什么要介绍 login, non-login shell 呢?这是因为这两个取得 bash 的情况中,读取的配置文件数据并不一样所致。 由于我们需要登入系统,所以先谈谈 login shell 会读取哪些配置文件?一般来说,login shell 其实只会读取这两个配置文件:

  • /etc/profile:这是系统整体的设定,你最好不要修改这个档案;

  • ~/.bash_profile 或 ~/.bash_login 或 ~/.profile:属于使用者个人设定,你要改自己的数据,就写入这里!

 /etc/profile (login shell 才会读)

这个配置文件可以利用使用者的标识符 (UID) 来决定很多重要的变量数据, 这也是每个使用者登入取得 bash 时一定会读取的配置文件!这个档案设定的变量主要有:

  • PATH:会依据UID 决定 PATH 变量要不要含有 sbin 的系统指令目录;

  • MAIL:依据账号设定好使用者的mailbox到 /var/spool/mail/账号名;

  • USER:根据用户的账号设定此一变量内容;

  • HOSTNAME:依据主机的 hostname 指令决定此一变量内容;

  • HISTSIZE:历史命令记录笔数。CentOS 5.x 设定为 1000 ;

/etc/profile 可不止会做这些事而已,他还会去呼叫外部的设定数据喔!在 CentOS 5.x 默认的情况下,底下这些数据会依序的被呼叫进来:

(1) /etc/inputrc

其实这个档案并没有被执行啦!/etc/profile 会主动的判断使用者有没有自定义输入的按键功能,如果没有的话, /etc/profile 就会决定设定『INPUTRC=/etc/inputrc』这个变量!此一档案内容为 bash 的热键、[tab]要不要有声音等等的数据!

(2)/etc/profile.d/*.sh

其实这是个目录内的众多档案!只要在 /etc/profile.d/ 这个目录内且扩展名为 .sh ,另外,使用者能够具有 r 的权限, 那么该档案就会被 /etc/profile 呼叫进来。在 CentOS 5.x 中,这个目录底下的档案规范了 bash 操作接口的颜色、 语系、ll 与 ls 指令的命令删名、vi 的命令删名、which 的命令删名等等。如果你需要帮所有使用者设定一些共享的命令删名时, 可以在这个目录底下自行建立扩展名为 .sh 的档案,并将所需要的数据写入即可喔!

(3)/etc/sysconfig/i18n

这个档案是由 /etc/profile.d/lang.sh 呼叫进来的!这也是我们决定 bash 预设使用何种语系的重要配置文件! 档案里最重要的就是 LANG 这个变量的设定!

 ~/.bash_profile (login shell 才会读)

bash 在读完了整体环境设定的 /etc/profile 并藉此呼叫其他配置文件后,接下来则是会读取使用者的个人配置文件。 在 login shell 的 bash 环境中,所读取的个人偏好配置文件其实主要有三个,依序分删是:

1. ~/.bash_profile

2. ~/.bash_login

3. ~/.profile

其实 bash 的 login shell 设定只会读取上面三个档案的其中一个, 而读取的顺序则是依照上面的顺序。也就是说,如果 ~/.bash_profile 存在,那么其他两个档案不论有无存在,都不会被读取。 如果 ~/.bash_profile 不存在才会去读取 ~/.bash_login,而前两者都不存在才会读取 ~/.profile 的意思。

会有这么多的档案,其实是因应其他 shell 转换过来的使用者的习惯而已。 先让我们来看一下 root 的/root/.bash_profile 的内容是怎样呢?

这个档案内有设定 PATH 这个变量喔!而且还使用了 export 将 PATH 变成环境变量呢! 由于 PATH 在 /etc/profile 当中已经设定过,所以在这里就以累加的方式增加用户家目录下的 ~/bin/ 为额外的执行文件放置目录。这也就是说,你可以将自己建立的执行档放置到你自己家目录下的 ~/bin/ 目录! 那就可以直接执行该执行档而与需要使用绝对/相对路径来执行该档案。

这个档案的内容比较有趣的地方在于 if ... then ... 那一段!该段的内容指的是『判断家目录下的 ~/.bashrc 存在否,若存在则读入 ~/.bashrc 的设定』。 bash 配置文件的读入方式比较有趣,主要是透过一个指令『 source 』来读取的! 也就是说 ~/.bash_profile 其实会再呼叫 ~/.bashrc 的设定内容喔!最后,我们来看看整个 login shell 的读取流程:

实线的的方向是主线流程,虚线的方向则是被呼叫的配置文件!从上面我们也可以清楚的知道,在 CentOS 的 login shell 环境下,最终被读取的配置文件是『 ~/.bashrc 』这个档案!所以,你当然可以将自己的偏好设定写入该档案即可。

~/.bashrc (non-login shell 会读)

谈完了 login shell 后,那么 non-login shell 这种非登入情况取得 bash 操作接口的环境配置文件又是什么? 当你取得 non-login shell 时,该 bash 配置文件仅会读取 ~/.bashrc 而已啦!那么预设的 ~/.bashrc 内容是如何?

特别注意一下,由于 root 的身份与一般使用者不同,鸟哥是以 root 的身份取得上述的数据, 如果是一般使用者的 ~/.bashrc 会有些许不同。看一下,你会发现在 root 的 ~/.bashrc 中其实已经规范了较为保险的命令别名了。 此外,咱们的 CentOS 5.x 还会主动的呼叫 /etc/bashrc 这个档案喔!为什么需要呼叫 /etc/bashrc 呢? 因为 /etc/bashrc 帮我们的 bash 定义出底下的数据:

 依据与同的 UID 规范出 umask 的值;

 依据与同的 UID 规范出提示字符 (就是 PS1 变量);

 呼叫 /etc/profile.d/*.sh 的设定

你要注意的是,这个 /etc/bashrc 是 CentOS 特有的 (其实是 Red Hat 系统特有的),其他与同的 distributions 可能会放置在不同的档名就是了。由于这个 ~/.bashrc 会呼叫 /etc/bashrc 及/etc/profile.d/*.sh , 所以,万一你没有 ~/.bashrc (可能自己与小心将他删除了),那么你会发现你的bash 提示字符可能会变成这个样子:

-bash-3.2$

这是正常的,因为你并没有呼叫 /etc/bashrc 来规范 PS1 变量啦!而且这样的情况也与会影响你的 bash 使用。 如果你想要将命令提示字符捉回来,那么可以复制 /etc/skel/.bashrc 到你的家目录,再修订一下你所想要的内容, 并使用 source 去呼叫 ~/.bashrc ,那你的命令提示字符就会回来啦!

 

2.  其他相关配置文件

事实上还有一些配置文件可能会影响到你的 bash 操作的,底下就来谈一谈:

 /etc/man.config

这个档案乍看之下好像跟 bash 没相关性,但是对于系统管理员来说, 却也是很重要的一个档案!这的档案的内容『规范了使用 man 的时候, man page 的路径到哪里去寻找!』所以说的简单一点,这个档案规定了下达 man 的时候,该去哪里查看数据的路径设定!

事实上,这个档案内最重要的其实是 MANPATH 这个变量设定啦! 我们搜寻 man page 时,会依据 MANPATH 的路径去分别搜寻!另外,要注意的是, 这个档案在各大与同版本 Linux distributions 中,档名都不太相同,例如 CentOS 用的是 /etc/man.config ,而 SuSE 用的则是 /etc/manpath.config , 可以利用 [tab] 按键来进行文件名的补齐啦!

 ~/.bash_history

还记得我们在历史命令提到过这个档案吧?预设的情况下, 我们的历史命令就记录在这里啊!而这个档案能够记录几笔数据,则与 HISTFILESIZE 这个变数有关啊。每次登入 bash 后,bash 会先读取这个档案,将所有的历史指令读入内存, 因此,当我们登入 bash 后就可以查知上次使用过哪些指令啰。

 ~/.bash_logout

这个档案则记录了『当我注销 bash 后,系统再帮我做完什么动作后才离开』的意思。 你可以去读取一下这个档案的内容,预设的情况下,注销时, bash 只是帮我们清掉屏幕的讯息而已。 不过,你也可以将一些备份或者是其他你认为重要的工作写在这个档案中 (例如清空暂存盘), 那么当你离开 Linux 的时候,就可以解决一些烦人的事情!

3. 终端机的环境设定: stty, set

我们在第五章首次登入 Linux 时就提过,可以在 tty1 ~ tty6 这六个文字接口的终端机 (terminal) 环境中登入,登入的时候我们可以取得一些字符设定的功能喔! 举例来说,我们可以利用退格键(backspace,就是那个←符号的按键) 来删除命令行上的字符, 也可以使用 [ctrl]+c 来强制终止一个指令的运行,当输入错误时,就会有声音跑出来警告。这是怎么办到的呢? 很简单啊!因为登入终端机的时候,会自动的取得一些终端机的输入环境的设定啊!

事实上,目前我们使用的 Linux distributions 都帮我们作了最棒的使用者环境了, 所以大家可以不用担心操作环境的问题。不过,在某些 Unix like 的机器中,还是可能需要动用一些手脚, 才能够让我们的输入比较快乐~举例来说,利用 [backspace] 删除,要比利用 [Del] 按键来的顺手吧! 但是某些 Unix 偏偏是以 [del] 来进行字符的删除啊!

那么如何查阅目前的一些按键内容呢?可以利用 stty (setting tty 终端机的意思) 呢! stty 也可以帮助设定终端机的输入按键代表意义喔!

4. 通配符与特殊符号

在 bash 的操作环境中还有一个非常有用的功能,那就是通配符 (wildcard) ! 我们利用 bash 处理数据就更方便了!底下我们列出一些常用的通配符:

5.  /dev/null 垃圾桶黑洞装置与特殊写法

想象一下,如果我知道错误讯息会发生,所以要将错误讯息忽略掉而与显示或储存呢? 这个时候黑洞装置 /dev/null 就很重要了!这个 /dev/null 可以吃掉任何导向这个装置的信息喔!将上述的范例修订一下:

再想象一下,如果我要将正确与错误数据通通写入同一个档案去呢?这个时候就得要使用特殊的写法了! 我们同样用底下的案例来说明:

上述表格第一行错误的原因是,由于两股数据同时写入一个档案,又没有使用特殊的语法, 此时两股数据可能会交叉写入该档案内,造成次序的错乱。所以虽然最终 list 档案还是会产生,但是里面的数据排列就会怪怪的,而不是原本屏幕上的输出排序。 至于写入同一个档案的特殊语法如上表所示,你可以使用 2>&1 也可以使用 &> ! 一般来说,鸟哥比较习惯使用 2>&1 的语法啦!

6. 命令执行的判断依据: ; , &&, ||

在某些情况下,很多指令我想要一次输入去执行,而与想要分次执行时,该如何是好?基本上你有两个选择, 一个是透过第十三章要介绍的 shell script 撰写脚本去执行,一种则是透过底下的介绍来一次输入多重指令喔!

 $? (指令回传值) 与 && 或 ||

如同上面谈到的,两个指令之间有相依性,而这个相依性主要判断的地方就在于前一个指令执行的结果是否正确。

注意喔,两个 & 之间是没有空格的!那个 | 则是 [Shift]+[\] 的按键结果。

7. 撷取命令: cut, grep

cut 主要的用途在于将『同一行里面的数据进行分解!』最常使用在分析一些数据或文字数据的时候!这是因为有时候我们会以某些字符当作分割的参数,然后来将数据加以切割,以取得我们所需要的数据。 鸟哥也很常使用这个功能呢!尤其是在分析 log 档案的时候!与过,cut 在处理多空格相连的数据时,可能会比较吃力一点。

8. 排序命令: sort, wc, uniq

\

 

9. 字符转换命令: tr, col, join, paste, expand

10. 关于减号 - 的用途

管线命令在 bash 的连续的处理程序中是相当重要的!另外,在 log file 的分析当中也是相当重要的一环, 所以请特别留意!另外,在管线命令当中,常常会使用到前一个指令的 stdout 作为这次的stdin , 某些指令需要用到文件名 (例如 tar) 来进行处理时,该 stdin 与 stdout 可以利用减号 "-" 来替代, 举例来说:

第十二章、正规表示法与文件格式化处理

  1. Sed指令

第13章 学习Bash Shell

第14章 Linux账号管理与ACL权限设定

/etc/shadow文件

  1. Su使用

su总结一下用法是这样的:

 若要完整的切换到新使用者的环境,必须要使用『 su - username 』或『 su -l username 』, 才会连同 PATH/USER/MAIL 等变量都转成新用户的环境;

 如果仅想要执行一次 root 的指令,可以利用『 su - -c "指令串" 』的方式来处理;

 使用 root 切换成为任何使用者时,并与需要输入新用户的密码;

虽然使用 su 很方便啦,与过缺点是,当我的主机是多人共管的环境时,如果大家都要使用 su 来切换成为 root 的身份,那么与就每个人都得要知道 root 的密码,这样密码太多人知道可能会流出去, 很不妥当呢!怎办?透过 sudo 来处理即可!

  1. sudo

相对于 su 需要了解新切换的用户密码 (常常是需要 root 的密码), sudo 的执行则仅需要自己的密码即可! 甚至可以设定不需要密码即可执行 sudo 呢!由于 sudo 可以让你以其他用户的身份执行指令 (通常是使用 root 的身份来执行指令),因此并非所有人都能够执行 sudo , 而是仅有规范到/etc/sudoers 内的用户才能够执行 sudo 这个指令

第十五章、磁盘配额(Quota)与进阶文件系统管理

第17章 程序管理

  • ps命令

  1.  ps :将某个时间点的程序运作情况获取下来

  2.  仅观察自己的 bash 相关程序: ps –l

    系统整体的程序运作是非常多的,但如果使用 ps -l 则仅列出与你的操作环境 (bash) 有关的程序而已,

    亦即最上层的父程序会是你自己的 bash 而没有延伸到 init 这支程序去!我们就来观察看看:

  • F:代表这个程序旗标 (process flags),说明这个程序的总结权限,常见号码有:

    o 若为 4 表示此程序的权限为 root ;

    o 若为 1 则表示此子程序仅进行复制(fork)而没有实际执行(exec)。

  • S:代表这个程序的状态 (STAT),主要的状态有:

    o R (Running):该程序正在运作中;

    o S (Sleep):开程序目前正在睡眠状态(idle),但可以被唤醒(signal)。

    o D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况(ex>打印)

    o T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态;

    o Z (Zombie):僵尸状态,程序已经终止但即无法被移除至内存外。

  • UID/PID/PPID:代表『此程序被该 UID 所拥有/程序的 PID 号码/此程序的父程序 PID 号码』

  • C:代表 CPU 使用率,单位为百分比;

  • PRI/NI:Priority/Nice 的缩写,代表此程序被 CPU 所执行的优先级,数值越小代表该程序越快被 CPU 执行。

  • ADDR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,指出该程序在内存的哪个部分,如果是个 running 的程序,一般就会显示『 - 』 / SZ 代表此程序用掉多少内存 / WCHAN表示目前程序是否运作中,同样的, 若为 - 表示正在运作中。

  •  TTY:登入者的终端机位置,若为进程登录则使用动态终端接口 (pts/n);

  •  TIME:使用掉的 CPU 时间,注意,是此程序实际花费 CPU 运作的时间,而不是系统时间;

  •  CMD:就是 command 的缩写,造成此程序的触发程序之指令为何。

所以你看到的 ps -l 输出讯息中,他说明的是:『bash 的程序属于 UID 为 0 的使用者,状态为睡眠(sleep), 之所以为睡眠因为他触发了 ps (状态为 run) 之故。此程序的 PID 为 13639,优先执行顺序为 75 , 下达 bash 所取得的终端接口为 pts/1 ,运作状态为等待 (wait) 。』这样已经够清楚了吧?

  1.  观察系统所有程序: ps aux

    你会变现 ps -l 与 ps aux 显示的项目并不相同!在 ps aux 显示的项目中,各字段的意义为:

  • USER:该 process 属于那个使用者账号的?

  • PID :该 process 的程序标识符。

  • %CPU:该 process 使用掉的 CPU 资源百分比;

  • %MEM:该 process 所占用的物理内存百分比;

  • VSZ :该 process 使用掉的虚拟内存量 (Kbytes)

  • RSS :该 process 占用的固定的内存量 (Kbytes)

  • TTY :该 process 是在那个终端机上面运作,若与终端机无关则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。

  • STAT:该程序目前的状态,状态显示与 ps -l 的 S 旗标相同 (R/S/T/Z)

  • START:该 process 被触发启动的时间;

  • TIME :该 process 实际使用 CPU 运作的时间。

  • COMMAND:该程序的实际指令为何?

一般来说,ps aux 会依照 PID 的顺序来排序显示,我们还是以 13639 那个 PID 那行来说明!该行的意

义为『 root 执行的 bash PID 为 13639,占用了 0.2% 的内存容量百分比,状态为休眠 (S),该程序启

动的时间为 11:44 , 且取得的终端机环境为 pts/1 。』与 ps aux 看到的其实是同一个程序啦!

  1. top:动态观察程序的变化

    相对于 ps 是获取一个时间点的程序状态, top 则可以持续侦测程序运作的状态!使用方式如下:

    top 也是个挺不错的程序观察工具!但不同于 ps 是静态的结果输出, top 这个程序可以持续的监测整个系统的程序工作状态。 在默认的情况下,每次更新程序资源的时间为 5 秒,不过,可以使用 -d 来进行修改。 top 主要分为两个画面,上面的画面为整个系统的资源使用状态,基本上总共有六行,显示的内容依序是:

  • 第一行(top...):这一行显示的信息分别为:

    o 目前的时间,亦即是 17:03:09 那个项目;

    o 开机到目前为止所经过的时间,亦即是 up 7days, 16:16 那个项目;

    o 已经登入系统的用户人数,亦即是 1 user项目;

    o 系统在 1, 5, 15 分钟的平均工作负载。我们在第十六章课到的 batch 工作方式为负载小于 0.8 就是这个负载啰!代表的是 1, 5, 15 分钟,系统平均要负责运作几个程序(工作)的意思。 越小代表系统越闲置,若高于 1 得要注意你的系统程序是否太过繁复了!

  • 第二行(Tasks...):显示的是目前程序的总量与个别程序在什么状态(running, sleeping, stopped, zombie)。 比较需要注意的是最后的 zombie 那个数值,如果不是 0 !好好看看到底是那个process 变成僵尸了吧?

  • 第三行(Cpus...):显示的是 CPU 的整体负载,每个项目可使用 ? 需要特别注意的是 %wa ,那个项目代表的是 I/O wait, 通常你的系统会变慢都是 I/O 产生的问题比较大!因此这里得要注意这个项目耗用 CPU 的资源喔! 另外,如果是多核心的设备,可以按下数字键『1』来切换成与同 CPU 的负载率。

  • 第四行与第五行:表示目前的物理内存与虚拟内存 (Mem/Swap) 的使用情况。 再次重申,要注意的是 swap 的使用量要尽量的少!如果 swap 被用的很大量,表示系统的物理内存实在与足!

  • 第六行:这个是当在 top 程序当中输入指令时,显示状态的地方。

至于 top 下半部分的画面,则是每个 process 使用的资源情况。比较需要注意的是:

 PID :每个 process 的 ID 啦!

 USER:该 process 所属的使用者;

 PR :Priority 的简写,程序的优先执行顺序,越小越早被执行;

 NI :Nice 的简写,与 Priority 有关,也是越小越早被执行;

 %CPU:CPU 的使用率;

 %MEM:内存的使用率;

 TIME+:CPU 使用时间的累加;

top 预设使用 CPU 使用率 (%CPU) 作为排序的重点,如果你想要使用内存使用率排序,则可以按下『M』, 若要回复则按下『P』即可。如果想要离开 top 则按下『 q 』吧!如果你想要将 top 的结果输出成为档案时, 可以这样做:

  • 系统资源的观察

    除了系统的程序之外,我们还必须就系统的一些资源进行检查啊!举例来说,我们使用 top 可以看到很多系统的资源

 (1) free :观察内存使用情况

仔细看看,我的系统当中有 725MB 左右的物理内存,我的 swap 有 1GB 左右, 那我使用 free -m 以 MBytes 来显示时,就会出现上面的信息。Mem 那一行显示的是物理内存的量, Swap 则是虚拟内存的量。 total 是总量, used 是已被使用的量, free 则是剩余可用的量。 后面的shared/buffers/cached 则是在已被使用的量当中,用来作为缓冲及快取的量。

仔细的看到范例一的输出喔,我们的 Linux 测试用主机是很平凡的,根本没有什么工作, 但是,我的物内存是几乎被用光光的情况呢!不过,至少有 132MB 用在缓冲记忆 (buffers) 工作, 287MB 则用在快取 (cached) 工作,也就是说,系统是『很有效率的将所有的内存用光光』, 目的是为了让系统的存取效能加速啦!

很多服友都会问到这个问题『我的系统明明很轻松,为何内存会被用光光?』现在瞭了吧? 被用光是正常的!而需要注意的反而是 swap 的量。一般来说, swap 最好不要被使用,尤其 swap 最好不要被使用超过 20% 以上, 如果您变现 swap 的用量超过 20% ,那举,最好还是买物理内存来插吧! 因为, Swap 的效能跟物理内存实在差很多,而系统会使用到 swap , 绝对是因为物理内存与足了才会这样做的!

Tips:

Linux 系统为了要加速系统效能,所以会将最常使用到的或者是最近使用到的档案数据快取 (cache) 下来, 这样未来系统要使用该档案时,就直接由内存中搜寻取出,而不需要重新读取硬盘,速度上面当然就加快了! 因此,物理内存被用光是正常的!

 uname:查阅系统与核心相关信息

  1. uptime:观察系统启动时间与工作负载

这个指令很单纯呢!就是显示出目前系统已经开机多久的时间,以及 1, 5, 15 分钟的平均负载就是了。还记得 top 吧?没错啦!这个 uptime 可以显示出 top 画面的最上面一行!

  1.  netstat :追踪网络或插槽文件

    这个 netstat 也是挺好玩的,其实这个指令比较常被用在网络的监控方面,与过,在程序管理方面也是需要了解的啦! 这个指令的执行如下所示:基本上, netstat 的输出分为两大部分,分别是网络与系统自己的程序相关忢部分:

  1.  dmesg :分析核心产生的讯息

系统在开机的时候,核心会去侦测系统的硬件,你的某些硬件到底有没有被捉到,那就与这个时候的侦测有关。 但是这些侦测的过程要与是没有显示在屏幕上,就是很飞快的在屏幕上一闪而逝!能不能把核心侦测的讯息捉出来瞧瞧? 可以的,那就使用 dmesg 吧!

所有核心侦测的讯息,不管是开机时候还是系统运作过程中,反正只要是核心产生的讯息,都会被记录到内存中的某个保护区段。 dmesg 这个指令就能够将该区段的讯息读出来的!因为讯息实在太多了,所以执行时可以加入这个管线指令『 | more 』来使画面暂停!

由范例二就知道我这部主机的硬盘的格式是什么了吧!没错啦!还可以查阅能与能找到网络卡喔!网络卡的代号是 eth ,所以,直接输入 dmesg | grep -i eth

 (6) vmstat :侦测系统资源变化

如果你想要动态的了解一下系统资源的运作,那举这个 vmstat 确实可以玩一玩!vmstat 可以侦测『 CPU / 内存 / 磁盘输入输出状态 』等等,如果你想要了解一部繁忙的系统到底是哪个环节最累人, 可以使用 vmstat 分析看看。底下是常见的选项与参数说明:

  • /proc/* 代表的意义

其实,我们之前提到的所谓的程序都是在内存当中嘛!而内存当中的数据又都是写入到 /proc/* 这个目录下的,所以啰,我们当然可以直接观察 /proc 这个目录当中的档案啊!

  • 查询已开启档案或已执行程序开启之档案

 (1) fuser:藉由档案(或文件系统)找出正在使用该档案的程序

有的时候我想要知道我的程序到底在这次启动过程中开启了多少档案,可以利用 fuser 来观察啦! 举例来说,你如果卸除时变现系统通知:『 device is busy 』,那表示这个文件系统正在忙碌中, 表示有某支程序有利用到该文件系统啦!那举你就可以利用 fuser 来追踪啰!fuser 语法有点像这样:

(2)  lsof :列出被程序所开启的档案文件名

相对于 fuser 是由档案或者装置去找出使用该档案或装置的程序,反过来说, 如何查出某个程序开启或者使用的档案与装置呢?呼呼!那就是使用 lsof 啰~

(3) pidof :找出某支正在执行的程序的 PID

第十八章、认识系统服务 (daemons)

1. 什么是 daemon 与服务 (service)

我们在第十七章就曾经谈过『服务』这东西! 当时的说明是『常驻在记体体中的程序,且可以提供一些系统或网络功能,那就是服务』。而服务一般的英文说法是『 service 』。

但如果你常常上网去查看一些数据的话,尤其是 Unix-Like 的相关操作系统,应该常常看到『请启动某某 daemon 来提供某某功能』!那么 daemon 与 service 有关啰?否则为什么都能够提供某些系统或网络功能?此外,这个 daemon 是什么东西呀? daemon 的字面上的意思就是『守护神、恶魔?』简单的说,系统为了某些功能必须要提供一些服务 (与论是系统本身还是网络方面),这个服务就称为 service 。 但是service 的提供总是需要程序的运作吧!否则如何执行呢?所以达成这个 service 的程序我们就称呼他为 daemon ! 举例来说,达成循环型例行性工作排程服务 (service) 的程序为 crond 这个 daemon 。

一般来说,当我们以文本模式或图形模式 (非单人维护模式) 完整开机进入 Linux 主机后, 系统已经提供我们很多的服务了!包括打印服务、工作排程服务、邮件管理服务等等; 那举这些服务是如何被启动的?他们的工作型态如何?

2. daemon 的主要分类

如果依据 daemon 的启动与管理方式来区分,基本上,可以将 daemon 分为可独立启动的 stand alone , 与透过一支super daemon 来统一管理的服务这两大类,这两类 daemon 的说明如下:

  • stand_alone:此 daemon 可以自行单独启动服务

    就字面上的意思来说,stand alone 就是『独立的启动』的意思。这种类型的 daemon 可以自行启动而与必透过其他机制的管理; daemon 启动并加载到内存后就一直占用内存与系统资源。最大的优点就是:因为是一直存在内存内持续的提供服务, 因此对于变生客户端的要求时,stand alone 的 daemon 响应速度较快。常见的 stand alone daemon 有WWW 的 daemon (httpd)、FTP 的 daemon (vsftpd) 等等。

  • super daemon: 一支特殊的 daemon 来统一管理

    这一种服务的启动方式则是藉由一个统一的 daemon 来负责唤起服务!这个特殊的 daemon 就被称为 super daemon 。 早期的 super daemon 是 inetd 这一个,后来则被 xinetd 所取代了。这种机制比较有趣的地方在于, 当没有客户端的要求时,各项服务都是未启动的情况,等到有来自客户端的要求时, super daemon 才唤醒相对应的服务。当客户端的要求结束后,被唤醒的这个服务也会关闭并释放系统资源。

这种机制的好处是: (1)由于 super daemon 负责唤醒各项服务,因此 super daemon 可以具有安全控管的机制,就是类似网络防火墙的功能啦! (2) 由于服务在客户端的联机结束后就关闭,因此与会一直占用系统资源。但是缺点是什么呢? 因为有客户端的联机才会唤醒该服务,而该服务加载到内存的时间需要考虑进去,因此服务的反应时间会比较慢一些啦! 常见的 super daemon 所管理的服务例如 telnet 这个玩意儿就是啦!

如上所示,Super daemon 是常驻在内存中的, Program 1, 2, 3 则是启动某些服务的程序 (未被启动状态)。当有客户端的要求时, Super daemon 才会去触发相关的程序加载成为 daemon 而存在于内存中,此时,客户端的要求才会被 Super daemon 导向 Daemon 1 去达成联机!当客户端的要求结束时,Daemon 1 将会被移除,图中实线的联机就会中断!

daemon 的启动脚本与启动方式

提供某个服务的 daemon 虽然只是一支程序而已,但是这支 daemon 的启动还是需要执行档、配置文件、执行环境等等, 举例来说,你可以查阅一下 httpd 这个程序 (man httpd) ,里面可谈到与少的选项与参数呢!此外,为了管理上面的方便, 所以通常 distribution 都会记录每一支 daemon 启动后所取得程序的 PID 在 /var/run/ 这个目录下呢! 还有,在启动这些服务之前,你可能也要自行处理一下 daemon 能够顺利执行的环境是否正确等等。这里要讲的是, 要启动一支 daemon 考虑的事情很多,并非单纯执行一支程序就够了。

为了解决上面谈到的问题,因此通常 distribution 会给我们一个简单的 shell script 来进行启动的功能。 该 script 可以进行环境的侦测、配置文件的分析、PID 档案的放置,以及相关重要交换文件案的锁住 (lock) 动作, 你只要执行该script ,上述的动作就一口气连续的进行,最终就能够顺利且简单的启动这个 daemon 啰!

基本上是放在这些地方:

  1. /etc/init.d/* :启动脚本放置处

系统上几乎所有的服务启动脚本都放置在这里!事实上这是公认的目录,我们的 CentOS 实际上放置在 /etc/rc.d/init.d/ 啦! 与过还是有设定连结档到 /etc/init.d/ 的!既然这是公认的目录,因此建议您记忆这个目录即可!

  1. /etc/sysconfig/* :各服务的初始化环境配置文件

几乎所有的服务都会将初始化的一些选项设定写入到这个目录下,举例来说,登录档的 syslog 这支 daemon 的初始化设定就写入在 /etc/sysconfig/syslog 这里呢!而网络的设定则写在 /etc/sysconfig/network 这个档案中。所以,这个目录内的档案也是挺重要的;

  1. /etc/xinetd.conf, /etc/xinetd.d/* :super daemon 配置文件

super daemon 的主要配置文件 (其实是默认值) 为 /etc/xinetd.conf ,不过我们上面就谈到了, super daemon 只是一个统一管理的机制,他所管理的其他 daemon 的设定则写在 /etc/xinetd.d/* 里头喔!

  1. /etc/* :各服务各自的配置文件

第六章就讲过了,大家的配置文件都是放置在 /etc/ 底下的喔!

  1. /var/lib/* :各服务产生的数据库

一些会产生数据的服务都会将他的数据写入到 /var/lib/ 目录中。举例来说,数据库管理系统 MySQL 的数据库默认就是写入 /var/lib/mysql/ 这个目录下啦!

  1. /var/run/* :各服务的程序之 PID 记录处

我们在第十七章谈到可以使用讯号 (signal) 来管理程序, 既然 daemon 是程序,所以当然也可以利用 kill 或 killall 来管理啦!与过为了担心管理时影响到其他的程序, 因此 daemon 通常会将自己的 PID 记录一份到 /var/run/ 当中!例如登录文件的 PID 就记录在 /var/run/syslogd.pid 这个档案中。如此一来, /etc/init.d/syslog 就能够简单的管理自己的程序啰。

 

第十九章、认识与分析登录档

1. 什么是登录档

『详细而确实的分析以及备份系统的登录文件』是一个系统管理员应该要进行的任务之一。 那么什么是登录档呢?简单的说,就是记录系统活动信息的几个档案, 例如:何时、何地 (来源 IP)、何人 (什么服务名称)、做了什么动作(讯息登录啰)。 换句话说就是:记录系统在什么时候由哪个程序做了什么样的行为时,变生了何种的事件等等。

要知道的是,我们的 Linux 主机在背景之下有相当多的 daemons 同时在工作着,这些工作中的程序总是会显示一些讯息, 这些显示的讯息最终会被记载到登录文件当中啦。也就是说,记录这些系统的重要讯息就是登录文件的工作啦!

2. 登录档的重要性

为什么说登录文件很重要,重要到系统管理员需要随时注意他呢?我们可以这举说:

  1. 解决系统方面的错误:

用 Linux 这么久了,你应该偶而会变现系统可能会出现一些错误,包括硬件捉与到或者是某些系统程序无法利运作的情况。 此时你该如何是好?由于系统会将硬件侦测过程记录在登录文件内,你只要透过查询登录文件就能够了解系统作了啥事!

  1. 解决网络服务的问题:

  2. 过往事件记录簿:

例如:你变现 WWW 服务 (apache 软件) 在某个时刻流量特别大,你想要了解为什么时, 可以透过登录档去找出该时段是哪些 IP 在联机与查询的网页数据为何,就能够知道原因。 此外,万一哪天你的系统被入侵,并且被利用来攻击他人的主机,由于被攻击主机会记录攻击者,因此你的 IP 就会被对方记录。这个时候你要如何告知对方你的主机是由于被入侵所导致的问题, 并且协助对方继续往恶意来源追查呢?

 

第二十章、开机流程、模块管理与 Loader

1. Linux 的开机流程分析

另外 Linux 在执行的时候,虽然你在画面上只会看到黑压压的一片,完全没有任何画面, 但其实他是有很多的程序在背景底下执行的,例如登录文件管控程序、前面提到的例行性工作排程等, 当然还有一大堆网络服务,如邮件服务器、WWW 服务器等等。你如果随便关机的话, 是很容易伤害硬盘及数据传输的动作的!所以在 Linux 下关机可是一门大学问喔。

2. 开机流程一解

既然开机是很严肃的一件事,那我们就来了解一下整个开机的过程吧! 好让大家比较容易变现开机过程里面可能会发生问题的地方,以及出现问题后的解决之道! 不过,由于开机的过程中,那个开机管理程序 (Boot Loader) 使用的软件可能不一样,例如目前各大 Linux distributions 的主流为 grub,但早期Linux 预设是使用 LILO ,台湾地区则很多服友喜欢使用 spfdisk 。 但无论如何,我们总是得要了解整个 boot loader 的工作情况,才能了解为何进行多重引导的设定时, 老是听人家讲要先安装 Windows 再安装 Linux 的原因~

 

假设以个人计算机架设的 Linux 主机为例, 当你按下电源按键后计算机硬件会主动的读取 BIOS 来加载硬件信息及进行硬件系统的自我测试, 之后系统会主动的去读取第一个可开机的装置 (由 BIOS 设定的) ,此时就可以读入开机管理程序了。 开机管理程序可以指定使用哪个核心档案来开机,并实际加载核心到内存当中解压缩与执行, 此时核心就能够开始在内存内活动,并侦测所有硬件信息与加载适当的驱动程序来使整部主机开始运作, 等到核心侦测硬件与加载驱动程序完毕后,一个最阳春的操作系统就开始在你的 PC 上面跑了。

主机系统开始运作后,此时 Linux 才会呼叫外部程序开始准备软件执行的环境, 并且实际的加载所有系统运作所需要的软件程序哩!最后系统就会开始等待你的登入与操作啦! 简单来说,系统开机的经过可以汇整成底下的流程的:

 

3. BIOS, boot loader 与 kernel 载入

我们在第三章曾经谈过简单的开机流程与 MBR 的功能, 当时为了多重引导而进行的简短的介绍。现在你已经有足够的 Linux 基础了,所以底下让我们来加强说明啦!

(1)  BIOS, 开机自我测试与 MBR

我们在第零章的计算器概论就曾谈过计算机主机架构, 在个人计算机架构下,你想要启动整部系统首先就得要让系统去加载 BIOS (Basic Input Output System),并透过 BIOS 程序去加载 CMOS 的信息,并且藉由 CMOS 内的设定值取得主机的各项硬件配置, 例如 CPU 与接口设备的沟通频率啊、开机装置的搜寻顺序啊、硬盘的大小与类型啊、 系统时间啊、各周边总线的是否启动 Plug and Play (PnP, 即插即用装置) 啊、 各接口设备的 I/O 地址啊、以及与 CPU 沟通的 IRQ 岔断等等的信息。

在取得这些信息后,BIOS 还会进行开机自我测试 (Power-on Self Test, POST) 。 然后开始执行硬件侦测的初始化,并设定 PnP 装置,之后再定义出可开机的装置顺序, 接下来就会开始进行开机装置的数据读取了 (MBR 相关的任务开始)。

由于我们的系统软件大多放置到硬盘中嘛!所以 BIOS 会指定开机的装置好让我们可以读取磁盘中的操作系统核心档案。 但由于不同的操作系统他的文件系统格式与相同,因此我们必须要以一个开机管理程序来处理核心档案加载 (load) 的问题, 因此这个开机管理程序就被称为 Boot Loader 了。那这个Boot Loader 程序安装在哪里呢?就在开机装置的第一个扇区 (sector) 内,也就是我们一直谈到的MBR (Master Boot Record, 主要启动记录区)。

那你会与会觉得很奇怪啊?既然核心档案需要 loader 来读取,那每个操作系统的 loader 都不相同,这样的话 BIOS 又是如何读取 MBR 内的 loader 呢?很有趣的问题吧!其实 BIOS 是透过硬件的 INT 13 中断功能来读取 MBR 的,也就是说,只要 BIOS 能够侦测的到你的磁盘 (不论该磁盘是 SATA 还是IDE 接口),那他就有办法透过 INT 13 这条信道来读取该磁盘的第一个扇区内的 MBR 啦!这样boot loader 也就能够被执行啰!

Tips:

我们知道每颗硬盘的第一个扇区内含有 446 bytes 的 MBR 区域,那么如果我的主机上面有两颗硬盘的话, 系统会去哪颗硬盘的 MBR 读取 boot loader 呢?这个就得要看 BIOS 的设定了。 基本上,我们常常讲的『系统的 MBR』其实指的是第一个开机装置的 MBR 才对! 所以,改天如果你要将开机管理程序安装到某颗硬盘的 MBR时, 要特别注意当时系统的『第一个开机装置』是哪个,否则会安装到错误的硬盘上面的 MBR 喔!

(2) Boot Loader 的功能

刚刚说到 Loader 的最主要功能是要认识操作系统的文件格式并据以加载核心到主存储器中去执行。由于与同操作系统的文件格式与一致,因此每种操作系统都有自己的 boot loader !用自己的 loader 才有办法载入核心档案!那问题就来啦,你应该有听说过多重操作系统吧?也就是在一部主机上面安装多种与同的操作系统。 既然你必须要使用自己的 loader 才能够加载属于自己的操作系统核心,而系统的 MBR 只有一个,那你怎么会有办法同时在一部主机上面安装 Windows与Linux 呢?

其实每个文件系统 (filesystem, 或者是 partition) 都会保留一块启动扇区 (boot sector) 提供操作系统安装 boot loader , 而通常操作系统默认都会安装一份 loader 到他根目录所在的文件系统的 boot sector 上。如果我们在一部主机上面安装 Windows 与 Linux 后,该 boot sector, boot loader 与 MBR 的相关性会有点像下图:

如上图所示,每个操作系统默认是会安装一套 boot loader 到他自己的文件系统中 (就是每个filesystem 左下角的方框),而在 Linux 系统安装时,你可以选择将 boot loader 安装到 MBR 去,也可以选择不安装。 如果选择安装到 MBR 的话,那理论上你在 MBR 与 boot sector 都会保有一份boot loader 程序的。 至于 Windows 安装时,他预设会主动的将 MBR 与 boot sector 都装上一份boot loader!所以啦, 你会发现安装多重操作系统时,你的 MBR 常常会被与同的操作系统的 boot loader 所覆盖啦!

虽然各个操作系统都可以安装一份 boot loader 到他们的boot sector 中, 这样操作系统可以透过自己的 boot loader 来加载核心了。问题是系统的 MBR 只有一个哩! 你要怎么执行 boot sector 里面的 loader 啊?这个我们得要回忆一下第三章约略提过的boot loader 的功能了。boot loader 主要的功能如下:

  • 提供选单:用户可以选择与同的开机项目,这也是多重引导的重要功能!

  • 载入核心档案:直接指向可开机的程序区段来开始操作系统;

  • 转交其他 loader:将开机管理功能转交给其他 loader 负责。

由于具有选单功能,因此我们可以选择不同的核心来开机。而由于具有控制权转交的功能,因此我们可以加载其他 boot sector 内的 loader !不过 Windows 的 loader 预设不具有控制权转交的功能,因此你不能使用 Windows 的 loader 来加载 Linux 的 loader !这也是为啥第三章谈到 MBR 与多重引导时,会特别强调先装 Windows 再装 Linux 的缘故。 我们将上述的三个功能以底下的图标来解释你就看的懂了!

如上图所示,我的 MBR 使用 Linux 的 grub 这个开机管理程序,并且里面假设已经有了三个选单, 第一个选单可以直接指向 Linux 的核心档案并且直接加载核心来开机;第二个选单可以将开机管理程控权交给 Windows 来管理,此时 Windows 的 loader 会接管开机流程,这个时候他就能够启动 windows 了。第三个选单则是使用 Linux 在 boot sector 内的开机管理程序,此时就会跳出另一个 grub 的选单啦!而最终 boot loader 的功能就是『加载 kernel 档案』啦!

(3) 加载核心侦测硬件与 initrd 的功能

当我们藉由 boot loader 的管理而开始读取核心档案后,接下来, Linux 就会将核心解压缩到主存储器当中, 并且利用核心的功能,开始测试与驱动各个周边装置,包括储存装置、CPU、网络卡、声卡等等。 此时 Linux 核心会以自己的功能重新侦测一次硬件,而不一定会使用 BIOS 侦测到的硬件信息喔!也就是说,核心此时才开始接管 BIOS 后的工作了。 那么核心档案在哪里啊?一般来说,他会被放置到/boot 里面,并且取名为 /boot/vmlinuz 才对!

从上表我们也可以知道此版本的 Linux 核心为 2.6.18-92.el5 这个版本!为了硬件开变商与其他核心功能开变者的便利, 因此 Linux 核心是可以透过动态加载核心模块的,这些核心模块就放置在 /lib/modules/ 目录内。 由于模块放置到磁盘根目录内 (要记得 /lib 与可以与 / 分别放在不同的 partition !), 因此在开机的过程中核心必须要挂载根目录,这样才能够读取核心模块提供加载驱动程序的功能。 而且为了担心影响到磁盘内的文件系统,因此开机过程中根目录是以只读的方式来挂载的喔。

一般来说,非必要的功能且可以编译成为模块的核心功能,目前的 Linux distributions 都会将他编译成为模块。 因此 USB, SATA, SCSI... 等磁盘装置的驱动程序通常都是以模块的方式来存在的。 现在来思考一种情况,假设你的 linux 是安装在 SATA 磁盘上面的,你可以透过 BIOS 的 INT 13 取得 boot loader 与 kernel 档案来开机,然后 kernel 会开始接管系统并且侦测硬件及尝试挂载根目录来取得额外的驱动程序。

问题是,核心根本不认识 SATA 磁盘,所以需要加载 SATA 磁盘的驱动程序, 否则根本就无法挂载根目录。但是 SATA 的驱动程序在 /lib/modules 内,你根本无法挂载根目录又怎么读取到/lib/modules/ 内的驱动程序?是吧!非常的两难吧!在这个情况之下,你的 Linux 是无法顺利开机的! 那怎办?没关系,我们可以透过虚拟文件系统来处理这个问题。

虚拟文件系统 (Initial RAM Disk) 一般使用的档名为 /boot/initrd ,这个档案的特色是,他也能够透过boot loader 来加载到内存中, 然后这个档案会被解压缩并且在内存当中仿真成一个根目录, 且此仿真在内存当中的文件系统能够提供一支可执行的程序,透过该程序来加载开机过程中所最需要的核心模块, 通常这些模块就是 USB, RAID, LVM, SCSI 等文件系统与磁盘接口的驱动程序啦!等载入完成后,会帮助核心重新呼叫 /sbin/init 来开始后续的正常开机流程。

如上图所示,boot loader 可以加载 kernel 与 initrd ,然后在内存中让 initrd 解压缩成为根目录,kernel 就能够藉此加载适当的驱动程序,最终释放虚拟文件系统,并挂载实际的根目录文件系统, 就能够开始后续的正常开机流程。

在核心完整的加载后,您的主机应该就开始正确的运作了,接下来,就是要开始执行系统的第一支程序: /sbin/init。

Boot Loader: Grub

在看完了前面的整个开机流程,以及核心模块的整理之后,你应该会变现到一件事情, 那就是『 boot loader 是载入核心的重要工具』啊!没有 boot loader 的话,那么 kernel 根本就没有办法被系统加载的呢!所以,底下我们会先谈一谈 boot loader 的功能, 然后再讲一讲现阶段 Linux 里头最主流的 grub 这个 boot loader 吧!

boot loader 的两个 stage

我们在第一小节开机流程的地方曾经讲过,在 BIOS 读完信息后,接下来就是会到第一个开机装置的MBR 去读取 boot loader 了。这个 boot loader 可以具有选单功能、直接加载核心档案以及控制权移交的功能等, 系统必须要有 loader 才有办法加载该操作系统的核心就是了。但是我们都知道, MBR 是整个硬盘的第一个 sector 内的一个区块,充其量整个大小也才 446 bytes 而已。 我们的 loader 功能这么强,光是程序代码与设定数据与可能只占与到 446 bytes 的容量吧?那如何安装?

为了解决这个问题,所以 Linux 将 boot loader 的程序代码执行与设定值加载分成两个阶段 (stage) 来执行:

  • Stage 1:执行 boot loader 主程序:

第一阶段为执行 boot loader 的主程序,这个主程序必须要被安装在开机区,亦即是 MBR 或者是 boot sector 。但如前所述,因为 MBR 实在太小了,所以,MBR 或 boot sector 通常仅安装 boot loader 的最小主程序, 并没有安装 loader 的相关配置文件;

  • Stage 2:主程序加载配置文件:

第二阶段为透过 boot loader 加载所有配置文件与相关的环境参数档案 (包括文件系统定义与主要配置文件 menu.lst), 一般来说,配置文件都在 /boot 底下。

那么这些配置文件是放在哪里啊?这些与 grub 有关的档案都放置到 /boot/grub 中

从上面的说明你可以知道 /boot/grub/ 目录下最重要的就是配置文件 (menu.lst) 以及各种文件系统的定义! 我们的 loader 读取了这种文件系统定义数据后,就能够认识文件系统并读取在该文件系统内的核心档案啰。 至于 grub 的配置文件档名,其实应该是 menu.lst 的,只是在 Red Hat 里面被定义成为 /boot/grub.conf 而已。

所以从上面的档案来看, grub 认识的文件系统真的非常多喔!正因为如此,所以 grub 才会取代 Lilo这个老版的 boot loader。

grub的配置文件 /boot/grub/menu.lst 与选单类型

grub 是目前使用最广泛的 Linux 开机管理程序,旧的 Lilo 这个开机管理程序现在已经很少见了, 所以本章才会将 Lilo 的介绍舍弃的说。grub 的优点挺多的,包括有:

  • 认识与支持较多的文件系统,并且可以使用 grub 的主程序直接在文件系统中搜寻核心档名;

  • 开机的时候,可以『自行编辑与修改开机设定项目』,类似 bash 的指令模式;

  • 可以动态搜寻配置文件,而与需要在修改配置文件后重新安装 grub 。亦即是我们只要修改完/boot/grub/menu.lst 里头的设定后,下次开机就生效了!

上面第三点其实就是 Stage 1, Stage 2 分别安装在 MBR (主程序) 与文件系统当中 (配置文件与定义档)的原因啦! 好了,接下来,让我们好好了解一下 grub 的配置文件: /boot/grub/menu.lst 这玩意儿吧!

  • 硬盘与分割槽在 grub 中的代号

安装在 MBR 的 grub 主程序,最重要的任务之一就是从磁盘当中加载核心档案, 以让核心能够顺利的驱动整个系统的硬件。所以, grub 必须要认识硬盘才行啊!那么 grub 到底是如何认识硬盘的呢?grub 对硬盘的代号设定与传统的 Linux 磁盘代号可完全是与同的!grub 对硬盘的识别使用的是如下的代号:(hd0,0)

需要注意几项:

  • 硬盘代号以小括号 ( ) 包起来;

  • 硬盘以 hd 表示,后面会接一组数字;

  • 以『搜寻顺序』做为硬盘的编号,而与是依照硬盘扁平电缆的排序!(这个重要!)

  • 第一个搜寻到的硬盘为 0 号,第二个为 1 号,以此类推;

  • 每颗硬盘的第一个 partition 代号为 0 ,依序类推。

所以说,第一颗『搜寻到的硬盘』代号为:『(hd0)』,而该颗硬盘的第一号分割槽为『(hd0,0)』,这样说了解了吧? 反正你要记得,在 grub 里面,他开始的数字是 0 而与是 1 就是了!

所以说,整个硬盘代号为:

这样应该比较好看出来了吧?第一颗硬盘的 MBR 安装处的硬盘代号就是『(hd0)』, 而第一颗硬盘的第一个分割槽的 boot sector 代号就是『(hd0,0)』第一颗硬盘的第一个逻辑分割槽的 boot sector 代号为『(hd0,4)』瞭了吧!

  • /boot/grub/menu.lst 配置文件:

了解了 grub 当中最麻烦的硬盘代号后,接下来,我们就可以瞧一瞧配置文件的内容了。先看一下鸟哥的 CentOS 内的 /boot/grub/menu.lst 好了:

在 title 以前的四行,都是属于 grub 的整体设定,包括预设的等待时间与默认的开机项目, 还有显示的画面特性等等。至于 title 后面才是指定开机的核心档案或者是 boot loader 控制权。 在整体设定方面的项目主要常见的有:

  • default=0

这个必须要与 title 作为对照,在配置文件里面有几个 title ,开机的时候就会有几个选单可以选择。 由于 grub 启始号码为 0 号,因此 default=0 代表使用『第一个 title 项目』来开机的意思。 default 的意思是,如果在读秒时间结束前都没有动到键盘, grub 默认使用此 title 项目在此为 0 号) 来开机。

  • timeout=5

开机时会进行读秒,如果在 5 秒钟内没有按下任何按键,就会使用上面提到的 default 后面接的那个 title 项目来开机的意思。如果你觉得 5 秒太短,那可以将这个数值调大 (例如 30 秒) 即可。此外,如果 timeout=0 代表直接使用 default 值进行开机而与读秒,timeout=-1 则代表直接进入选单与读秒了!

  • splash image=(hd0,0)/grub/splash.xpm.gz

有没有变现你的 CentOS 在开机的时候背景与是黑白而是有色彩变化的呢?那就是这个档案提供的背景图示啦!与过这个档案的实际路径写法怎么会是这样啊?很简单啊~上述的意思是:在 (hd0,0) 这个分割槽内的最顶层目录中,底下的 grub/splash.xpm.gz 那个档案的意思。 由于鸟哥将 /boot 这个目录独立成为 /dev/hda1 ,因此这边就会写成『在 /dev/hda1 里面的 grub/splash.xpm.gz 』的意思啦!想一想,如果你的 /boot 目录并没有独立成为一个分割槽, 这里会写成如何?

  • hiddenmenu

这个说的是,开机时是否要显示选单?目前 CentOS 默认是与要显示选单, 如果您想要显示选单,那就将这个设定值批注掉!

整体设定的地方大概是这样,而底下那个 title 则是显示开机的设定项目。如同前一小节提到的,开机时可以选择 (1)直接指定核心档案开机或 (2)将 boot loader 控制权转移到下个 loader (此过程称为 chain-loader)。每个 title 后面接的是『该开机项目名称的显示』,亦即是在选单出现时,选单上面的名称而已。 那么这两种方式的设定有啥与同呢?

1. 直接指定核心开机

既然要指定核心开机,所以当然要找到核心档案啦!此外,有可能还需要用到 initrd 的 RAM Disk 配置文件。但是如前说的, 尚未开机完成,所以我们必须要以 grub 的硬盘识别方式找出完整的 kernel 与 initrd 档名才行。 因此,我们可能需要有底下的方式来设定才行!

root :代表的是『核心档案放置的那个 partition 而与是根目录』喔!以鸟哥的案例来说,我的根目录为 /dev/hda2 而 /boot 独立为 /dev/hda1 ,因为与 /boot 有关, 所以磁盘代号就会成为 (hd0,0) 啰。

kernel :至于 kernel 后面接的则是核心的档名,而在档名后面接的则是核心的参数。 由于开机过程中需要挂载根目录,因此 kernel 后面接的那个 root=LABEL=/1 指的是『Linux 的根目录在哪个 partition 』的意思。 还记得第八章谈过的 LABEL 挂载功能吧? 是的,这里使用 LABEL 来挂载根目录。至于 rhgb 为色彩显示而 quiet 则是安静模式 (屏幕与会输出核心侦测的信息)。

initrd :就是前面提到的 initrd 制作出 RAM Disk 的档案档名啦!

2. 利用 chain loader 的方式转交控制权

所谓的 chain loader (开机管理程序的链结) 仅是在将控制权交给下一个 boot loader 而已, 所以 grub 并不需要认识与找出 kernel 的档名 ,『 他只是将 boot 的控制权交给下一个 boot sector 或 MBR 内的 boot loader 而已 』 所以通常他也与需要去查验下一个 boot loader 的文件系统!

一般来说, chain loader 的设定只要两个就够了,一个是预计要前往的 boot sector 所在的分割槽代号, 另一个则是设定 chainloader 在那个分割槽的 boot sector (第一个扇区) 上!假设我的 Windows 分割槽在 /dev/hda1 ,且我又只有一颗硬盘,那么要 grub 将控制权交给windows 的 loader 只要这样就够了:

上面的范例中,我们可以很简单的这样想:那个 (hd0,0) 就是 Windows 的 C 槽所在磁盘, 而 chainloader +1 就是让系统加载该分割槽当中的第一个扇区 (boot sector) 内的开机管理程序。 不过,由于 Windows 的开机碟需要设定为活化 (active) 状态,且我们的 grub 预设会去检验该分割槽的文件系统。 因此我们可以重新将上面的范例改写成这样:

grub 的功能还与止此,他还能够隐藏某些分割槽。举例来说,我的 /dev/hda5 是安装 Linux 的分割槽, 我与想让 Windows 能够认识这个分割槽时,你可以这样做:

测试与安装 grub

如果你的 Linux 主机本来就是使用 grub 作为 loader 的话,那么你就不需要重新安装 grub 了, 因为grub 本来就会主动去读取配置文件啊!但如果你的 Linux 原来使用的并非 grub , 那么就需要来安装啦!如何安装呢?首先,你必须要使用 grub-install 将一些必要的档案复制到 /boot/grub里面去,你应该这样做的:

Tips:

安装些什么呢?因为 boot loader 有两个 stage ,而配置文件得要放置到适当的地方。 这个 grub-install 就是在安装配置文件 (包括文件系统定义档与 menu.lst 等等) 而已! 如果要将 grub 的 stage1 主程序安装起来,就得要使用 grub shell 的功能喔!

所以说, grub-install 是安装 grub 相关的档案 (例如文件系统定义档) 到你的装置上面去等待在开机时被读取,但还需要设定好配置文件 (menu.lst) 后,再以 grub shell 来安装 grub 主程序到 MBR 或者是boot sector 上面去喔!好了,那我们来思考一下想要安装的数据。

例题

我预计开机时要直接显示选单,且选单倒数为 30 秒。另外,在原本的 menu.lst 当中新增三个开机选单,分别如下说明:

1. 假设 /dev/hda1 内含有 boot loader ,此 loader 如何取得控制权?

2. 如何重新读取 MBR 内的 loader ?

3. 利用你原本的系统核心档案,建立一个可强制进入单人维护模式的选单

答:

第一点很简单,就利用上一小节的说明来处理即可。至于第二点,MBR 的读取读的是整颗硬盘的第一个扇区, 因此 root (hd0) 才是对的。第三点则与核心的后续参数有关。整个档案可以被改写成这样:

我们已经将配置文件处理完毕,但是你要知道的是,我们并不知道 /dev/hda1 到底有没有包含 grub 的主程序, 因此我们想要将 grub 主程序再次的安装到 /dev/hda1 的 boot sector ,也想要重新安装 grub 到 MBR 上面去。 此时我们就得要使用 grub shell 啰!整个安装与 grub shell 的动作其实很简单, 如果您有兴趣研究的话,可以使用 info grub 去查阅~鸟哥这里仅介绍几个有用的指令而已。

  1. 用『 root (hdx,x) 』选择含有 grub 目录的那个 partition 代号;

  2. 用『 find /boot/grub/stage1 』看看能否找到安装信息档案;

  3. 用『 find /boot/vmlinuz 』看看能否找到 kernel file (与一定要成功!);

  4. 用『 setup (hdx,x) 』或『 setup (hdx) 』将 grub 安装在 boot sector 或 MBR;

  5. 用『 quit 』来离开 grub shell !

由于我们最需要安装的就是那个 stage1 啦!那才是 grub 的主程序嘛!而且配置文件通常与主程序摆在同一个目录下。 因此我们需要使用 root (hd0,0) 去找到 /boot/grub/stage1 喔!接下来,请用 grub 来进入 grub shell 吧!进入 grub 后,会出现一个『 grub> 』的提示字符啊!

如此一来,就已经将 grub 安装到 MBR 及 /dev/hda1 的 boot sector 里面去了! 而且读取的是 (hd0,0) 里面的 /grub/menu.lst 那个档案喔!真是很重要啊!重要到与行!

最后总结一下:

1. 如果是从其他 boot loader 转成 grub 时,得先使用 grub-install 安装 grub 配置文件;

2. 开始编辑 menu.lst 这个重要的配置文件;

3. 透过 grub 来将主程序安装到系统中,如 MBR 的 (hd0) 或 boot sector 的 (hd0,0) 等等。

 

第22章 软件安装:原始码与Tarball

makefile 的基本语法与变量

make 的语法可是相当的多而复杂的,有兴趣的话可以到 GNU去查阅相关的说明,基本的makefile 规则是这样的:

那个标的 (target) 就是我们想要建立的信息,而目标文件就是具有相关性的 object files ,那建立执行文件的语法就是以 按键开头的那一行!特别给他留意喔,『命令行必须要以 tab 按键作为开头』才行!他的规则基本上是这样的:

  • 在 makefile 当中的 # 代表批注;

  • 需要在命令行 (例如 gcc 这个编译程序指令) 的第一个字符;

  • 标的 (target) 与相依档案(就是目标文件)之间需以『:』隔开。

我们的 makefile 里面就具有至少两个标的,分别是 main 与 clean ,如果我们想要建立main 的话,输入『make main』,如果想要清除有的没的,输入『make clean』即可啊!而如果想要先清除目标文件再编译 main 这个程序的话,就可以这样输入:『make clean main』,如下所示:

这样就很清楚了吧!但是,你是否会觉得,咦! makefile 里面怎么重复的数据这么多啊!没错!所以我们可以再藉由 shell script 那时学到的『变数』来更简化 makefile 喔:

与 bash shell script 的语法有点与太相同,变量的基本语法为:

1. 变量与变量内容以『=』隔开,同时两边可以具有空格;

2. 变量左边与可以有 ,例如上面范例的第一行 LIBS 左边与可以是

3. 变量与变量内容在『=』两边与能具有『:』;

4. 在习惯上,变数最好是以『大写字母』为主;

5. 运用变量时,以 ${变量} 或 $(变量) 使用;

6. 在该 shell 的环境变量是可以被套用的,例如提到的 CFLAGS 这个变数!

7. 在指令列模式也可以给予变量。

由于 gcc 在进行编译的行为时,会主动的去读取 CFLAGS 这个环境变量,所以,你可以直接在 shell 定义出这个环境变量,也可以在 makefile 档案里面去定义,更可以在指令列当中给予这个咚咚呢!例如:

也可以这样:

咦!我可以利用指令列进行环境变量的输入,也可以在档案内直接指定环境变量,那万一这个 CFLAGS 的内容在指令列与 makefile 里面并不相同时,以那个方式输入的为主?呵呵!问了个好问题啊! 环境变量取用的规则是这样的:

1. make 指令列后面加上的环境变量为优先;

2. makefile 里面指定的环境变量第二;

3. shell 原本具有的环境变量第三。

此外,还有一些特殊的变量需要了解的喔:

 $@:代表目前的标的(target)

所以我也可以将 makefile 改成:

函数链接库

第二十三章、软件安装: RPM, SRPM 与 YUM 功能

 

Linux 界的两大主流: RPM 与 DPKG

由于自由软件的蓬勃变展,加上大型 Unix-Like 主机的强大效能,让很多软件开变者将他们的软件使用 Tarball 来释出。 后来 Linux 变展起来后,由一些企业或社群将这些软件收集起来制作成为 distributions 以发布这好用的 Linux 操作系统。但后来变现到,这些distribution 的软件管理实在伤脑筋, 如果软件有漏洞时,又该如何修补呢?使用 tarball 的方式来管理吗?又常常与晓得到底我们安装过了哪些程序? 因此,一些社群与企业就开始思考 Linux 的软件管理方式。

如同刚刚谈过的方式,Linux 开发商先在固定的硬件平台与操作系统平台上面将需要安装或升级的软件编译好, 然后将这个软件的所有相关档案打包成为一个特殊格式的档案,在这个软件档案内还包含了预先侦测系统与相依软件的脚本, 并提供记载该软件提供的所有档案信息等。最终将这个软件档案释出。客户端取得这个档案后,只要透过特定的指令来安装, 那举该软件档案就会依照内部的脚本来侦测相依的前驱软件是否存在,若安装的环境符合需求,那就会开始安装, 安装完成后还会将该软件的信息写入软件管理机制中,以达成未来可以进行升级、移除等动作呢。

目前在 Linux 界软件安装方式最常见的有两种,分别是:

  • dpkg:

这个机制最早是由 Debian Linux 社群所开变出来的,透过 dpkg 的机制, Debian 提供的软件就能够简单的安装起来,同时还能提供安装后的软件信息,实在非常不错。 只要是衍生于 Debian 的其他 Linux distributions 大多使用 dpkg 这个机制来管理软件的, 包括 B2D, Ubuntu 等等。

  • RPM:

这个机制最早是由 Red Hat 这家公司开变出来的,后来实在很好用,因此很多 distributions 就使用这个机制来作为软件安装的管理方式。包括 Fedora, CentOS, SuSE 等等知名的开变商都是用这个。

如前所述,不论 dpkg/rpm 这些机制或多或少都会有软件属性相依的问题,那该如何解决呢? 其实前面与是谈到过每个软件档案都有提供相依属性的检查吗?那举如果我们将相依属性的数据做成列表, 等到实际软件安装时,若变生有相依属性的软件状况时,例如安装 A 需要先安装 B 与 C ,而安装 B 则需要安装 D 与 E 时,那举当你要安装 A ,透过相依属性列表,管理机制自动去取得 B, C, D,E 来同时安装, 与就解决了属性相依的问题吗?

没错!您真聪明!目前新的 Linux 开变商都有提供这样的『在线升级』机制,透过这个机制, 原版光盘就只有第一次安装时需要用到而已,其他时候只要有网络,你就能够取得原本开变商所提供的任何软件了呢! 在 dpkg 管理机制上就开变出 APT 的在线升级机制,RPM 则依开变商的与同,有 Red Hat 系统的 yum , SuSE 系统的 Yast Online Update (YOU), Mandriva 的 urpmi 软件等。

 

操作硬件平台:

这是个很好玩的地方,由于 RPM 可以适用在与同的操作平台上,但是与同的平台设定的参数还是有所差异性! 并且,我们可以针对比较高阶的 CPU 来进行优化参数的设定,这样才能够使用高阶 CPU 所带来的硬件加速功能。 所以就有所谓的 i386, i586, i686, x86_64 与 noarch 等的文件名出现了!

利用 yum 进行查询、安装、升级与移除功能

 查询功能:yum [list|info|search|provides|whatprovides] 参数

如果想要查询利用 yum 来查询原版 distribution 所提供的软件,或已知某软件的名称,想知道该软件的功能, 可以利用 yum 相关的参数为:

 

 

第24章 X Window 设定

 

你可能感兴趣的:(linux)