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.www58058.com/45876

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

相關推薦

  • haproxy 動靜分離負載均衡、?stats頁面實現?。

    實驗環境:一臺主機提供haproxy、nfs、mariadb,后端2臺apache部署wordpress。 實驗目的:haproxy使得動靜分離、以及開啟stats頁面。 haproxy簡單介紹 負載均衡的解決方案,支持4、7層,特點是單進程模型(可配置為多進程模型)單進程能支持非常大的并發鏈接數量(相比較其他軟件)。 到今天,馬哥課程中的負載均衡方案(lv…

    Linux干貨 2017-02-18
  • 記一次CentOS7內核kernel的刪除重裝

    人生在于折騰,學習Linux更要多多折騰。在一次折騰中吸取教訓,更易于記憶。 今天我們來折騰Linux的內核:刪除系統內核后,通過光盤進行kernel的重安裝。 友情提示:請在虛擬機環境進行,折騰前務必做好系統快照。慎重! 環境 本次系統環境是如下圖: 刪除 我們先到/boot目錄下,強制刪除kernel文件: 重啟PC,此時系統報錯找不到內核文件,無法登錄…

    Linux干貨 2016-08-24
  • 讓自定義腳本成為服務腳本

    1.腳本注釋格式:此格式能讓chkconfig命令識別 #!/bin/bash#chkconfig:runlevel [S]##  [K]##    定義默認runlevel) (S開頭,定義啟動優先級) (K開頭,定義關閉優先級) #description:腳本說明:太長的話需要\換行 2.case語句實現start,stop…

    Linux干貨 2017-05-15
  • Linux常用命令及bash特性(1)

    馬哥教育網絡班22期第二周課程練習 Linux簡單使用(1) Linux常用命令介紹 linux命令是對Linux系統進行管理的命令。對于Linux系統來說,無論是中央處理器、內存、磁盤驅動器、鍵盤、鼠標,還是用戶等都是文件,Linux系統管理的命令是它正常運行的核心。 linux命令在系統中有兩種類型:內置Shell命令和Linux命令??梢允褂胔elp、…

    Linux干貨 2016-08-29
  • 分布式存儲介紹、FastDFS 部署

    什么是分布式系統? 簡單來說,多臺主機提供同一個服務,例如負載均衡集群,就是一個分布式系統。 什么是分布式存儲? 看看某寶,上面多少圖片,如果使用傳統的單機存儲,需要準備多大的磁盤空間?讀寫性能如何提升? 上圖就是一個分布式存儲的結構,此處存儲節點不在是磁盤,而是多個主機組成,多個主機內部通信實現數據副本,客戶端發來的請求發往前端,前端分發至后端,有點像負載…

    2017-03-08
  • 第一周記錄

    列出Linux的發行版,描述不同發行版之間的聯系與區別。    發行版多達100多種,其中主要的有Debian旗下的Ubuntu、knopix,Slackware旗下的S.u.S.E,RedHat公司旗下的RedHat、CentOS、Fedora。其中各個版本之間的區別:包管理器的區別;但其內核都是Linux內核。 ifconfig: 查…

    Linux干貨 2016-08-15
欧美性久久久久