

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

# EC2 執行個體上的精確時鐘和時間同步
<a name="set-time"></a>

對許多伺服器任務和流程而言，Amazon EC2 執行個體上一致且精準的時間參考至關重要。在識別問題發生的時間和事件的時間順序方面，系統日誌中的時間戳記扮演著至關重要的角色。當您使用 AWS CLI 或 AWS 開發套件從執行個體發出請求時，這些工具會代表您簽署請求。如果您執行個體的日期和時間設定不正確，可能會導致簽章中的日期與請求的日期之間存在差異，進而 AWS 拒絕您的請求。

為了解決這個重要層面，Amazon 提供 Amazon Time Sync Service，此服務可從所有 EC2 執行個體存取和提供不同 AWS 服務使用。此服務在每個 中使用衛星連接和原子參考時鐘機群 AWS 區域 ，以提供國際標準時間 (UTC) 全球標準的準確和目前時間讀數。

為獲得最佳效能，建議您在 EC2 執行個體上使用[本機 Amazon Time Sync Service](configure-ec2-ntp.md)。對於備份到執行個體上的本機 Amazon Time Sync Service，以及將 Amazon EC2 以外的資源連線至 Amazon Time Sync Service，您可以使用位於 `time.aws.com` 的[公有 Amazon Time Sync Service](configure-time-sync.md)。公有 Amazon Time Sync Service (例如本機 Amazon Time Sync Service)，會自動消彌加至 UTC 的任何閏秒。我們每個 中的衛星連線和原子參考時鐘機群都支援 Amazon Time Sync Service AWS 區域。

## 硬體封包時間戳記
<a name="hardware-packet-timestamping"></a>

