CentOS 6开机启动流程实验篇

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 ~]#

wKiom1ffg5HwIsYfAACUwG-yhjc648.png

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

wKiom1ffg6vCE6kiAAVuFPagJpQ368.png

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

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

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

wKioL1ffg8SCVjvhAAANnE19Wvg511.png

wKioL1ffg_DClq0tAAAm_2dgFjA457.png

wKioL1ffhAijomdlAAAgkyfd-w8319.png

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

wKioL1ffhCGhvzhxAAAclS0M4IA707.png

wKioL1ffhFChVmHUAAA1oUZthGI263.png

修复:重建grub

wKiom1ffhGrDbS0dAAA7CBsboMc280.png

重启:

wKioL1ffhH_gYc6WAAAEtAd1N5c602.png

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

wKioL1ffhJbzxK-bAAAIKmFzvIs858.png

wKioL1ffhLaSYoJjAACL0FegsQ4070.png


结:如果stage1被破坏,系统认为硬盘无法启动,故而系统会直接进入光盘引导模式,也不会进入grub错误的界面,因此此时系统根本就无法启动,只能
进入救援模式!进入之前如果提示chroot /mnt/sysimage,则表示/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 ~]#

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

wKiom1ffhPyjH0lVAAAGjl6_IVk350.png

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

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

wKioL1ffhRmS-LkkAABNZDQG6K0589.png

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


结:如果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 字样

wKiom1ffhUKSF1scAAAEJ7PWhXI026.png

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

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

wKioL1ffhV2QPz3cAAAdNrHYmNk069.png

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

wKioL1ffhX2g30p1AAAMOsIuIWw327.png


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

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

wKioL1ffhZiQKKtMAAAWpr66_38821.png

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

wKiom1ffha7gX5RBAABhyAqweWE033.png

小结: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 ~]#

重启:

wKiom1ffhduRROoBAAAkZBRCeuA361.png

重启后我们直接进入了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 ~]#

wKiom1ffhibjQ8qhAAAX4rUMmFQ142.png

然后我们重启就可以了!

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

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

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

删除之前要备份!

重启:

wKiom1ffhj_Bh9qpAAGOhpgfx2o513.png

尝试进单用户模式修复:

wKioL1ffhlainN0rAACt1Y95uEE842.png

5.删除/boot目录

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

wKioL1ffhmzAaYczAABHDbky2sA237.png

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

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

wKioL1ffhreBiNNWAAADl53tx6k294.png

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

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

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

wKiom1ffhtTCLVP8AAAdkqg-jn0647.png

第二: 恢复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的错误一样

wKioL1ffhvqSbiWuAAADokU5weI555.png

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

wKiom1ffhxHwnR48AAAgSgU63uc427.png

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

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即可。

重启:

wKioL1ffhzHTbmTeAAADHkahq_I331.png

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

进入救援模式:

wKioL1ffh1zxrWyBAABWIIpcZxk490.png

wKiom1ffh43AOqRTAAANJQGhqi0979.png

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


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

wKioL1ffh6WQ-tN9AAAUncWqUzA363.png

wKiom1ffh7jDMJNNAAA2M3mzgeU136.png

wKiom1ffh8uTCv2aAAAxpIqub4s537.png

此时,我们已经知道根在/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

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

wKioL1ffiBihCFkSAAAkeVg9aD4925.png

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

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

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

wKiom1ffiDPDwDJQAACIbjRXwBk884.png

wKioL1ffiEnBeoPjAACEyj7leIo084.png

wKiom1ffiFqSilQFAABn7KsvGF8032.png

wKiom1ffiGywYtKRAACC9_XEOKg525.png

wKioL1ffiH3QqNKbAADCcQNLHxA242.png

wKiom1ffiJKTT4noAADb28XJXig757.png

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

wKiom1ffiT_gl4peAAAQbksGmTA857.png

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

wKioL1ffiVXisTXiAAAM0LFYmck342.png

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

wKiom1ffiWmhSjQCAAA6EBCqcuY404.png

