rhel6系统启动过程故障排错处理

http://chaorenyong.blog.51cto.com/2163445/1048194

解析Linux系统开关机流程,让你游刃有余的掌握在系统启动过程过的任何错误,让你真正把握整个Linux系统,让你成为系统管理员中故障排错解除的佼佼者。掌握了这门技术的管理,能在短时间内判断出系统故障产生的原理,从而快速找到故障点,并轻松解决,为企业节省大量的人力和物力,减少大量不必要损失。

RHEL6的系统开机的过程:
    • 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);
    • 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;
    • 加载终端或X-Window接口。

 

  • boot loader的作用就是载入内核

    boot loader装入kernel,然后kernel需要执行/sbin/init,读取这个文件就必须先mount根文件系统,早期是通过启动时的root="参数"告诉内核根文件系统在哪个设备上,随着硬件和技术的发展,现在根文件系统可能位于一个网络存储如NFS上,可能由于RAID而散布于多个设备上,可能位于一个加密设备上需要提供用户名和密码,这时root="参数"就显得不够了。为了应付这种局面,先后出现两种机制来作为boot loader装载kernel到真正的/sbin/init执行这个启动过程的桥梁: initrd和nitramfs 。RHEL6已经启用了新的模式:用initramfs代替了initrd。下面我们就来了解一下这两个的区别:

    initrd: ram disk是一个基于ram的块设备,因此它占据了一块固定的内存,而且事先要使用特定的工具比如mke2fs格式化,还需要一个文件系统驱动来读写其上的文件。如果这个disk上的空间没有用完,这些未用的内存就浪费掉了,并且这个disk的空间固定导致容量有限,要想装入更多的文件就需要重新格式化。由于Linux的块设备缓冲特性,ram disk上的数据被拷贝到page cache(对于文件数据)和dentry cache(对于目录项),这个也导致内存浪费。

    initramfs: 最初的想法是Linus提出的: 把cache当作文件系统装载。 他在一个叫ramfs的cache实现上加了一层很薄的封装,其它内核开发人员编写了一个改进版tmpfs,这个文件系统上的数据可以写出到交换分区,而且可以设定一个tmpfs装载点的最大尺寸以免耗尽内存。initramfs就是tmpfs的一个应用。Linux 2.6 kernel提出了这种新的实现机制,即initramfs。顾名思义,initramfs只是一种RAM filesystem而不是disk。

    initramfs的优点:      

  • tmpfs随着其中数据的增减自动增减容量。
  •  在tmpfs和page cache/dentry cache之间没有重复数据。
  •   tmpfs重复利用了Linux caching的代码,因此几乎没有增加内核尺寸,而caching的代码 已经经过良好测试,所以tmpfs的代码质量也有保证。
  • 不需要额外的文件系统驱动。

另外,initrd机制被设计为旧的"root="机制的前端,而非其替代物,它假设真正的根设备是一个块设备,而且也假设了自己不是真正的根设备,这样不便将NFS等作为根文件系统,最后/linuxrc不是以PID=1执行的,因为1这个进程ID是给/sbin/init保留的。initrd机制找到真正的根设备后将其设备号写入/proc/sys/kernel/real-root-dev,然后控制转移到内核由其装载根文件系统并启动/sbin/init.initramfs则去掉了上述假设,而且/init以PID=1执行,由init装载根文件系统并用exec转到真正的/sbin/init,这样也导致一个更为干净漂亮的设计。

 

了解/boot/grub这个目录里面的内容

我们特别注意stage1这个文件的大小,发现他正好是512字节,我们来看看这个文件的属性。这个文件很有意思,是X86的启动扇区,GRand Unified Bootloader(GRUB)。通过上面我们可以得出这样一个结论,那就是(我个人认为)这个stage1就是MBR。所以说,Stage1是执行boot loader的主程序,它是安装在我们的启动扇区。

Stage2这个文件会加载/boot/grub/grub.conf这个文件。

我们在/boot/grub这个目录里面还能看到很多*stage1_5的文件是个过渡的一些内容,就像stage1到stage2之间的桥梁。所以都是stage1_5(就如同1--->1.5--->2 一样)。这些文件都是一些针对不同的文件系统格式的识别文件。

device.map记录grub安装在哪个磁盘上;

splash.xpm.gz就是系统在开机时grub底下的背景图了;

下面就是GRUB与开机顺序的关系

1)         BIOS将控制权交给硬盘的主引导区,即MBR。

2)         MBR中的bootloader(stage1)通过内置的地址加载*stage1_5。

3)         bootloader通过*stage1_5的内容,将分区中的stage2加载。

4)         stage2此时就可以在文件系统中将grub.conf文件加载,让用户看到选项界面。

  1.  [root@station ~]# cat /boot/grub/grub.conf 
  2. default=0
  3. timeout=5
  4. splashimage=(hd0,0)/boot/grub/splash.xpm.gz  #背景
  5. hiddenmenu
  6. title Red Hat Enterprise Linux 6 (2.6.32-131.0.15.el6)
  7. root (hd0,0)
  8. kernel /boot/vmlinuz-2.6.32-131.0.15.el6.i686 ro  root=/dev/sda1  rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD quiet  crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM

initrd /boot/initramfs-2.6.32-131.0.15.el6.i686.img

 

rhgb指的是图形化显示启动过程,quiet表示的是静态化启动(有些信息就被屏蔽掉了)。如何查看硬盘分区的UUID,我们可以通过dumpe2fs /dev/sda1 |more来查看。

 

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

在内核加载完毕、进行完硬件检测与驱动程序加载后,此时主机硬件已经准备就绪了,这时候内核会主动的呼叫第一支程序,那就是 /sbin/init

