下面是一張linux啓動流程圖:
在瞭解啓動流程之前,我們應該先知道系統的幾個重要腳本和配置文件,他們對應的路徑爲:
1. /sbin/init
2. /etc/inittab
3. /etc/rc.d/rc.sysinit
4. /etc/rc.d/rcN.d //這是幾個文件夾N代表數字1,2,3,4..
5. /etc/fstab
1.關於/sbin/init與/etc/inittab
關於/sbin/init ,它是一個二進制可執行文件,爲系統的初始化程序,而/etc/inittab是它的配置文件,我們可以通過/etc/inittab來一睹 它的功能, 裏面的內容是一種固定的文本格式,id:runlevels:action:process
我們來通過它的內容來學習它之前,先了解寫運行級別的分類(0-6):
0: 關機 half
1: 單用戶模式 singel user
2: 多用戶模式 multi user , 不提供nfs服務 without nfs
3: 完全多用戶字符模式 full multiuser text mod
4: 系統預留 officially undefined
5: 圖形登錄界面 graphical login
6: 重啓 reboot
id:3:initdefault: //這裏定義linux的啓動時的運行級別,可以看到我的主機的啓動級別是3
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit //緊接着,運行系統第一個腳本/etc/rc.d/rc/sysinit
//它的action:sysyinit指的是定義系統初始化過程
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2 //然後就是加載服務了,他們被定義在/etc/rc.d/rcN.d
l3:3:wait:/etc/rc.d/rc 3 //action:waite 這個進程在在對應級別啓動一次,知道它結束爲止,我的系統啓動級別爲3,所有執行rc 3對應的服務
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
ca::ctrlaltdel:/sbin/shutdown -t3 -r now //這裏定義了一個組合快捷鍵,熟悉吧,沒錯就是重啓,你可以把它註釋掉不用
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" //這裏定義了ups電源,powerfail 指的是如果突然斷電,它對應的process命令是,提示用戶系統電源失效,將要關機,提醒用戶把數據都存儲好
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled" //這裏的action,powerokwaite,指的是系統恢復供電,關機取消...
1:2345:respawn:/sbin/mingetty tty1 //開啓終端,在系統準備工作做好後,就會啓動出6個終端,tty1~6 mingetyy就是終端的執行命令
2:2345:respawn:/sbin/mingetty tty2 //可以看到他們對應的級別是2345,你也可以註釋掉幾個,這樣啓動後,就會開啓你指定個數的終端...
3:2345:respawn:/sbin/mingetty tty3 //這裏的動作respawn意思是如果用戶關閉,那麼這個進程會立刻再次執行
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
x:5:respawn:/etc/X11/prefdm -nodaemon //當一切準備完畢,就會運行守護進程,它是不分運行級別的,同樣也是respawn
2. 關於etc/rc.d/rc.sysyinit 和 /etc/rc.d/rc.Nd
在inittab文件中,我們瞭解到rc.sysinit是系統運行的第一個腳本,那麼它的作用都有哪些呢?如果有shell腳本基礎的話可以用vim打開這個文件來看看,它有900多行...是linux裏最牛的腳本,總結下它的作用,有如下幾點:(一定要牢記,必要時我們要重寫它!)
1. 激活udev和selinux
2. 通過讀取/etc/sysct1.conf來設置內核參數
3. 設置系統時鐘
4. 設置鍵盤映射
5. 啓動交換分區。
6. 設置主機名
7. 檢查跟文件系統,並且如果沒有錯誤,以讀寫的方式來重新掛載文件系統 (重要)
8. 激活raid和lvm設備
9. 啓動磁盤限額
10 掛載其他/etc/fstab裏定義的尚未被掛載的設備
11. 清理過時的文件鎖和PID文件
12. 啓動服務/etc/rc.d/rcN.d
/etc/rc.d/rcN.d 是一個存放了系統啓動是加載的服務的文件夾,通過inittab,我們知道了,它的編號對應相應的啓動運行級別。
需要說明的是,它裏面的文件,以我的爲例 以K開頭的代表stop,以S開頭的代表啓動start,數字越小,有限級別越高
[root@server69 rc.d]# cd rc3.d
[root@server69 rc3.d]# ls
K01dnsmasq K74nscd S08ip6tables S25bluetooth S85gpm
K02avahi-dnsconfd K85mdmpd S08iptables S25netfs S90crond
K02NetworkManager K87multipathd S08mcstrans S25pcscd S90xfs
K05conman K88wpa_supplicant S10network S26acpid S95anacron
K05saslauthd K89dund S11auditd S26apmd S95atd
K10psacct K89netplugd S12restorecond S26haldaemon S97rhnsd
K20nfs K89pand S12syslog S26hidd S97yum-updatesd
K24irda K89rdisc S13irqbalance S28autofs S98avahi-daemon
K35vncserver K99readahead_later S13portmap S50hplip S99firstboot
K35winbind S00microcode_ctl S14nfslock S55sshd S99local
K50ibmasm S02lvm2-monitor S15mdmonitor S56cups S99smartd
K50netconsole S04readahead_early S18rpcidmapd S56rawdevices
K69rpcsvcgssd S05kudzu S19rpcgssd S58ntpd
K73ypbind S06cpuspeed S22messagebus S80sendmail
3./etc/fstab文件
它定義了系統初始化掛載的設備,對系統的啓動至關重要,rc.sysinit通過讀取它來實現系統分區的掛載
它的內容如何呢?我們一起來看下
要掛載的設備 掛載點 文件系統類型 掛載選項 轉儲頻率 文件自檢次序
/dev/sda2 / ext3 defaults 0 0
/dev/sda1 /boot ext3 defaults 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
我截取了4個系統啓動時必須掛載的設備
/ 根文件目錄,由它你纔可以進入linux的世界,它在/dev/sda2裏
/boot 啓動目錄,在/下,裏面有grub,initrd和系統內核,它在/dev/sda1
sysfs 一個虛擬的文件系統,產生包含所有硬件層次視圖,和/proc類似
proc 這是一個虛擬的目錄,它映射內存裏的信息對應進程信息,也就是說它對應的是內存而不是硬盤
好了,瞭解了這些文件和目錄的作用,我們在回過頭來看那張流程圖:
1. linux開機從POST加電自檢開始,當自檢完成,讀取第一個硬盤的第0個磁頭裏的前446個字節,運行裏面的bootloader,linux一般 用的是grub。
2. 通過grub傳遞參數給內核,初始化加載內核過程,內核調用initrd(小型內存文件系統,五臟俱全,是一個微型linux),通過 initrd,以只讀方式掛載根文件系統
3. 當根文件系統被掛載後,就會讀取並運行/sbin/init來進行初始化工作。
4. 按次序依次執行/rc/sysinit ,這個時候會重新以讀寫的方式掛載根文件系統
5. 讀取/etc/rc.d/rcN.d/來啓動以s開頭的服務,停止以k開頭的服務
6. 當一切準備完畢,打印終端,出現熟悉的Login界面!(當然,如果你是以5級別啓動的話,Linux就會啓動圖形界~)