Azure跨区域复制含数据磁盘的镜像及附加数据磁盘至托管镜像方案咨询
跨区域复制含数据磁盘的托管镜像/附加数据磁盘到现有镜像解决方案
一、跨区域复制包含数据磁盘的托管镜像
方法1:用az image copy直接复制(最简便)
这个命令原生支持复制包含数据磁盘的托管镜像,无需单独处理数据磁盘:
az image copy \ --source-resource-group <源资源组名称> \ --source-image <源镜像名称> \ --target-location <目标区域(如eastus)> \ --target-resource-group <目标资源组名称> \ --target-image <目标镜像名称> \ --cleanup
--cleanup参数会自动清理复制过程中生成的临时快照,建议添加;如果源镜像是共享镜像库中的镜像,改用--source-image-id指定镜像的完整ID。
方法2:手动复制磁盘+重建镜像(适合复杂场景)
如果az image copy无法满足需求,可拆分步骤手动操作:
- 为源镜像的所有磁盘(OS盘+数据磁盘)创建快照
# 获取源镜像的所有磁盘ID(OS盘+数据盘) disk_ids=$(az image show -g <源资源组> -n <源镜像名> --query 'storageProfile.dataDisks[].managedDisk.id' -o tsv) disk_ids+=" "$(az image show -g <源资源组> -n <源镜像名> --query 'storageProfile.osDisk.managedDisk.id' -o tsv) # 逐个创建快照 for disk_id in $disk_ids; do disk_name=$(echo $disk_id | awk -F '/' '{print $9}') az snapshot create \ -g <临时资源组名> \ -n "${disk_name}-snapshot" \ --source "$disk_id" done
- 跨区域复制快照到目标区域
# 获取所有快照ID snapshot_ids=$(az snapshot list -g <临时资源组名> --query '[].id' -o tsv) # 复制快照到目标区域 for snap_id in $snapshot_ids; do snap_name=$(echo $snap_id | awk -F '/' '{print $9}') az snapshot copy \ --source "$snap_id" \ --destination-resource-group <目标资源组名> \ --destination-location <目标区域> \ --destination-name "${snap_name}-copied" done
- 在目标区域用复制后的快照创建新镜像
# 筛选OS快照和数据快照ID os_snap_id=$(az snapshot list -g <目标资源组名> --query "[?contains(name,'osdisk')].id" -o tsv) data_snap_ids=$(az snapshot list -g <目标资源组名> --query "[?contains(name,'datadisk')].id" -o tsv) # 构建数据磁盘参数 data_disk_params="" for data_snap in $data_snap_ids; do data_disk_params+="--data-disk $data_snap " done # 创建包含数据磁盘的新镜像 az image create \ -g <目标资源组名> \ -n <新镜像名称> \ --os-type <Linux/Windows> \ --source "$os_snap_id" \ $data_disk_params
二、将数据磁盘附加到现有托管镜像
托管镜像本身是只读的,无法直接修改,需通过临时VM中转实现:
- 用现有镜像创建临时VM,同时挂载目标数据磁盘(用快照或现有数据磁盘均可)
az vm create \ -g <资源组名称> \ -n <临时VM名称> \ --image <现有镜像名称> \ --data-disk-snapshot <数据磁盘快照ID> \ --os-type <Linux/Windows>
- 停止并解除分配VM,然后为VM的OS盘和数据盘创建快照
# 停止临时VM az vm deallocate -g <资源组名称> -n <临时VM名称> # 生成OS磁盘快照 az snapshot create \ -g <资源组名称> \ -n <OS快照名称> \ --source $(az vm show -g <资源组名称> -n <临时VM名称> --query 'storageProfile.osDisk.managedDisk.id' -o tsv) # 生成数据磁盘快照 az snapshot create \ -g <资源组名称> \ -n <数据磁盘快照名称> \ --source $(az vm show -g <资源组名称> -n <临时VM名称> --query 'storageProfile.dataDisks[0].managedDisk.id' -o tsv)
- 用新的OS快照和数据快照创建包含数据磁盘的新镜像
az image create \ -g <资源组名称> \ -n <新镜像名称> \ --os-type <Linux/Windows> \ --source <OS快照ID> \ --data-disk <数据磁盘快照ID>
- 清理临时资源(可选)
az vm delete -g <资源组名称> -n <临时VM名称> --yes az snapshot delete -g <资源组名称> -n <OS快照名称> --yes az snapshot delete -g <资源组名称> -n <数据磁盘快照名称> --yes
内容的提问来源于stack exchange,提问作者ASW
相关产品推荐
相关产品推荐

