一、系統啟動流程
一般來說,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:多用戶模式(X11圖形化界面) 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,它是用於內核(系統)啟動時要求輸入的密碼。
參考鏈接: