一、CentOS? 5和6的啟動流程
linux內核: 存在于/boot分區,是整個操作系統的最底層,它負責整個硬件的驅動,以及提供各種系統所需的核心功能,包括防火墻機制、是否支持LVM或Quota等文件系統等等,如果內核不認識某個最新的硬件,那么硬件也就無法被驅動,你也就無法使用該硬件。
計算機真正工作的東西其實是硬件,例如數值運算要使用到CPU、數據儲存要使用到硬盤、圖形顯示會用到顯示適配器、音樂發聲要有音效芯片、連接Internet 可能需要網絡卡等等。內核就是控制這些芯片如何工作。
Linux的非核心驅動程序(大部分驅動程序,如網卡):存放于/lib/modules//lib/modules/VERSION-release.ko文件,支持內核模塊的動態裝載和卸載
modprobe 模塊名 #裝載模塊
modprobe -r 模塊名 #卸載模塊
lsmod 模塊名 #查看是否裝載了模塊
ramdisk:輔助偽文件系統,加載一些必要的驅動程序
Centos5: /boot/initrd-version-release.img
Centos6、7:/boot/initramfs-version-release .img
Centos6的啟動
1.加載BIOS的硬件信息,獲取第一個啟動設備(在啟動時需要配置bios)
2.讀取第一個啟動設備MBR的引導加載程序的啟動信息我稱之為grub的1階段,MBR:也稱為引導扇區,有446個字節的引導區和64個字節的分區表構成最后兩個字節為55AA表示結束,沒有特定的含義;當然,我們的操作系統是都是由一個個文件組成的,而文件是需要建立在文件系統之上的,如果沒有文件系統,那么我們的文件將無法組織,而446個字節很顯現不夠存放一個文件系統的驅動,那么446個字節的作用是什么呢?這446個字節的引導區,稱之為引導區,不如稱之為一個指針(個人而言啊,并不官方),這446個字節指向了MBR后續的27個扇區,用來加載我們操作系統分區的文件系統,讓我們在啟動系統的時候可以識別最基本的/boot分區,這個階段我稱之為grub的1.5階段,當加載完這27個扇區之后,我們就可以識別/boot分區下的文件系統了。這時進入引導的第2階段系統會加載 /boot/grub/grub.cfg文件,并支持可操作的grub界面。
3.經歷了grub的引導階段,這時加載核心操作系統的核心信息,核心開始解壓縮,進行自身初始化
4.探測可識別到的所有硬件設備,加載硬件驅動程序(借助于ramdisk加載驅動 Centos6為 initramfs)
5.從initramfs中chroot到真是的/下
6.運行用戶空間的第一個應用程序:/sbin/init,并獲取默認的運行信息
7.init程序執行/etc/rc.d/rc.sysinit文件
8.init執行運行的各個服務啟動scripts
9.init執行/etc/rc.d/rc.local
10.執行/bin/login程序,等待用戶登錄
11.登錄之后開始以Shell控制主機
POST –> Boot Sequence(BIOS) –> Boot Loader –> Kernel(ramdisk) –> rootfs –> switchroot –> /sbin/init –>(/etc/inittab, /etc/init/*.conf) –> 設定默認運行級別 –> 系統初始化腳本rc.sysinit –> 關閉或啟動對應級別的服務 –> 啟動終端
/etc/rc.d/rc.sysinit: 系統初始化腳本的工作流程
(1) 設置主機名
(2) 設置歡迎信息
(3) 激活udev和selinux
(4) 掛載/etc/fstab文件中定義的文件系統
(5) 檢測根文件系統,并以讀寫方式重新掛載根文件系統
(6) 設置系統時鐘
(7) 激活swap設備
(8) 根據/etc/sysctl.conf文件設置內核參數
(9) 激活lvm及software raid設備
(10) 加載額外設備的驅動程序
(11) 清理操作
二、運行級別
運行級別:為系統運行或維護等目的而設定;0-6:7個級別
0:關機
1:單用戶模式(root自動登錄), single, 維護模式
2: 多用戶模式,啟動網絡功能,但不會啟動NFS;維護模式
3:多用戶模式,正常模式;文本界面
4:預留級別;可同3級別
5:多用戶模式,正常模式;圖形界面
6:重啟
默認級別: 3, 5
三、故障分析和解決方法(記得啟動時關閉selinux,否則你會悲劇的,啟動的時候在grub內核加載環節中,在內核參數最后加入selinux=0):
1、initramfs文件被破壞的解決方法
ramdisk(initrd或initramfs)文件的制作,可以在光盤救援模式下進行:
(1) mkinitrd命令(內部實際調用的dracut命令
為當前正在使用的內核重新制作ramdisk文件
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
(2) dracut命令
為當前正在使用的內核重新制作ramdisk文件
dracut /boot/initramfs-$(uname -r).img $(uname -r)
2、MBR446個字節引導區被破壞(dd if=/dev/zero of=/dev/sda bs=1 count=446 ; sync),由下圖可見系統已經無法正常引導
破壞MBR后的系統啟動狀態
這是我們使用救援光盤,啟動救援模式
系統提示,救援光盤已經掃描到了,我們服務器上已經存在的系統,并在之后掛載到/mnt/sysimage目錄下
首先我們需要把根切換到/mnt/sysimage/下,然后使用grub-install /dev/sda 重新安裝grub
我們使用hexdump 查看一下sda的MBR扇區是否已經恢復了。
系統已經可以正常啟動了
3、內核丟失補救
現在我們把內核刪了
因為系統已經啟動,并且內核已經加載到了內存當中,所以先階段,內核文件損壞不會影響到系統的運行,但是如果重啟系統,系統將不能正常運行。下圖為刪除內核后提示錯誤信息
這種情況下,系統加載不到內核,單用戶模式都無法啟用,我們還是使用救援光盤來恢復
我們真正的系統存在路徑在 /mnt/sysimage,因為內核丟失,所以我們需要重新安裝內核,我們將光盤掛載到真正根的/mnt目錄,并chroot到真正根目錄下
重新安裝內核
重啟,系統可以正常啟動了,但是注意一點,在生產環境中,如果有編譯內核的需要,必須要做/boot目錄的備份工作,如果定制的內核丟失,使用rpm的安裝方式,修改一下grub.conf文件的內核指向,雖然依然可以正常使用,但是可能會導致系統的一些服務無法正常使用,而重新編內內核的話,但是當時編譯時的選項忘記了怎么辦。。這將是一個很糾結的問題,所以,備份備份!重中之重!
4、/etc/fstab 文件損壞的錯誤提示,和修復方法(我們依然使用刪除的辦法來破壞)
重啟系統
啟動時按esc,可以很清楚的看到,第一條錯誤提示 /etc/fstab: open failed: No shuch file or directory ! 說明文件丟失,后面需要在磁盤上做的操作都做不了,在這里就卡住了。
解決方法:1、使用救援光盤,進入系統后重新編輯/etc/fstab文件
2、使用單用戶模式進入,這時系統直接進入,不需要輸入口令,但是系統值掛載了根,我們現在需要做的是,以讀寫的方式重新掛在根,并編輯/etc/fstab文件(這里我們使用第二種方法來操作?。?br />這時候我們根據下面提示,按e,進入grub的編輯模式
上下鍵移動到kernel再點e,編輯引導參數
在quiet后面輸入1回車,按b鍵啟動系統
圖可見,系統只掛在了根分區,其他分區信息一概沒有
現在重新建立/etc/fstab文件,該文件必要的幾條信息,就是根分區的信息和 /boot分區的信息還有swap分區,其他分區都是選填的(有的生產環境會為為home單獨建立分區,該條目也必須填寫,否則無法正常登陸普通用戶),現在這種情況只能挨次掛載各個分區,查看其信息。輸入blkid可以看到sda5是swap分區,那么這個就確認了,而系統啟動sda2是根分區這個也是確認的,那么只差boot分區,一般boot分區都是磁盤的第一個分區,那么我們臨時將sda1臨時掛載在一個目錄下,看一下里面的文件是否是boot的。
掛載 /sda1到mnt下
sda1為boot分區,現在信息已經確認,我們來修復/etc/fstab文件
提示文件系統只讀,重新掛載一下根分區,再編輯文件
使用vim /etc/fstab編輯文件
在命令模式下輸入r!blkid 將設備信息導入到編輯框內
編輯后的fstab文件,現在我們重啟系統
系統已經可以正常啟動了!修復fstab文件的問題已經解決。
如果系統使用的lvm的方式安裝的,那么在掛在lv的時候需要使用vgchange -ay 來激活所有vg,然后才能掛在lv
5、整個boot目錄損壞的恢復方法
由下圖演示,我們已經破壞了真個boot分區,連文件系統都已經損壞了,毫無疑問,重啟將無法啟動,這時候我們使用光盤來恢復boot分區
第一步先掛載光盤到/mnt/sysimage/mnt下(真實根的mnt目錄下
第二步chroot到真實的根
第三步修復文件系統,并掛載到/boot下
安裝kernel
kernel安裝成功,但是initramfs生成失敗,我們看一下問題,我想應該是重新制作的文件系統,在fstab中掛載的uuid變了
修改fstab中記錄,并重新生成initramfs文件
重新安裝grub,并編輯grub.conf
default 0 : 默認為0選項
timeout 3 : 3秒自動加載系統
hiddenmenu 隱藏菜單
kernel:加載內核 root為根分區的uuid或者使用設備名也行,建議使用uuid
initrd :指定initramfs文件
修復grub引導
安裝失敗,這個問題我暫時沒有找到,但是/boot/grub/下的引導文件已經安裝好了,如果系統起不來可以在grub命令行界面安裝grub的1.5階段
1.5引導階段的數據安裝成功,hd0,0為引導分區,即boot分區,如果/boot/grub/grub.conf文件配置正確的話,將可以正常啟動了。
6、系統,/sbin/init文件被破壞
init文件依賴upstart安裝包,重新安裝這個包就行了,進入救援模式或者在grub菜單界面按e修改內參數,在quiet 后面添加 init=/bin/bash,用bash來代替init,這樣我們便可以進入命令行使用一些基礎的命令來操作了,下面是操作步驟
直接清空/sbin/init文件的內容,然后重啟,到grub引導界面,我們修改內核參數 在quiet后面添加 init=/bin/bash 回車并按B鍵啟動
掛載光驅到/mnt下
嘗試安裝 upstart包
安裝成功了,重啟系統,可以正常啟動了。
7、如果一些配置文件丟失或軟件誤刪除,且無備份,可以通過重新安裝軟件包來恢復,例:
首先查找到/etc/inittab屬于哪一個RPM包
chroot /mnt/sysimage
rpm -qf /etc/inittab
initscripts-9.03.49-1.el6.centos.x86_64
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/99002