作為一名優(yōu)秀的碼農(nóng),必須熟練掌握的技能,大家肯定都能列出一大堆出來,多線程,操作系統(tǒng),分布式等等……不過,在掌握這些晦澀難懂的知識(shí)前,碼農(nóng)們還需要掌握的一個(gè)重要的技能,那就是要學(xué)會(huì)怎么打開計(jì)算機(jī)。
小伙伴們有沒有考慮過,當(dāng)你按下電腦的啟動(dòng)鍵時(shí),是什么在冥冥之中,指引計(jì)算機(jī)找到了操作系統(tǒng)并完成了啟動(dòng)?說到這個(gè)問題,那就不得不提的是:系統(tǒng)引導(dǎo)。
系統(tǒng)引導(dǎo)
在計(jì)算機(jī)中,引導(dǎo)是啟動(dòng)計(jì)算機(jī)過程中的一個(gè)重要階段。計(jì)算機(jī)從按下開機(jī)鍵到系統(tǒng)啟動(dòng)完成可供用戶操作為止,嚴(yán)格的來說分為兩個(gè)階段:引導(dǎo)(booting)和啟動(dòng)(startup)。引導(dǎo)階段開始于按下電源開關(guān),結(jié)束于內(nèi)核初始化完成以及 systemd 進(jìn)程成功運(yùn)行。引導(dǎo)作為上電以后的第一個(gè)步驟,承擔(dān)了系統(tǒng)自檢,加載內(nèi)核的重要責(zé)任。在開機(jī)后,計(jì)算機(jī)的主內(nèi)存中并沒有任何軟件數(shù)據(jù),因此必須由某些程序?qū)④浖虞d到內(nèi)存中才能使計(jì)算機(jī)繼續(xù)工作,這可以通過 CPU 中的硬件、系統(tǒng)固件或者系統(tǒng)中單獨(dú)的處理器來執(zhí)行這些預(yù)先預(yù)置好的程序,其中服務(wù)器上常使用的方式是 BIOS 固件。
引導(dǎo)的主要流程:
其中,bootloader 就是啟動(dòng)加載器,常見的就是 syslinux 以及 grub2。在 openEuler 中只有在使用光盤啟動(dòng) legacy BIOS 的情況下使用 syslinux,其他情況下均使用 grub2,這個(gè)我們會(huì)在下篇博客中著重介紹。
BIOS
BIOS(Basic Input/Output System)是計(jì)算機(jī)主板上的一塊很小的 ROM/閃存芯片里面的固件程序,用來在引導(dǎo)過程中初始化硬件并為操作系統(tǒng)和程序提供運(yùn)行時(shí)服務(wù)。BIOS 固件是系統(tǒng)上電以后 CPU 運(yùn)行的第一個(gè)軟件,用來測(cè)試系統(tǒng)硬件組件并從大容量存儲(chǔ)介質(zhì)中加載 bootloader 程序。
legacy BIOS
傳統(tǒng)的 BIOS 固件一般設(shè)計(jì)用于某特定計(jì)算機(jī)或主板型號(hào),稱為 legacy BIOS。不同 CPU 在系統(tǒng)上電時(shí)首條 PC(Program Counter)是由 CPU 設(shè)計(jì)者決定的,所以計(jì)算機(jī)啟動(dòng)時(shí)使用的 BIOS 程序地址會(huì)根據(jù)主板兼容的 CPU 來進(jìn)行不同設(shè)置。
例如 i386 的 CPU 首次啟動(dòng)時(shí)從 0Xfffffff0h 地址開始執(zhí)行指令,這個(gè)地址在 X86 體系中一般是由 CPU 芯片組轉(zhuǎn)發(fā) ROM 得到,其中 ROM 里存儲(chǔ)著 BIOS 的運(yùn)行代碼。
legacy 在被 CPU 拉起以后,首先執(zhí)行的指令一般為上電自檢,檢測(cè)范圍包括 RAM、顯卡等硬件設(shè)備,硬件檢測(cè)完成后,BIOS 會(huì)將它找到的第一個(gè)有效的 MBR 分區(qū)表硬盤加載到物理內(nèi)存地址 0x7C00 處(世界第一臺(tái)個(gè)人 PC 中內(nèi)存為 32K,為了給 OS 留下充足的連續(xù)內(nèi)存使用,將 MBR 磁盤中的引導(dǎo)代碼加載到了最后 1K 的內(nèi)存中,地址即 0x7C00。因?yàn)?bootloader 在 OS 啟動(dòng)后不會(huì)再使用,操作系統(tǒng)在使用中可以覆寫這塊 1K 內(nèi)存以達(dá)到使用最大數(shù)量的內(nèi)存的目的)。legacy 中的最后一條代碼指令一般都是跳轉(zhuǎn)到該地址。隨后 bootloader 程序?qū)?zhí)行拉起內(nèi)核的動(dòng)作。
隨著時(shí)代的發(fā)展,legacy BIOS 其自身的不足也逐漸暴露出來,例如尋址能力弱,難以集成第三方代碼,自檢時(shí)間長,不支持圖形界面等。
UEFI
為了解決 BIOS 的技術(shù)局限性,英特爾開發(fā)定義了操作系統(tǒng)與平臺(tái)固件之間的一系列軟件接口規(guī)范,稱之為可擴(kuò)展固件接口(EFI)規(guī)范,并在 2005 年 7 月貢獻(xiàn)給了 Unified EFI 論壇。即使沒有安裝操作系統(tǒng),UEFI 也可以支持計(jì)算機(jī)的遠(yuǎn)程診斷和修復(fù)。
最新的 UEFI2.8 版本已于 2019 年 3 月發(fā)布。
UEFI2.8 規(guī)范文檔地址:https://uefi.org/sites/default/files/resources/UEFI_Spec_2_8_final.pdf
UEFI 可以自動(dòng)檢測(cè) bootloader,從而可以輕松的從移動(dòng)設(shè)備(例如 USB 閃存驅(qū)動(dòng)器)來進(jìn)行引導(dǎo),這種檢測(cè)依賴于 bootloader 的標(biāo)準(zhǔn)化文件路徑,該路徑根據(jù)計(jì)算機(jī)體系結(jié)構(gòu)而有所不同,文件路徑的格式定義為《EFI_SYSTEM_PARTITION》EFIBOOTBOOT《MECHINE_TYPE_SHORT_NAME》.EFI,EFI_SYSTEM_PARTITION 使用 fat 磁盤格式,fat 格式的磁盤文件不區(qū)分大小寫,文件名保留創(chuàng)建時(shí)候使用的大小寫名稱,例如在 openEuler 操作系統(tǒng)上,BOOTX64.EFI/BOOTAA64.EFI 實(shí)際為 shim 生成的掃描程序,會(huì)自動(dòng)掃描所有 EFI 文件夾下含有 BOOTX64.CSV/BOOTAA64.CSV 的文件夾,并根據(jù)其內(nèi)容創(chuàng)建新的啟動(dòng)項(xiàng),方便下次啟動(dòng)時(shí)直接從該目錄進(jìn)行引導(dǎo)啟動(dòng)。例如:BOOTAA64.CSV 文件的內(nèi)容:
shimaa64.efi:引導(dǎo)啟動(dòng)使用的二進(jìn)制程序入口
openEuler:創(chuàng)建引導(dǎo)啟動(dòng)使用的標(biāo)簽名
openEuler 上的 BIOS
在 openEuler 支持的計(jì)算機(jī)體系中,X86 支持以 legacy BIOS/UEFI 模式啟動(dòng),AArch64 僅支持 UEFI 模式啟動(dòng)。
BIOS 啟動(dòng)后,會(huì)去磁盤上尋找 bootloader 并跳轉(zhuǎn)執(zhí)行 bootloader,此時(shí) BIOS 的主要使命已經(jīng)完成,后續(xù)由 bootloader 拉起內(nèi)核。BIOS 是如何知道 bootloader 在磁盤上的信息的呢,請(qǐng)看下節(jié)。
分區(qū)表
有時(shí)候我們?cè)谝龑?dǎo)操作系統(tǒng)時(shí)可能會(huì)碰到問題,為什么 BIOS 報(bào)沒有找到可以用于啟動(dòng)的介質(zhì),明明安裝是成功的呀,這就有可能是 bootloader 沒有被成功的寫入硬盤或者硬盤的分區(qū)有問題,導(dǎo)致分區(qū)信息無法被正確識(shí)別,BIOS 無法認(rèn)出我們磁盤上的 bootloader,自然會(huì)導(dǎo)致磁盤失敗。例如:
MBR 磁盤首個(gè) 512 字節(jié)扇區(qū)數(shù)據(jù)時(shí)發(fā)現(xiàn)數(shù)據(jù)存在問題,bootloader 位置的數(shù)據(jù)全為 0x00。
GPT 磁盤的 fat 分區(qū)創(chuàng)建失敗,使用 ext4 分區(qū)格式并將 bootloader 錯(cuò)誤寫入。
想要定位這些問題,我們首先要對(duì)磁盤的分區(qū)表有個(gè)初步的了解
MBR(Master Boot Record)
MBR 被稱為主引導(dǎo)記錄,也稱為主引導(dǎo)扇區(qū),是計(jì)算機(jī)開機(jī)以后 BIOS 訪問硬盤時(shí)所必須要讀取的第一個(gè)扇區(qū)。其布局為:
前 446 個(gè)字節(jié)是引導(dǎo)代碼區(qū),存放著系統(tǒng)的啟動(dòng)引導(dǎo)代碼。常見為 stage1(legacy)或者 boot.img(GRUB2)。
在引導(dǎo)代碼之后,保存著 64 個(gè)字節(jié)的分區(qū)表記錄,每條分區(qū)表記錄為 16 字節(jié),所以 MBR 分區(qū)表最大支持 4 個(gè)主磁盤分區(qū)或者 3 個(gè)主磁盤分區(qū)以及一個(gè)擴(kuò)展磁盤分區(qū)(Extended boot record, EBR)。
在過去的 512B 扇區(qū)磁盤中,MBR 使用邏輯塊地址(Logical block addressing,LBA)來進(jìn)行地址尋址,邏輯塊地址使用 32 位存儲(chǔ)邏輯地址,32 位尋址模式最大可處理扇區(qū)為 2^32,每個(gè)扇區(qū)為 512 字節(jié),即 2^9,所以可尋址的最大字節(jié)數(shù)為 2^41,即 2Tib。后來的 4K 盤能支持 MBR 尋址擴(kuò)展到 4K*2^32 共 2^44,即 16TiB,但是由于向前兼容性的問題,大部分廠商仍對(duì) MBR 分區(qū)表使用模擬 512 字節(jié)扇區(qū)的模式。
當(dāng)從 MBR 分區(qū)表開始啟動(dòng)的時(shí)候,BIOS 首先需要從啟動(dòng)介質(zhì)中加載首個(gè) MBR 512 字節(jié)扇區(qū),當(dāng)首個(gè)扇區(qū)的數(shù)據(jù)存在問題時(shí),BIOS 會(huì)嘗試從其他啟動(dòng)項(xiàng)進(jìn)行啟動(dòng)。如果所有的啟動(dòng)項(xiàng)都無法成功,則系統(tǒng)啟動(dòng)失敗。MBR 首個(gè) 512 字節(jié)扇區(qū)的格式如下:
分區(qū)表數(shù)據(jù)說明:(80)(20 21 00)(83)(aa 28 82)(00 08 00 00)(00 00 20 00)
(80):0x80 代表是激活分區(qū),可以用來引導(dǎo),0x00 代表未激活分區(qū),不能用來引導(dǎo)
(00 08 00 00):分區(qū)開始扇面,圖中 CPU 為小端序,故該值為 0x800=2048,所以該分區(qū)開始于 2048 扇面
(00 00 20 00):分區(qū)總共扇面數(shù),因 CPU 是小端序,故該值為 0x200000=2097152,該扇區(qū)的容量為 2097152*512KiB/1024/1024/1024=1GiB
GUID(Global Unique Identifiers)
GUID 是一個(gè)實(shí)體磁盤的分區(qū)表的結(jié)構(gòu)布局的標(biāo)準(zhǔn)。它是 UEFI 標(biāo)準(zhǔn)中的一部分,設(shè)計(jì)之初即為了解決 MBR 分區(qū)表中使用 32 位來存儲(chǔ)邏輯塊地址、大小信息的缺點(diǎn)。
GPT(GUID Partition Table)使用 64 位作為邏輯塊地址,最大支持 2^64 個(gè)扇區(qū),對(duì)于 512B 磁盤來說,最大的大小為 2^64*512B=2^73,即 8ZiB,對(duì)于 4K 盤來說,最大支持的數(shù)據(jù)為 2^64*4K=2^76=64ZiB。
使用 GPT 作為啟動(dòng)盤符時(shí),bootloader 必須放置于 vfat 文件格式上,UEFI 啟動(dòng)時(shí),只能讀取 fat 分區(qū)格式的磁盤分區(qū),(fat 格式本身屬于 UEFI 規(guī)范中),其他磁盤格式均不能用作 UEFI 啟動(dòng)分區(qū)格式。
使用 MBR/GPT 混合分區(qū)表的硬盤中,原本 MBR 位置存儲(chǔ)了 GPT 分區(qū)表的一部分分區(qū)(通常為前四個(gè)分區(qū)),可以使不支持從 GPT 啟動(dòng)的操作系統(tǒng)從這個(gè) MBR 啟動(dòng),啟動(dòng)后只能操作 MBR 分區(qū)表中的分區(qū)。GUID 分區(qū)表從第二個(gè) 512 字節(jié)扇區(qū)開始,稱為 GPT 表頭,從 GPT 表頭后,會(huì)攜帶數(shù)個(gè) GPT 表分區(qū),理論上 GPT 的表分區(qū)個(gè)數(shù)是無限的。
GPT 表頭結(jié)構(gòu):
例如:
表頭結(jié)構(gòu)說明:
固定簽名:”EFI PART”。
表頭大?。?x5C,即 92 字節(jié),對(duì)應(yīng)結(jié)束位置為上圖的 00000250 行右起第 4 個(gè)位置。
分區(qū)表的扇區(qū)位置:小端序,位置為扇區(qū) 0x01,即 01 扇區(qū)。
備份分區(qū)表的扇區(qū)位置:小端序,位置為 0x0C 7F FF FF 扇區(qū),即第 209715199 扇區(qū)(磁盤的最后一個(gè)扇區(qū),磁盤總大小為(209715199 + 1)*0.5KiB/1024/1024=100GiB)。
第一個(gè)可用的扇區(qū)位置:小端序,位置為 0x22 扇區(qū),所以分區(qū)表項(xiàng)分區(qū)共有個(gè) 0x22-0x01=0x21 個(gè)扇區(qū),去掉 GPT 表頭扇區(qū),所以共 32 個(gè)分區(qū)表表項(xiàng)扇區(qū)。
最后一個(gè)可用的扇區(qū)位置:小端序,位置為 0x0C 7F FF DE,即第 209715166 扇區(qū),到磁盤的最后一個(gè)扇區(qū)相差 33 個(gè)扇區(qū),其中包括 32 個(gè) GPT 備份分區(qū)表項(xiàng)和 1 個(gè) GPT 備份分區(qū)頭。
GPT 分區(qū)表項(xiàng)開始扇區(qū):位置為 0x02。
GPT 分區(qū)表項(xiàng)的個(gè)數(shù):個(gè)數(shù)為 0x80,即 128 個(gè)。GUID 分區(qū)表表項(xiàng)中每條分區(qū)表最小為 128 字節(jié),因 GUID 表頭中記錄的 GPT 分區(qū)一般為 128,故需要 128*128 字節(jié)/512Kib=32 個(gè)扇區(qū)。
GPT 分區(qū)表表項(xiàng)結(jié)構(gòu):
如何查看自己計(jì)算機(jī)的硬盤分區(qū)表
使用命令 parted /dev/磁盤名稱后輸入 p 即可看到自己磁盤使用的分區(qū)表類型:
GPT 分區(qū)表:
MBR(msdos)分區(qū)表:
openEuler 上使用的分區(qū)表
openEuler 一般使用 legacy BIOS + MBR、UEFI+GPT 的分區(qū)組合,所以在 x86 上如果使用的 legacy BIOS 模式,那么分區(qū)表一般是 MBR,在 x86/aarch64 的 UEFI 下,分區(qū)表一般為 GPT,大家可以自行嘗試看下安裝的結(jié)果哈。
結(jié)語
因?yàn)槠拗?,引?dǎo)啟動(dòng)目前只能先介紹到這里,下一期會(huì)帶大家一起了解 BIOS 拉起 bootloader(grub)以及 bootloader 啟動(dòng)內(nèi)核的相關(guān)過程,希望大家可以關(guān)注我們的文章。
原文標(biāo)題:openEuler 安裝系列詳解01 | 引導(dǎo)與分區(qū)表簡介
文章出處:【微信公眾號(hào):Linuxer】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
責(zé)任編輯:haq
-
計(jì)算機(jī)
+關(guān)注
關(guān)注
19文章
7490瀏覽量
87896 -
系統(tǒng)引導(dǎo)
+關(guān)注
關(guān)注
0文章
2瀏覽量
5280
原文標(biāo)題:openEuler 安裝系列詳解01 | 引導(dǎo)與分區(qū)表簡介
文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論