为什么在尝试启动 EC2 Linux 实例时,它会进入紧急模式?
在启动 Amazon Elastic Compute Cloud(Amazon EC2)Linux 实例时,该实例会进入紧急模式且启动进程失败。然后,该实例无法访问。
简短描述
由于以下原因,实例可能会以紧急模式启动:
- 实例上的内核已损坏。
- 由于 /etc/fstab 文件中的条目不正确,自动挂载失败。
如需验证错误类型,请查看实例的控制台输出。如果内核损坏,您可能会在控制台输出中看到 Kernel panic 错误消息。如果自动挂载失败,则控制台输出中会显示 Dependency failed 消息。
解决方案
Kernel panic 错误
如果 grub 配置或 initramfs 文件损坏,则会出现 Kernel panic 错误消息。如果内核存在问题,您可能会看到“Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(8,1)”错误。
要解决 Kernel panic 错误,请执行下列操作:
1.将内核恢复为以前的稳定内核。有关如何恢复为之前内核的说明,请参阅 How do I revert to a known stable kernel after an update prevents my Amazon EC2 instance from rebooting successfully?
2.在恢复为之前的内核后,重启实例。然后,纠正损坏的内核上的问题。
Dependency failed 错误
如果由于 /etc/fstab 文件中的语法错误而导致自动挂载失败,则实例将进入紧急模式。此外,如果文件中列出的 Amazon Elastic Block Store(Amazon EBS)卷与实例分离,则实例启动过程可能会进入紧急模式。如果出现上述任一问题,则控制台输出看起来类似于以下内容:
------------------------------------------------------------------------------------------------------------------- [[1;33mDEPEND[0m] Dependency failed for /mnt. [[1;33mDEPEND[0m] Dependency failed for Local File Systems. [[1;33mDEPEND[0m] Dependency failed for Migrate local... structure to the new structure. [[1;33mDEPEND[0m] Dependency failed for Relabel all filesystems, if necessary. [[1;33mDEPEND[0m] Dependency failed for Mark the need to relabel after reboot. [[1;33mDEPEND[0m] Dependency failed for File System Check on /dev/xvdf. -------------------------------------------------------------------------------------------------------------------
前面的示例日志消息显示,/mnt 挂载点在启动序列期间未能成功挂载。
为防止启动序列因挂载失败而进入紧急模式,请将以下内容添加到 /etc/fstab 文件中。
- 在辅助分区(上例中的 /mnt)的 /etc/fstab 文件中添加 nofail 选项。存在 nofail 选项时,即使任何卷或分区挂载失败,启动序列也不会发生中断。
- 将 0 添加为相应挂载点的 /etc/fstab 文件的最后一列。0 列会关闭文件系统检查,实例成功启动。
您可以使用三种方法来更正 /etc/fstab 文件。
重要事项:
方法 2 和 3 需要停止并启动实例。请注意以下几点:
- 当实例停止时,存储在实例存储卷中的数据会丢失。在停止实例之前,请务必保存数据备份。与 EBS 支持的卷不同,实例存储卷是临时性的,不支持数据持久化。
- Amazon EC2 在启动或开始时自动分配给实例的静态公有 IPv4 地址在停止和开始后会发生变化。要保留在实例停止后不会更改的公有 IPv4 地址,请使用弹性 IP 地址。
有关详细信息,请参阅 What happens when you stop an instance。
方法 1: 使用 EC2 Serial Console
如果您启用了适用于 Linux 的 EC2 Serial Console,则可以使用它来对支持的基于 Nitro 的实例类型和裸机实例进行故障排查。您可以使用 Amazon EC2 控制台或 AWS 命令行界面(AWS CLI)来访问 Serial Console。使用 EC2 Serial Console 时,无需有效的连接即可连接到您的实例。
**注意:**如果您之前未使用过 EC2 Serial Console,请务必在尝试连接之前查看先决条件和配置访问权限。如果您的实例无法访问,并且您尚未配置对 Serial Console 的访问权限,请按照方法 2 或方法 3 中的说明进行操作。
1.打开 Amazon EC2 控制台。
2.选择实例。
3.选择实例,然后依次选择操作、监控和故障排除、EC2 Serial Console、连接。
-或-
选择实例,然后依次选择连接、EC2 Serial Console、连接。
此时将在浏览器内打开终端窗口。
4.按 Enter。如果您连接到 Serial Console,系统会返回登录提示符。如果屏幕仍然黑屏,请使用以下信息来帮助解决连接到 Serial Console 时出现的问题:
-
**确认您已配置对 Serial Console 的访问权限。**有关详细信息,请参阅 Configure access to the EC2 serial console。
-
**使用 SysRq 连接到 Serial Console。**SysRq 不需要通过基于浏览器的客户端进行连接。有关详细信息,请参阅使用 SysRq 对 Linux 实例进行故障排查。
-
**重启 getty。**如果可使用 SSH 访问您的实例,请使用 SSH 连接到您的实例,然后使用以下命令重启 getty。
[ec2-user ~]$ sudo systemctl restart serial-getty@ttyS0
-
**重启实例。**您可以使用 SysRq、EC2 控制台或者 AWS CLI 重启实例。有关详细信息,请参阅 Troubleshoot your Linux instance using SysRq 或Reboot your instance。
5.在登录提示符处,输入您之前设置的基于密码的用户的用户名,然后按 Enter。
6.在密码提示符处,输入密码,然后按 Enter。
您现在已登录该实例,可以使用 EC2 Serial Console 进行故障排除。
您也可以使用自己的密钥和 SSH 客户端进行连接。
有关使用 EC2 Serial Console 的详细信息,请参阅 Connect to the EC2 serial console。
方法 2: 运行 AWSSupport-ExecuteEC2Rescue 自动化文档
如果您的实例已经为 AWS Systems Manager 而配置,则您可以运行 AWSSupport-ExecuteEC2Rescue 自动化文档来纠正启动问题。使用这种方法时不需要手动干预。有关使用自动化文档的信息,请参阅 Run the EC2Rescue tool on unreachable instances。
方法 3: 使用救援实例手动编辑文件
1.打开 Amazon EC2 控制台。
2.选择实例,然后选择处于紧急模式的实例。
3.停止实例。
4.从已停止的实例分离 Amazon EBS 根卷(/dev/xvda 或 /dev/sda1)。
5.在受损实例所在的可用区中启动新的 EC2 实例。该新实例将成为您的救援实例。
6.将您在第 4 步中分离的根卷作为辅助设备附加到救援实例。
**注意:**在挂载辅助卷时,您可以使用不同的设备名称。
8.为您在第 6 步中附加到救援实例的新卷创建挂载点目录。在以下示例中,挂载点目录为 /mnt/rescue。
$ sudo mkdir /mnt/rescue
9.将该卷挂载到您在第 8 步中创建的目录。
$ sudo mount /dev/xvdf /mnt/rescue
**注意:**可以用不同的设备名称将设备(上例中为 /dev/xvdf)挂载到救援实例。使用 lsblk 命令查看可用磁盘设备及其挂载点,以确定正确的设备名称。
10.挂载卷后,请运行下列命令打开 /etc/fstab 文件。
$ sudo vi /mnt/rescue/etc/fstab
11.根据需要编辑 /etc/fstab 中的条目。以下示例输出显示使用 UUID 定义的三个 EBS 卷,两个辅助卷都添加了 nofail 选项,并且每个条目的最后一列都为 0。
------------------------------------------------------------------------------------------ $ cat /etc/fstab UUID=e75a1891-3463-448b-8f59-5e3353af90ba / xfs defaults,noatime 1 0 UUID=87b29e4c-a03c-49f3-9503-54f5d6364b58 /mnt/rescue ext4 defaults,noatime,nofail 1 0 UUID=ce917c0c-9e37-4ae9-bb21-f6e5022d5381 /mnt ext4 defaults,noatime,nofail 1 0 ------------------------------------------------------------------------------------------
12.保存文件,然后运行 umount 命令来卸载卷。
$ sudo umount /mnt/rescue
13.从临时实例分离卷。
14.将卷挂载到原始实例,然后启动该实例以确认其启动成功。
相关内容
- AWS 官方已更新 9 个月前
- AWS 官方已更新 2 年前