

# 适用于实例的 EC2 Serial Console
<a name="ec2-serial-console"></a>

使用 EC2 Serial Console，您可以访问 Amazon EC2 实例的串行端口，通过该端口可以排查启动、网络配置和其他方面的问题。串行控制台不要求您的实例拥有任何联网功能。使用串行控制台，您可以向实例输入命令，就像键盘和显示器直接连接到实例的串行端口一样。串行控制台会话在实例重启和停止期间持续存在。在重新启动过程中，您可以从一开始就查看所有引导消息。

默认情况下，对串行控制台的访问权限不可用。您的组织必须授予账户对串行控制台的访问权限，并配置 IAM policy 以授予用户对串行控制台的访问权限。通过使用实例 ID、资源标签和其他 IAM 操作，可以精细地控制串行控制台访问。有关更多信息，请参阅[配置对 EC2 Serial Console 的访问](configure-access-to-serial-console.md)。

串行控制台可使用 EC2 控制台或 AWS CLI 访问。

串行控制台不会产生额外的成本。

**Topics**
+ [EC2 Serial Console 的先决条件](ec2-serial-console-prerequisites.md)
+ [配置对 EC2 Serial Console 的访问](configure-access-to-serial-console.md)
+ [连接到 EC2 Serial Console](connect-to-serial-console.md)
+ [断开与 EC2 Serial Console 的连接](disconnect-serial-console-session.md)
+ [使用 EC2 Serial Console 对 Amazon EC2 实例进行故障排查](troubleshoot-using-serial-console.md)

# EC2 Serial Console 的先决条件
<a name="ec2-serial-console-prerequisites"></a>

