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 的虚拟机串行控制台

  1. 确定 VM 是否降落在 dracut 紧急 shell 中

  2. 尝试使用 Azure 串行控制台排查问题。

    注意

    并非所有问题都可以使用 Azure 串行控制台来解决。

    1. 从串行控制台 触发重启 VM (硬)
    2. 使用 ESC 键在 GRUB 菜单中中断 VM。
    3. 选择 E 以修改 GRUB 菜单中的第一个内核条目。
    4. 转到行 linux16 ,然后验证并更正 GRUB 错误配置 ,如下所示:
  3. 手动修改 GRUB 设置后,选择 Ctrl+X 以启动 VM。

    在此阶段完成的任何修改都是非永久性修改。 如果 VM 能够启动,请在 GRUB 配置文件中解决此问题,否则将再次出现。

  4. VM 恢复联机后,修复配置文件中的 /etc/default/grub 配置问题并更新 GRUB 配置。 为此,请参阅 重新安装 GRUB 并重新生成 GRUB 配置文件

  5. 重新启动 VM,确保它能够在无需任何手动干预的情况下启动。

脱机故障排除

提示

如果有 VM 的最新备份,请 从备份还原 VM 以修复启动问题。

  1. 如果 Azure 串行控制台 在特定 VM 中不起作用或订阅中不是选项,请使用救援/修复 VM 来排查此问题。 使用 vm 修复命令 创建一个修复 VM,该 VM 附加了受影响 VM 的 OS 磁盘的副本。 使用 chroot 在修复 VM 中装载 OS 文件系统的副本。

    注意

    或者,可以使用 Azure 门户手动创建救援 VM。 有关详细信息,请参阅使用 Azure 门户将 OS 磁盘附加到恢复 VM,对 Linux VM 进行故障排除

  2. 转到以下部分以解决特定问题:

  3. 解决与 dracut/initramfs 相关的启动问题后,执行以下操作:

    1. 退出 chroot。
    2. 从救援/修复 VM 卸载文件系统的副本。
    3. az vm repair restore运行 命令,将修复的 OS 磁盘与 VM 的原始 OS 磁盘交换。 有关详细信息,请参阅 使用 Azure 虚拟机修复命令修复 Linux VM 中的步骤 5。
    4. 通过查看 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. 按照 脱机故障排除中的步骤 1 进行操作。
    2. /etc/default/grub验证文件、GRUB_CMDLINE_LINUX条目,并在配置文件中对其进行硬编码时查找 root= 参数。
    3. 重新安装 GRUB 并重新生成 GRUB 配置文件
  • 如果位于 Azure 串行控制台中:

    1. 按照 联机故障排除中的步骤 3 进行操作。
    2. 验证行 linux16 ,然后查找 root= 参数并修复它。
    3. 选择 Ctrl+X 以启动 VM。
    4. 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. 按照 脱机故障排除中的步骤 1 进行操作。
    2. /etc/default/grub编辑文件,转到 GRUB_CMDLINE_LINUX 条目,找到 rd.lvm.lv=VG/SwapVol 参数,然后将其从配置中删除。
    3. 重新安装 GRUB 并重新生成 GRUB 配置文件
  • 如果位于 Azure 串行控制台中:

    1. 按照 联机故障排除中的步骤 3 进行操作。
    2. 转到以 linux开头的行,找到 rd.lvm.lv=VG/SwapVol 参数并将其删除。
    3. 选择 Ctrl+X 以启动 VM。
    4. VM 成功启动后,请修改 /etc/default/grub 文件、删除 rd.lvm.lv=VG/SwapVol 参数,然后更新 GRUB 配置文件,如 重新安装 GRUB 和重新生成 GRUB 配置文件 部分中所述。

GRUB 配置文件中的重复参数

验证 GRUB 配置文件中是否存在重复的参数:

  • 如果位于修复/救援 VM 的 chroot 中:

    1. 按照 脱机故障排除中的步骤 1 进行操作。
    2. /etc/default/grub验证文件和GRUB_CMDLINE_LINUX条目。
    3. 查找重复的参数并将其删除。
    4. 更新 GRUB 配置文件。 有关详细信息,请参阅 重新安装 GRUB 和重新生成 GRUB 配置文件
  • 如果位于 Azure 串行控制台中:

    1. 按照 联机故障排除中的步骤 3 进行操作。
    2. 验证行 linux16 ,查找重复的参数并将其删除。
    3. 选择 Ctrl+X 以启动 VM。
    4. VM 成功启动后,请相应地修改 /etc/default/grub 文件,修复之前确定的配置问题,并按照重新安装 GRUB 和重新生成 GRUB 配置文件中的说明更新 GRUB 配置文件

根文件系统损坏

根文件系统损坏时,无法从 initrd/initramfs 映像装载它。

若要修复根文件系统损坏问题,请按照 排查文件系统错误导致的 Linux 虚拟机启动问题 - 执行文件系统修复中的说明进行操作。

LVM 激活问题

访问 LVM 物理卷 (PV) 、卷组 (VG) 和/或逻辑卷 (LV) 时,可能会出现一些问题。 无法从 Azure 串行控制台寻址它们。 若要解决这些问题,请使用修复/救援 VM。

  1. 按照 脱机故障排除中的步骤 1 进行操作。

  2. 若要确定问题,请运行以下命令并查看命令输出。

    1. 确定哪个设备对应于 OS 磁盘,并验证它是否被检测为 PV:

      lsblk
      pvs
      
    2. 验证是否 rootvg 检测到 VG:

      vgs
      
    3. 验证是否检测到 LV:

      lvs
      
  3. 排查以下导致访问根卷时出现问题的常见 LVM 错误:

    • 当 rootvg VG 只有一个 PV (这是标准 Azure 配置)

      不正确地删除、调整大小或创建了包含 PV 的分区。 若要解决此问题,请参阅 缺少根分区

    • 修改 rootvg VG 并将其拆分到多个磁盘时未知的 PV

      不建议在 rootvg VG 中使用 2 个 PV。 在这种情况下,数据磁盘可能与虚拟机分离,rootvg 逻辑卷不再可访问。 若要解决此问题,请将原始磁盘重新附加到 VM 并重启它。

  4. 如果 PV 不可恢复,请 从备份执行还原

缺少根分区

由于分区重设大小操作期间在分区级别发生某些问题,根文件系统可能不可访问。

在此方案中,如果已记录了原始分区表布局,并且每个原始分区的确切开始和结束扇区 (并且不会对系统进行任何进一步的修改(如创建新文件系统) ),请使用相同的原始布局重新创建分区。 可以使用 MBR 分区表 () 或 gdisk GPT 分区表 (等fdisk工具执行此操作,) 获取对无法访问的文件系统的访问权限。 从修复/救援 VM 执行此恢复操作。 有关详细信息,请参阅 脱机故障排除 部分。

如果此方法不起作用,我们建议 从备份执行还原

Initrd 或 initramfs 损坏

initrd/initramfs 映像存在某种程度的损坏,这会导致装载根卷和启动 OS 启动过程失败。

若要解决此问题,请从修复/救援 VM 的 chroot 内部执行以下步骤:

  1. 按照 脱机故障排除中的步骤 1 进行操作。
  2. 手动重新生成缺少的 initramfs
  3. 重启 VM 以确认它是否能够启动。

后续步骤

如果特定的启动错误不是 dracut 或 initramfs 问题,请参阅排查 Azure Linux 虚拟机启动错误以获取进一步的故障排除选项。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 还可以向 Azure 反馈社区提交产品反馈。