gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:57:47 25 4
gpt4 key购买 nike

我的核心任务是将运行在 Hyper-V 上的小型但重要的 Gentoo Linux 迁移到 Azure。

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

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

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

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

  1. 有关 Gentoo VM 的基本信息
<小时/>
  • 它保持最新状态并运行带有 Gentoo 补丁的 Linux 内核 5.10.52。
  • 虚拟机作为“第 2 代”虚拟机在 Hyper-V 上运行,这意味着它基于 UEFI
  • 虚拟机在单个磁​​盘上运行
  • 准备 Gentoo 虚拟机
  • <小时/>

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

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

    为了为 Azure 准备 VM,将关闭 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
  • 创建虚拟机
  • <小时/>

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

    • 创建虚拟机并将托管磁盘附加为操作系统磁盘
    • 根据镜像创建虚拟机

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

  • 调试
  • <小时/>

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

    从现在起,我不确定如何解决这个问题。查看可以正常工作的原始虚拟机与从导出的 VHD 创建的无法正常工作的虚拟机之间的差异,这一点特别引起我的注意:

    以下是针对正常运行的 Gentoo VM列出的设置: enter image description here

    虽然这是使用导出的 VHD 无法正常运行的 VM 设置的设置: enter image description here

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

    期待您的评论。

    最佳答案

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

    (我怀疑每次都会发生这种情况,无论我使用什么传输方法。)

    我从 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 的转换为何/如何破坏启动分区的文档,请告诉我。尽管如此,上述似乎解决了这个问题。

    关于azure - 将第二代 Hyper-V 托管的 Gentoo Linux VM 迁移到 Azure 后出现启动错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68752002/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com