原文
LFS101x.2 Introduction to Linux (Linux Foundation)
Chapter 03: Linux Structure and Installation - Section 2: The Boot Process
引導流程 - (The Boot Process)
你是否想過,在你按下電源開關直至Linux登陸提示出現時,后臺到底發生了哪些事?
Linux的引導過程是系統初始化的過程。它包含了第一次打開計算機直至用戶界面完全運作之間的一切。
一旦你開始使用Linux,你會發現,深入理解系統的引導流程,可以幫助你快速診斷故障,同時也可以幫助你調整計算機性能以滿足你的要求。
1.BIOS - The First Step
啟動一臺基于x86的Linux系統包含很多步驟。當計算機開機后,基本輸入輸出系統(Basic Input/Output System,BIOS)會初始化硬件,例如顯示屏、鍵盤等等,并且測試主存儲器。這個步驟被稱為上電自檢(Power On Self Test,POST)。
BIOS軟件被存儲在主板的一塊ROM芯片中。在這個步驟之后,剩余的引導流程將會交給操作系統完成。
2.Master Boot Records (MBR) and Boot Loader
一旦完成上電自檢(POST),系統的控制權由BIOS轉給引導加載程序(boot loader)。引導加載程序通常存儲在系統的其中一個硬盤中,要么在啟動扇區(boot sector,對于傳統的BIOS/MBR系統)中,要么在EFI分區(EFI partition,對于最近標準的可擴展固件接口,或稱為EFI/UEFI系統)中。到這個階段,機器還不能訪問任何大規模存儲設備。然后,日期、時間等信息,以及重要的外圍設備從CMOS(一項基于電池供電的存儲技術,保證系統掉電后仍可以記錄日期和時間)中加載至系統。
有許多種適用于Linux的引導加載程序;最常見的是GRUB(用于統一引導加載程序)和ISOLINUX(用于從移動設備中啟動)。大多數的Linux引導程序可以提供一個用戶界面,用于選擇Linux的可選引導項,甚至可以選擇其他已安裝的操作系統。當引導Linux之時,引導加載程序負責加載內核鏡像(kernel image)以及初始RAM磁盤(initial RAM disk,包含一些關鍵文件和啟動系統所需的驅動程序)到內存中。
3.Boot Loader in Action
引導加載程序包含兩個不同的階段:
The First Stage
對于使用BIOS/MBR方式的系統,引導加載程序存放在硬盤的第一個扇區,也被成為主引導記錄(Master Boot Record,MBR)。MBR的大小僅僅512字節。在這個階段,引導加載程序檢查分區表,并找到一個可引導分區。一旦它找到了可引導分區,它將搜索第二階段的引導加載程序,例如GRUB,并且將它加載到隨機存儲器(Random Access Memory,RAM)中。
對于使用EFI/UEFI方式的系統,UEFI固件讀取引導管理器(Boot Manager)數據,以決定哪個UEFI應用啟動且從哪啟動(從哪個磁盤和分區可以找到EFI分區)。然后這個固件啟動這個UEFI應用,例如GRUB,這個UEFI應用被定義為固件引導管理器的引導入口。這個過程更為復雜,但是比以往MBR方式更為靈活。
The Second Stage
第二階段的引導加載程序位于 /boot 目錄下。一個顯示畫面會出現,讓我們選擇引導哪個操作系統(Operating System,OS)。在選擇完OS之后,引導加載程序加載選定操作系統的內核到RAM,然后將控制權交給它。
引導程序加載了選定的內核鏡像(如果是Linux)并將控制權給它之后。內核幾乎總是被壓縮的,所以它的第一件事就是解壓內核文件。然后,它會檢查并分析系統硬件,并初始化內核中存在的所有硬件設備驅動。
4.Linux Kernel
引導程序將內核和一個基于RAM的初始文件系統(initramfs)加載到內存,使得initramfs可以被內核直接使用。
當內核在RAM中加載完畢,它會立刻初始化并配置計算機內存,同時也配置所有的系統硬件。這包括所有的處理器、I/O子系統、存儲設備等等。內核同時也加載一些必要的用戶空間程序。
5.初始RAM磁盤
initramfs文件系統鏡像包含程序文件和二進制文件,這些文件可以完成掛載root文件系統所需的所有操作。比如,給所需的文件系統提供內核功能,給大容量存儲控制器提供設備驅動udev(為用戶設備),這些驅動負責找出哪些設備可用,定位這些設備正常工作所需的驅動,并且加載它們。當找到root文件系統之后,檢測是否有錯,并掛載文件系統。
掛載(mount)程序會指示操作系統,文件系統已經可用,并將文件系統全局層次的一個特定點與之關聯,這個點稱為掛載點(themount point)。如果操作成功,initramfs將會從RAM中清除,然后root文件系統下(/sbin/init)的init程序將會執行。
init程序處理掛載和跳轉到最終實際的root文件系統。如果在大容量存儲器可以訪問之前,需要一些特殊的硬件驅動,這些驅動必須包含在initramfs鏡像中。
6./sbin/init 和服務
一旦內核設置完所有的硬件并掛載root文件系統,內核執行 /sbin/init程序。然后,這變成了初始化進程,然后開始其他進程以使得系統運轉。大多數系統上的進程,追其來源,都來自與init;例外的是內核進程,內核進程直接由內核啟動,管理操作系統的內部細節。
傳統上,這個進程啟動所使用的約定,可以追溯到System V UNIX時期,系統運行是通過一系列的運行等級(runlevel)和一系列啟動/停止服務的腳本來完成的。每個運行等級支持運行系統的不同模式。在每個運行等級,個人服務可以設置開始運行,或者停止運行。更新的發行版本拋棄了System V約定,但是通常為了兼容性仍支持System V約定。
除了啟動系統,init還要負責保持系統運行或完全關閉系統。它扮演了所有非內核進程“最終管理者”的角色。當必要時會在進程結束后清理它們,當用戶需要登陸/登出時會重啟用戶登錄服務。
7.Text-Mode Login
在引導進程接近結束之時,init啟動了一系列文本模式登陸提示(通過一個叫做getty的程序)。這使得你能夠輸入自己的用戶名,密碼,并最終進入命令shell界面。
通常,這個命令shell叫做bash(the GNUBourne Again Shell),但是也存在很多其他高級的命令shell可用。shell會打印出一個文本提示,表明已經準備好接受命令;當用戶輸入命令并敲擊Enter鍵之后,命令會被執行,然后另一個文本提示會在命令執行后顯示。
就如你在Command Line Operations章節所學到的那樣,運行命令shell的終端可以通過ALT加功能鍵(functionkey)訪問。大多數發行版本從F1或者F2開始,開啟6個文本終端和一個圖形終端。如果圖形終端也啟動了,那么切換至文本終端需要按CTRL+ALT再加上相應的功能鍵(F1或者F7是GUI)。如你接下來將簡要看到的,如果你在一個純文本模式,想要打開或重啟圖形桌面,需要運行startx命令。
8.X Window System
通常,在Linux桌面系統中,加載X Window System是引導進程的最后一步。
一個叫做顯示管理器(display manager)的服務會被提供,用于保持顯示追蹤,并加載X Server(之所以這么叫它,是因為它給應用程序提供圖形服務,有時也稱為X clients)。這個顯示管理器也負責圖形登陸,在用戶登錄后打開特定的桌面環境。
9.More About the X Window System
一個桌面環境包括會話管理器(session manager,啟動并保持圖形會話組件),窗口管理器(the window manager,控制窗口、窗口標題欄、控制欄的放置和移動)。
盡管可以被混合,通常一系列工具、會話管理器和窗口管理器是作為一個整體使用,一起提供一個無縫的桌面環境。
如果顯示管理器并不是以默認的運行等級啟動,你可以以一種不同的方式啟動X:在登陸進入文本模式終端后,通過在命令行運行startx命令開啟X。