启动流程、grub配置及修复、initramfs修复


目录:

  1. centos启动流程

  2. grup配置及修复

    2.1 grub配置

    2.2 grub命令启动

    2.3 grub修复

  3. initramfs修复

  4. boot破坏修复



1.centos启动流程


   在centos5和6中启动流程如下:

(1).POST加电自检

硬件加电自检程序(安装在CMOS中的BIOS程序)BIOS负责检测硬件设备是否正常运行,如cpu、内存、硬盘、外接设备等是否正常,在生产中服务器内存较大,由多条内存组成较大内存的服务器,因此对内存的安装顺序等要严格的控制,不同品牌服务器要根据各自厂家的设计及要求进行安装。

BIOS初始化硬件后会关联硬盘分区格式, 如:新购PC机自带Windows10(GPT分区)系统修改为Windows7(MBR)系统时,将BOIS中boot菜单的boot mode默认格式UEFI修改为Legacy Support。因为不同的硬盘分区格式,需要不同的硬件启动程序支持。

(2).MBR主引导分区

在BIOS初始化硬件后,调动INT13硬件读取MBR信息,其中MBR在硬盘的第一个扇区,一个扇区大小为512byte,前446byte存储bootloader,64byte存储硬盘分区表,2byte存储硬盘标志位。但446byte不足以启动系统,因此会在MBR后面的扇区存储1.5阶段的引导启动程序,其中1.5阶段主要负责读取boot分区(存储内核、虚拟文件系统和grup的配置文件),真正的分区一般从第63个扇区开始进行分区。

系统引导分为三个阶段:

第1阶段:在MBR分区中,主要作用加载boot loader,进入1.5阶段;

第1.5阶段:主要作用加载/boot分区的文件系统驱动,进入文件系统;

