一:RHEL6的开机流程分析

在RHEL 6.x系统中,采用了全新的Upstart启动方式,大大提高了开机效率。实际上,/sbin/init程序已经改由upstart软件包提供,而不再是SysVinit软件包。Upstart来源于Ubuntu Linux,其官方网站位于http://upstart.ubuntu.com/。

Upstart使用了基于事件(状态变化)的模型,更加符合一个快速、有效的init系统标准:尽可能启用更少进程、尽可能将更多进程并行启动。

Upstart不再使用单一的/etc/inittab配置文件,而是将各种初始化配置分散存放,并各自响应相关的启动事件。init程序的配置目录位于/etc/init/,原有的/etc/inittab文件中仅保留默认运行级别的配置。

下面列出一部分与Upstart启动相关的配置文件。

/etc/inittab 配置默认运行级别

/etc/init/rcS.conf 加载rc.sysinit脚本,完成系统初始化任务

/etc/init/rc.conf 兼容脚本,负责各运行级别的调用处理

/etc/init/rcS-sulogin.conf 为单用户模式启动/sbin/sushell环境

/etc/init/control-alt-delete.conf 控制终端下的Ctrl+Alt+Del热键操作

/etc/init/start-ttys.conf 配置tty终端的开启数量、设备文件

/etc/sysconfig/init 控制tty终端的开启数量、终端颜色方案

/etc/init/tty.conf 控制tty终端的开启

开机――是件很简单的事情,只要按下电源开关,然后系统就会自然启动,很多人认为没有什么需要学习的。其实不然,如果系统没有什么问题,可以正常登陆的时候,当然开机很简单。但更多的时候,我们需要知道当机子不能正常开机的如何解决,这才是我们学习的目的。
那么我们就来分析一下Linux的开机流程系统开机的过程可以汇整成下面的流程:
1.加载BIOS的硬件信息、进行自我测试,并依据设定获得第一个可开机的设备;
2.读取并执行第一个开机设备内MBR的boot Loader(grub等程序);
3.依据boot loader的设置加载Kernel,Kernel会开始检测硬件与加载驱动程序;
4.内核启动init
5.系统初始化:(根据/etc/init/rcS.conf文件中的记录 “exec /etc/rc.d/rc.sysinit”执行rc.sysinit系统初始化脚本)
6.init找到/etc/inittab文件,确定默认的运行级别(X) (根据/etc/init/rcS.conf文件中的记录“exec telinit $runlevel”)
7.触发相应的runlevel事件(根据/etc/init/rc.conf文件中的记录“exec /etc/rc.d/rc $RUNLEVEL)”
8.开始运行/etc/rc.d/rc,传入参数X
9./etc/rc.d/rc脚本进行一系列设置,最后运行相应的/etc/rcX.d/中的脚本
10./etc/rcX.d/中的脚本按事先设定的优先级依次启动
11.最后执行/etc/rc.d/rc.local
12.加载终端或X-Window接口

BIOS:开机自检与MBR

要启动系统首先就得去加载BIOS(Basic Input Output System),并通过BIOS程序去加载CMOS的信息,并且由CMOS内的设定值取得主机的各项硬件配置信息(如开机设备的搜寻顺序、硬盘的大小与类型、 系统时间、各周边总线的是否启动Plug and Play (PnP, 即插即用设备)、等等)。在取得这些信息后,BIOS还会进行开机自检(Power-on Self Test, POST)。 然后开始执行硬件检测的初始化,并设定PnP设备,之后再定义出可开机的设备顺序, 接下来就会开始进行开机设备的数据读取了(MBR相关的任务开始)。

我们还需要一个开机管理程序来处理内核文件的加载问题,这个开机管理程序就被称为Boot Loader。这个Boot Loader程序安装在开机设备的第一个扇区(sector)内,也就是MBR (Master Boot Record,主要启动记录区,第一个扇区的512字节)。

clip_image002

