一、啟動過程
1. 開機流程簡述
1)加載BIOS硬件信息,並獲取第一個啟動設備的代號
2)讀取第一個啟動設備的MBR的引導加載程序的啟動信息
3)加載核心操作系統的核心信息,核心開始解壓縮,並且嘗試驅動所有硬件設備
4)核心執行init程序並獲取運行信息
5)init執行/etc/rc.d/rc.sysinit文件
6)啟動核心的外掛模塊(/etc/modprobe.conf)
7)init執行運行的各個批處理文件(Script)
8)init執行/etc/rc.d/rc.local
9)執行/bin/login程序,等待用戶登錄
10)登錄之后開始以shell控制主機
如下圖:
2. 獲取運行等級
在第4步中,init是系統第一個執行的程序(PID為1),它讀取文件/etc/inittab來獲取運行等級(Run level),后面它就是通過這個運行等級的設置值來啟動不同的服務項目的。
3. 根據運行等級啟動腳本
在第7步中,init根據前面獲取的運行等級,來啟動相關的服務。那么服務腳本存放在哪里呢?
服務腳本根據運行等級N存放在/etc/rc.d/rcN.d目錄中,如下圖所示:
選其中一個目錄,如rc3.d查看一下里面的文件,可以發現里面都是鏈接文件:
它們都是以K或者S為開頭的文件,鏈接到/etc/rc.d/init.d里的shell腳本。這些腳本都使用case…esac語法,而且支持的變量($1)主要有start和stop,一般來說,如果想要啟動一些服務,譬如sysstat,需要使用:
/etc/rc.d/init.d/sysstat start
如果關閉該服務,就使用:
/etc/rc.d/init.d/sysstat stop
所以要在運行等級3下執行某個服務,就要將其寫入/etc/rc.d/rc3.d中,但既然服務已經在/etc/rc.d/init.d(為了方便,系統建了一個符號鏈接/etc/init.d指向了/etc/rc.d/init.d)里建好了,自然可以使用鏈接方式鏈接到/etc/rc.d/init.d/內的相關shell腳本,不過考慮到start或stop變量,就有了S和K開頭的文件名了。
另外,不同的服務有可能是相關聯的,譬如,要啟動WWW服務,總需要網絡,所以/etc/rc.d/init.d/network就需要先啟動,於是系統通過在S或K后面接一個數字來表示執行權限,以決定執行順序。總結一下:
· 在/etc/rc.d/rcN.d內以S開頭的文件,為開機時需要啟動的服務
· 在目錄中以K開頭的文件,為關機時需要關閉的服務
· S和K后面接的數字,表示該文件的執行權限,數字越小權限越大,越早被執行
二、運行等級
1. linux有7個運行等級
· 0 - halt:系統關機,默認運行等級不能設為0,否則不能正常啟動
· 1 - single user mode:單用戶維護模式,root權限,用於系統維護,禁止遠程登陸
· 2 - Multi-user,without NFS:多用戶模式,和等級3類似(沒有NFS)
· 3 - Full multi-user mode:完整的含有網絡功能的多用戶純文本模式
· 4 - unused:系統未使用,保留給用戶自定義
· 5 - X11:與等級3類似,但使用X Windows
· 6 - reboot:重新啟動,默認運行等級不能設為6,否則不能正常啟動
2. 查看當前運行等級
使用runlevel命令,結果會顯示兩個數字,第一個數字表示前一個運行等級,第二個表示當前運行等級,如果沒切換過,則第一個數字顯示為N
3. 臨時切換運行等級
使用命令init RunLevel,RunLevel為你需要切換的運行等級。但重啟后恢復原來的運行等級。
另外,如果系統安裝了X-Windows,而且當前運行等級不是5,可以直接輸入startx開啟圖形界面,但是奇怪的是並不影響當前運行等級(筆者的系統是centos6.5系統)。
4. 修改默認運行等級
編輯 /etc/inittab文件:
將id后面的數字改為你需要的運行等級,保存,重啟。
三、總結
本文主要想理清楚的其實是運行等級和執行權限這些在linux系統中起到的作用,所以開篇簡單的講述了一下開機流程,然后抓其中的兩個步驟,講解系統如何根據運行等級組織腳本文件,並通過執行權限去執行相應的服務腳本,最后深入講述運行等級的具體意義,以及改變運行等級的方法。
在這里聲明一下,本文講的開機過程根據不同的系統會有一定的差異(特別是centos7.x系統),但是本質上還是這一套思路。
四、參考
1.《鳥哥的linux私房菜》(第二版)




