我使用 vmbuilder 工具在我的 ubuntu 主机系统上创建 KVM 虚拟机。对于每个虚拟机,我都设置了一个 vmbuilder.partitions 文本文件,其中定义了虚拟机的分区大小。
简单来说:
root 100000
swap 4000
现在我将为虚拟机创建一个新的逻辑卷,其大小与所有定义的分区完全相同。(在示例中,我将运行lvcreate -L 104G ...
)
结果是 LV 的大小正好是 104 GiB。但我的 100 G(i?)B 根分区只占了其中的 93.13 GiB。交换区大约占了 3.72 GiB。LV 中大约有 7 GiB 未分配空间。
这很奇怪,因为即使你按 1024 字节/兆字节计算 vmbuilder.partitions 的数字,根分区仍应为 97.65 GiB,而不是约 93。交换应约为 3.9 GiB,而不是 3.72。(不幸的是,这些数字会扩大,1TB 定义将只有约 930 GiB,而不是 976。)
可以通过手动从 LV 中删除经验估计的字节数来解决这个问题。但我希望从一开始就拥有合理的值。而且每个虚拟机中都有 10% 的空间未分配显然是不可接受的。
有人知道这背后的逻辑吗?非常感谢。
答案1
好吧,在我找到真正的答案之前,我将坚持使用 gparted 的 LiveCD 进行以下解决方法。事实证明,分区确实很容易修复,而无需触及 LV 本身。如果您使用 LVM/libvirt/KVM/QEMU 组合,则可以使用以下内容。
- 将 gparted LiveCD-iso 放在可读的位置(不是 /root)
virsh edit <vmname>
改成<boot dev="hd" />
<boot dev="cdrom" />
- 在其他磁盘块旁边添加:
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='/some/vm-readable/path/gparted-live-0.14.0-1.iso'/>
<target dev='hdc' bus='ide'/>
<readonly/>
<address type='drive' controller='0' bus='1' unit='0'/>
</disk>
- 重新定义并重新启动虚拟机,通过 VNC 连接(例如使用 virt-viewer)
使用 gparted GUI,您可以拖放分区来填充 LV 的每个字节。
不要忘记将虚拟机的启动设备改回“hd”。重新定义并重新启动,然后对分区大小感到满意,因为它们本来就应该是这样的。