开机流程
要排查问题,首先要了解启动流程。我们先看一下centos6的开机流程:
1. POST加电自检
- ROM:一段只读的程序信息,叫做BIOS,Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等。
- RAM:CMOS互补金属氧化物半导体他保存各项参数的设定按次序查找引导设备,第一个有引导程序的设备为本次启动设备,通常设置启动硬盘就是在这里设置
2. 读取MBR
硬盘上第0磁道第一个扇区被称为MBR,也就是Master Boot Record,即主引导记录,它的大小是512字节,BIOS找到并读取MBR到内存中
3. boot loader
MBR中存放的一段小程序统称为boot loader,他有很多种,用来引导centos6用的是grub,这里也只说这种(注意:/boot/grub/stage*只是GRUB几部分内容的复制,真正起作用的还是直接放在磁盘扇区中的内容)grub一般分为3阶段:
- 1阶段:这个阶段为执行grub的主程序,MBR中的前446个字节存放的为grub程序的第一部分。
- 1.5阶段:这是个过度阶段,因为1阶段要识别boot分区的文件系统,而MBR只有512字节,放不下boot分区文件系统驱动,所以又在MBR之后的扇区中放入驱动,让MBR中的引导程序去读取,这就是1.5阶段。这个阶段文件是直接放在磁盘的MBR之后的扇区之内,大小为32K。
- 2阶段:加载boot分区文件系统的驱动后,就可以读取boot中的内容了,主程序在boot分区中将grub.conf文件加载,读取配置,然后加载内核
4. 内核初始化进程
- /sbin/init程序读取/etc/inittab,然后通过/etc/init/rc.conf和/etc/init/rcS.conf文件确定运行级别
- 读取/etc/rc.d/rc.sysinit初始化系统
- 读取/etc/rc.d/下的启动脚本,将他们映射为/etc/rc*.d/中的S开头的启动文件和K开头的结束文件
- 执行S99local收尾文件,这个文件不是启动脚本,而是可以放置启动脚本的一个文件,在这个文件中放的脚本不需要按照启动脚本的格式去写
问题处理
这里只从GRUB阶段开始,前面的阶段就不看了。
GRUB阶段
1阶段
1阶段出问题症状:不会进入GRUB菜单,如果没有挂光盘,就直接黑屏,挂上光盘后,会直接进入安装菜单(因为GRUB主程序被破坏,检测以为系统没有安装)
我们可以用dd if=/dev/zero of=/dev/sda bs=1 count=446
去破坏MBR中的GRUB,模拟出1阶段错误
恢复步骤:
-
开机进入安装界面,选取第三项Rescue救援模式
- 网络选择不启用,其他一律默认进入shell
- 切根
- 重新生成grub
-
exit;exit;
然后选择reboot重启
1.5阶段
1.5阶段出问题症状:有GRUB菜单,进来后卡黑屏
模拟环境:用dd if=/dev/zero of=/dev/sda bs=1 count=3000 skip=512 seek=512
来将MBR之后的扇区内容删除一些
处理步骤:
- 读条的时候按ESC进入Boot界面,然后选择第三项光盘启动
- 进入安装界面选择第三项救援模式
- 后边的步骤同1阶段处理流程,这里就不在写了
2阶段
2阶段有很多问题,我们先了解下boot目录下的必需文件作用,再去看问题。
-
/boot/initramfs-2.6.32-696.el6.x86_64.img
这个文件是一个被压缩的小型根目录,就是个假根,当内核需要挂载根文件系统时,需要相应的驱动模块,而这些模块是放在根文件系统中的,这样就没法玩了,所以先整一个假的根,他里边有挂载需要的模块之类的文件,把假根加载到内存中,然后加载必要的模块,之后再去挂载真正的根文件系统 -
/boot/vmlinuz-2.6.32-696.el6.x86_64
这个就是传说中的内核了,所以肯定要有啊 -
/boot/grub/grub.conf
这个配置文件用来指定假根,内核,需要挂载的根文件路径和内核一些参数,所以很重要,来看下这个文件内容:
default=0 #设置默认启动项,每个title是一个启动项,从0开始从上到下
timeout=5 #设置超时时间,这个时间内按ESC可以到GRUB菜单,超过这个时间就自动选择默认,设置为0表示直接进入菜单,不回车一直停在菜单里
splashimage=(hd0,0)/grub/splash.xpm.gz #选择GRUB菜单背景
passwd 密码 #由于直接进入单用户模式就可以修改密码,而进入单用户就是按a然后进入到这里加1就行的,所以需要加密
hiddenmenu #隐藏菜单,不写就不隐藏了
title CentOS 6 (2.6.32-696.el6.x86_64) #一个启动项,开头写title,后边可以自由发挥
root (hd0,0) #给下面的参数设置根
kernel /vmlinuz-2.6.32-696.el6.x86_64 rw root=UUID=6440d4c0-02ab-47ec-a9b4-1b0aaff0a757 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet #内核文件 root=根文件系统
initrd /initramfs-2.6.32-696.el6.x86_64.img #伪根文件路径
文件丢失对应的错误:
这里的问题都要进入救援模式
/boot/initramfs-2.6.32-696.el6.x86_64.img
丢失,过了GRUB菜单之后,卡黑屏,处理方法为在救援模式下输入mkinitrd /boot/initramfs-`uname -r`.img `uname -r`重新生成文件(注意这个文件是根据系统生成的,不能从别的地方复制过来就能用的)/boot/vmlinuz-2.6.32-696.el6.x86_64
内核丢失,报错信息为Error :File not found
,然后按回车又回到GRUB界面了,解决方法为进入救援模式,然后重新安装内核,或者复制一个过去,注意内核版本,别装错了/boot/grub/grub.conf文件没了,这个时候症状为直接进入到grub命令行界面,处理方式为进入救援模式写一份/etc/grub/grub.conf或者下面这个方法:
1.在GRUB命令行界面添加三行,如下
root (hd0,0) #hd0,0表示hda1,其他分区和盘的话按照顺序往下排就行
kernel /vmlinuz-2.6.32-696.el6.x86_64 #可以补全
initrd /initramfs-2.6.32-696.el6.x86_64.img #可以补全
2.输入boot
启动,然后进入/boot/grub/grub.conf中写入配置就行
- 整个/boot目录都没了,其实少的也就是上面提到那几个必须的文件目录。那就进救援模式将内核重新安装一下,(装RPM包会自带initramfs),然后重新生成grub,最后再把配置文件写上就OK。
初始化阶段排错
这个阶段有些服务可能会出问题,表现症状为卡在服务那里不动了或者报错failed,我们处理的思路为先进去,再去找这个服务的问题。
我们模拟下at服务的错误,在/etc/init.d/atd启动脚本中,前面加上一个sleep 100000
,让他睡很长时间
#!/bin/sh
sleep 10000
# atd Starts/stop the "at" daemon
这样启动时,就卡在了这里,这时候怎么办呢?
解决步骤如下:
- 1.到GRUB界面下,按a,进入命令行界面在后面追加
init=/bin/bash
,将第一个启动程序变成bash,这样就跳过了init读取文件然后加载启动脚本的过程
- 2.进入到shell后,重新挂载根文件系统,因为本身是只读的
- 3.用chkconfig将出问题的服务atd先设为禁用
- 4.重启,然后去再找atd服务的问题
初始化阶段和GRUB阶段都有问题
当/boot/目录和/etc/fstab文件都没了的时候,就比较麻烦了,因为救援模式是读取/etc/fstab文件中的内容去找根文件系统的,所以删掉/etc/fstab之后,进救援模式就会挂载不到根(之前是自动挂到/mnt/sysimage中的)
处理思路:先进入救援模式,然后blkid等命令查看分区,尝试挂载,找到根文件系统,在根文件系统中写一份/etc/fstab文件,然后再重启,之后的步骤就和之前说的恢复/boot目录一样了
步骤如下:
1.进入救援模式,不过会提示没有挂载根
2.blkid命令查看分区
3.然后创建一个目录,将每个分区都挂一下,看一下内容,找到根文件系统,然后创建/etc/fstab
内容如下:
4.重启之后,进入救援模式就看到根挂载上了
5.之后的过程和之前的恢复/boot就一样了
在逻辑卷的系统上删除/etc/fstab和/boot
当系统是放在逻辑卷中时,删除/etc/fstab和/boot又不一样了,启动是直接进入了GRUB命令行界面了,但是什么东西都没有,补全不能用,所以还是得进救援模式:
同样提示找不到根文件系统:
用blkid看不到根文件系统,只能看到/boot:
用lvdispaly查看,找到了root了,但是是不能使用的:
这是因为PV卷组没有启用,用
pvchange -ay
命令启动,然后再次查看,看到可以使用了
将根分区挂载到/lv0,查看内容,确认是跟分区
然后之后的步骤和前面的又一样了,不过要注意配置文件中的root路径记得要写逻辑卷的。