Linux启动之grub详解,故障排除,自建linux

概述

    上篇我们以CentOS6为例介绍了一下系统启动流程,本篇将承接上篇,详细的介绍一下系统启动流程中的grub,以及系统启动过程中的各种故障的排除,以及利用现有内核自己构建一个能够正常启动的简单Linux系统。具体分为一下几个部分:

    1、grub相关概念详解

    2、系统启动故障排除

            2.1  grub配置文件错误无法进入系统

            2.2  grub的stage1故障修复

            2.3  grub的stage1.5故障修复

            2.4  grub的stage2故障修复(删除/boot/grub目录和内核vmlinuz文件,initramfs文件)

            2.5  破坏grub的stage1、stage1.5、删除boot目录的故障恢复

            2.6  破坏grub的stage1、stage1.5、删除boot目录,删除/etc/fstab文件的故障恢复

            2.7  当系统安装在lvm逻辑卷上时, 破坏grub的stage1、stage1.5、删除boot目录,删除/etc/fstab文件的故障恢复

            2.8  系统上init程序被破坏后的恢复,inittab文件被破坏后的恢复

    3、自建Linux系统

第一章    grub相关概念详解

    1、linux上bootloader之grub详解:

        grub 0.X: centos5、6上用的,也称之为grub legacy

        grub 1.X: centos7上用的,也称之为grub2

    2、grub legacy:分为几个阶段

        stage1:安装在MBR中前446字节中

        stage1_5:MBR之后的扇区,主要是让stage1中的bootloader能识别stage2所在的分区上的文件系统,否则无法加载stage2阶段

        stage2:存放在磁盘分区上,一般在/boot/grub/目录下,这才是真正实现开机时显示的菜单和相关功能的程序所在位置,改程序也有其配置文件,配置文件时/boot/grub/grub.conf,其有个软链接文件是/etc/grub.conf

        stage2及内核等,通常放置于一个基本磁盘分区,而不应该是放在lvm、软raid分区等复杂分区上,因为grub不能驱动lvm、软raid分区,另外lvm、软raid的识别是系统初始化脚本/etc/rc.d/rc.sysinit的功能,该功能在内核启动之后,init接管的时候才实现。

    3、grub的功能:

        <1>提供菜单,并提供交互式接口

            e:编辑模式,用于编辑菜单

            c:命令模式,交互式接口

            等等

        <2>加载用户选择的内核或操作系统

            并允许用户传递参数给内核

            也支持隐藏菜单

        <3>为菜单提供了保护机制

            为编辑菜单进行认证

            为启用内核或操作系统进行认证

    4、grub中是如何识别设备

        无论是什么接口的硬盘,都识别为hd

        且用(hd数字1,数字2)表示第数字1的磁盘上的数字2的分区,都从0开始编号

        故(hd0,0) 表示第1个磁盘上的第1个分区

    5、grub的命令行接口:

        help:获取帮助列表

        help 关键字   可获取某个关键字的详细帮助信息

        find (hd数字1,数字2)/FILENAME   可在指定磁盘设备上找指定的文件,判断文件的存在性

                如:find (hd0,0)/vmlinuz  

        root (hd数字1,数字2)  表示将那个磁盘设备设置为grub的根设备,注意,这里的根并不是文件系统的根

                如:root (hd0,0)

            如果指定了根,在find时就可以不必指定设备,而直接从grub的根开始找对应的文件

        kernel /PATH/TO/KERNEL_FILE   设定本次启动时用到的内核文件,一般都需要用root指定grub根之后才指定kernel,额外还可以添加许多内核支持使用的命令行参数,如:

                init=/PATH/TO/INIT  指定init程序

                selinux=0   表示禁用内核中的selinux功能

                root=/DEVICE   表示指定真正根文件系统所在的设备

                max_loop=#   表示指定最大的loop设备的个数

        initrd /PATH/TO/INITRAMFS_FILE   为选定的内核提供额外文件的ramdisk文件,ramdisk文件必须与内核版本号必须完全匹配

        boot   引导启动选定的内核  

    6、grub的配置文件 /boot/grub/grub.conf或/etc/grub.conf

        定义了启动时进入grub后哪个显示出来的可供用户选择的菜单,如果没有该定义,就要通过grub的命令行界面进行手工引导启动

        配置文件内容为:

            default=0  设定默认启动的菜单项,菜单项(title)编号从0开始

            timeout=5  指定菜单项等待选项选择的超时时长

            splashimage=(hd0,0)/grub/splash.xpm.gz  指明菜单背景图片文件路径

            hiddenmenu   是否隐藏菜单

            password [–md5]  STRING  表示设定菜单编辑认证,也就是启用grub时,用e键编辑时,需要进行认证的密码,加上–md5 就表示利用md5进行加密

            title CentOS 6 (2.6.32-642.el6.x86_64)   定义菜单项的标题,并用tab缩进定义该菜单项下的各个属性信息,可出现多次,用来引导多个不同的内核或操作系统

                    root (hd0,0)    本菜单项的查找statge2及kernel文件所在的设备分区,为grub的根,不是文件系统的根

                    kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=20a69d3d-34c6-436d-b7fc-fb110f65649f rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet     指明启动的内核及相关内核参数  

                    initrd /initramfs-2.6.32-642.el6.x86_64.img     内核匹配的ramdisk文件

                    password [–md5] STRING   启动选定的内核或操作系统时进行认证

        grub-md5-crypt命令可以生成grub里面认证密码的md5码

    7、grub-install命令

        grub-install命令可以实现对grub的安装修复,能够修复grub的stage1,stage1.5,stage2的相关内容,但是其不能修复stage2中grub的配置文件

        用法为:grub-install /磁盘设备号  –root-directory=/PATH 

            指明为哪个磁盘安装grub,以及该磁盘上的文件系统的根所在的路径,如果是命令本身所在的shell的文件系统根,则–root-directory可以省略

