可以将虚拟硬盘(VHD)从在Azure中创建的虚拟机(VM)上传到Azure Stack Hub实例。
在 Azure 中准备并下载你的 VHD
在准备 VHD 时,找到符合你需求的部分。
- 按照本文中的步骤使用 PowerShell 从专用磁盘创建Windows VM 来准备 VHD。
- 若要部署 VM 扩展,请确保 VM 代理 .msi 可用。
有关信息和步骤,请参阅Azure虚拟机代理概述。 在移动 VM 之前,请确保在 VM 上安装扩展。 如果 VHD 中不存在 VM 代理,扩展部署将失败。 预配或设置$vm.OSProfile.AllowExtensionOperations = $true时不需要设置 OS 配置文件。
验证 VHD
在上传 VHD 之前,必须验证 VHD 是否符合要求。 不符合要求的 VHD 无法在Azure Stack Hub中加载。
你将使用 Hyper-V 附带的 PowerShell 模块。 启用 Hyper-V 会安装相关的 PowerShell 模块。 你可以通过以管理员身份打开 PowerShell 并运行以下 cmdlet,来确认你已安装该模块:
Get-Command -Module hyper-v如果您没有 Hyper-V 命令,请参阅“使用 Hyper-V 和 Windows PowerShell”。
获取你的电脑上 VHD 的路径。 运行以下 cmdlet:
get-vhd <path-to-your-VHD>该 cmdlet 将返回 VHD 对象并显示属性,例如:
ComputerName : YOURMACHINENAME Path : <path-to-your-VHD> VhdFormat : VHD VhdType : Fixed FileSize : 68719477248 Size : 68719476736 MinimumSize : 32212254720 LogicalSectorSize : 512 PhysicalSectorSize : 512 BlockSize : 0 ParentPath : DiskIdentifier : 3C084D21-652A-4C0E-B2D1-63A8E8E64C0C FragmentationPercentage : 0 Alignment : 1 Attached : False DiskNumber : IsPMEMCompatible : False AddressAbstractionType : None Number :使用 VHD 对象时,检查是否符合Azure Stack Hub的要求。
此外,Azure Stack Hub 仅支持来自第 1 代虚拟机的映像。
如果 VHD 与Azure Stack Hub不兼容,则需要返回到源映像并Hyper-V,创建满足要求的 VHD,然后上传。 若要最大程度地减少上传过程中可能的损坏,请使用AzCopy。
如何修复 VHD
必须满足以下要求才能将 VHD 与Azure Stack Hub兼容。
VHD 是固定类型的
标识:使用 get-vhd cmdlet 获取 VHD 对象。
修复:可以将 VHDX 文件转换为 VHD,将动态扩展的磁盘转换为固定大小的磁盘,但无法更改 VM 的生成。
使用 Hyper-V Manager 或 PowerShell 转换磁盘。
VHD 的虚拟大小至少为 20 MB
标识:使用 get-vhd cmdlet 获取 VHD 对象。
修复:使用 Hyper-V 管理器或 PowerShell 调整磁盘的大小。
VHD 已对齐
标识:使用 get-vhd cmdlet 获取 VHD 对象。
修复:虚拟大小必须为 1 MB 的整数倍。
磁盘的虚拟大小必须符合 1 MiB。 如果 VHD 的大小不是 1 MiB 的整数倍,则需要将磁盘大小调整为 1 MiB 的整数倍。 从已上传的 VHD 创建映像时,大小不是 MiB 整数倍的磁盘会导致错误。 若要验证大小,可以使用 PowerShell 的 Get-VHD cmdlet 命令来查看“Size”,该值在 Azure 中必须是 1 MiB 的整数倍;还可以查看“FileSize”,其值等于“Size”加上 VHD 页脚的 512 字节。
使用 Hyper-V Manager 或 PowerShell 调整磁盘的大小。
VHD Blob 长度
标识:使用 get-vhd cmdlet 显示 Size
修复:VHD blob 长度 = 虚拟大小 + vhd 页脚长度(512)。 在 Blob 末尾有一小段脚注,描述了 VHD 的属性。
Size 在 Azure 中必须是 1 MiB 的倍数,并且 FileSize 必须等于 Size + 512 字节,其中 512 字节用于 VHD 页脚。
使用 Hyper-V Manager 或 PowerShell 调整磁盘的大小。
第一代 VM
标识:若要确认虚拟机是否为第 1 代,请使用 cmdlet Get-VM | Format-Table Name, Generation。
修复:需要在虚拟机监控程序(Hyper-V)中重新创建 VM。
上传到存储帐户
可以使用门户上传 VHD。 或者,你也可以将 AzCopy 与你在门户中创建的容器配合使用。
用于生成 SAS URL 和上传 VHD 的门户
登录到 Azure Stack Hub 用户门户。
选择 “存储帐户 ”,然后选择现有存储帐户或创建新的存储帐户。
在你的存储帐户中,选择 Blobs 部分。 选择 “容器 ”以创建新容器。
输入容器名称,然后选择 Blob(仅对 Blob 进行匿名读取访问)。
如果要使用AzCopy上传映像而不是门户,请创建 SAS 令牌。 在存储帐户中,选择“共享访问签名”,然后选择“生成 SAS 和连接字符串”。 复制并记下 Blob 服务的 SAS URL。 使用AzCopy上传 VHD 时,请使用此 URL。
选择容器,然后选择“ 上传”。 上传 VHD。
AzCopy VHD
若要减少在上传过程中损坏 VHD 并加快上传过程的可能性,请使用Azure 存储资源管理器或AzCopy。 以下步骤在Windows 10计算机上使用AzCopy。 AzCopy 是一个命令行实用工具,可用于向/从存储帐户复制 Blob 或文件。
如果未安装AzCopy,请安装它。 若要下载AzCopy并开始使用,请参阅AzCopy入门。 记下存储二进制文件的位置。 可以将AzCopy添加到路径,以便从 PowerShell 命令行使用它。
打开 PowerShell 以使用 shell 中的AzCopy。
使用AzCopy将 VHD 上传到存储帐户中的容器。
$env:AZCOPY_DEFAULT_SERVICE_API_VERSION = "2017-11-09" azcopy cp "/path/to/file.vhd" "https://<account>.blob.core.chinacloudapi.cn/<container>/<path-to-blob>?<SAS> --blob-type=PageBlob
Note
使用类似于将单个文件上传到虚拟目录的语法上传 VHD。 添加 --blob-type=PageBlob 以确保 VHD 作为 页 Blob 上传,而不是默认情况下 阻止 。
有关使用AzCopy和其他存储工具的详细信息,请参阅Azure Stack Hub存储中使用数据传输工具。
创建 VM
自定义映像分为两种形式: 专用 化和 通用化。
登录到 Azure Stack Hub 用户门户。
如果你是创建平台磁盘的云操作员,请按照 “添加平台映像” 中的说明通过管理员门户或使用管理员终结点添加 VHD。
在用户门户中,选择“ 所有服务>磁盘>添加”。
在 “创建托管磁盘”中:
输入您的镜像名称。
选择订阅。
创建或添加映像到 资源组。
选择 ASDK 的位置(也称为区域)。
选择“帐户类型”。
- 高级磁盘(SSD) 由固态硬盘提供支持,并提供一致的低延迟性能。 它们提供价格和性能之间的最佳平衡,非常适合 I/O 密集型应用程序和生产工作负荷。
- 标准磁盘(HDD) 由磁驱动器提供支持,最好用于不经常访问数据的应用程序。 区域冗余磁盘以区域冗余存储(ZRS)为后盾,ZRS 会在多个可用区之间复制你的数据,因此即使单个可用区发生故障,这些磁盘仍然可用。
选择 存储 Blob 作为 源类型。 从存储帐户中的 Blob 创建磁盘。
对于 VHD 源:
- 选择存储帐户所在的源订阅。
- 选择 “浏览 ”,然后转到存储帐户、容器和 VHD。 选择 选择。
- 选择与 VHD 匹配的 OS 类型 。
选择 Size (GiB) 等于或大于你的 VHD 大小的磁盘。
选择“创建”。
创建磁盘后,使用它创建新的 VM。