

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 傳送診斷中斷以偵錯無法連線的 Amazon EC2 執行個體
<a name="diagnostic-interrupt"></a>

**警告**  
診斷中斷專供進階使用者使用。不正確的使用可能會對執行個體造成負面影響。將診斷中斷傳送至執行個體可能會觸發執行個體當機並重新開機，這會導致資料遺失。

您可以將診斷中斷傳送至無法連線或沒有回應的執行個體，以手動觸發 Linux 執行個體的*核心錯誤*，或 Windows 執行個體的*停止錯誤* (通常稱為*藍色畫面錯誤*)。

**Linux 執行個體**  
發生核心錯誤時，Linux 作業系統通常會當機並重新開機。作業系統的具體行為取決於其組態。核心錯誤也可用來促使執行個體的作業系統核心執行任務，例如產生損毀傾印檔案。然後，您可以利用損毀傾印檔案中的資訊來分析根本原因，對執行個體進行除錯。作業系統會代表執行個體本身在本機產生損毀傾印資料。

**Windows 執行個體**  
一般而言，Windows 作業系統在停止錯誤發生時會當機並重新開機，但具體行為取決於其組態。停止錯誤也會導致作業系統將除錯資訊 (例如核心記憶體傾印) 寫入檔案。然後，您可以利用此資訊來分析根本原因，以進行執行個體的除錯。作業系統會代表執行個體本身在本機產生記憶體傾印資料。

將診斷中斷傳送至執行個體之前，建議您先參閱作業系統的說明文件，然後進行必要的組態變更。