wKioL1ffiXvyRy3dAAARdtyek4E413.png

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

wKioL1ffiYyBwjn-AAAPxs0Q4SY385.png

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

wKiom1ffiaTSMI0LAAATzObZjIw424.png


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

wKioL1ffibewaz8WAAAiJ9rv7YM932.png

wKioL1ffic2gju2wAAAgAUI0b6Q045.png

重启系统使其自动挂载:

wKiom1ffieLQl2ZJAAAUPcakyXM011.png

wKiom1ffifjh0uOGAAAhifWlVQo989.png

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

安装kernel:

wKioL1ffig2yLs0kAAAj0SeQBZQ737.png

重装grub:

wKiom1ffiibwcODAAAAVmloXN8k946.png

grub.conf

wKiom1ffij6jEafPAAAMvjCGAjk040.png

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

wKioL1ffjrDyP56qAAAeZkNWElA648.png

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

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

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

wKioL1ffjsLyo9lTAACrMMO0lkE506.png

wKiom1ffjtXAHv-5AAArqE8UQ5M516.png

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 ~]#

wKiom1ffju2Rdx_jAADht9awLtc396.png

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

wKiom1ffjv-jTDb0AAAUOWcEDzc164.png

wKioL1ffjw_zpwKiAAAVSRQ-3tU061.png

正常的grub界面:

wKioL1ffjyGToK-bAAAWODcwoio859.png

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

wKioL1ffjzHSptIiAAADNpiLrV4375.png

然后系统就可以启动了!

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

chroot /mnt/sysimage: 改变到磁盘根目录 
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系统中起的作用。

原创文章,作者:Liansir,如若转载,请注明出处:http://www.178linux.com/47781

(1)
LiansirLiansir
上一篇 2016-09-19
下一篇 2016-09-19

相关推荐

  • 利用 yum 查找某个命令属于哪个包

    当我们在安装一个不熟悉的命令是,会遇到个问题:Error: Nothing to do 而你又不知道该命令的是属于哪个rom包,莫慌~我们可以借助一个叫yum的基于rpm的软件包管理器。 以 dig 这个命令为例,当我安装它时会出现如下情况  [root@localhost ~]# yum install dig  Loaded plug…

    Linux干货 2016-03-27
  • 主从DNS 子域授权 基于域的转发和DNS视图的配置

    先把软件包的安装: yum install bind yum install bind-utils(DNS的查询工具,dig nslookup host) 事先我已经安装好了。 主从DNS的网络拓扑图: 主从DNS配置: 主从DNS服务器的同步可以有:完全区域同步(AXFR)和增量区域同步(IXFR),配置过程中要注意,增量备份时,需要调整区域文件中的SOA…

    Linux干货 2015-08-24
  • AOP面向方面编程

    1.引言         软件开发的目标是要对世界的部分元素或者信息流建立模型,实现软件系统的工程需要将系统分解成可以创建和管理的模块。于是出现了以系统模块化特性的面向对象程序设计技术。模块化的面向对象编程极度极地提高了软件系统的可读性、复用性和可扩展性。向对象方法的焦点在于选择对象作为模块的主要单元,并将对象与系统的…

    Linux干货 2015-04-07
  • 正则表达式

    1:什么是正则表达式: 简单的说,正则表达式就是处理字符串的方法,它是以行为单位进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找,删除,替换某特定字符串的处理程序。 2:一些参数: grep [-A] [-B] [–color=auto] ‘收索字符串’ filename -A :后面可加数字…

    2017-07-29
  • keepalived高可用双主lvs-dr模型集群

    环境 centos6.8 在keepalived服务器上安装keepalived RS服务器上安装nginx ,安装过程省略 为了便于实验,四台机器将关闭iptables和selinux 配置如下: K1: #修改keepalived配置文件 vim /etc/keepalived/keepalived.conf ! Configuration File f…

    2017-05-13

评论列表(1条)

  • 马哥教育
    马哥教育 2016-09-23 11:30

    文章操作性很强,对于一些操作,也有理论性的分析,赞一个。