Linux服务与安全管理
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.3 开机与关机

3.3.1 Linux的启动流程分析

为了能够比较容易地发现Linux启动中出错的原因和解决方法,我们应该对开机的整个过程有所了解。RHEL同时提供LILO与GRUB这两个Boot Loader(引导装载程序,Linux 开机时载入的程序),尽管它们的启动过程存在稍许差异,但是它们的原理相同。Linux 系统启动的过程如图3-18所示。

内核被加载之后,将会执行一系列程序和脚本文件,而内核第一个调用的程序就是“/sbin/init”,它是Linux系统的第一个进程,称为1号进程。init进程会加载配置文件“/etc/inittab”,并根据其中的配置信息来确定系统进入指定的运行级别(run-level)。在文件“/etc/inittab”中有如图3-19所示的一段注释信息,说明了Linux各个运行级别的功能。

图3-18 Linux系统启动的过程图

图3-19 运行级别0~6

目前可以使用的运行级别的编号是0~6,其中,较常使用的是多用户多任务的情况,即级别3与5,分别对应文本界面与图形界面的登录(要运行级别5,请先确定X-windows没有问题),而级别3更多用于作为服务器使用的主机。通常我们把开机默认的运行级别设置为3或者5,而绝不能设置为0或者6,否则系统会直接关机或者一直不断地重启。

显示当前运行级别的命令如下:

# runlevel

init命令用来改变系统当前的运行级别,使用数字0~6作为命令参数。例如:

# init 0                                                                                // 关机
# init 6                                                                                // 重新启动
# init 5                                                                                // 进入5号运行级别

什么是“单用户模式(run-level为1)”呢?Windows开机时可以选择运行在“安全模式”、“正常开机”或“MS-DOS模式”等的状态,由于“安全模式”不加载一些复杂的模块,因此可以保证开机成功。而Linux的单用户模式也是以最简状态运行的,它可防止多用户同时访问进程,当服务器无法正常启动时,仍能允许root进入此模式对系统进行维护,特别是对磁盘的维护。

进入login界面并输入正确的账户和密码成功登录后,Linux系统就算是启动完毕了。值得注意的是,由于在第5步时就已加载了默认的系统服务,因此,即使在未登录Linux系统的情况下,该主机已经能够正常地对外提供服务了。

3.3.2 配置文件/etc/inittab

配置文件“/etc/inittab”可以在系统启动过程中为init进程提供必要的设置信息。该文件中每个有效行有4个字段,格式如图3-20所示。

图3-20 inittab文件的格式

1.设置默认的运行级别

前面提到登录主机的方式最少有6种,常用的是run-level 3的文本界面模式与run-level 5的图形界面模式。如果在安装的过程中选择了文本界面登录,之后却想以图形界面登录,办法很简单,就是直接修改配置文件“/etc/inittab”,将“id:3:initdefault:”一行中的第二个字段值设为5,在下次的登录时就变成图形界面了。同理,要由图形界面改变为文字界面登录,只要将这一行改为3即可,如图3-21所示。

图3-21 设置默认的运行级别

2.设置支持的文本界面终端

RHEL5提供了6个文本界面的终端和一个图形界面的登录点。可以按下Alt+Fn(n为0~6)键来切换不同的文本界面终端(在图形界面下使用Ctrl+Alt+Fn键)。至于图形界面终端则仅使用Ctrl+Alt+F7键来切换。

然而,开放的终端个数并非越多越好。如果目前只需要三个文本界面的终端,只需要如图3-22所示,将最后三行删除。同样地,要打开更多终端只需要添加相应的行即可。

图3-22 设置支持的文本界面终端

将文件保存然后重新开机之后,主机的F4、F5、F6功能键将无法实现终端的切换了。

需要注意的是,图形界面终端只有一个,当使用图形界面登录时,将直接进入这个终端。在tty1使用命令startx启动X-Windows后,也会自动地从tty1切换到图形界面终端。此时,若X-windows出现故障,可以直接按下Ctrl+Alt+F1组合键回到tty1,然后删除该X-Windows程序就可以关闭X-Windows了。

3.3.3 设置GRUB选项

GRUB是RHEL 5默认的Boot Loader程序。GRUB可以实现包括操作系统选单、设置密码、指向系统内核等的功能,此外,它允许用户编辑与修改开机设置项目,类似于bash的命令模式;它还可以自动“动态寻找配置文件”,即依据“/boot/grub/grub.conf”的设置改变其设置。因此,修改设置只要修改文件“/boot/grub/grub.conf”即可。

1.配置文件/boot/grub/grub.conf

GRUB的配置文件是“/boot/grub/grub.conf”,它还有一个链接文件“/etc/grub.conf”,其内容如图3-23所示。

图3-23 GRUB的配置文件

