UEFI 和 Legacy 的區別:伺服器裝系統該選哪個
UEFI 和 Legacy 的區別在於韌體怎樣找到作業系統:Legacy(傳統 BIOS 或 CSM 相容模式)執行磁碟第一個扇區裡的引導程式碼,配 MBR;UEFI 從 EFI 系統分割槽載入 .efi 載入程式,配 GPT。伺服器裝系統沒有特殊理由就選 UEFI,裝好以後不要再切換模式。
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 啟動的過程:
- 開機自檢後,BIOS 按啟動順序找到第一塊可啟動的硬碟;
- 讀出它的第 0 扇區,共 512 位元組:446 位元組引導程式碼、64 位元組分割槽表、2 位元組結束標誌 55AA,然後把控制權交給這段程式碼;
- 引導程式碼載入下一階段:Linux 的 GRUB 把核心映象放在 MBR 之後的空閒扇區裡;Windows 則讀取活動分割槽的引導扇區,再由它載入 bootmgr;
- 最後載入核心,Windows 是 winload.exe。
UEFI 啟動的過程:
- 開機自檢後,韌體讀取 NVRAM 裡的 BootOrder 和各條 Boot#### 啟動項;
- 每條啟動項指向“哪塊盤、哪個分割槽上的哪個檔案”,例如
\EFI\rocky\shimx64.efi、\EFI\Microsoft\Boot\bootmgfw.efi; - 韌體直接讀 ESP 的 FAT32 檔案系統,載入這個檔案;所有啟動項都無效時,再嘗試回退路徑
\EFI\BOOT\BOOTX64.EFI; - 載入程式載入核心,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,原因很實際:
- 啟動盤不受 2 TiB 限制,RAID 虛擬盤可以整塊使用;
- 支援安全啟動,引導鏈被篡改時韌體拒絕載入,部分安全合規要求會用到;
- 從 NVMe 啟動更可靠,Legacy 模式下 NVMe 盤能否作為啟動盤,取決於有沒有對應的 Option ROM,很多平台只在 UEFI 下支援;
- 擴充套件卡多了也不怕,Legacy 只給擴充套件卡的 Option ROM 留了很小的一塊記憶體空間,插多塊網路卡、HBA 時可能提示 Option ROM 空間不足,部分卡的引導功能載入不上;
- 網路啟動能力更全,PXE over IPv6 和韌體原生的 HTTP 啟動只在 UEFI 下提供;
- 平台正在淘汰 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,具體提示因品牌而異。這時硬碟上的系統和資料其實都還在。
按這個順序處理:
- 先切回原來的模式。 判斷原系統是哪種:盤上有一個一百 MB 到 1 GB 左右、FAT32 格式的 EFI 系統分割槽,就是 UEFI 裝的;分割槽表是 MBR、沒有 EFI 分割槽,就是 Legacy 裝的。在救援系統裡用
lsblk -f和fdisk -l就能看出來。切回去,絕大多數情況就能正常啟動。 - 模式對了,UEFI 系統還是起不來。 多半是換主機板或恢復預設設定後,NVRAM 裡的啟動項沒了。在 BIOS 的啟動選項裡用“新增啟動項”瀏覽到 ESP 上的 .efi 檔案,或者從救援系統用 efibootmgr 重新新增。
- 確實要從 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 沒有一鍵工具,要手動完成,大致步驟是:
- 備份資料,把 BIOS 切到 UEFI 模式,從救援介質以 UEFI 方式啟動;
- 用
sgdisk -g /dev/sda把 MBR 分割槽表原地轉換為 GPT,分割槽和資料保留;磁碟末尾要留出 33 個扇區存放備份分割槽表,最後一個分割槽頂到盤尾時要先縮小它; - 騰出空間新建 EFI 系統分割槽:
sgdisk -n 0:0:+512M -t 0:EF00 /dev/sda,再用mkfs.vfat -F 32格式化,沒有空閒空間時要先縮小或刪掉 swap 分割槽; - 掛載原系統並 chroot,把新分割槽掛到
/boot/efi並寫進 fstab,安裝 UEFI 版的 GRUB 和 shim 軟體包,重新生成 grub.cfg 並新增啟動項; - 保持 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。匯入或遷移虛擬機器映象時,韌體型別要和映象裝機時的模式一致,否則同樣起不來。