CentOS 6开机启动流程实验篇


  • centos 系统的启动流程

  • grub

  • 破坏Linux的核心文件再修复体验系统启动流程


CentOS 6开机启动的具体详情请参见理论篇!

了解了系统启动的基本流程,以下我们通过“破坏式实验”,即破坏系统启动过程中的一些关键环节,使系统无法启动,然后我们再通过修复这些文件使得系统正常重启,进而体验Linux系统的启动流程,这些关键环节包括破坏grub三个stage(stage1、stage1-5、stage2) 中的任何一个阶段,甚至是整个grub; 还有挂载文件/etc/fstab,内核文件vmlinuz, 系统引导时需要加载的驱动程序文件initramfs以及MBR中的相关信息等。

接下来开始实验,建议提前备份相关文件或给系统先做快照!

  1. 破坏MBR中的前446bytes,即stage1

  2. 破坏MBR之后的扇区,即stage1-5

  3. 删除整个grub文件(stage2随即也被删除)

  4. 删除用户空间的第一个进程: /sbin/init

  5. 删除/boot目录

  6. 删除initramfs文件

  7. 删除/boot及/etc/fstab

  8. 在逻辑卷的系统上删除/boot及/etc/fstab

见CentOS 6开机启动流程实验篇

1.破坏MBR中的前446bytes,即stage1

[root@centos6 ~]#dd if=/dev/zero of=/dev/sda bs=446 count=1   #破坏MBR中的bootloader,即stage1
1+0 records in
1+0 records out
446 bytes (446 B) copied, 0.00123036 s, 362 kB/s
[root@centos6 ~]#

CentOS 6开机启动流程实验篇_第1张图片

此时重启系统,发现系统直接进入了光盘引导模式

CentOS 6开机启动流程实验篇_第2张图片

分析:开机直接进入了光盘引导模式,说明系统的开机时经过了POST-->BIOS, 却在系统引导时出现的问题,这属于grub的事,我们只需重新安装grub即可。

进入救援模式,重新安装grub:

可在上面那个界面直接选择Rescue救援模式,也可重装启动系统,按ESC键,选择CD-ROM再进入。

CentOS 6开机启动流程实验篇_第3张图片

CentOS 6开机启动流程实验篇_第4张图片

CentOS 6开机启动流程实验篇_第5张图片

查看下磁盘的挂载与分区是否正常,如果正常则直接重装grub,注意重装grub解决不了分区表被破坏的情况,这是两码事,所以给系统提前备份分区表很重要!

CentOS 6开机启动流程实验篇_第6张图片

CentOS 6开机启动流程实验篇_第7张图片

修复:重建grub

CentOS 6开机启动流程实验篇_第8张图片

重启:

wKioL1ffhH_gYc6WAAAEtAd1N5c602.png

正常的开机启动画面,而不是直接进入了光盘引导界面!

CentOS 6开机启动流程实验篇_第9张图片

CentOS 6开机启动流程实验篇_第10张图片

小结:如果stage1被破坏,系统认为硬盘无法启动,故而系统会直接进入光盘引导模式,也不会进入grub错误的界面,因此此时系统根本就无法启动,只能进入救援模式!进入之前如果提示chroot /mnt/sysp_w_picpath,则表示/etc/fstab文件是正常的.

2.破坏MBR之后的扇区,即stage1-5

[root@centos6 ~]#dd if=/dev/zero of=/dev/sda bs=512 count=2 seek=1
2+0 records in
2+0 records out
1024 bytes (1.0 kB) copied, 0.00508186 s, 202 kB/s
[root@centos6 ~]#

重启:发现屏幕一直卡在了黑色界面

CentOS 6开机启动流程实验篇_第11张图片

好吧,手动进入救援模式然后重建grub!

重建grub后可查看/dev/sda上的前1024字节

CentOS 6开机启动流程实验篇_第12张图片

此时重启系统就正常启动了!

