跳至内容

为什么在尝试启动 EC2 Linux 实例时,它会进入紧急模式?

2 分钟阅读
0

在启动 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例时,该实例会进入紧急模式且启动进程失败。然后,该实例变得不可访问。

简短描述

由于以下原因,实例可能会以紧急模式启动:

  • 实例上有损坏的内核,导致 Kernel panic(内核崩溃)错误。
  • 由于 /etc/fstab 文件中的错误条目导致 Dependency failed(依赖项失败)错误,出现自动挂载失败。

要确定错误的类型,请检查实例的控制台输出

解决方法

Kernel panic 错误

如果内核出现问题,则会收到类似于以下示例的错误消息:

“内核崩溃 - 未同步: VFS: 无法在未知块 (8,1) 上挂载根 fs”

如果 grub 配置或 initramfs 文件损坏,则会出现 Kernel panic(内核崩溃)错误。要解决此问题,请完成以下步骤:

  1. 将内核恢复为以前的稳定内核
  2. 重启实例
  3. 更正损坏内核的错误消息中列出的问题。

Dependency failed(依赖项失败)错误

/etc/fstab 文件中的语法错误导致自动挂载失败时,将会出现 Dependency failed(依赖项失败)错误。当文件中列出的 Amazon Elastic Block Store (Amazon EBS) 卷与实例分离时,也会发生错误。您会收到类似于以下示例的错误消息:

“[[1;33mDEPEND[0m] /mnt 的依赖项失败。

[[1;33mDEPEND[0m] 本地文件系统的依赖项失败。

[[1;33mDEPEND[0m]

将本地... 结构迁移到新结构的依赖项失败。

[[1;33mDEPEND[0m] 必要时重新标记所有文件系统的依赖项失败。

[[1;33mDEPEND[0m] 标记需要重启后重新标记的依赖项失败。

[[1;33mDEPEND[0m]

/dev/xvdf 上的文件系统检查依赖项失败。”

在前面的示例中,/mnt 挂载点在启动过程中挂载失败。要确保启动顺序不会因为挂载失败而进入紧急模式,请将以下配置添加到 /etc/fstab 文件中:

  • 辅助分区的 nofail 选项,例如 /mnt
    **注意:**nofail 选项可确保启动顺序不会中断,即使卷或分区挂载失败也是如此。
  • 0 表示关闭文件系统检查,将其作为挂载点的最后一列。

要更新 /etc/fstab 文件,请使用 EC2 Serial Console,运行 AWSSupport-ExecuteEC2Rescue 自动化,或使用救援实例手动编辑该文件。

**重要事项:**在停止和启动实例之前,请执行以下操作:

**注意:**当停止或启动某个实例时,该实例的公共 IP 地址将发生变化。最佳实践是使用弹性 IP 地址而不是公共 IP 地址将外部流量路由到您的实例。有关详细信息,请参阅停止和启动 Amazon EC2 实例

使用 EC2 Serial Console
**重要事项:**使用 EC2 Serial Console 时,无需停止和启动实例。

如果您启用了适用于 Linux 的 EC2 Serial Console,则可以使用它来对支持的基于 Nitro 的实例类型支持的裸机实例进行故障排除。使用 EC2 Serial Console 时,无需有效的连接即可连接到您的实例。连接到 EC2 Serial Console,然后修改 /etc/fstab 文件。

如果您之前没有使用过 EC2 Serial Console,请确保遵循先决条件。如果您的实例无法访问并且您尚未配置对串行控制台的访问权限,则无法使用 EC2 Serial Console 更正 /etc/fstab 文件。

运行 AWSSupport-ExecuteEC2Rescue 自动化文档

**先决条件:**确保您拥有使用 AWSSupport-ExecuteEC2Rescue 所需的 AWS Identity and Access Management (IAM) 权限

运行 AWSSupport-ExecuteEC2Rescue 自动化文档,以便自动更正启动问题。有关详细信息,请参阅在无法访问的实例上运行 EC2Rescue 工具

使用救援实例手动编辑文件

完成以下步骤:

  1. 打开 Amazon EC2 控制台

  2. 选择 Instances(实例),然后选择处于紧急模式的实例。

  3. 停止实例

  4. 从已停止的实例分离 /dev/xvda or /dev/sda1 Amazon EBS 根卷

  5. 在与已停止实例相同的可用区中启动救援实例

  6. 将根卷作为辅助设备连接到救援实例。
    **注意:**在附加辅助卷时,您可以使用不同的设备名称。

  7. 使用 SSH 连接到您的救援实例

  8. 要为您连接到救援实例的新卷创建挂载点目录,请运行以下命令:

    sudo mkdir /mnt/rescue

    **注意:**将 /mnt/rescue 替换为您的挂载点目录。

  9. 要识别块设备名称和分区,请运行以下命令:

    [root ~]$ lsblk

    输出示例:

    NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    xvda    202:0    0    8G  0 disk
    └─xvda1 202:1    0    8G  0 part /
    xvdf    202:80   0  101G  0 disk
    └─xvdf1 202:81   0  101G  0 part
  10. 要将卷挂载到挂载点目录上,请运行以下命令:

sudo mount -o nouuid /dev/xvdf1 /mnt/rescue

**注意:**将 /dev/xvdf1 替换为您的设备名称。 要打开 /etc/fstab 文件,请运行以下命令:

sudo vi /mnt/rescue/etc/fstab
  1. 编辑 /etc/fstab 中的条目。以下示例显示了使用 UUID 定义的两个 Amazon EBS 卷。两个辅助卷都添加了 nofail 选项,每个条目的最后一列为 0
$ cat /etc/fstab
UUID=e75a1891-3463-448b-8f59-5e3353af90ba  /  xfs  defaults,noatime  1  0
UUID=ce917c0c-9e37-4ae9-bb21-f6e5022d5381  /mnt  ext4  defaults,noatime,nofail  1  0  
  1. 保存文件,然后运行以下命令来卸载卷:
sudo umount /mnt/rescue
  1. 将卷与救援实例分离
  2. 将卷连接到原始实例
  3. 要确认您可以启动实例,请启动该实例