Centos6系统启动流程

Centos6系统启动流程

一、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. (1) 设置主机名
  2. (2) 设置欢迎信息
  3. (3) 激活udev和selinux
  4. (4) 挂载/etc/fstab文件中定义的文件系统
  5. (5) 检测根文件系统,并以读写方式重新挂载根文件系统
  6. (6) 设置系统时钟
  7. (7) 激活swap设备
  8. (8) 根据/etc/sysctl.conf文件设置内核参数
  9. (9) 激活lvm及software raid设备
  10. (10) 加载额外设备的驱动程序
  11. (11) 清理操作

二、运行级别

运行级别:为系统运行或维护等目的而设定;0-6:7个级别
0:关机
1:单用户模式(root自动登录), single, 维护模式
2: 多用户模式,启动网络功能,但不会启动NFS;维护模式
3:多用户模式,正常模式;文本界面
4:预留级别;可同3级别
5:多用户模式,正常模式;图形界面
6:重启
默认级别: 3, 5

三、故障分析和解决方法(记得启动时关闭selinux,否则你会悲剧的,启动的时候在grub内核加载环节中,在内核参数最后加入selinux=0):

1、initramfs文件被破坏的解决方法

  1. ramdisk(initrd或initramfs)文件的制作,可以在光盘救援模式下进行:
  2. (1) mkinitrd命令(内部实际调用的dracut命令
  3. 为当前正在使用的内核重新制作ramdisk文件
  4. mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
  5. (2) dracut命令
  6. 为当前正在使用的内核重新制作ramdisk文件
  7. dracut /boot/initramfs-$(uname -r).img $(uname -r)

2、MBR446个字节引导区被破坏(dd if=/dev/zero of=/dev/sda bs=1 count=446 ; sync),由下图可见系统已经无法正常引导

破坏MBR后的系统启动状态

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

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

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

系统已经可以正常启动了

3、内核丢失补救
现在我们把内核删了

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

这种情况下,系统加载不到内核,单用户模式都无法启用,我们还是使用救援光盘来恢复

我们真正的系统存在路径在 /mnt/sysimage,因为内核丢失,所以我们需要重新安装内核,我们将光盘挂载到真正根的/mnt目录,并chroot到真正根目录下

重新安装内核

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

4、/etc/fstab 文件损坏的错误提示,和修复方法(我们依然使用删除的办法来破坏)


重启系统


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

这时候我们根据下面提示,按e,进入grub的编辑模式

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

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

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

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

挂载  /sda1到mnt下

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

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

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

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

系统已经可以正常启动了!修复fstab文件的问题已经解决。
如果系统使用的lvm的方式安装的,那么在挂在lv的时候需要使用vgchange -ay 来激活所有vg,然后才能挂在lv

5、整个boot目录损坏的恢复方法
由下图演示,我们已经破坏了真个boot分区,连文件系统都已经损坏了,毫无疑问,重启将无法启动,这时候我们使用光盘来恢复boot分区

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

第二步chroot到真实的根

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

安装kernel

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

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

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

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

修复grub引导

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

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键启动

挂载光驱到/mnt下

尝试安装 upstart包

安装成功了,重启系统,可以正常启动了。

7、如果一些配置文件丢失或软件误删除,且无备份,可以通过重新安装软件包来恢复,例:

首先查找到/etc/inittab属于哪一个RPM包
chroot /mnt/sysimage
rpm -qf /etc/inittab
initscripts-9.03.49-1.el6.centos.x86_64

原文地址:https://www.cnblogs.com/momenglin/p/8483133.html