伺服器維運

UEFI 和 Legacy 的區別:伺服器裝系統該選哪個

UEFI 和 Legacy 的區別在於韌體怎樣找到作業系統:Legacy(傳統 BIOS 或 CSM 相容模式)執行磁碟第一個扇區裡的引導程式碼,配 MBR;UEFI 從 EFI 系統分割槽載入 .efi 載入程式,配 GPT。伺服器裝系統沒有特殊理由就選 UEFI,裝好以後不要再切換模式。

作者 頂聯產品團隊發布於 7 分鐘閱讀

UEFI 和 Legacy 的區別,歸根到底是開機時韌體用哪種方式把控制權交給作業系統。Legacy 是傳統 BIOS 的啟動方式:讀出磁碟第一個扇區(MBR)裡的幾百位元組引導程式碼並執行,分割槽表也記在這個扇區裡;UEFI 則直接讀取磁碟上一個 FAT32 格式的 EFI 系統分割槽,載入其中的 .efi 載入程式,分割槽表用 GPT。2 TiB 啟動盤限制、安全啟動、PXE 引導檔案這些差異,都是由此而來。伺服器裝系統沒有特殊理由就選 UEFI:新平台預設就是它,有的已經不再提供 Legacy;但裝好之後不要再切換模式,否則原系統會起不來。

一張表看懂 UEFI 和 Legacy 的區別

專案 Legacy(BIOS / CSM) UEFI
引導程式碼在哪 磁碟第 0 扇區(MBR)裡的 446 位元組,加上緊隨其後的扇區 EFI 系統分割槽(ESP)裡的 .efi 檔案
啟動項存在哪 只記錄裝置的嘗試順序,不記錄具體系統 主機板 NVRAM 裡的 Boot#### 變數,指向某塊盤上的某個檔案
分割槽表 MBR;Linux 也能用 GPT,但要加一個 BIOS boot 小分割槽,Windows 只能用 MBR GPT;Linux 也能用 MBR,Windows 只能用 GPT
啟動盤可用容量 MBR 下最多 2 TiB GPT 下沒有實際限制
分割槽數量 4 個主分割槽,更多要用擴充套件分割槽 預設 128 個
安全啟動(Secure Boot) 不支援 支援,校驗載入程式和驅動的簽名
網路啟動 PXE,只支援 IPv4,用 pxelinux.0 等檔案 PXE(IPv4、IPv6)和 HTTP 啟動,用 .efi 檔案
擴充套件卡韌體 載入卡上的傳統 Option ROM,可用空間很小 載入卡上的 UEFI 驅動
32 位系統 可以引導 x64 伺服器的 UEFI 韌體不能引導 32 位系統

今天的伺服器韌體幾乎都是 UEFI,所謂“Legacy 模式”,是 UEFI 韌體裡的相容支援模組(CSM,Compatibility Support Module)在模擬傳統 BIOS。BIOS 設定裡的寫法因品牌而異:有的是 Boot Mode 選 UEFI 或 Legacy BIOS,有的是 CSM Support 選 Enabled 或 Disabled,Dell 的 Boot Mode 選項是 BIOS 和 UEFI。開啟安全啟動前,一般要先關閉 CSM。Intel 早在 2017 年就提出要在平台上逐步取消 CSM,新一代伺服器陸續只保留 UEFI,例如 HPE ProLiant Gen11 已不再提供 Legacy 啟動模式;具體到品牌和機型,以官方文件為準。

兩種引導流程:MBR 首扇區與 EFI 系統分割槽

Legacy 啟動的過程:

  1. 開機自檢後,BIOS 按啟動順序找到第一塊可啟動的硬碟;
  2. 讀出它的第 0 扇區,共 512 位元組:446 位元組引導程式碼、64 位元組分割槽表、2 位元組結束標誌 55AA,然後把控制權交給這段程式碼;
  3. 引導程式碼載入下一階段:Linux 的 GRUB 把核心映象放在 MBR 之後的空閒扇區裡;Windows 則讀取活動分割槽的引導扇區,再由它載入 bootmgr;
  4. 最後載入核心,Windows 是 winload.exe。