Boot Loader最主要功能是加载内核到主存储器中去执行,由于不同操作系统的文件格式不一致,因此每种操作系统都有自己的boot loader。 由boot loader的管理而开始读取内核文件后,接下来,Linux 就会将内核解压缩到主存储器当中, 并且利用内核的功能,开始测试与驱动各个周边设备,包括储存设备、CPU、网卡、声卡等等。 此时 Linux 内核会以自己的功能重新检测一次硬件,内核会被放置到 /boot 里面,并且取名为 /boot/vmlinuz

init及配置文件 /etc/inittab 与 runlevel

在内核加载完毕、进行完硬件检测与驱动程序加载后,此时主机硬件已经准备就绪了,这时候内核会启动第一个程序,那就是 /sbin/init;/sbin/init 最主要的功能就是准备软件执行的环境,包括系统的主机名、网络设定、语言、文件系统格式及其他服务的启动等。 而所有的动作都会通过 init的配置文件/etc/inittab来规划,而inittab 内还有一个很重要的设定内容,那就是默认的 runlevel (开机运行级别)。

Linux就是通过设定runlevel来规定系统使用不同的服务来启动,让Linux的使用环境不同。这个inittab文件里面的支持级别(RHEL6系统里面的,和以前的其它版本有很大的差别)

现在我们来看一看/etc/inittab文件中内容:

#vim /etc/inittab 部分内容解释如下:

0 - halt (系统直接关机)
1 - single user mode (单人维护模式,用在系统出问题时的维护)
2 - Multi-user, without NFS (类似底下的 runlevel 3,但无 NFS 服务)
3 - Full multi-user mode (完整含有网络功能的纯文本模式)
4 - unused (系统保留功能)
5 - X11 (与 runlevel 3 类似,但加载使用 X Window)
6 - reboot (重新启动)

0, 4, 6 不是关机、重新启动就是系统保留的,所以不能将预设的run level设定为这三个值。

RHEL6系统上的这个文件和以前的版本有很大的差别,目前这个文件只能设置运行级别,其它的相关配置文件,在此文件中已经做了说明如:
System initialization is started by /etc/init/rcS.conf
Individual runlevels are started by /etc/init/rc.conf
Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,with configuration in /etc/sysconfig/init.
更多的内容,可以到/etc/init/目录中查看;红帽已经使用新的Upstart启动服务来替换以前的init。在RHEL6的版本中,我们可以把/etc/init/这个目录里面的内容,看成是以前/etc/inittab这个文件里的拆分。

下面是RHEL6上面Upstart大致的一个启动过程:

1.内核启动init
2.系统初始化:(根据/etc/init/rcS.conf文件中的记录 “exec /etc/rc.d/rc.sysinit”执行rc.sysinit系统初始化脚本)
3.init找到/etc/inittab文件,确定默认的运行级别(X) (根据/etc/init/rcS.conf文件中的记录“exec telinit $runlevel”)
4.触发相应的runlevel事件(根据/etc/init/rc.conf文件中的记录“exec /etc/rc.d/rc $RUNLEVEL)”
5.开始运行/etc/rc.d/rc,传入参数X
6./etc/rc.d/rc脚本进行一系列设置,最后运行相应的/etc/rcX.d/中的脚本
7./etc/rcX.d/中的脚本按事先设定的优先级依次启动
8.最后执行/etc/rc.d/rc.local
9.加载终端或X-Window接口

/etc/rc.sysinit 这个文件干了哪些工作?

#vim /etc/rc.sysinit
1、获得网络环境
2、挂载设备
3、开机启动画面Plymouth(取替了过往的 RHGB)
4、判断是否启用SELinux
5、显示于开机过程中的欢迎画面
6、初始化硬件
7、用户自定义模块的加载
8、配置内核的参数
9、设置主机名
10、同步存储器
11、设备映射器及相关的初始化
12、初始化软件磁盘阵列(RAID)
13、初始化 LVM 的文件系统功能
14、检验磁盘文件系统(fsck)
15、磁盘配额(quota)
16、重新以可读写模式挂载系统磁盘
17、更新quota(非必要)
18、启动系统虚拟随机数生成器
19、配置机器(非必要)
20、清除开机过程当中的临时文件
21、创建ICE目录
22、启动交换分区(swap)
23、将开机信息写入/var/log/dmesg文件中

这个文件里面的许多预设配置文件在/etc/sysconfig/这个目录当中,要了解更多的系统启动信息,可以到/var/log/dmesg文件中查看,也可以用dmesg命令来查看。

系统服务的启动:

经过 /etc/rc.sysinit 的系统模块与相关硬件信息的初始化后,RHEL6系统应该已经能顺利工作了。但还需要启动一些为我们提供服务的服务。这个时候,依据在/etc/inittab里面run level的设定值,就可以来决定启动的服务项目了。可以打开/etc/rc这个文件来研究
以运行级别3来说明
#ls /etc/rc3.d/
在这个目录下的文件主要具有2个特点:
1、全部以Sxx或Kxx(xx为数字)开头
2、全部是链接文件,链接到/etc/init.d/
现在来说明一下这些的目的
S表示启动服务, K表示停止服务,后面的数字是启动的先后顺序

用户自定义开机启动脚本

上面讲到的都是一些系统服务,Linux系统可以安装其它的软件来提供服务,若要自己安装的服务也要在开机启动,就可以用 /etc/rc.local 来完成。这就是我们要讲的用户自定义开机启动脚本。我们只要把想启动的脚本写到这个文件中,开机就能启动了,注意一点,写在这里面的脚本要使用绝对路径。

加载终端或X-Window接口

在完成了系统所有服务的启动后,接下来Linux就会启动终端或者是X Window来等待使用者登陆了!
在/etc/init/start-ttys.conf中我们可以看到有6个纯文本终端(tty[1-6])

运行级别的切换

如果我们切换run level只需要停止与启动一些服务就OK了,那么要如何来实现,其它很简单,用init n(数字)来切换。
比如说,我们要把运行级别5换成3,我们就用init 3来实现,切换的时候系统都做了哪些事呢?
先对比 /etc/rc3.d/ 及 /etc/rc5.d 内的 K 与 S 开头的文件;
对比/etc/rc3.d/ 内有多余的 K 开头文件则予以关闭;
对比/etc/rc3.d/ 内有多余的 S 开头文件则予以启动;
两个 run level 都存在的服务就不会被关闭;

二、进程与计划任务管理:

在linux系统中,每个程序启动后可以创建一个或多个进程,例如提供Web服务的httpd程序,当有大量用户同时访问web页面时,httpd程序可能会创建多个进程来提供服务。

查看进程:

ps 命令:

用途:查看静态的进程统计信息

格式:ps aux 或 ps -elf

ps命令结合“aux”选项使用时,将显示系统中所有的进程信息

ps命令结合“-elf”选项使用时,将以长格式显示系统中所有的进程信息,包含更丰富的内容(其中PPID列表示进程的父进程的PID号)。

#ps aux

clip_image004

USER:启动该进程的用户账号的名称

PID:进程号,在当前系统中是唯一的

TTY:表明该进程在哪个终端上运行,?表示未知或不需要终端。

STAT:进程的当前的状态如:S(休眠)、R(运行)、Z(僵死)、<(高优先级)、N(低优先级)、s(父进程)、+(前台进程),对于僵死进程应该予以手动终止

START:启动进程的时间

TIME:该进程占用的CPU时间

COMMAND:启动该进程的命令的名称

%CPU:CPU占用百分比

%MEM:内存占用百分比

VSZ:占用虚拟内存(swap)的大小

RSS:占用物理内存的大小

top命令:

用途:以动态刷新的方式显示进程的状态信息,默认情况下3秒钟刷新一次,在top命令显示的全屏界面中,可以按P键根据CPU占用情况对进程列表进行排序,M根据内存占用情况进行排序,N键根据启动时间进行排序,按h可以获得top的帮助,q键正常 退出top

