1 Linux開機流程
--------------------------------------------------------------------------------
1.1 載入BIOS 的硬體資訊和進行自我測試,並依據設定取得第一個可開機的裝置
--------------------------------------------------------------------------------
BIOS(Basic Input Output System):系統載入BIOS,並通過BIOS載入CMOS的資訊,並且藉由CMOS內的設定值取得主機的各項硬體設定;BIOS依據擷取的資訊進行開機自我測試(Power-on Self Test, POST) ,並確定可開機的裝置順序。
1.2 讀取並執行第一個開機裝置內MBR 的boot Loader (亦即是grub, spfdisk 等開機啟動管理程式)
--------------------------------------------------------------------------------
由於不同的os的filesystem格式不同,需要開機管理程式來處理核心檔案載入 (load),即所謂的boot loader。boot loader 程式安裝在第一個開機裝置的第一個扇區(sector) 內,即MBR(Master Boot Record,主要開機記錄區,446bytes)。BIOS通過INT13中斷來讀取MBR。每個作業系統預設會安裝一套boot loader 到他自己的檔案系統中,這是多系統的前提。
1.3 依據boot loader 的設定載入Kernel ,Kernel 會開始偵測硬體與載入驅動程式
--------------------------------------------------------------------------------
boot loader依據設定讀取核心檔案,並解壓縮到記憶體中,Kernel會開始偵測硬體與載入驅動程式。核心一般放在/boot/vmlinuz-核心版本,linux核心可以通過動態載入核心模組的(磁碟裝置的驅動程式都是以模組的形式出現),這些核心模組就放置在 /lib/modules/ 目錄內。
虛擬檔案系統(Initial RAM Disk):/boot/initrd,通過boot loader載入到記憶體中模擬成一個根目錄,該虛擬檔案系統能夠提供一支可執行檔程式,透過該程式來載入開機過程中所最需要的核心模組。
boot loader 通過載入kernel和initrd,然後在記憶體中將initrd解壓縮成為根目錄,kernel 就能夠藉此載入適當的驅動程式,最終釋放虛擬檔案系統,並掛載實際的根目錄檔案系統,就能夠開始後續的正常開機流程。
1.4 在硬體驅動成功後,Kernel會主動啟動init 程式,而init 會取得run-level 資訊
--------------------------------------------------------------------------------
核心啟動第一支程式/sbin/init,準備軟體執行的環境,包括系統的主機名稱、網路設定、語系處理、檔案系統格式及其他服務的啟動等,依據的設定檔是/etc/inittab。inittab還會取得run-level(開機執行等級)。
1.5 init 執行/etc/rc.d/rc.sysinit 檔案來準備軟體執行的作業環境(如網路、時區等)
--------------------------------------------------------------------------------
init 處理系統初始化流程(/etc/rc.d/rc.sysinit),包括決定是否啟動SELinux、讀取網路設定檔/etc/sysconfig/network、使用者自訂模組的載入/etc/sysconfig/modules/*.modules、以fsck 檢驗磁碟檔案系統:filesystem check 、清除開機過程當中的臨時檔案、將開機相關資訊載入到/var/log/dmesg檔案中等。
1.6 init 執行run-level 的各個服務的啟動(script 方式)
--------------------------------------------------------------------------------
依據run-level來啟動系統服務與相關啟動設定檔(/etc/rc.d/rc N & /etc/sysconfig)。例如run-level為5,即圖形介面啟動時,會執行那個/etc/rc5.d/目錄下的指令碼,每一個指令碼都真實指向/etc/init.d/目錄下的對應啟動指令碼。最後一個執行的為/etc/rc.d/rc.local。
1.7 init 執行/etc/rc.d/rc.local 檔案
--------------------------------------------------------------------------------
執行使用者自訂開機啟動程式/etc/rc.d/rc.local。
1.8 init 執行終端機模擬程式mingetty 來啟動login 程式,最後等待使用者登入
2 開機過程的相關檔案和關鍵點
--------------------------------------------------------------------------------
2.1. 關於模組載入的設定檔:/etc/modprobe.d/*.conf:(CentOS6.5中已經不再使用/etc/modprobe.conf檔案。)
2.2. /etc/sysconfig/*:開機過程中讀取的相關設定檔,包括authconfig(規範使用者的身份認證機制)、network-scripts/*(網卡設定)等。
2.3. 關於核心與核心模組(驅動模組):
核心: /boot/vmlinuz 或/boot/vmlinuz-version;
核心解壓縮所需RAM Disk: /boot/initrd (/boot/initrd-version);
核心模組: /lib/modules/version/kernel 或/lib/modules/$(uname -r)/kernel;
核心原始碼: /usr/src/linux (預設不安裝)
核心版本: /proc/version
系統核心功能: /proc/sys/kernel
兩種方法加入新硬體的驅動模組:重新編譯核心,並加入相應驅動程式源碼;將該硬體的驅動程式編譯成為模組,在開機時載入該模組。
核心模組的相關性:/lib/modules/$(uname-r)/kernel中模組相關性記錄在/lib/modules/$(uname-r)/modules.dep檔案中,使用depmod命令來建立該檔案。
核心模組相關命令:lsmod——顯示目前已經存在於核心當中的模組,模組相關性也會顯示
modinfo——顯示某個模組詳細資料
modpobe——自動分析模組相關性(modprobe.dep)並載入模組,-r移除模組
insmod——手動載入完整檔案名稱的模組
rmmod——移除模組,-f強制移除,-w等待使用完再移除
ps:insmod、rmmod的操作模組有依賴性時,無法完成操作。
2.4. initrd:initrd檔案包含/lib/modules/$(uname-r)/kernel/ 當中開機必需的模組,在開機時通過主機的 INT13 硬體功能將該檔案讀出來解壓縮,initrd 在記憶體中模擬成為根目錄,由於此虛擬檔案系統(Initial RAM Disk)主要包含磁碟與檔案系統的模組,則核心最後就能夠識別實際的磁碟,就能夠進行實際根目錄的掛載。使用mkinitrd命令重製initrd檔案:mkinitrd [-v] [--with=模組名稱] initrd檔案名稱 核心版本
2.5. 關於開機管理神器grub:
通過設定檔/boot/grub/menu.lst來修改和增加啟動項,增加啟動項後需通過grub將主程式安裝到系統中(比如setup(hd0),如MBR 的(hd0) 戒boot sector 的(hd0,0) 等等
為某個啟動項加密:grub-md5-crypt,擷取加密後的密碼,添加在menu.lst檔案對應title的下面的第一行,eg:title CentOS
password --md5 $1$kvlI0/$byrbNgkt/.REKPQdfg287.
不安全性:使用者可以透過編輯模式(e)進入選單,並刪除密碼欄位並按下b就能夠進行開機流程,所以要加密menu.lst檔案:將password放在所有的title前面,並在需要鎖定的title下面加上lock來鎖定,該啟動項只能按p來解鎖。