UEFI 啟動的過程:

  1. 開機自檢後,韌體讀取 NVRAM 裡的 BootOrder 和各條 Boot#### 啟動項;
  2. 每條啟動項指向“哪塊盤、哪個分割槽上的哪個檔案”,例如 \EFI\rocky\shimx64.efi、\EFI\Microsoft\Boot\bootmgfw.efi;
  3. 韌體直接讀 ESP 的 FAT32 檔案系統,載入這個檔案;所有啟動項都無效時,再嘗試回退路徑 \EFI\BOOT\BOOTX64.EFI;
  4. 載入程式載入核心,Windows 是 winload.efi。

兩種流程的差別帶來一個直接後果:Legacy 的引導資訊全在硬碟上,換主機板、清 BIOS 都不影響;UEFI 有一半資訊存在主機板 NVRAM 裡,換主機板、刷 BIOS 或恢復預設設定後,啟動項可能丟失,硬碟完好也開不了機,要重新新增啟動項。

檢視一台已經裝好的系統是用哪種方式啟動的:

# Linux
ls /sys/firmware/efi >/dev/null 2>&1 && echo UEFI || echo Legacy
efibootmgr -v          # Legacy 啟動的系統會提示 EFI variables are not supported
mokutil --sb-state     # 安全啟動是否開啟
# Windows,以管理員身份執行 PowerShell
$env:firmware_type                 # 輸出 UEFI 或 Legacy
bcdedit | findstr /i winload       # winload.efi 是 UEFI,winload.exe 是 Legacy
Confirm-SecureBootUEFI             # 返回 True 或 False;Legacy 啟動的系統上會報不支援

圖形介面裡也能看:執行 msinfo32,“系統摘要”中的“BIOS 模式”一行顯示 UEFI 或“傳統”。

2 TiB 限制從哪來:MBR 和 GPT 的算術

MBR 分割槽表的每個表項用 32 位記錄分割槽的起始扇區和扇區數。按 512 位元組的扇區算,能描述的最大範圍是:

2³² × 512 位元組 = 2,199,023,255,552 位元組 = 2 TiB(約 2.2 TB)

超出的部分,分割槽表根本寫不進去。GPT 用 64 位記錄扇區位址,實際使用中沒有容量上限;它在磁碟開頭和末尾各存一份分割槽表,壞了一份還能用另一份恢復。

伺服器上碰到這個限制,往往不是因為單塊盤大,而是因為 RAID。4 塊 4 TB 硬碟做 RAID 10,陣列卡交給系統的是一塊 8 TB 的虛擬盤;Legacy 模式下裝 Windows,安裝程式只能用 MBR,8 TB 裡只有 2 TiB 能分割槽,剩下的空間用不上。解決辦法有兩個:

  • 改用 UEFI + GPT,整塊虛擬盤都能用,這是首選;
  • 在陣列卡上切出一塊小的啟動虛擬盤(例如 200 GB)裝系統,剩餘空間建第二塊虛擬盤做資料盤,資料盤單獨用 GPT 分割槽。Legacy 啟動的系統可以正常讀寫 GPT 資料盤,只是不能從它啟動。

另一個看似可行的繞法是用 4Kn 硬碟:扇區變成 4096 位元組,MBR 能描述的範圍隨之擴大到 16 TiB。但 4Kn 盤作為啟動盤一般要求 UEFI,這條路繞不過去。

UEFI PXE 和 Legacy PXE:要下發的檔案不同

網路裝機時,兩種模式走的是兩套引導程式碼,PXE 服務端要按客戶端的模式下發不同的檔案。網路卡在 DHCP 請求的選項 93 裡報告自己的架構,服務端據此區分:

專案 Legacy PXE UEFI PXE
DHCP 選項 93 的值 0 7 或 9(x64 UEFI,不同韌體報的值不同);UEFI HTTP 啟動為 16
常用引導檔案 pxelinux.0、undionly.kpxe shimx64.efi 加 grubx64.efi、ipxe.efi、syslinux.efi
下載方式 TFTP TFTP;支援 HTTP 啟動的韌體可以直接用 HTTP 下載
IPv6 不支援 支援 PXE over IPv6
安全啟動 不涉及 開啟時引導檔案必須帶受信任的簽名,用發行版自帶的 shim 和 GRUB

