

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

# 使用 Amazon EC2 開機模式執行個體啟動行為
<a name="ami-boot"></a>

電腦開機時，第一個執行的軟體會負責初始化平台，並提供作業系統執行平台特定作業的介面。

在 Amazon EC2 中，支援兩種開機模式軟體：整合可延伸韌體介面 (UEFI) 和 Legacy BIOS。

**AMI 上可能的開機模式參數**  
AMI 可以有下列其中一個開機模式參數值：`uefi`、`legacy-bios` 或 `uefi-preferred`。AMI 開機模式參數為選用。針對沒有開機模式參數的 AMI，從這些 AMI 啟動的執行個體會使用執行個體類型的預設開機模式值。

**AMI 開機模式參數的用途**  
AMI 開機模式參數會向 Amazon EC2 發出訊號，這是在啟動執行個體時要使用的開機模式。當開機模式參數設定為 `uefi` 時，EC2 會嘗試在 UEFI 上啟動執行個體。如果作業系統未設定為支援 UEFI，則執行個體啟動將會失敗。

**UEFI 偏好的開機模式參數**  
您可以使用 `uefi-preferred` 開機模式參數來建立同時支援 UEFI 和 Legacy BIOS 的 AMI。當開機模式參數設定為 `uefi-preferred`，並且如果執行個體類型支援 UEFI，則會在 UEFI 上啟動執行個體。如果執行個體類型不支援 UEFI，則會在 Legacy BIOS 上啟動執行個體。

**警告**  
某些功能 (例如 UEFI 安全開機) 僅適用於透過 UEFI 開機的執行個體。當您將 `uefi-preferred` AMI 開機模式參數與不支援 UEFI 的執行個體類型搭配使用時，執行個體會以 Legacy BIOS 的形式啟動，而且會停用與 UEFI 相關的功能。如果您依賴 UEFI 相關功能的可用性，則請將 AMI 開機模式參數設定為 `uefi`。

**執行個體類型的預設開機模式**
+ Graviton 執行個體類型︰UEFI
+ Intel 和 AMD 執行個體類型：Legacy BIOS

**區域支援**  
在 Wavelength 區域或不支援 UEFI 啟動。

**Topics**
+ [在 UEFI 開機模式啟動 EC2 執行個體的需求](launch-instance-boot-mode.md)
+ [確定 Amazon EC2 AMI 的開機模式參數](ami-boot-mode.md)
+ [確定 EC2 執行個體類型的支援開機模式](instance-type-boot-mode.md)
+ [確定 EC2 執行個體的開機模式](instance-boot-mode.md)
+ [確定 EC2 執行個體作業系統的開機模式](os-boot-mode.md)
+ [設定 Amazon EC2 AMI 的開機模式](set-ami-boot-mode.md)
+ [Amazon EC2 執行個體的 UEFI 變數](uefi-variables.md)
+ [Amazon EC2 執行個體的 UEFI 安全開機](uefi-secure-boot.md)

# 在 UEFI 開機模式啟動 EC2 執行個體的需求
<a name="launch-instance-boot-mode"></a>

執行個體的開機模式取決於 AMI 的組態、其中包含的作業系統以及執行個體類型。若要在 UEFI 開機模式啟動執行個體，您必須符合下列需求。

