CentOS6和5启动流程

简述过程

一、CentOS  5和6的启动流程

linux内核: 存在于/boot分区,是整个操作系统的最底层,它负责整个硬件的驱动,以及提供各种系统所需的核心功能,包括防火墙机制、是否支持LVM或Quota等文件系统等等,如果内核不认识某个最新的硬件,那么硬件也就无法被驱动,你也就无法使用该硬件。
计算机真正工作的东西其实是硬件,例如数值运算要使用到CPU、数据储存要使用到硬盘、图形显示会用到显示适配器、音乐发声要有音效芯片、连接Internet 可能需要网络卡等等。内核就是控制这些芯片如何工作。
Linux的非核心驱动程序(大部分驱动程序,如网卡):存放于/lib/modules//lib/modules/VERSION-release.ko文件,支持内核模块的动态装载和卸载
modprobe 模块名 #装载模块
modprobe -r 模块名 #卸载模块
lsmod 模块名 #查看是否装载了模块
ramdisk:辅助伪文件系统,加载一些必要的驱动程序
Centos5: /boot/initrd-version-release.img
Centos6、7:/boot/initramfs-version-release .img

Centos6的启动
1.加载BIOS的硬件信息,获取第一个启动设备(在启动时需要配置bios)
2.读取第一个启动设备MBR的引导加载程序的启动信息我称之为grub的1阶段,MBR:也称为引导扇区,有446个字节的引导区和64个字节的分区表构成最后两个字节为55AA表示结束,没有特定的含义;当然,我们的操作系统是都是由一个个文件组成的,而文件是需要建立在文件系统之上的,如果没有文件系统,那么我们的文件将无法组织,而446个字节很显现不够存放一个文件系统的驱动,那么446个字节的作用是什么呢?这446个字节的引导区,称之为引导区,不如称之为一个指针(个人而言啊,并不官方),这446个字节指向了MBR后续的27个扇区,用来加载我们操作系统分区的文件系统,让我们在启动系统的时候可以识别最基本的/boot分区,这个阶段我称之为grub的1.5阶段,当加载完这27个扇区之后,我们就可以识别/boot分区下的文件系统了。这时进入引导的第2阶段系统会加载 /boot/grub/grub.cfg文件,并支持可操作的grub界面。

