Azure Linux 虚拟机无法启动并进入 dracut 紧急 shell
注意
本文中引用的 CentOS 是 Linux 发行版, (EOL) 将达到生命周期结束。 相应地考虑使用和计划。 有关详细信息,请参阅 CentOS 生命周期终止指南。
本文提供了以下问题的解决方案:Azure Linux 虚拟机 (VM) 无法启动,因为无法从 RAMdisk 访问操作系统 (OS) 文件系统。 VM 将降落在 dracut 紧急 shell 中。
先决条件
确保 串行控制台 在 Linux VM 中已启用且正常运行。
如何识别 dracut 启动问题
若要确定 dracut 启动问题,请使用Azure 门户在启动诊断窗格、串行控制台窗格中查看 VM 的串行控制台日志输出,或使用 AZ CLI。
出现启动问题的所有 VM 都将进入 dracut 或 initramfs 紧急 shell,并显示在串行控制台日志的末尾:
RHEL/CentOS/SLES/Oracle Linux:
[ 201.935612] dracut-initqueue[455]: Warning: dracut-initqueue timeout - starting timeout scripts [ 201.941153] dracut-initqueue[455]: Warning: Could not boot. Starting Setup Virtual Console... [[0;32m OK [0m] Started Setup Virtual Console. Starting Dracut Emergency Shell... Warning: /dev/mapper/rootvg-rootlv does not exist Generating "/run/initramfs/rdsosreport.txt" Entering emergency mode. Exit the shell to continue. Type "journalctl" to view system logs. You might want to save "/run/initramfs/rdsosreport.txt" to a USB stick or /boot after mounting them and attach it to a bug report. dracut:/#
Ubuntu:
mdadm: No arrays found in config file or automatically done. Gave up waiting for root file system device. Common problems: - Boot args (cat /proc/cmdline) - Check rootdelay= (did the system wait long enough?) - Missing modules (cat /proc/modules; ls /dev) ALERT! /dev/mapper/osencrypt does not exist. Dropping to a shell! BusyBox v1.27.2 (Ubuntu 1:1.27.2-2ubuntu3.4) built-in shell (ash) Enter 'help' for a list of built-in commands. (initramfs)
联机故障排除
提示
如果有 VM 的最新备份,请 从备份还原 VM 以修复启动问题。
串行控制台是解决问题的最快方法。 它允许你直接修复问题,而无需将系统磁盘呈现给恢复 VM。 请确保满足分发所需的先决条件。 有关详细信息,请参阅 适用于 Linux 的虚拟机串行控制台。
尝试使用 Azure 串行控制台排查问题。
注意
并非所有问题都可以使用 Azure 串行控制台来解决。
- 从串行控制台 触发重启 VM (硬) 。
- 使用 ESC 键在 GRUB 菜单中中断 VM。
- 选择 E 以修改 GRUB 菜单中的第一个内核条目。
- 转到行
linux16
,然后验证并更正 GRUB 错误配置 ,如下所示:- GRUB 配置文件中的根设备路径错误、错误的 UUID 或根卷名称。
- GRUB 配置文件中的交换设备路径错误。
- GRUB 配置文件中的重复参数。
- 任何明显的拼写错误。
手动修改 GRUB 设置后,选择 Ctrl+X 以启动 VM。
在此阶段完成的任何修改都是非永久性修改。 如果 VM 能够启动,请在 GRUB 配置文件中解决此问题,否则将再次出现。
VM 恢复联机后,修复配置文件中的
/etc/default/grub
配置问题并更新 GRUB 配置。 为此,请参阅 重新安装 GRUB 并重新生成 GRUB 配置文件。重新启动 VM,确保它能够在无需任何手动干预的情况下启动。
脱机故障排除
提示
如果有 VM 的最新备份,请 从备份还原 VM 以修复启动问题。
如果 Azure 串行控制台 在特定 VM 中不起作用或订阅中不是选项,请使用救援/修复 VM 来排查此问题。 使用 vm 修复命令 创建一个修复 VM,该 VM 附加了受影响 VM 的 OS 磁盘的副本。 使用 chroot 在修复 VM 中装载 OS 文件系统的副本。
注意
或者,可以使用 Azure 门户手动创建救援 VM。 有关详细信息,请参阅使用 Azure 门户将 OS 磁盘附加到恢复 VM,对 Linux VM 进行故障排除。
转到以下部分以解决特定问题:
解决与 dracut/initramfs 相关的启动问题后,执行以下操作:
- 退出 chroot。
- 从救援/修复 VM 卸载文件系统的副本。
az vm repair restore
运行 命令,将修复的 OS 磁盘与 VM 的原始 OS 磁盘交换。 有关详细信息,请参阅 使用 Azure 虚拟机修复命令修复 Linux VM 中的步骤 5。- 通过查看 Azure 串行控制台或尝试连接到 VM 来验证 VM 是否能够启动。
ADE 加密的 VM 无法启动,因为 VFAT 已禁用
有关详细信息,请参阅 ADE 加密的 VM 无法启动。
缺少 Hyper-V 驱动程序
如果禁用所有新式 Linux 分发版的 Linux 内核中包含的 Hyper-V 驱动程序,请重新启用它们并重新生成 initramfs/initrd 映像。 有关详细信息,请参阅 方案 3:禁用其他 Hyper-V 驱动程序。
如果 VM 是 Red Hat 并从本地迁移的,请在 initramfs 映像中启用所需的 Hyper-V 驱动程序。 有关详细信息,请参阅 使用非 Hyper-V 虚拟机监控程序时,Hyper-V 驱动程序无法包含在初始 RAM 磁盘中。
GRUB 配置错误
参数 rd.break
强制 VM 在 dracut 紧急 shell 中启动。 请确保此参数未在 GRUB 配置文件中硬编码。
GRUB 配置文件中的根设备路径错误
验证 GRUB 配置文件中的根路径 root=/dev/***
是否正确。 请确保使用正确的设备路径。
如果位于修复/救援 VM 的 chroot 中:
- 按照 脱机故障排除中的步骤 1 进行操作。
/etc/default/grub
验证文件、GRUB_CMDLINE_LINUX
条目,并在配置文件中对其进行硬编码时查找root=
参数。- 重新安装 GRUB 并重新生成 GRUB 配置文件。
如果位于 Azure 串行控制台中:
- 按照 联机故障排除中的步骤 3 进行操作。
- 验证行
linux16
,然后查找root=
参数并修复它。 - 选择 Ctrl+X 以启动 VM。
- VM 成功启动后,按照重新安装 GRUB 和重新生成 GRUB 配置文件中的说明修改
/etc/default/grub
文件、修复root
参数 并更新 GRUB 配置文件。
在此验证期间,请确保满足以下条件:
- 在具有 OS 加密的 Ubuntu VM 中,确保设备名称为
/dev/mapper/osencrypt
。 - 在 OS 磁盘中具有逻辑卷管理器 (LVM) 的 VM 中,根卷为
/dev/mapper/rootvg-rootlv
。 在已加密 ADE OS 磁盘的 RHEL VM 中使用相同的路径。 - 确保未使用采用 形式的
/dev/sdX
设备名称,因为它们会在重新启动后更改,并且它们不会在 Linux 中永久存在。 有关详细信息,请参阅 Linux VM 设备名称更改疑难解答。 - 如果使用 UUID,请确保使用正确的根文件系统 UUID,并且语法为
root=UUID=xxx-yyy-zzz
。
GRUB 配置文件中的交换设备路径错误
在此方案中,VM 无法完成启动过程,并进入 dracut 紧急 shell,出现类似于以下内容的错误:
[ 188.000765] dracut-initqueue[324]: Warning: /dev/VG/SwapVol does not exist
Starting Dracut Emergency Shell...
Warning: /dev/VG/SwapVol does not exist
此示例中的 GRUB 配置文件设置为使用 参数 rd.lvm.lv=VG/SwapVol
加载逻辑卷 (LV) 作为交换。 但是,VM 在启动过程中无法找到此 LV。
请务必注意,不建议在 Azure Linux VM 中以这种方式使用交换设备。 有关详细信息,请参阅 为 Azure Linux VM 创建 SWAP 文件。
若要解决此问题,请在 GRUB 配置文件中找到交换路径 rd.lvm.lv=VG/SwapVol
(/etc/default/grub
) 并将其删除。 为此,请使用以下方法之一:
如果位于修复/救援 VM 的 chroot 中:
- 按照 脱机故障排除中的步骤 1 进行操作。
/etc/default/grub
编辑文件,转到GRUB_CMDLINE_LINUX
条目,找到rd.lvm.lv=VG/SwapVol
参数,然后将其从配置中删除。- 重新安装 GRUB 并重新生成 GRUB 配置文件。
如果位于 Azure 串行控制台中:
- 按照 联机故障排除中的步骤 3 进行操作。
- 转到以
linux
开头的行,找到rd.lvm.lv=VG/SwapVol
参数并将其删除。 - 选择 Ctrl+X 以启动 VM。
- VM 成功启动后,请修改
/etc/default/grub
文件、删除rd.lvm.lv=VG/SwapVol
参数,然后更新 GRUB 配置文件,如 重新安装 GRUB 和重新生成 GRUB 配置文件 部分中所述。
GRUB 配置文件中的重复参数
验证 GRUB 配置文件中是否存在重复的参数:
如果位于修复/救援 VM 的 chroot 中:
- 按照 脱机故障排除中的步骤 1 进行操作。
/etc/default/grub
验证文件和GRUB_CMDLINE_LINUX
条目。- 查找重复的参数并将其删除。
- 更新 GRUB 配置文件。 有关详细信息,请参阅 重新安装 GRUB 和重新生成 GRUB 配置文件。
如果位于 Azure 串行控制台中:
根文件系统损坏
根文件系统损坏时,无法从 initrd/initramfs 映像装载它。
若要修复根文件系统损坏问题,请按照 排查文件系统错误导致的 Linux 虚拟机启动问题 - 执行文件系统修复中的说明进行操作。
LVM 激活问题
访问 LVM 物理卷 (PV) 、卷组 (VG) 和/或逻辑卷 (LV) 时,可能会出现一些问题。 无法从 Azure 串行控制台寻址它们。 若要解决这些问题,请使用修复/救援 VM。
按照 脱机故障排除中的步骤 1 进行操作。
若要确定问题,请运行以下命令并查看命令输出。
确定哪个设备对应于 OS 磁盘,并验证它是否被检测为 PV:
lsblk pvs
验证是否
rootvg
检测到 VG:vgs
验证是否检测到 LV:
lvs
排查以下导致访问根卷时出现问题的常见 LVM 错误:
当 rootvg VG 只有一个 PV (这是标准 Azure 配置)
不正确地删除、调整大小或创建了包含 PV 的分区。 若要解决此问题,请参阅 缺少根分区。
修改 rootvg VG 并将其拆分到多个磁盘时未知的 PV
不建议在 rootvg VG 中使用 2 个 PV。 在这种情况下,数据磁盘可能与虚拟机分离,rootvg 逻辑卷不再可访问。 若要解决此问题,请将原始磁盘重新附加到 VM 并重启它。
如果 PV 不可恢复,请 从备份执行还原。
缺少根分区
由于分区重设大小操作期间在分区级别发生某些问题,根文件系统可能不可访问。
在此方案中,如果已记录了原始分区表布局,并且每个原始分区的确切开始和结束扇区 (并且不会对系统进行任何进一步的修改(如创建新文件系统) ),请使用相同的原始布局重新创建分区。 可以使用 MBR 分区表 () 或 gdisk
GPT 分区表 (等fdisk
工具执行此操作,) 获取对无法访问的文件系统的访问权限。 从修复/救援 VM 执行此恢复操作。 有关详细信息,请参阅 脱机故障排除 部分。
如果此方法不起作用,我们建议 从备份执行还原。
Initrd 或 initramfs 损坏
initrd/initramfs 映像存在某种程度的损坏,这会导致装载根卷和启动 OS 启动过程失败。
若要解决此问题,请从修复/救援 VM 的 chroot 内部执行以下步骤:
- 按照 脱机故障排除中的步骤 1 进行操作。
- 手动重新生成缺少的 initramfs。
- 重启 VM 以确认它是否能够启动。
后续步骤
如果特定的启动错误不是 dracut 或 initramfs 问题,请参阅排查 Azure Linux 虚拟机启动错误以获取进一步的故障排除选项。
联系我们寻求帮助
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 还可以向 Azure 反馈社区提交产品反馈。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