

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

# 偵測主機是否為 EC2 執行個體
<a name="identify_ec2_instances"></a>

您可能需要知道應用程式或網站是否在 EC2 執行個體上執行，特別是如果您是在混合運算環境。您可以使用下列其中一個選項，判斷應用程式或網站的主機是否為 EC2 執行個體。

**Topics**
+ [檢查 執行個體身分文件](#inspect-instance-identity-document)
+ [檢查系統 UUID](#inspect-uuid)
+ [檢查系統虛擬機器產生識別符](#vm-generation-id)

## 檢查 執行個體身分文件
<a name="inspect-instance-identity-document"></a>

每個執行個體都有已簽署的執行個體身分文件，您可以用密碼編譯方式進行驗證。您可以使用執行個體中繼資料服務 (IMDS) 來尋找這些文件。

如需詳細資訊，請參閱[執行個體身分文件](instance-identity-documents.md)。

## 檢查系統 UUID
<a name="inspect-uuid"></a>

您可以取得系統 UUID，並在 UUID 的開頭八位元組查看 `EC2` (在 Linux 中，這可能是小寫 `ec2`)。這是一項快速方法，但有可能會不準確，因為不是 EC2 執行個體的系統，也有可能會具有以這些字元開頭的 UUID。此外，某些版本的 SMBIOS 使用*小端序*格式，其在 UUID 開頭並不包含 `EC2`。對於使用 SMBIOS 2.4 for Windows 的 EC2 執行個體，或具有自己 SMBIOS 實作的 Amazon Linux 以外的 Linux 發行版本，可能會是這種情況。

**Linux 範例：從 DMI 取得 UUID (僅限 HVM AMI)**  
運用下列命令來透過桌面管理介面 (DMI) 取得 UUID：

```
[ec2-user ~]$ sudo dmidecode --string system-uuid
```

在下列的範例輸出中，UUID 是以「EC2」開頭，這代表系統可能是 EC2 執行個體。

```
EC2E1916-9099-7CAF-FD21-012345ABCDEF
```

在下列的範例輸出中，是以小端序格式來表示 UUID。

```
45E12AEC-DCD1-B213-94ED-012345ABCDEF
```

或者，對於建立在 Nitro 系統上的執行個體，您可以使用下列命令：

```
[ec2-user ~]$ cat /sys/devices/virtual/dmi/id/board_asset_tag
```

如果輸出為執行個體 ID，如下列範例輸出，則系統為 EC2 執行個體：

```
i-0af01c0123456789a
```

**Linux 範例：從 hypervisor 取得 UUID (僅限 PV AMI)**  
使用下列命令從 hypervisor 取得 UUID：

```
[ec2-user ~]$ cat /sys/hypervisor/uuid
```

在下列的範例輸出中，UUID 是以「ec2」開頭，這代表系統可能是 EC2 執行個體。

```
ec2e1916-9099-7caf-fd21-012345abcdef
```

**Windows 範例：使用 WMI 或 Windows PowerShell 來取得 UUID**  
使用 Windows Management Instrumentation (Windows 管理規範) 命令列 (WMIC)，如下所示：

```
wmic path win32_computersystemproduct get uuid
```

或者，如果使用 Windows PowerShell，請使用 **Get-WmiObject** cmdlet，如下所示：

```
PS C:\> Get-WmiObject -query "select uuid from Win32_ComputerSystemProduct" | Select UUID
```

在下列的範例輸出中，UUID 是以「EC2」開頭，這代表系統可能是 EC2 執行個體。

```
EC2AE145-D1DC-13B2-94ED-012345ABCDEF
```

如果是使用 SMBIOS 2.4 的執行個體，可能會以小端序格式來表示 UUID，例如：

```
45E12AEC-DCD1-B213-94ED-012345ABCDEF
```

## 檢查系統虛擬機器產生識別符
<a name="vm-generation-id"></a>

虛擬機器產生識別符由 128 位元的專屬緩衝區組成，該緩衝區解譯為加密隨機整數識別符。您可以擷取虛擬機器產生識別符以識別您的 Amazon Elastic Compute Cloud 執行個體。產生識別符透過 ACPI 表項目在執行個體的訪客作業系統中公開。若您的電腦被複製或匯入到 AWS(例如使用 [VM Import/Export](https://docs.aws.amazon.com/vm-import/latest/userguide/what-is-vmimport.html))，那麼值就會改變。

**範例：從 Linux 擷取虛擬機器產生識別符**  
您可使用以下命令從執行 Linux 的執行個體中擷取虛擬機器產生識別符。

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

1. 根據需要，使用以下命令更新現有軟體套件：

   ```
   sudo yum update
   ```

1. 如有必要，使用下列命令以 busybox 套件作為來源：

   ```
   sudo curl https://www.rpmfind.net/linux/epel/next/8/Everything/x86_64/Packages/b/busybox-1.35.0-2.el8.next.x86_64.rpm --output busybox.rpm
   ```

1. 如有必要，使用下列命令安裝必要條件套件：

   ```
   sudo yum install busybox.rpm iasl -y
   ```

1. 執行下列 `iasl` 命令從 ACPI 表產生輸出結果：

   ```
   sudo iasl -p ./SSDT2 -d /sys/firmware/acpi/tables/SSDT2
   ```

1. 執行下列命令，以檢閱 `iasl` 命令的輸出結果：

   ```
   cat SSDT2.dsl
   ```

   輸出結果應產生擷取虛擬機器產生識別符所需的地址空間：

   ```
   Intel ACPI Component Architecture
   ASL+ Optimizing Compiler/Disassembler version 20190509
   Copyright (c) 2000 - 2019 Intel Corporation
   
   File appears to be binary: found 32 non-ASCII characters, disassembling
   Binary file appears to be a valid ACPI table, disassembling
   Input file /sys/firmware/acpi/tables/SSDT2, Length 0x7B (123) bytes
   ACPI: SSDT 0x0000000000000000 00007B (v01 AMAZON AMZNSSDT 00000001 AMZN 00000001)
   Pass 1 parse of [SSDT]
   Pass 2 parse of [SSDT]
   Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions)
   
   Parsing completed
   Disassembly completed
   ASL Output:    ./SSDT2.dsl - 1065 bytes
   $
   /*
   * Intel ACPI Component Architecture
   * AML/ASL+ Disassembler version 20190509 (64-bit version)
   * Copyright (c) 2000 - 2019 Intel Corporation
   *
   * Disassembling to symbolic ASL+ operators
   *
   * Disassembly of /sys/firmware/acpi/tables/SSDT2, Tue Mar 29 16:15:14 2022
   *
   * Original Table Header:
   *     Signature        "SSDT"
   *     Length           0x0000007B (123)
   *     Revision         0x01
   *     Checksum         0xB8
   *     OEM ID           "AMAZON"
   *     OEM Table ID     "AMZNSSDT"
   *     OEM Revision     0x00000001 (1)
   *     Compiler ID      "AMZN"
   *     Compiler Version 0x00000001 (1)
   */
   DefinitionBlock ("", "SSDT", 1, "AMAZON", "AMZNSSDT", 0x00000001)
   {
   Scope (\_SB)
   {
       Device (VMGN)
       {
           Name (_CID, "VM_Gen_Counter")  // _CID: Compatible ID
           Name (_DDN, "VM_Gen_Counter")  // _DDN: DOS Device Name
           Name (_HID, "AMZN0000")  // _HID: Hardware ID
           Name (ADDR, Package (0x02)
           {
               0xFED01000,
               Zero
           })
       }
   }
   }
   ```

1. (選用) 使用下列命令提升其餘步驟的終端許可：

   ```
   sudo -s
   ```

1. 使用下列命令存放先前收集的地址空間：

   ```
   VMGN_ADDR=0xFED01000
   ```

1. 使用下列命令重複執行地址空間並建置虛擬機器產生識別符：

   ```
   for offset in 0x0 0x4 0x8 0xc; do busybox devmem $(($VMGN_ADDR + $offset)) | sed 's/0x//' | sed -z '$ s/\n$//' >> vmgenid; done
   ```

1. 使用下列命令從輸出檔案中擷取虛擬機器產生識別符：

   ```
   cat vmgenid ; echo
   ```

   您的輸出應類似以下內容：

   ```
   EC2F335D979132C4165896753E72BD1C
   ```

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

1. 根據需要，使用以下命令更新現有軟體套件：

   ```
   sudo apt update
   ```

1. 如有必要，使用下列命令安裝必要條件套件：

   ```
   sudo apt install busybox iasl -y
   ```

1. 執行下列 `iasl` 命令從 ACPI 表產生輸出結果：

   ```
   sudo iasl -p ./SSDT2 -d /sys/firmware/acpi/tables/SSDT2
   ```

1. 執行下列命令，以檢閱 `iasl` 命令的輸出結果：

   ```
   cat SSDT2.dsl
   ```

   輸出結果應產生擷取虛擬機器產生識別符所需的地址空間：

   ```
   Intel ACPI Component Architecture
   ASL+ Optimizing Compiler/Disassembler version 20190509
   Copyright (c) 2000 - 2019 Intel Corporation
   
   File appears to be binary: found 32 non-ASCII characters, disassembling
   Binary file appears to be a valid ACPI table, disassembling
   Input file /sys/firmware/acpi/tables/SSDT2, Length 0x7B (123) bytes
   ACPI: SSDT 0x0000000000000000 00007B (v01 AMAZON AMZNSSDT 00000001 AMZN 00000001)
   Pass 1 parse of [SSDT]
   Pass 2 parse of [SSDT]
   Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions)
   
   Parsing completed
   Disassembly completed
   ASL Output:    ./SSDT2.dsl - 1065 bytes
   $
   /*
   * Intel ACPI Component Architecture
   * AML/ASL+ Disassembler version 20190509 (64-bit version)
   * Copyright (c) 2000 - 2019 Intel Corporation
   *
   * Disassembling to symbolic ASL+ operators
   *
   * Disassembly of /sys/firmware/acpi/tables/SSDT2, Tue Mar 29 16:15:14 2022
   *
   * Original Table Header:
   *     Signature        "SSDT"
   *     Length           0x0000007B (123)
   *     Revision         0x01
   *     Checksum         0xB8
   *     OEM ID           "AMAZON"
   *     OEM Table ID     "AMZNSSDT"
   *     OEM Revision     0x00000001 (1)
   *     Compiler ID      "AMZN"
   *     Compiler Version 0x00000001 (1)
   */
   DefinitionBlock ("", "SSDT", 1, "AMAZON", "AMZNSSDT", 0x00000001)
   {
   Scope (\_SB)
   {
       Device (VMGN)
       {
           Name (_CID, "VM_Gen_Counter")  // _CID: Compatible ID
           Name (_DDN, "VM_Gen_Counter")  // _DDN: DOS Device Name
           Name (_HID, "AMZN0000")  // _HID: Hardware ID
           Name (ADDR, Package (0x02)
           {
               0xFED01000,
               Zero
           })
       }
   }
   }
   ```

1. (選用) 使用下列命令提升其餘步驟的終端許可：

   ```
   sudo -s
   ```

1. 使用下列命令存放先前收集的地址空間：

   ```
   VMGN_ADDR=0xFED01000
   ```

1. 使用下列命令重複執行地址空間並建置虛擬機器產生識別符：

   ```
   for offset in 0x0 0x4 0x8 0xc; do busybox devmem $(($VMGN_ADDR + $offset)) | sed 's/0x//' | sed -z '$ s/\n$//' >> vmgenid; done
   ```

1. 使用下列命令從輸出檔案中擷取虛擬機器產生識別符：

   ```
   cat vmgenid ; echo
   ```

   您的輸出應類似以下內容：

   ```
   EC2F335D979132C4165896753E72BD1C
   ```

------

**範例：從 Windows 擷取虛擬機器產生識別符**  


您可建立範例應用程式，從執行 Windows 的執行個體中擷取虛擬機器產生識別符。如需詳細資訊，請參閱 Microsoft 文件集中的「[取得虛擬機器產生識別符](https://learn.microsoft.com/en-us/windows/win32/hyperv_v2/virtual-machine-generation-identifier#obtaining-the-virtual-machine-generation-identifier)」。