**AMI**  
必須為 UEFI 設定 AMI，如下所示：  
+ **作業系統** - AMI 中包含的作業系統必須設定為使用 UEFI；否則，執行個體啟動將會失敗。如需詳細資訊，請參閱[確定 EC2 執行個體作業系統的開機模式](os-boot-mode.md)。
+ **AMI 開機模式參數** – AMI 的開機模式參數必須設定為 `uefi` 或 `uefi-preferred`。如需詳細資訊，請參閱[確定 Amazon EC2 AMI 的開機模式參數](ami-boot-mode.md)。
**Linux** - 下列 Linux AMI 支援 UEFI：  
+ Amazon Linux 2023
+ Amazon Linux 2 (僅限 Graviton 執行個體類型)
對於其他 Linux AMI，您必須[設定 AMI](set-ami-boot-mode.md)，透過 [VM Import/Export](https://docs.aws.amazon.com/vm-import/latest/userguide/) 匯入 AMI，或透過 [CloudEndure](https://docs.cloudendure.com/) 匯入 AMI。  
**Windows** – 下列 Windows AMI 支援 UEFI：  
+ Windows\$1Server-2025-\$1 (以 `BIOS-` 為名稱字首的 AMI 除外)
+ TPM-Windows\$1Server-2022-English-Full-Base
+ TPM-Windows\$1Server-2022-English-Core-Base
+ TPM-Windows\$1Server-2019-English-Full-Base
+ TPM-Windows\$1Server-2019-English-Core-Base
+ TPM-Windows\$1Server-2016-English-Full-Base
+ TPM-Windows\$1Server-2016-English-Core-Base

**執行個體類型**  
在 AWS Nitro 系統上建置的所有執行個體都支援 UEFI 和舊版 BIOS，但以下除外：裸機執行個體、DL1, G4ad, P4、u-3tb1、u-6tb1、u-9tb1、u-12tb1、u-18tb1、u-24tb1 和 VT1。如需詳細資訊，請參閱[確定 EC2 執行個體類型的支援開機模式](instance-type-boot-mode.md)。

下表顯示執行個體的開機模式 (由**產生的執行個體開機模式**資料欄表示) 由 AMI 的開機模式參數 (資料欄 1)、AMI 所包含之作業系統的開機模式組態 (資料欄 2) 以及執行個體類型的開機模式支援 (資料欄 3) 的組合決定。


| AMI 開機模式參數 | 作業系統開機模式組態 | 執行個體類型開機模式支援 | 產生的執行個體開機模式 | 
| --- | --- | --- | --- | 
| UEFI | UEFI | UEFI | UEFI | 
| Legacy BIOS | Legacy BIOS | Legacy BIOS | Legacy BIOS | 
| UEFI Preferred | UEFI | UEFI | UEFI | 
| UEFI Preferred | UEFI | UEFI 與 Legacy BIOS | UEFI | 
| UEFI Preferred | Legacy BIOS | Legacy BIOS | Legacy BIOS | 
| UEFI Preferred | Legacy BIOS | UEFI 與 Legacy BIOS | Legacy BIOS | 
| 未指定開機模式 - ARM | UEFI | UEFI | UEFI | 
| 未指定開機模式 - x86 | Legacy BIOS | UEFI 與 Legacy BIOS | Legacy BIOS | 

# 確定 Amazon EC2 AMI 的開機模式參數
<a name="ami-boot-mode"></a>

AMI 開機模式參數為選用。AMI 可以有下列其中一個開機模式參數值：`uefi`、`legacy-bios` 或 `uefi-preferred`。

有些 AMI 沒有開機模式參數。當 AMI 沒有開機模式參數時，從 AMI 啟動的執行個體會使用執行個體類型的預設值，即 Graviton 上的 `uefi` 以及 Intel 和 AMD 執行個體類型上的 `legacy-bios`。

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

**如需確定 AMI 的開機模式參數**

1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 在導覽窗格中，選取 **AMI**，然後選取該 AMI。

1. 檢查**開機模式**欄位。
   + 顯示 **uefi** 值表示 AMI 支援 UEFI。
   + 顯示 **uefi-preferred** 值表示 AMI 支援 UEFI 和 Legacy BIOS。
   + 如果未顯示任何值，表示透過 AMI 啟動的執行個體會使用其執行個體類型的預設值。

**如需啟動執行個體時確定 AMI 的開機模式參數**  
使用啟動執行個體精靈啟動執行個體時，在選取 AMI 的步驟中檢查 **Boot mode** (開機模式) 欄位。如需詳細資訊，請參閱[應用程式和作業系統映像 (Amazon Machine Image)](ec2-instance-launch-parameters.md#liw-ami)。

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

**如需確定 AMI 的開機模式參數**  
使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令確定 AMI 的開機模式。

```
aws ec2 describe-images \
    --region us-east-1 \
    --image-id ami-0abcdef1234567890 \
    --query Images[].BootMode \
    --output text
```

以下為範例輸出。

```
uefi
```

在輸出中，`uefi` 的值表示 AMI 支援 UEFI。`uefi-preferred` 的值表示 AMI 支援 UEFI 和 Legacy BIOS。如果未顯示任何值，表示透過 AMI 啟動的執行個體會使用其執行個體類型的預設值。

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

**如需確定 AMI 的開機模式參數**  
請使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html) cmdlet 來確定 AMI 的啟動模式。

```
Get-EC2Image -Region us-east-1 `
    -ImageId ami-0abcdef1234567890 | Format-List Name, BootMode, TpmSupport
```

以下為範例輸出。

```
Name       : TPM-Windows_Server-2016-English-Full-Base-2023.05.10
BootMode   : uefi
TpmSupport : v2.0
```

在輸出中，`BootMode` 的值會指示 AMI 的啟動模式。`uefi` 的值表示 AMI 支援 UEFI。`uefi-preferred` 的值表示 AMI 支援 UEFI 和 Legacy BIOS。如果未顯示任何值，表示透過 AMI 啟動的執行個體會使用其執行個體類型的預設值。

------

# 確定 EC2 執行個體類型的支援開機模式
<a name="instance-type-boot-mode"></a>

您可確定執行個體類型的支援啟動模式。

Amazon EC2 主控台不顯示執行個體類型的支援啟動模式。

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

使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-types.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-types.html) 命令確定執行個體類型的支援開機模式。`--query` 參數會篩選輸出，只傳回支援的開機模式。

下列範例顯示了可同時支援 UEFI 和舊式 BIOS 啟動模式的指定執行個體類型。

```
aws ec2 describe-instance-types \
    --instance-types m5.2xlarge \
    --query "InstanceTypes[*].SupportedBootModes"
```

以下為範例輸出。

```
[
    [
        "legacy-bios",
        "uefi"
    ]
]
```

下列範例顯示 `t2.xlarge` 僅支援 Legacy BIOS。

```
aws ec2 describe-instance-types \
    --instance-types t2.xlarge \
    --query "InstanceTypes[*].SupportedBootModes"
```

以下為範例輸出。

```
[
    [
        "legacy-bios"
    ]
]
```

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

使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceType.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceType.html) cmdlet 來確定執行個體類型的支援啟動模式。

下列範例顯示 `m5.2xlarge` 同時支援 UEFI 和 Legacy BIOS 開機模式。

```
Get-EC2InstanceType -InstanceType m5.2xlarge | Format-List InstanceType, SupportedBootModes
```

以下為範例輸出。

```
InstanceType       : m5.2xlarge
SupportedBootModes : {legacy-bios, uefi}
```

下列範例顯示 `t2.xlarge` 僅支援 Legacy BIOS。

```
Get-EC2InstanceType -InstanceType t2.xlarge | Format-List InstanceType, SupportedBootModes
```

以下為範例輸出。

```
InstanceType       : t2.xlarge
SupportedBootModes : {legacy-bios}
```

------

**確定支援 UEFI 的執行個體類型**  
您可確定支援 UEFI 的執行個體類型 Amazon EC2 主控台不顯示執行個體類型的 UEFI 支援。

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

可用的執行個體類型因 AWS 區域而異。如需查看區域中支援 UEFI 的可用執行個體類型，請使用 [describe-instance-types](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-types.html) 命令。包含 `--filters` 參數以將結果範圍限定為支援 UEFI 的執行個體類型，以及包含 `--query` 參數以將輸出範圍限定為 `InstanceType` 的值。

```
aws ec2 describe-instance-types \
    --filters Name=supported-boot-mode,Values=uefi \
    --query "InstanceTypes[*].[InstanceType]" --output text | sort
```

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

可用的執行個體類型因 AWS 區域而異。如需查看區域中支援 UEFI 的可用執行個體類型，請使用 [Get-EC2InstanceType](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceType.html) cmdlet。

```
Get-EC2InstanceType | `
	Where-Object {$_.SupportedBootModes -Contains "uefi"} | `
	Sort-Object InstanceType | `
	Format-Table InstanceType -GroupBy CurrentGeneration
```

------

**若要確定支援 UEFI 安全開機並保留非揮發性變數的執行個體類型**  
裸機執行個體不支援 UEFI 安全開機和非揮發性變數，因此這些範例將其排除在輸出之外。如需有關 UEFI 安全開機的資訊，請參閱 [Amazon EC2 執行個體的 UEFI 安全開機](uefi-secure-boot.md)。

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

請使用 [describe-instance-types](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instance-types.html) 命令，然後從輸出中排除裸機執行個體。

```
aws ec2 describe-instance-types \
    --filters Name=supported-boot-mode,Values=uefi Name=bare-metal,Values=false \
    --query "InstanceTypes[*].[InstanceType]" \
    --output text | sort
```

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

請使用 [Get-EC2InstanceType](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceType.html) cmdlet，然後從輸出中排除裸機執行個體。

```
Get-EC2InstanceType | `
    Where-Object { `
        $_.SupportedBootModes -Contains "uefi" -and `
        $_.BareMetal -eq $False
        } | `
    Sort-Object InstanceType  | `
    Format-Table InstanceType, SupportedBootModes, BareMetal, `
        @{Name="SupportedArchitectures"; Expression={$_.ProcessorInfo.SupportedArchitectures}}
```

------

# 確定 EC2 執行個體的開機模式
<a name="instance-boot-mode"></a>

執行個體的開機模式會顯示在 Amazon EC2 主控台的**開機模式**欄位中，並透過 AWS CLI中的 `currentInstanceBootMode` 參數顯示。

啟動執行個體時，其啟動模式參數的值取決於用於將其啟動的 AMI 開機模式參數的值，如下所示：
+ 具有 `uefi` 開機模式參數的 AMI 會建立 `currentInstanceBootMode` 參數為 `uefi` 的執行個體。
+ 具有 `legacy-bios` 開機模式參數的 AMI 會建立 `currentInstanceBootMode` 參數為 ` legacy-bios` 的執行個體。
+ 如果執行個體類型支援 UEFI，則開機模式參數為 `uefi-preferred` 的 AMI 會建立 `currentInstanceBootMode` 參數為 `uefi` 的執行個體；否則，其會建立 `currentInstanceBootMode` 參數為 `legacy-bios` 的執行個體。
+ 沒有開機模式參數值的 AMI 會建立具有 `currentInstanceBootMode` 參數值的執行個體，該參數值取決於 AMI 架構是 ARM 還是 x86，以及支援的執行個體類型開機模式。Graviton 執行個體類型上的預設開機模式為 `uefi`，Intel 和 AMD 執行個體類型上的預設開機模式為 `legacy-bios`。

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

**如需確定執行個體的啟動模式**

1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 在導覽窗格中，選取 **Instances (執行個體)**，然後選取您的執行個體。

1. 在 **Details** (詳細資訊) 標籤上，檢查 **Boot mode** (開機模式) 欄位。

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

**如需確定執行個體的啟動模式**  
使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html) 命令確定執行個體的開機模式。您也可以判斷用來建立執行個體之 AMI 的開機模式。

```
aws ec2 describe-instances \
    --region us-east-1 \
    --instance-ids i-1234567890abcdef0 \
    --query Reservations[].Instances[].BootMode \
    --output text
```

以下為範例輸出。

```
uefi
```

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

