Azure Linux 虚拟机无法启动并输入 dracut 紧急 shell

适用于:✔️ Linux VM

注意

本文中引用的 CentOS 是 Linux 分发版,将达到生命周期结束(EOL)。 请相应地考虑使用和规划。 有关详细信息,请参阅 CentOS 生命周期指南

本文提供了无法启动 Azure Linux 虚拟机(VM)的问题的解决方案,因为无法从 RAMdisk 访问操作系统(OS)文件系统。 VM 降落在紧急外壳中。

先决条件

确保在 Linux VM 中启用串行控制台 并正常运行。

如何识别 dracut 启动问题

若要识别 dracut 启动问题,请使用Azure 门户在启动诊断窗格、串行控制台窗格或使用 AZ CLI 中查看 VM 的串行控制台日志输出。

启动问题的所有 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 紧急外壳中着陆。

  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 OS 磁盘副本的修复 VM。 使用 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 是否能够启动。

由于 VFAT 已禁用,ADE 加密的 VM 无法启动

有关详细信息,请参阅 ADE 加密的 VM 无法启动

缺少 Hyper-V 驱动程序

如果禁用所有新式 Linux 分发版 Linux 内核中包含的 Hyper-V 驱动程序,请重新启用它们并重新生成 initramfs/initrd 映像。 有关详细信息,请参阅 方案 3:其他 Hyper-V 驱动程序已禁用

如果 VM 是 Red Hat,并且是从本地迁移的,请启用 initramfs 映像中所需的 Hyper-V 驱动程序。 有关详细信息,请参阅 在使用非 Hyper-V 虚拟机监控程序时,无法在初始 RAM 磁盘中包含 Hyper-V 驱动程序。

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 成功启动后,请修改/etc/default/grub文件、修复root参数并更新 GRUB 配置文件,如重新安装 GRUB 和重新生成 GRUB 配置文件中所述

在此验证过程中,请确保满足以下条件:

  • 在具有 OS 加密的 Ubuntu VM 中,确保设备名称为 /dev/mapper/osencrypt
  • 在 OS 磁盘中具有逻辑卷管理器(LVM)的 VM 中,根卷为 /dev/mapper/rootvg-rootlv。 RHEL VM 中使用相同的路径加密 ADE OS 磁盘。
  • 请确保不使用任何设备 /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 配置文件设置为将逻辑卷 (LV) 作为与参数 rd.lvm.lv=VG/SwapVol的交换加载。 但是,VM 无法在启动过程中找到此 LV。

请务必注意,不建议在 Azure Linux VM 中以这种方式使用交换设备。 有关详细信息,请参阅 为 Azure Linux VM 创建交换文件。

若要解决此问题,请在 GRUB 配置文件 (/etc/default/grub) 中找到交换路径rd.lvm.lv=VG/SwapVol并将其删除。 为此,请使用下列方法之一:

  • 如果位于修复/救援 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 时未知的 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 反馈社区