1. 为什么要在vSphere里折腾启动模式?从BIOS到EFI的实战价值
最近在帮朋友的公司折腾他们的AI开发环境,遇到了一个挺典型的问题。他们在vSphere上新建了一台Ubuntu 24.04的虚拟机,打算用来跑一些大模型相关的实验。硬件配置挺给力,准备做显卡直通来加速计算。结果在ESXi里配置直通的时候,系统提示需要虚拟机使用EFI启动模式,而他们当初创建虚拟机时,图省事(或者说没想那么多)直接用了默认的BIOS(也叫Legacy)模式。这下就尴尬了,BIOS启动和EFI启动不兼容,直通配置卡住了。这个场景我相信不少做虚拟化或者私有云运维的朋友都遇到过,不仅仅是显卡直通,有时候一些新的硬件特性、安全启动(Secure Boot)要求,或者就是想统一管理规范,都会逼着我们把虚拟机的启动模式从陈旧的BIOS升级到更现代的EFI(UEFI)。
所以,这篇文章就是来解决这个“逼上梁山”的问题的。我会手把手带你走一遍在vSphere环境里,把一台正在运行的Ubuntu 24.04虚拟机,从BIOS启动无损切换到EFI启动的完整过程。这可不是简单地在vSphere控制台里改个设置就完事的,那样做虚拟机绝对会启动失败。核心关键在于,我们得在虚拟机内部操作系统层面,准备好EFI启动所需要的一切“家当”——主要是EFI系统分区(ESP)和对应的引导程序。整个过程有点像给一辆正在行驶的汽车换发动机,还不能让车停下来。别担心,跟着我的步骤走,踩过的坑我都会提前告诉你,保证你能平稳落地。
我估计你可能是运维工程师、DevOps或者是对vSphere和Linux有一定了解的技术爱好者。无论你是为了解决眼前的兼容性问题,还是想提前储备这个技能,这篇指南都力求做到“小白友好”。我会尽量用大白话解释清楚每个步骤背后的原因,避免直接扔给你一堆命令让你照抄。毕竟,知其然知其所以然,下次遇到类似问题你才能举一反三。好,废话不多说,咱们先从准备工作开始。
2. 动手前的“三省吾身”:环境检查与备份策略
在动任何刀子之前,充分的检查和备份是保住饭碗的关键。这一步千万别跳过,尤其是对生产环境里的虚拟机操作。
首先,确认你的虚拟化环境。 我们操作的核心平台是VMware vSphere,你可能通过vCenter Server或者直接连ESXi主机来管理。确保你有对应虚拟机的管理员权限,并且能通过控制台或者SSH连接到虚拟机内部。我强烈建议使用SSH连接,因为后面有些步骤需要重启,控制台操作可能没那么方便。虚拟机本身安装的是Ubuntu 24.04 LTS,这是本文的操作系统基础,其他版本(比如22.04、20.04)的大体思路类似,但部分软件包名称或配置文件路径可能有细微差别,需要你灵活调整。
其次,也是最关键的一步:备份!备份!备份! 重要的事情说三遍。我们即将修改的是系统的引导核心和分区表,属于高风险操作。虽然我提供的步骤经过实测,但你的环境可能有个体差异。最稳妥的备份方式是利用vSphere本身的功能,为这台虚拟机创建一个完整的快照(Snapshot)。在vSphere Client里找到你的虚拟机,右键选择“快照”->“生成快照”,给快照起个明白的名字,比如“Before_BIOS_to_EFI_Migration”。这样,万一操作过程中出现任何不可预知的问题,你可以瞬间回滚到操作前的状态,这是最安全的后悔药。如果因为策略限制无法创建快照,那么至少也要备份虚拟机内的重要数据。可以考虑把 /home 目录、/etc 配置文件目录等重要数据打包拷贝到其他存储上。
最后,检查当前的启动模式和分区表。 我们需要先摸清家底。通过SSH登录到Ubuntu虚拟机,打开终端。输入以下命令来检查当前系统的启动模式:
ls /sys/firmware/efi
如果这个目录存在并且里面有一些文件,那么恭喜你,你的虚拟机可能已经是EFI模式了,不需要进行后续迁移。如果返回“No such file or directory”,那么你当前正处在传统的BIOS启动模式,这篇文章就是为你写的。接下来,检查系统盘的分区表类型,这决定了我们后续操作的重点。运行:
sudo fdisk -l /dev/sda
注意,你的系统盘可能不是 sda,也可能是 nvme0n1 之类的,请根据 fdisk -l 的输出判断哪块盘是系统盘(通常是有Linux分区挂载根目录 / 的那块盘)。在输出的开头部分,寻找类似“Disklabel type”的一行。如果显示 gpt,那么你的磁盘已经是GPT分区表,这是EFI启动的好伙伴,后续操作会简单很多。如果显示 dos(也就是MBR分区表),那么我们需要先进行分区表转换,这是整个迁移过程中技术含量最高、风险相对较大的一步,我会在下一节详细展开。做好这些检查,心里就有底了。
3. 核心攻坚战:分区表转换与EFI分区创建
这是整个迁移过程的技术核心,分为两个主要阶段:一是确保磁盘使用GPT分区表,二是创建EFI系统分区。
3.1 将MBR分区表转换为GPT
如果你的 fdisk -l 显示是 dos(MBR),那么我们必须先转换它。MBR分区表有诸多限制,比如最多4个主分区、不支持2TB以上大硬盘等,而GPT分区表是现代标准,EFI启动也强烈依赖它。转换工具我们使用 gdisk。首先安装它:
sudo apt update
sudo apt install gdisk -y
安装完成后,开始转换。请注意:以下操作会直接修改磁盘分区表,请再次确认已做好备份或快照! 针对你的系统盘(例如 /dev/sda)执行:
sudo gdisk /dev/sda
你会进入 gdisk 的交互式命令行。它首先会检测到这是MBR分区表,并提示你。这时,输入 r 进入恢复和转换菜单。然后输入 g 命令,将MBR分区表转换为GPT。这个过程是内存中的操作,还没有写入磁盘。输入 w 来写入更改并退出。gdisk 会再次向你确认,输入 y 确认。完成后,它会提示你同步磁盘。现在,不要重启! 分区表转换完成了,但引导信息还没变,直接重启系统会无法启动。我们需要在系统还活着的时候,把EFI启动的“基础设施”建好。
注意:如果你的数据盘(非系统盘)也是MBR,且你希望一并转换,可以重复上述步骤。但系统盘的转换是必须的。
3.2 创建并挂载EFI系统分区
EFI启动需要一个特殊的FAT32格式分区,用来存放引导程序(如GRUB)和EFI应用程序。这个分区通常不需要很大,256MB到512MB足矣。在vSphere环境中,我们可以选择两种方式:一是在现有系统盘上调整分区腾出空间(不推荐,风险高);二是直接添加一块新的、小容量的虚拟硬盘专用于EFI分区。我强烈推荐第二种方法,因为它简单、安全,且不影响原有系统分区。
回到vSphere控制台,编辑虚拟机设置,添加一块新的硬盘。大小设置为512MB,置备策略选择“精简置备”即可。保存后,回到Ubuntu的SSH终端。使用 lsblk 命令查看新添加的磁盘,它通常会显示为 /dev/sdb 或 /dev/sdc(取决于你已有的磁盘数量)。假设新盘是 /dev/sdc。
接下来,在这块新盘上创建分区:
sudo fdisk /dev/sdc
在 fdisk 交互界面中,依次输入:n(新建分区),p(主分区),1(分区号),直接回车(使用默认的第一个扇区),再直接回车(使用所有空间,即整个512MB)。然后输入 t 来更改分区类型,输入 1 选择我们刚创建的分区1,然后设置类型代码为 EF00(这是EFI系统分区的类型代码)。最后输入 w 写入并退出。
现在,格式化这个分区为FAT32:
sudo mkfs.fat -F 32 /dev/sdc1
创建挂载点,并挂载它:
sudo mkdir -p /boot/efi
sudo mount /dev/sdc1 /boot/efi
为了让这个挂载在每次启动时都自动生效,我们需要编辑 /etc/fstab 文件:
sudo nano /etc/fstab
在文件末尾添加一行:
/dev/sdc1 /boot/efi vfat defaults 0 1
保存并退出。然后测试一下配置是否正确:
sudo mount -a
如果这条命令没有报错,并且 df -h 命令能看到 /boot/efi 已挂载,那么EFI分区的准备工作就完美完成了。至此,虚拟机内部已经为EFI启动铺好了路。
4. 安装引导程序与GRUB配置更新
基础设施建好了,现在需要把“引导系统”这个软件装进去。对于Ubuntu来说,这个引导程序就是GRUB。在EFI模式下,我们需要安装特定版本的GRUB。
首先,尝试安装EFI版的GRUB到我们刚创建的分区:
sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu
如果你运气好,这条命令一次成功。但根据我的经验,在刚安装的Ubuntu 24.04上,很大概率会报错,提示缺少 /usr/lib/grub/x86_64-efi/modinfo.sh 之类的文件。这是因为默认安装的 grub-pc 包是针对BIOS的,EFI所需的 grub-efi-amd64 包没有安装。别慌,装上它就行:
sudo apt install grub-efi-amd64 -y
安装完成后,再次运行上面的 grub-install 命令。这次应该能看到成功的输出,显示GRUB已安装到 /boot/efi。这个过程会在 /boot/efi/EFI 目录下创建一个名为 ubuntu 的文件夹,里面包含了EFI引导文件。
接下来,我们需要让GRUB识别当前系统里的所有操作系统(可能就一个Ubuntu)并生成配置文件。运行:
sudo update-grub
这个命令会扫描你的磁盘,找到可启动的内核,并在 /boot/grub/grub.cfg 中生成配置。看到它成功找到了你Ubuntu的镜像就对了。到这里,虚拟机内部的所有操作就全部完成了。你可以用 efibootmgr 命令试一下(如果已安装),不过现在可能还看不到条目,因为虚拟机的固件(在vSphere层面)还没切换到EFI模式。
5. 切换vSphere配置与最终验证
这是最后一步,也是最激动人心的一步:改变虚拟机的“基因”。我们需要关机,修改虚拟机的固件设置,然后开机验证。
首先,在Ubuntu系统里安全关机:
sudo shutdown -h now
等待虚拟机完全关闭。然后,在vSphere Client中,右键点击该虚拟机,选择“编辑设置”。找到“虚拟机选项” -> “引导选项” -> “固件”。你会看到当前是“BIOS”。把它下拉改为“EFI”。务必确保这一步,这是切换启动模式的根本。 保存设置。
现在,启动虚拟机。你可以从vSphere控制台观察启动过程。如果一切顺利,你会看到GRUB的引导菜单(可能和之前BIOS下的样式略有不同),然后系统正常进入Ubuntu。登录系统后,我们来进行最终验证,确保迁移成功。
这里有几种验证方法,你可以任选一两种:
方法一:检查EFI固件目录(最直接)
ls /sys/firmware/efi
如果这个目录存在且列出文件,铁定是EFI模式了。如果报错不存在,那说明还在BIOS模式。
方法二:查看内核启动信息
dmesg | grep -i efi
如果输出中包含“EFI v” 或 “UEFI” 字样,就是EFI启动。
方法三:使用 efibootmgr 工具(确凿证据)
先安装它:sudo apt install efibootmgr -y,然后运行:
sudo efibootmgr
如果显示一个UEFI启动项的列表(其中应该包含ubuntu),那就是100%的EFI模式。如果报错“EFI variables are not supported”,那说明还是BIOS。
方法四:确认分区表
sudo parted -l | grep "Partition Table"
确保你的系统盘显示为“gpt”。这虽然不绝对(因为BIOS也能用GPT,但很麻烦),但GPT分区表是EFI模式的好搭档。
如果所有验证都通过,那么恭喜你,你已经成功将vSphere中的Ubuntu 24.04虚拟机从BIOS迁移到了EFI启动模式!之前卡住的ESXi直通显卡配置,现在应该可以顺利进行了。整个过程中,最需要胆大心细的就是分区表转换那一步,只要备份做好,按照指引来,问题不大。这次迁移不仅解决了硬件兼容性问题,也让你的虚拟机跟上了现代固件的标准,为后续启用安全启动等高级特性打下了基础。如果在操作中遇到任何和本文描述不一致的地方,多利用 lsblk、fdisk -l 等命令搞清楚自己的磁盘布局,灵活调整。技术活儿,就是在解决一个个这样的实际问题中熟练起来的。

1497

被折叠的 条评论
为什么被折叠?