**如需確定執行個體的啟動模式**  
請使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Instance.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Instance.html) cmdlet 來確定執行個體的開機模式。您也可以判斷用來建立執行個體之 AMI 的開機模式。

```
(Get-EC2Instance `
    -InstanceId i-1234567890abcdef0).Instances | Format-List BootMode, CurrentInstanceBootMode, InstanceType, ImageId
```

以下為範例輸出。

```
BootMode                : uefi
CurrentInstanceBootMode : uefi
InstanceType            : c5a.large
ImageId                 : ami-0abcdef1234567890
```

------

# 確定 EC2 執行個體作業系統的開機模式
<a name="os-boot-mode"></a>

AMI 的開機模式會引導 Amazon EC2 使用哪種開機模式來啟動執行個體。若要檢視執行個體的作業系統是否已針對 UEFI 進行設定，您必須使用 SSH (Linux 執行個體) 或 RDP (Windows 執行個體) 連線至您的執行個體。

請遵循於執行個體作業系統的指示。

## Linux
<a name="os-boot-mode-linux"></a>

**確定執行個體作業系統的開機模式**

1. [使用 SSH 連線至您的 Linux 執行個體](connect-linux-inst-ssh.md)。

1. 若要檢視作業系統的開機模式，請嘗試下列其中一個動作：
   + 執行下列命令。

     ```
     [ec2-user ~]$ sudo /usr/sbin/efibootmgr
     ```

     在 UEFI 開機模式下啟動的執行個體預期輸出

     ```
     BootCurrent: 0001
     Timeout: 0 seconds
     BootOrder: 0000,0001
     Boot0000* UiApp
     Boot0001* UEFI Amazon Elastic Block Store vol-xyz
     ```
   + 執行下列命令，以驗證 `/sys/firmware/efi` 目錄是否存在。只有在執行個體使用 UEFI 開機時，才會存在此目錄。如果此目錄不存在，命令會傳回 `Legacy BIOS Boot Detected`。

     ```
     [ec2-user ~]$ [ -d /sys/firmware/efi ] && echo "UEFI Boot Detected" || echo "Legacy BIOS Boot Detected"
     ```

     在 UEFI 開機模式下啟動的執行個體預期輸出

     ```
     UEFI Boot Detected
     ```

     在 Legacy BIOS 開機模式下啟動的執行個體預期輸出

     ```
     Legacy BIOS Boot Detected
     ```
   + 執行下列命令，以驗證 EFI 是否出現在 `dmesg` 輸出中。

     ```
     [ec2-user ~]$ dmesg | grep -i "EFI"
     ```

     在 UEFI 開機模式下啟動的執行個體預期輸出

     ```
     [    0.000000] efi: Getting EFI parameters from FDT:
     [    0.000000] efi: EFI v2.70 by EDK II
     ```

## Windows
<a name="os-boot-mode-windows"></a>

**確定執行個體作業系統的開機模式**

1. [使用 RDP 連線至您的 Windows 執行個體](connecting_to_windows_instance.md)。

1. 請移至 **System Information** (系統資訊)，然後檢查 **BIOS Mode** (BIOS 模式) 列。  
![\[顯示所選「BIOS 模式」列的「系統資訊」視窗。「BIOS 模式」的值為 Legacy。\]](http://docs.aws.amazon.com/zh_tw/AWSEC2/latest/UserGuide/images/BIOS-mode-win.png)

# 設定 Amazon EC2 AMI 的開機模式
<a name="set-ami-boot-mode"></a>

AMI 預設會繼承用於建立 AMI 的 EC2 執行個體的啟動模式。例如，若透過舊式 BIOS 上執行的 EC2 執行個體來建立 AMI，新 AMI 的啟動模式為 `legacy-bios`。若透過使用啟動模式 `uefi-preferred` 的 EC2 執行個體來建立 AMI，新 AMI 的啟動模式為 `uefi-preferred`。

當您註冊 AMI 時，可將 AMI 的啟動模式設定為 `uefi`、`legacy-bios` 或 `uefi-preferred`。

當 AMI 開機模式設為 `uefi-preferred` 時，執行個體會以下列方式開機：
+ 對於同時支援 UEFI 和 Legacy BIOS (例如 `m5.large`) 的執行個體類型，執行個體會使用 UEFI 開機。
+ 對於僅支援 Legacy BIOS (例如 `m4.large`) 的執行個體類型，執行個體會使用 Legacy BIOS 開機。

如果您將 AMI 開機模式設定為 `uefi-preferred`，則作業系統必須支援 UEFI 和 Legacy BIOS 開機功能。

若要將現有的 Legacy BIOS 型執行個體轉換為 UEFI，或將現有的 UEFI 型執行個體轉換為 Legacy BIOS，您必須先修改執行個體的磁碟區和作業系統，以支援選取的開機模式。然後，建立磁碟區的快照。最後，透過快照建立 AMI

**考量事項**
+ 設定 AMI 開機模式參數並不會自動針對指定的開機模式設定作業系統。您必須先對執行個體的磁碟區和作業系統進行適當的修改，以支援使用選取的啟動模式來啟動。否則，產生的 AMI 將不可使用。例如，如果您要將 Legacy BIOS Windows 執行個體轉換為 UEFI，可以使用 Microsoft 的 [MBR2GPT](https://learn.microsoft.com/en-us/windows/deployment/mbr-to-gpt) 工具，將系統磁碟從 MBR 轉換為 GPT。所需的修改視作業系統而異。如需詳細資訊，請參閱作業系統的手冊。
+ 您不能使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) 命令或 [https://docs.aws.amazon.com/powershell/latest/reference/items/Register-EC2Image.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Register-EC2Image.html) cmdlet 來建立同時支援 [NitroTPM](nitrotpm.md) 和 UEFI Preferred 的 AMI。
+ 某些功能 (例如 UEFI 安全開機) 僅適用於透過 UEFI 開機的執行個體。當您將 `uefi-preferred` AMI 開機模式參數與不支援 UEFI 的執行個體類型搭配使用時，執行個體會以 Legacy BIOS 的形式啟動，而且會停用與 UEFI 相關的功能。如果您依賴 UEFI 相關功能的可用性，則請將 AMI 開機模式參數設定為 `uefi`。

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

**如需設定 AMI 的啟動模式**

1. 對執行個體的磁碟區和作業系統進行適當的修改，以支援透過選取的開機模式開機。所需的修改視作業系統而異。如需詳細資訊，請參閱作業系統的手冊。
**警告**  
如果您不執行此步驟，則 AMI 將無法使用。

1. 若要尋找執行個體的磁碟區 ID，請使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html) 命令。您將在下一個步驟中建立此磁碟區的快照。

   ```
   aws ec2 describe-instances \
       --instance-ids i-1234567890abcdef0 \
       --query Reservations[].Instances[].BlockDeviceMappings
   ```

   以下為範例輸出。

   ```
   [
       [
           {
               "DeviceName": "/dev/xvda",
               "Ebs": {
                   "AttachTime": "2024-07-11T01:05:51+00:00",
                   "DeleteOnTermination": true,
                   "Status": "attached",
                   "VolumeId": "vol-1234567890abcdef0"
               }
           }
       ]
   ]
   ```

1. 若要建立磁碟區的快照，請使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/create-snapshot.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-snapshot.html) 命令。使用上一個步驟的磁碟區 ID。

   ```
   aws ec2 create-snapshot \
       --volume-id vol-01234567890abcdef \
       --description "my snapshot"
   ```

   以下為範例輸出。

   ```
   {
       "Description": "my snapshot",
       "Encrypted": false,
       "OwnerId": "123456789012",
       "Progress": "",
       "SnapshotId": "snap-0abcdef1234567890",
       "StartTime": "",
       "State": "pending",
       "VolumeId": "vol-01234567890abcdef",
       "VolumeSize": 30,
       "Tags": []
   }
   ```

1. 等到快照的狀態為 `completed` 後，再進行下一個步驟。如需獲取快照狀態，請使用上一個步驟的快照 ID 並搭配 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-snapshots.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-snapshots.html) 命令。

   ```
   aws ec2 describe-snapshots \
       --snapshot-ids snap-0abcdef1234567890 \
       --query Snapshots[].State \
       --output text
   ```

   以下為範例輸出。

   ```
   completed
   ```

1. 若要建立新 AMI，請使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) 命令。使用輸出 **CreateSnapshot** 中的值 `SnapshotId`。
   + 如需將啟動模式設定為 UEFI，請新增包含值 `uefi` 的 `--boot-mode` 參數。

     ```
     aws ec2 register-image \
        --description "my image" \
        --name "my-image" \
        --block-device-mappings "DeviceName=/dev/sda1,Ebs={SnapshotId=snap-0abcdef1234567890,DeleteOnTermination=true}" \
        --root-device-name /dev/sda1 \
        --virtualization-type hvm \
        --ena-support \
        --boot-mode uefi
     ```
   + 如需將啟動模式設定為 `uefi-preferred`，請將 `--boot-mode` 的值設定為 `uefi-preferred`

     ```
     aws ec2 register-image \
        --description "my description" \
        --name "my-image" \
        --block-device-mappings "DeviceName=/dev/sda1,Ebs={SnapshotId=snap-0abcdef1234567890,DeleteOnTermination=true}" \
        --root-device-name /dev/sda1 \
        --virtualization-type hvm \
        --ena-support \
        --boot-mode uefi-preferred
     ```

1. (選用) 如需驗證新建立的 AMI 是否具有您指定的啟動模式，請使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html) 命令。

   ```
   aws ec2 describe-images \
       --image-id ami-1234567890abcdef0 \
       --query Images[].BootMode \
       --output text
   ```

   以下為範例輸出。

   ```
   uefi
   ```

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

**如需設定 AMI 的啟動模式**

1. 對執行個體的磁碟區和作業系統進行適當的修改，以支援透過選取的開機模式開機。所需的修改視作業系統而異。如需詳細資訊，請參閱作業系統的手冊。
**警告**  
如果您不執行此步驟，則 AMI 將無法使用。

1. 如需尋找執行個體的磁碟區 ID，請使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Instance.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Instance.html) cmdlet。

   ```
   (Get-EC2Instance `
       -InstanceId i-1234567890abcdef0).Instances.BlockDeviceMappings.Ebs
   ```

   以下為範例輸出。

   ```
   AssociatedResource  : 
   AttachTime          : 7/11/2024 1:05:51 AM
   DeleteOnTermination : True
   Operator            : 
   Status              : attached
   VolumeId            : vol-01234567890abcdef
   ```

1. 如需建立磁碟區的快照，請使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Snapshot.html](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Snapshot.html) cmdlet。使用上一個步驟的磁碟區 ID。

   ```
   New-EC2Snapshot `
       -VolumeId vol-01234567890abcdef `
       -Description "my snapshot"
   ```

   以下為範例輸出。

   ```
   AvailabilityZone          : 
   Description               : my snapshot
   Encrypted                 : False
   FullSnapshotSizeInBytes   : 0
   KmsKeyId                  : 
   OwnerId                   : 123456789012
   RestoreExpiryTime         : 
   SnapshotId                : snap-0abcdef1234567890
   SseType                   : 
   StartTime                 : 4/25/2025 6:08:59 PM
   State                     : pending
   StateMessage              : 
   VolumeId                  : vol-01234567890abcdef
   VolumeSize                : 30
   ```