在top中,还可以结束进程的进行,按k键后在列表上方将出现“PID to kill:”的提示信息,在后边输入指定进程的PID号并回车确认后可结束指定进程的运行。

pgrep命令:

用途:根据特定条件查询进程PID信息

常用命令选项:

-l:列出进程的名称;-U:根据进程所属的用户名进行查找;-t:根据进程所在的终端进行查找

Pstree命令:

用途:以树型结构显示各进程间的关系

常用命令选项:

-p:列出进程的PID号;-u:列出进程对应的用户名;-a:列出进程对应的完整命令

nice和renice影响调度优先级

进程的“谦让度”是以数字形式给内核的暗示,通过它来表明一个进程在同其他进程竞争CPU时应该如何对侍这个进程,谦让度值越高,优先级越低,谦让度值越低或负值表示优先级越高。“谦让度”的值范围是-20至+19

如今很少通过手工设置进程的优先级。

进程的“谦让度”值可以在创建进程时用nice命令来设置,并可以在执行时使用renice命令进行调整。Nice带一个命令行作为参数,而renice带PID或用户名作为参数可以用ps lax的输出包括父进程ID、谦让度(NI)字段等信息

clip_image006

用nice设置一个将要执行程序的进程的谦让度并查看,如下图:

#nice –n 10 cat /dev/zero > /dev/null

clip_image008

用renice命令改变httpd进程的谦让度

#renice –n -5 4920 (4920是cat命令的PID号)

再用ps命令查看:

clip_image010

如果所有就绪进程都具有同一优先级,那么它们将平等地共享处理器。仅当具有不同优先级的两个进程争夺CPU时间时,优先级才起作用,优先级较低的进程获得的时间较少,并且似乎运行超来更慢。

使用df命令查看磁盘空间使用情况;使用iostat查看磁盘I/O使用情况;使用vmstat查看交换使用情况

进程的不同启动方式

前台启动:用户输入命令,直接执行程序

后台启动:在命令行尾加入“&”符号

进程的前后台调度

Ctrl+Z 组合键:将当前进程挂起,即调入后台并停止执行

bg命令:将后台挂起的进程激活

jobs命令:查看处于后台的任务列表

fg命令:将处于后台的进程恢复到前台运行,需指定任务序号

终止进程的运行

Ctrl+C组合键:中断正在执行的命令

Kill:用于终止指定PID号的进程

Killall:用于终止指定名称的所有进程

-9 选项用于强制终止

pkill命令:根据特定条件终止相应的进程

常用命令选项:-U:根据进程所属的用户名终止相应进程;-t:根据进程所在的终端终止相应进程

计划任务管理

cron 系统调度进程。可以使用它在每天的非高峰负荷时间段运行作业,或在一周或一月

中的不同时段运行。

At at命令。使用它在一个特定的时间运行一些特殊的作业,或在晚一些的时间段运行。

& 使用它在后台运行一个进程。

at命令:

在指定的日期、时间点自动执行预先设置的一些命令操作,属于一次性计划任务

服务脚本名称:/etc/init.d/atd

设置格式:at [HH:MM] [yyyy-mm-dd]

如:# at 23:45

at> shutdown -h now

at> <EOT> (按ctrl+d提交任务)

如:#at now +2 hours 两个小时后执行

at>shutdown –h now

at><EOT> (按ctrl+d提交任务)

详细用法可查看at命令帮助:man at

atq命令:查询当前设置的at任务列表

atrm命令:删除指定任务编号的at任务

格式:atrm 编号

crontab命令按照预先设置的时间周期(分钟、小时、天……)重复执行用户指定的命令操作,属于周期性计划任务

1、/etc/crontab:系统任务配置文件,维护linux系统所需的任务,一般在系统及程序安装时自动设置,不需要人为地修改

