1. 程式人生 > >Linux啟動流程與模組管理(15)

Linux啟動流程與模組管理(15)

系統的啟動其實是一項非常複雜的過程,因為核心得要檢測硬體並載入適當的驅動程式,接下來則必須要呼叫程式來準備好系統執行的環境,以讓使用者能夠順利的操作整臺主機系統,如果你能夠理解系統啟動的原理,那麼將有助於你在系統出問題時能夠很快速的修復系統,而且還能夠順利的配置多重作業系統的多重啟動問題,為了多重啟動的問題,你就不能不學 grub 這個 Linux 下優秀的啟動管理程式(boot loader),而在系統執行期間,你也得要學會管理核心模組,下面進入正題開始學習吧.

關於Linux系統的啟動流程一覽

作業系統的啟動過程是一個很複雜的過程,在啟動過程中,那個引導裝載程式(BootLoader)使用的軟體可能不一樣,例如目前主流發行版為GRUB,但是呢早期Linux系統使用的是,LILO,現在很多人喜歡使用SPFDISK,不管如何,我們總要了解整個(BootLoader)的工作情況,才能瞭解怎樣進行多重引導的設定.

這裡以個人計算機搭建的Linux主機為例子,當你按下電源時計算機硬體會主動讀取BIOS來載入硬體的一些資訊,和自我檢測,之後系統會讀取第一個可啟動的裝置(由BIOS設定的),此時就可以讀入引導裝載程式啦.

引導裝載程式可以指定使用那個核心來啟動,並負責實際載入核心到記憶體當中解壓與執行,此時核心就能夠開始在記憶體中活動啦,並檢測所有硬體資訊,與載入相應的驅動程式,等到核心載入驅動完畢,此時我們的作業系統就完成整個啟動過程啦,簡單的歸納來說,系統的啟動流程是這樣的:

● 按下開機按鈕,這個是必須的,奧對了,必須要有電才可以.
● 系統會載入BIOS,來進行硬體資訊的讀取,和自我檢測,並依據設定取得第一個可啟動裝置.
● 讀取並執行第一個可啟動裝置內 MBR 記錄裡的 BootLoader(grub或者是spfdisk).
● 依據BootLoader裡的設定載入核心,核心會開始檢測硬體,並載入相應的驅動程式.
● 在完成驅動的載入後,核心此時會主動呼叫systemd程序,而systemd程序會取得run-level資訊.
● systemd程序執行 /etc/rc.d/init.d

內的指令碼,部署操作環境(如網路,時區等).
● systemd程序執行,run-level的各個服務程式指令碼,來啟動指定執行級別的各種服務.
● systemd程序執行 /etc/rc.d/rc.local 載入內部的一些資料.
● systemd程序執行終端機模擬程式mingetty來啟動login程式,最後等待使用者的登陸.

以上的流程,就是Linux系統的啟動流程,你會發現systemd程序非常重要,當然這可是系統的根,這些內容你最好背過,要不然面試問到的話就尷尬啦.

關於BIOS開機自檢與MBR主引導記錄

想要啟動一個系統首先就得讓系統去載入BIOS,並通過BIOS程式去載入CMOS裡的相關資訊,並通過CMOS裡的設定值去讀取主機的各項硬體配置,例如:CPU頻率,記憶體大小,系統時間等常規的引數.

接著在取得這些資訊後,BIOS還會進行開機自檢(Power-On Self Test,POST),然後開始執行硬體檢測初始化,並配置PNP裝置等,之後再定義出可啟動的裝置順序,接下來就會開始進行啟動裝置的資料讀取了(MBR的相關任務開始).

BIOS會指定啟動的裝置,好讓我們可以讀取磁碟中的作業系統核心檔案,但由於不同的作業系統的檔案格式並不相同,因此我們必須要以一個引導裝載程式來處理核心檔案的載入問題,這個引導裝載程式就被稱為BootLoader,這個BootLoader程式就安裝在啟動裝置的第一個扇區內,也就是我們所說的MBR(主引導記錄)了.

其實只要BIOS能夠檢測得到你的磁碟,那麼它就有辦法來讀取你的第一個扇區,如此一來,BootLoader也夠被執行.

Boot Loader的功能

每個檔案系統 (filesystem,或者 partition) 都會保留一塊引導扇區 (boot sector) 提供作業系統安裝 boot loader,而通常作業系統預設都會安裝一份 loader 到他根目錄所在的檔案系統的 boot sector 上.

每個作業系統預設是會安裝一套 boot loader 到他自己的檔案系統中,而在 Linux 系統安裝時,你可以選擇將 boot loader 安裝到 MBR 去,也可以選擇不安裝。.如果選擇安裝到 MBR 的話,那理論上你在 MBR 與 boot sector 都會保有一份 boot loader 程式的,至於 Windows 安裝時,他預設會主動的將 MBR 與 boot sector 都裝上一份 boot loader 所以你會發現安裝多重作業系統時,你的 MBR 常常會被不同的作業系統的 boot loader 所覆蓋.

