在启动 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例时,该实例会进入紧急模式且启动进程失败。然后,该实例变得不可访问。
简短描述
由于以下原因,实例可能会以紧急模式启动:
- 实例上有损坏的内核,导致 Kernel panic(内核崩溃)错误。
- 由于 /etc/fstab 文件中的错误条目导致 Dependency failed(依赖项失败)错误,出现自动挂载失败。
要确定错误的类型,请检查实例的控制台输出。
解决方法
Kernel panic 错误
如果内核出现问题,则会收到类似于以下示例的错误消息:
“内核崩溃 - 未同步: VFS: 无法在未知块 (8,1) 上挂载根 fs”
如果 grub 配置或 initramfs 文件损坏,则会出现 Kernel panic(内核崩溃)错误。要解决此问题,请完成以下步骤:
- 将内核恢复为以前的稳定内核。
- 重启实例。
- 更正损坏内核的错误消息中列出的问题。
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 工具。
使用救援实例手动编辑文件
完成以下步骤:
-
打开 Amazon EC2 控制台。
-
选择 Instances(实例),然后选择处于紧急模式的实例。
-
停止实例。
-
从已停止的实例分离 /dev/xvda or /dev/sda1 Amazon EBS 根卷。
-
在与已停止实例相同的可用区中启动救援实例。
-
将根卷作为辅助设备连接到救援实例。
**注意:**在附加辅助卷时,您可以使用不同的设备名称。
-
使用 SSH 连接到您的救援实例。
-
要为您连接到救援实例的新卷创建挂载点目录,请运行以下命令:
sudo mkdir /mnt/rescue
**注意:**将 /mnt/rescue 替换为您的挂载点目录。
-
要识别块设备名称和分区,请运行以下命令:
[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
-
要将卷挂载到挂载点目录上,请运行以下命令:
sudo mount -o nouuid /dev/xvdf1 /mnt/rescue
**注意:**将 /dev/xvdf1 替换为您的设备名称。
要打开 /etc/fstab 文件,请运行以下命令:
sudo vi /mnt/rescue/etc/fstab
- 编辑 /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
- 保存文件,然后运行以下命令来卸载卷:
sudo umount /mnt/rescue
- 将卷与救援实例分离。
- 将卷连接到原始实例。
- 要确认您可以启动实例,请启动该实例。