第二章    系统启动故障排除

    1、grub配置文件写错,无法进入系统

    步骤:(修复完成后记得修改配置文件为正确的文件)

    方法一:进入启动菜单项后,修改菜单项为正确的内容,然后启动

    1.png

    2.png

    3.png

    4.png

    5.png

    6.png

    方法二:进入启动菜单后,进入grub交互式界面,手动引导启动

    7.png

    

    2、grub的stage1故障修复

    步骤:

    <1>破坏grub的stage1,如果未重启,则直接利用grub-install命令进行修复,如果重启,则继续

    1.1.png

    <2>重启后发现无法进入系统,此时可以利用光盘进入紧急救援模式,然后进行grub-install安装修复

    1.2.png

    1.3.png

    1.4.png

    1.5.png

    1.6.png

    1.7.png

    1.8.png

    1.9.png

    1.10.png

    1.11.png

    1.13.png

    3、grub的stage1.5故障修复

    步骤:

    <1>破坏grub的1.5阶段,重启系统(如果没重启,可直接用grub-install进行安装)

    1.png

    2.png

    <2>进入紧急救援模式(进入救援模式的步骤省略),进行grub-install安装修复grub

    3.png

    4、grub的stage2故障修复(删除/boot/grub目录和内核文件,ramdisk文件)

    步骤:

    <1>删除/boot/grub目录和内核文件vmlinuz,ramdisk文件initramfs,然后重启

    (如果没重启,可以直接拷贝系统光盘上的vmlinuz文件,然后运行mkinitrd命令生成initramfs文件,然后运行grub-install命令生成修复grub文件,最后编辑grub配置文件即可)

    1.png

    2.png

    <2>进入紧急救援模式(进入过程省略)进行修复

    3.png

    4.png

    7.png

    8.png

    5、破坏grub的stage1、stage1.5、删除boot目录的故障恢复

    步骤:

    <1>破坏stage1、stage1.5,删除boot目录,然后重启

        如果没重启,rpm安装kernel包(注意加上–replacepkgs或–force选项,因为kernel安装的文件不仅仅有boot目录下的相关文件,如果不用选项,会报错),然后grub-install安装修复grub,然后编辑生成一个grub.conf配置文件即可

    1.png

    <2>进入紧急救援模式(进入紧急救援模式的过程省略),修复

    2.png

    111.png

    6.png

    6、破坏grub的stage1、stage1.5、删除boot目录,删除/etc/fstab文件的故障恢复

    步骤:

    <1>破坏grub的stage1、stage1.5、删除boot目录,删除/etc/fstab文件,重启系统

        如果破坏后,尚未重启系统,只需重新编辑/etc/fstab文件,然后与上个实验一样,安装kernel包(注意加–replacepkgs或–force选项),grub-install安装grub,然后提供grub的配置文件即可

    1.png

    

    <2>进入紧急救援模式,进行修复

    2.png

    3.png

    4.png

    5.png

    6.png

    8.png

    9.png

    10.png

    11.png

    15.png

    16.png

    7、当系统安装在lvm逻辑卷上时, 破坏grub的stage1、stage1.5、删除boot目录,删除/etc/fstab文件的故障恢复

    步骤:

    <1>破坏stage1、stage1.5,删除boot目录、删除/etc/fstab文件,并重启

    1.png

    

    <2>进入紧急救援模式修复

    2.png

    3.png

    4.png

    5.png

    6.png

    8.png

    9.png

    10.png

    11.png

    14.png

    15.png

    8、系统上init文件、inittab文件破坏后的恢复方案

    步骤: 思路为查询文件是由哪个程序生成,然后在救援模式下进行安装对应的包,进行修复

    1.png

    2.png

    3.png