/sbin/init 最主要的功能就是准备软件执行的环境,包括系统的主机名、网络设定、语言、文件系统格式及其他服务的启动等。 而所有的动作都会通过 init的配置文件/etc/inittab来规划,而inittab 内还有一个很重要的设定内容,那就是默认的 runlevel (开机运行级别)。

先来看看运行级别Run level

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

 

[root@station ~]# cat  /etc/inittab 
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# 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.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
id:3:initRHEL6系统上的这个文件和以前的版本有很大的差别,目前这个文件只能设置运行级别,其它的相关配置文件,在此文件的注释中已经做了说明

更多的内容,大家可以到/etc/init/里面看看,从这个文件我们已经看出,红帽已经使用新的Upstart启动服务来替换以前的init在RHEL6的版本中,我们可以把/etc/init/这个目录里面的内容,看成是以前/etc/inittab这个文件里的拆分。

/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文件中default:

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

 

随着Red Hat Enterprise Linux(RHEL)6的发布,红帽将使用新的Upstart启动服务来替换以前的init。原有的System V init启动过程的缺点是,它基于包含了大量启动脚本的runlevel目录。而Upstart则是事件驱动型的,因此,它只包含按需启动的脚本,这将使启动过程变得更加迅速。经过良好调优并使用Upstart启动方式的Linux服务器的启动速度要明显快于原有的使用System V init的系统。

为了使Upstart更容易理解,它仍然使用了一个init进程。所以,你仍然可以看到/sbin /init,它是所有服务的根进程。但是,如果你看一下文件/etc/inittab,你会发现一切都变了。

RHEL 6对启动过程的改变很少。你还是可以处理那些在目录/etc /init.d中的包含服务脚本的服务,所以runlevel的概念一直存在。因此,在使用yum增加一个服务后,照样可以像以前那样使用 chkconfig命令激活它。此外,仍然可以用service命令来启动它。

但如果你要查找以前应用在/etc/inittab中的设定,你会发现很多都已经变了。唯一没变的是对服务器默认运行级别(runlevel)设定的这一行:

id:5:initdefault:

所有先前由/etc/inittab中处理的条目,现在都在目录/etc/init中以单个文件的形式存在(不要与目录/etc/init.d混淆,/etc/init.d中包含的是服务脚本)。以下是一个你要使用的脚本的简短列表:

1)         etc/init/rcS.conf 
通过启动大部分的基本服务来对系统进行初始化的设定

2)         /etc/init/rc.conf 
对启动各自的运行级别(runlevel)的设定

3)         /etc/init/control-alt-delete.conf 
定义当用户按“control-alt-delete”三个键时的系统行为

4)         /etc/init/tty.conf and /etc/init/serial.conf 
定义了系统处理终端登录的方式

在RHEL6中使用ctrl+alt+F1切换至图形化界面,使用ctrl+alt+F2~ctrl+alt+F6切换虚拟文本控制平台。

除了这些通用的文件,在文件/etc/sysconfig/init中还有一些额外的配置。在这里,定义了一些参数来决定启动信息的格式。除了那些不很重要的设置,有三行我们需要注意: 
AUTOSWAP=no 
ACTIVE_CONSOLES=/dev/tty[1-6] 
SINGLE=/sbin/sushell 

其中,第一行的值你可以设定为Yes,这样可以让你的系统能够自动检测交换分区。使用此选项意味着你再也不必在/etc/fstab中挂载交换分区了。在ACTIVE_CONSOLES这一行决定了虚拟控制台的创建。在大多数情况下,tty[1-6]工作得很好,同时这个选项也允许您分配更多或者更少的虚拟控制台。最后很重要的一行是single=/sbin/sushell。这一行可以有两个参数:/sbin/sushell(系统默认的参数),它会在启动单用户模式时将你带入一个root的 shell,参数/sbin/sulogin会在单用户模式启动之前弹出一个登录提示,你必须输入root账户的密码才能继续下去。RHEL 6通过将System V替换为Upstart加快了其启动速度。采用了这项新服务,红帽仍然可以向下兼容地保持以前的管理方式,这就意味着,作为管理员,你仍可以使用原来的方式来管理服务。

系统服务的启动

经过 /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 来完成。这就是我们要讲的用户自定义开机启动脚本。我们只要把想启动的脚本写到这个文件中,开机就能启动了,注意一点,写在这里面的脚本要使用绝对路径。

 

了解RHEL6的启动流程后,我们可以开始进行排错实验了。每个学员新建一台虚拟机,通过网络引导后,看到如下启动界面,选中troubleshooting菜单会开始自动安装一个RHEL6的系统,这个系统预先设置了很多错误,装好后将无法正常启动。学员要根据RHEL6的启动过程分析和相应提示进行排错。

系统启动流程常见错误

系统启动过程出现的错误多种多样,有硬件坏了。有系统问题

这里总结了下系统出现的常见问题

第一阶段:

MBR里面的引导管理器(IPL, Initial Program Loader)grub损坏。

第二阶段:

l  stage1.5, stage2损坏。

l  找不到grub.conf

l  找不到kernel

第三阶段:

l  找不到initramfs.img

l  fstab分区挂载失败

l  磁盘卷标不匹配或丢失

第四阶段:

l  inittab初始化脚本失败

l  图形界面加载失败

l  服务进程错误

使用救援模式修复你的系统

TrobuleShooting有很多时候需要在修复模式下对系统进行修复。把安装光盘放入光驱,重启电脑,选择从光驱启动。选中Rescue installed system回车。即可进入修复模式修复系统。

 

你可能感兴趣的:(rhel6系统启动过程故障排错处理)