首頁 > 軟體

Linux系統開機引導

2020-06-16 17:21:11

開機自檢(BIOS)——>MBR引導——>GRUB選單——>載入核心(kernel) ——>執行INIT進程

開機自檢(BIOS)
// 載入 BIOS 的硬體資訊、進行自我測試,並依據設定獲得第一個可開機的裝置
1.啟動BIOS:固化在主機板上的晶片 Del 、F2
2.POST ( power on self test )系統檢查:檢查核心硬體是否正常
3.裝置初始化 : 初始化驅動程式,分配資源
4.引導裝置選擇:使用光碟機,硬碟還是PXE引導

5.移交執行區域:載入引導裝置的第一個磁區(512Byte)

BOIS :基本輸入/輸出系統 (微型 作業系統),儲存計算機基本硬體的資訊
作用:加電自檢 、初始化、引導作業系統
BIOS 唯讀晶片,BIOS 的引數寫在 CMOS中。有塊小電池為CMOS供電
南北橋是主機板上最大的晶片,

由於軟碟機已不再使用,某些BIOS在啟動時檢測不到軟碟機會提示錯誤,需要將其遮蔽
建議在BIOS配個密碼,提高計算機的安全性,確保只有有許可權的人員才能修改BIOS的引數
若管理員不記得某個電腦的BIOS密碼,需要清空BIOS密碼 1)清除CMOS的跳線,2)清除CMOS的按鈕

故障排除:
1.POST 資訊,包括檢測過程和錯誤提示
啟動時顯示 “CMOS battery failed" :需更換新電池
啟動時顯示 ”Floppy disk is fail Press F1 to continue,Del to setup" : 無法驅動軟碟機,按F1建繼續
2. 根據報警音排除
蜂鳴器長鳴 - 記憶體錯誤,清理灰塵,或更換一條插槽

MBR 引導
讀取並執行第一個開機裝置內 MBR 的 boot Loader(grub 等程式),依據 boot loader 的設定載入 Kernel,Kernel 會開始檢測硬體與載入驅動程式;
boot loader 的作用就是載入核心
boot loader 裝入 kernel,然後 kernel 需要執行/sbin/init
BIOS 向GRUB傳遞控制權

GRUB載入程式 (GNU贊助的專案)
載入程式的兩個工作階段
stage1 : 第一階段的載入程式在MBR裡面(446Byte),第一階段用來定位裝載第二階段的載入程式
stage2: 第二階段指載入程式本身,會執行某種應用程式並讀取相應的設定資訊
stage1.5:是stage1和stage2之間的橋樑,由於stage1不能識別檔案系統格式,需要stage1.5來引導位於某個檔案系統當中的stage2
stage1——>stage1.5——>stage2——>grub.conf (Stage2 這個檔案會載入/boot/grub/grub.conf 這個檔案)

刪除stage 的這三個檔案仍然能夠正常啟動,只是刪除了檔名,資料還在,stage1只是MBR中前446位元組的備份
stage1包含了stage2的實體地址,刪除stage2還可以直接找stage2的實體地址,所以能正常啟動

stage1 這個檔案的大小,發現他正好是 512 位元組
那就是(我個人認為)這個 stage1 就是 MBR。所以說,
Stage1 是執行 boot loader 的主程式,它是安裝在我們的啟動磁區。??
device.map 記錄 grub 安裝在哪個磁碟上;

1) BIOS 將控制權交給硬碟的主引導區,即 MBR。
2) MBR 中的 bootloader(stage1)通過內建的地址載入*stage1_5。
3) bootloader 通過*stage1_5 的內容,將分割區中的 stage2 載入。
4) stage2 此時就可以在檔案系統中將 grub.conf 檔案載入,讓使用者看到選項介面。

#shred
-u
:#shred -u stage2
#grub-install /dev/sda //全部修復stage1 ,stage1.5,stage2

INIT進程初始化
INIT進程
:由Linux 核心載入執行/sbin/init 程式,是系統中第一個進程,PID號永遠為1

