【发布时间】:2021-10-15 12:06:58
【问题描述】:
我的核心任务是将在 Hyper-V 上运行的小型但重要的 Gentoo Linux 迁移到 Azure。
理想情况下,它正在运行的应用程序将迁移到其他托管模型或在 Azure 上得到更好支持的 Linux 发行版。但由于各种限制,我们希望有这个中间步骤,让我们能够将它按原样移动到 Azure。
在准备好 VHD 并将映像移动到 Azure 并为其预配 VM 后,它不会启动。通过引导诊断,我看到的是:
为了了解我失败的地方,我尝试使用为 Azure 准备的 VHD 作为磁盘启动一个新的本地 VM(在 (3) 中介绍)。执行此操作时,我得到与上面描述的相同的错误。
我不确定如何从这里取得进展,如果有任何反馈,我将不胜感激 - 有关我如何准备 Gentoo VM、VHD 和 Azure 上的 VM 的详细信息如下。
- Gentoo VM 的基本信息
- 它保持最新状态并运行带有 Gentoo 补丁的 5.10.52 内核。
- VM 在 Hyper-V 上作为“第 2 代”VM 运行,这意味着它基于 UEFI
- VM 正在使用单个磁盘运行
- 准备 Gentoo 虚拟机
为了准备 Gentoo 镜像,我主要参考了这些文档:
这意味着确保满足所有特定于 Hyper-V 的内核要求。据我所知,我们唯一做得不对的是运行 waagent。
为了为 Azure 准备 VM,VM 被关闭。我们使用 Export 函数将 VM 的副本导出到文件系统。
- 准备 VHD(X)
从那里,我们根据要求将 VHDX 转换为 固定大小 VHD。这是通过 Hyper-V CmdLets 在 PowerShell 中完成的:
Convert-VHD -Path .\Gentoo.vhdx -DestinationPath .\Gentoo-Fixed.vhd -VHDType:Fixed
在这之后,我基本上在 PowerShell 中通过这个脚本来运行:
- 创建新的(Hyper-V Generation V2)托管磁盘
- 为其创建共享访问签名
- 通过 AzCopy 上传我的 VHD
- 撤销 SAS
- 从磁盘创建(Hyper-V Generation V2)映像
$azRegion = 'northeurope' # Geoprahical Location
$diskName = 'gentoo-sda' # Name of the Disk
$imageName = 'GentooAzure'
$rgName = 'gentoo-host' # Name of the Resource Group
$vhdSize = (Get-Item .\Fixed-Gentoo.vhd).length
$diskConfig = New-AzDiskConfig -SkuName:Premium_LRS -OsType:Linux -HyperVGeneration:V2 -UploadSizeInBytes:$vhdSize -Location:$azRegion -CreateOption:'Upload'
New-AzDisk -ResourceGroupName:$rgName -DiskName:$diskName -Disk:$diskConfig
$disk = Get-AzDisk -DiskName:$diskName
#At this point $disk.DiskState should return "ReadyToUpload"
# Create a writeable shared-access-signature
$diskSAS = Grant-AzDiskAccess -ResourceGroupName:$rgName -DiskName:$diskName -DurationInSecond:86400 -Access:'Write'
$disk = Get-AzDisk -ResourceGroupName:$rgName -DiskName:$diskName
#At this point $disk.DiskState should return "ActiveUpload"
#Use AzCopy to upload the VHD
.\azcopy.exe copy ".\Fixed-Gentoo.vhd" $diskSAS.AccessSAS --blob-type PageBlob
#After the upload has been completed, revoke the SAS:
Revoke-AzDiskAccess -ResourceGroupName:$rgName -DiskName:$diskName
#Create Image from the managed disk
$imageConfig = New-AzImageConfig -Location:$location -HyperVGeneration:V2
$imageConfig = Set-AzImageOsDisk -Image:$imageConfig -OsState:Generalized -OsType:Linux -ManagedDiskId:$disk.Id
$image = New-AzImage -ImageName:$imageName -ResourceGroupName:$rgName -Image:$imageConfig
- 创建虚拟机
从现在开始,我一直在尝试不同的方法来启动和运行 VM。我的两个主要方法是:
- 创建 VM 并将托管磁盘附加为 OS 磁盘
- 根据镜像创建虚拟机
两者似乎都以显示上面发布的 UEFI 错误消息的非启动机器结束。
- 调试
如前所述,为了准确定位我在流程中失败的位置,我尝试采用步骤 (2) 中最终得到的固定 VHD,并将其安装到我们的新虚拟机上—— prem Hyper-V。这会导致我在 Azure 上看到的相同错误。
从现在开始,我不确定如何解决这个问题。看看原始 VM 之间的区别(有效)和从导出的 VHD 创建的无效虚拟机之间的差异,这特别吸引了我的注意:
在将 VHDX 转换为固定 VHD 时,一些重要的启动设置似乎消失了。但在这一点上,我不确定如何解决这个问题。
期待你们的cmets。
【问题讨论】:
-
我仍然无法解决这个问题。我目前仍在追查问题的根本原因。我仍然相信,这与导出过程中虚拟机启动设置“损坏”有关。我得出的结论是,它与从 VHDX 到 VHD 的转换无关。如果我导出 VM 并使用导出的 VHDX 作为其驱动器启动新的 VM,则在检查 VM 时,我会收到相同的错误和“固件”条目,看起来与我原始帖子中的最后一个屏幕截图相同。
标签: azure virtual-machine hyper-v uefi azure-vm