一、 為什么要研究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/* 此時系統的啟動就已經非??炝耍S多服務都可以同時啟動,即使是被依賴的也可以并行啟動,加快了開機速度)
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啟動圖形化界面
至此系統已經能正常進入啟動狀態啦!
原創文章,作者:jack_cui,如若轉載,請注明出處:http://www.www58058.com/45823
寫的很詳細,圖片是自己畫的嗎?很不錯哦,