/sbin/init
在核心載入完畢、進行完硬體檢測與驅動程式載入後,此時主機硬體已經準備就緒了,這時候核心會主動的呼叫第一支程式,那就是 /sbin/init
/sbin/init 最主要的功能就是準備軟體執行的環境,包括系統的主機名、網路設定、語言、檔案系統格式及其他服務的啟動等。

/etc/inittab
設定預設的 runlevel (開機執行級別),Linux 就是通過設定 run level 來規定系統使用不同的服務來啟動,讓 Linux 的使用環境不同
執行級別:執行Linux系統的不同模式,每種模式對應不同的服務程式組合
預設的7種執行級別
0:關機狀態 1:當使用者模式 2:字元介面的多使用者模式(不支援網路) 3:字元介面的完整多使用者模式 4:為分配使用 5:圖形介面的多使用者模式 6:重新啟動

#runlevel 檢視執行級別
切換前的執行級別 當前執行級別
第一個字元為“N”表示之前未切換過執行級別
#init n(1-6)臨時切換執行級別引數

/etc/init/ (不要與目錄/etc/init.d 混淆,/etc/init.d 中包含的是服務指令碼)

/etc/init/rcS.conf
通過啟動大部分的基本服務來對系統進行初始化的設定

/etc/init/rc.conf
對啟動各自的執行級別(runlevel)的設定

/etc/init/control-alt-delete.conf
定義當使用者按“control-alt-delete”三個鍵時的系統行為

/etc/init/tty.conf /etc/init/serial.conf
定義了系統處理終端登入的方式

/etc/rc.d/

/etc/rc.d/rc
根據指定的執行級別,載入或終止相應的系統服務,傳入引數X, 觸發相應的runleve事件

/etc/rc.d/rc.sysinit
由init進程呼叫執行,完成設定網路、主機名、載入檔案系統等初始化工作; 系統模組與相關硬體資訊的初始化

