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。导入或迁移虚拟机镜像时,固件类型要和镜像装机时的模式一致,否则同样起不来。