将第二代 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 的详细信息如下。
- 关于 Gentoo VM 的基本信息
- 它是最新的,运行宁 5.10.52 的 Linux 内核带有 Gentoo 补丁。
- VM 运行宁作为 Hyper-V 上的“第 2 代”VM,除其他外,这意味着它是基于 UEFI 的
- VM 运行正在关闭单个磁盘
- 准备 Gentoo VM
为了准备Gentoo镜像,我主要参考了这些文档:
这意味着确保满足所有 Hyper-V 特定的内核要求。据我所知,我们唯一做错的是 运行 waagent。
为了为 Azure 准备 VM,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
- 正在创建 VM
从现在开始,我一直在尝试不同的方法来启动和 运行ning 虚拟机。我的两个主要方法是:
- 创建 VM 并将托管磁盘附加为 OS 磁盘
- 根据镜像创建虚拟机
两者似乎都以无法启动的机器结束,该机器显示上面发布的 UEFI 错误消息。
- 调试
如前所述,为了准确指出我的过程中我失败的位置,我尝试采用我在步骤 (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/BOOT
和 cp /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 的过渡会破坏启动分区的任何文档,请告诉我。尽管如此,上面的内容似乎可以解决它。
我的核心任务是将 Hyper-V 上的 Gentoo Linux 运行 迁移到 Azure。
理想情况下,运行ning 的应用程序将迁移到不同的托管模型或 Linux Azure 更好支持的发行版。但由于各种限制,我们希望有这个中间步骤,这将使我们能够将它按原样移动到 Azure。
准备好 VHD 并将映像移动到 Azure 并为其配置 VM 后,它无法启动。通过启动诊断,我看到的是:
为了了解我失败的地方,我尝试使用为 Azure 准备的 VHD 作为磁盘来启动一个新的本地 VM(在 (3) 中介绍)。执行此操作时,出现与上述错误相同的错误。
我不确定如何从这里取得进展,希望得到任何反馈 - 有关我如何在 Azure 上准备 Gentoo VM、VHD 和 VM 的详细信息如下。
- 关于 Gentoo VM 的基本信息
- 它是最新的,运行宁 5.10.52 的 Linux 内核带有 Gentoo 补丁。
- VM 运行宁作为 Hyper-V 上的“第 2 代”VM,除其他外,这意味着它是基于 UEFI 的
- VM 运行正在关闭单个磁盘
- 准备 Gentoo VM
为了准备Gentoo镜像,我主要参考了这些文档:
这意味着确保满足所有 Hyper-V 特定的内核要求。据我所知,我们唯一做错的是 运行 waagent。
为了为 Azure 准备 VM,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
- 正在创建 VM
从现在开始,我一直在尝试不同的方法来启动和 运行ning 虚拟机。我的两个主要方法是:
- 创建 VM 并将托管磁盘附加为 OS 磁盘
- 根据镜像创建虚拟机
两者似乎都以无法启动的机器结束,该机器显示上面发布的 UEFI 错误消息。
- 调试
如前所述,为了准确指出我的过程中我失败的位置,我尝试采用我在步骤 (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/BOOT
和 cp /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 的过渡会破坏启动分区的任何文档,请告诉我。尽管如此,上面的内容似乎可以解决它。