/etc/rc.d/rcn.d/* // 按事先設定的優先順序依次啟動
包含執行級別 n 執行服務狀態設定的符號連線
控制系統在相應執行級別會自動啟動或停止的服務
符號連線名稱:Lddservice_name
L:K / S ,表示停止或啟動服務
dd : 兩位數位表示啟動或停止服務的順序
:# ls -l /etc/rc.d/rc5.d | grep crond
:# ls -l /etc/rc.d/rc0.d | grep crond

/etc/rc.local 指令碼 // 使用者自定義開機啟動指令碼,由rc指令碼呼叫執行
把想啟動的指令碼寫到這個檔案中,開機就能啟動了,注意一點,寫在這裡面的指令碼要使用絕對路徑。只有2、3、4、5級別執行這個檔案
:#cat /etc/rc.local
:#ls -l /etc/rc.d/rc?.d/* | grep rc.local


/etc/sysconfig/init
除了這些通用的檔案,在檔案/etc/sysconfig/init 中還有一些額外的設定在這裡,定義
了一些引數來決定啟動資訊的格式。除了那些不很重要的設定,有三行我們需要注意:

/var/log/dmesg / #dmesg
儲存系統啟動資訊

檢視開機流程順序
1.GRUB Loading Stage2 // BIOS 向GRUB傳遞控制權
2. 引導系統核心
3. 啟動initrd 掛載虛擬根目錄切換真實根目錄 (switching root)
4. 載入rc.sysinit指令碼(welcom to Red Hat Enterprise Linux Server)
5. 重新讀寫掛載檔案系統
6. 進入相應的執行級別,rc.sysinit到此結束
7. 啟動相應執行級別下的指令碼(/etc/rc.d/rcn.d)

———————————————————————————————————————

系統啟動過程排錯

1.使用救援模式引導您的計算機 (使用救援磁碟或者安裝盤)
在沒有安裝紅帽企業版 Linux 的計算機中引導命令列 Linux 系統。這可讓您使用執行 Linux 系統的程式和功能以便修改或者修復已經安裝在您計算機中的系統。
修復模式下,把硬碟的/分割區掛到了/mnt/sysimage 下,把/boot 掛到了/mnt/sysimage/boot 下。如果沒有提示你 chroot /mnt/sysimage 那麼就說明你不可以直接執行 chroot /mnt/sysimage 掛載/根目錄,那麼為啥出現這個提示,是因為我們的 fstab 這個檔案損壞,需要恢復該檔案後,才可以直接掛載/。
進入救援模式後無法掛載根檔案系統(即chroot無效),此時 #which bash ; cp /usr/bin/bash /mnt/sysimage/bin/bash 即拷貝記憶體中的bash到虛擬根檔案系統
救援模式下,如果還處於虛擬根環境下,就不要安裝軟體,安裝到光碟中去了
涉及到載入程式和MBR的用救援模式

2.引導到單使用者模式 : 做一些系統維護,修改密碼等。(在核心命令列後加 1)
進入單人維護模式,而這時候/是唯讀的狀態 mount -o remount,rw /

3.修改核心命令列引數排錯
如:init進程相關組態檔被誤刪,系統停滯,無法完成初始化
避開/sbin/init 啟動系統,如果重要的組態檔損壞,新增引數init=/bin/bash

4.直接在grub> 下輸入命令進行修復,如grub.conf 檔案丟失

Linux 在啟動時可能出現的 trouble 的地方
第一階段:MBR 裡面的引導管理器(IPL, Initial Program Loader)grub 損壞。

第二階段: stage1.5, stage2 損壞;找不到 grub.conf ; 找不到 kernel

第三階段: 找不到 initramfs .img; fstab 分割區掛載失敗; 磁碟卷標不匹配或丟失

第四階段: inittab 初始化指令碼失敗 ;圖形介面載入失敗;服務進程錯誤

常見症狀
1. 不顯示引導載入器初始螢幕或提示
grub 設定錯誤;引導區損壞;寫入引導區之後,BIOS設定(例如磁碟定址方案)被修改

2.無法載入任何核心區域或只載入部分核心,隨後出現異常
核心映象損壞;通過啟動載入傳遞到核心的引數錯誤

3.已完全載入核心,但嘗試掛載root檔案系統並執行/sbin/init時,發生異常或故障
啟動載入器設定錯誤;/sbin/init 損壞或 /etc/inittab設定錯誤;root檔案系統已損壞或不可掛載

4.已完全載入核心,/etc/rc.d/rc.sysinit 已經啟動但中斷
缺少/bin/bash 或它已損壞;/etc/fstab 可能出現錯誤,對檔案系統進行掛載和fsck操作時很明顯;損壞的非root檔案系統(因無法進行fsck操作)

5.執行級別錯誤(典型服務)
沒有為指定執行級別設定有故障的服務所需的其他服務;特定於服務的設定錯誤

常見現象:
一、螢幕一片黑,無法看到 grub 介面 // MBR 裡面的 grub 損壞
法一 進入修復模式
sh-4.1# chroot /mnt/sysimage
sh-4.1# grub
grub> root (hd0,0)
grub> setup (hd0)
注意:
1、此方法修復 grub 依賴於/boot/grub/grub.conf,如果 grub.conf 不存在,則需手工建立一個。建立方法請參考下文。
2、用此方法修復 grub 是把/boot/grub 下的 stage 映象安裝到硬碟上的特定位置上。所以使用此法修復 grub 僅限於是硬碟上的 stage1(在 MBR 裡)以及 stage1.5,修復依賴於/boot/grub 下的 stage1, stage1.5, stage2 映象。如果這幾個映象也遭到破壞, 則此法無效。
法二 進入修復模式
SH-4.1# chroot /mnt/sysimage
SH-4.1# grub-install /dev/sda
注意:
1、此方法修復 grub 依賴於/boot/grub/grub.conf,如果 grub.conf 不存在,則需手工建立一個。
2、此方法不依賴於 grub.conf,當/boot /grub 下檔案都找到破壞,亦可用次命令修復。但不修復 grub.conf。

二、grub 警告:Error 15——stage1.5 報錯,極有可能是stage1.5 載入 stage2 失敗
grub-install /dev/sda 不一定能成功。 grub-install 的安裝必須依賴 grub.conf 這個設定。如果這個設定不存在,grub 是 install 不了的。按以下方法對修復grub.conf
注意:
1、初始狀態的 stage1 並不會去讀取/boot/grub/下的 stage1.5 和 stage2。位於 MBR 的 stage1會去讀取硬碟某個位置的 stage1.5,然後直接引導核心。
2、如果機器上的 grub 是經過修復的,比如用 grub-install 或者進入 grub 然後 setup 過。那麼就不一樣了。此時 stage 會去引導/boot/grub 下的 stage2。

三、Grub>: 直接進入 grub shell 介面——找不到 grub.conf 檔案
法一
有些組態檔是 rpm 自帶的。在安裝 rpm 時會自動生成。但是,有些組態檔是根據你機器設定事實生成的。這種組態檔就不一定能靠重灌相關的包來修復。自己手動重寫。
修復:進入修復模式,參照下面所示根據實際環境編輯 grub.conf
sh-4.1# chroot /mnt/sysimage
sh-4.1# echo /boot/vmlinuz -2.6.32-220.el6.i686 >> /boot/grub/grub.conf
sh-4.1# echo /boot/initramfs -2.6.32-220.el6.i686.img >> /boo t/grub/grub.conf
法二
grub> root (hd0,0)
grub> kernel /vmvmlinuz-2.6.32-279.el6.i686 (補齊)ro root=/dev/sda2
grub> initrd /initramfs-2.6.32-279.el6.i686.img (補齊)
grub> boot
此時可啟動系統,啟動系統後修復核心組態檔

四、grub 警告:Error 15: File not found——找不到 kernel 或者 initrd.img // Stage1.5 報錯。
首先確定 kernel 以及 initrmfs.img 檔案是否存在 ——> 確定指定 kernel 所在磁碟分割區的 root 引數是否寫對 (在 grub 介面利用<TAB>自動補全功能檢查/boot/grub/grub
.conf 設定是否正確。)
1. 如果發現核心丟失 進入修復模式,掛載安裝盤,強制重灌核心
進入修復模式
sh-4.1# chroot /mnt/sysimage
sh-4.1# mount /dev/cdrom /media
sh-4.1# cd /media/Packages
sh-4.1# rpm -ivh --force kernel-2.6.32-220.el6.i686.rpm
sh-4.1# reboot
2. 如果 initramfs.img 檔案丟失,可以使用 mkinitrd 命令新建
進入修復模式
sh-4.1# chroot /mnt/sysimage
sh-4.1# mkinitrd /boot/initramfs -$(uname -r).img $(uname-r)

五、Kernel panic (原因很多)
Switchroot: mount failed: No such file or directory
Kernel panic – not syncing: Attempted to kill init! ——核心掛載 root 分割區失敗
常見的原因有root 分割區遭到破壞,或者核心不能正確定位 root 分割區。
1.如果是 root 分割區遭到破壞,那麼這個不在我們討論的範圍之內。
2. 如果是核心不能正確定位 root 分割區,則我們可以嘗試修復之。通常情況下核心如何定位 root 分割區呢?一般是通過 grub 在引導起核心的時候,給核心指定 root 分割區的位置。
檢查 kernel 選項引數。核對 root 引數是否正確

六:/etc/fstab 檔案錯誤或者丟失

檔案丟失怎麼辦?
1.使用備份的檔案還原
2.安裝該檔案的軟體 #rpm -qf [檔案絕對路徑]
3.參照組態檔手寫或匯入(echo)

命令丟失且不能安裝軟體包怎麼辦?
#which rpm
#rpm -qf /bin/rpm
#cp /mnt/Packages/rpm-4.8.0-32.el6.i686.rpm /test
#rpm2cpio rpm-4.8.0-32.el6.i686.rpm > rpm.cpio
#file rpm.cpio
#cpio -id < rpm.cpio
#ls /test/bin

 


IT145.com E-mail:sddin#qq.com