如何将“BIOS 启动”移动到虚拟机中的另一个磁盘

如何将“BIOS 启动”移动到虚拟机中的另一个磁盘

(如何)是否可以将 Linux 系统移动到虚拟机中的另一个磁盘?对于客户端,我必须支持设置得有些笨拙的 VMware ESXi 虚拟机:整个虚拟磁盘仅包含一个分区(加上“BIOS 启动”)用于系统和数据。

现在,我想创建一个新的小型虚拟磁盘,并将 BIOS 启动和小型系统分区移到该新磁盘,这样旧的大磁盘就只用于数据(主磁盘)。我怎样才能让系统从该新磁盘/分区启动?

也许创建一个新的大磁盘、将所有数据移至该磁盘,然后缩小旧大磁盘会更简单,但我们没有足够的磁盘空间来复制数据。此外,这是一个生命系统,我们需要尽量减少停机时间。

那可能吗?

当前磁盘布局如下

Disk /dev/sda: 1,6 TiB, 1717986918400 bytes, 3355443200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 8DA273A9-ACAB-46F4-8DEE-0C90499286F9

Device     Start        End    Sectors  Size Type
/dev/sda1   2048       4095       2048    1M BIOS boot
/dev/sda2   4096 3355441151 3355437056  1,6T Linux filesystem

所需的新布局应如下

Disk /dev/sda: 1,6 TiB, 1717986918400 bytes, 3355443200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 8DA273A9-ACAB-46F4-8DEE-0C90499286F9

Device     Start        End    Sectors  Size Type
/dev/sda1   2048 3355441151 3355439104  2048 Linux filesystem


Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 2E74BFF1-AEBC-6F47-B887-BE1FCEE5EA60

Device     Start      End  Sectors Size Type
/dev/sdb1   2048     4095     2048   1M BIOS boot
/dev/sdb2   4096 41943006 41938911  20G Linux filesystem

我必须做什么才能从 sdb 启动系统?也许有更优雅的解决方案来解决这个问题?也许一个选择是将 BIOS 启动分区留在大磁盘上,只将系统移动到较小的分区,但在我看来这看起来很丑陋。

答案1

“BIOS 启动”分区本质上只是在 GPT 分区磁盘上嵌入旧式 BIOS 样式 GRUB 核心映像的地方。对于 MBR 磁盘,MBR 之后但在第一个分区开始之前的区域将用于此目的 - 但在 GPT 分区磁盘上,此区域保存 GPT 分区表的结构,因此无法使用。

GRUB 的初始部分嵌入在 MBR 中,在安装 GRUB 时,GRUB 核心映像的第一个块的 LBA 块号会被硬编码到其中;MBR 代码将加载该块,其中包含要加载的后续块的列表。在此阶段,GRUB 不会理解任何类型的分区:此时它只处理 LBA 块号,因此核心映像是在 BIOS 启动分区中,还是在传统 MBR 和第一个分区开头之间的未分配空间中,对 GRUB 来说都无关紧要。

如果较小的磁盘是 GPT 分区,则必须在其上创建另一个 BIOS 启动分区,以确保有一个明确定义的空间可以写入 GRUB 核心映像。下一步通常是修改/boot/grub/device.map文件以将 GRUB 磁盘标识符分配hda给新的较小磁盘,因为 BIOS 样式的启动磁盘选择通常是通过操纵 BIOS 磁盘标识顺序来进行的,以便第一个 BIOS HDD 设备号 (0x80) 映射到系统正在从中启动的磁盘。

在启动时,BIOS 样式的 GRUB 将 BIOS HDD 设备编号映射到名称,因此 0x80 => hda、0x81 =>hdb等等。因此,您的device.map文件必须预测您的 BIOS 磁盘编号顺序当您从新磁盘启动时。

完成后,您可以在新磁盘的 MBR + BIOS 启动分区中安装 GRUB。根据 Linux 发行版的不同,核心映像将包括一些基本 GRUB 模块的选择,以及一个路径前缀(例如hd0,msdos1/boot/grub),用于标识文件系统/分区和路径名,以便从中加载 GRUB 主配置文件(如果需要,还包括其他 GRUB 模块)。该grub-install命令应该会自动为您处理所有这些。

最后,您需要更新/etc/default/grub以匹配您的新布局,并重新创建 GRUB 配置文件以更新其中的 GRUB 磁盘名称引用。Debian 和相关发行版有update-grub此功能;其他发行版将有grub-mkconfig或一些特定于发行版的工具。

相关内容