CentOS6开机启动流程实验篇
CentOS6开机启动的具体详情请参见理论篇!
了
解了系统启动的基本流程,以下我们通过“破坏式实验”,即破坏系统启动过程中的一些关键环节,使系统未能启动,之后我们再通过修补这种文件促使系统正常重
启,借以体验Linux系统的启动流程,那些关键环节包括破坏grub三个stage(stage1、stage1-5、stage2)
中的任何一个阶段,甚至是整个grub;还有挂载文件/etc/fstab,内核文件vmlinuz,
系统引导时须要加载的驱动程序文件initramfs以及MBR中的相关信息等。
接出来开始实验,建议提早备份相关文件或给系统先做快照!
破坏MBR中的前446bytes,即stage1
破坏MBR以后的磁道,即stage1-5
删掉整个grub文件(stage2随后也被删掉)
删掉用户空间的第一个进程:/sbin/init
删掉/boot目录
删掉initramfs文件
删掉/boot及/etc/fstab
在逻辑卷的系统上删掉/boot及/etc/fstab
见CentOS6开机启动流程实验篇
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 ~]#
此时重启系统64位linux,发觉系统直接步入了光碟引导模式
剖析:开机直接步入了光碟引导模式,说明系统的开机时经过了POST–>BIOS,却在系统引导时出现的问题,这属于grub的事,我们只需重新安装grub即可。
步入搜救模式,重新安装grub:
可在里面那种界面直接选择Rescue搜救模式,也可重装启动系统,按ESC键,选择CD-ROM再步入。
查看下c盘的挂载与分区是否正常,假如正常则直接重装grub,注意重装grub解决不了分区表被破坏的情况,这是两回事,所以给系统提早备份分区表很重要!
修补:重建grub
重启:
正常的开机启动画面,而不是直接步入了光碟引导界面!
小
结:假如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 ~]#
重启:发觉屏幕仍然卡在了红色界面
好吧,自动步入搜救模式之后重建grub!
重建grub后可查看/dev/sda上的前1024字节
此时重启系统就正常启动了!
小
结:假如stage1.5被破坏,则系统启动过程中会死机,仍然卡着,也不会步入光碟引导模式,由于stage1未被破坏,则系统觉得可以从硬碟启动,成
功地进行了stage1,当进行stage1.5时发觉stage1.5被破坏,系统就难以正常启动下去,难以找到相应的驱动深度linux,就仍然死机卡着不去。此时
倘若恢复系统,就自动步入搜救模式,之后重建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个分区,由于c盘分区的编号是从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上面的内容解释请看上文的关键词解释部份,此处不再赘言。
重启时我们发觉Error15字样
照样自动步入搜救模式先重装grub,由于删掉了grub文件,grub肯定是被破坏了!
此时我们在重装grub时发觉“分区表签名”的问题,可忽视!
我们步入grub目录可查看grub下的文件是否全部恢复:
发
现少了grub.conf文件,没有grub.conf文件,系统在启动时也就难以加载内核,其实启动不成功,故而我们此时可以选择手写一份
grub.conf文件,永久有效,也可选择重启,此时系统会步入grub>模式,在grub>
模式上面我们也可以以命令的方式给出系统内核文件储存的位置、内核的名称及核心参数,以及虚拟文件系统initrd,
但仅对本次启动有效,上次启动时还得书写一次!
此时我们选择直接在grub目录上面书写:
假如是在grub>模式,可以如此写:
小结: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 ~]#
重启:
重启后我们直接步入了switchingroot模式,发觉命令都难以执行,虽然很容易理解,/sbin/init都被删掉了还如何执行命令!
此
时的系统虽然早已经历了POST–>BIOS–>MBR–>GRUB–加载内核阶段,但当启动init进程时却未能启动了,系
统步入了switchingroot模式,却哪些也干不了!这么我们的思路可以如此来:既然init启动不了,我们就想办法让其启动,通常地,init
默认执行的是/sbin/init,既然/sbin/init被删掉了,这么我们就把/sbin/init替换为/bin/bash,也就是说,将用户空
间第一个进程init使其启动为/bin/bash,之后借助bash命令将备份的init文件恢复到/sbin目录下即可。
启动过程中更改内核参数可以步入grub更改,也可以在启动菜单的选项下更改(步入单用户模式或直接按a键更改内核参数),我们选择直接在启动菜单下按a键添加内核参数:init=/bin/bash
在步入bash模式时,须要重新以读写形式挂载根/.
但是这一过程也用不着步入搜救模式,并且这一方式有时在添加完内核参数并重启时系统卡在某个地方,常常是因为某个服务起不来而引起的linux 设置开机启动程序,此时只需步入单用户模式将上此服务用chkconfig命令off掉即可。由于单用户模式并不依赖好多服务就可步入!
[root@centos6 ~]#cp /sbin/init . [root@centos6 ~]#rm -f /sbin/init [root@centos6 ~]#
之后我们重启就可以了!
别外,步入搜救模式自然屡试不爽,直接将备份的init文件恢复到/sbin目录下就完事,且不用害怕因为某服务没上去而卡住的现象!
自然,假如系统初始化脚本/etc/rc.d/rc.sysinit被删掉了,亦可通过同样的方式寻回,有人说没备份咋整,呵呵,那就找相同配置的另一机器吧!
删掉系统初始化脚本:/etc/rc.d/sysinit
删掉之前要备份!
重启:
尝试进单用户模式修补:
5.删掉/boot目录
/boot目录上面的文件最重要的文件有两个:vmlinuz,grub
[root@centos6 ~]#umount /boot [root@centos6 ~]#rm -rf /boot [root@centos6 ~]#
重启:这个错误类型是不是有点熟悉的口感。。。跟破坏了stage2的错误一样!
剖析:既然整个/boot目录都被删掉了,而/boot目录下最重要的文件是vmlinuz与grub,于是我们先恢复这两个文件瞧瞧。/boot下的其它文件在安装kernel时会手动生成!
另外,既然这个错误跟stage2一样,这么说明虽然删掉整个/boot目录,也能成功地进行stage1与stage1-5,这是由于stage1在MBR中,而stare1-5在MBR旁边的磁道上,stage2是在c盘上!
第一:先恢复vmlinuz,rpm安装kernel包
第二:恢复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的错误一样
由启动错误可知,initramfs是与stage1-5相关的!
这么,系统也可正常启动!
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即可。
重启:
这个错误太熟悉不过了吧,stage2被破坏了,stage1在MBR中,stage1-5在MBR旁边的磁道中,跟删掉/boot目录没关系。
步入搜救模式:
由此可见,系统的挂载关系早已被破坏,我们按照前面的提示,写好挂载配置文件/etc/fstab后重启系统,让系统手动挂载,之后再重新步入搜救模式,恢复/boot目录!
在
写挂载配置文件之前,我们必需要晓得/boot在那个位置上,此时df命令已然不行了,此时我们可用fdisk-l来查看,
而根在那个分区上,fdisk-l
命令是不容易看下来的linux 设置开机启动程序,我们只能通过“试”的方式:多创建个几个目录,如/mnt/sda#,之后分别挂载除/boot即引导分区以外的其它几个分区!直
至找到为止;另外,我们还得晓得文件系统类型,我们可用bldid命令来获取!
此时,我们早已晓得根在/dev/sda2上,而/boot在/dev/sda1上,且文件系统类型为ext4,OK,我们来书写/etc/fstab吧,之后重启让系统手动挂载之!
注意:此时的/etc/fstab在/mnt/sda2上,即路径为:/mnt/sda2/etc/fstab
但当我们书写系统挂载配置文件时发觉:
错误很显著,路径错了!注意设备的挂载。
挂载关系好了以后再重启系统让其手动挂载:
挂载关系无误后就可以安装kernel并重装grub了:
8.在逻辑卷的系统上删掉/boot及/etc/fstab
两样地,怎么系统是逻辑卷分区的,当删掉/etc/fstab后在搜救模式下也是难以查看具体的分区情况的,在做实验之前,我们先对该系统的逻辑卷情况做一大致了解:
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
由于此时vmlinuz也被删掉了,故grub也无能为力,我们步入搜救模式:
查看分区情况:我们能了解到/boot分区在/dev/sda1上,另外,只能了解到/dev/sda2为逻辑卷,但具体怎么分的还不得悉
此时我们用lvscan命令来扫描一下逻辑卷:此时即可发觉逻辑卷的具体分区情况以及状态。
再将inactive的逻辑卷激活:vgchage-ay
此
时,依据上一个的经验,我们应当先写好系统挂载的配置文件,之后重启系统让其手动挂载,再rpm安装kernel,重装grub,即可大功告成!与上个实
验惟一不同的是,这个逻辑卷实验我们用lvscan时就能否晓得根/
分区在哪(本实验在vg0上,而vg0在/dev/sda2上),于是,我们即可把根先挂载上,之后切根,再书写/etc/fstab文件。
重启系统使其手动挂载:
见到挂载关系早已正常,此刻我们就可以rpm安装kernel,之后重装grub了。
安装kernel:
重装grub:
grub.conf
至此,就可以重启系统了!
最后,我们做一个grub的自我保护机制小实验:
GRUB的界面也支持命令行插口,在GRUB界面可以根据提示输入e、b、c等命令进行相应的编辑,在对应的title中输入c可以步入命令行模式,在命令行中可以输入一个信息如:
help: 获取帮助find: 文件查找,通常用于定位文件,方法find(hd#,#)/root kernel initrd boot
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 ~]#
提示按"p"键输入密码:用于保护grub.conf的编辑功能
正常的grub界面:
选中相应的菜单直接回车企图启动系统时,提示输入密码:
之后系统就可以启动了!
假如是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命令是不依赖的!
至此本文就结束了,前半部份(理论篇)我们主要述说了centos6的启动流程,解析了相关的关键词,后半部份(实验篇)将通过大量破坏式实验体验了相关的关键文件在Linux系统中起的作用。