2、/var/spool/cron:用户cron任务配置存放目录,由用户自行设置(使用crontab –e命令)的cron任务将保存在目录“/var/spool/cron”中,文件名与对应的用户账号同名。

系统默认的设置,位于目录:/etc/cron.*/

管理cron计划任务:

编辑计划任务:crontab -e [-u 用户名]

查看计划任务:crontab -l [-u 用户名]

删除计划任务:crontab -r [-u 用户名]

cron是系统主要的调度进程,可以在无需人工干预的情况下运行作业。有一个叫做crontab的命令允许用户提交、编辑或删除相应的作业。每一个用户都可以有一个crontab文件来保存调度信息。可以使用它运行任意一个shell脚本或某个命令,每小时运行一次,或一周

三次,这完全取决于用户的需求。每一个用户都可以有自己的crontab文件.

root用户可以管理指定用户的计划任务,普通用户只能管理自己的计划任务

clip_image012

字段

说明

分钟

取值为从0到59之间的任意整数

小时

取值为从0到23之间的任意整数

日期

取值为从1到31之间的任意整数

月份

取值为从1到12之间的任意整数

星期

取值为从0到7之间的任意整数,0或7代表星期日

命令

要执行的命令或程序脚本

时间数值的特殊表示方法

* 表示该范围内的任意时间

, 表示间隔的多个不连续时间点

- 表示一个连续的时间范围

/ 指定间隔的时间频率

应用示例

0 17 * * 1-5 周一到周五每天17:00

30 8 * * 1,3,5 每周一、三、五的8点30分

0 8-18/2 * * * 8点到18点之间每隔2小时

0 * */3 * * 每隔3天

0,30 18-23 * * * /apps/bin/dbcheck.sh

上面的例子表示在每天1 8 : 0 0至2 3 : 0 0之间每隔3 0分钟运行/apps/bin目录下的dbcheck.sh。

用/etc/cron.allow和/etc/cron.deny这两个配置文件可以指定哪些用户可以提交crontab文件。如果存在cron.allow文件,那么它将包含可以提交crontab的所有用户的名单,名单的每行一个用户。任何没被列出的用户都不能调用crontab命令。如果没有cron.allow文件,那么将检查是否有cron.deny文件,它也是一个用户的名单,但是意思却反过来了,除了名单中列出的用户之外,所有其他用户都允许访问crontab。如果即不存在cron.allow文件,也不存在cron.deny文件的话,那么在大多数系统上,就只有root用户才能提交crontab

故障排错:

1、修恢MBR故障:

故障原因:病毒、***等造成的破坏;不正确的分区操作、磁盘读写误操作

故障现象:找不到引导程序,启动中断;无法加载操作系统,开机后黑屏

解决思路:应提前作好备份文件;以RHEL6安装光盘引导进入急救模式;从备份文件中恢复

应用示例:

备份MBR扇区数据:

添加一块硬盘或U盘、创建好分区并挂载到一个指定的目录上(如:/data目录)

clip_image014

备份MBR:

clip_image016

模拟MBR被破坏的故障:dd if=/dev/zero of=/dev/sda bs=512 count=1

重启系统后,故障现象如下:

clip_image018

解决方法:

RHEL6光盘引导,进入急救模式:将RHEL6系统盘放入光驱,并设置光驱启动,选择下图打勾项以急救模式引导,这里我们选择 Rescue installed system RHEL6里有所改动,rhel5是需要输入linux rescue的

clip_image020

其他过程图略,如果是通过网络ftp传输挂载安装文件的,那么这里必须要启动网卡,光驱一类的外接设备则无需开启,这里我是无需开启的,我选择”NO”。

clip_image022

在rescue界面中选择”continue”按钮

clip_image024

clip_image026

这里选择 shell Start shell,这样就进入了急救模式

创建一个挂载点,挂载/dev/sdb1,并用mbr的备份恢复MBR信息,如图所示:

clip_image028

重启系统,一切就正常了。