如果有兴趣的话,建议使用命令“info grub”详细地查看该文件的所有功能,下面仅列出一些常用的功能与设置。

(1)关于硬盘的代号。

GRUB中的硬盘代号与Linux自身使用的硬盘设备名不一样,类似如下的形式:

(hd0,0)

头部的字母“hd”代表IDE的硬盘,数字“0,0”中第一个0代表第一个IDE的master,第二个0代表第一个partition,因此该设备其实就是hda1。表3-2说明了两种名字的对应关系。

表3-2 硬盘代号的表示

(2)default与title的编号。

这里需要说明default开机文件的计算方法。例如,有4个开机配置文件,它们在GRUB配置文件中的title依次为:rh9、rhel5、win7、win2008,那么开机时,GRUB就会打印如下的操作系统选单:

rh9
rhel5
win7
win2008

其中,rh9编号为0,依次类推,win2008的编号就是3。修改文件“/boot/grub/grub.conf”就可以调整开机时的选单顺序。

注意:default指向默认的系统,它的值应该跟着改变。

(3)设置title的内容。

如果是一般的硬盘环境,我们仅需要如下两行就可以设置好title的内容了:

root 开机根目录所在的磁盘代号
kernel 开机文件相对于开机根目录的完整文件名 文件读写权限 root=所在磁盘的设备文件名

例如:

root    (hd0,0)
kernel  /vmlinuz-2.6.18-53.el5 ro root=/dev/VolGroup00/LogVol00

所以,开机完毕之后,请记住你的 kernel文件名称(完整文件名)与开机的根目录所在的磁盘代号,以便于日后手工设置title项目。

2.开机手工设置选项

事实上,每次修改完“/boot/grub/grub.conf”即已完成了GRUB的设置。如果设置错误,导致系统无法启动,则应从硬盘或者CD启动进入GRUB界面,根据界面下方的基本提示信息,可以输入“c”来选择“进入命令列模式”,或者选择“e”进入“编辑”界面,然后选择kernel或者root这两项内容进行编辑即可。

当看到提示符“GRUB>”之后,就可以修改或者是自定义一些项目了。这些设置并不会主动覆盖“/boot/grub/grub.conf”的设置,而是仅对本次登录有效。例如,当知道了root与kernel的正确信息之后,就可以输入“c”然后输入下面如图3-24所示的字符。

图3-24 开机手工设置GRUB选项

修改完成后,使用boot命令就可以进入特定的操作系统了。

3.GRUB加密

对于多人共享的主机,应该为启动过程中涉及的程序——BIOS或者引导程序——设置密码,以防止物理性地使用光盘或软盘引导,绕过系统正常启动来获取数据或破坏计算机。

GRUB是Linux默认的多系统引导程序。如果在计算机上安装了多个操作系统,就可以用GRUB来选择用哪个操作系统启动。在默认情况下,无须输入密码就可进入GRUB,如果普通用户利用这一点进入单用户模式,就能轻而易举地执行一些危险的操作。例如,修改shadow文件,将root的密码字段删除,导致以后不需要输入密码就能直接以root的身份进入系统,为系统安全埋下了隐患。通常的解决办法是为GRUB设置密码并且用MD5加密。

(1)首先使用grub自己的MD5加密工具,如图3-25所示。

图3-25 生成MD5加密后的密码

(2)编辑grub的配置文件“/etc/grub.conf”,在文件中添加如图3-26所示的一行语句,把GRUB的密码设置成上一步所生成的密码。

图3-26 在/etc/grub.conf中设置GRUB密码

(3)修改好配置文件后保存退出,然后重启系统。以后必须输入正确的GRUB密码才允许编辑启动菜单,进入单用户模式。

3.3.4 正确的关机方式

我们已大致了解了开机的方法,以及一些基本命令的操作,那么如何关机呢?实际上,关机是按照如下4个步骤进行的:

(1)同步RAM中的数据到硬盘上。

(2)关闭服务。

(3)卸载目录和分区。

(4)关闭根进程并且关闭电源。

在关闭类似DOS的单用户系统或者类似Windows的单用户假多任务系统时,关机对其他用户不产生影响,因此我们可以通过直接按下电源开关来实现。关机的操作听起来非常简单,但是服务器经常会由于关机方式不正当而造成数据无法同步,重要文件丢失,甚至系统崩溃。做为技术员,一定要重视这个细节。

我们知道,Linux是一套真正的多用户多任务的操作系统,我们在工作时,看不见后台其实运行着许多用户的大量进程(服务),如邮件程序、浏览器程序、FTP服务等。如果直接按下电源开关来关机,将使当时在线工作的其他用户立刻断线,导致一些有用的数据当即丢失,更严重的是,不正常关机很容易伤害到硬盘及数据传输的动作,造成文件系统的毁坏,某些服务不能正常使用。因此,在Linux下关机是一件很严肃的事情,必须讲究规范。正常情况下,要关机时需要注意下面几件事:

