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

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

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执行这个启动过程的桥梁: initrdnitramfs RHEL6已经启用了新的模式:用initramfs代替了initrd。下面咱们就来了解一下这两个的区别: linux

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

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

    initramfs的优势:      网络

  • tmpfs随着其中数据的增减自动增减容量。
  •  tmpfspage 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则去掉了上述假设,并且/initPID=1执行,由init装载根文件系统并用exec转到真正的/sbin/init,这样也致使一个更为干净漂亮的设计。 ide

 

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

咱们特别注意stage1这个文件的大小,发现他正好是512字节,咱们来看看这个文件的属性。这个文件颇有意思,是X86的启动扇区,GRand Unified BootloaderGRUB)。经过上面咱们能够得出这样一个结论,那就是(我我的认为)这个stage1就是MBR。因此说,Stage1是执行boot loader的主程序,它是安装在咱们的启动扇区。 测试

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

咱们在/boot/grub这个目录里面还能看到不少*stage1_5的文件是个过渡的一些内容,就像stage1stage2之间的桥梁。因此都是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. splashp_w_picpath=(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:init RHEL6 系统上的这个文件和之前的版本有很大的差异,目前这个文件只能设置运行级别,其它的相关配置文件,在此文件的注释中已经作了说明

更多的内容,你们能够到/etc/init/里面看看,从这个文件咱们已经看出,红帽已经使用新的Upstart启动服务来替换之前的initRHEL6的版本中,咱们能够把/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
、所有以SxxKxxxx为数字)开头
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回车。便可进入修复模式修复系统。

 

相关文章
相关标签/搜索