您可在執行個體上啟用硬體封包時間戳記功能，為每個傳入的網路封包新增 64 位元奈秒精確度的時間戳記。由於硬體封包時間戳記在硬體層級執行，早於封包抵達核心、通訊端或應用程式層級，因此可規避軟體時間戳記帶來的任何延遲。硬體時間戳記的基礎參考時鐘是 Amazon Time Sync Service 的 [PTP 硬體時鐘](configure-ec2-ntp.md#connect-to-the-ptp-hardware-clock)。

**優勢**

硬體封包時間戳記提供以下優點：
+ 改善事件排序，也可用於判斷封包到達 EC2 執行個體的實際順序，以確保公平的封包處理。
+ 測量單向網路延遲。
+ 與大多數內部部署解決方案相比，透過更高的精確度與準確度提升分散式交易速度。

**先決條件與組態**

若要啟用硬體封包時間戳記，您的執行個體必須符合以下先決條件：
+ 必須是 Linux 執行個體。
+ 滿足[支援 PTP 硬體時鐘的要求](configure-ec2-ntp.md#ptp-hardware-clock-requirements)。

有關組態指示，請參閱 *GitHub* 上**彈性網路介面卡 (ENA) 系列 Linux 核心驅動程式**頁面上的[硬體封包時間戳記](https://github.com/amzn/amzn-drivers/tree/master/kernel/linux/ena#hardware-packet-timestamping)。

## 閏秒
<a name="leap-seconds"></a>

1972 年推出的閏秒是為了消彌由於地球自轉速度不穩定，導致國際原子時間 (TAI) 與太陽時間 (Ut1) 之間產生的差異，而不定期校正 UTC 時間的一秒鐘。為了代表客戶管理閏秒，我們在 Amazon Time Sync Service 中設計了閏秒消彌機制。如需詳細資訊，請參閱[閏秒搶先報：即將到來的閏秒和 AWS](https://aws.amazon.com/blogs/aws/look-before-you-leap-the-coming-leap-second-and-aws/)。

[國際度量衡局第 27 屆大會決議，將在 2035 年之前取消閏秒](https://www.bipm.org/en/cgpm-2022/resolution-4)，我們全力支持這項決議。

為了支援這次轉變，我們仍計劃透過本機 NTP 連線或公有 NTP 集區 (`time.aws.com`) 存取 Amazon Time Sync Service 時，在閏秒事件期間消彌時間。不過 PTP 硬體時鐘不提供消彌時間選項。如果發生閏秒，PTP 硬體時鐘會依照 UTC 標準加上閏秒。在大多數情況下，消彌的閏秒和閏秒時間來源相同。但由於閏秒事件期間會有所不同，所以不建議在閏秒事件期間，在您的時間用戶端組態中同時使用消彌和未消彌的時間來源。

 

**Topics**
+ [硬體封包時間戳記](#hardware-packet-timestamping)
+ [閏秒](#leap-seconds)
+ [設定 EC2 執行個體的時間參考以使用本機 Amazon Time Sync Service](configure-ec2-ntp.md)
+ [設定 EC2 執行個體上的時間參考，或將任何網際網路連線裝置設定為使用公用的 Amazon Time Sync Service](configure-time-sync.md)
+ [比較 Linux 執行個體的時間戳記](compare-timestamps-with-clockbound.md)
+ [變更執行個體的時區](change-time-zone-of-instance.md)

 

**相關資源**
+ AWS 運算部落格：[這是關於時間：Amazon EC2 執行個體上的微秒準確時鐘](https://aws.amazon.com/blogs/compute/its-about-time-microsecond-accurate-clocks-on-amazon-ec2-instances/)
+ AWS 雲端操作與遷移部落格：[使用 Amazon Time Sync Service 和 Amazon CloudWatch 管理 Amazon EC2 執行個體時鐘準確性 – 第 1 部分 Amazon CloudWatch ](https://aws.amazon.com/blogs/mt/manage-amazon-ec2-instance-clock-accuracy-using-amazon-time-sync-service-and-amazon-cloudwatch-part-1/)
+ (Linux) [https://chrony-project.org/](https://chrony-project.org/)

# 設定 EC2 執行個體的時間參考以使用本機 Amazon Time Sync Service
<a name="configure-ec2-ntp"></a>

本機 Amazon Time Sync Service 可以使用網路時間通訊協定 (NTP)，或在[支援的執行個體](#ptp-hardware-clock-requirements)上提供本機精確時間協定 (PTP) 硬體時鐘。PTP 硬體時鐘支援 NTP 連線 (Linux 和 Windows 執行個體) 或直接 PTP 連線 (僅限 Linux 執行個體)。NTP 和直接 PTP 連線使用的是相同高度精確時間來源，但直接 PTP 連線比 NTP 連線更精確。與 Amazon Time Sync Service 的 NTP 連線支援飛躍塗抹，而 PTP 與 PTP 硬體時鐘的連線不會塗抹時間。如需詳細資訊，請參閱[閏秒](set-time.md#leap-seconds)。

您的執行個體可以存取本機 Amazon Time Sync Service，如下所示：
+ 透過位於下列 IP 地址端點的 NTP：
  + IPv4：`169.254.169.123`
  + IPv6：`fd00:ec2::123` (僅在 [Nitro 型執行個體](instance-types.md#instance-hypervisor-type)上存取。)
+ (僅限 Linux) 透過直接 PTP 連線連接至本機 PTP 硬體時鐘：
  + `PHC0`

Amazon Linux AMIs、Windows AMIs 和大多數合作夥伴 AMI 會根據預設設定執行個體使用 NTP IPv4 端點。這是大多數客戶工作負載的建議設定。除非您要使用 IPv6 端點或直接連接到 PTP 硬體時鐘，否則從這些 AMI 啟動的執行個體不需要進一步的設定。

NTP 和 PTP 連線不需要變更任何 VPC 組態，而且執行個體不需要存取網際網路。

**考量事項**
+ 使用[連結本機](using-instance-addressing.md#link-local-addresses)位址的服務有每秒 1024 個封包 (PPS) 限制。此限制包括 [Route 53 Resolver DNS 查詢](https://docs.aws.amazon.com/vpc/latest/userguide/AmazonDNS-concepts.html#vpc-dns-limits)、[執行個體中繼資料服務 (IMDS)](instancedata-data-retrieval.md) 請求、Amazon Time Service Network Time Protocol (NTP) 請求和 [Windows Licensing Service (適用於 Microsoft Windows 型執行個體)](https://aws.amazon.com/windows/resources/licensing/) 請求的彙總。
+ 僅 Linux 執行個體可使用*直接 PTP 連線*連接至本機 PTP 硬體時鐘。Windows 執行個體使用 NTP 連線到本機 PTP 硬體時鐘。

**Topics**
+ [連接至 Amazon Time Sync Service 的 IPv4 端點](#configure-amazon-time-service-IPv4)
+ [連接至 Amazon Time Sync Service 的 IPv6 端點](#configure-amazon-time-service-IPv6)
+ [連接至 PTP 硬體時鐘](#connect-to-the-ptp-hardware-clock)

## 連接至 Amazon Time Sync Service 的 IPv4 端點
<a name="configure-amazon-time-service-IPv4"></a>

您的 AMI 可能依預設已設定 Amazon Time Sync Service。否則，請使用下列程序，將您的執行個體設定為透過 IPv4 端點使用本機 Amazon Time Sync Service。

如需對問題進行故障診斷的協助，請參閱[針對 Linux 執行個體上的 NTP 同步問題進行故障診斷](https://repost.aws/knowledge-center/linux-troubleshoot-ntp-synchronization)，或[針對 Windows 執行個體上的時間問題進行故障診斷](https://repost.aws/knowledge-center/ec2-windows-time-service)。

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

預設情況下，AL2023 和最新版的 Amazon Linux 2 設定為使用 Amazon Time Sync Service IPv4 端點。若您確認您的執行個體已設定，可以略過下列程序。

**驗證 chrony 是否設定為使用 IPv4 端點**  
執行下列命令。在輸出中，以 `^*` 開頭的行表示偏好的時間來源。

```
chronyc sources -v | grep -F ^*
^* 169.254.169.123               3   4   377    14    +12us[+9653ns] +/-  290us
```

**設定 chrony，以連線至舊版 Amazon Linux 2 上的 IPv4 端點**

1. 連線到您的執行個體，然後解除安裝 NTP 服務。

   ```
   [ec2-user ~]$ sudo yum erase 'ntp*'
   ```

1. 安裝 `chrony` 套裝服務。

   ```
   [ec2-user ~]$ sudo yum install chrony
   ```

1. 使用文字編輯器 (例如 `/etc/chrony.conf` 或 **vim**) 開啟 **nano** 檔案。將下列程式碼新增在檔案中已有之任何其他 `server` 或 `pool` 的陳述式之前，然後儲存您的變更：

   ```
   server 169.254.169.123 prefer iburst minpoll 4 maxpoll 4
   ```

1. 重新啟動 `chrony` 協助程式 (`chronyd`)。

   ```
   [ec2-user ~]$ sudo service chronyd restart
   ```

   ```
   Starting chronyd:                                          [  OK  ]
   ```
**注意**  
在 RHEL 和 CentOS (最新為 6 版) 上，服務名稱為 `chrony`，而不是 `chronyd`。

1. 使用 `chkconfig` 命令設定 `chronyd` 在每次系統開機時啟動。

   ```
   [ec2-user ~]$ sudo chkconfig chronyd on
   ```

1. 確認 `chrony` 是否使用 `169.254.169.123` IPv4 端點來同步時間。

   ```
   [ec2-user ~]$ chronyc sources -v | grep -F ^*
   ```

   在輸出中，`^*` 表示偏好的時間來源。

   ```
   ^* 169.254.169.123               3   6    17    43    -30us[ -226us] +/-  287us
   ```

1. 確認時間同步指標是否由 `chrony` 回報。

   ```
   [ec2-user ~]$ chronyc tracking
   ```

   ```
   Reference ID    : A9FEA97B (169.254.169.123)
   Stratum         : 4
   Ref time (UTC)  : Wed Nov 22 13:18:34 2017
   System time     : 0.000000626 seconds slow of NTP time
   Last offset     : +0.002852759 seconds
   RMS offset      : 0.002852759 seconds
   Frequency       : 1.187 ppm fast
   Residual freq   : +0.020 ppm
   Skew            : 24.388 ppm
   Root delay      : 0.000504752 seconds
   Root dispersion : 0.001112565 seconds
   Update interval : 64.4 seconds
   Leap status     : Normal
   ```

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

**設定 chrony，以連線至 Ubuntu 上的 IPv4 端點**

1. 連線至您的執行個體，然後使用 `apt` 來安裝 `chrony` 套件。

   ```
   ubuntu:~$ sudo apt install chrony
   ```
**注意**  
如有必要，請執行 `sudo apt update` 先更新您的執行個體。

1. 使用文字編輯器 (例如 `/etc/chrony/chrony.conf` 或 **vim**) 開啟 **nano** 檔案。將下列程式碼新增在檔案中已有之任何其他 `server` 或 `pool` 的陳述式之前，然後儲存您的變更：

   ```
   server 169.254.169.123 prefer iburst minpoll 4 maxpoll 4
   ```

1. 重新啟動 `chrony` 服務。

   ```
   ubuntu:~$ sudo /etc/init.d/chrony restart
   ```

   ```
   Restarting chrony (via systemctl): chrony.service.
   ```

1. 確認 `chrony` 是使用 `169.254.169.123` IPv4 端點來同步時間。

   ```
   ubuntu:~$ chronyc sources -v | grep -F ^*
   ```

   在輸出中，以 `^*` 開頭的行表示偏好的時間來源。

   ```
   ^* 169.254.169.123               3   6    17    12    +15us[  +57us] +/-  320us
   ```

1. 確認時間同步指標是否由 `chrony` 回報。

   ```
   ubuntu:~$ chronyc tracking
   ```

   ```
   Reference ID    : 169.254.169.123 (169.254.169.123)
   Stratum         : 4
   Ref time (UTC)  : Wed Nov 29 07:41:57 2017
   System time     : 0.000000011 seconds slow of NTP time
   Last offset     : +0.000041659 seconds
   RMS offset      : 0.000041659 seconds
   Frequency       : 10.141 ppm slow
   Residual freq   : +7.557 ppm
   Skew            : 2.329 ppm
   Root delay      : 0.000544 seconds
   Root dispersion : 0.000631 seconds
   Update interval : 2.0 seconds
   Leap status     : Normal
   ```

------
#### [ SUSE Linux ]

從 SUSE Linux Enterprise Server 15 開始，`chrony` 是 NTP 的預設實作。

**設定 chrony，以連線至 SUSE Linux 上的 IPv4 端點**

1. 使用文字編輯器 (例如 `/etc/chrony.conf` 或 **vim**) 開啟 **nano** 檔案。

1. 確認檔案是否包含下列程式碼行：

   ```
   server 169.254.169.123 prefer iburst minpoll 4 maxpoll 4
   ```

   如果此程式碼不存在，請新增它。

1. 將任何其他伺服器或集區的程式碼行變更為註解。

1. 開啟 YaST 並啟用 chrony 服務。

------
#### [ Windows ]

從 2018 年 8 月版本開始，Windows AMI 預設會使用 Amazon Time Sync Service。從這些 AMI 啟動的執行個體不需要進一步的設定，您可以略過下列程序。

如果您使用的 AMI 未依預設設定 Amazon Time Sync Service，請先驗證您目前的 NTP 組態。如果您的執行個體已在使用 Amazon Time Sync Service 的 IPv4 端點，則無需進一步設定。如果您的執行個體不是使用 Amazon Time Sync Service，請完成程序，將 NTP 伺服器變更為使用 Amazon Time Sync Service。

**確認 NTP 組態**

1. 從執行個體中，開啟命令提示視窗。

1. 輸入下列命令，以取得目前 NTP 組態：

   ```
   w32tm /query /configuration
   ```

   此命令會傳回 Windows 執行個體目前的組態設定，並顯示是否已連接至 Amazon Time Sync Service。

1. (選用) 輸入下列命令，以取得目前組態的狀態：

   ```
   w32tm /query /status
   ```

   此命令會傳回資訊，例如執行個體最後一次與 NTP 伺服器同步的時間以及輪詢間隔。

**將 NTP 伺服器改為使用 Amazon Time Sync Service**

1. 從命令提示視窗，執行下列命令：

   ```
   w32tm /config /manualpeerlist:169.254.169.123 /syncfromflags:manual /update
   ```

1. 使用下列命令，確認新設定：

   ```
   w32tm /query /configuration
   ```

   在傳回的輸出中，確認 `NtpServer` 顯示 `169.254.169.123` IPv4 端點。

**Amazon Windows AMI 的預設 NTP 設定**

Amazon Machine Images (AMIs) 通常依循立即可用的預設值，但需要變更才能在 EC2 基礎設施上運作的狀況除外。下列設定已確認在虛擬化環境中運作良好，以及可將任何時鐘漂移保持在一秒的準確度內：
+ **更新間隔** – 規範時間服務將系統時間調整為準確性的頻率。 會將更新間隔 AWS 設定為每兩分鐘發生一次。
+ **NTP 伺服器**：從 2018 年 8 月發行版本開始，AMI 預設使用 Amazon Time Sync Service。這次服務可從 AWS 區域 169.254.169.123 IPv4 端點的任何 存取。此外，0x9 標記表示時間服務正作為用戶端，並使用 `SpecialPollInterval` 來判定以設定的時間伺服器進行查入的頻率。
+ **類型** – “NTP” 表示服務將充當獨立式 NTP 用戶端，而不是充當網域的一部分。
+ **Enabled 和 InputProvider**：時間服務已啟用，並提供時間給作業系統。
+ **特殊輪詢間隔**：每 900 秒 (15 分鐘) 檢查一次已設定的 NTP 伺服器。
**注意**  
對於 Windows Server 2025 AMIs，`SpecialPollInterval`值為 1024 秒，而不是 900 秒。


| 登錄檔路徑 | 金鑰名稱 | 資料 | 
| --- | --- | --- | 
|  HKLM:\$1System\$1CurrentControlSet\$1services\$1w32time\$1Config  |  UpdateInterval  | 120 | 
| HKLM:\$1System\$1CurrentControlSet\$1services\$1w32time\$1Parameters | NtpServer | 169.254.169.123,0x9 | 
| HKLM:\$1System\$1CurrentControlSet\$1services\$1w32time\$1Parameters | 類型 | NTP | 
| HKLM:\$1System\$1CurrentControlSet\$1services\$1w32time\$1TimeProviders\$1NtpClient | Enabled | 1 | 
| HKLM:\$1System\$1CurrentControlSet\$1services\$1w32time\$1TimeProviders\$1NtpClient | InputProvider | 1 | 
| HKLM:\$1System\$1CurrentControlSet\$1services\$1w32time\$1TimeProviders\$1NtpClient | SpecialPollInterval | 900 (Windows Server 2016、2019 和 2022) 或 1024 (Windows Server 2025) | 

------

## 連接至 Amazon Time Sync Service 的 IPv6 端點
<a name="configure-amazon-time-service-IPv6"></a>

本節說明如要設定執行個體以透過 IPv6 端點使用本機 Amazon Time Sync Service，步驟與 [連接至 Amazon Time Sync Service 的 IPv4 端點](#configure-amazon-time-service-IPv4) 所述有何不同。它不會說明整個 Amazon Time Sync Service 組態程序。

IPv6 端點僅在 [Nitro 型執行個體](instance-types.md#instance-hypervisor-type)上可供存取。

我們不建議同時使用 IPv4 和 IPv6 端點項目。IPv4 和 IPv6 NTP 封包來自您的執行個體的相同本機伺服器。同時設定 IPv4 和 IPv6 端點是不必要的做法，而且不會改善執行個體的時間準確性。

------
#### [ Linux ]

根據您使用的 Linux 發行版本，當您到達編輯 `chrony.conf` 檔案的步驟時，您將使用 Amazon Time Sync Service 的 IPv6 端點 (`fd00:ec2::123`)，而不是 IPv4 端點 (`169.254.169.123`)：

```
server fd00:ec2::123 prefer iburst minpoll 4 maxpoll 4
```

儲存檔案，並確認 chrony 是否使用 `fd00:ec2::123` IPv6 端點來同步時間：

```
[ec2-user ~]$ chronyc sources -v
```

在輸出中，如果有看到 `fd00:ec2::123` IPv6 端點，表示組態已完成。

------
#### [ Windows ]

當您到達將 NTP 伺服器變更為使用 Amazon Time Sync Service 的步驟時，您會使用 Amazon Time Sync Service (`fd00:ec2::123`) 的 IPv6 端點，而不是 IPv4 端點 (`169.254.169.123`)：

```
w32tm /config /manualpeerlist:fd00:ec2::123 /syncfromflags:manual /update
```

確認您的新設定正在使用 `fd00:ec2::123` IPv6 端點來同步時間：

```
w32tm /query /configuration
```

在輸出中，確認 `NtpServer` 顯示 `fd00:ec2::123` IPv6 端點。

------

## 連接至 PTP 硬體時鐘
<a name="connect-to-the-ptp-hardware-clock"></a>

PTP 硬體時鐘是 [AWS Nitro 系統](https://docs.aws.amazon.com/ec2/latest/instancetypes/ec2-nitro-instances.html)的一部分，因此可在[支援的裸機和虛擬化 EC2 執行個體](#ptp-hardware-clock-requirements)上直接存取，不會使用任何客戶資源。

PTP 硬體時鐘的 NTP 端點與一般 Amazon Time Sync Service 相同。如果您的執行個體具有 PTP 硬體時鐘，而且您已設定 NTP 連線 (連接 IPv4 或 IPv6 端點)，執行個體時間便會自動通過 NTP 使用 PTP 硬體時鐘。

針對 Linux 執行個體，您可以設定*直接* PTP 連線，這將為您提供比 NTP 連線更精準的時間。Windows 執行個體僅支援連接 PTP 硬體時鐘的 NTP 連線。

### 要求
<a name="ptp-hardware-clock-requirements"></a>

符合下列需求才能在執行個體上使用 PTP 硬體時鐘：
+ 支援 AWS 區域：美國東部 （維吉尼亞北部）、美國東部 （俄亥俄）、亞太區域 （馬來西亞）、亞太區域 （泰國）、亞太區域 （東京） 和歐洲 （斯德哥爾摩）
+ 支援的本地區域：美國東部 (紐約市)
+ 支援的執行個體系列：
  + **一般用途：**M7a、M7g、M7i
  + **記憶體最佳化：**R7a、R7g、R7i
  + **儲存最佳化：**I8g、I8ge
+ (僅限 Linux) 在支援的作業系統上安裝 ENA 驅動程式 2.10.0 版或更新版本。如需支援作業系統的詳細資訊，請參閱 *GitHub* 上的驅動程式[先決條件](https://github.com/amzn/amzn-drivers/tree/master/kernel/linux/ena#prerequisites)。

### (僅限 Linux) 設定 PTP 硬體時鐘的直接 PTP 連線
<a name="connect-to-the-ptp-hardware-clock-linux"></a>

本節說明如何使用直接 PTP 連線，將 Linux 執行個體設定為透過 PTP 硬體時鐘使用本機 Amazon Time Sync Service。需將 PTP 硬體時鐘的伺服器項目新增至 `chrony` 組態檔。

**設定 PTP 硬體時鐘的直接 PTP 連線 (僅限 Linux 執行個體)**

1. **安裝先決條件**

   連線到您的 Linux 執行個體，並執行下列動作：

   1. 安裝適用於彈性網路介面卡 (ENA) 2.10.0 版或更新版本的 Linux 核心驅動程式。

   1. 啟用 PTP 硬體時鐘。

   如需安裝指示，請參閱 *GitHub* 上的[適用於彈性網路介面卡 (ENA) 系列的 Linux 核心驅動程式](https://github.com/amzn/amzn-drivers/tree/master/kernel/linux/ena#linux-kernel-driver-for-elastic-network-adapter-ena-family)。

1. **驗證 ENA PTP 裝置**

   確認 ENA PTP 硬體時鐘裝置顯示在執行個體上。

   ```
   [ec2-user ~]$ for file in /sys/class/ptp/*; do echo -n "$file: "; cat "$file/clock_name"; done
   ```

   預期的輸出結果

   ```
   /sys/class/ptp/ptp<index>: ena-ptp-<PCI slot>
   ```

   其中：
   + `index` 為核心註冊的 PTP 硬體時鐘索引。
   + `PCI slot` 為 ENA 乙太網路控制器 PCI 插槽。此插槽與 `lspci | grep ENA` 中顯示的插槽相同。

   範例輸出

   ```
   /sys/class/ptp/ptp0: ena-ptp-05
   ```

   如果 `ena-ptp-<PCI slot>` 不在輸出中，表示 ENA 驅動程式未正確安裝。請參閱此程序中的步驟 1 以安裝驅動程式。

1. **設定 PTP 符號連結**

   PTP 裝置通常命名為 `/dev/ptp0`、`/dev/ptp1` 等，其索引取決於硬體初始化順序。建立符號連結可確保 chrony 等應用程式能一致參考正確的裝置，不受索引變更影響。

   最新的 Amazon Linux 2023 AMI 包含建立 `/dev/ptp_ena` 符號連結的 `udev` 規則，指向與 ENA 主機相關聯的正確 `/dev/ptp` 項目。

   首先透過執行下列命令，檢查符號連結是否存在。

   ```
   [ec2-user ~]$ ls -l /dev/ptp*
   ```

   範例輸出

   ```
   crw------- 1 root root 245, 0 Jan 31 2025 /dev/ptp0
   lrwxrwxrwx 1 root root      4 Jan 31 2025 /dev/ptp_ena -> ptp0
   ```

   其中：
   + `/dev/ptp<index>` 為 PTP 裝置的路徑。
   + `/dev/ptp_ena` 為固定的符號連結，指向同一個 PTP 裝置。

    

   若 `/dev/ptp_ena` 符號連結存在，跳至此程序的步驟 4。若遺失，請執行下列動作：

   1. 新增下列 `udev` 規則。

      ```
      [ec2-user ~]$ echo "SUBSYSTEM==\"ptp\", ATTR{clock_name}==\"ena-ptp-*\", SYMLINK += \"ptp_ena\"" | sudo tee -a /etc/udev/rules.d/53-ec2-network-interfaces.rules
      ```

   1. 透過重新啟動執行個體或執行下列命令，重新載入 `udev` 規則。

      ```
      [ec2-user ~]$ sudo udevadm control --reload-rules && udevadm trigger
      ```

1. **設定 chrony**

   chrony 必須設定為使用 `/dev/ptp_ena` 符號連結，而非直接參考 /`dev/ptp<index>`。

   1. 使用文字編輯器編輯 `/etc/chrony.conf`，然後在檔案中的任何位置新增以下行。

      ```
      refclock PHC /dev/ptp_ena poll 0 delay 0.000010 prefer
      ```

   1. 重新啟動 chrony。

      ```
      [ec2-user ~]$ sudo systemctl restart chronyd
      ```

1. **驗證 chrony 組態**

   確認 chrony 是使用 PTP 硬體時鐘來同步此執行個體上的時間。

   ```
   [ec2-user ~]$ chronyc sources
   ```

   預期的輸出結果

   ```
   MS Name/IP address         Stratum Poll Reach LastRx Last sample
   ===============================================================================
   #* PHC0                          0   0    377    1   +2ns[ +1ns] +/-   5031ns
   ```

   在傳回的輸出中，`*` 表示偏好的時間來源。`PHC0` 對應 PTP 硬體時鐘。重新啟動 chrony 之後，可能需要等待幾秒鐘，星號才會出現。

# 設定 EC2 執行個體上的時間參考，或將任何網際網路連線裝置設定為使用公用的 Amazon Time Sync Service
<a name="configure-time-sync"></a>

您可以將執行個體或任何連接網際網路的裝置 (例如本機電腦或內部部署伺服器) 設定為使用可透過網際網路從 `time.aws.com` 存取的公有 Amazon Time Sync Service。您可以使用公有 Amazon Time Sync Service 做為本機 Amazon Time Sync Service 的備份，並將 外部的資源連線至 AWS Amazon Time Sync Service。

**注意**  
為取得最佳效能，建議您在執行個體上使用*本機* Amazon Time Sync Service，並僅使用*公有* Amazon Time Sync Service 作為備份。

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

## Linux
<a name="configure-time-sync-linux"></a>

**若要將 Linux 執行個體或裝置設定為使用公有 Amazon Time Sync Service，請使用 chrony 或 ntpd**

1. 使用文字編輯器編輯 `/etc/chrony.conf` (若使用 chrony) 或 `/etc/ntp.conf` (若使用 ntpd)，如下所示：

   1. 若要防止執行個體或裝置嘗試混合已消彌和未消彌的伺服器，請刪除以 `server` 開頭的行或變成註解，但連接本機 Amazon Time Sync Service 的任何現有連線除外。
**重要**  
如果要將 EC2 執行個體設定為連接到公有 Amazon Time Sync Service，請勿移除以下行，這一行會將執行個體設定為連接到本機 Amazon Time Sync Service。本機 Amazon Time Sync Service 是更直接的連線，可提供更高的時鐘準確度。公有 Amazon Time Sync Service 只能當成備案。  

      ```
      server 169.254.169.123 prefer iburst minpoll 4 maxpoll 4
      ```

   1. 新增以下行以連接至公有 Amazon Time Sync Service。

      ```
      pool time.aws.com iburst
      ```

1. 使用以下其中一個命令重新啟動常駐程式。
   + chrony

     ```
     sudo service chronyd force-reload
     ```
   + ntpd

     ```
     sudo service ntp reload
     ```

## macOS
<a name="configure-time-sync-macos"></a>

**將您的 macOS 執行個體或裝置設定為使用公有 Amazon Time Sync Service**

1. 開啟 **System Preferences (系統偏好設定)**。

1. 選擇 **Date & Time** (日期與時間)，然後選擇 **Date & Time** (日期與時間) 標籤。

1. 若要進行變更，請選擇鎖定圖示，然後在出現提示時輸入您的密碼。

1. 對於**自動設定日期與時間**，輸入 **time.aws.com**。

## Windows
<a name="configure-time-sync-windows"></a>

**將您的 Windows 執行個體或裝置設定為使用公有 Amazon Time Sync Service**

1. 開啟 **Control Panel** (主控台)。

1. 選擇 **Date and Time** (日期與時間) 圖示。

1. 選擇 **Internet Time** (網際網路時間) 標籤。如果您的 PC 是網域的一部分，就無法使用此索引標籤。在這種情況下，系統會與網域控制器同步時間。您可以將控制器設定為使用公有 Amazon Time Sync Service。

1. 選擇 **Change settings** (變更設定)。

1. 選取**與網際網路時間伺服器同步**的核取方塊。

1. 在**伺服器**旁，輸入 **time.aws.com**。

**將您的 Windows Server 執行個體或裝置設定為使用公有 Amazon Time Sync Service**
+ 遵照 [Microsoft 的指示](https://support.microsoft.com/en-us/kb/816042)，更新您的登錄檔。

# 比較 Linux 執行個體的時間戳記
<a name="compare-timestamps-with-clockbound"></a>

如果您使用的是 Amazon Time Sync Service，則可以將 Amazon EC2 Linux 執行個體上的時間戳記與 ClockBound 進行比較，來判斷事件的真實時間。ClockBound 會測量 EC2 執行個體的時鐘準確度，並允許您檢查給定的時間戳記相對於執行個體的目前時鐘是過去還是未來。此資訊對於判斷 EC2 執行個體之間事件和交易的順序和一致性非常有用，而且與每個執行個體的地理位置無關。

ClockBound 是一種開放原始碼常駐程式和程式庫。若要進一步了解 ClockBound (包括安裝指示)，請參閱 [GitHub](https://github.com/aws/clock-bound) 上的 *ClockBound*。

ClockBound 僅支援 Linux 執行個體。

如果您正在使用連接 PTP 硬體時鐘的直接 PTP 連線，您的時間常駐程式 (例如 chrony) 將低估時鐘誤差範圍。這是因為 PTP 硬體時鐘不會像 NTP 那樣傳遞正確的誤差範圍資訊至 chrony。因此，時鐘同步處理常駐程式會假設時鐘是根據 UTC 調整準確度，因此會有誤差範圍 `0`。為了測量完整的誤差範圍，Nitro 系統會計算 PTP 硬體時鐘的誤差範圍，並透過 ENA 驅動程式 `sysfs` 檔案系統提供給 EC2 執行個體。您可以直接將此值讀取為值，以奈秒為單位。

**擷取 PTP 硬體時鐘錯誤繫結**

1. 首先使用下列其中一個命令，取得 PTP 硬體時鐘裝置的正確位置。命令中的路徑會根據用來啟動執行個體的 AMI 而有所不同。
   + 針對 Amazon Linux 2：

     ```
     cat /sys/class/net/eth0/device/uevent | grep PCI_SLOT_NAME
     ```
   + 針對 Amazon Linux 2023：

     ```
     cat /sys/class/net/ens5/device/uevent | grep PCI_SLOT_NAME
     ```

   輸出是 PCI 插槽名稱，也就是 PTP 硬體時鐘裝置的位置。在此範例中，位置為 `0000:00:03.0`。

   ```
   PCI_SLOT_NAME=0000:00:03.0
   ```

1. 若要擷取 PTP 硬體時鐘錯誤繫結，請執行下列命令。包含上一個步驟的 PCI 插槽名稱。

   ```
   cat /sys/bus/pci/devices/0000:00:03.0/phc_error_bound
   ```

   輸出即為 PTP 硬體時鐘的時鐘誤差範圍 (以奈秒為單位)。

若要計算使用直接 PTP 連線連接 PTP 硬體時鐘時，特定時間點的正確時鐘誤差範圍，您必須在 chrony 輪詢 PTP 硬體時鐘時，從 chrony 或 ClockBound 新增時鐘誤差範圍。如需有關測量和監控時鐘準確度的詳細資訊，請參閱[使用 Amazon Time Sync Service 和 Amazon CloudWatch 管理 Amazon EC2 執行個體時鐘準確度：第 1 部分](https://aws.amazon.com/blogs/mt/manage-amazon-ec2-instance-clock-accuracy-using-amazon-time-sync-service-and-amazon-cloudwatch-part-1/)。

# 變更執行個體的時區
<a name="change-time-zone-of-instance"></a>

Amazon EC2 執行個體預設為 UTC (國際標準時間) 時區。您可以將執行個體上的時間變更為當地時區或網路中的另一個時區。

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

## Linux
<a name="change_time_zone"></a>

**重要**  
此資訊適用於 Amazon Linux。如需其他分發的詳細資訊，請參閱其特定文件。

**變更 Amazon Linux 的時區**

1. 檢視系統目前的時區設定。

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

1. 列出可用的時區。

   ```
   [ec2-user ~]$ timedatectl list-timezones
   ```

1. 設定選擇的時區。

   ```
   [ec2-user ~]$ sudo timedatectl set-timezone America/Vancouver
   ```

1. (選用) 再次執行 **timedatectl** 命令確認目前的時區已更新為新的時區。

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

## Windows
<a name="windows-changing-time-zone"></a>

**變更 Windows 執行個體的時區**

1. 從執行個體中，開啟命令提示視窗。

1. 找出執行個體使用的時區。若要取得時區清單，請使用下列命令：

   ```
   tzutil /l
   ```

   此命令會傳回所有可用時區的清單，格式如下：

   ```
   display name
   time zone ID
   ```

1. 找出要指派給執行個體的時區 ID。

1. 範例：指派 UTC 時區：

   ```
   tzutil /s "UTC"
   ```

   範例：指派太平洋標準時間：

   ```
   tzutil /s "Pacific Standard Time"
   ```

當您變更 Windows 執行個體上的時區時，必須確定在系統重新啟動之後仍然會持續保留時區。否則，執行個體重新啟動時，會回復成使用 UTC 時間。您可以新增 **RealTimeIsUniversal** 登錄金鑰來保留時區設定。依預設，此機碼會在所有最新一代的執行個體上設定。若要驗證是否已設定**RealTimeIsUniversal**登錄機碼，請參閱下列程序中的步驟 3。如果未設定機碼，請從頭開始執行下列步驟。

**設定 RealTimeIsUniversal 登錄機碼**

1. 從執行個體中，開啟命令提示視窗。

1. 使用下列命令，新增登錄機碼：

   ```
   reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation" /v RealTimeIsUniversal /d 1 /t REG_DWORD /f
   ```

1. (選用) 使用下列命令，確認執行個體已順利儲存機碼：

   ```
   reg query "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation" /s
   ```

   此命令會傳回 **TimeZoneInformation** 登錄機碼的子機碼。您應該會在清單底端看到 **RealTimeIsUniversal** 機碼，類似以下：

   ```
   HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation
       Bias                            REG_DWORD     0x1e0
       DaylightBias                    REG_DWORD     0xffffffc4
       DaylightName                    REG_SZ        @tzres.dll,-211
       DaylightStart                   REG_BINARY    00000300020002000000000000000000
       StandardBias                    REG_DWORD     0x0
       StandardName                    REG_SZ        @tzres.dll,-212
       StandardStart                   REG_BINARY    00000B00010002000000000000000000
       TimeZoneKeyName                 REG_SZ        Pacific Standard Time
       DynamicDaylightTimeDisabled     REG_DWORD     0x0
       ActiveTimeBias                  REG_DWORD     0x1a4
       RealTimeIsUniversal             REG_DWORD     0x1
   ```