(1)观察系统当前的使用状态。

使用命令w可以查看当在线的用户;使用命令“netstat -a”可以了解网络的连接状态;使用命令“ps -aux”可以看到后台运行的进程。以上命令的执行结果可以帮助我们判断是否可以关机。

(2)通知在线用户关机的时间。

在关机前通知在线的用户,建议为他们预留一段时间以便结束工作。

(3)使用正确的关机命令。

下面就来介绍几个和关机有关的命令及其用法。

1.将数据同步写入硬盘中:sync

Linux系统为了加快数据的读写速度,默认某些数据不会直接被写入硬盘,而是先暂存在内存中,这也造成了在重新启动后这些数据更新不正常的情况。当然,不正常关机导致数据来不及写入硬盘,也可能出现同样的情况。此时就需要使用sync命令来手工同步数据,把RAM中尚未被更新的数据写入硬盘中,然后再关机就比较稳当了。命令的形式很简单,如图3-27所示。注意,该命令只有root可以执行。

图3-27 使用sync命令同步数据

例如,在关机之前使用sync命令将数据回存到硬盘上,命令如下:

# sync; sync; sync; reboot

sync命令一般执行3次就足够了。由于写数据需要一点时间,建议稍等片刻再关机。

2.“shutdown”命令

最常使用的关机命令是shutdown,只允许root执行。该命令会通知系统运行的各个进程,并将通知系统中的run-level内的一些服务来关闭它们。shutdown可以实现如下功能。

◇ 自由选择关机模式:可以选择关机或者重新启动。

◇ 设置关机时间:可以设置成现在立刻关机,也可以设置某一个特定的时间才关机。

◇ 自定义关机信息:在关机之前,可以将自己设置的警告信息传送给在线用户。

◇ 仅发出警告信息:有时需要进行一些测试,或者是提醒用户在某时间段注意一下。

◇ 选择是否要fsck 检查文件系统。

shutdown命令的语法规则为:

# shutdown [-akrhHPfnc] [-t secs] time [warning message]

主要选项及参数说明:

◇ -a 使用文件“/etc/shutdown.allow”,允许其中的用户执行shutdown命令。

◇ -k 不是真的关机,仅发出警告信息。

◇ -r 将系统服务停止之后重新开机。

◇ -h 将系统服务停止之后立即关机。

◇ -f 系统重新启动之后,强制略过 fsck 的磁盘检查。

◇ -F 系统重新启动之后,强制进行 fsck 的磁盘检查。

◇ -n 不经过 init进程,直接以 shutdown 的功能来关机。

◇ -c 取消正在运行的shutdown进程。

◇ -t secs -t 后面加秒数,表示在发出警告后延迟几秒再关机。

◇ time 可以表示为绝对时间(形如“hh:mm”),也可以表示为相对时间(形如“+mins”,表示多少分钟之后),或者表示立刻(now,相当于time为0的状态)。该参数是必要的。

实例:

# shutdown -h +15 'shutdown in 15 mins'// 过15分钟后自动关机并显示警告信息
# shutdown -h now                                               // 立刻关机
# shutdown -h 20:25                                        // 系统将在最近的20:25关机
# shutdown -r now                                        // 立刻重新启动
# shutdown -r +30 'The system will reboot' // 过30分钟重新启动,并显示警告信息
# shutdown -k now 'This system will reboot' // 仅对在线用户发出警告信息

对在线的用户发出信息,我们通常使用两种交互工具:wall和write。

◇ wall:向所有在线用户广播信息。命令的用法是:

# wall 信息

或者先把要广播的信息写入一个文件,然后输入:

wall < 文件名

◇ write:向系统中某个用户发送信息。该命令的一般格式为:

# write 用户账号 [终端名称]

使用w命令可以观察到当前用户正在使用的终端名称,如pts/1、pts/2、tty1等。

例如:张三以root账户在终端pts/1登录;李四以tom账户在终端pts/2登录。李四想发送一消息给pts/1上的root用户,则输入:

# write root pts/1

此时系统进入发送信息状态,输入想要发给root的信息,按下Enter键后立即发出去。之后还能继续发送消息,直到按Ctrl+c组合键即可退出发送状态。

3.其他命令重新开机

(1)reboot命令和init 6命令:可以实现立即重新启动,与shutdown -r now命令的功能相同。但init 6命令没有同步数据的操作,在使用中会有警告信息,因此不建议在服务器上使用这个命令,很容易出问题。

(2)poweroff命令和init 0命令:可以实现立即关机,与shutdown -h now命令的功能相同。但init 0命令不建议使用。

(3)halt命令:用来停止所有的系统服务,但不会自动关机,如果加上选项“-p”,就能实现与poweroff命令相同的功能。