Azure 计算图库简化了在整个组织中的自定义映像共享。 自定义映像类似于市场映像,不同的是自定义映像的创建者是自己。 可以从 VM、VHD、快照、托管映像或其他映像版本创建映像。
使用 Azure Compute Gallery 可以在 Microsoft Entra 租户内在同一区域或跨区域与组织中的其他用户共享自定义 VM 映像。 选择要共享哪些映像,要在哪些区域中共享,以及希望与谁共享它们。 可以创建多个相册,以便可以按逻辑方式对图片进行分组。 许多新功能(如 ARM64、加速网络、TrustedVM)仅通过 Azure Compute Gallery 获得支持,不适用于“托管映像”。
Azure Compute Gallery 功能具有多种资源类型:
| 资源 |
说明 |
|
映像源 |
这是可用于在库中创建映像版本的资源。 映像源可以是现有的 Azure VM(通用或专用)、托管映像、快照或其他库中的映像版本。 |
|
画廊 |
就像 Azure 市场一样,图库是用于管理和共享映像与 VM 应用程序的存储库,但您可以控制谁有权访问。 |
|
映像定义 |
映像定义在画廊中创建,包含有关映像的信息以及其内部使用要求。 这包括了该映像是 Windows 还是 Linux 映像、发行说明以及最低和最高内存要求。 它是某种映像类型的定义。 |
|
映像版本 |
在使用库时,你会使用映像版本来创建虚拟机。 可根据环境的需要创建多个映像版本。 与托管映像一样,在使用映像版本创建 VM 时,将使用映像版本来创建 VM 的新磁盘。 可以多次使用映像版本。 |
先决条件
若要完成本文,您必须已经拥有一个 Azure Compute Gallery,以及 Azure 中可用的映像源。 映像源可以是:
- 订阅中的 VM。 可以从专用化和通用化 VM 中捕获映像。
- 托管映像,
- 托管 OS 和数据磁盘。
- 在存储帐户中以 VHD 形式存在的 OS 和数据磁盘。
- 同一订阅中相同图库或其他图库中的其他镜像版本。
如果映像包含数据磁盘,则数据磁盘大小不能超过 1 TB。
映像定义名称可能包含大写或小写字母、数字、点、短划线和句点。 若要详细了解可以为映像定义指定的值,请参阅映像定义。
允许用于映像版本的字符为数字和句点。 数字必须在 32 位整数范围内。 格式:MajorVersion.MinorVersion.Patch。
通过本文进行操作时,请根据需要替换资源名称。
有关通用映像,请参阅 OS 特定指南,然后再捕获映像:
创建映像
选择下面的选项来创建映像定义和映像版本:
若要在门户中从 VM 创建映像,请参阅捕获 VM 的映像。
若要使用 VM 以外的源创建映像,请执行以下步骤。
转到 Azure 门户,然后搜索并选择“Azure Compute Gallery”。
从列表中选择要使用的画廊。
在图库页面的顶部选择“添加”,然后从下拉列表中选择“VM 映像定义”。
在“向 Azure Compute Gallery 添加新的映像定义”页上的“基本信息”选项卡中,选择“区域”。
对于“映像定义名称”,键入一个类似 myImageDefinition 的名称。
对于“操作系统”,根据你的源选择正确的选项。
对于“VM 代系”,根据你的源选择相应的选项。 大多数情况下都会选择“第 1 代”。 有关详细信息,请参阅对第 2 代 VM 的支持。
对于“操作系统状态”,根据你的源选择相应的选项。 有关详细信息,请参阅通用化和专用化。
对于“发布者”,键入一个类似 myPublisher 的唯一名称。
对于Offer,请输入一个唯一的名称,例如myOffer。
对于“SKU”,键入一个类似 mySKU 的唯一名称。
在页面底部,选择“查看 + 创建”。
映像定义通过验证后,请选择“创建”。
部署完成后,选择“转到资源”。
在映像定义页面的“开始使用”选项卡上,选择“创建版本”。
在“区域”中,选择你需要创建映像的区域。 在某些情况下,源必须位于创建映像的同一区域中。 如果后续下拉列表中看不到你的来源,请尝试更改图像的区域。 稍后您可以将映像复制到其他地区。
对于“版本号”,键入一个类似 1.0.0 的数字。 映像版本名称应遵循“主要版本.次要版本.修补版本”格式(使用整数)。
在“源”中,从下拉列表中选择要用于源的文件类型。 有关每种源类型的具体详细信息,请参阅下表。
| 源 |
其他字段 |
| 磁盘或快照 |
- 对于“OS 磁盘”,在下拉列表中选择对应的磁盘或快照。 - 若要添加数据磁盘,请键入 LUN 编号,然后从下拉列表中选择数据磁盘。 |
| 映像版本 |
- 从下拉列表中选择“源图库”。 - 从下拉列表中选择正确的映像定义。 - 从下拉列表中选择要使用的现有映像版本。 |
| 托管映像 |
\- 从下拉列表中选择“源映像”。 托管映像必须位于与你在“实例详细信息”中选择的相同区域内。 |
| 存储帐户中的 VHD |
选择浏览以选择 VHD 的存储帐户。 |
在“从最新版本中排除”中,保留默认值“否”,除非你在使用 (而不是版本号)创建 VM 时不希望使用此版本。latest
对于“生命周期结束日期”,从日历中选择你认为此版本应停止使用的日期。
在“复制””选项卡中,从下拉列表中选择存储类型。
设置“默认复制计数”,你可以为你添加的每个区域覆盖此计数。
您需要将副本复制到源区域,因此列表中的第一个副本将位于您创建映像的区域。 若要添加更多副本,可以从下拉列表中选择区域,并根据需要调整副本计数。
完成操作后,选择“查看 + 创建”。 Azure 将验证配置。
映像版本通过验证后,请选择“创建”。
部署完成后,选择“转到资源”。
可能需要花费一段时间才能将映像复制到所有目标区域。
您还可以通过门户将现有 VM 捕获为镜像。 有关详细信息,请参阅在门户中创建 VM 映像。
若要使用Azure CLI创建映像,首先需要创建映像定义。 映像定义为映像创建一个逻辑分组。 它们用于管理有关镜像版本的信息,这些版本是在它们内部创建的。
使用 az sig image-definition create 在图像库中创建一个映像定义。 请确保映像定义的类型正确。 如果已通用化 VM(使用适用于 Linux 的 waagent -deprovision,或适用于 Windows 的 Sysprep),则应使用 --os-state generalized 创建通用化映像定义。 若要在不删除现有用户帐户的情况下使用 VM,请使用 --os-state specialized 创建专用化映像定义。
有关可为映像定义指定的参数的详细信息,请参阅映像定义。
在此示例中,映像定义名为 myImageDefinition,适用于专用化 Linux OS 映像。 若要使用 Windows OS 创建映像的定义,请使用 --os-type Windows。
az sig image-definition create \
--resource-group myGalleryRG \
--gallery-name myGallery \
--gallery-image-definition myImageDefinition \
--publisher myPublisher \
--offer myOffer \
--sku mySKU \
--os-type Linux \
--os-state specialized
注意
对于映像定义,如果其中的映像派生自第三方市场映像,则计划信息必须精确匹配第三方映像的计划信息。 创建映像定义时,通过添加 --plan-name、--plan-product 和 --plan-publisher 在映像定义中包含计划信息。
创建映像版本
使用 az sig image version create 创建映像版本。
用于创建映像的语法会发生变化,具体取决于你使用的源。 只要你只有一个 OS 源,就可以混用源类型。 也可以对每个数据磁盘使用不同的源。
| 源 |
参数集 |
|
OS 磁盘: |
|
| 通过 VM ID 识别的虚拟机 |
--managed-image <Resource ID of the VM> |
| 托管的镜像或其他镜像版本 |
--managed-image <Resource ID of the managed image or image version |
| 快照或托管磁盘 |
--os-snapshot <Resource ID of the snapshot or managed disk> |
| 存储帐户中的虚拟硬盘 (VHD) |
--os-vhd-uri <URI> --os-vhd-storage-account <storage account name>。 |
|
数据磁盘: |
|
| 快照或托管磁盘 |
--data-snapshots <Resource ID of the snapshot or managed disk> --data-snapshot-luns <LUN number> |
| 存储帐户中的 VHD |
--data-vhds-sa <storageaccountname> --data-vhds-uris <URI> --data-vhds-luns <LUN number> |
有关如何为映像指定不同源的详细示例,请参阅 az sig image-version create 示例。
在下面的示例中,我们将从 VM 创建一个映像。 映像的版本为 1.0.0。我们打算使用区域冗余存储在“中国北部”区域创建 2 个副本,在“中国东部”区域创建 1 个副本,在“中国东部 2”区域创建 1 个副本。 复制区域必须包含源 VM 所在的区域。
在创建映像之前,建议停止或解除分配虚拟机。
请将此示例中的 --virtual-machine 值替换为 VM 的 ID。
az sig image-version create \
--resource-group myGalleryRG \
--gallery-name myGallery \
--gallery-image-definition myImageDefinition \
--gallery-image-version 1.0.0 \
--target-regions "chinaeast" "chinaeast=1" "chinaeast2=1=premium_lrs" \
--replica-count 2 \
--virtual-machine "/subscriptions/<Subscription ID>/resourceGroups/MyResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM"
注意
需等待映像版本彻底生成并复制完毕,然后才能使用同一托管映像来创建另一映像版本。
创建映像版本时,可以通过添加--storage-account-type premium_lrs将映像存储在高级存储中,或者通过添加将映像存储在区域冗余存储中--storage-account-type standard_zrs。
若要使用 PowerShell 创建映像,首先需要创建映像定义。 映像定义为映像创建一个逻辑分组。 创建映像定义时,请确保它包含所有正确信息。 如果已通用化源 VM,则应使用 -OsState generalized 创建映像定义。 如果未通用化源,请使用 -OsState specialized 创建映像定义。
若要详细了解可以为映像定义指定的值,请参阅映像定义。
使用 New-AzGalleryImageDefinition 创建映像定义。
在此示例中,映像定义名为 myImageDefinition,适用于运行 Windows 的专用化 VM。 若要为使用 Linux 的映像创建定义,请使用 -OsType Linux。
$imageDefinition = New-AzGalleryImageDefinition `
-GalleryName $gallery.Name `
-ResourceGroupName $gallery.ResourceGroupName `
-Location $gallery.Location `
-Name 'myImageDefinition' `
-OsState specialized `
-OsType Windows `
-Publisher 'myPublisher' `
-Offer 'myOffer' `
-Sku 'mySKU'
注意
对于将包含从第三方映像派生的映像的映像定义,计划信息必须与第三方映像的计划信息完全匹配。 创建映像定义时,通过添加 -PurchasePlanName、-PurchasePlanProduct 和 -PurchasePlanPublisher 在映像定义中包含计划信息。
创建映像版本
使用 New-AzGalleryImageVersion 创建映像版本。
用于创建映像的语法会发生变化,具体取决于你使用的源。
| 源 |
参数集 |
|
OS 磁盘 |
|
| 通过 VM ID 识别的虚拟机 |
-SourceImageId <Resource ID of the VM> |
| 托管的镜像或其他镜像版本 |
-SourceImageId <Resource ID of the managed image or image version |
| 快照或托管磁盘 |
-OSDiskImage <Resource ID of the snapshot or managed disk> |
|
数据磁盘 |
|
| 快照或托管磁盘 |
-DataDiskImage @{Source = @{Id=<source_id>}; Lun=<LUN>; SizeInGB = <Size in GB>; HostCaching = <Caching> } |
在下面的示例中,我们将从 VM 创建一个映像版本。 在使用 Stop-AzVM 创建映像之前,建议先停止/解除分配 VM。
在此示例中,映像版本为 1.0.0,该版本将复制到“中国北部 2”和“中国东部 2”数据中心。 选择复制的目标区域时,请记住,你还需包括源区域作为复制的目标。
$region1 = @{Name='China North 2';ReplicaCount=1}
$region2 = @{Name='China East 2';ReplicaCount=2}
$targetRegions = @($region1,$region2)
$job = $imageVersion = New-AzGalleryImageVersion `
-GalleryImageDefinitionName $imageDefinition.Name`
-GalleryImageVersionName '1.0.0' `
-GalleryName $gallery.Name `
-ResourceGroupName $gallery.ResourceGroupName `
-Location $gallery.Location `
-TargetRegion $targetRegions `
-SourceImageId $sourceVm.Id.ToString() `
-PublishingProfileEndOfLifeDate '2020-12-01' `
-asJob
可能需要一段时间才能将该映像复制到所有目标区域,因此我们创建了作业,以便可以跟踪进度。 要查看作业的进度,请键入 $job.State。
$job.State
注意
需等待映像版本彻底生成并复制完毕,然后才能使用同一托管映像来创建另一映像版本。
创建映像版本时,还可以通过添加 -StorageAccountType Premium_LRS 将映像存储在高级存储中,或者通过添加 -StorageAccountType Standard_ZRS 将其存储在区域冗余存储中。
使用 REST API 创建映像定义
PUT https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/galleries/{galleryName}/images/{galleryDefinitionName}?api-version=2019-12-01
{
"location": "chinaeast2",
"properties": {
"hyperVGeneration": "V1",
"identifier": {
"offer": "myOffer",
"publisher": "myPublisher",
"sku": "mySKU"
},
"osState": "Specialized",
"osType": "Linux",
},
}
使用 REST API 创建映像版本。 在此示例中,我们将从 VM 创建一个映像版本。 若要使用其他源,请传入源的资源 ID(例如,传入 OS 磁盘快照的 ID)。
# @name imageVersion
PUT https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/galleries/{galleryName}/images/{galleryDefinitionName}/versions/{galleryImageVersionName}?api-version=2019-12-01
{
"location": "{region}",
"properties": {
"publishingProfile": {
"endOfLifeDate": "2024-12-02T00:00:00+00:00",
"replicaCount": 1,
"storageAccountType": "Standard_LRS",
"targetRegions": [
{
"name": "chinaeast",
"regionalReplicaCount": 2,
"storageAccountType": "Standard_LRS",
},
{
"name": "chinanorth2",
}
]
},
"storageProfile": {
"source": {
"id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachines/{vmName}"
}
}
}
}
使用一个租户中的源映像版本,在另一个租户中创建新的映像版本。
在源映像版本的订阅中,向用户授予读取者权限。 用户拥有源映像版本的读取权限后,登录到这两个帐户(源和目标)。
需要 tenantID 源映像版本、 subscriptionID 存储新映像版本的订阅(目标)和 resourceID 源映像版本的订阅。 在使用 az sig image-version create 或 New-AzGalleryImageVersion 创建映像版本之前,目标库的映像定义必须已存在。 此外,请确保源映像版本的区域或副本和目标区域相同。
使用Azure CLI使用另一租户中的源映像版本在一个租户中创建映像版本。
# Set some variables
tenantID="<tenant ID for the source image version>"
subID="<subscription ID where the image version will be created>"
sourceImageVersionID="<resource ID of the source image version>"
# Sign in to the subscription where the new image version will be created
az cloud set -n AzureChinaCloud
az login
# Sign in to the tenant where the source image version is available
az cloud set -n AzureChinaCloud
az login --tenant $tenantID
# Sign back in to the subscription where the image version will be created and ensure subscription context is set
az login
az account set --subscription $subID
# Create the image version from the source image version
az sig image-version create \
--gallery-image-definition myImageDef \
--gallery-image-version 1.0.0 \
--gallery-name myGallery \
--resource-group myResourceGroup \
--image-version $sourceImageVersionID \
--location myLocation
在一个租户中使用 PowerShell 创建一个映像版本,该版本源自另一个租户中的映像版本。
# Set variables
$targetSubID = "<subscription ID for the target>"
$sourceTenantID = "<tenant ID for the source image version>"
$sourceImageVersionID = "<resource ID of the source image version>"
# Sign in to the tenant where the source image version is published
Connect-AzAccount -Tenant $sourceTenantID -UseDeviceAuthentication
# Sign in to the subscription where the new image version will be created and set the context
Connect-AzAccount -UseDeviceAuthentication -Subscription $targetSubID
Set-AzContext -Subscription $targetSubID
# Create the image version from the source image version in a different tenant
New-AzGalleryImageVersion -ResourceGroupName myResourceGroup -GalleryName myGallery -GalleryImageDefinitionName myImageDef -Location "China North 2" -Name 1.0.0 -SourceImageId $sourceImageVersionID
后续步骤
有关如何提供购买计划信息的信息,请参阅在创建映像时提供 Azure 市场购买计划信息。