一、系統啟動流程 一般來說,Linux 系統的啟動流程是這樣的: 1. 開機之後,位於電腦主板 ROM 晶元上的 BIOS 被最先讀取,在進行硬體和記憶體的校驗以及 CPU 的自檢沒有異常後, BIOS 將被載入到記憶體中。 2. BIOS 按照其存儲的啟動順序,依次嘗試載入含有 MBR 信息的可啟動 ...
一、系統啟動流程
一般來說,Linux 系統的啟動流程是這樣的:
1. 開機之後,位於電腦主板 ROM 晶元上的 BIOS 被最先讀取,在進行硬體和記憶體的校驗以及 CPU 的自檢沒有異常後, BIOS 將被載入到記憶體中。
2. BIOS 按照其存儲的啟動順序,依次嘗試載入含有 MBR 信息的可啟動設備(一般是硬碟,可設置),然後將控制權交給 MBR 中的 Bootloader(引導程式)。
3. Linux 中使用 GRUB(多操作系統引導程式)作為 Bootloader。GRUB 可以識別(根)文件系統並載入 Kernel(內核),同時將系統的控制權交給 Kernel。
4. Kernel 極其精簡,載入過程中也可能會載入一些必要的模塊打包文件。
5. 隨同 Kernel 一起載入的還有 init(/sbin/init)進程,是 Linux 啟動的第一個進程,它負責載入文件系統並根據運行級別啟動(重啟)和關閉相應服務,最後初始化字元終端和/或啟動圖形終端,等待用戶登錄。
至此,系統啟動完成。
二、流程詳解
1. BIOS(Basic Input Or Output,基本輸入輸出系統)
BIOS 是電腦啟動後最先被讀取的系統,在硬體和記憶體的校驗以及 CPU 的自檢通過、沒有異常後,BIOS 將被載入到記憶體里。BIOS 主要存儲了設備(一般是硬碟,可在 BIOS 界面設置)的啟動順序,BIOS 依次嘗試載入含有 MBR 信息的可啟動設備,找到後將控制權交給 MBR 中的 Bootloader。
2. MBR(Master Boot Record,主引導記錄)
MBR 在磁碟上的第一個扇區(1 扇區占 512 位元組),它的前 446 位元組是 Bootloader(引導程式),後 4 個 16 位元組是最多 4 個主分區信息,最後 2 位元組 55 AA 是啟動標識。
Linux 中使用 GRUB 作為 Bootloader。
3. GRUB(GRand Unified Bootloader,多操作系統引導程式)
GRUB 是現在 Linux 使用的主流引導程式,可以用來引導現在幾乎所有的操作系統。
GRUB 是模塊化的,運行時會經歷如下階段:
(1)stage1:stage 1 大小 512 位元組(和 MBR 一樣大),是 MBR 的備份,MBR 損壞時可以從這裡得到一個備份。
(2)*_stage1_5:用於識別多種類型文件系統的文件。CentOS 6 以後的版本預設文件系統是 ext4,會相應地識別 e2fs_stage1_5 文件。識別後,載入文件系統。
(3)stage2:根據 GRUB 配置文件 /boot/grub/grub.conf 的內容來決定如何載入 Kernel。該文件內容一般如下:
default:預設啟動的內核編號,從0開始(每個內核信息由title標識) timeout:等待用戶選擇要啟動的內核的超時時間,單位為秒 splashimage:使用的背景圖片 hiddenmenu:隱藏菜單 title:操作系統或內核的標題 root:內核所在的分區,(hd0,1)表示第1塊磁碟的第1個分區 (在grub中,設備統統以hd開頭,並緊跟一個數字作為各磁碟設備的標記,從0開始編號;分區也是從0開始編號,而我的(hd0,1)是因為我的第0個分區是swap交換分區) kernel:要載入的內核文件,後面附帶啟動參數 initrd:額外驅動或模塊的打包文件,ram disk 或 ram fs 文件(通常是歸檔壓縮文件,以.img為文件名尾碼)
4. Kernel(內核)
GRUB 的最後階段 stage2 會根據 GRUB 配置文件 /boot/grub/grub.conf 的內容來載入 Kernel,並將系統控制權交給 Kernel。
命令 dmesg 可以用來查看本次啟動時內核的輸出信息。
5. init(Linux 啟動的第一個進程)
init 進程是 Linux 啟動的第一個進程,PID 為 1,其他所有進程是它的子進程。
Linux 的 init 進程是由傳統的 sysvinit 演變而來的,init 進程讀取的配置文件 /etc/inittab 僅保留了 sysvinit 的 inittab 文件定義的預設運行級別 runlevel,其他的配置則分散到了 /etc/init/*.conf 多個文件中。
init 進程會根據 /etc/inittab 文件定義的 runlevel 去執行相應目錄下的腳本。
6. runlevel(運行級別)
命令 runlevel 可顯示上一個及當前 runlevel。命令 init 可用來改變當前的 runlevel。
Linux 的 runlevel 有 7 個:
0:系統停機,預設運行級別不能設為0,否則不能正常啟動 1:單用戶模式,root許可權,用於系統維護,禁止遠程登陸 2:多用戶模式(無網路) 3:多用戶狀態(命令行界面) 4:保留未使用 5:多用戶模式(圖形化界面) 6:系統重啟,預設運行級別不能設為6,否則不能正常啟動
這 7 個 runlevel 分別對應了 /etc/rc.d/rc[0-6].d/ 七個目錄:
每個目錄存儲了所有以 K* 和 S* 開頭的文件,K 開頭的文件表示從其他 runlevel 切換過來需要開啟(重啟)的服務,S 開頭的文件表示從其他 runlevel 切換過來需要關閉的服務。
三、單用戶修改root密碼
為內核傳遞參數 "1" 或 "single" ,可讓系統進入單用戶模式(runlevel 1)。單用戶模式下不啟動任何服務,直接以 root 用戶登錄,並且不需要密碼,可以使用 passwd 修改 root 密碼。
操作步驟如下:
開機後,在 GRUB 引導等待用戶選擇要載入內核的超時時間內,隨意按下一個鍵,進入內核的選擇界面。
上圖中,選中目標版本內核,按下 "e" 鍵進入編輯。
上圖中,選中 kernel,按下 "e" 鍵進入編輯。
上圖中,在行末尾為內核傳遞參數 "1" 或 "single" ,回車確定,按 "b" 啟動。
上圖中,成功進入單用戶模式,並且用 root 用戶登錄,使用 passwd 修改 root 密碼,然後 exit 退出,正常重啟即可。
四、GRUB加密
管理員可以通過單用戶模式修改 root 密碼,但是這也導致任何人都可能通過這種方式入侵系統。為了防止這種危險,可以進行 GRUB 加密。
1. 在 root 用戶下輸入 grub-md5-crypt 命令,然後輸入為 GRUB 設置的密碼,產生一組 MD5 加密後的密文。
2. 將得到的密文添加到 GRUB 配置文件 /boot/grub/grub.conf 中。
這樣在用戶在開機後要編輯內核時就會強制要求輸入 GRUB 密碼,剔除了非法修改 root 密碼的可能。
其次,也可以在 title 段添加一個 passward,它是用於內核(系統)啟動時要求輸入的密碼。
參考鏈接: