一、爲什麼要研究linux系統啓動:
或 許有人會說,等它開機就好了,爲什麼還要研究它開機流程呢,其實如果服務器運行很好又沒有人爲的誤操作等,或許不用研究,但是爲了能在系統出問題後第一時 間的修復它,又或者你忘記了root密碼等情況時就非常有必要研究一下linux的開機流程了,因爲只有知道了它是如何運作的,才能讓它更好的服務與人 類,廢話不多說,正文開始
二、系統啓動流程:
不同的版本的linux系統開機可能不同,但是總的來說,大同小異,下面就以centos6.8的系統爲例,介紹linux的開機過程。
post加電自檢---> MBR引導--> GRUB引導--->加載內核--->啓動init--->各種初始化腳本運行--->執行/bin/login --->開機過程結束
1. 加電自檢:
加 電自檢post(power on system test):加電自檢主要是檢查各硬件是否存在並能正常運行,包括cpu,內存,硬盤,cpu風扇,有的甚至包括鍵盤鼠標的外設的檢測,這一段名叫 BIOS的程序是存放在CMOS的硬件芯片上面,加電就是給CMOS 加電,由於CMOS是rom芯片,所以還有一個單獨的ram芯片用來存放它的配置信息,這就是主板爲什麼要放一塊電池的原因了。
2. 選擇啓動順序加載MBR(master boot recoder)啓用bootloader程序加載內核:
經 過一系列的硬件檢測完畢後,並順利通過後,就要加載MBR了,MBR存放在第一個可啓動硬盤的第一個分區內,大小爲512byte,這512個字節當中前 446byte就是bootloader,以及隨後的64字節的分區表,2byte分區結束標誌,第一部分的bootloader部分就是主引導記錄的第 一部分,因爲引導程序功能較爲強大並且會有驅動文件,是446byte字節能存放,後續將介紹它的其它部分。第一部分的bootloader程序會調用 512個字節之後的一部分扇區中的數據,這些數據包括/boot分區的驅動,因爲軟件和硬件的連接必須通過驅動的翻譯,此時通過/boot分區的驅動,加 載好了/boot,該分區中包含了grub程序的第二部分,和內核鏡像文件,還有就是initramfs文件,如果此時加載 / 分區的話,因爲 / 分區不一定和 /boot 分區是同一種文件系統,不同的文件系統需要的文件系統的驅動是不同的,所以grub會將initram文件加載至內存當中解壓,並且此時要加載內核文件, 解壓後會在該文件系統形成一個類似於 / 的文件系統 在此時的 “/” 中的lib中有系統真正的 / 的各種文件系統驅動,此時就可以加載根文件系統了
3. 啓動init以及各種啓動腳本:
加 載好根文件系統就要啓動用戶的第一個執行程序/sbin/init*, 其中包括/etc/inittab ,/etc/init/*.conf(在centos5中是直接一個/inittab文件,順序執行,速度較慢,到了6時許多被依賴的程序服務等先執行, 並且沒有依賴關係的也同時執行,到了7時配置文件變成了/usr/lib/systemd/* 此時系統的啓動就已經非常快了,許多服務都可以同時啓動,即使是被依賴的也可以並行啓動,加快了開機速度)
init文件主要定義了下面的幾項:
(1)開機啓動級別選擇0-6共七個:
0:關閉所有服務關機
1: 維護模式的單用戶模式
2: 維護模式的多用戶模式
3:正常級別,多用戶模式
4:未定義
5:正常級別,帶有圖形化的多用戶模式
6:關閉所有服務重啓
注:可以使用runlevel,或者who -r 命令檢查當前系統的運行級別
(2) 使用/etc/rc.d/rc.sysinit 進行系統初始化
a) 根據配置文件進行設置主機名
b) 打印文本歡迎信息
c) 激活Selinux和udev
d) 掛載所有定義在/etc/fstab文件的文件系統
e) 激活swap分區
f) 檢測根文件系統並實現以讀寫掛載根
g) 設置系統時鐘
h) 根據/etc/sysctl.conf文件設定內核參數
i) 激活LVM和RAID設備
j) 加載額外的設備驅動
k) 清理操作
(3) 執行選擇了開機啓動的級別下相應的腳本/etc/rc.d/rc#.d
/etc/rc.d/rc#.d/ 該目錄的執行需要根據/etc/init/rc 文件選擇是否啓動什麼服務,在rc文件當中執行一個for循環先執行K*的文件的服務進行stop,S開頭的服務啓動在相應的啓動級別下面都是許多個軟鏈 接文件,這些文件指向/etc/rc.d/下面的服務腳本,並且這些軟鏈接文件分別是以S開頭和K開頭的文件,S表示在該運行級別要啓動的服務,K開頭的 表示該級別不需要啓動的服務,有人會說,在開機是該服務就沒有啓動,爲什麼還要停一次呢?本來服務就沒有啓動,停它幹啥?確實是這樣,但是你有沒有想過, 假如在運行級別3已經開啓了該服務,但是你想要切換至運行級別5,而5的級別恰巧不需要啓動該服務怎麼辦?當然應該停掉了!所以,在rc腳本中for循環 裏使用了判斷如果在/var/lock/subsys/下面有該服務時,循環執行continue,跳過啓動語句執行下一次循環,知道循環結束,/var /lock/subsys/目錄中只要啓動一個服務在這個鎖文件目錄中就會產生一個文件。這樣通過執行/etc/init/init#.d/ 下面的所有服務腳本,就可以啓動所有系統的腳本了。
如果自己想定義一個腳本想要像是系統服務那樣啓動怎樣做?
在 /etc/init/init.d/下面有大量的服務腳本,可以參考,要想系統定義的腳本那樣包括#!/bin/bash 這一行的shell定義,chkconfig定義,以及描述相關的description:將寫好的腳本放在該目錄下面使用chkconfig --{add|del} 腳本名字添加或者刪除腳本。
附:服務腳本頭部示例:
[root@cnode6_8 init.d]# head -n 12 nfs #!/bin/sh # # nfs This shell script takes care of starting and stopping # the NFS services. # # chkconfig: - 30 60 # description: NFS is a popular protocol for file sharing across networks. # This service provides NFS server functionality, which is \ # configured via the /etc/exports file. # probe: true # config: /etc/sysconfig/nfs
當然在也/etc/rc.local 或者/etc/rc.d/rc.local兩個文件中定義自己的腳本執行路徑,只不過在該文件中定義的文件執行優先級爲最低的,要等到所有的系統服務腳本執行完,才能執行
(4)配置ctrl+alt+del鍵的功能,建議關閉此功能防止誤操作重啓服務器。
該配置在centos5中就直接在/etc/inittab中,到了6之後可以通過/etc/inittab文件的註釋看到該配置已經轉移到了/etc/init/control-alt-delete.conf當中將該行註釋掉即可
(5)配置不斷電系統pf,pr兩種機制
這兩種機制是爲了保護系統,在系統突然斷電時,保證系統能正常關機,但是有可能是因爲電源不穩定而突然斷電,然後再很短的時間內電源再次有了電,此時就應該取消關機,默認是在2min之後關機,但是在2min之內有電後會取消關機
(6)啓動mingetty 6個終端
在6個終端中因爲有前面定義respawn關鍵字,所以這6個終端變成了打不死的小強,當你用kill將它們其中一個殺死後,系統會換一個進程號重新啓動它
(7) 如果選擇5級別,則會啓動 /etc/X11/prefdm -nodaemon啓動圖形化界面
至此係統已經能正常進入啓動狀態啦!