我目前正在 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 重新定位到磁盘末尾(使用
gdisk
或sgdisk
) - 跑步
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 重新定位到磁盘末尾(使用
gdisk
或sgdisk
) - 将最后一个分区扩展到磁盘末尾
- 跑步
fsck
- 停止(dellocate)VM
- 分离最近填充的磁盘
- 将启动盘与最近创建的启动盘交换
- 使用最近创建的磁盘启动虚拟机,以确保其能够启动
- 做任何事情来准备图像
- 如果一切顺利的话,将虚拟机捕获到托管映像中
最后,永远不要在未先缩小最后一个分区的情况下截断映像!否则,映像将丢失(或至少难以恢复;最好重新开始)。