**Topics**
+ [AWS 区域](#sc-prereqs-regions)
+ [Wavelength 区域和 AWS Outposts](#sc-prereqs-wavelength-zones-outposts)
+ [Local Zones](#sc-prereqs-local-zones)
+ [实例类型](#sc-prereqs-instance-types)
+ [授予访问权限](#sc-prereqs-configure-ec2-serial-console)
+ [支持基于浏览器的客户端](#sc-prereqs-for-browser-based-connection)
+ [实例状态](#sc-prereqs-instance-state)
+ [Amazon EC2 Systems Manager](#sc-prereqs-ssm)
+ [配置您选择的故障排除工具](#sc-prereqs-configure-troubleshooting-tool)

## AWS 区域
<a name="sc-prereqs-regions"></a>

在除亚太地区（台北）之外的所有 AWS 区域中都受支持。

## Wavelength 区域和 AWS Outposts
<a name="sc-prereqs-wavelength-zones-outposts"></a>

不支持。

## Local Zones
<a name="sc-prereqs-local-zones"></a>

在所有 Local Zones 中支持。

## 实例类型
<a name="sc-prereqs-instance-types"></a>

支持的实例类型：
+ **Linux**
  + 基于 Nitro 系统构建的所有虚拟化实例。
  + 所有裸机实例，以下项除外：
    + 通用：`a1.metal`、`mac1.metal`、`mac2.metal`
    + 加速计算：`g5g.metal`
    + 内存优化型：`u-6tb1.metal`、`u-9tb1.metal`、`u-12tb1.metal`、`u-18tb1.metal`、`u-24tb1.metal`
+ **Windows**

  基于 Nitro 系统构建的所有虚拟化实例。不支持裸机实例。

## 授予访问权限
<a name="sc-prereqs-configure-ec2-serial-console"></a>

您必须完成配置任务才能授予对 EC2 Serial Console 的访问权限。有关更多信息，请参阅 [配置对 EC2 Serial Console 的访问](configure-access-to-serial-console.md)。

## 支持基于浏览器的客户端
<a name="sc-prereqs-for-browser-based-connection"></a>

如需[使用基于浏览器的客户端](connect-to-serial-console.md#sc-connect-browser-based-client)连接至串行控制台，您的浏览器必须支持 WebSocket。如果您的浏览器不支持 WebSocket，请[使用您自己的密钥和 SSH 客户端](connect-to-serial-console.md#sc-connect-SSH)连接至串行控制台。

## 实例状态
<a name="sc-prereqs-instance-state"></a>

必须是 `running`。

如果实例处于 `pending`、`stopping`、`stopped`、`shutting-down` 或 `terminated` 状态，则无法连接到串行控制台。

有关实例状态的更多信息，请参阅 [Amazon EC2 实例状态更改](ec2-instance-lifecycle.md)。

## Amazon EC2 Systems Manager
<a name="sc-prereqs-ssm"></a>

如果实例使用 Amazon EC2 Systems Manager，则必须在实例上安装 SSM Agent 3.0.854.0 版或更高版本。有关 SSM Agent 的更多信息，请参阅《*AWS Systems Manager 用户指南*》中的[使用 SSM Agent](https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent.html)。

## 配置您选择的故障排除工具
<a name="sc-prereqs-configure-troubleshooting-tool"></a>

要使用串行控制台对 Windows 实例进行故障排除，在 Linux 实例上可以使用 GRUB 或 SysRq，在 Windows 实例上可使用特殊管理控制台（SAC）。您必须先在要使用这些工具的每个实例上执行配置步骤，然后才可以使用这些工具。

请使用适用于实例操作系统的说明，配置您选择的故障排除工具。

### （Linux 实例）配置 GRUB
<a name="configure-grub"></a>

要配置 GRUB，请根据用于启动实例的 AMI 选择以下程序之一。

------
#### [ Amazon Linux 2 ]

**在 Amazon Linux 2 实例上配置 GRUB**

1. [使用 SSH 连接到 Linux 实例](connect-to-linux-instance.md)

1. 在 `/etc/default/grub` 中添加或更改以下选项：
   + 设置 `GRUB_TIMEOUT=1`。
   + 添加 `GRUB_TERMINAL="console serial"`。
   + 添加 `GRUB_SERIAL_COMMAND="serial --speed=115200"`。

   以下是 `/etc/default/grub` 的示例。您可能需要根据系统设置更改配置。

   ```
   GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0"
   GRUB_TIMEOUT=1
   GRUB_DISABLE_RECOVERY="true"
   GRUB_TERMINAL="console serial"
   GRUB_SERIAL_COMMAND="serial --speed=115200"
   ```

1. 运行以下命令以应用更新后的配置。

   ```
   [ec2-user ~]$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
   ```

------
#### [ Ubuntu ]

**在 Ubuntu 实例上配置 GRUB**

1. [连接到您的实例](connect-to-linux-instance.md)。

1. 在 `/etc/default/grub.d/50-cloudimg-settings.cfg` 中添加或更改以下选项：
   + 设置 `GRUB_TIMEOUT=1`。
   + 添加 `GRUB_TIMEOUT_STYLE=menu`。
   + 添加 `GRUB_TERMINAL="console serial"`。
   + 删除 `GRUB_HIDDEN_TIMEOUT`。
   + 添加 `GRUB_SERIAL_COMMAND="serial --speed=115200"`。

   以下是 `/etc/default/grub.d/50-cloudimg-settings.cfg` 的示例。您可能需要根据系统设置更改配置。

   ```
   # Cloud Image specific Grub settings for Generic Cloud Images
   # CLOUD_IMG: This file was created/modified by the Cloud Image build process
   
   # Set the recordfail timeout
   GRUB_RECORDFAIL_TIMEOUT=0
   
   # Do not wait on grub prompt
   GRUB_TIMEOUT=1
   GRUB_TIMEOUT_STYLE=menu
   
   # Set the default commandline
   GRUB_CMDLINE_LINUX_DEFAULT="console=tty1 console=ttyS0 nvme_core.io_timeout=4294967295"
   
   # Set the grub console type
   GRUB_TERMINAL="console serial"
   GRUB_SERIAL_COMMAND="serial --speed 115200"
   ```

1. 运行以下命令以应用更新后的配置。

   ```
   [ec2-user ~]$ sudo update-grub
   ```

------
#### [ RHEL ]

**在 RHEL 实例上配置 GRUB**

1. [连接到您的实例](connect-to-linux-instance.md)。

1. 在 `/etc/default/grub` 中添加或更改以下选项：
   + 删除 `GRUB_TERMINAL_OUTPUT`。
   + 添加 `GRUB_TERMINAL="console serial"`。
   + 添加 `GRUB_SERIAL_COMMAND="serial --speed=115200"`。

   以下是 `/etc/default/grub` 的示例。您可能需要根据系统设置更改配置。

   ```
   GRUB_TIMEOUT=1
   GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
   GRUB_DEFAULT=saved
   GRUB_DISABLE_SUBMENU=true
   GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,115200n8 net.ifnames=0 rd.blacklist=nouveau nvme_core.io_timeout=4294967295 crashkernel=auto"
   GRUB_DISABLE_RECOVERY="true"
   GRUB_ENABLE_BLSCFG=true
   GRUB_TERMINAL="console serial"
   GRUB_SERIAL_COMMAND="serial --speed=115200"
   ```

1. 运行以下命令以应用更新后的配置。

   ```
   [ec2-user ~]$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg --update-bls-cmdline
   ```

   对于 RHEL 9.2 及更早版本，请使用以下命令。

   ```
   [ec2-user ~]$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
   ```

------
#### [ CentOS ]

对于使用 CentOS AMI 启动的实例，默认情况下为串行控制台配置了 GRUB。

以下是 `/etc/default/grub` 的示例。根据您的系统设置，您的配置可能会有所不同。

```
GRUB_TIMEOUT=1
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL="serial console"
GRUB_SERIAL_COMMAND="serial --speed=115200"
GRUB_CMDLINE_LINUX="console=tty0 crashkernel=auto console=ttyS0,115200"
GRUB_DISABLE_RECOVERY="true"
```

------

### （Linux 实例）配置 SysRq
<a name="configure-sysrq"></a>

要配置 SysRq，请在当前引导周期中启用 SysRq 命令。要使配置永久化，您还可以为后续引导启用 SysRq 命令。

**为当前引导周期启用所有 SysRq 命令**

1. [连接到您的实例](connect-to-linux-instance.md)。

1. 运行以下命令。

   ```
   [ec2-user ~]$ sudo sysctl -w kernel.sysrq=1
   ```

   下次重新启动时将会清除此设置。

**为后续引导启用所有 SysRq 命令**

1. 创建文件 `/etc/sysctl.d/99-sysrq.conf` 并在您收藏的编辑器中打开。

   ```
   [ec2-user ~]$ sudo vi /etc/sysctl.d/99-sysrq.conf
   ```

1. 添加以下行。

   ```
   kernel.sysrq=1
   ```

1. 重启实例以应用更改。

   ```
   [ec2-user ~]$ sudo reboot
   ```

1. 在 `login` 提示符下，输入您[之前设置](configure-access-to-serial-console.md#set-user-password)的、基于密码的用户的用户名，然后按 **Enter** 键。

1. 在 `Password` 提示符下，输入密码，然后按 **Enter** 键。

### （Windows 实例）启用 SAC 和启动菜单
<a name="configure-sac-bootmenu"></a>

**注意**  
如果您在实例上启用 SAC，则依赖密码检索的 EC2 服务将无法通过 Amazon EC2 控制台运行。Amazon EC2 启动代理（EC2Config、EC2Launch v1 和 EC2Launch v2）上的 Windows 依靠串行控制台来执行各种任务。当您在实例上启用 SAC 时，这些任务不会成功执行。有关 Amazon EC2 启动代理上的 Windows 的更多信息，请参阅 [配置您的 Amazon EC2 Windows 实例](ec2-windows-instances.md)。如果您启用 SAC，则可在之后将其禁用。有关更多信息，请参阅 [禁用 SAC 和启动菜单](troubleshoot-using-serial-console.md#disable-sac-bootmenu)。

使用以下方法之一在实例上启用 SAC 和启动菜单。

------
#### [ PowerShell ]

**在 Windows 实例上启用 SAC 和启动菜单**

1. [连接到](connecting_to_windows_instance.md)您的实例并从提升的 PowerShell 命令行执行以下步骤。

1. 启用 SAC。

   ```
   bcdedit /ems '{current}' on
   bcdedit /emssettings EMSPORT:1 EMSBAUDRATE:115200
   ```

1. 启用启动菜单。

   ```
   bcdedit /set '{bootmgr}' displaybootmenu yes
   bcdedit /set '{bootmgr}' timeout 15
   bcdedit /set '{bootmgr}' bootems yes
   ```

1. 重新启动实例以应用更新后的配置。

   ```
   shutdown -r -t 0
   ```

------
#### [ Command prompt ]

**在 Windows 实例上启用 SAC 和启动菜单**

1. [连接到](connecting_to_windows_instance.md)您的实例并从命令提示符执行以下步骤。

1. 启用 SAC。

   ```
   bcdedit /ems {current} on
   bcdedit /emssettings EMSPORT:1 EMSBAUDRATE:115200
   ```

1. 启用启动菜单。

   ```
   bcdedit /set {bootmgr} displaybootmenu yes
   bcdedit /set {bootmgr} timeout 15
   bcdedit /set {bootmgr} bootems yes
   ```

1. 重新启动实例以应用更新后的配置。

   ```
   shutdown -r -t 0
   ```

------

# 配置对 EC2 Serial Console 的访问
<a name="configure-access-to-serial-console"></a>

要配置对串行控制台的访问权限，您必须在账户级别授予串行控制台访问权限，然后配置 IAM policy 以向用户授予访问权限。对于 Linux 实例，您还必须在每个实例上配置基于密码的用户，以使您的用户能够使用串行控制台进行问题排查。

EC2 Serial Console 使用虚拟串行端口连接与实例进行交互。此连接独立于实例 VPC，因此即使出现引导故障或网络配置问题，您仍可以使用实例操作系统和运行故障排除工具。由于此连接在 VPC 网络之外，因此 EC2 Serial Console 不使用实例安全组或子网网络 ACL 来授权实例的流量。

**开始前的准备工作**  
验证是否满足[先决条件](ec2-serial-console-prerequisites.md)。

**Topics**
+ [EC2 Serial Console 的访问级别](#serial-console-access-levels)
+ [管理账户对 EC2 Serial Console 的访问权限](#serial-console-account-access)
+ [为 EC2 Serial Console 访问配置 IAM policy](#serial-console-iam)
+ [在 Linux 实例上设置操作系统用户密码](#set-user-password)

## EC2 Serial Console 的访问级别
<a name="serial-console-access-levels"></a>

默认情况下，在账户级别无法访问串行控制台。您需要在账户级别明确授予对串行控制台的访问权限。有关更多信息，请参阅[管理账户对 EC2 Serial Console 的访问权限](#serial-console-account-access)。

您可以使用服务控制策略 (SCP) 来允许在组织内访问串行控制台。然后，您可以使用 IAM policy 控制访问，从而在用户级别实现精确的访问控制。通过使用 SCP 和 IAM policy 的组合，您可以对串行控制台进行不同级别的访问控制。

**组织级别**  
您可以使用服务控制策略 (SCP) 来允许组织内的成员账户访问串行控制台。有关 SCP 的更多信息，请参阅 *AWS Organizations 用户指南*中的[服务控制策略](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)。

**实例级别**  
您可以通过使用 IAM PrincipalTag 和 ResourceTag 构造以及通过其 ID 指定实例，来配置串行控制台访问策略。有关更多信息，请参阅 [为 EC2 Serial Console 访问配置 IAM policy](#serial-console-iam)。

**用户级别**  
您可以通过配置 IAM policy 以允许或拒绝指定用户将 SSH 公钥推送到特定实例的串行控制台服务的权限，来配置用户级别的访问权限。有关更多信息，请参阅 [为 EC2 Serial Console 访问配置 IAM policy](#serial-console-iam)。

**操作系统级别**（仅限 Linux 实例）  
您可以在访客操作系统级别设置用户密码。这为某些使用案例提供了对串行控制台的访问权限。但是，要监控日志，您不需要基于密码的用户。有关更多信息，请参阅[在 Linux 实例上设置操作系统用户密码](#set-user-password)。

## 管理账户对 EC2 Serial Console 的访问权限
<a name="serial-console-account-access"></a>

默认情况下，在账户级别无法访问串行控制台。您需要在账户级别明确授予对串行控制台的访问权限。

此设置是在账户级别配置，可以直接在账户中配置，也可以使用声明式策略进行配置。必须在要授予串行控制台访问权限的每个 AWS 区域中配置该设置。使用声明式策略可同时将设置应用于多个区域，也可以同时应用于多个账户。当使用声明式策略时，您无法直接在账户中修改设置。本主题介绍如何直接在账户中配置设置。有关使用声明式策略的信息，请参阅《AWS Organizations User Guide》**中的 [Declarative policies](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative.html)。

**Contents**
+ [授予用户账户访问管理权限](#sc-account-access-permissions)
+ [查看账户对串行控制台的访问权限状态](#sc-view-account-access)
+ [授予账户访问串行控制台的权限。](#sc-grant-account-access)
+ [拒绝账户访问串行控制台](#sc-deny-account-access)

### 授予用户账户访问管理权限
<a name="sc-account-access-permissions"></a>

要允许用户管理对 EC2 Serial Console 的账户访问权限，您需要授予其所需的 IAM 权限。

以下策略授予查看账户状态以及允许和阻止账户访问 EC2 Serial Console 的权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:GetSerialConsoleAccessStatus",
                "ec2:EnableSerialConsoleAccess",
                "ec2:DisableSerialConsoleAccess"
            ],
            "Resource": "*"
        }
    ]
}
```

------

有关更多信息，请参阅 *IAM 用户指南* 中的[创建 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

### 查看账户对串行控制台的访问权限状态
<a name="sc-view-account-access"></a>

------
#### [ Console ]

**查看账户对串行控制台的访问权限**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择**控制面板**。

1. 在**账户属性**卡的**设置**下，选择 **EC2 Serial Console**。

1. 在 **EC2 Serial Console** 选项卡上，**EC2 Serial Console 访问权限**的值为**已允许**或**已阻止**。

------
#### [ AWS CLI ]

**查看账户对串行控制台的访问权限**  
使用 [get-serial-console-access-status](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-serial-console-access-status.html) 命令。

```
aws ec2 get-serial-console-access-status
```

下面是示例输出。值为 `true` 表示允许该账户访问串行控制台。

```
{
    "SerialConsoleAccessEnabled": true,
    "ManagedBy": "account"
}
```

`ManagedBy` 字段表示配置了该设置的实体。可能的值是 `account`（直接配置）或 `declarative-policy`。有关更多信息，请参阅《AWS Organizations User Guide》**中的 [Declarative policies](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative.html)。

------
#### [ PowerShell ]

**查看账户对串行控制台的访问权限**  
使用 [Get-EC2SerialConsoleAccessStatus](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2SerialConsoleAccessStatus.html) cmdlet。

```
Get-EC2SerialConsoleAccessStatus -Select *
```

下面是示例输出。值为 `True` 表示允许该账户访问串行控制台。

```
ManagedBy SerialConsoleAccessEnabled
--------- --------------------------
account   True
```

`ManagedBy` 字段表示配置了该设置的实体。可能的值是 `account`（直接配置）或 `declarative-policy`。有关更多信息，请参阅《AWS Organizations User Guide》**中的 [Declarative policies](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative.html)。

------

### 授予账户访问串行控制台的权限。
<a name="sc-grant-account-access"></a>

------
#### [ Console ]

**授予账户对串行控制台的访问权限**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择**控制面板**。

1. 在**账户属性**卡的**设置**下，选择 **EC2 Serial Console**。

1. 选择**管理**。

1. 要允许访问账户中所有实例的 EC2 Serial Console，请选中**允许**复选框。

1. 选择**更新**。

------
#### [ AWS CLI ]

**授予账户对串行控制台的访问权限**  
使用 [enable-serial-console-access](https://docs.aws.amazon.com/cli/latest/reference/ec2/enable-serial-console-access.html) 命令。

```
aws ec2 enable-serial-console-access
```

下面是示例输出。

```
{
    "SerialConsoleAccessEnabled": true
}
```

------
#### [ PowerShell ]

**授予账户对串行控制台的访问权限**  
使用 [Enable-EC2SerialConsoleAccess](https://docs.aws.amazon.com/powershell/latest/reference/items/Enable-EC2SerialConsoleAccess.html) cmdlet。

```
Enable-EC2SerialConsoleAccess
```

下面是示例输出。

```
True
```

------

### 拒绝账户访问串行控制台
<a name="sc-deny-account-access"></a>

------
#### [ Console ]

**拒绝账户访问串行控制台**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择**控制面板**。

1. 在**账户属性**卡的**设置**下，选择 **EC2 Serial Console**。

1. 选择**管理**。

1. 要阻止访问账户中所有实例的 EC2 Serial Console，请清除**允许**复选框。

1. 选择**更新**。

------
#### [ AWS CLI ]

**拒绝账户访问串行控制台**  
使用 [disable-serial-console-access](https://docs.aws.amazon.com/cli/latest/reference/ec2/disable-serial-console-access.html) 命令。

```
aws ec2 disable-serial-console-access
```

下面是示例输出。

```
{
    "SerialConsoleAccessEnabled": false
}
```

------
#### [ PowerShell ]

**拒绝账户访问串行控制台**  
使用 [Disable-EC2SerialConsoleAccess](https://docs.aws.amazon.com/powershell/latest/reference/items/Disable-EC2SerialConsoleAccess.html) cmdlet。

```
Disable-EC2SerialConsoleAccess
```

下面是示例输出。

```
False
```

------

## 为 EC2 Serial Console 访问配置 IAM policy
<a name="serial-console-iam"></a>

默认情况下，用户无权访问串行控制台。您的组织必须配置 IAM policy 以授予用户所需的访问权限。有关更多信息，请参阅 *IAM 用户指南* 中的[创建 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

对于串行控制台访问，请创建包含 `ec2-instance-connect:SendSerialConsoleSSHPublicKey` 操作的 JSON 策略文档。此操作会授予用户将公钥推送到串行控制台服务的权限，该服务将启动串行控制台会话。我们建议限制对特定 EC2 实例的访问。否则，具有此权限的所有用户都可以连接到所有 EC2 实例的串行控制台。

**Topics**
+ [明确允许访问串行控制台](#iam-explicitly-allow-access)
+ [明确拒绝访问串行控制台](#serial-console-IAM-policy)
+ [使用资源标签控制对串行控制台的访问](#iam-resource-tags)

### 明确允许访问串行控制台
<a name="iam-explicitly-allow-access"></a>

默认情况下，没有人可以访问串行控制台。要授予对串行控制台的访问权限，您需要将策略配置为明确允许访问。我们建议配置一个策略以限制对特定实例的访问。

以下策略允许访问由实例 ID 标识的特定实例的串行控制台。

请注意，`DescribeInstances`、`DescribeInstanceTypes` 和 `GetSerialConsoleAccessStatus` 操作不支持资源级权限，因此必须为这些操作指定以 `*`（星号）表示的所有资源。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowDescribeInstances",
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeInstanceTypes",
                "ec2:GetSerialConsoleAccessStatus"
            ],
             "Resource": "*"
        },
        {
            "Sid": "AllowinstanceBasedSerialConsoleAccess",
            "Effect": "Allow",
            "Action": [
                "ec2-instance-connect:SendSerialConsoleSSHPublicKey"
            ],
            "Resource": "arn:aws:ec2:us-east-1:111122223333:instance/i-0598c7d356eba48d7"
        }
    ]
}
```

------

### 明确拒绝访问串行控制台
<a name="serial-console-IAM-policy"></a>

以下 IAM policy 允许访问标有 `*`（星号）的所有实例的串行控制台，并明确拒绝访问由 ID 标识的特定实例的串行控制台。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowSerialConsoleAccess",
            "Effect": "Allow",
            "Action": [
                "ec2-instance-connect:SendSerialConsoleSSHPublicKey",
                "ec2:DescribeInstances",
                "ec2:DescribeInstanceTypes",
                "ec2:GetSerialConsoleAccessStatus"
            ],
            "Resource": "*"
        },
        {
            "Sid": "DenySerialConsoleAccess",
            "Effect": "Deny",
            "Action": [
                "ec2-instance-connect:SendSerialConsoleSSHPublicKey"
            ],
            "Resource": "arn:aws:ec2:us-east-1:111122223333:instance/i-0598c7d356eba48d7"
        }
    ]
}
```

------

### 使用资源标签控制对串行控制台的访问
<a name="iam-resource-tags"></a>

您可以使用资源标签来控制对实例的串行控制台的访问。

基于属性的访问控制是一种授权策略，它根据可附加到用户和 AWS 资源的标签来定义权限。例如，只有当实例的资源标签和委托人标签具有相同的标签键 `SerialConsole` 值时，以下策略才会允许用户启动该实例的串行控制台连接。

有关使用标签控制对AWS资源的访问的更多信息，请参阅 *IAM 用户指南*中的[控制对AWS资源的访问](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html#access_tags_control-resources)。

请注意，`DescribeInstances`、`DescribeInstanceTypes` 和 `GetSerialConsoleAccessStatus` 操作不支持资源级权限，因此必须为这些操作指定以 `*`（星号）表示的所有资源。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowDescribeInstances",
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeInstanceTypes",
                "ec2:GetSerialConsoleAccessStatus"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowTagBasedSerialConsoleAccess",
            "Effect": "Allow",
            "Action": [
                "ec2-instance-connect:SendSerialConsoleSSHPublicKey"
            ],
            "Resource": "arn:aws:ec2:us-east-1:111122223333:instance/*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/SerialConsole": "${aws:PrincipalTag/SerialConsole}"
                }
            }
        }
    ]
}
```

------

## 在 Linux 实例上设置操作系统用户密码
<a name="set-user-password"></a>

您可以在没有密码的情况下连接到串行控制台。但是，要*使用*串行控制台对 Linux 实例进行故障排查，实例必须拥有基于密码的操作系统用户。

您可以为任何 OS 用户（包括根用户）设置密码。请注意，根用户可以修改所有文件，而每个 OS 用户可能只有有限权限。

您必须为要使用串行控制台的每个实例设置用户密码。这是每个实例的一次性要求。

**注意**  
默认情况下，AWS 提供的 AMI 未配置基于密码的用户。如果您使用已配置了根用户密码的 AMI 启动实例，则可以跳过这些说明。

**在 Linux 实例上设置操作系统用户密码**

1. [连接到您的 实例](connect-to-linux-instance.md)。除 EC2 Serial Console 连接方法外，您还可以使用任何方法连接到自己的实例。

1. 要为用户设置密码，请使用 **passwd** 命令。在以下示例中，用户是 `root`。

   ```
   [ec2-user ~]$ sudo passwd root
   ```

   下面是示例输出。

   ```
   Changing password for user root.
   New password:
   ```

1. 出现提 `New password` 示时，输入新密码。

1. 出现提示时，重新输入密码。

# 连接到 EC2 Serial Console
<a name="connect-to-serial-console"></a>

您可以使用 Amazon EC2 控制台或通过 SSH 连接到 EC2 实例的串行控制台。连接到串行控制台后，您可以使用它来排除引导、网络配置和其他方面的问题。有关排查故障的更多信息，请参阅 [使用 EC2 Serial Console 对 Amazon EC2 实例进行故障排查](troubleshoot-using-serial-console.md)。

**注意事项**
+ 每个实例仅支持一个活动串行控制台连接。
+ 串行控制台连接通常会持续一小时，除非您[断开连接](disconnect-serial-console-session.md)。但是，在系统维护期间，Amazon EC2 将断开串行控制台会话。

  连接的持续时间并不是由 IAM 凭证的持续时间决定的。如果您的 IAM 凭证过期，连接将继续保持，直到达到串行控制台连接的最长持续时间。使用 EC2 Serial Console 控制台体验时，如果 IAM 凭证过期，请关闭浏览器页面终止连接。
+ 在断开与串行控制台的连接后，需要 30 秒钟来停用会话，然后才能允许新会话。
+ 支持的串行控制台端口：`ttyS0`（Linux 实例）和 `COM1`（Windows 实例）
+ 连接到串行控制台时，您可能会观察到实例的吞吐量略有下降。

**Topics**
+ [使用基于浏览器的客户端进行连接](#sc-connect-browser-based-client)
+ [使用您自己的密钥和 SSH 客户端进行连接](#sc-connect-SSH)
+ [EC2 Serial Console 端点和指纹](#sc-endpoints-and-fingerprints)

## 使用基于浏览器的客户端进行连接
<a name="sc-connect-browser-based-client"></a>

您可以使用基于浏览器的客户端连接到 EC2 实例的串行控制台。您可以通过在 Amazon EC2 控制台中选择实例并选择连接到串行控制台来完成此操作。基于浏览器的客户端处理权限并可提供成功连接。

EC2 Serial Console 适用于大多数浏览器，并支持键盘和鼠标输入。

在连接之前，请确保您已完成[先决条件](ec2-serial-console-prerequisites.md)。

**使用基于浏览器的客户端（Amazon EC2 控制台）连接到实例的串行端口**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格中，选择 **Instances (实例)**。

1. 您可以选择相应实例，然后选择 **Actions**（操作）、**Monitor and troubleshoot**（监控和问题排查）、**EC2 Serial Console**、**Connect**（连接）。

   您也可以选择相应实例，然后选择 **Connect**（连接）、**EC2 Serial Console**、**Connect**（连接）。

   浏览器内终端窗口随即打开。

1. 按 **Enter**。如果返回登录提示，则表示您已连接到串行控制台。

   如果保持黑屏，则可以使用以下信息来帮助解决连接到串行控制台的问题：
   + **检查您是否已配置了串行控制台的访问权限。**有关更多信息，请参阅 [配置对 EC2 Serial Console 的访问](configure-access-to-serial-console.md)。
   + （仅限 Linux 实例）**使用 SysRq 连接到串行控制台。**SysRq 不要求您使用基于浏览器的客户端进行连接。有关更多信息，请参阅 [（Linux 实例）使用 SysRq 对您的实例进行故障排除SysRq (Linux)](troubleshoot-using-serial-console.md#SysRq)。
   + （仅限 Linux 实例）**重新启动 getty。**如果您对实例拥有 SSH 访问权限，则使用 SSH 连接到实例，然后使用以下命令重新启动 getty。

     ```
     [ec2-user ~]$ sudo systemctl restart serial-getty@ttyS0
     ```
   + **重启实例。**您可以使用 SysRq（Linux 实例）、EC2 控制台或 AWS CLI 重启实例 。有关更多信息，请参阅 [（Linux 实例）使用 SysRq 对您的实例进行故障排除SysRq (Linux)](troubleshoot-using-serial-console.md#SysRq)（Linux 实例）或 [重启 Amazon EC2 实例](ec2-instance-reboot.md)。

1. （仅限 Linux 实例）在 `login` 提示符下，输入您[之前设置](configure-access-to-serial-console.md#set-user-password)的、基于密码的用户的用户名，然后按 **Enter** 键。

1. （仅限 Linux 实例）在 `Password` 提示符下，输入密码，然后按 **Enter** 键。

## 使用您自己的密钥和 SSH 客户端进行连接
<a name="sc-connect-SSH"></a>

您可以使用自己的 SSH 密钥，并在使用 串行控制台 API 时从您选择的 SSH 客户端连接到您的实例。这使您能够从将公有密钥推送到实例的串行控制台功能中受益。

将 SSH 密钥推送到实例后，SSH 连接不受您配置用于授予用户 EC2 Serial Console 访问权限的 IAM 策略约束。

**开始前的准备工作**  
验证是否满足[先决条件](ec2-serial-console-prerequisites.md)。

**使用 SSH 连接到实例的串行控制台**

1. **将 SSH 公钥推送到实例以启动串行控制台会话**

   使用 [send-serial-console-ssh-public-key](https://docs.aws.amazon.com/cli/latest/reference/ec2-instance-connect/send-serial-console-ssh-public-key.html) 命令可将 SSH 公有密钥推送到实例。这将启动串行控制台会话。

   如果已为此实例启动串行控制台会话，则该命令将失败，因为您每次只能打开一个会话。在断开与串行控制台的连接后，需要 30 秒钟来停用会话，然后才能允许新会话。

   ```
   aws ec2-instance-connect send-serial-console-ssh-public-key \
       --instance-id i-001234a4bf70dec41EXAMPLE \
       --serial-port 0 \
       --ssh-public-key file://my_key.pub \
       --region us-east-1
   ```

1. 

**使用私钥连接到串行控制台**

   在从串行控制台服务删除公钥之前，使用 **ssh** 命令连接到串行控制台。在移除之前，您有 60 秒钟的时间。

   使用与公钥对应的私钥。

   用户名格式为 `instance-id.port0`，其中包括实例 ID 和端口 0。在以下示例中，用户名为 `i-001234a4bf70dec41EXAMPLE.port0`。

   串行控制台服务的端点因区域而异。有关每个区域的端点，请参阅 [EC2 Serial Console 端点和指纹](#sc-endpoints-and-fingerprints) 表。在以下示例中，串行控制台服务位于 us-east-1 区域。

   ```
   ssh -i my_key i-001234a4bf70dec41EXAMPLE.port0@serial-console.ec2-instance-connect.us-east-1.aws
   ```

   以下示例使用 `timeout 3600` 将 SSH 会话设置为 1 小时后终止。会话终止后，会话期间启动的进程可能会继续在您的实例上运行。

   ```
   timeout 3600 ssh -i my_key i-001234a4bf70dec41EXAMPLE.port0@serial-console.ec2-instance-connect.us-east-1.aws
   ```

1. 

**（可选）验证指纹**

   首次连接到串行控制台时，系统会提示您验证指纹。您可以比较串行控制台指纹与为了进行验证而显示的指纹。如果这些指纹不匹配，则表示有人可能在试图实施“中间人”攻击。如果它们匹配，您可以放心地连接到串行控制台。

   以下指纹用于 us-east-1 区域中的串行控制台服务。有关每个区域的指纹，请参阅 [EC2 Serial Console 端点和指纹](#sc-endpoints-and-fingerprints)。

   ```
   SHA256:dXwn5ma/xadVMeBZGEru5l2gx+yI5LDiJaLUcz0FMmw
   ```

   该指纹仅在您第一次连接到串行控制台时出现。

1. 按 **Enter**。如果返回提示，则表示您已连接到串行控制台。

   如果保持黑屏，则可以使用以下信息来帮助解决连接到串行控制台的问题：
   + **检查您是否已配置了串行控制台的访问权限。**有关更多信息，请参阅 [配置对 EC2 Serial Console 的访问](configure-access-to-serial-console.md)。
   + （仅限 Linux 实例）**使用 SysRq 连接到串行控制台。**SysRq 不要求您使用 SSH 连接。有关更多信息，请参阅 [（Linux 实例）使用 SysRq 对您的实例进行故障排除SysRq (Linux)](troubleshoot-using-serial-console.md#SysRq)。
   + （仅限 Linux 实例）**重新启动 getty。**如果您对实例拥有 SSH 访问权限，则使用 SSH 连接到实例，然后使用以下命令重新启动 getty。

     ```
     [ec2-user ~]$ sudo systemctl restart serial-getty@ttyS0
     ```
   + **重启实例。**您可以使用 SysRq（仅限 Linux 实例）、EC2 控制台或 AWS CLI 重启实例 。有关更多信息，请参阅 [（Linux 实例）使用 SysRq 对您的实例进行故障排除SysRq (Linux)](troubleshoot-using-serial-console.md#SysRq)（仅限 Linux 实例）或 [重启 Amazon EC2 实例](ec2-instance-reboot.md)。

1. （仅限 Linux 实例）在 `login` 提示符下，输入您[之前设置](configure-access-to-serial-console.md#set-user-password)的、基于密码的用户的用户名，然后按 **Enter** 键。

1. （仅限 Linux 实例）在 `Password` 提示符下，输入密码，然后按 **Enter** 键。

## EC2 Serial Console 端点和指纹
<a name="sc-endpoints-and-fingerprints"></a>

以下是 EC2 Serial Console 的服务端点和指纹。要以编程方式连接到实例的串行控制台，请使用 EC2 Serial Console 端点。EC2 Serial Console 端点和指纹对每个 AWS 区域都是唯一的。


| 区域名称 | 区域 | 端点 | 指纹 | 
| --- | --- | --- | --- | 
| 美国东部（俄亥俄州） | us-east-2 | serial-console.ec2-instance-connect.us-east-2.aws | SHA256:EhwPkTzRtTY7TRSzz26XbB0/HvV9jRM7mCZN0xw/d/0 | 
| 美国东部（弗吉尼亚州北部） | us-east-1 | serial-console.ec2-instance-connect.us-east-1.aws | SHA256:dXwn5ma/xadVMeBZGEru5l2gx\$1yI5LDiJaLUcz0FMmw | 
| 美国西部（北加利福尼亚） | us-west-1 | serial-console.ec2-instance-connect.us-west-1.aws | SHA256:OHldlcMET8u7QLSX3jmRTRAPFHVtqbyoLZBMUCqiH3Y | 
| 美国西部（俄勒冈州） | us-west-2 | serial-console.ec2-instance-connect.us-west-2.aws | SHA256:EMCIe23TqKaBI6yGHainqZcMwqNkDhhAVHa1O2JxVUc | 
| 非洲（开普敦） | af-south-1 | ec2-serial-console.af-south-1.api.aws | SHA256:RMWWZ2fVePeJUqzjO5jL2KIgXsczoHlz21Ed00biiWI | 
| 亚太地区（香港） | ap-east-1 | ec2-serial-console.ap-east-1.api.aws | SHA256:T0Q1lpiXxChoZHplnAkjbP7tkm2xXViC9bJFsjYnifk | 
| 亚太地区（海得拉巴） | ap-south-2 | ec2-serial-console.ap-south-2.api.aws | SHA256:WJgPBSwV4/shN\$1OPITValoewAuYj15DVW845JEhDKRs | 
| 亚太地区（雅加达） | ap-southeast-3 | ec2-serial-console.ap-southeast-3.api.aws | SHA256:5ZwgrCh\$1lfns32XITqL/4O0zIfbx4bZgsYFqy3o8mIk | 
| 亚太地区（马来西亚） | ap-southeast-5 | ec2-serial-console.ap-southeast-5.api.aws | SHA256:cQXTHQMRcqRdIjmAGoAMBSExeoRobYyRwT67yTjnEiA | 
| 亚太地区（墨尔本） | ap-southeast-4 | ec2-serial-console.ap-southeast-4.api.aws | SHA256:Avaq27hFgLvjn5gTSShZ0oV7h90p0GG46wfOeT6ZJvM | 
| 亚太地区（孟买） | ap-south-1 | serial-console.ec2-instance-connect.ap-south-1.aws | SHA256:oBLXcYmklqHHEbliARxEgH8IsO51rezTPiSM35BsU40 | 
| 亚太地区（大阪） | ap-northeast-3 | ec2-serial-console.ap-northeast-3.api.aws | SHA256:Am0/jiBKBnBuFnHr9aXsgEV3G8Tu/vVHFXE/3UcyjsQ | 
| 亚太地区（首尔） | ap-northeast-2 | serial-console.ec2-instance-connect.ap-northeast-2.aws | SHA256:FoqWXNX\$1DZ\$1\$1GuNTztg9PK49WYMqBX\$1FrcZM2dSrqrI | 
| 亚太地区（新加坡） | ap-southeast-1 | serial-console.ec2-instance-connect.ap-southeast-1.aws | SHA256:PLFNn7WnCQDHx3qmwLu1Gy/O8TUX7LQgZuaC6L45CoY | 
| 亚太地区（悉尼） | ap-southeast-2 | serial-console.ec2-instance-connect.ap-southeast-2.aws | SHA256:yFvMwUK9lEUQjQTRoXXzuN\$1cW9/VSe9W984Cf5Tgzo4 | 
| 亚太地区（泰国） | ap-southeast-7 | ec2-serial-console.ap-southeast-7.api.aws | SHA256:KCAZiRYrR1Q2lqsg7vTwixWmvc2wmjVT31XRgSdEfDY | 
| 亚太地区（东京） | ap-northeast-1 | serial-console.ec2-instance-connect.ap-northeast-1.aws | SHA256:RQfsDCZTOfQawewTRDV1t9Em/HMrFQe\$1CRlIOT5um4k | 
| 加拿大（中部） | ca-central-1 | serial-console.ec2-instance-connect.ca-central-1.aws | SHA256:P2O2jOZwmpMwkpO6YW738FIOTHdUTyEv2gczYMMO7s4 | 
| 加拿大西部（卡尔加里） | ca-west-1 | ec2-serial-console.ca-west-1.api.aws | SHA256:s3rc8lI2xhbhr3iedjJNxGAFLPGOLjx7IxxXrGckk6Q | 
| 中国（北京） | cn-north-1 | ec2-serial-console---cn-north-1---api.amazonwebservices.com.rproxy.govskope.ca.cn | SHA256:2gHVFy4H7uU3\$1WaFUxD28v/ggMeqjvSlgngpgLgGT\$1Y | 
| 中国（宁夏） | cn-northwest-1 | ec2-serial-console---cn-northwest-1---api.amazonwebservices.com.rproxy.govskope.ca.cn | SHA256:TdgrNZkiQOdVfYEBUhO4SzUA09VWI5rYOZGTogpwmiM | 
| 欧洲地区（法兰克福） | eu-central-1 | serial-console.ec2-instance-connect.eu-central-1.aws | SHA256:aCMFS/yIcOdOlkXvOl8AmZ1Toe\$1bBnrJJ3Fy0k0De2c | 
| 欧洲地区（爱尔兰） | eu-west-1 | serial-console.ec2-instance-connect.eu-west-1.aws | SHA256:h2AaGAWO4Hathhtm6ezs3Bj7udgUxi2qTrHjZAwCW6E | 
| 欧洲（伦敦） | eu-west-2 | serial-console.ec2-instance-connect.eu-west-2.aws | SHA256:a69rd5CE/AEG4Amm53I6lkD1ZPvS/BCV3tTPW2RnJg8 | 
| 欧洲地区（米兰） | eu-south-1 | ec2-serial-console.eu-south-1.api.aws | SHA256:lC0kOVJnpgFyBVrxn0A7n99ecLbXSX95cuuS7X7QK30 | 
| 欧洲地区（巴黎） | eu-west-3 | serial-console.ec2-instance-connect.eu-west-3.aws | SHA256:q8ldnAf9pymeNe8BnFVngY3RPAr/kxswJUzfrlxeEWs | 
| 欧洲（西班牙） | eu-south-2 | ec2-serial-console.eu-south-2.api.aws | SHA256:GoCW2DFRlu669QNxqFxEcsR6fZUz/4F4n7T45ZcwoEc | 
| 欧洲地区（斯德哥尔摩） | eu-north-1 | serial-console.ec2-instance-connect.eu-north-1.aws | SHA256:tkGFFUVUDvocDiGSS3Cu8Gdl6w2uI32EPNpKFKLwX84 | 
| 欧洲（苏黎世） | eu-central-2 | ec2-serial-console.eu-central-2.api.aws | SHA256:8Ppx2mBMf6WdCw0NUlzKfwM4/IfRz4OaXFutQXWp6mk | 
| 以色列（特拉维夫） | il-central-1 | ec2-serial-console.il-central-1.api.aws | SHA256:JR6q8v6kNNPi8\$1QSFQ4dj5dimNmZPTgwgsM1SNvtYyU | 
| 墨西哥（中部） | mx-central-1 | ec2-serial-console.mx-central-1.api.aws | SHA256:BCuVl13iQNk\$1CcVnt18Ef4p2ZHUrBBAOxlFetB32GS0 | 
| 中东（巴林） | me-south-1 | ec2-serial-console.me-south-1.api.aws | SHA256:nPjLLKHu2QnLdUq2kVArsoK5xvPJOMRJKCBzCDqC3k8 | 
| 中东（阿联酋） | me-central-1 | ec2-serial-console.me-central-1.api.aws | SHA256:zpb5duKiBZ\$1l0dFwPeyykB4MPBYhI/XzXNeFSDKBvLE | 
| 南美洲（圣保罗） | sa-east-1 | serial-console.ec2-instance-connect.sa-east-1.aws | SHA256:rd2\$1/32Ognjew1yVIemENaQzC\$1Botbih62OqAPDq1dI | 
| AWS GovCloud（美国东部） | us-gov-east-1 | serial-console.ec2-instance-connect.us-gov-east-1.amazonaws.com | SHA256:tIwe19GWsoyLClrtvu38YEEh\$1DHIkqnDcZnmtebvF28 | 
| AWS GovCloud（美国西部） | us-gov-west-1 | serial-console.ec2-instance-connect.us-gov-west-1.amazonaws.com | SHA256:kfOFRWLaOZfB\$1utbd3bRf8OlPf8nGO2YZLqXZiIw5DQ | 

# 断开与 EC2 Serial Console 的连接
<a name="disconnect-serial-console-session"></a>

如果您不再需要连接到实例的 EC2 Serial Console，则可以断开连接。当您断开与串行控制台的连接时，在该实例上运行的所有 shell 会话都将继续运行。如果要结束 shell 会话，则需要先结束会话，然后再断开与串行控制台的连接。

**注意事项**
+ 串行控制台连接通常会持续一小时，除非您断开连接。但是，在系统维护期间，Amazon EC2 将断开串行控制台会话。
+ 在断开与串行控制台的连接后，需要 30 秒钟来停用会话，然后才能允许新会话。

从串行控制台断开连接的方法取决于客户端。

**基于浏览器的客户端**  
要断开串行控制台，请关闭串行控制台浏览器内终端窗口。

**标准 OpenSSH 客户端**  
要断开串行控制台，请使用以下命令关闭 SSH 连接。此命令必须在换行之后立即运行。

```
~.
```

您用于关闭 SSH 连接的命令可能会有所不同，取决于您正在使用的 SSH 客户端。

# 使用 EC2 Serial Console 对 Amazon EC2 实例进行故障排查
<a name="troubleshoot-using-serial-console"></a>

通过使用 EC2 Serial Console，您可以通过连接到实例的串行端口来排查启动、网络配置和其他方面的问题。

请使用适用于实例操作系统和在实例上配置的工具的说明。

**Topics**
+ [GRUB (Linux)](#grub)
+ [SysRq (Linux)](#SysRq)
+ [SAC (Windows)](#troubleshooting-sac)

**先决条件**  
开始之前，请确保您已完成[先决条件](ec2-serial-console-prerequisites.md)，包括配置您选择的故障排除工具。

## （Linux 实例）使用 GRUB 对您的实例进行故障排除
<a name="grub"></a>

GNU GRUB（GNU GRand Unified Bootloader [统一引导加载程序] 的缩写，通常称为 GRUB）是大多数 Linux 操作系统的默认引导加载程序。从 GRUB 菜单中，您可以选择要引导到哪个内核，或修改菜单项以更改内核的启动方式。这在对失败的实例进行故障排查时非常有用。

在引导流程中将显示 GRUB 菜单。该菜单无法通过普通 SSH 访问，但您可以通过 EC2 Serial Console 访问。

启动到单用户模式或紧急模式。单用户模式将在较低的运行级别启动内核。例如，它可能会挂载文件系统，但不会激活网络，从而使您有机会执行修复实例所需的维护。紧急模式与单用户模式类似，只是内核在可达到的最低运行级别运行。

**启动到单用户模式**

1. [连接到](connect-to-serial-console.md)实例的串行控制台。

1. 使用以下命令重新引导实例。

   ```
   [ec2-user ~]$ sudo reboot
   ```

1. 在重新启动期间，当 GRUB 菜单出现时，按任意键停止引导流程。

1. 在 GRUB 菜单中，使用箭头键选择要引导的内核，然后按键盘上的 `e`。

1. 使用箭头键将光标定位在包含内核的行上。该行以 `linux` 或 `linux16` 开头，取决于启动实例所使用的 AMI。对于 Ubuntu，有两行开头为 `linux`，必须在下一步中修改。

1. 在行末添加 `single` 一词。

   以下是 Amazon Linux 2 的示例。

   ```
   linux /boot/vmlinuz-4.14.193-149.317.amzn2.aarch64 root=UUID=d33f9c9a-\
   dadd-4499-938d-ebbf42c3e499 ro  console=tty0 console=ttyS0,115200n8 net.ifname\
   s=0 biosdevname=0 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.she\
   ll=0 single
   ```

1. 按 **Ctrl\$1X** 可启动到单用户模式。

1. 在 `login` 提示符下，输入您[之前设置](configure-access-to-serial-console.md#set-user-password)的、基于密码的用户的用户名，然后按 **Enter** 键。

1. 在 `Password` 提示符下，输入密码，然后按 **Enter** 键。

 

**启动到紧急模式**  
请按照与单用户模式相同的步骤操作，但在第 6 步中添加单词 `emergency` 而不是 `single`。

## （Linux 实例）使用 SysRq 对您的实例进行故障排除
<a name="SysRq"></a>

系统请求 (SysRq) 键（有时称为“magic SysRq”）可用于在 Shell 外直接向内核发送命令，无论内核正在执行什么操作，内核都会响应。例如，如果实例已停止响应，则可以使用 SysRq 密钥告诉内核崩溃或重新启动。有关更多信息，请参阅 Wikipedia 中的 [Magic SysRq 键](https://en.wikipedia.org/wiki/Magic_SysRq_key)。

您可以在基于 EC2 Serial Console 浏览器的客户端中或 SSH 客户端中使用 SysRq 命令。每个客户端发送中断请求的命令都不同。

要使用 SysRq，请根据您正在使用的客户端选择以下程序之一。

------
#### [ Browser-based client ]

**在串行控制台基于浏览器的客户端中使用 SysRq**

1. [连接到](connect-to-serial-console.md)实例的串行控制台。

1. 要发送中断请求，请按 `CTRL+0`（零）。如果您的键盘支持，还可以使用暂停或中断键发送中断请求。

   ```
   [ec2-user ~]$ CTRL+0
   ```

1. 要发出 SysRq 命令，请按键盘上与所需命令对应的键。例如，要显示 SysRq 命令列表，请按 `h`。

   ```
   [ec2-user ~]$ h
   ```

   `h` 命令的输出类似于以下内容。

   ```
   [ 1169.389495] sysrq: HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems
   (j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r
   ) sync(s) show-task-states(t) unmount(u) show-blocked-tasks(w) dump-ftrace-buffer(z)
   ```

------
#### [ SSH client ]

**在 SSH 客户端中使用 SysRq**

1. [连接到](connect-to-serial-console.md)实例的串行控制台。

1. 要发送中断请求，请按 `~B`（波浪号后跟大写 `B`）。

   ```
   [ec2-user ~]$ ~B
   ```

1. 要发出 SysRq 命令，请按键盘上与所需命令对应的键。例如，要显示 SysRq 命令列表，请按 `h`。

   ```
   [ec2-user ~]$ h
   ```

   `h` 命令的输出类似于以下内容。

   ```
   [ 1169.389495] sysrq: HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems
   (j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r
   ) sync(s) show-task-states(t) unmount(u) show-blocked-tasks(w) dump-ftrace-buffer(z)
   ```
**注意**  
您用于发送中断请求的命令可能会有所不同，取决于您正在使用的 SSH 客户端。

------

## （Windows 实例）使用 SAC 对您的实例进行故障排除
<a name="troubleshooting-sac"></a>

Windows 的特殊管理控制台 (SAC) 功能可用于对 Windows 实例进行故障排查。通过连接到实例的串行控制台并使用 SAC，您可以中断引导流程并在安全模式下启动 Windows。

**注意**  
如果您在实例上启用 SAC，则依赖密码检索的 EC2 服务将无法通过 Amazon EC2 控制台运行。Amazon EC2 启动代理（EC2Config、EC2Launch v1 和 EC2Launch v2）上的 Windows 依靠串行控制台来执行各种任务。当您在实例上启用 SAC 时，这些任务不会成功执行。有关 Amazon EC2 启动代理上的 Windows 的更多信息，请参阅 [配置您的 Amazon EC2 Windows 实例](ec2-windows-instances.md)。如果您启用 SAC，则可在之后将其禁用。有关更多信息，请参阅 [禁用 SAC 和启动菜单](#disable-sac-bootmenu)。

**Topics**
+ [使用 SAC](#use-sac)
+ [使用启动菜单](#use-boot-menu)
+ [禁用 SAC 和启动菜单](#disable-sac-bootmenu)

### 使用 SAC
<a name="use-sac"></a>

**使用 SAC**

1. [连接到串行控制台。](connect-to-serial-console.md)

   如果在实例上启用了 SAC，串行控制台将显示 `SAC>` 提示。  
![\[串行控制台中显示的 SAC 提示符。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/win-boot-3.png)

1. 要显示 SAC 命令，请输入 ?，然后按 **Enter**。

   预期输出  
![\[输入问号以显示 SAC 命令。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/win-boot-4.png)

1. 要创建命令提示符通道（例如 `cmd0001` 或 `cmd0002`），请输入 cmd，然后按 **Enter**。

1. 要查看命令提示符通道，请按 **ESC**，然后按 **TAB**。

   预期输出  
![\[命令提示符通道。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/win-boot-5.png)

1. 要切换通道，请同时按 **ESC\$1TAB\$1通道编号**。例如，要切换至 `cmd0002` 通道（如果已创建），请按 **ESC\$1TAB\$12**。

1. 输入命令提示符通道所需的凭证。  
![\[需要凭证的命令提示符。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/win-boot-6.png)

   命令提示符与您在桌面上获得的功能全面的命令 Shell 相同，例外之处是它不允许读取已输出的字符。  
![\[功能全面的命令 shell。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/win-boot-7.png)

**还可以从命令提示符使用 PowerShell。**

请注意，您可能需要将进度首选项设置为静默模式。

![\[命令提示符中的 PowerShell。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/win-boot-8.png)


### 使用启动菜单
<a name="use-boot-menu"></a>

如果实例已启用了启动菜单并在通过 SSH 连接后重新启动，则您应看到启动菜单，如下所示。

![\[命令提示符的启动菜单。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/win-boot-1.png)


**启动菜单命令**

ENTER  
启动操作系统的选定条目。

TAB  
切换到 Tools（工具）菜单。

ESC  
取消并重新启动实例。

按 ESC 后再按 8  
相当于按下 **F8**。显示所选项目的高级选项。

ESC 键 \$1 向左箭头  
返回到初始启动菜单。  
单靠 ESC 密钥不会让您返回主菜单，因为 Windows 正在等待查看转义序列是否正在进行中。

![\[高级启动选项。\]](http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/images/win-boot-2.png)


### 禁用 SAC 和启动菜单
<a name="disable-sac-bootmenu"></a>

如果您启用 SAC 和启动菜单，则可在之后将这些功能禁用。

使用以下方法之一在实例上禁用 SAC 和启动菜单。

------
#### [ PowerShell ]

**在 Windows 实例上禁用 SAC 和启动菜单**

1. [连接到](connecting_to_windows_instance.md)您的实例并从提升的 PowerShell 命令行执行以下步骤。

1. 首先，将值更改为 `no` 以禁用启动菜单。

   ```
   bcdedit /set '{bootmgr}' displaybootmenu no
   ```

1. 然后，将值更改为 `off` 以禁用 SAC。

   ```
   bcdedit /ems '{current}' off
   ```

1. 重新启动实例以应用更新后的配置。

   ```
   shutdown -r -t 0
   ```

------
#### [ Command prompt ]

**在 Windows 实例上禁用 SAC 和启动菜单**

1. [连接到](connecting_to_windows_instance.md)您的实例并从命令提示符执行以下步骤。

1. 首先，将值更改为 `no` 以禁用启动菜单。

   ```
   bcdedit /set {bootmgr} displaybootmenu no
   ```

1. 然后，将值更改为 `off` 以禁用 SAC。

   ```
   bcdedit /ems {current} off
   ```

1. 重新启动实例以应用更新后的配置。

   ```
   shutdown -r -t 0
   ```

------