2、 修复grup引导故障:

故障原因:MBR中的GRUB引导程序遭到破坏;grub.conf文件丢失、引导配置有误

故障现象:系统引导停滞,显示“grub>”提示符

解决思路:进入急救模式,从备份中恢复 grub.conf ;向MBR扇区中重建grub程序

应用示例:

最好先将grub.conf文件备份,以防止grub.conf损坏:如下图所示:

clip_image030

模拟破坏grup.conf文件,如删除grup.conf;重启系统,报错如下图:

clip_image032

解决方法:

RHEL6光盘引导,进入急救模式:将RHEL6系统盘放入光驱,并设置光驱启动,选择下图打勾项以急救模式引导。过程略,与MBR修复启动过程类似

进入急救模式命令符后,如果分区表并未被破坏,则急救模式将会找到硬盘中根分区并将其挂载到光盘目录结构中的”/mnt/sysimage”目录中。

clip_image034

执行#chroot / mnt/sysimage命令将目录结构切换到待修复的linux系统中,然后重建grub.conf文件或使用备份恢复grub.conf文件,如下图所示:

clip_image036

重启系统,一切都正常了。

如果是MBR中的引导程序出现损坏,可能在重建了grub.conf文件后仍无法成功启动系统,这时候可以在急救模式的shell环境中重新安装grub

注:执行”dd if=/dev/zero of=/dev/sda bs=446 count=1”命令可以模拟出对MBR扇区GRUB引导程序的破坏(注意先做好备份),但并不破坏分区表,实际上分区表保存在MBR扇区中的第447~510字节中。

向MBR扇区中重建GRUB程序

sh-3.1# chroot /mnt/sysimage

sh-3.1# cd /boot/grub/

sh-3.1# cp grub.conf.bak grub.conf (用备份恢复grub.conf文件)

sh-3.1# grub-install /dev/sda

sh-3.1#exit

sh-3.1#exit

3、 破坏/boot启动目录:

/boot目录中存放着与内核有关的引导文件(包括Grub,和kernel文件),若/boot目录被破坏系统将无法加载内核

模拟破坏/boot分区:#rm –fr /boot/* (最好先将grub.conf文件备份)

解决方法:

以急救模式引导系统,过程略。进入急救模式的shell命令符下

执行#chroot / mnt/sysimage命令将目录结构切换到待修复的linux系统中

clip_image038

可以看到/boot上什么也没有

那么,现在需要挂载光盘,来进行恢复;这里需要注意的是在rescue 模式下/dev/sr0 为光盘所在分区媒介,挂载目录至 /media (这里这个目录可自定义); 区别于rhel5 的rescue 光盘存放分区 ;进入光盘的Package目录,如下图所示:

clip_image040

安装内核的rpm包,如下图所示:

clip_image042

安装好后再查看 /boot/ 分区信息,但这里我们未发现 grub目录,这需要再安装grub引导目录,如下图所示:

clip_image044

安装完grub后,查看/boot/grub目录

clip_image046

但还没有grup.conf文件,要么手动创建,若有备份可以直接用备份恢复

clip_image048

系统在正常启动后要强制安装redhat-logos-60.0.14-1.e16.noarch.rpm包,否则rhel6启动时会报找不到rhel6的启动界面,并且在进单用户模式中输入1或s都是乱码,无法进入单用户模式。

按以上解决方法做完后,/boot启动目录的破坏就解决了,重启系统。第一次修复好系统后默认selinux会对系统进行相关参数的检测,所以修复后第一次启动系统是相当慢的,默认检测完后系统会重新启动,直至到用户登录界面,输入用户名密码登陆即可。

4、修复/etc/fstab文件:

/etc/fstab 这个文件,是系统安装时生成的文件,记录系统的磁盘和分区挂载信息,这里需要记住其文件格式才可以恢复,其他的文件包括内核都可以使用安装软件包来实现修复,所以这里该文件在安装好系统后最好做个备份,在破坏时也最好不要rm直接删除,可以通过修改其文件格式和文件名让该文件失效

