我无法连接到我的 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例或者我遇到启动问题。要更正这些问题,我需要修复 OpenSSH 文件权限等常见问题或收集系统 (OS) 日志进行分析和问题排查。我该如何使用 EC2Rescue for Linux 解决此问题?
简短描述
EC2Rescue for Linux 是一种工具,可帮助诊断并排查有关 Amazon EC2 Linux 实例的问题。EC2Rescue for Linux 在 Amazon EC2 Linux 实例上运行,用于解决操作系统级问题。EC2Rescue for Linux 还会收集高级日志、系统利用率报告和配置文件,以供进一步分析。
EC2Rescue for Linux 的常见应用场景包括:
- 收集系统利用率报告,如 vmstat、iostat、mpstat 等。
- 收集日志和详细信息,如 syslog、dmesg、应用程序错误日志和 SSM 日志。
- 检测系统问题,如非对称路由或重复的根设备标签。
- 自动修复系统问题,如更正 OpenSSH 文件权限或禁用已知存在问题的内核参数。
系统要求
EC2Rescue for Linux 要求 Amazon EC2 Linux 实例满足以下先决条件:
支持的操作系统
- Amazon Linux 2
- Amazon Linux 2016.09+
- SLES 12+
- RHEL 7+
- Ubuntu 16.04+
软件要求
**注意:**如果您为 Linux 启用了 EC2 串行控制台,则可以使用它来排查受支持的基于 Nitro 的实例类型问题。串行控制台可帮助您排查启动问题、网络配置和 SSH 配置问题。串行控制台无需网络连接即可连接到您的实例。您可以使用 Amazon EC2 控制台或 AWS 命令行界面 (AWS CLI) 访问串行控制台。
在使用串行控制台之前,在账户层面授予对该控制台的访问权限。然后,创建 AWS Identity and Access Management (IAM) 策略,授予对 IAM 用户的访问权限。此外,每个使用串行控制台的实例都必须至少包含一个基于密码的用户。如果您的实例无法访问,并且尚未配置对串行控制台的访问权限,请按照解决方法部分中的说明进行操作。有关为 Linux 配置 EC2 串行控制台的信息,请参阅配置对 EC2 串行控制台的访问权限。
**注意:**如果在运行 AWS CLI 命令时收到错误,请确保您使用的是最新的 AWS CLI 版本。
解决方法
要使用 EC2Rescue for Linux 对无法访问的 Amazon EC2 Linux 实例进行问题排查,请执行以下操作:
1. 在 Virtual Private Cloud (VPC) 中启动新的 Amazon EC2 实例,且使用与受损实例相同的 Amazon 系统映像 (AMI) 并与其位于同一可用区中。新实例将成为您的“救援”实例。或者,也可以使用您可以访问的现有实例,但前提是该实例使用与受损实例相同的 AMI,并且二者位于同一可用区中。
2. 从受损实例中分离 Amazon Elastic Block Store (Amazon EBS) 根卷(/dev/xvda 或 /dev/sda1)。记下设备名称,以确保稍后重新连接时它是相同的
3. 将 EBS 卷作为辅助设备(/dev/sdf)附加到救援实例。
4. 使用 SSH 连接到您的救援实例。
5. 成为根用户,使用 lsblk 标识正确的设备名称,然后将其保存以在整个过程中使用:
$ sudo -i
# lsblk
# rescuedev=/dev/xvdf1
**注意:**设备(/dev/xvdf1)可能会以不同的设备名称附加到救援实例。使用 lsblk 命令查看可用磁盘设备及其挂载点,以确定正确的设备名称。
6. 选择要使用的适当临时挂载点,并确保它存在,请使用 /mnt,除非该挂载点已在使用中:。
# rescuemnt=/mnt
# mkdir -p $rescuemnt
7. 从附加的卷挂载根文件系统:
# mount $rescuedev $rescuemnt
**注意:**如果卷挂载失败,请检查 dmesg | tail。如果日志显示 UUID 冲突,请使用选项 -o nouuid。
8. 挂载特殊文件系统并将根目录(chroot)更改为新挂载的文件系统:
# for i in proc sys dev run; do mount --bind /$i $rescuemnt/$i ; done
# chroot $rescuemnt
9. 下载 EC2Rescue for Linux 工具并安装到脱机 Linux 根卷:
# curl -O https://s3.amazonaws.com/ec2rescuelinux/ec2rl.tgz
# tar -xf ec2rl.tgz
10. 通过列出帮助文件来验证安装:
# cd ec2rl-<version_number>
# ./ec2rl help
11. 运行不含任何选项的 EC2Rescue for Linux,以运行所有模块:
# ./ec2rl run
12. 在 /var/tmp/ec2rl 中查看结果:
# cat /var/tmp/ec2rl/*/Main.log | more
13. 根据结果对支持的模块进行修复:
# ./ec2rl run --remediate
14. 修复完成后,退出 chroot 并卸载辅助设备:
# exit
# umount $rescuemnt/{proc,sys,dev,run,}
注意:如果卸载操作不成功,您可能需要停止或重启救援实例,以实现干净卸载。
15. 将辅助卷(/dev/sdf)与救援 EC2 实例分离,然后以 /dev/xvda 或 /dev/sda1(根卷)的形式将其附加到原始实例。确保这与步骤 2 中看到的相同。
16. 启动 EC2 实例,然后验证实例是否响应。
**注意:**您也可以使用 AWS Systems Manager Automation 文档排查连接问题。有关更多信息,请参阅演练:在无法访问的实例上运行 EC2Rescue 工具。AWSSupport-ExecuteEC2Rescue 文档旨在自动执行使用 EC2Rescue for Linux 正常所需的步骤。这些步骤是 Systems Manager 操作、AWS CloudFormation 操作和 AWS Lambda 函数的组合。
其他问题排查方法
相关信息
使用 EC2Rescue 和 Amazon EC2 Systems Manager Automation 恢复您的受损实例