将第二代 Hyper-V 托管的 Gentoo Linux VM 迁移到 Azure 后出现启动错误

Boot error after migrating 2nd-Gen Hyper-V hosted Gentoo Linux VM to Azure

我的核心任务是将 Hyper-V 上的 Gentoo Linux 运行 迁移到 Azure。

理想情况下,运行ning 的应用程序将迁移到不同的托管模型或 Linux Azure 更好支持的发行版。但由于各种限制,我们希望有这个中间步骤,这将使我们能够将它按原样移动到 Azure。

准备好 VHD 并将映像移动到 Azure 并为其配置 VM 后,它无法启动。通过启动诊断,我看到的是:

为了了解我失败的地方,我尝试使用为 Azure 准备的 VHD 作为磁盘来启动一个新的本地 VM(在 (3) 中介绍)。执行此操作时,出现与上述错误相同的错误。

我不确定如何从这里取得进展,希望得到任何反馈 - 有关我如何在 Azure 上准备 Gentoo VM、VHD 和 VM 的详细信息如下。

  1. 关于 Gentoo VM 的基本信息

  1. 准备 Gentoo VM

为了准备Gentoo镜像,我主要参考了这些文档:

这意味着确保满足所有 Hyper-V 特定的内核要求。据我所知,我们唯一做错的是 运行 waagent。

为了为 Azure 准备 VM,VM 已关闭。我们使用导出功能将 VM 的副本导出到文件系统。

  1. 正在准备 VHD(X)

从那里,我们根据要求将 VHDX 转换为 固定大小 VHD。这是通过 Hyper-V CmdLets 在 PowerShell 中完成的:

Convert-VHD -Path .\Gentoo.vhdx -DestinationPath .\Gentoo-Fixed.vhd -VHDType:Fixed

在此之后,我基本上 运行 通过 PowerShell 中的这个脚本来:

$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
  1. 正在创建 VM

从现在开始,我一直在尝试不同的方法来启动和 运行ning 虚拟机。我的两个主要方法是:

两者似乎都以无法启动的机器结束,该机器显示上面发布的 UEFI 错误消息。

  1. 调试

如前所述,为了准确指出我的过程中我失败的位置,我尝试采用我在步骤 (2) 中最终得到的固定 VHD,并将其安装到我们的新 VM 上本地 Hyper-V。这会导致我在 Azure 上看到的相同错误。

从现在开始,我不确定如何解决这个问题。查看可以运行的原始 VM 与从导出的 VHD 创建的无法运行的 VM 之间的差异,这特别引起我的注意:

这些是为正常运行的 Gentoo VM 列出的设置:

虽然这是使用导出的 VHD 的非功能性 VM 设置的设置:

在将 VHDX 转换为固定 VHD 时,一些关键的启动设置似乎消失了。但在这一点上,我不确定如何解决这个问题。

期待您的评论。

我一直没搞清楚到底发生了什么。然而,在 Gentoo 人员在 Discourse 上的帮助下,我们设法得出结论,/boot 分区在从本地 VM 到 Azure 的过渡过程中被破坏了。

(我怀疑每次都是这样,不管我用的是什么传输方式。)

我从 Azure 上的非功能性 VM 拍摄了磁盘快照并将其安装到新创建的 VM。从那里,我安装了 /boot 分区并得出结论,/boot/EFI 文件夹仅包含一个名为 gentoo 的文件夹,其中包含一个 grubx64.efi 文件。

从那里,我做了 mkdir /boot/EFI/BOOTcp /boot/EFI/gentoo/grubx64.efi /boot/EFI/BOOT/BOOTX64.EFI

在此之后,我卸载了 /boot 分区并将这个固定驱动器重新安装为 VM 的 OS 磁盘。

成功。它现在启动了!

登录后,我重新做了 Gentoo 手册中的 grub-install --target=x86_64-efi --efi-directory=/boot

如果有人设法找到关于 why/how 从内部部署到 Azure 的过渡会破坏启动分区的任何文档,请告诉我。尽管如此,上面的内容似乎可以解决它。