识别 EC2 Linux 实例 - Amazon Elastic Compute Cloud

识别 EC2 Linux 实例

您可能需要确定您的应用程序是否运行在 EC2 实例上。

有关识别 Windows 实例的信息,请参阅Amazon EC2 用户指南(适用于 Windows 实例)中的识别 EC2 Windows 实例

检查 实例身份文档

对于标识 EC2 实例的明确且以加密方式验证的方法,请查看实例标识文档,包括其签名。这些文档适用于本地、不可路由地址 http://169.254.169.254/latest/dynamic/instance-identity/ 处的每个 EC2 实例。有关更多信息,请参阅实例身份文档

检查系统 UUID

您可以获取系统 UUID 并检查 UUID 的起始 octet 中是否存在字符 “ec2”或 “EC2”。此确定系统是否为 EC2 实例的方法速度快,但可能不准确,因为不是 EC2 实例的系统也有很小的几率使用以这些字符开头的 UUID。此外,对于不使用 Amazon Linux 2 的 EC2 实例,发行版的 SMBIOS 实施可能表示 little-endian 格式的 UUID,因此“EC2”字符不显示在 UUID 的开头。

例 :从 DMI 获取 UUID(仅限 HVM AMI)

通过以下命令使用桌面管理界面 (DMI) 获取 UUID:

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

在以下示例输出中,UUID 以“EC2”开头,表示该系统可能是 EC2 实例。

EC2E1916-9099-7CAF-FD21-012345ABCDEF

在以下示例输出中,UUID 以 little-endian 格式表示。

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

或者,对于在 Nitro 系统上构建的实例,您可以使用以下命令:

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

如果输出是实例 ID,如下面的示例输出所示,则说明系统是 EC2 实例:

i-0af01c0123456789a
例 :从管理程序获取 UUID(仅限 PV AMI)

使用以下命令从管理程序获取 UUID:

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

在以下示例输出中,UUID 以“ec2”开头,表示该系统可能是 EC2 实例。

ec2e1916-9099-7caf-fd21-012345abcdef

检查系统虚拟机生成标识符

虚拟机生成标识符由被解释为加密随机整数标识符的 128 位的唯一缓冲区组成。您可以检索虚拟机生成标识符来识别 Amazon Elastic Compute Cloud 实例。生成标识符通过 ACPI 表条目在实例的来宾操作系统中公开。如果您的计算机被克隆、复制或导入到 AWS,例如使用 VM Import/Export,该值将改变。

例 :从 Linux 中检索虚拟机生成标识符

您可以使用以下命令从运行 Linux 的实例中检索虚拟机生成标识符。

Amazon Linux 2
  1. 根据需要,使用以下命令更新现有软件包:

    sudo yum update
  2. 如有必要,使用以下命令获取 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
  3. 如有必要,使用以下命令安装必备软件包:

    sudo yum install busybox.rpm iasl -y
  4. 运行以下 iasl 命令从 ACPI 表中生成输出:

    sudo iasl -p ./SSDT2 -d /sys/firmware/acpi/tables/SSDT2
  5. 运行以下命令以查看 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
                })
            }
        }
    }
  6. (可选)使用以下命令提升终端对剩余步骤的权限:

    sudo -s
  7. 使用以下命令存储以前收集的地址空间:

    VMGN_ADDR=0xFED01000
  8. 使用以下命令迭代地址空间并构建虚拟机生成标识符:

    for offset in 0x0 0x4 0x8 0xc; do busybox devmem $(($VMGN_ADDR + $offset)) | sed 's/0x//' | sed -z '$ s/\n$//' >> vmgenid; done
  9. 使用以下命令从输出文件中检索虚拟机生成标识符:

    cat vmgenid ; echo

    您的输出应类似于以下内容:

    EC2F335D979132C4165896753E72BD1C
Ubuntu
  1. 根据需要,使用以下命令更新现有软件包:

    sudo apt update
  2. 如有必要,使用以下命令安装必备软件包:

    sudo apt install busybox iasl -y
  3. 运行以下 iasl 命令从 ACPI 表中生成输出:

    sudo iasl -p ./SSDT2 -d /sys/firmware/acpi/tables/SSDT2
  4. 运行以下命令以查看 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
                })
            }
        }
    }
  5. (可选)使用以下命令提升终端对剩余步骤的权限:

    sudo -s
  6. 使用以下命令存储以前收集的地址空间:

    VMGN_ADDR=0xFED01000
  7. 使用以下命令迭代地址空间并构建虚拟机生成标识符:

    for offset in 0x0 0x4 0x8 0xc; do busybox devmem $(($VMGN_ADDR + $offset)) | sed 's/0x//' | sed -z '$ s/\n$//' >> vmgenid; done
  8. 使用以下命令从输出文件中检索虚拟机生成标识符:

    cat vmgenid ; echo

    您的输出应类似于以下内容:

    EC2F335D979132C4165896753E72BD1C