歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux基礎篇之開機流程

Linux基礎篇之開機流程

日期:2017/2/28 14:34:59   编辑:Linux教程

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來解鎖。

Copyright © Linux教程網 All Rights Reserved