BootLoader的常用功能有以下幾個

1.提供一個選單:使用者可以選擇不同的啟動項.
2.載入核心檔案:直接執行可啟動系統的區段.
3.轉交給其他loader:將引導裝載入成功,轉交給其他loader負責.

由於具有選單功能,因此我們可以選擇不同的核心來啟動,這裡需要強調的是,如果要裝雙系統應該先裝windows再裝linux.

載入核心自檢與systemd的功能

接下來就是載入核心的時候啦,由於我們的Linux驅動都是以模組的形式存在的,比如鍵盤滑鼠驅動,網路驅動等,包括我們的硬碟驅動,常用的一些驅動檔案就是放在/lib/modules目錄內的,那麼這裡就出現了一個問題,想一下,我們的硬碟驅動是在Linux模組裡的,而我們要使用硬碟才是能啟動系統,系統沒啟動也就無法載入磁碟驅動,無法載入磁碟驅動也就無法開啟磁碟啊,這裡就出現了一個東西,那就是虛擬檔案系統(InitiaIRAM Disk).

虛擬檔案系統,一般使用的檔名為/boot/initrd,這個檔案的作用是臨時載入一些系統啟動而需要用到的驅動的,你可以把它想象成是一個微型的Linux系統,它的作用只是載入系統的必要驅動而已,通過該程式來載入啟動過程中所最需要的核心模組,通常這些模組就是 U盤,RAID,LVM,SCSI等檔案系統與磁碟驅動程式,等載入完成後會自動呼叫 /sbin/init 將控制權交給完整的Linux系統管理.

當上面的工作完成後,我們的系統已經可以開始工作啦,下面就要將控制權交給/sbin/init來進一步初始化我們的系統環境.

第一個程序init,與/etc/inittab

當核心載入完成後,我們的init程序就開始幹活了,/sbin/init主要的任務就是載入後續的系統環境,比如終端的變數,或者呼叫其它配置檔案,繼續幹活,其最主要的是系統的執行等級,我們的系統有以下7個執行等級,分別是:

基本上runlevel分為0-6 ,7個等級:

0:關機-shutdown
1:單使用者模式(sigle user),root使用者,無須認證;維護模式
2:多使用者模式(multi user),會啟動網路功能,但不會啟動NFS;維護模式
3:多使用者模式(multi user),完全功能模式;文字介面
4:預留級別:目前無特別使用目的,但習慣同3級別使用
5:多使用者模式(multi user),完全功能模式,圖形介面
6:重啟模式

由於 run level 0, 4, 6 不是關機、重新啟動就是系統保留的,所以:『 您當然不能將預設的 run level 配置為這三個值 』,否則系統就會不斷的自動關機或自動重新啟動.

完成級別的選擇之後,下一步就是進一步呼叫配置檔案,繼續載入引數.

系統初始化的過程主要是執行一些指令碼配置檔案來完成的:

1.執行系統初始化指令碼(/etc/rc.d/rc.sysinit)對系統進行基本的配置以讀寫方式掛載,根檔案系統及其它檔案系統,到此係統算是基本執行起來了,後面需要進行執行級別的確定及相應服務的啟動.
2.執行/etc/rc.d/rc指令碼,該檔案定義了服務啟動的順序是先K後S,而具體的每個執行級別的服務狀態是放在/etc/rc.d/目錄下,所有的檔案均是指向/etc/init.d下相應檔案的符號連結,rc.sysinit通過分析/etc/inittab檔案來確定系統的啟動級別,然後才去執行/etc/rc.d/rc.d下的檔案.
3.執行使用者自定義載入程式/etc/rc.d/rc.local完成了系統所有的啟動任務後,linux會啟動終端或X-Window來等待使用者登入.
4.最後一步輸入使用者名稱及密碼就可以登入系統了.

至此我們的作業系統就啟動起來啦,接下來看一下常用的啟動管理命令吧.

GRUB相關配置

改開機等待時間

1.第一步修改GRUB配置檔案,改掉幾個配置引數,然後生成寫入/boot目錄即可.

[[email protected] ~]# vim /etc/default/grub

GRUB_TIMEOUT=5    #引導時間
GRUB_DEFAULT=1    #從哪個核心引導,預設是0

[[email protected] ~]# grub2-mkconfig -o /boot/grub2/grub.cfg

啟動GRUB加密

1.第一種方式是明文設定,不推薦,但下面還是要看一下配置流程的.

[[email protected] ~]# vim /etc/grub.d/00_header
檔案末尾追加

cat << EOF
set superusers=admin
password admin 123123
EOF

[[email protected] ~]# grub2-mkconfig -o /boot/grub2/grub.cfg

