虚拟机的磁盘映像通常包含一个分区表,其中包含一个或多个文件系统。调整大小有点麻烦,因为您需要仔细重写分区表,然后才能调整大小。在 Linux VM 中,更改的分区表无法即时读取,因此您需要再次重新启动 VM。
我希望磁盘映像直接包含文件系统,而不包含任何分区。这样就可以在虚拟机内部和外部轻松调整大小。但是,在这样的安装中,Grub 引导加载程序不再可靠,因为它需要通过硬编码块位置指向其 stage2,这使得当文件系统移动内容时,虚拟机每隔几个月就无法启动。(使用 DOS 分区表,它使用 MBR 和第一个分区之间的不可分配空间来放置其 stage2。使用其他分区表,您可以为此创建一个单独的引导加载程序分区。)
有没有办法解决?
我应该如何组织虚拟机磁盘映像以便尽可能简单地调整其大小?
第一个想法是:
每个虚拟机使用两个磁盘映像,一个固定大小的磁盘仅用于引导加载程序(MBR + stage2),另一个磁盘直接包含文件系统。
使用不同的引导程序。但是 LILO 和 Syslinux 没有同样的问题吗?磁盘的前 512 个字节太小,无法容纳文件系统驱动程序。
还有其他更简单的方法可以实现这一点吗?
答案1
首先,要意识到硬件和软件之间存在隔离。它们无法动态地相互匹配,因为它们是完全不同的东西。
我希望磁盘映像直接包含文件系统,而不包含任何分区。
分区表是操作系统了解其在数据存储方面正式使用哪些硬件的方式。典型的操作系统不会动态计算磁盘的大小。它要求,如果您将底层磁盘大小更改为“较小”,则必须更改分区表以匹配;即使您使用驱动器的范围进行分区。
此外,虚拟机管理程序本质上不知道操作系统的详细信息及其分区,因为分区本质上是软件,而虚拟机管理程序仅仅模拟硬件。
这意味着你需要一个集成的软件/硬件解决方案,让每个部分都了解并控制其他部分。我还没听说过这样的事情。
这将允许从虚拟机内部和外部轻松调整大小。
从硬件的角度考虑虚拟机,本质上,您要做的就是动态更改真实硬盘的大小,并让操作系统动态调整。这不是设置的方式。更改虚拟磁盘大小与更改真实硬件磁盘大小与操作系统没有什么不同。仅仅因为它是虚拟的并不意味着它们以任何方式“集成”。
我应该如何组织虚拟机磁盘映像以便尽可能简单地调整其大小?
您可以将操作系统与所有其他文件隔离开来;也就是说,为您的操作系统准备一个单独的 VD(虚拟磁盘),并留有足够的空间进行更改和更新。然后将“其他内容”安装到另一个 VD 上。这样您就可以修改非根驱动器的分区,这比修改根驱动器的分区本质上更容易。我的大多数虚拟机至少有 2 个虚拟磁盘用于此目的。
LVM 也是另一个应该可以帮助解决这个问题的东西,但我不熟悉那里的所有选项。