1. 等到快照的狀態為 `completed` 後，再進行下一個步驟。如需獲取快照狀態，請使用上一個步驟的快照 ID 並搭配 [https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Snapshot.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Snapshot.html) cmdlet。

   ```
   (Get-EC2Snapshot `
       -SnapshotId snap-0abcdef1234567890).State.Value
   ```

   以下為範例輸出。

   ```
   completed
   ```

1. 如需使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/Register-EC2Image.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Register-EC2Image.html) cmdlet 來建立新的 AMI。使用輸出 **New-EC2Snapshot** 中的值 `SnapshotId`。
   + 如需將啟動模式設定為 UEFI，請新增包含值 `uefi` 的 `-BootMode` 參數。

     ```
     $block = @{SnapshotId=snap-0abcdef1234567890}
     Register-EC2Image ` 
        -Description "my image" `
        -Name "my-image" `
        -BlockDeviceMapping @{DeviceName="/dev/xvda";Ebs=$block} `
        -RootDeviceName /dev/xvda `
        -EnaSupport $true `
        -BootMode uefi
     ```
   + 如需將啟動模式設定為 `uefi-preferred`，請將 `-BootMode` 的值設定為 `uefi-preferred`

     ```
     $block = @{SnapshotId=snap-0abcdef1234567890}
     Register-EC2Image ` 
        -Description "my image" `
        -Name "my-image" `
        -BlockDeviceMapping @{DeviceName="/dev/xvda";Ebs=$block} `
        -RootDeviceName /dev/xvda `
        -EnaSupport $true `
        -BootMode uefi-preferred
     ```

1. (選用) 如需驗證新建立的 AMI 是否具有您指定的啟動模式，請使用 [https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Image.html) cmdlet。

   ```
   (Get-EC2Image `
       -ImageId ami-1234567890abcdef0).BootMode.Value
   ```

   以下為範例輸出。

   ```
   uefi
   ```

------

# Amazon EC2 執行個體的 UEFI 變數
<a name="uefi-variables"></a>

啟動其中啟動模式設定為 UEFI 的執行個體時，就會建立變數的機碼值存放區。UEFI 和執行個體作業系統可以使用存放區來儲存 UEFI 變數。

開機載入器和作業系統會使用 UEFI 變數來設定早期系統啟動。它們允許作業系統管理開機程序的特定設定，例如開機順序，或管理 UEFI 安全開機的金鑰。

**警告**  
任何可以連線至執行個體 (以及可能會在執行個體上運行的任何軟體)，或任何具有在執行個體上使用 [GetInstanceUefiData](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetInstanceUefiData.html) API 許可的人員都可以讀取變數。您決不應該將敏感資料 (例如密碼或個人識別資訊) 存放在 UEFI 變數存放區中。

**UEFI 變數持久性**
+ 對於在 2022 年 5 月 10 日或之前啟動的執行個體，UEFI 變數將在重新開機或停止時被抹除。
+ 對於在 2022 年 5 月 11 日或之後啟動的執行個體，標示為非揮發性的 UEFI 變數會在重新開機和停止/啟動時持續存在。
+ 裸機執行個體不會在執行個體停止/啟動操作中保留 UEFI 非揮發性變數。

# Amazon EC2 執行個體的 UEFI 安全開機
<a name="uefi-secure-boot"></a>

UEFI 安全開機依托 Amazon EC2 的長期安全開機程序，提供額外的深度防禦，幫助客戶保護軟體免受重新開機期間持續存在的威脅。它確保執行個體僅對使用密碼編譯金鑰簽署的軟體進行開機。這些金鑰存放在 [UEFI 非揮發性變數存放區](uefi-variables.md)的金鑰資料庫中。UEFI 安全開機可避免對執行個體開機流程進行未經授權的修改。

**Topics**
+ [UEFI 安全開機如何與 Amazon EC2 執行個體搭配使用](how-uefi-secure-boot-works.md)
+ [Amazon EC2 的 UEFI 安全啟動要求](launch-instance-with-uefi-sb.md)
+ [驗證 Amazon EC2 執行個體是否已啟用 UEFI 安全開機](verify-uefi-secure-boot.md)
+ [使用自訂 UEFI 安全開機金鑰建立 Linux AMI](create-ami-with-uefi-secure-boot.md)
+ [建立 AWS UEFI 安全開機的二進位 Blob](aws-binary-blob-creation.md)

# UEFI 安全開機如何與 Amazon EC2 執行個體搭配使用
<a name="how-uefi-secure-boot-works"></a>

UEFI 安全開機是 UEFI 中指定的一項功能，它提供有關開機鏈狀態的驗證。該功能旨在確保韌體自我初始化後，只會執行以密碼編譯驗證的 UEFI 二進位檔案。這些二進位檔案包括 UEFI 驅動程式和主要開機載入器，以及鏈式載入元件。

UEFI 安全開機指定在信任鏈中使用的四個金鑰資料庫。資料庫存放在 UEFI 變數存放區中。

信任鏈如下：

**平台金鑰 (PK) 資料庫**  
PK 資料庫是信任根。它包含在信任鏈中用於更新金鑰交換金鑰 (KEK) 資料庫的單一公有 PK 金鑰。  
若要變更 PK 資料庫，您必須具有私有 PK 金鑰才能簽署更新要求。這包括透過寫入空 PK 金鑰來刪除 PK 資料庫。

**金鑰交換金鑰 (KEK) 資料庫**  
KEK 資料庫是一份公有 KEK 金鑰清單，這些金鑰用於在信任鏈中更新簽章 (db) 和拒絕清單 (dbx) 資料庫。  
若要變更公有 KEK 資料庫，您必須具有私有 PK 金鑰才能簽署更新要求。

**簽章 (db) 資料庫**  
db 資料庫是一份公有金鑰和雜湊清單，這些金鑰和雜湊用於在信任鏈中驗證所有 UEFI 開機二進位檔案。  
若要變更 db 資料庫，您必須具有私有 PK 金鑰或任何一項私有 KEK 金鑰才能簽署更新要求。

**簽章拒絕清單 (dbx) 資料庫**  
dbx 資料庫是一份不受信任的公有金鑰和二進位檔案雜湊清單，在信任鏈中作為撤銷檔案使用。  
dbx 資料庫始終優先於所有其他金鑰資料庫。  
若要變更 dbx 資料庫，您必須具有私有 PK 金鑰或任何一項私有 KEK 金鑰才能簽署更新要求。  
UEFI 論壇維護有適用於許多已知不良二進位檔案和憑證的公開可用的 dbx，網址為：[https://uefi.org/revocationlistfile](https://uefi.org/revocationlistfile)。

**重要**  
UEFI 安全開機強制對任何 UEFI 二進位檔案執行簽章驗證。若要允許在 UEFI 安全開機中執行 UEFI 二進位檔案，請使用上述任何私有 db 金鑰予以簽署。

UEFI 安全開機預設為停用，且系統處於 `SetupMode` 模式。當系統處於 `SetupMode` 模式時，所有金鑰變數都可以在沒有密碼編譯簽章的情況下更新。設定 PK 後，UEFI 安全開機將啟用，並結束設定模式。

# Amazon EC2 的 UEFI 安全啟動要求
<a name="launch-instance-with-uefi-sb"></a>

當您[啟動 Amazon EC2 執行個體](LaunchingAndUsingInstances.md)，且其具支援 AMI 和支援執行個體類型時，該執行個體會自動根據其 UEFI 安全開機資料庫驗證 UEFI 開機二進位檔案。不需任何其他設定。您還可以在啟動後在執行個體上設定 UEFI 安全開機。

**注意**  
UEFI 安全開機可保護您的執行個體及其作業系統免受開機流程修改的影響。如果您從啟用 UEFI 安全開機的來源 AMI 建立新 AMI，並在複製過程修改部分參數 (例如變更 AMI 內的 `UefiData`)，您可停用 UEFI 安全開機。

**Topics**
+ [支援的 AMI](#uefi-amis)
+ [支援的執行個體類型](#uefi-instance)

## 支援的 AMI
<a name="uefi-amis"></a>

**Linux AMI**  
若要啟動 Linux 執行個體，Linux AMI 必須啟用 UEFI 安全開機。

Amazon Linux 從 AL2023 2023.1 版起開始支援 UEFI 安全開機。不過，AMI 在預設情況下並不會啟用 UEFI 安全開機。如需詳細資訊，請參閱「AL2023 使用者指南」**中的 [UEFI 安全開機](https://docs.aws.amazon.com/linux/al2023/ug/uefi-secure-boot.html)。舊版 Amazon Linux AMI 並未啟用 UEFI 安全開機。若要使用支援的 AMI，必須在自有的 Linux AMI 上執行多個設定步驟。如需詳細資訊，請參閱[使用自訂 UEFI 安全開機金鑰建立 Linux AMI](create-ami-with-uefi-secure-boot.md)。

**Windows AMI**  
若要啟動 Windows 執行個體，Windows AMI 必須啟用 UEFI 安全開機。若要尋找已針對使用 Microsoft 金鑰的 UEFI 安全開機預先設定的 AWS Windows AMI，請參閱 [Windows AMIs參考中的尋找使用 NitroTPM 和 UEFI 安全開機設定的 Windows Server](https://docs.aws.amazon.com/ec2/latest/windows-ami-reference/ami-windows-tpm.html#ami-windows-tpm-find) AMI。 *AWS AMIs *

目前，我們不支援使用 [import-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/import-image.html) 命令來匯入具有 UEFI 安全開機的 Windows。

## 支援的執行個體類型
<a name="uefi-instance"></a>

所有支援 UEFI 的虛擬化執行個體類型也支援 UEFI 安全開機。如需有關支援 UEFI 安全開機的執行個體類型詳細資訊，請參閱[UEFI 開機模式需求](launch-instance-boot-mode.md)。

**注意**  
裸機執行個體類型不支援 UEFI 安全開機。

# 驗證 Amazon EC2 執行個體是否已啟用 UEFI 安全開機
<a name="verify-uefi-secure-boot"></a>

您可使用下列程序來確定 Amazon EC2 是否已啟用 UEFI 安全開機。

## Linux 執行個體
<a name="verify-uefi-secure-boot-linux"></a>

可使用 `mokutil` 公用程式來驗證 Linux 執行個體是否已啟用 UEFI 安全開機。如果執行個體上沒有安裝 `mokutil`，則必須安裝。如需 Amazon Linux 2 安裝說明，請參閱[在 Amazon Linux 2 執行個體尋找並安裝軟體套件](https://docs.aws.amazon.com/linux/al2/ug/find-install-software.html)。若是其他 Linux 發行版，請參閱其特定文件。

**驗證 Linux 執行個體是否已啟用 UEFI 安全開機**  
連線您的執行個體，並在終端機視窗以 `root` 身分執行以下命令。

```
mokutil --sb-state 
```

以下為範例輸出。
+ 如果啟用了 UEFI 安全開機，則輸出會包含 `SecureBoot enabled`。
+ 如果未啟用 UEFI 安全開機，則輸出會包含 `SecureBoot disabled` 或 `Failed to read SecureBoot`。

## Windows 執行個體
<a name="verify-uefi-secure-boot-windows"></a>

**驗證 Windows 執行個體是否已啟用 UEFI 安全開機**

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

1. 開啟 msinfo32 工具。

1. 檢查 **Secure Boot State** (安全開機狀態) 欄位。如果啟用了 UEFI 安全開機，則值為**支援**，如下圖所示。  
![\[System Information (系統資訊) 中的 Secure Boot State (安全開機狀態)。\]](http://docs.aws.amazon.com/zh_tw/AWSEC2/latest/UserGuide/images/secure-boot-state-win.png)

您也可以使用 Windows PowerShell Cmdlet `Confirm-SecureBootUEFI` 檢查安全開機狀態。如需有關 cmdlet 的詳細資訊，請參閱 Microsoft 文件的 [Confirm-SecureBootUEFI](https://learn.microsoft.com/en-us/powershell/module/secureboot/confirm-securebootuefi)。

# 使用自訂 UEFI 安全開機金鑰建立 Linux AMI
<a name="create-ami-with-uefi-secure-boot"></a>

這些說明向您展示了如何使用 UEFI 安全開機和自訂私有金鑰來建立 Linux AMI。Amazon Linux 從 AL2023 2023.1 版起開始支援 UEFI 安全開機。如需詳細資訊，請參閱 *Amazon Linux 2023 使用者指南*中的 [AL2023 的 UEFI 安全啟動](https://docs.aws.amazon.com/linux/al2023/ug/uefi-secure-boot.html)。

**重要**  
以下程序**僅適用於進階使用者**。您必須具備充分的 SSL 和 Linux 發行版本開機流程的知識才能使用這些程序。

**先決條件**
+ 將會使用下列工具：
  + OpenSSL - [https://www.openssl.org/](https://www.openssl.org/)
  + efivar - [https://github.com/rhboot/efivar](https://github.com/rhboot/efivar)
  + efitools - [https://git.kernel.org/pub/scm/linux/kernel/git/jejb/efitools.git/](https://git.kernel.org/pub/scm/linux/kernel/git/jejb/efitools.git/)
  + [get-instance-uefi-data](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-uefi-data.html) 命令
+ 您的 Linux 執行個體必須使用支援 UEFI 開機模式的 Linux AMI 啟動，並且有非揮發性資料存在。

沒有 UEFI 安全開機金鑰的新建立執行個體是在 `SetupMode` 中建立，允許您註冊自己的金鑰。某些 AMI 預先設定為具有 UEFI 安全開機功能，您無法變更現有金鑰。如果您想要變更金鑰，您必須根據原始 AMI 建立新 AMI。

您有兩種在變數存放區傳播金鑰的方法，這些方法在接下來的選項 A 和選項 B 中說明。選項 A 說明如何在執行個體中執行此操作，並模仿真實硬體的流程。選項 B 說明如何建立二進位檔案 Blob，其隨後會在建立 AMI 時作為 base64 編碼的檔案傳遞。對於這兩個選項，您必須先建立用於信任鏈的三對金鑰對。

**Topics**
+ [任務 1：建立金鑰對](#uefi-secure-boot-create-three-key-pairs)
+ [任務 2 – 選項 A：從執行個體中將金鑰新增至變數存放區](#uefi-secure-boot-optionA)
+ [任務 2 – 選項 B：建立一個包含預先填寫的變數存放區的二進位 blob](#uefi-secure-boot-optionB)

## 任務 1：建立金鑰對
<a name="uefi-secure-boot-create-three-key-pairs"></a>

UEFI 安全開機基於下列用於信任鏈的三個金鑰資料庫：平台金鑰 (PK)、金鑰交換金鑰 (KEK) 和簽章資料庫 (db)。¹

您需在執行個體上建立每個金鑰。若要以對 UEFI 安全開機標準有效的格式準備公有金鑰，請為每個金鑰建立一個憑證。`DER` 定義 SSL 格式 (格式的二進位編碼)。然後，您可以將每個憑證轉換為 UEFI 簽章清單，該清單為 UEFI 安全開機中所理解的二進位格式。最後，您需使用相關金鑰簽署每個憑證。

**Topics**
+ [準備建立金鑰對](#uefisb-prepare-to-create-key-pairs)
+ [金鑰對 1：建立平台金鑰 (PK)](#uefisb-create-key-pair-1)
+ [金鑰對 2：建立金鑰交換金鑰 (KEK)](#uefisb-create-key-pair-2)
+ [金鑰對 3：建立簽章資料庫 (db)](#uefisb-create-key-pair-3)
+ [使用私有金鑰簽署開機映像 (核心)](#uefi-secure-boot-sign-kernel)

### 準備建立金鑰對
<a name="uefisb-prepare-to-create-key-pairs"></a>

建立金鑰對之前，請建立一個用於金鑰產生的全域唯一識別符 (GUID)。

1. [連線到執行個體。](connect.md)

1. 在 shell 提示中執行下列命令。

   ```
   uuidgen --random > GUID.txt
   ```

### 金鑰對 1：建立平台金鑰 (PK)
<a name="uefisb-create-key-pair-1"></a>

PK 是 UEFI 安全開機執行個體的信任根。私有 PK 用於更新 KEK，其又可接續用於將授權的金鑰新增至簽章資料庫 (db)。

X.509 標準用於建立金鑰對。如需有關標準的資訊，請參閱*維基百科*上的 [X.509](https://en.wikipedia.org/wiki/X.509)。

**建立 PK**

1. 建立金鑰。您必須將變數命名為 `PK`。

   ```
   openssl req -newkey rsa:4096 -nodes -keyout PK.key -new -x509 -sha256 -days 3650 -subj "/CN=Platform key/" -out PK.crt
   ```

   指定了下列參數：
   + `-keyout PK.key` - 私有金鑰檔案。
   + `-days 3650` - 憑證有效的天數。
   + `-out PK.crt` - 用於建立 UEFI 變數的憑證。
   + `CN=Platform key` - 金鑰的通用名稱 (CN)。您可以輸入自己的組織名稱，而不是*平台金鑰*。

1. 建立憑證。

   ```
   openssl x509 -outform DER -in PK.crt -out PK.cer
   ```

1. 將憑證轉換至 UEFI 簽章清單。

   ```
   cert-to-efi-sig-list -g "$(< GUID.txt)" PK.crt PK.esl
   ```

1. 使用私有 PK (自我簽署) 簽署 UEFI 簽章清單。

   ```
   sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt PK PK.esl PK.auth
   ```

### 金鑰對 2：建立金鑰交換金鑰 (KEK)
<a name="uefisb-create-key-pair-2"></a>

私有 KEK 用於將金鑰新增至 db，這是要在系統上開機使用的授權簽章清單。

**建立 KEK**

1. 建立金鑰。

   ```
   openssl req -newkey rsa:4096 -nodes -keyout KEK.key -new -x509 -sha256 -days 3650 -subj "/CN=Key Exchange Key/" -out KEK.crt
   ```

1. 建立憑證。

   ```
   openssl x509 -outform DER -in KEK.crt -out KEK.cer
   ```

1. 將憑證轉換至 UEFI 簽章清單。

   ```
   cert-to-efi-sig-list -g "$(< GUID.txt)" KEK.crt KEK.esl
   ```

1. 使用私有 PK 簽署簽章清單。

   ```
   sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt KEK KEK.esl KEK.auth
   ```

### 金鑰對 3：建立簽章資料庫 (db)
<a name="uefisb-create-key-pair-3"></a>

db 清單包含授權在系統上開機的授權金鑰。必須使用私有 KEK 才能修改清單。將使用在此步驟中建立的私有金鑰簽署開機映像。

**建立 db**

1. 建立金鑰。

   ```
   openssl req -newkey rsa:4096 -nodes -keyout db.key -new -x509 -sha256 -days 3650 -subj "/CN=Signature Database key/" -out db.crt
   ```

1. 建立憑證。

   ```
   openssl x509 -outform DER -in db.crt -out db.cer
   ```

1. 將憑證轉換至 UEFI 簽章清單。

   ```
   cert-to-efi-sig-list -g "$(< GUID.txt)" db.crt db.esl
   ```

1. 使用私有 KEK 簽署簽章清單。

   ```
   sign-efi-sig-list -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db db.esl db.auth
   ```

### 使用私有金鑰簽署開機映像 (核心)
<a name="uefi-secure-boot-sign-kernel"></a>

若為 Ubuntu 22.04，下列映像需要簽章。

```
/boot/efi/EFI/ubuntu/shimx64.efi
/boot/efi/EFI/ubuntu/mmx64.efi
/boot/efi/EFI/ubuntu/grubx64.efi
/boot/vmlinuz
```

**簽署映像**  
使用下列語法簽署映像。

```
sbsign --key db.key --cert db.crt --output /boot/vmlinuz /boot/vmlinuz
```

**注意**  
您必須簽署所有新核心。*`/boot/vmlinuz`* 通常會以符號連結到上次安裝的核心。

請參閱您的發行版本說明文件，了解您的開機鏈和所需映像。

¹ 感謝 ArchWiki 社群所做的所有工作。用於建立 PK、建立 KEK、建立 DB 和簽署映像的命令來自 [Creating keys](https://wiki.archlinux.org/title/Unified_Extensible_Firmware_Interface/Secure_Boot#Creating_keys) (建立金鑰)，該文章由 ArchWiki 維護團隊和/或 ArchWiki 貢獻者撰寫。

## 任務 2 – 選項 A：從執行個體中將金鑰新增至變數存放區
<a name="uefi-secure-boot-optionA"></a>

建立[三個金鑰對](#uefi-secure-boot-create-three-key-pairs)後，您即可以連接到執行個體，並透過完成以下步驟從執行個體中將金鑰新增至變數存放區。或者，完成 [任務 2 – 選項 B：建立一個包含預先填寫的變數存放區的二進位 blob](#uefi-secure-boot-optionB) 中的步驟。

**Topics**
+ [步驟 1：啟動將支援 UEFI 安全開機的執行個體](#step1-launch-uefi-sb)
+ [步驟 2：設定執行個體以支援 UEFI 安全開機](#step2-launch-uefi-sb)
+ [步驟 3：從執行個體建立 AMI](#step3-launch-uefi-sb)

### 步驟 1：啟動將支援 UEFI 安全開機的執行個體
<a name="step1-launch-uefi-sb"></a>

當您[啟動執行個體](LaunchingAndUsingInstances.md) (具有下列先決條件) 時，執行個體將準備好設定為支援 UEFI 安全開機。您只能在啟動時在執行個體上啟用對 UEFI 安全開機的支援；以後無法啟用它。

**先決條件**
+ **AMI** - Linux AMI 必須支援 UEFI 開機模式。若要驗證 AMI 是否支援 UEFI 開機模式，AMI 開機模式參數必須為 **uefi**。如需詳細資訊，請參閱[確定 Amazon EC2 AMI 的開機模式參數](ami-boot-mode.md)。

  請注意， AWS 僅提供設定為支援 Graviton 型執行個體類型的 UEFI 的 Linux AMIs。 AWS 目前不提供支援 UEFI 開機模式的 x86\$164 Linux AMIs。您可以設定自有的 AMI，以支援所有架構的 UEFI 開機模式。若要設定支援 UEFI 開機模式的 AMI，必須在自有的 AMI 上執行多個設定步驟。如需詳細資訊，請參閱[設定 Amazon EC2 AMI 的開機模式](set-ami-boot-mode.md)。
+ **執行個體類型** - 所有支援 UEFI 的虛擬化執行個體類型也支援 UEFI 安全開機。裸機執行個體類型不支援 UEFI 安全開機。如需有關支援 UEFI 安全開機的執行個體類型詳細資訊，請參閱[UEFI 開機模式需求](launch-instance-boot-mode.md)。
+ 在發佈 UEFI 安全開機後啟動您的執行個體。只有在 2022 年 5 月 10 日 (發佈 UEFI 安全開機時) 後啟動的執行個體才能支援 UEFI 安全開機。

啟動執行個體後，您可以透過檢查 UEFI 資料是否存在，驗證執行個體是否已準備好設定為支援 UEFI 安全開機 (換句話說，您可以繼續執行[步驟 2](#step2-launch-uefi-sb))。UEFI 資料的存在表示非揮發性資料是持續的。

**驗證執行個體是否準備好執行步驟 2**  
使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-uefi-data.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-uefi-data.html) 命令並指定執行個體 ID。

```
aws ec2 get-instance-uefi-data --instance-id i-1234567890abcdef0
```

如果輸出中存在 UEFI 資料，則執行個體已準備好執行步驟 2。如果輸出為空白，則無法將執行個體設定為支援 UEFI 安全開機。如果您的執行個體在 UEFI 安全開機支援可用之前啟動，則會發生這種情況。啟動新的執行個體，然後再試一次。

### 步驟 2：設定執行個體以支援 UEFI 安全開機
<a name="step2-launch-uefi-sb"></a>

#### 在執行個體上的 UEFI 變數存放區中註冊金鑰對
<a name="step2a-launch-uefi-sb"></a>

**警告**  
您必須在註冊金鑰*之後*簽署開機映像，否則您將無法啟動執行個體。

建立已簽署的 UEFI 簽章清單 (`PK`、`KEK` 以及`db`) 後，必須將他們註冊至 UEFI 韌體。

只有在以下情況下才能寫入 `PK` 變數：
+ 如果 `SetupMode` 變數為 `1`，表示尚未註冊 PK。透過以下命令來檢查這一點：輸出為 `1` 或 `0`。

  ```
  efivar -d -n 8be4df61-93ca-11d2-aa0d-00e098032b8c-SetupMode 
  ```
+ 新 PK 由現有 PK 的私有金鑰簽署。

**在 UEFI 變數存放區中註冊金鑰**  
必須在執行個體上執行以下命令。

如果啟用了設定模式 (值為 `1`)，則可以在執行個體上執行下列命令來註冊金鑰：

```
[ec2-user ~]$ efi-updatevar -f db.auth db
```

```
[ec2-user ~]$ efi-updatevar -f KEK.auth KEK
```

```
[ec2-user ~]$ efi-updatevar -f PK.auth PK
```

**驗證 UEFI 安全開機是否已啟用**  
若要驗證 UEFI 安全開機是否已啟用，請依照 [驗證 Amazon EC2 執行個體是否已啟用 UEFI 安全開機](verify-uefi-secure-boot.md) 中的步驟執行動作。

現在，您可以使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-uefi-data.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-uefi-data.html) CLI 命令匯出 UEFI 變數存放區，或者繼續執行下一個步驟．簽署開機映像以重新開機到已啟用 UEFI 安全開機的執行個體。

### 步驟 3：從執行個體建立 AMI
<a name="step3-launch-uefi-sb"></a>

若要從執行個體建立 AMI，您可以使用主控台或 `CreateImage` API、CLI 或 SDK。如需主控台的說明，請參閱 [建立 Amazon EBS 支援的 AMI](creating-an-ami-ebs.md)。如需 API 的說明，請參閱 [CreateImage](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateImage.html)。

**注意**  
`CreateImage` API 會自動將執行個體的 UEFI 變數存放區複製到 AMI。控制台使用 `CreateImage` API。使用此 AMI 啟動執行個體後，執行個體將具有相同的 UEFI 變數存放區。

## 任務 2 – 選項 B：建立一個包含預先填寫的變數存放區的二進位 blob
<a name="uefi-secure-boot-optionB"></a>

建立[三個金鑰對](#uefi-secure-boot-create-three-key-pairs)之後，您可以建立一個包含預先填寫的變數存放區 (包含 UEFI 安全開機金鑰) 的二進位 blob。或者，完成 [任務 2 – 選項 A：從執行個體中將金鑰新增至變數存放區](#uefi-secure-boot-optionA) 中的步驟。

**警告**  
您必須在註冊金鑰*之前*簽署開機映像，否則您將無法啟動執行個體。

**Topics**
+ [步驟 1：建立新的變數存放區或更新現有變數存放區](#uefi-secure-boot-create-or-update-variable)
+ [步驟 2：在建立 AMI 時上傳二進位 blob](#uefi-secure-boot-upload-binary-blob-on-ami-creation)

### 步驟 1：建立新的變數存放區或更新現有變數存放區
<a name="uefi-secure-boot-create-or-update-variable"></a>

您可以使用 python-uefivars 工具，在沒有執行個體執行的情況下*離線*建立變數存放區。該工具可以從您的金鑰建立一個新的變數存放區。指令碼目前支援 EDK2 格式、 AWS 格式和 JSON 表示法，以便使用高階工具進行編輯。

**在沒有執行個體執行的情況下離線建立變數存放區**

1. 在下列連結下載該工具。

   ```
   https://github.com/awslabs/python-uefivars
   ```

1. 通過執行下列命令從您的金鑰建立新的變數存放區。這將在 *your\$1binary\$1blob*.bin 中建立 base64 編碼二進位 blob。該工具還支援透過 `-I` 參數更新二進位 blob。

   ```
   ./uefivars.py -i none -o aws -O your_binary_blob.bin -P PK.esl -K KEK.esl --db db.esl --dbx dbx.esl
   ```

### 步驟 2：在建立 AMI 時上傳二進位 blob
<a name="uefi-secure-boot-upload-binary-blob-on-ami-creation"></a>

使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) 傳遞您的 UEFI 變數存放區資料。對於 `--uefi-data` 參數，請指定您的二進位 blob，而對於 `--boot-mode` 參數，則指定 `uefi`。

```
aws ec2 register-image \
    --name uefi_sb_tpm_register_image_test \
    --uefi-data $(cat your_binary_blob.bin) \
    --block-device-mappings "DeviceName=/dev/sda1,Ebs= {SnapshotId=snap-0123456789example,DeleteOnTermination=true}" \
    --architecture x86_64 \
    --root-device-name /dev/sda1 \
    --virtualization-type hvm \
    --ena-support \
    --boot-mode uefi
```

# 建立 AWS UEFI 安全開機的二進位 Blob
<a name="aws-binary-blob-creation"></a>

您可以使用以下步驟在 AMI 建立過程中自定義 UEFI 安全開機變數。在這些步驟中使用的 KEK 截至 2021 年 9 月都是最新的。如果 Microsoft 更新 KEK，則您必須使用最新的 KEK。

**建立 AWS 二進位 Blob**

1. 建立一個空白的 PK 簽章清單。

   ```
   touch empty_key.crt
   cert-to-efi-sig-list empty_key.crt PK.esl
   ```

1. 下載 KEK 憑證。

   ```
   https://go.microsoft.com/fwlink/?LinkId=321185
   ```

1. 將 KEK 憑證包裝在 UEFI 簽章清單中 (`siglist`)。

   ```
   sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_Win_KEK.esl MicCorKEKCA2011_2011-06-24.crt 
   ```

1. 下載 Microsoft 的 db 憑證。

   ```
   https://www.microsoft.com/pkiops/certs/MicWinProPCA2011_2011-10-19.crt
   https://www.microsoft.com/pkiops/certs/MicCorUEFCA2011_2011-06-27.crt
   ```

1. 產生 db 簽章清單。

   ```
   sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_Win_db.esl MicWinProPCA2011_2011-10-19.crt
   sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_UEFI_db.esl MicCorUEFCA2011_2011-06-27.crt
   cat MS_Win_db.esl MS_UEFI_db.esl > MS_db.esl
   ```

1. Unified Extensible Firmware Interface 論壇不再提供 DBX 檔案。這些檔案目前由 Microsoft 在 GitHub 上提供。請前往 [ https://github.com/microsoft/secureboot\$1objects](https://github.com/microsoft/secureboot_objects)，透過 Microsoft 安全啟動更新儲存庫下載最新 DBX 更新。

1. 解壓縮簽署的 update-binary。

   透過下面的指令碼內容來建立 `SplitDbxContent.ps1`。或者，您可使用 `Install-Script -Name SplitDbxContent`，透過 [PowerShell Gallery](https://www.powershellgallery.com/packages/SplitDbxContent/1.0) 來安裝指令碼。

   ```
   <#PSScriptInfo
    
   .VERSION 1.0
    
   .GUID ec45a3fc-5e87-4d90-b55e-bdea083f732d
    
   .AUTHOR Microsoft Secure Boot Team
    
   .COMPANYNAME Microsoft
    
   .COPYRIGHT Microsoft
    
   .TAGS Windows Security
    
   .LICENSEURI
    
   .PROJECTURI
    
   .ICONURI
    
   .EXTERNALMODULEDEPENDENCIES
    
   .REQUIREDSCRIPTS
    
   .EXTERNALSCRIPTDEPENDENCIES
    
   .RELEASENOTES
   Version 1.0: Original published version.
    
   #>
   
   <#
   .DESCRIPTION
    Splits a DBX update package into the new DBX variable contents and the signature authorizing the change.
    To apply an update using the output files of this script, try:
    Set-SecureBootUefi -Name dbx -ContentFilePath .\content.bin -SignedFilePath .\signature.p7 -Time 2010-03-06T19:17:21Z -AppendWrite'
   .EXAMPLE
   .\SplitDbxAuthInfo.ps1 DbxUpdate_x64.bin
   #>
   
   
   # Get file from script input
   $file  = Get-Content -Encoding Byte $args[0]
   
   # Identify file signature
   $chop = $file[40..($file.Length - 1)]
   if (($chop[0] -ne 0x30) -or ($chop[1] -ne 0x82 )) {
       Write-Error "Cannot find signature"
       exit 1
   }
   
   # Signature is known to be ASN size plus header of 4 bytes
   $sig_length = ($chop[2] * 256) + $chop[3] + 4
   $sig = $chop[0..($sig_length - 1)]
   
   if ($sig_length -gt ($file.Length + 40)) {
       Write-Error "Signature longer than file size!"
       exit 1
   }
   
   # Content is everything else
   $content = $file[0..39] + $chop[$sig_length..($chop.Length - 1)]
   
   # Write signature and content to files
   Set-Content -Encoding Byte signature.p7 $sig
   Set-Content -Encoding Byte content.bin $content
   ```

   使用指令碼來解壓縮簽署的 DBX 檔案。

   ```
   PS C:\Windows\system32> SplitDbxContent.ps1 .\dbx.bin
   ```

   這會產生兩個檔案 - `signature.p7` 與 `content.bin`。在下一個步驟使用 `content.bin`。

1. 使用 `uefivars.py` 指令碼建置 UEFI 變數存放區。

   ```
   ./uefivars.py -i none -o aws -O uefiblob-microsoft-keys-empty-pk.bin -P ~/PK.esl -K ~/MS_Win_KEK.esl --db ~/MS_db.esl  --dbx ~/content.bin 
   ```

1. 檢查二進位 blob 和 UEFI 變數存放區。

   ```
   ./uefivars.py -i aws -I uefiblob-microsoft-keys-empty-pk.bin -o json | less
   ```

1. 您可以透過再次將 blob 傳遞給同一工具來更新 Blob。

   ```
   ./uefivars.py -i aws -I uefiblob-microsoft-keys-empty-pk.bin -o aws -O uefiblob-microsoft-keys-empty-pk.bin -P ~/PK.esl -K ~/MS_Win_KEK.esl --db ~/MS_db.esl  --dbx ~/content.bin
   ```

   預期的輸出結果

   ```
   Replacing PK
   Replacing KEK
   Replacing db
   Replacing dbx
   ```