2.第二種方法,先加密我們的密碼,此處通過命令生成.

[[email protected] ~]# grub2-mkpasswd-pbkdf2
Enter password:
Reenter password:

PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.4E2254C5684C9F12C06354A090B8447B0D1532D1BCA9FA5CBE870E7
0E1ED46A25BD3D2443E2E3676613AAF909FD4F34C213B2904C7580B1096B1E16736E48883.D5C3FDF2DF61424C6655FE343CE909C0D13B65
95312DD50CE764B6EC3954347BA63E04CA62D6B3DA1AE00D5DAA8CF8DCF752F8046BFB18F5B19604DCE512C09E

接著複製這一行將密碼列用金鑰代替即可.

[[email protected] ~]# vim /etc/grub.d/00_header
檔案末尾追加

cat << EOF
set superusers=admin
password_bkdf2 admin grub.pbkdf2.sha512.10000.4E2254C5684C9F12C06354A090B8447B0D1532D1BCA9FA5CBE870E7
0E1ED46A25BD3D2443E2E3676613AAF909FD4F34C213B2904C7580B1096B1E16736E48883.D5C3FDF2DF61424C6655FE343CE909C0D13B65
95312DD50CE764B6EC3954347BA63E04CA62D6B3DA1AE00D5DAA8CF8DCF752F8046BFB18F5B19604DCE512C09E
EOF

[[email protected] ~]# grub2-mkconfig -o /boot/grub2/grub.cfg


Linux系統修復流程

◆破解開機密碼◆

1.如果我們的開機密碼忘記了,我們可以使用如下方法解決.重啟系統按e鍵,找到linux16加入以下內容.

linux16 /vmlinuz-3.10.0 root=/dev/centos-root rhgb quiet

刪除: rhgb quiet 新增上:init=/bin/sh
按住: CTRL+X

2.接著會看到進入到一個shell環境,我們依次執行以下程式碼即可.

sh-4.2# mount -o remount,rw /
sh-4.2# echo "redhat" | passwd --stdin root
sh-4.2# touch /.autorelabel
sh-4.2# exec /sbin/init

◆破解GRUB密碼◆

grub密碼也忘記了,如何修改密碼.(光碟救援模式)瞭解下.

執行以下步驟:Troubleshooting -> Rescue a CentOS system -> Continue ->/bin/sh 會進入光碟系統.

sh-4.2# chroot /mnt/sysimage/
sh-4.2# vi /etc/grub.d/00_header

刪除以下欄位
cat << EOF
set superusers=admin
password admin 123123
EOF

[[email protected] ~]# grub2-mkconfig -o /boot/grub2/grub.cfg

◆MBR/GRUB修復◆

1.使用命令來模擬資料損壞,這裡我們強制覆蓋硬碟的前446位元組的資料,來模擬MBR損壞.

[[email protected] ~]# dd if=/dev/zero of=/dev/sda bs=1 count=446
[[email protected] ~]# reboot

2.執行完成上面的步驟再次開機,會發現自動的從光碟引導啟動啦,原因就是我們的MBR被刪除了,而系統會預設尋找第二個啟動裝置,此時正好光碟能夠被啟動.

執行以下步驟:Troubleshooting -> Rescue a CentOS system -> Continue ->/bin/sh 會進入光碟系統.

sh-4.2# chroot /mnt/sysimage            #切換到硬碟分割槽
bash-4.2# grub2-install /dev/sda        #把grub裝在sda裡面
bash-4.2# exit
sh-4.2# reboot

如上我們就完成了MBR的修復工作,再次開機系統會進入正常的環境啦.

◆BOOT丟失修復◆

1.這裡我們通過刪除/boot/目錄下的所有檔案,來模擬BOOT檔案丟失的修復流程.

[[email protected] ~]# rm -fr /boot/*
[[email protected] ~]# reboot

2.此時重啟後我們的系統就無法正常使用啦,會看到以下grub rescue>提示符,說明我們的GRUB沒問題,接下來我們來修復,老樣子掛載光碟使用光碟系統進入bash並修復一下.

執行以下步驟:F12->CD-ROM->Troubleshooting -> Rescue a CentOS system -> Continue ->/bin/sh 會進入光碟系統.

sh-4.2# chroot /mnt/sysimage/
bash-4.2# mount /dev/sr0 /mnt
bash-4.2# rpm -ivh --force /mnt/Packages/kernel-3.10.0-862.el7.rpm

bash-4.2# mkdir /boot/grub2                        #建立BRUB目錄,並修復
bash-4.2# grub2-mkconfig -o /boot/grub2/grub.cfg
bash-4.2# grub2-install /dev/sda

bash-4.2# exit
sh-4.2# reboot

到此為止我們的/boot目錄就修復成功啦,是不是很簡單啊.