概述
上篇我們以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配置文件寫錯,無法進入系統
步驟:(修復完成后記得修改配置文件為正確的文件)
方法一:進入啟動菜單項后,修改菜單項為正確的內容,然后啟動
方法二:進入啟動菜單后,進入grub交互式界面,手動引導啟動
2、grub的stage1故障修復
步驟:
<1>破壞grub的stage1,如果未重啟,則直接利用grub-install命令進行修復,如果重啟,則繼續
<2>重啟后發現無法進入系統,此時可以利用光盤進入緊急救援模式,然后進行grub-install安裝修復
3、grub的stage1.5故障修復
步驟:
<1>破壞grub的1.5階段,重啟系統(如果沒重啟,可直接用grub-install進行安裝)
<2>進入緊急救援模式(進入救援模式的步驟省略),進行grub-install安裝修復grub
4、grub的stage2故障修復(刪除/boot/grub目錄和內核文件,ramdisk文件)
步驟:
<1>刪除/boot/grub目錄和內核文件vmlinuz,ramdisk文件initramfs,然后重啟
(如果沒重啟,可以直接拷貝系統光盤上的vmlinuz文件,然后運行mkinitrd命令生成initramfs文件,然后運行grub-install命令生成修復grub文件,最后編輯grub配置文件即可)
<2>進入緊急救援模式(進入過程省略)進行修復
5、破壞grub的stage1、stage1.5、刪除boot目錄的故障恢復
步驟:
<1>破壞stage1、stage1.5,刪除boot目錄,然后重啟
如果沒重啟,rpm安裝kernel包(注意加上–replacepkgs或–force選項,因為kernel安裝的文件不僅僅有boot目錄下的相關文件,如果不用選項,會報錯),然后grub-install安裝修復grub,然后編輯生成一個grub.conf配置文件即可
<2>進入緊急救援模式(進入緊急救援模式的過程省略),修復
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的配置文件即可
<2>進入緊急救援模式,進行修復
7、當系統安裝在lvm邏輯卷上時, 破壞grub的stage1、stage1.5、刪除boot目錄,刪除/etc/fstab文件的故障恢復
步驟:
<1>破壞stage1、stage1.5,刪除boot目錄、刪除/etc/fstab文件,并重啟
<2>進入緊急救援模式修復
8、系統上init文件、inittab文件破壞后的恢復方案
步驟: 思路為查詢文件是由哪個程序生成,然后在救援模式下進行安裝對應的包,進行修復
第三章 自建Linux系統
實驗環境:
CentOS6.8的64位系統
思路為:在現有虛擬機上添加一個新磁盤,然后對磁盤做出相關操作,然后新建一個虛擬機,新建的虛擬機利用該塊磁盤完成系統啟動
步驟:
1、在原有虛擬機上添加一塊磁盤
2、對添加的磁盤進行分區,格式化
3、掛載新建的磁盤分區
4、拷貝內核文件、ramdisk文件到新磁盤的boot目錄,為新磁盤創建grub,提供grub配置文件
5、為新磁盤的根添加相關的目錄結構,并拷貝相關程序及程序依賴的庫文件到新磁盤上
6、新建虛擬機,并將虛擬機的磁盤指向到我們做好的磁盤
7、啟動虛擬機,驗證功能
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