第2阶段:主要作用通过/boot/grub/grub.conf配置文件进行加载内核等,其中在/boot/grub/*下只有grub.conf配置文件生效,其他都是第1阶段和1.5阶段的备份文件。

(3).Kernel、initrd/initramfs

在系统通过Boot loader引导进入boot分区后,先是通过grub.conf中的参数root (hd0,0)从第一块磁盘中的第一个分区进行读取数据,参数kernel/vmlinuz-2.6.32-696.el6.x86_64 ro root=/dev/sda2读取内核数据及真正加载根的为,参数initrd /initramfs-2.6.32-696.el6.x86_64.img读取初始化虚拟根系统(注意:一定要先读取内核,然后再读取虚根系统,因为只有加载内核后才能),然后加载启动过程中所定义的内核模块,最后释放虚根,切换为真实的根文件系统。

(4).init

当系统切换为真正的根后,系统从内核空间转到用户空间,执行第一个初始化程序/sbin/init,通过init初始化程序将用户空间预定义的启动级别进行执行/etc/rc.d/rc#.d/S*.sh脚本启动相关服务。


2.grub配置及修复


    grub配置文件存储位置为/boot/grub/*,其中在此目录下能够看到关于启动第1阶段、第1.5阶段、第2阶段的备份文件和grub的配置文件grub.conf


  2.1 grub配置文件

    grub配置文件通过参数的配置控制默认启动的菜单、菜单超时时间、单用户模式登录的密码、菜单的背景图片设置、引导boot的磁盘如hd0,0(第一块磁盘的第一分区),kernel的指定、initrd的指定等相关

[root@centos6 grub]# grub-crypt                    #对密码进行256位加密算法计算
Password:
Retype password:
$6$7KtGRwtyOq5ves0w$ujUp94VFUA0m8oeXN1/kF/mgzi5l0UPfdqox8fs0PeSIe0EfyyNJBkogOCSWI1P2XqVgTbH1hE2nJQRABJQFN0

[root@centos6 grub]# vim /boot/grub/grub.conf                                              

default=0                   #默认

timeout=5

splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz

password --encrypted $6$7KtGRwtyOq5ves0w$ujUp94VFUA0m8oeXN1/kF/mgzi5l0UPfdqox8fs0PeSIe0EfyyNJBkogOCSWI1P2XqVgTbH1hE2nJQRABJQFN0                       #经过加密后的密码,此密码是进入防止单用户的密码

hiddenmenu                                            有次密码,普通用户就无法进入单用户模式破解密码

title CentOS 6 (2.6.32-696.el6.x86_64)

    root (hd0,0)

    kernel  /vmlinuz-2.6.32-696.el6.x86_64 ro  root=UUID=/dev/sda2 rhgb quiet #rhgb是开机转圈的动作

    initrd  /initramfs-2.6.32-696.el6.x86_64.img                              #quiet内核启动隐藏显示

title CentOS 6 (4.6.32-696.el6.x86_64)    

    root (hd0,0)

    kernel  /vmlinuz-2.6.32-696.el6.x86_64 ro  root=UUID=/dev/sda2 quiet

    initrd  /initramfs-2.6.32-696.el6.x86_64.img

    password root0987                            #此密码是引导加载内核的密码也就是系统启动密码


 

2.2 grub命令启动

    在开机启动进入菜单后,按c命令进入grub提示符,在grub命令提示符下即可输入相关启动命令,启动系统只需4条指令root、kernel、initrd、boot,分别加载boot分区位置、内核位置、虚根位置,最后重新启动虚拟机即可完成通过命令加载系统,进入系统之后再选择编辑/boot/grub/grub.conf的文件

    第一步:输入"root (hd" 然后按两次 TAB 键出现磁盘块,选中需启动的磁盘,再按两次TAB键出现磁盘分区编号,选中boot分区所在的磁盘分区;

    第二步:输入"kernel /vm"然后按两次TAB键出现内核,再选中要选择启动的正根root=/dev/sda2

    第三步:输入"initrd /init"然后按两次TAB键出现虚根系统

    第四步:输入boot启动系统,完成加载系统

       GUN GRUB version 0.97 (635K lower /1046400K upper memory)                      

grub>kernel /boot/vmlinuz-2.6.15-26-386 ro dev=/dev/hda3          #启动内核参数

grub>initrd /boot/initrd.img-2.6.15-26-386                        #启动虚根参数

grub>root (hd0,0)                                                 #启动boot的位置

grub>boot           

                                                         (具体也可参考http://man.linuxde.net/grub)


2.3 grub修复

    grub修改有两种方法:

    第一种方法:重构grub引导程序

    在误删grub的第一阶段(446byte字节)、第1.5阶段或第三阶段的数据导致系统无法正常启动时,通过万能的方法重新构建新的grub引导程序,但是如若分区表64tyte删除则无法恢复,具体恢复如下令:

#!/bin/bash                                                                           

sh-4.1# grub-install /dev/sda                #安装grub程序到/dev/sda这块磁盘
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map /boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.

sh-4.1#reboot

#################################重启后指定引导配置文件进入系统####################################

         GUN GRUB version 0.97 (635K lower /1046400K upper memory)                      

grub>kernel /boot/vmlinuz-2.6.15-26-386 ro dev=/dev/hda3          #启动内核参数

grub>initrd /boot/initrd.img-2.6.15-26-386                        #启动虚根参数

grub>root (hd0,0)                                                 #启动boot的位置

grub>boot           

##################################登录系统重构配置文件##############################################

[root@centos6 grub]# vim /boot/grub/grub.conf                                              

default=0                   #默认

timeout=5

splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz

hiddenmenu                                          

title CentOS 6 (2.6.32-696.el6.x86_64)

    root (hd0,0)

    kernel  /vmlinuz-2.6.32-696.el6.x86_64 ro  root=UUID=/dev/sda2 rhgb quiet

    initrd  /initramfs-2.6.32-696.el6.x86_64.img                             


    第二种方法:利用备份文件恢复

    利用/boot/grub/*第1阶段的备份文件和第1.5的备份文件进行恢复,此种方法有效率相对较高无需进入救援模式

GUN GRUB version 0.97 (635K lower /1046400K upper memory) 

grub>setup (hd0)                                                #利用备份文件恢复             

grub>kernel /boot/vmlinuz-2.6.15-26-386 ro dev=/dev/hda3          #启动内核参数

grub>initrd /boot/initrd.img-2.6.15-26-386                        #启动虚根参数

grub>root (hd0,0)                                                 #启动boot的位置

grub>boot           


3.initramfs修复


    initramfs虚根系统是安装系统时,系统利用自身的命令生成相关的文件系统,如若此文件系统可以利用mkinitrd

##################################生成虚拟文件系统##################################################

[root@centos6 bak]#mkinitrd /boot/initramfs-$(name -r).img $(name -r)