【问题标题】:Boot error after migrating 2nd-Gen Hyper-V hosted Gentoo Linux VM to Azure将第二代 Hyper-V 托管的 Gentoo Linux VM 迁移到 Azure 后出现启动错误
【发布时间】: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 的详细信息如下。

  1. Gentoo VM 的基本信息

  • 它保持最新状态并运行带有 Gentoo 补丁的 5.10.52 内核。
  • VM 在 Hyper-V 上作为“第 2 代”VM 运行,这意味着它基于 UEFI
  • VM 正在使用单个磁盘运行
  1. 准备 Gentoo 虚拟机

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

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

为了为 Azure 准备 VM,VM 被关闭。我们使用 Export 函数将 VM 的副本导出到文件系统。

  1. 准备 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
  1. 创建虚拟机

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

  • 创建 VM 并将托管磁盘附加为 OS 磁盘
  • 根据镜像创建虚拟机

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

  1. 调试

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

从现在开始,我不确定如何解决这个问题。看看原始 VM 之间的区别(有效)和从导出的 VHD 创建的无效虚拟机之间的差异,这特别吸引了我的注意:

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

虽然这是使用导出的 VHD 的非正常 VM 设置中的设置:

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

期待你们的cmets。

【问题讨论】:

  • 我仍然无法解决这个问题。我目前仍在追查问题的根本原因。我仍然相信,这与导出过程中虚拟机启动设置“损坏”有关。我得出的结论是,它与从 VHDX 到 VHD 的转换无关。如果我导出 VM 并使用导出的 VHDX 作为其驱动器启动新的 VM,则在检查 VM 时,我会收到相同的错误和“固件”条目,看起来与我原始帖子中的最后一个屏幕截图相同。

标签: azure virtual-machine hyper-v uefi azure-vm


【解决方案1】:

我从来没有弄清楚究竟发生了什么发生了什么。但是,在 Discourse 上的 Gentoo 人员的帮助下,我们设法得出结论,/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 分区并将这个固定驱动器作为虚拟机的操作系统磁盘重新安装。

成功。它现在启动了!

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

如果有人设法找到有关从本地到 Azure 的过渡为何/如何破坏引导分区的任何文档,请告诉我。不过,以上似乎解决了它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 2022-06-10
    • 2019-03-28
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多