rhel5里是指定LABEL来认系统挂载目录,rhel6中改用指定UUID(硬盘的ID号),可防止内核升级后硬盘挂载出错

若fstab文件被删除或误修改,会出现如下错误:

故障现象启动中提示 “... /etc/fstab: No such file or directory”系统停滞,无法完成初始化或

clip_image050

解决方法:

以急救模式引导系统,过程略。进入急救模式的shell命令符下;因为fstab文件丢失,系统不知道/ 挂载在什么地方

#chroot /mnt/sysimage

执行fdisk /dev/sda 查看分区情况,如下图所示:

clip_image052

可以看出/dev/sda1是启动分区,/dev/sda2应当就是根分区了

若根分区应用了lvm机制,解决方法如下:

在急救模式的shell环境中扫描逻辑组,激活逻辑卷以便找到根分区设备,然后手动挂载根分区,并重建fstab文件即可,如下图:

clip_image054

#vi /part/etc/fstab文件,修改其错误

clip_image056

若根分区就是基本linux分区,没有应用lvm,解决方法:使用fdisk –l /dev/sda查看分区情况,确定根设备分区,然后手动挂载根分区到一个自定义的目录上,重建或修改fstab文件即可

重启系统,第一次修复好系统后默认selinux会对系统进行相关参数的检测,所以修复后第一次启动系统是相当慢的,默认检测完后系统会重新启动,直至到用户登录界面,输入用户名密码登陆即可。

5、修复/etc/inittab文件

模拟故障:删除/etc/inittab文件和/etc/rc.d/rc.sysinit文件:

#rm –fr /etc/inittab

#rm –fr /etc/rc.d/*

注:/etc/rc.d目录中rcX.d中以K或S开头的文件都是相关系统服务的符号联接文件,若把rc.d下的所有内容删除的话即使启动故障解决了后,rcX.d也不会有这些文件。解决方法:系统正常启动后可以使用chkconfig –level nnn服务名 on|off或手动创建这些符号联接。

解决方法:以急救模式引导系统,过程略。进入急救模式的shell命令符下

#chroot /mnt/sysimage切换到侍修复的文件系统

Inittab的相关文件是由initscripts-xxxx.rpm软件包提供,如下图所示:

clip_image058

这里 rpm -qf 查询系统文件对应的安装包,rpm –ql initscripts 查询安装包对应生成哪些系统文件,查询后会发现initscripts-xxxx.rpm 生成很多系统关键文件,所以这里不能直接安装该包,需要对该包copy 出来,解压后,然后copy 需要的系统文件即可!

clip_image060

clip_image062

这里copy initscipts-9.03.17-1.el6.i686.rpm 至 /file 目录下,用rpm2cipo 指令通过管道cpio -imd解压该rpm包,解压后,会发现,这个文件内容都是/ 目录下关键的目录文件

clip_image064

6、root用户密码忘记:

解决方法1:以单用户模式登录,重新启动主机,在出现grub时按向上或向下按键,并定位要启动的系统,按e键进入编辑模式

定位到以ketnet开头的一行并安e键,在行尾添加数字1或字母s,就可进入单用模式。

进入单用户模式后,如果RHEL6的selinux开启的话会禁止passwd命令的运行,所以进入单用户模式后在执行passwd更改密码之前必须执行setenforce 0命令禁用selinux功能;然后执行passwd更改密码。最后再启用selinu能功setenforce 1

解决方法2:以急救模式引导系统,进入急救模式的shell下更改root的密码

7、 rpm数据库损坏

故障原因:非正常关机、误删除运行中的程序文件;RPM数据文件被误写或删除

故障现象:不能正常查询rpm包信息;无法安装、升级或卸载软件包等

解决思路:重建RPM数据库rpm --rebuilddb 或 rpm --initdb

模拟故障:

clip_image066

解决方法:

clip_image068