如何缩小来自 cloud-images.ubuntu.com 的 Azure 云映像的大小?

如何缩小来自 cloud-images.ubuntu.com 的 Azure 云映像的大小?

我目前正在 Azure 中设置一个动态高性能计算集群,并且我正在考虑以 Ubuntu 为基础。

Microsoft 文档建议以经过测试的 Azure Ubuntu Cloud-Images 为基础创建 Ubuntu 映像(例如,https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64-azure.vhd.zip

问题是,即使实际只使用了一小部分空间,这些图像的大小也已经达到 30GB。为了加快 Azure 中集群节点的部署时间,我希望使用较小的图像(例如 10GB)。

缩小上述图像尺寸的最有效方法是什么? 有什么有效的方法吗?还是我必须从头开始创建一个较小的图像?

如果有人能帮助我解决这个问题,我会非常高兴。

答案1

您无法直接在 Azure 中收缩托管磁盘。但是,您可以使用另一台 VM(或计算机上的 VM)来处理映像:下载、收缩、作为块 blob 上传到存储帐户,然后创建映像。

使用 Hyper-V:

  • 创建/使用 Linux 虚拟机(最好有 GUI)
  • 附上您将使用的图片
  • 将最后一个分区缩小到小于所需大小(例如 9 GB)(之前进行 fsck)
  • 关闭虚拟机并分离磁盘
  • 缩小磁盘(使用 qemu-img 或 Hyper-V 磁盘实用程序),确保
    • 生成的图像比最后一个分区的末尾大得多)
    • 它被分配给一兆字节(*)
  • 再次附加磁盘映像
  • 启动虚拟机
  • 将备份 GPT 重新定位到磁盘末尾(使用gdisksgdisk
  • 跑步fsck
  • 关闭虚拟机
  • 分离磁盘,然后将其与用于处理新磁盘的磁盘映像交换
  • 确保磁盘映像在 Hyper-V 上启动
  • 该图像已准备好上传到你的存储帐户并用于创建托管图像
  • 最后,确保映像磁盘在 Azure 中启动

(*)请注意,为了从块 blob 导入托管磁盘(如果您想从本地计算机处理图像,然后上传到您的存储帐户),图像应该分配到 MB,并且映像必须是 VHD 固定的。否则,导入将失败。某些工具(如 qemu-img(甚至是 Hyper-V 磁盘实用程序))在结果映像的末尾添加了 512 字节的额外填充。

另一种(快速而简单的)方法是使用 Azure:

  • 创建虚拟机(最好是 Ubuntu 18.04)
    • 附加所需大小的空托管磁盘
  • 下载并图片
  • 安装qemu-utils
  • 将图像转换为 RAW
    • qemu-img convert -f vpc -O raw bionic.vhd bionic.img
  • 将下载的图像导入为循环设备
    • sudo losetup -f bionic.img
  • 使用 parted 将最后一个分区缩小到 9 GiB (fsck之前)
  • 将图像分离到循环设备
    • sudo losetup -d /dev/loop0
  • dd使用(快速而粗糙的方法) 将图像复制到附加的托管磁盘
    • dd if /dev/loop0 of=/dev/sdb bs=4096
  • 将备份 GPT 重新定位到磁盘末尾(使用gdisksgdisk
  • 将最后一个分区扩展到磁盘末尾
  • 跑步fsck
  • 停止(dellocate)VM
  • 分离最近填充的磁盘
  • 将启动盘与最近创建的启动盘交换
  • 使用最近创建的磁盘启动虚拟机,以确保其能够启动
  • 做任何事情来准备图像
  • 如果一切顺利的话,将虚拟机捕获到托管映像中

最后,永远不要在未先缩小最后一个分区的情况下截断映像!否则,映像将丢失(或至少难以恢复;最好重新开始)。

相关内容