開機關機流程與Loader

1.開機關機流程與Loader
a> 載入BIOS的硬件信息,並取得第一個開機裝置的代號
b> 讀取第一個開機裝置的MBR的boot Loader(也就是LILO,grub,spfdisk等)的開機信息
c> 載入kernel核心信息,kernel開始解壓縮並嘗試驅動所有硬件
d> kernel執行init程序並取得run-level信息
e> init執行/etc/rc.d/rc.sysinit
f> 啓動kernel的外掛模塊(/etc/modprobe.conf)
g> init執行run-level的各個批次檔(Scripts)
h> init執行/etc/rc.d/rc.local
i>              執行/bin/login程序,並等待使用者登入
j>              登入之後開始以shell控制主機。

2.linux開機的一個簡單流程
                                                                                         Kernel (/boot/vmlinuz)
BIOS -> MBR(硬盤啓動) -> Boot Loader -> initrd ->                              ->             ...             ->             init ->

system init(/etc/rc.d/rc.sysinit)      ->      啓動系統服務與相關啓動設定文件(/etc/rc.d/rc.n 或 /etc/sysconfig)

-> 用戶自訂開機啓動程序(/etc/rc.d/rc.local)
-> 根據/etc/inittab的設定,載入終端或X-Window


boot loader要具有兩個功能:
a> menu
b> pointer

3.第一個程序:init
linux系統當中第一個被執行的程序爲/sbin/init,也就是我們在用ps aux 查看進程信息時所看到的PID=1的那個進程,我的系統爲:root                   1            0.0            0.4            2888            560 ?                  S              Jan10             0:02 init [5]

4.init的功能
a> 利用設定文件/etc/inittab來取得開機的等級:run level
b> 再由run level的設定來進行不同的開機服務項目的啓動

5.什麼是run level?
linux就是根據run level來規定系統使用不同的服務來啓動的,讓linux的使用環境不同。

6.run level的等級
根據有無網絡以及有無X Windos可將run level分爲六個等級:
0——halt (系統直接關機)
1——single user mode (單用戶模式,用在系統出問題時的維護)
2——Multi User,Without NFS
3——Full multi-user(完整的,含有網絡功能的純文字模式)
4——Unused (系統保留的)
5——X11 (與run level 3類似,不同的是使用了X Window)
6——reboot

7.開機時,如何取得系統的run level
從/etc/inittab中取得。

8./etc/inittab的語法:
這個檔案的語法是這樣的:
[設定項目]:[run level]:[init 的動作行爲]:[指令項目]
a. 設定項目:
            最多四個字符,代表 init 的主要工作項目,只是一個簡單的代表說明。
b. run level:
            該項目在哪些 run level 底下進行的意思。如果是 35 則代表 runlevel 3 與
            5 都會執行。
c. init 的動作項目:
            主要可以進行的動作項目意義有:
            initdefault :代表預設的 run level 設定值;
            sysinit :代表系統初始化的動作項目;
            ctrlaltdel :代表 [ctrl]+[alt]+[del] 三個按鍵是否可以重新開機的設定;
            wait           :代表後面接的指令項目必須要執行完畢才能繼續後面的動作;
            respawn :代表後面接的, init 仍會主動的『重新』啓動。
            更多的設定項目請參考 man inittab 的說明。
d. 指令項目:
            亦即應該可以進行的指令,通常是一些 script 囉。

一個例子:
----------------------------------------------------------------------------------------------------
[root@linux ~]# vi /etc/inittab
# 設定系統開機預設的 run level 設定項目:
id:3:initdefault:

# 開始進行 run level 的服務啓動前,使用來偵測與初始化系統環境的設定文件:
si::sysinit:/etc/rc.d/rc.sysinit

# 7 個不同 run level 的,需要啓動的服務的 scripts 放置路徑:
l0:0:wait:/etc/rc.d/rc 0
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

# 是否允許按下 [ctrl]+[alt]+[del] 就重新開機的設定項目:
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# 本機端終端機啓動的個數:
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

# 在 X Window (run level 5) 環境下的啓動 script 設定項目:
x:5:once:/etc/X11/prefdm -nodaemon
----------------------------------------------------------------------------------------------------
9.系統初始化(system initialization)程序爲?
linux 系統初始化程序爲: /etc/rc.d/rc.sysinit

10. /etc/rc.d/rc.sysinit主要做哪些工作?
a>        取得網絡環境與主機類型:/etc/sysconfig/network
a>        測試與掛載內存設備/proc與USB設備/sys
a>        決定是否啓動SELinux
a>        外圍設備的檢測與PNP參數的測試
              核心在開機時檢測結果保存在/proc/sys/kernel modprobe中,主要檢測ide/scsi/網絡/音效等
