安装虚拟机EFI分区失败,绝大多数情况不是虚拟机软件坏了,而是固件类型、分区表和ESP分区格式三者没对上。 先把虚拟机的固件类型确认成UEFI,再把磁盘转成GPT,然后手动建一个300MB左右、FAT32格式、带esp标记的分区,问题通常就解开了。
先搞清楚EFI分区到底在挑什么
虚拟机里的EFI分区,学名是ESP(EFI System Partition),它不是随便划一块空间就行,固件和安装器对它有几条很明确的偏好。
- 分区表必须是GPT,UEFI固件能读MBR,但Windows安装程序明确拒绝在MBR盘上用UEFI方式安装,会直接报“无法创建新的系统分区”。
- 文件系统必须是FAT32,很多分区工具默认给FAT16,虚拟机固件扫过去就当没看见。
- 分区类型GUID要正确,ESP的类型GUID是
C12A7328-F81F-11D2-BA4B-00A0C93EC93B,用parted的话对应set 1 esp on。 - 容量有下限,微软官方文档给的Windows默认值是100MB,多数Linux发行版文档建议300MB以上,太小了mkfs.vfat会拒绝格式化成FAT32,太大了部分安装器也会挑刺。
业内专家指出,虚拟机环境里EFI相关的报错,八成集中在“固件类型和磁盘分区表不匹配”这一条上。
虚拟机安装时EFI分区创建失败怎么解决
安装器提示无法创建EFI系统分区
先别急着重装,按Shift+F10(Windows安装界面)或者切到另一个TTY(Linux),敲下面这行:
ls /sys/firmware/efi
目录存在,说明当前是UEFI方式启动的安装介质;报“No such file or directory”,说明你其实是用Legacy BIOS模式引导的安装盘,这时候不管磁盘怎么建,安装器都不会给你写EFI分区。
处理办法:关掉虚拟机,进设置把固件类型改成UEFI,VMware在“虚拟机设置→选项→高级→固件类型”;VirtualBox在“设置→系统→主板→启用EFI”,改完必须冷启动,直接重启虚拟机不生效。
分区建好了,开机却进EFI Shell或者黑屏
这种情况说明ESP建成了,但引导文件没写进去,常见于手动分区后跳过了引导器安装步骤。
进虚拟机看两个地方:/boot/efi/EFI/下面有没有对应发行版的目录(比如ubuntu、fedora),以及efibootmgr -v能不能看到启动项,目录空着,就是grub-install或bootctl没跑成功。
磁盘超过2TB却用了MBR
MBR分区表最多认2TB,虚拟机磁盘一旦超过这个数,多余空间要么用不上,要么分区表直接写坏,这种场景下EFI分区创建失败只是表象,根子在分区表类型,用parted /dev/sda print看一眼Partition Table字段,写着msdos就得换成gpt。
VirtualBox和VMware EFI报错有什么区别
两家的坑不太一样,对症下药能省不少时间。
| 对比项 | VirtualBox | VMware Workstation |
|---|---|---|
| EFI开关位置 | 系统→主板→启用EFI | 选项→高级→固件类型 |
| 修改时机 | 必须关机 | 必须关机 |
| 常见卡点 | 卡在EFI Shell,找不到启动项 | 安全引导开启后,未签名驱动加载失败 |
| 对FAT16的容忍度 | 较低,容易识别不到ESP | 相对宽松,但装系统仍会失败 |
| 多ESP处理 | 优先识别第一块盘的ESP | 按启动顺序识别 |
VirtualBox旧版本的EFI实现比较简陋,卡在EFI Shell是高频问题,可以在Shell里输入exit进Boot Manager手动选启动项,或者用bcfg boot add把引导项写进NVRAM,VMware这边,如果勾了“启用安全引导”,Linux下某些第三方驱动会加载失败,排查时可以先把安全引导关掉。
手动补建EFI分区:Linux和Windows两条路
Linux下用parted重建ESP并重装GRUB
先进Live环境,确认目标盘:
lsblk parted /dev/sda print
重建分区表(会清空数据,操作前确认盘符):
parted /dev/sda mklabel gpt mkpart ESP fat32 1MiB 513MiB set 1 esp on mkpart root ext4 513MiB 100% quit
格式化和挂载:
mkfs.fat -F32 /dev/sda1 mount /dev/sda2 /mnt mount /dev/sda1 /mnt/boot/efi
chroot进去重装引导,记得把/dev、/proc、/sys挂上:
for i in dev proc sys; do mount --bind /$i /mnt/$i; done chroot /mnt grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB grub-mkconfig -o /boot/grub/grub.cfg
没有GRUB的发行版,用bootctl install写systemd-boot,路径一样。
Windows安装界面里用diskpart手动分区
在安装向导的磁盘选择页按Shift+F10,依次执行:
diskpart list disk select disk 0 clean convert gpt create partition efi size=300 format quick fs=fat32 label="System" create partition msr size=16 create partition primary format quick fs=ntfs label="Windows" exit
注意:create partition efi这条命令只在UEFI方式启动的WinPE里可用,如果报“该命令不支持当前启动类型”,说明你的安装U盘是BIOS方式引导的,回去改虚拟机的固件类型,别在这条命令上死磕。
笔记本装虚拟机EFI引导失败怎么办
笔记本上跑的虚拟机,多了一层宿主机的干扰,比较典型的是三种情况。
- 宿主机开了Hyper-V或者内存完整性,VirtualBox和VMware都会降速甚至起不来,UEFI引导阶段直接卡死,控制面板→程序→启用或关闭Windows功能,把Hyper-V和相关虚拟化平台关掉,重启再试。
- 宿主机是ARM架构的新笔记本,x86的ISO在ARM虚拟机上跑不起来,EFI分区建了也没用,得换ARM版本的镜像。
- 宿主机的杀毒软件拦了虚拟磁盘写入,表现为分区命令执行成功,重启后分区表却回滚了,把虚拟机目录加进白名单即可。
机房批量部署虚拟机EFI分区失败的排查顺序
批量场景下,单台能装、批量就挂,通常是模板或者自动化脚本的问题,行业共识认为,按下面这个顺序查效率最高:
- 模板虚拟机的固件类型是不是UEFI,磁盘是不是GPT。
- 克隆时有没有把NVRAM一起带过去,只克隆磁盘不带NVRAM,新虚拟机会找不到启动项。
- 自动化脚本里的分区命令,是不是还留着MBR时代的
mklabel msdos。 - 批量注入的镜像,
/boot/efi/EFI/目录是否完整。
批量环境下,把ESP统一设成512MB是个省心的做法,能覆盖绝大多数发行版和Windows双系统共存的需求。
修复虚拟机EFI分区要不要花钱
软件层面基本不用花钱,parted、diskpart、efibootmgr、bootctl全是系统自带或者开源工具,虚拟机软件本身也内置了这些能力,真正产生费用的场景只有两个:一是虚拟机磁盘物理损坏要做数据恢复,这类服务通常按盘计价,价格区间跨度大,从几百元到上千元都有;二是企业环境里买商业虚拟化平台的技术支持,普通用户自己动手,成本就是时间。
据微软官方文档,Windows在UEFI+GPT环境下自动创建的ESP默认是100MB,手动建到300MB以上更稳妥,后续系统更新和恢复环境都够用。
安装虚拟机EFI分区失败的常见疑问解答
EFI分区不小心删了会怎样
系统立刻无法引导,但数据通常还在,用Live环境重建一个FAT32格式、带esp标记的分区,重新跑一遍grub-install或bcdboot,多数情况能救回来,重建前先用testdisk确认原分区起始扇区,尽量保持对齐一致。
虚拟机里的EFI分区给多大合适
只装Linux,300MB够用;Windows加Linux双系统,512MB更从容;如果打算开休眠或者装多个内核版本,1GB也不算浪费,低于100MB时,FAT32格式化本身就可能失败,这是很多人卡住却查不到原因的地方。
克隆虚拟机后进不了系统,和EFI分区有关吗
关系很大,UEFI的启动项写在虚拟机的NVRAM里,不在磁盘上,只复制vmdk或vdi文件,新虚拟机没有对应的NVRAM记录,固件自然找不到引导文件,解决办法是克隆时选择“完整克隆”并保留NVRAM,或者在新建虚拟机后进EFI Shell,用bcfg boot add手动把\EFI\BOOT\BOOTX64.EFI注册为启动项。