啟動流程
1. 加載 BIOS 的硬件信息;
2. 讀取 MBR 的 Kernel Loader (亦即是 lilo, grub, spfdisk 等等)開機信息;
3. 加載 Kernel 的操作系統核心信息;
4. Kernel 執行 init 程序並取得 run-level 信息;
5. init 執行 /etc/rc.d/rc.sysinit 檔案;
6. 激活核心的外掛式模塊 (/etc/modules.conf);
7. init 執行 run-level 的各個批次檔( Scripts );
8. init 執行 /etc/rc.d/rc.local 檔案;
9. 執行 /bin/login 程序;
10. 登入之後開始以 Shell 控管主機。
下面對其中的幾個重要部分說明一下:
加載內核
此前還會有bios加電,mbr引導等過程,但不在本文討論的范圍之內,故不再說明。
系統啟動時,內存中並沒有操作系統,故要先加載內核。加載過程復雜,這而不過多說明。
init
內核加載後,執行的第一個程序是init, 因此它的進程pid總為1。/etc/inittab是init程序的配置文件。從這裡讀取啟動級別等信息。
/etc/rc.d/rc.sysinit
init加載配置後,首先執行rc.sysinit文件。它大致的工作如下,從資料上看到,但還沒有細細研究。
1. 設定預設路徑:( PATH )
2. 設定網絡狀態:系統會再去讀取 /etc/sysconfig/network,並將該檔案內的資料,如 NETWORKING, FORWARD_IPV4, HOSTNAME, DOMAINNAME, GATEWARY, GATEWAYDEV 等等的設定讀入系統中。
3. 激活系統的置換空間(簡單的可以想成是虛擬內存): swapping
4. 檢查檔案系統:這個時候系統會去檢查一些可能會存在的目錄,例如 /fsckoptions 與 /forcfsck 及 /fastboot 等等的目錄,當你的系統有不正常關機的現象時(例如突然的斷電等等),那麼 Linux 將會自動的強制去檢查 root 的檔案系統 ( checking root filesystems )。簡單的想一想,就好象是 Windows 系統下,當你不正常關機時,在開機的過程中就會出現掃瞄硬盤的情況相同啦!
5. 周邊設定與系統設定的參數 ( /proc ):在 Linux 或者是 Unix 系統中,你會在根目錄中發現一個很奇怪的扇區,那就是 /proc 啰!其實這個目錄是記錄在內存當中的,每次開機的時候就會被建置起來。他的主要功能是記錄主機的一些接口設備的最新資料狀況!例如網絡周邊啦、輸入輸出周邊啦等等的。沒事的話,不要到裡面亂砍喔!會有問題
6. 設定 Plug and Play ( PNP )的一些參數資料;
7. 清除 /etc/mtab ;
8. mount root 及 /proc 檔案系統 :好了,將一些資料都設定好之後,當然就是需要將資料寫下來啰!這個時候就會將 root 與 /proc 資料給他 mount 上檔案系統啦!
9. 決定是否使用模塊, 加載模塊
10. 檢查檔案系統 :與前面相同的,當前面的 /fastboot 檢查的旗標開啟之後,就會以 fsck 檢查你的其它扇區啰! ( 使用 fsck )
11. 掛上其它檔案系統
12. 設定 console 字型
13. 打開 quota
14. 清除不必要的檔案, 如 lock, pid
15. 設定 clock
16. serial port 初始化
17. 將開機訊息經由 dmesg 放入 /var/log/dmesg 中
/etc/rc.d/rcX.d/
根據不同的啟動級別,在rc.sysinit執行完後。會到相應rcX.d目錄下執行腳本。比如level為3 則執行/etc/rc.d/rc3.d/目錄下的腳本。
而在這些rcX.d目錄下並沒有放實際的腳本!而是放的到/etc/rc.d/init.d目錄下的實際腳本的字符鏈接。為什麼要這麼做呢。這和寫程序一樣,公用模塊而已。例如rc3.d, rc5.d兩種級別下會啟動好多同樣的腳本。這樣只要放到/etc/rc.d/init.d目錄下,鏈接過去就可以了。所以init.d目錄下應該是放置了所有的腳本,在不同級別時,去選擇調用就可以了。
注:/etc/init.d 與 /etc/rc.d/init.d是一樣的。誰鏈接到誰就不知道了。
可以使用chkconfig --list 命令來查看各個運行級別服務的啟動與關閉情況
/etc/rc.d/rc.local
這是個性化模塊rcX.d執行完後,要統一執行的腳本,(好像有的級別也是不執行它的)。所以用戶想要系統自動執行的一些操作放在這比較合適。
比如系統啟動時自動mount一些設備。為什麼說放在這兒比較合適呢?如果你把一些執行操作寫在加載內核之前是肯定不行的。因為有些操作是要一些服務啟動後才能做的。在rc.sysinit rcX.d執行完後,大部分系統服務等都已經啟動了,在rc.local中執行一些用戶操作是比較合適的。