3.经历了grub的引导阶段,这时加载核心操作系统的核心信息,核心开始解压缩,进行自身初始化
4.探测可识别到的所有硬件设备,加载硬件驱动程序(借助于ramdisk加载驱动 Centos6为 initramfs)
5.从initramfs中chroot到真是的/下
6.运行用户空间的第一个应用程序:/sbin/init,并获取默认的运行信息
7.init程序执行/etc/rc.d/rc.sysinit文件
8.init执行运行的各个服务启动scripts
9.init执行/etc/rc.d/rc.local
10.执行/bin/login程序,等待用户登录
11.登录之后开始以Shell控制主机
POST –> Boot Sequence(BIOS) –> Boot Loader –> Kernel(ramdisk) –> rootfs –> switchroot –> /sbin/init –>(/etc/inittab, /etc/init/*.conf) –> 设定默认运行级别 –> 系统初始化脚本rc.sysinit –> 关闭或启动对应级别的服务 –> 启动终端
/etc/rc.d/rc.sysinit: 系统初始化脚本的工作流程
(1) 设置主机名
(2) 设置欢迎信息
(3) 激活udev和selinux
(4) 挂载/etc/fstab文件中定义的文件系统
(5) 检测根文件系统,并以读写方式重新挂载根文件系统
(6) 设置系统时钟
(7) 激活swap设备
(8) 根据/etc/sysctl.conf文件设置内核参数
(9) 激活lvm及software raid设备
(10) 加载额外设备的驱动程序
(11) 清理操作
二、运行级别
运行级别:为系统运行或维护等目的而设定;0-6:7个级别
0:关机
1:单用户模式(root自动登录), single, 维护模式
2: 多用户模式,启动网络功能,但不会启动NFS;维护模式
3:多用户模式,正常模式;文本界面
4:预留级别;可同3级别
5:多用户模式,正常模式;图形界面
6:重启
默认级别: 3, 5
三、故障分析和解决方法(记得启动时关闭selinux,否则你会悲剧的,启动的时候在grub内核加载环节中,在内核参数最后加入selinux=0):
1、initramfs文件被破坏的解决方法
ramdisk(initrd或initramfs)文件的制作,可以在光盘救援模式下进行:
(1) mkinitrd命令(内部实际调用的dracut命令
为当前正在使用的内核重新制作ramdisk文件
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
(2) dracut命令
为当前正在使用的内核重新制作ramdisk文件
dracut /boot/initramfs-$(uname -r).img $(uname -r)
2、MBR446个字节引导区被破坏(dd if=/dev/zero of=/dev/sda bs=1 count=446 ; sync),由下图可见系统已经无法正常引导

843117FE8F28438B9F1CC0600F8E078D

破坏MBR后的系统启动状态

05AF3522F479432394123349D65BC8CA

这是我们使用救援光盘,启动救援模式
系统提示,救援光盘已经扫描到了,我们服务器上已经存在的系统,并在之后挂载到/mnt/sysimage目录下

AE8A607FBE9F40DCAF1E8BBDC53A0EEA

首先我们需要把根切换到/mnt/sysimage/下,然后使用grub-install /dev/sda 重新安装grub

7EBA61D6A96244AB93A956CB7C03B140

我们使用hexdump 查看一下sda的MBR扇区是否已经恢复了。

1AA22F1BFF23498CBA63DAE3E61E04B8

系统已经可以正常启动了
3、内核丢失补救
现在我们把内核删了

60653CF567F54A2C85B5586B518B9BFD

因为系统已经启动,并且内核已经加载到了内存当中,所以先阶段,内核文件损坏不会影响到系统的运行,但是如果重启系统,系统将不能正常运行。下图为删除内核后提示错误信息

DFB7CB5942EC4712A5C8F330B47FA115

这种情况下,系统加载不到内核,单用户模式都无法启用,我们还是使用救援光盘来恢复
我们真正的系统存在路径在 /mnt/sysimage,因为内核丢失,所以我们需要重新安装内核,我们将光盘挂载到真正根的/mnt目录,并chroot到真正根目录下

0431182617E043C49EC6BF328FB571FA

重新安装内核

2C2B05D8A0CF4E3D8CB9BC34D7D7AA83

重启,系统可以正常启动了,但是注意一点,在生产环境中,如果有编译内核的需要,必须要做/boot目录的备份工作,如果定制的内核丢失,使用rpm的安装方式,修改一下grub.conf文件的内核指向,虽然依然可以正常使用,但是可能会导致系统的一些服务无法正常使用,而重新编内内核的话,但是当时编译时的选项忘记了怎么办。。这将是一个很纠结的问题,所以,备份备份!重中之重!
4、/etc/fstab 文件损坏的错误提示,和修复方法(我们依然使用删除的办法来破坏)

B7C4117E3CFA43A5B9F4D15F36FF2C72

重启系统

C4430BF8F8C8465288B6F01FA5FBDDBE

启动时按esc,可以很清楚的看到,第一条错误提示 /etc/fstab: open failed: No shuch file or directory ! 说明文件丢失,后面需要在磁盘上做的操作都做不了,在这里就卡住了。
解决方法:1、使用救援光盘,进入系统后重新编辑/etc/fstab文件
2、使用单用户模式进入,这时系统直接进入,不需要输入口令,但是系统值挂载了根,我们现在需要做的是,以读写的方式重新挂在根,并编辑/etc/fstab文件(这里我们使用第二种方法来操作!)
这时候我们根据下面提示,按e,进入grub的编辑模式

D248E97B905644DAAC8D3E7680039D5F

上下键移动到kernel再点e,编辑引导参数

00B829A11C2F4E33AEE373103A8275F0

在quiet后面输入1回车,按b键启动系统

77A35BF4DA3D4D8BB90C91E0CC6D13C9

图可见,系统只挂在了根分区,其他分区信息一概没有

6939FE50F31747DDA1248C256E1B092A

现在重新建立/etc/fstab文件,该文件必要的几条信息,就是根分区的信息和 /boot分区的信息还有swap分区,其他分区都是选填的(有的生产环境会为为home单独建立分区,该条目也必须填写,否则无法正常登陆普通用户),现在这种情况只能挨次挂载各个分区,查看其信息。输入blkid可以看到sda5是swap分区,那么这个就确认了,而系统启动sda2是根分区这个也是确认的,那么只差boot分区,一般boot分区都是磁盘的第一个分区,那么我们临时将sda1临时挂载在一个目录下,看一下里面的文件是否是boot的。

3496DBDBEF524E73AE24D3F52211E96E

挂载 /sda1到mnt下

414D58F5CDBF4C8990EC41C9A6229258

sda1为boot分区,现在信息已经确认,我们来修复/etc/fstab文件

3C53774CDC574708B348020B260303E5

提示文件系统只读,重新挂载一下根分区,再编辑文件

0A109711B7B844449654DAC73FFA4673

使用vim /etc/fstab编辑文件
在命令模式下输入r!blkid 将设备信息导入到编辑框内

3D6509638B244022BD327DAB35E33150

编辑后的fstab文件,现在我们重启系统

EE4CB2EC044F44EEBCD476F4D1F8DB07

系统已经可以正常启动了!修复fstab文件的问题已经解决。
如果系统使用的lvm的方式安装的,那么在挂在lv的时候需要使用vgchange -ay 来激活所有vg,然后才能挂在lv
5、整个boot目录损坏的恢复方法
由下图演示,我们已经破坏了真个boot分区,连文件系统都已经损坏了,毫无疑问,重启将无法启动,这时候我们使用光盘来恢复boot分区

325F06CF63A64BE39F95D45CAEAE687B

第一步先挂载光盘到/mnt/sysimage/mnt下(真实根的mnt目录下

D8A1E9217EB9457FB803710C55B7AB09

第二步chroot到真实的根

DBF9DC6C2AB54CA5A0A688BD1E280C39

第三步修复文件系统,并挂载到/boot下

803F6F241DB84BECAFE77406A02B29D7

安装kernel

34FF857967C5427FAF82217777F01C4F

kernel安装成功,但是initramfs生成失败,我们看一下问题,我想应该是重新制作的文件系统,在fstab中挂载的uuid变了

CB05D6EF15654F2888153217996654DC

修改fstab中记录,并重新生成initramfs文件

C63D20AB51F04D3682604CBC87219E68

重新安装grub,并编辑grub.conf

292FE63DA6F04D9EB5334759992EDA86

default 0 : 默认为0选项
timeout 3 : 3秒自动加载系统
hiddenmenu 隐藏菜单
kernel:加载内核 root为根分区的uuid或者使用设备名也行,建议使用uuid
initrd :指定initramfs文件
修复grub引导

489CAEFE8C714C7AA73150D173E6755D

安装失败,这个问题我暂时没有找到,但是/boot/grub/下的引导文件已经安装好了,如果系统起不来可以在grub命令行界面安装grub的1.5阶段

8548365D369E46EF8CFB142645EC4943

1.5引导阶段的数据安装成功,hd0,0为引导分区,即boot分区,如果/boot/grub/grub.conf文件配置正确的话,将可以正常启动了。
6、系统,/sbin/init文件被破坏
init文件依赖upstart安装包,重新安装这个包就行了,进入救援模式或者在grub菜单界面按e修改内参数,在quiet 后面添加 init=/bin/bash,用bash来代替init,这样我们便可以进入命令行使用一些基础的命令来操作了,下面是操作步骤
直接清空/sbin/init文件的内容,然后重启,到grub引导界面,我们修改内核参数 在quiet后面添加 init=/bin/bash 回车并按B键启动

21A5D8C90BC74E7D90CAD021FB1FE610

挂载光驱到/mnt下

2995EFBB6A9942BAB3664574C7F23B12

尝试安装 upstart包

7530E8481EFC4B7EB397AE84FDA0939F

安装成功了,重启系统,可以正常启动了。
7、如果一些配置文件丢失或软件误删除,且无备份,可以通过重新安装软件包来恢复,例:
首先查找到/etc/inittab属于哪一个RPM包
chroot /mnt/sysimage
rpm -qf /etc/inittab
initscripts-9.03.49-1.el6.centos.x86_64

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/99002

(2)
上一篇 2018-05-20 17:46
下一篇 2018-05-20 17:55

相关推荐