Linux系統的整個啓動過程是這樣的:
1.加載 BIOS 的硬件信息,並獲取第一個啓動設備的編號;
2.讀取第一個設備的MBR的引導加載程序 (即 lilo, grub, spfdisk等)開機信息;
3.加載核心操作系統的核心信息,核心開始解壓縮,並且嘗試驅動所有硬件設備;
4.核心執行init程序並取得run-level 信息;
5.init 執行/etc/rc.d/rc.sysinit文件;
6.啓動核心的外掛式模塊 (/etc/modules.conf);
7.init執行運行的各個批處理文件;
8.init 執行/etc/rc.d/rc.local文件;
9.執行 /bin/login 程序;
10.登入之後開始以Shell控制主機。
下面對啓動流程進行詳細的說明:
一、引導加載程序與核心載入
整個主機在啓動的時候,第一個讀取的信息就是BIOS,在BIOS裏記錄了主板的芯片集與相關的設置,如CPU與接口設備的通信頻率、啓動設備的搜索順序、系統時間等信息。機器在讀取BIOS,並且瞭解主要的主機硬件信息後,主機便會開始嘗試由存儲媒體加載操作系統。BIOS會記錄“可用來啓動的設備搜索順序”,系統開始在第一臺啓動設備上執行啓動程序。這裏針對硬盤而言,啓動流程讀到硬盤的過程中,第一個要讀取的就是該硬盤的主引導記錄(MBR),系統可以由主要啓動區按照的引導加載程序(boot loader)開始執行核心識別的工作。
通過引導加載程序的管理而開始讀取核心文件(Linux系統的核心文件一般在/boot/vmlinuz),並將核心文件加載到主存儲器中,同時系統有可能通過initrd建立起虛擬盤,以協助啓動過程,最後,將讀自BIOS的主機硬件數據交由Linux核心進行檢測,並且加載適當的驅動程序。
二、第一個程序init及設置文件/etc/inittab與runlevel
整個Linux系統中,第一個執行的程序就是/sbin/init。Init程序所做的工作相當多,它除了利用設置文件“/etc/inittab”來獲取運行等級外,還會通過運行等級的設置值啓動不同的服務項目。關於各個運行等級的說明可以通過/etc/inittab文件中的說明來了解。
下面對/etc/inittab文件以及其中所涉及到的文件進行說明:
先對/etc/inittab文件的語法進行說明,
[設置項目]:[run level]:[init的操作行爲]:[命令項目]
a.設置項目:
最多4個字符,表示init的主要工作項目,只是一個簡單的表示說明
b.運行等級:
該項目在那些運行等級下執行。
c.init的操作項目
主要項目的意義如下:
initdefault:表示默認的運行等級設置值
sysinit:表示系統初始化的操作項目
ctrlaltdel:表示[ctrl]+[alt]+[del]三個按鍵是否可以重新啓動的設置
wait:表示後面接的命令項目必須要執行完畢,才能繼續隨後的操作
respawn:表示後面接的init仍會主動“重啓”
d.命令項目
應該可以執行的命令,通常是一些腳本
三、init處理系統初始化流程(/etc/rc.d/rc.sysinit)
/etc/inittab中有這一句“si::sysinit:/etc/rc.d/rc.sysinit”,這表示:開始加載各項系統服務之前,先做好整個系統環境,主要使用/etc/rc.d/rc.sysinit這個shell腳本來設置系統環境。這個文件的主要工作:
1. 獲取網絡環境與主機類型
2. 測試與載入內存設備/proc及USB設備/sys
3. 決定是否啓動SELinux
4. 接口設備的檢測與即插即用(PnP)參數的測試
5. 用戶自定義模塊的加載
6. 加載核心的相關設置
7. 設置系統時間
8. 設置終端控制檯的字形
9. 設置RAID與LVM等硬盤功能
10.以fsck檢查磁盤文件系統
11.進行磁盤配額quota的轉換
12.重新以可讀取模式載入系統磁盤
13.啓動quota功能
14.啓動系統隨機數設備
15.清除啓動過程中的臨時文件
16.將啓動相關信息加載到/var/log/dmesg文件中
四、啓動系統服務與相關啓動設置文件(/etc/rc.d/rc.n與/etc/sysconfig)
經過上面的步驟系統應該已經順利工作了,只是我們還要啓動系統所需要的各項“服務”,這樣主機才能提供相關的網絡或主機功能。這個時候,根據我們在/etc/inittab裏提到的運行等級設置值,就可以決定啓動的服務項目了。各個不同的運行等級服務啓動的各個shell腳本放置位置如下所示:
l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/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
l0:0:wait:/etc/rc.d/rc 0
舉例來說,運行等級3的啓動目錄放在/etc/rc.d/rc3.d目錄中。我們來看一下,
總用量 448 lrwxrwxrwx 1 root root 21 lrwxrwxrwx 1 root root 24 …… lrwxrwxrwx 1 root root 15 lrwxrwxrwx 1 root root 20 lrwxrwxrwx 1 root root 15 lrwxrwxrwx 1 root root 20 lrwxrwxrwx 1 root root 24 wxrwxrwx 1 root root 13 …… lrwxrwxrwx 1 root root 11
[root@redflag ~]# ll /etc/rc.d/rc3.d/
這個目錄下的文件全部都是以S、K爲開頭的文件,而且全部是連接文件,連接到/etc/rc.d/init.d裏的shell腳本。(/etc/rc.d/init.d目錄其實與/etc/init.d是一樣的)以K爲開頭的文件爲啓動時需要“啓動,start”的服務;以K開頭的文件爲關機時需要關閉的服務。注意這裏在S與K後面接的數字,表示該文件的執行順序。
如果要在運行等級3的環境下執行某個服務,就要將該服務寫入/etc/rc.d/rc3.d裏,但需要注意該服務必須在/etc/rc.d/init.d裏建好了,使用連接的方法連接到/etc/rc.d/rc3.d目錄中。要將/etc/rc.d/init.d連接到/etc/rc.d/rc3.d的方法,除了手動建立外,其實都是以chkconfig程序來管理的。這裏補充說明一下chkconfig的用法,
[root@redflag ~]# chkconfig [--add|-- [root@redflag ~]# chkconfig --level [0123456] [service_name] [on|off] 範例一: [root@redflag ~]# chkconfig --level 35 atd on 範例二:自定義一個服務,運行等級3、5啓動,以80S開始以70K結束 [root@redflg ~]# vi /etc/init.d/myserver #!/bin/bash # chkconfig : 35 80 70 echo “Nothing” 說明一下第二行,它的語法是: chkconfig:[runlevels] [start number] [stop number] 其中runlevels爲不同的運行等級狀態,start number與stop number則是在/etc/rc.d/rc[35].d內建立的設置文件,文件名爲S80myserver及K70myserver [root@redflag ~]# chkconfig -- add myserver [root@redflag ~]# chkconfig --list myserver myserver 0:off 1:off 2:off 3:on 4:off 5:on 6:off [root@redflag init.d]# find /etc/rc.d/ -type l | grep 'myserver' | sort /etc/rc.d/rc0.d/K70myserver /etc/rc.d/rc1.d/K70myserver /etc/rc.d/rc2.d/K70myserver /etc/rc.d/rc3.d/S80myserver /etc/rc.d/rc4.d/K70myserver /etc/rc.d/rc5.d/S80myserver /etc/rc.d/rc6.d/K70myserver [root@redflag init.d]# chkconfig -- [root@redflag init.d]# rm /etc/init.d/myserver rm: remove regular file `/etc/init.d/myserver'? y
[root@redflag ~]# chkconfig --list
五、用戶自定義引導啓動程序(/etc/rc.d/rc.local)
任何想要在啓動時就執行的工作,直接寫入/etc/rc.d/rc.local,那麼該工作就會在啓動的時候自動加載,而不必等我們登錄系統去啓動
六、根據/etc/inittab設置加載終端或X-window界面
在完成了系統所有服務的啓動後,接下來Linux就會啓動終端或X-window來等待用戶登錄。在/etc/inittab內有這麼一段。
1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 # Run xdm in runlevel 5 x:5:respawn:/etc/X11/prefdm –nodaemon
# Run gettys in standard runlevels
這表示在運行等級3、4、5時,都會執行/sbin/mingetty,而且執行6個(即爲什麼Linux會提供6個純文本終端)。注意respawn的init表示“表示後面接的init仍會主動重啓”,這說明我們登錄tty1終端界面,以exit離開後,系統還是會重新顯示等待用戶輸入畫面的界面。在運行等級5時,系統還會運行x:5:respawn:/etc/X11/prefdm -nodaemon
七、其他啓動相關事項
1.關於模塊:/etc/modprobe.conf
雖然核心提供的默認模塊已經足夠使用,但某些條件下,我們還是要對模塊進行一些參數的設計,此時,就要使用/etc/modprobe.conf。我的主機內容如下:
alias eth0 bnx2 alias eth1 bnx2 alias scsi_hostadapter mptbase alias scsi_hostadapter1 mptscsi alias usb-controller ehci-hcd
[root@redflag init.d]# cat /etc/modprobe.conf
意思是說:“eth0表示使用bnx2這個核心模塊,scsi_hostadapter使用mptbase這個核心模塊。如果你對系統提供的驅動程序模塊不滿意,纔會主動修改這個模塊加載的相關文件。
這裏補充說明一下,有時在使用多網卡的時候會出現網卡設備號變動的情況,這個時候可以採用在ifcfg-ethn中通過只要通過網卡的MAC地址,在激活網卡的時候一同綁定來解決。也可以通過在modprobe.conf文件中的設置來解決。
這裏我們可以找到eth0和eth1的I/O與IRQ(在linux系統中可以通過 lspci -vv來查看這些信息)
eth1: I/O(0x320) 且IRQ=7 [root@redflag ~]# vi /etc/modprobe.conf alias eth0 bnx2 alias eth1 bnx2 options eth0 is=0x300 irq=5 options eth0 is=0x320 irq=7 如此一來網卡就有了區分
如:eth0: I/O(0x300) 且IRQ=5
2./etc/sysconfig/*
整個啓動過程中,讀取的服務相關設置文件都記錄在/etc/sysconfig目錄下。