小结:如果stage1.5被破坏,则系统启动过程中会黑屏,一直卡着,也不会进入光盘引导模式,因为stage1未被破坏,则系统认为可以从硬盘启动,成功地进行了stage1,当进行stage1.5时发现stage1.5被破坏,系统就无法正常启动下去,无法找到相应的驱动,就一直黑屏卡着不去。此时若想恢复系统,就手动进入救援模式,然后重建grub.

其实,安装grub有两种方法,此处选择是的简单高效的一种:

安装grub:
(1) grub-install安装grub stage1和stage1_5到/dev/DISK磁盘上,并复制GRUB相关文件到DIR/boot目录下
grub-install --root-directory=DIR /dev/DISK
(2) grub
grub> root (hd#,#)grub> setup (hd#)

其中,grub-install 命令的选项--root-directory是指要安装到哪个目录下,/dev/DISK就是指要安装在哪个设备上,如:

grub-install --root-directory=/mnt/boot /dev/sda

在上面的两个例子中,我们省略了--root-direcoty=,因为我们上在本机上重装grub,当可省略,这里注意,最后挂载点的目录名称,一定是boot, 因为grub在安装的时候,它会去找boot目录,如果找不到则报错,当我们把盘挂载到boot之后,可以认为,该盘的名字就叫boot,所以,它会在该盘内写入bootloader,以引导系统。

而用grub命令安装grub时,root (hd#,#) 表示第#-1个设备的第#-1个分区,因为磁盘分区的编号是从0开始的。

root (hd0,0) 表示第一个磁盘的第一个分区

且grub命令的重装grub时,会依赖/boog/grub目录下的相关文件,而grub-install命令不会依赖,故而建议用grub-install的方式重装grub。

3.删除整个grub文件(stage2随即也被删除)

删除整个grub文件时,建议先备份一下再删除!

[root@centos6 ~]#cp -r /boot/grub .
[root@centos6 ~]#rm -rf /boot/grub
[root@centos6 ~]#

/boot/grub目录里面都有哪些文件,以及grub.conf里面的内容解释请看上文的关键词解释部分,此处不再赘述。

重启时我们发现 Error 15 字样

CentOS 6开机启动流程实验篇_第13张图片

照样手动进入救援模式先重装grub,因为删除了grub文件,grub肯定是被破坏了!

此时我们在重装grub时发现“分区表签名”的问题,可忽略!

CentOS 6开机启动流程实验篇_第14张图片

我们进入grub目录可查看grub下的文件是否全部恢复:

CentOS 6开机启动流程实验篇_第15张图片

发现少了grub.conf文件,没有grub.conf文件,系统在启动时也就无法加载内核,当然启动不成功,故而我们此时可以选择手写一份grub.conf文件,永久有效,也可选择重启,此时系统会进入grub> 模式,在grub> 模式里面我们也可以以命令的形式给出系统内核文件存放的位置、内核的名称及核心参数,以及虚拟文件系统initrd, 但仅对本次启动有效,下次启动时还得书写一次!

此时我们选择直接在grub目录里面书写:

CentOS 6开机启动流程实验篇_第16张图片

如果是在grub> 模式,可以这么写:

CentOS 6开机启动流程实验篇_第17张图片

小结:grub-install只能重装grub的stage1与stage1-5,无法恢复grub.conf文件,即无法完全重装stage2,故需要我们牢记grub.conf文件的六项基本条例,以便正常恢复系统,当然备份最好。

4.删除用户空间的第一个进程: /sbin/init

/sbin/init是用户空间的第一个进程,是一个二进制文件,我们无法书写,删除之前备份,恢复思路是将备份init恢复到/sin目录下。

[root@centos6 ~]#cp /sbin/init .
[root@centos6 ~]#rm -f /sbin/init
[root@centos6 ~]#

重启:

CentOS 6开机启动流程实验篇_第18张图片

重启后我们直接进入了switching root模式,发现命令都无法执行,其实很容易理解,/sbin/init都被删除了还怎么执行命令!

此时的系统其实已经经历了POST-->BIOS-->MBR-->GRUB--加载内核阶段,但当启动init进程时却无法启动了,系统进入了switching root模式,却什么也干不了!那么我们的思路可以这么来:既然init启动不了,我们就想办法让其启动,一般地,init 默认执行的是/sbin/init,既然/sbin/init被删除了,那么我们就把/sbin/init替换为/bin/bash,也就是说,将用户空间第一个进程init使其启动为/bin/bash,然后利用bash命令将备份的init文件恢复到/sbin目录下即可。

启动过程中修改内核参数可以进入grub修改,也可以在启动菜单的选项下修改(进入单用户模式或直接按a键修改内核参数), 我们选择直接在启动菜单下按a键添加内核参数:init=/bin/bash

在进入bash模式时,需要重新以读写方式挂载根/.

而且这一过程也用不着进入救援模式,但是这一方法有时在添加完内核参数并重启时系统卡在某个地方,往往是由于某个服务起不来而导致的,此时只需进入单用户模式将上此服务用chkconfig命令off掉即可。因为单用户模式并不依赖很多服务就可进入!

[root@centos6 ~]#cp /sbin/init .
[root@centos6 ~]#rm -f /sbin/init
[root@centos6 ~]#

CentOS 6开机启动流程实验篇_第19张图片

然后我们重启就可以了!

别外,进入救援模式自然屡试不爽,直接将备份的init文件恢复到/sbin目录下就完事,且不用担心由于某服务没起来而卡住的现象!

自然,如果系统初始化脚本/etc/rc.d/rc.sysinit被删除了,亦可通过同样的方法找回,有人说没备份咋办,呵呵,那就找相同配置的另一机器吧!

删除系统初始化脚本:/etc/rc.d/sysinit

删除之前要备份!

重启:

CentOS 6开机启动流程实验篇_第20张图片

尝试进单用户模式修复:

CentOS 6开机启动流程实验篇_第21张图片

5.删除/boot目录

/boot目录里面的文件最重要的文件有两个:vmlinuz,grub

wKioL1ffhmzAaYczAABHDbky2sA237.png

[root@centos6 ~]#umount /boot
[root@centos6 ~]#rm -rf /boot
[root@centos6 ~]#

重启:这个错误类型是不是有点熟悉的味道。。。跟破坏了stage2的错误一样!

CentOS 6开机启动流程实验篇_第22张图片

分析:既然整个/boot目录都被删除了,而/boot目录下最重要的文件是vmlinuz与grub,于是我们先恢复这两个文件看看。/boot下的其它文件在安装kernel时会自动生成!

另外,既然这个错误跟stage2一样,那么说明即便删除整个/boot目录,也能成功地进行stage1与stage1-5,这是因为stage1在MBR中,而stare1-5在MBR后面的扇区上,stage2是在磁盘上!

第一:先恢复vmlinuz,rpm安装kernel包

CentOS 6开机启动流程实验篇_第23张图片

第二: 恢复grub, 直接grub-install /dev/sda,然后再书写grub.conf文件即可

6.删除initramfs文件

删除了initramfs文件,这个文件是在加载内核的时候要用到的,而且上一个实验也证明了在安装kernel时此文件会自动生成,要想恢复此文件则重新安装kernel即可,反正也不费事;当然,initramfs这种重要的文件还有有命令可以生成的!

mkinitrd /boot/initramfs-`uname -r`.img   `uname -r`
[root@centos6 ~]#rm -f /boot/initramfs-2.6.32-642.el6.x86_64.img 
[root@centos6 ~]#

重启:又是熟悉的味道。。。跟破坏了stage1-5的错误一样

CentOS 6开机启动流程实验篇_第24张图片

由启动错误可知,initramfs是与stage1-5相关的!

CentOS 6开机启动流程实验篇_第25张图片

如此,系统也可正常启动!

7.删除/boot及/etc/fstab

[root@centos6 ~]#umount /boot
[root@centos6 ~]#rm -rf /boot
[root@centos6 ~]#rm -f /etc/fstab
[root@centos6 ~]#

相信有了以上实验,这个已经没多大难度了,恢复/boot就是恢复vmlinuz与grub,然后再书写一个挂载文件即可/etc/fstab即可。

重启:

CentOS 6开机启动流程实验篇_第26张图片

这个错误太熟悉不过了吧,stage2被破坏了,stage1在MBR中,stage1-5在MBR后面的扇区中,跟删除/boot目录没关系。

进入救援模式:

CentOS 6开机启动流程实验篇_第27张图片

CentOS 6开机启动流程实验篇_第28张图片

由此可见,系统的挂载关系已经被破坏,我们根据上面的提示,写好挂载配置文件/etc/fstab后重启系统,让系统自动挂载,然后再重新进入救援模式,恢复/boot目录!

在写挂载配置文件之前,我们必须要知道/boot在哪个位置上,此时df命令已经不行了,此时我们可用fdisk -l来查看, 而根在哪个分区上,fdisk -l 命令是不容易看出来的,我们只能通过“试”的方法:多创建个几个目录,如/mnt/sda#,然后分别挂载除/boot即引导分区以外的其它几个分区!直至找到为止;另外,我们还得知道文件系统类型,我们可用bldid命令来获取!

CentOS 6开机启动流程实验篇_第29张图片

CentOS 6开机启动流程实验篇_第30张图片

CentOS 6开机启动流程实验篇_第31张图片

此时,我们已经知道根在/dev/sda2上,而/boot在/dev/sda1上,且文件系统类型为ext4,OK,我们来书写/etc/fstab吧,然后重启让系统自动挂载之!

注意:此时的/etc/fstab在/mnt/sda2上,即路径为:/mnt/sda2/etc/fstab

但当我们书写系统挂载配置文件时发现:

wKioL1ffh96yvAD8AAAECp5qK-8015.png

wKioL1ffh_PAJNCHAAADlkx7oiA883.png

错误很明显,路径错了!注意设备的挂载。

wKiom1ffiAajS6CmAAAHAb-uBUE169.png

挂载关系好了之后再重启系统让其自动挂载:

CentOS 6开机启动流程实验篇_第32张图片

挂载关系无误后就可以安装kernel并重装grub了:

8.在逻辑卷的系统上删除/boot及/etc/fstab

两样地,如何系统是逻辑卷分区的,当删除/etc/fstab后在救援模式下也是无法查看具体的分区情况的,在做实验之前,我们先对该系统的逻辑卷情况做一大致了解:

CentOS 6开机启动流程实验篇_第33张图片

CentOS 6开机启动流程实验篇_第34张图片

CentOS 6开机启动流程实验篇_第35张图片

CentOS 6开机启动流程实验篇_第36张图片

CentOS 6开机启动流程实验篇_第37张图片

CentOS 6开机启动流程实验篇_第38张图片

OK,我们来删除/boot及/etc/fstab:

[root@localhost ~]# cd /boot
[root@localhost boot]# rm -rf *
[root@localhost boot]# cd
[root@localhost ~]# umount /boot
[root@localhost ~]# rm -rf /boot
[root@localhost ~]# rm -f /etc/fstab
[root@localhost ~]#

重启:系统进入了grub

CentOS 6开机启动流程实验篇_第39张图片

因为此时vmlinuz也被删除了,故grub也无能为力,我们进入救援模式:

CentOS 6开机启动流程实验篇_第40张图片

查看分区情况:我们能了解到/boot分区在/dev/sda1上,另外,只能了解到/dev/sda2为逻辑卷,但具体如何分的还不得知

CentOS 6开机启动流程实验篇_第41张图片

CentOS 6开机启动流程实验篇_第42张图片

此时我们用lvscan命令来扫描一下逻辑卷:此时即可发现逻辑卷的具体分区情况以及状态。

CentOS 6开机启动流程实验篇_第43张图片

再将inactive的逻辑卷激活:vgchage -ay

CentOS 6开机启动流程实验篇_第44张图片

此时,根据上一个的经验,我们应该先写好系统挂载的配置文件,然后重启系统让其自动挂载,再rpm安装kernel,重装grub,即可大功告成!与上个实验唯一不同的是,这个逻辑卷实验我们用lvscan时就能够知道根/ 分区在哪(本实验在vg0上,而vg0在/dev/sda2上),于是,我们即可把根先挂载上,然后切根,再书写/etc/fstab文件。

CentOS 6开机启动流程实验篇_第45张图片

CentOS 6开机启动流程实验篇_第46张图片

重启系统使其自动挂载:

CentOS 6开机启动流程实验篇_第47张图片

CentOS 6开机启动流程实验篇_第48张图片

看到挂载关系已经正常,此刻我们就可以rpm安装kernel,然后重装grub了。

安装kernel:

CentOS 6开机启动流程实验篇_第49张图片

重装grub:

CentOS 6开机启动流程实验篇_第50张图片

grub.conf

CentOS 6开机启动流程实验篇_第51张图片

至此,就可以重启系统了!

CentOS 6开机启动流程实验篇_第52张图片

最后,我们做一个grub的自我保护机制小实验:

GRUB的界面也支持命令行接口,在GRUB界面可以按照提示输入e、b、c等命令进行相应的编辑,在对应的title中输入c可以进入命令行模式,在命令行中可以输入一个信息如:

help: 获取帮助find: 文件查找,通常用于定位文件,方法find(hd#,#)/root
kernel
initrd
boot

CentOS 6开机启动流程实验篇_第53张图片

CentOS 6开机启动流程实验篇_第54张图片

GRUB也有自己的保护机制,只有通过论证才能修改grub.conf信息。可以通过以下方式来对grub.conf进行保护:

1、在第一个title之上添加password --md5 PASSWORD :主要用于保护编辑功能
2、在某个title内添加password --mdt PASSWORD : 主要用于保护内核

生成密码的命令:grub-md5-crypt; openssl passwd -1

如:

[root@centos6 ~]#openssl passwd -1Password: 
Verifying - Password: 
$1$AawgjWjr$eEQJyxtCwJOk54Gnq2zK/.
[root@centos6 ~]#

CentOS 6开机启动流程实验篇_第55张图片

提示按"p" 键输入密码:用于保护grub.conf的编辑功能

CentOS 6开机启动流程实验篇_第56张图片

CentOS 6开机启动流程实验篇_第57张图片

正常的grub界面:

CentOS 6开机启动流程实验篇_第58张图片

选中相应的菜单直接回车试图启动系统时,提示输入密码:

CentOS 6开机启动流程实验篇_第59张图片

然后系统就可以启动了!

如果是grub出现了问题导致系统无法启动,上面已经有大量的实验了,通过救援模式进行修复,主要步骤如下:

chroot /mnt/sysp_w_picpath: 改变到磁盘根目录 
fdisk -l /dev/sda: 使用fdisk 检查磁盘分区
grub-install /dev/sda: 安装grub引导程序到磁盘/dev/sda的MBR扇区
exit

当然,grub-install命令也可用grub代替:#grubgrub>root (hd0,0)
grub>setup (hd0)
grub>quit 

但时,grub命令在修复grub的会依赖到/boot/grub/目录下的一些文件,
而grub-install命令是不依赖的!

至此本文就结束了,前半部分(理论篇)我们主要讲述了centos 6的启动流程,解析了相关的关键词,后半 部分(实验篇)将通过大量破坏式实验体验了相关的关键文件在Linux系统中起的作用。