如何使用 EC2Rescue for Linux 排查操作系统级问题?

上次更新日期:2022 年 4 月 26 日

我无法连接到我的 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+

软件要求

  • Python 2.7.9+ 或 3.2+

注意:如果您为 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 函数的组合。

其他问题排查方法


这篇文章对您有帮助吗?


您是否需要账单或技术支持?