如何缩小原始虚拟机磁盘映像(kvm)的大小?

如何缩小原始虚拟机磁盘映像(kvm)的大小?

假设我有linux-vm-image.raw10GB 大小的卷。其中有一个主分区(使用“经典”的 MS-DOS 类分区表,而不是 GPT)etx4分区(不使用 LVM),扩展到整个卷。并且该分区上分配的实际数据例如为 3GB。

此映像准备用于某些虚拟化环境(我的情况是 kvm+OpenStack),并且根据用户的选择,从此映像创建的任何 VM 都会调整自身大小以适应目标虚拟磁盘大小。因此,没有理由在该磁盘映像内保留任何可用磁盘空间。

我怎样才能将这个原始磁盘映像的大小缩小到最小(从 10GB 到 ~3GB)?

一些 指示对于qcow2磁盘映像,但我只能使用raw图像 - 而不是qcow、不是OVF并且不是其他。

我的猜测是

  • 将此映像作为块设备挂载到某处
  • 进行一些维护,将 ext4 分区内的所有文件移至其“开头”,换句话说 - 进行自由空间碎片整理
  • 卸载映像
  • 将文件系统的大小缩小到图像中(以匹配其中的数据大小)
  • 缩小图像尺寸(以匹配其中文件系统的大小)
  • 将分区表更新到映像中以匹配新的分区大小

但我不是要发明一辆自行车吗?是否有一些一行命令或特殊软件可以完成我想要做的事情?

答案1

原始图像不太适合调整大小。不过,您可以尝试zerofree在(未挂载的)文件系统上进行操作,然后压缩生成的图像文件。

另外,检查您的目标环境是否支持 OVF 容器格式,该格式允许压缩磁盘映像。(zerofree 仍然适用)。

答案2

你走对了路。如果你能将其作为块设备安装(循环安装),那么你很可能可以让 gparted 在其上工作。

gparted 将完成您想要的大部分操作:
1. 将 FS 数据移动到其分区的前面(缩小 FS)
2. 缩小分区并调整分区表
3. 当您让它打印更新的分区表(例如,最后一个分区的最后一个扇区等)时,它甚至可以为您提供剩余的“磁盘”大小。

这是最难的部分。之后,卸载它。您可能必须手动计算“磁盘”的确切大小,但之后,只需对文件进行简单的截断即可。

更新:如果您的分区表是 MBR 类型,那就没问题了。使用 GPT 时,它在磁盘末尾有一个镜像副本。因此,请小心,因为 gparted 可能不够智能(除非您可以直接给它原始映像)。如果您遇到问题,请考虑在截断后使用 gdisk。使用一些额外的块进行截断,然后让 gdisk/equiv 重建镜像副本(可能需要第二次循环挂载)。

相关内容