**Topics**
+ [支援的執行個體類型](#diagnostic-interrupt-instances)
+ [先決條件](#diagnostic-interrupt-prereqs)
+ [傳送診斷中斷](#diagnostic-interrupt-use)

## 支援的執行個體類型
<a name="diagnostic-interrupt-instances"></a>

所有 Nitro 型執行個體類型都支援診斷中斷，但採用 AWS Graviton 處理器的執行個體類型除外。如需詳細資訊，請參閱[建置在 AWS Nitro System 和 Graviton 上的執行個體](https://docs.aws.amazon.com/ec2/latest/instancetypes/ec2-nitro-instances.html)。 [AWS](https://aws.amazon.com/ec2/graviton/)

## 先決條件
<a name="diagnostic-interrupt-prereqs"></a>

使用診斷中斷之前，您必須設定執行個體的作業系統。這可確保在核心錯誤 (Linux 執行個體) 或停止錯誤 (Windows 執行個體) 時，其執行您需要的動作。

### Linux 執行個體
<a name="diagnostic-interrupt-prereqs-linux"></a>

**設定 Amazon Linux 2 或 Amazon Linux 2023 以在核心錯誤發生時產生損毀傾印**

1. 連線到您的執行個體。

1. 安裝 **kexec** 和 **kdump**。

   ```
   [ec2-user ~]$ sudo yum install kexec-tools -y
   ```

1. 設定核心保留適當的記憶體數量給次要核心。該保留的記憶體數量取決於執行個體可用的記憶體總數。使用您偏好的文字編輯器開啟 `/etc/default/grub` 檔案，找出開頭為 `GRUB_CMDLINE_LINUX_DEFAULT` 的那一行，然後依下列格式新增 `crashkernel` 參數：`crashkernel=memory_to_reserve`。例如，若要保留 `256MB`，請如下修改 `grub` 檔案：

   ```
   GRUB_CMDLINE_LINUX_DEFAULT="crashkernel=256M console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0"
   GRUB_TIMEOUT=0
   GRUB_DISABLE_RECOVERY="true"
   ```

1. 儲存變更並關閉 `grub` 檔案。

1. 重建 GRUB2 組態檔案。

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

1. 在以 Intel 和 AMD 處理器為架構的執行個體上，`send-diagnostic-interrupt` 命令會將 *unknown non-maskable interrupt* (NMI) 傳送至執行個體。您必須將核心設定為收到不明 NMI 時損毀。使用您偏好的文字編輯器開啟 `/etc/sysctl.conf` 檔案，然後新增下列命令。

   ```
   kernel.unknown_nmi_panic=1
   ```

1. 重新開機並重新連接您的執行個體。

1. 確認核心已使用正確的 `crashkernel` 參數開機。

   ```
   $ grep crashkernel /proc/cmdline
   ```

   下列輸出範例指出組態成功。

   ```
   BOOT_IMAGE=/boot/vmlinuz-4.14.128-112.105.amzn2.x86_64 root=UUID=a1e1011e-e38f-408e-878b-fed395b47ad6 ro crashkernel=256M console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0
   ```

1. 確認 **kdump** 服務在執行中。

   ```
   [ec2-user ~]$ systemctl status kdump.service
   ```

   下列輸出範例顯示 **kdump** 服務在執行中的結果。

   ```
   kdump.service - Crash recovery kernel arming
      Loaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendor preset: enabled)
      Active: active (exited) since Fri 2019-05-24 23:29:13 UTC; 22s ago
     Process: 2503 ExecStart=/usr/bin/kdumpctl start (code=exited, status=0/SUCCESS)
    Main PID: 2503 (code=exited, status=0/SUCCESS)
   ```

**注意**  
根據預設，損毀傾印檔案會儲存至 `/var/crash/`。若要變更位置，請使用您偏好的文字編輯器來修改 `/etc/kdump.conf` 檔案。

**設定 SUSE Linux Enterprise、Ubuntu 或 Red Hat Enterprise Linux**  
在以 Intel 和 AMD 處理器為架構的執行個體上，`send-diagnostic-interrupt` 命令會將 *unknown non-maskable interrupt* (NMI) 傳送至執行個體。您必須透過調整作業系統的組態檔案，將核心設定為在收到未知 NMI 時損毀。如需如何設定以損毀核心的詳細資訊，請參閱作業系統的文件：
+ [SUSE Linux Enterprise](https://www.suse.com/support/kb/doc/?id=3374462)
+ [Ubuntu](https://ubuntu.com/server/docs/kernel-crash-dump)
+ [ Red Hat Enterprise Linux (RHEL)](https://access.redhat.com/solutions/6038)

### Windows 執行個體
<a name="diagnostic-interrupt-prereqs-windows"></a>

**設定 Windows 在停止錯誤發生時產生記憶體傾印**

1. 連線到您的執行個體。

1. 開啟**控制台**，選擇**系統**、**進階系統設定**。

1. 在**系統內容**對話方塊中，選擇**進階**索引標籤。

1. 在**啟動及修復**區段中，選擇**設定...**。

1. 在**系統失敗**區段中，視需要進行設定，然後選擇**確定**。

如需有關設定 Windows 停止錯誤的詳細資訊，請參閱 [Windows 記憶體傾印檔案選項的概觀](https://support.microsoft.com/en-us/help/254649/overview-of-memory-dump-file-options-for-windows)。

## 傳送診斷中斷
<a name="diagnostic-interrupt-use"></a>

完成必要的組態變更後，您可以使用 AWS CLI 或 Amazon EC2 API 將診斷中斷傳送至執行個體。

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

**將診斷中斷傳送至執行個體**  
使用 [send-diagnostic-interrupt](https://docs.aws.amazon.com/cli/latest/reference/ec2/send-diagnostic-interrupt.html) 命令。

```
aws ec2 send-diagnostic-interrupt --instance-id i-1234567890abcdef0
```

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

**將診斷中斷傳送至執行個體**  
使用 [Send-EC2DiagnosticInterrupt](https://docs.aws.amazon.com/powershell/latest/reference/items/Send-EC2DiagnosticInterrupt.html) cmdlet。

```
Send-EC2DiagnosticInterrupt -InstanceId i-1234567890abcdef0
```

------