a> 用戶自訂模塊的載入
             用戶可以在/etc/sysconfig/modules/*.modules中加入自訂模塊
a>       載入核心的相關設定:/etc/sysctl.conf
a>       設定系統時間 clock
a>       設定終端字符
a>       設定RAID與LVM等硬盤功能
a>       以fck檢查磁盤文件系統
a>       進行磁盤quota的轉換
a>       重新以可讀取模式掛載系統磁盤
a>       啓動quota
a>       啓動隨機數裝置
a>       清除開機過程中暫存文件
a>       將開機相關信息載入/var/log/dmesg當中。

11.啓動系統服務與相關啓動設定文件
linux啓動時與系統服務有關的設定文件爲:
/etc/rc.d/rc.n 以及 /etc/sysconfig

12.其他開機相關事項
a>    關於模塊:/etc/modprobe.conf
b>    /etc/sysconfig/*
      這裏要注意幾個authconfig,clock,desktop,i18n,keyboard&mouse,network,network-scripts

13.run level
a>   查看當前run level
    # runlevel
b>   切換run level
◆要每次開機都執行某個run level,則需修改/etc/inittab中:
id:3:initdefault:
中的數字。
◆如果臨時變更系統run level,則以根用戶運行init [0-6]來運行。
c>   假設由init 5改到init 3,則更改run level時系統做了什麼?
◆對比/etc/rc.d/rc3.d及/etc/rc.d/rc5.d內K與S開頭的檔案:
◆關閉/etc/rc.d/rc5.d中不存在於/etc/rc.d/rc3.d中的服務
◆啓動/etc/rc.d/rc3.d中不存在於/etc/rc.d/rc5.d中的服務。

13.核心與核心模塊
(1)目前的核心都是模塊化(modules)的。
(2)核心的模塊位置
a> 核心:/boot/vmlinuz 或 /boot/vmlinuz-version
b> 核心解壓縮所需RAM Disk:/boot/initrd( /boot/initrd-version)
c> 核心模塊:/lib/modules/version/kernel 或 /lib/modules/`uname -r`/kernel
d> 核心原代碼: /usr/src/linux (需要另外安裝)

(3) 如果核心被順利載入系統中,那麼會有幾個信息記錄下來:
a> 核心版本: /proc/version
b> 核心功能: /proc/sys/lernel

(4) 如果有新硬件,系統不支持,則可以有這樣兩種訪求:
a> 加入最新的硬件驅動程序原始碼,重新編譯內核;
b> 將該硬件的驅動程序編譯爲模塊,並在開機時載入該模塊。

14.核心模塊放置處:
   /lib/modules/`uname -r`/kernel中,裏面又分這樣幾個目錄:
-----------------------------------------------------------------------------------
arch    :與硬件平臺有關的項目,例如 CPU 的等級等等;
crypto    :核心所支持的加密的技術,例如 md5 或者是 des 等等;
drivers    :一些硬件的驅動程序,例如顯示卡、網絡卡、PCI 相關硬件等等;
fs    :核心所支持的 filesystems ,例如 vfat, reiserfs, nfs 等等;
lib    :一些函式庫;
net    :與網絡有關的各項協議數據,還有防火牆模塊 (net/ipv4/netfilter/*) 等等;
sound    :與音效有關的各項模塊;
-----------------------------------------------------------------------------------

15.核心模塊的相關性
保存在/lib/modules/`uname -r`/modules.dep中

16.modules.dep可以用depmod來建立

-----------------------------------------------------------------------------------
depmod [-Ane]
參數:
-A :不加任何參數時, depmod 會主動的去分析目前核心的模塊,並且重新寫入
      /lib/modules/`uname -r`/modules.dep 當中。若加入 -A 參數時,則 depmod
      會去搜尋比 modules.dep 還要新的模塊,如果真找到新模塊,纔會更新。
-n :不寫入 modules.dep ,而是將結果輸出到屏幕上(standard out);
-e :顯示出目前已加載的不可執行的模塊名稱
範例:

範例一:若我已經做好一個網絡卡驅動程序,假設文件名爲 a.ko,該如何更新核心相依性?
[root@linux ~]# cp /full/path/a.ko /lib/modules/`uname -r`/kernel/drivers/net
[root@linux ~]# depmod
-----------------------------------------------------------------------------------
17.核心模塊的察看
a> 顯示系統已加載的模塊 lsmod
    列出模塊名稱、模塊大小以及是否其他模塊所使用
b> 查閱模塊信息 modinfo

18.核心模塊的加載與移除
a> 老的做法:
     insmod 加載模塊
      rmmod 移除模塊
b> 常用方法:
     modprobe [-cflr] module_name
-c 列出目前系統中所有模塊
-f   強制加載
-l   列出 /lib/modules/`uname -r`/kernel 當中的所有的模塊完整名稱
-r   移除modules

19.核心模塊的額外參數設定
/etc/modprobe.cof

20.Boot Loader
a> MBR是整個硬盤的第一個sector,其大小不會超過512bytes;
      Super Block,可以想像成每個分區partition的第一個扇區first sector。
b> Boot Loader可以指定核心文件來開機,也可以指定某個super block當中boot loader接管開機的核心載入。
c> linux 可以選擇將boot loader安裝在MBR或者是super block當中,但windows系統則幾乎默認會同時安裝在MBR與Super block當中。
d> 在安裝多重系統時,最好先安裝windows後安裝linux,因爲先安裝linux,然後再安裝windows,則windows會強制將MBR的boot loader覆蓋掉,這樣,就無法用windows的boot loader來啓動linux了。

21.Boot Loader--Grub
(1)Grub的優點
grub是較新的boot loader,它的優點很多,包括:
a> 認識與支持較多的filesystem,並且可以使用grub的主程序直接在filesystem當中搜尋核心;
b> 開機的時候,可以‘自行編輯與修改開機設定項目’,類似bash的指令模式;
c> 可以動態搜尋設定文件,而不需要在修改設定文件後重新安裝grub。亦即我們只需修改/boo/grub/menu.lst的設定,下次開機就生效了。
(2)Grub的設定文件: /boot/grub/menu.lst
(3)Grub中硬盤的表示:
   grub中的硬盤表示,有點類似
      (hd0,0)
第一個搜索到的硬盤,代號爲(hd0),該硬盤的第一個分區爲(hd0,0)

22.Boot Loader --LILO:
(1) LILO的設定文件爲:/etc/lilo.conf
(2) 與Grub的設定文件/boot/grub/menu.lst同樣分爲兩部分:
a> 整體環境設定
b> 每個開機設定

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章