落到操作上,有四點影響:

  • 一批機器的啟動模式要統一。 模式混雜時,服務端要準備兩套檔案、維護兩份選單,排錯時還得先分清是哪種。
  • UEFI 下網路卡的網路引導往往要單獨開啟。 很多 BIOS 裡叫 Network Stack 或 PXE Device,沒開啟的話啟動選單里根本沒有網路卡項。
  • 透過 BMC 設定一次性 PXE 啟動時,要說明是 UEFI。 ipmitool 加上 options=efiboot,例如 ipmitool -I lanplus -H 10.20.0.15 -U admin -P '密碼' chassis bootdev pxe options=efiboot,否則部分機型會按 Legacy 方式去引導。
  • 裝好的系統跟著裝機時的模式走。 用 UEFI PXE 裝出來的就是 UEFI 系統,以後也必須以 UEFI 模式啟動。

伺服器裝系統選 UEFI 還是 Legacy

新伺服器預設 UEFI,原因很實際:

  1. 啟動盤不受 2 TiB 限制,RAID 虛擬盤可以整塊使用;
  2. 支援安全啟動,引導鏈被篡改時韌體拒絕載入,部分安全合規要求會用到;
  3. 從 NVMe 啟動更可靠,Legacy 模式下 NVMe 盤能否作為啟動盤,取決於有沒有對應的 Option ROM,很多平台只在 UEFI 下支援;
  4. 擴充套件卡多了也不怕,Legacy 只給擴充套件卡的 Option ROM 留了很小的一塊記憶體空間,插多塊網路卡、HBA 時可能提示 Option ROM 空間不足,部分卡的引導功能載入不上;
  5. 網路啟動能力更全,PXE over IPv6 和韌體原生的 HTTP 啟動只在 UEFI 下提供;
  6. 平台正在淘汰 Legacy,今天選了 Legacy,換代時還得再遷移一次。

仍然需要 Legacy 的場景不多:

場景 原因 建議
安裝 32 位作業系統 x64 伺服器的 UEFI 韌體不能引導 32 位系統 只能 Legacy;更好的辦法是換 64 位系統
恢復按 Legacy + MBR 製作的老系統映象 映象裡沒有 EFI 分割槽和 UEFI 載入程式 臨時用 Legacy,計劃重做映象
要從只有傳統 Option ROM 的老擴充套件卡啟動 這張卡在 UEFI 下無法作為啟動裝置 隻影響從這張卡啟動;能換卡就換卡
只能在 DOS 下執行的韌體升級工具 需要從 DOS 啟動盤引導 臨時切換,用完切回,期間不要動系統盤的引導
PXE 服務端只准備了 pxelinux.0 沒有 UEFI 引導檔案 補齊服務端的 UEFI 檔案,而不是讓機器遷就

定下來之後,同一批機器統一設定。Dell 伺服器可以透過 racadm 批次檢視和修改,以下以 14、15 代為例,屬性名和取值以對應版本的 RACADM 文件為準:

racadm get BIOS.BiosBootSettings.BootMode
racadm set BIOS.BiosBootSettings.BootMode Uefi
racadm jobqueue create BIOS.Setup.1-1
racadm serveraction powercycle

後兩條先建立 BIOS 配置任務,再對伺服器斷電重啟,任務在重啟過程中寫入 BIOS。其他品牌可以透過 Redfish 的 BIOS 屬性或廠商自己的命令列工具修改,同樣先在一台機器上驗證,再推到整批。

切換模式後原系統起不來怎麼辦

典型場景:一台用 Legacy 裝好的機器,有人為了做 UEFI PXE 把啟動模式改成了 UEFI;或者刷了 BIOS、換了主機板、清除了 CMOS,啟動模式回到了出廠預設值。重啟後要麼提示找不到啟動裝置,要麼直接進了 PXE 或 UEFI Shell,具體提示因品牌而異。這時硬碟上的系統和資料其實都還在。

按這個順序處理:

  1. 先切回原來的模式。 判斷原系統是哪種:盤上有一個一百 MB 到 1 GB 左右、FAT32 格式的 EFI 系統分割槽,就是 UEFI 裝的;分割槽表是 MBR、沒有 EFI 分割槽,就是 Legacy 裝的。在救援系統裡用 lsblk -f 和 fdisk -l 就能看出來。切回去,絕大多數情況就能正常啟動。
  2. 模式對了,UEFI 系統還是起不來。 多半是換主機板或恢復預設設定後,NVRAM 裡的啟動項沒了。在 BIOS 的啟動選項裡用“新增啟動項”瀏覽到 ESP 上的 .efi 檔案,或者從救援系統用 efibootmgr 重新新增。
  3. 確實要從 Legacy 轉到 UEFI,比如要用上 2 TiB 以外的空間或開啟安全啟動,再考慮轉換。

Windows 有現成的轉換工具 mbr2gpt,Windows 10 1703 起提供,在 Windows Server 上使用前先確認 C:\Windows\System32 下有 mbr2gpt.exe。先驗證再轉換,轉換前暫停 BitLocker 並做好備份:

mbr2gpt /validate /allowFullOS
mbr2gpt /convert /allowFullOS

驗證不透過時它會說明原因,例如主分割槽超過 3 個或存在擴充套件分割槽。轉換成功後重啟進 BIOS,把啟動模式改為 UEFI。

Linux 沒有一鍵工具,要手動完成,大致步驟是:

  1. 備份資料,把 BIOS 切到 UEFI 模式,從救援介質以 UEFI 方式啟動;
  2. 用 sgdisk -g /dev/sda 把 MBR 分割槽表原地轉換為 GPT,分割槽和資料保留;磁碟末尾要留出 33 個扇區存放備份分割槽表,最後一個分割槽頂到盤尾時要先縮小它;
  3. 騰出空間新建 EFI 系統分割槽:sgdisk -n 0:0:+512M -t 0:EF00 /dev/sda,再用 mkfs.vfat -F 32 格式化,沒有空閒空間時要先縮小或刪掉 swap 分割槽;
  4. 掛載原系統並 chroot,把新分割槽掛到 /boot/efi 並寫進 fstab,安裝 UEFI 版的 GRUB 和 shim 軟體包,重新生成 grub.cfg 並新增啟動項;
  5. 保持 BIOS 的 UEFI 模式重啟,從新新增的啟動項進入原系統。

注意,做完第 2 步,這塊盤就已經無法用 Legacy 方式啟動了:GRUB 原先放在 MBR 之後空閒扇區裡的程式碼,位置被 GPT 分割槽表佔用。所以必須一口氣做完第 4 步再重啟。這個過程出錯的代價高,能重灌的機器,備份資料後直接用 UEFI 重灌往往更省時間。

在管理系統裡怎麼落地

改啟動模式、判斷系統卡在哪一步,都離不開看開機畫面:BIOS 裡當前是什麼模式,啟動選單裡有哪些項,螢幕上提示了什麼錯誤。Toplink DCIM 的 IPMI 遠端管理提供走 BMC 通道的 VNC 控制檯,開機自檢、BIOS 設定到安裝程式的全過程都能在瀏覽器裡看到和操作,也能傳送 Ctrl+Alt+Del 等特殊按鍵;還可以設定下一次從 PXE、線上 ISO 或硬碟啟動,遠端掛載安裝映象,系統起不來時進入救援模式搶修。為了改一個啟動模式專門跑一趟機房,這樣的事就可以省掉了。

常見問題

UEFI 模式下一定要關閉安全啟動才能裝系統嗎?

不一定。主流 Linux 發行版和 Windows Server 的安裝介質都帶有簽名的載入程式,開著安全啟動可以直接安裝。需要關閉或另行登記金鑰的情況,是載入程式或驅動沒有受信任的簽名,例如自己編譯的 iPXE、部分第三方核心模組。

EFI 系統分割槽要多大?

UEFI 規範沒有規定固定大小。Windows 安裝程式預設建 100 MB(4Kn 盤上是 260 MB),Linux 發行版的安裝程式通常建幾百 MB 到 1 GB。手動分割槽時給 512 MB 左右、格式化為 FAT32 一般就夠,要放多個載入程式時再留大一些。

虛擬機器也要區分 UEFI 和 Legacy 嗎?

要。QEMU/KVM 不指定韌體時用 SeaBIOS,也就是 Legacy,Proxmox VE 新建虛擬機器預設也是它,改選 OVMF 韌體才是 UEFI;Hyper-V 的第 1 代虛擬機器是 BIOS,第 2 代是 UEFI。匯入或遷移虛擬機器映象時,韌體型別要和映象裝機時的模式一致,否則同樣起不來。

想看看在你的機房裡怎麼用?

從一次產品示範開始,梳理你的業務鏈路。

查看價格
服務熱線 400-112-2951

讓我們聊聊你的 IDC 業務

掃碼新增企業微信,預約產品示範或申請試用。

Toplink 企業微信二維碼

長按儲存或使用企業微信 / 微信掃描

也可致電
400-112-2951
Telegram
@TopLink88