第三章    自建Linux系统

    实验环境:

        CentOS6.8的64位系统

        思路为:在现有虚拟机上添加一个新磁盘,然后对磁盘做出相关操作,然后新建一个虚拟机,新建的虚拟机利用该块磁盘完成系统启动

    步骤:

    1、在原有虚拟机上添加一块磁盘

    2.png

    3.png

    4.png

    5.png

    6.png

    7.png

    8.png

    9.png

    2、对添加的磁盘进行分区,格式化

    10.png

    11.png

    12.png

    3、挂载新建的磁盘分区

    13.png

    4、拷贝内核文件、ramdisk文件到新磁盘的boot目录,为新磁盘创建grub,提供grub配置文件

    14.png

    15.png

    5、为新磁盘的根添加相关的目录结构,并拷贝相关程序及程序依赖的库文件到新磁盘上

    18.png

    19.png     

    6、新建虚拟机,并将虚拟机的磁盘指向到我们做好的磁盘

    21.png

    22.png

    23.png

    24.png

    25.png

    26.png

    27.png

    28.png

    29.png

    30.png

    31.png

    32.png

    33.png

    7、启动虚拟机,验证功能

    34.png

    35.png

    8、复制命令用到的脚本为:

[root@localhost ~]# cat scripts/course/copycmd.sh 
#!/bin/bash
# Autor: nwc
# Version: 2.0
# CreateTime: 

function CMDCP() {
	DIR=`dirname $CmdPath`
	if [ -d ${LuJing}${DIR} ] ;then
		cp $CmdPath ${LuJing}${DIR} && echo "cp $CMD success" || echo "cp $CMD fail"
	else
		mkdir -p ${LuJing}${DIR}
		cp $CmdPath ${LuJing}${DIR} && echo "cp $CMD success" || echo "cp $CMD fail"
	fi	
}


function CMDLIBCP() {	
	for i in ${LibCmd} ; do
		LIBDIR=`dirname $i`
		if [ -d ${LuJing}${LIBDIR} ];then
			cp $i ${LuJing}${LIBDIR} && echo "cp $i success" || echo "cp $i fail" 
		else
			mkdir -p ${LuJing}${LIBDIR}
			cp $i ${LuJing}${LIBDIR} && echo "cp $i success" || echo "cp $i fail" 
		fi
	done
}




while true;do
     read -p "Input a exec program name like ls/cat... q for quit  " CMD
	case $CMD in 
	q)
		echo "exit..."
		exit
	;;
	*)
		if which --skip-alias $CMD &>/dev/null  && [[ $CMD != "q" ]]; then
       			CmdPath=`which --skip-alias $CMD`
			LibCmd=`ldd $CmdPath|grep -o -E "/[^[:space:]]+"`
			LuJing=/mnt/sys
			CMDCP
			CMDLIBCP
		else
       			 echo "you input is not a right command"
				continue
		fi
	;;
	esac
done

原创文章,作者:M20-1倪文超,如若转载,请注明出处:http://www.178linux.com/45876

(6)
M20-1倪文超M20-1倪文超
上一篇 2016-09-13 14:08
下一篇 2016-09-13 14:59

相关推荐

  • 第六次上课作业

    1、三种权限rwx对文件和目录的不同意义 对文件 r:read  可读取此文件的实际内容,如读取文本文件的文字内容等 w: write  可以编辑,新增或修改该文件的内容 x:execute  该文件具有可以被系统执行的权限==>>针对二进制文件或脚本 X:针对目录会加上x权限…

    Linux干货 2016-08-04
  • 第六周博客作业

    请详细总结vim编辑器的使用并完成以下练习题 1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#; cp /etc/rc.d/rc.sysinit /tmp vim /tmp/rc.sysinit :%s@^[[:space:]]\+[^[:space:]]@#&a…

    Linux干货 2017-02-26
  • M25开篇”如何学习Linux”

    首先有幸参加马哥linux运维工程师培训,在接下来的四个半月里如何学好linux,首先得了解什么是linux? 在开班前对linux的初步了解中知道linux是免费、开源、拥有广泛而开放的linux社区的一款服务器操作系统,比较于windows和linux的用处都各有特点。 windows的用户体验众人皆知,作为一款亲民友善的系统,没有学习成本,甚至学龄前童…

    2017-07-11
  • CentOS6+ LAMP+ wordpress 搭建个人博客站

        每个IT工程师都期待拥有一个自己的博客站,本文讲述在CentOS 6系统LAMP环境下使用WordPress框架构建个人博客站的详细过程。     —-构建LAMP环境—- 1,安装apache,mysql php yum install -y httpd mysql…

    2017-07-11
  • CA,DNS,LAMP实现wordpress

    拓扑图见编译实现LAMP,bind,CA.jpg test3配置:     yum -y install bind     修改named.conf配置文件:     //      listen-on por…

    2017-04-23
  • 学习宣言

     学习计划:参考N24学习时间与线路图,尽最大努力完成。 目标:学习好Linux,提升自我价值,找一份待遇好的工作。 宣言:每一次轻易的放弃,都是人生的一处败笔,为了梦想,加油!

    Linux资讯 2016-10-26