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

第十八章、认识系统服务 (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> 按键开头的那一行!特别给他留意喔,『命令行必须要以 tab 按键作为开头』才行!他的规则基本上是这样的:

  • 在 makefile 当中的 # 代表批注;
  • <tab> 需要在命令行 (例如 gcc 这个编译程序指令) 的第一个字符;
  • 标的 (target) 与相依档案(就是目标文件)之间需以『:』隔开。

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

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

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

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

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

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 设定

 

posted @ 2012-03-02 22:40  Mr.Rico  阅读(1421)  评论(0编辑  收藏  举报