我在 Windows Server 2019 中有一个 Hyper-V 虚拟环境(我知道,我知道)。该环境主要处理 Windows 客户机,但有少量 Linux 机器,包括两台运行 Ubuntu 18.04 LTS 的第二代客户机。
我的问题是这两个客户机经常无法正常重启。当它们启动时,我可以看到 grub 菜单来选择内核,无论我选择什么选项,我都会看到以下内容(带有适当的内核版本):
正在加载 Linux 4.15.0-167-generic...
正在加载初始 ramdisk...
显示此消息后,虚拟机将立即重新启动。我会在循环中看到几次相同的消息,然后它就会放弃并完全关闭。
echo
我可以在启动脚本中找到显示这些消息的命令,并Ramdisk loaded ...
在 initrd 命令后添加了一条附加消息,以了解它已完成,并且我也看到了该消息。
关键在于:如果我继续尝试,机器最终会成功并正常启动。有时可能需要几十到几百次重试,但到目前为止,他们做最终总是会启动。这种情况已经持续了一段时间了,每次我都试图研究发生了什么,但我找不到任何错误,而且在我找到任何有用的信息之前,机器就会启动。
所有这一切中的一个令人困惑的因素是,我通常不会首先考虑重新启动机器,除非我还做了apt ugrade
可能包含更新内核的操作。
这里到底发生了什么?这里可能存在哪些竞争条件,导致启动过程最终仍能完成?
答案1
到目前为止,解决方案是在启动虚拟机之前移除网络适配器。然后,一旦我们过了启动过程中的故障点并且内核开始加载,我们就重新启用它。如果操作正确,适配器的可用速度足够快,以至于在加载所有适配器配置时一切仍然能够正确启动。按照此过程操作后,虚拟机每次都会在第一次就正确启动。
功劳归于马特乌斯引导我到这个链接(这也是为什么这个答案是社区维基百科 - 这不是我自己的作品):
https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/1918265
也许可以通过 Powershell 编写此过程的脚本,尽管可能需要猜测延迟。我还没有做到那一步。