

# 在 EC2 实例上实现精确时钟和时间同步
<a name="set-time"></a>

对于许多服务器任务和进程来说，Amazon EC2 实例上准确一致的时间参考是非常重要的。系统日志中的时间戳在识别问题发生的时间和事件的时间顺序方面起着至关重要的作用。使用 AWS CLI 或 AWS SDK 从您的实例发送请求时，这些工具会以您的名义签署请求。如果实例的日期和时间设置不准确，可能会导致签名中的日期和请求的日期之间存在差异，进而导致 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 内核驱动程序系列**页面上的 [Hardware Packet Timestamping](https://github.com/amzn/amzn-drivers/tree/master/kernel/linux/ena#hardware-packet-timestamping)。

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

闰秒的概念于 1972 年引入，是偶尔对 UTC 时间进行一秒钟的调整，将地球自转中的不规则性考虑在内，以适应国际原子时间（TAI）和太阳时（Ut1）之间的差异。为了代表客户管理闰秒，我们在 Amazon Time Sync Service 中设计了闰秒涂抹。有关更多信息，请参阅 [Look Before You Leap – The Coming Leap Second and 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 计算博客：[It’s About Time: Microsecond-Accurate Clocks on Amazon EC2 Instances](https://aws.amazon.com/blogs/compute/its-about-time-microsecond-accurate-clocks-on-amazon-ec2-instances/)
+ AWS Cloud Operations & Migrations Blog：[使用 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/)
+ （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，如下所示：
+ 通过 NTP 在以下 IP 地址端点进行访问：
  + IPv4：`169.254.169.123`
  + IPv6：`fd00:ec2::123`（只能在[基于 Nitro的实例](instance-types.md#instance-hypervisor-type)上访问。）
+ （仅限 Linux）通过直接 PTP 连接连接到本地 PTP 硬件时钟进行访问：
  + `PHC0`

Amazon Linux AMI、Windows AMI 和大多数合作伙伴 AMI 都将您的实例配置为默认使用 NTP IPv4 端点。这是大多数客户工作负载的建议设置。除非您希望使用 IPv6 端点或直接连接到 PTP 硬件时钟，否则从这些 AMI 启动的实例无需进行进一步配置。

NTP 连接和 PTP 连接不需要更改任何 VPC 配置，您的实例也不需要访问互联网。

**注意事项**
+ 对于使用[本地链路](using-instance-addressing.md#link-local-addresses)地址的服务，每秒数据包数（PPS）限制为 1024 个。此限制是 [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 网络时间协议（NTP）请求和 [Windows 许可服务（适用于基于 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. 使用任何文本编辑器（如 **nano** 或 **vim**）打开 `/etc/chrony.conf` 文件。在该文件中可能存在的其他 `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. 要配置 `chronyd` 为在每次系统启动时启动，请使用 `chkconfig` 命令。

   ```
   [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. 使用任何文本编辑器（如 **nano** 或 **vim**）打开 `/etc/chrony/chrony.conf` 文件。在该文件中已包含的任何其他 `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 设置**

亚马逊机器映像（AMI）通常符合现成的默认值，但在需要更改以便在 EC2 基础设施上正常工作的情况除外。以下设置已确定可在虚拟环境中正常工作，此外，还可将任何时间偏差保持在一秒的准确率内：
+ **更新间隔** – 控制时间服务调整系统时间准确性的频率。AWS 将更新间隔配置为每两分钟发生一次。
+ **NTP 服务器** – 从 2018 年 8 月版本开始，AMI 默认使用 Amazon Time Sync Service。此时间服务可通过位于 169.254.169.123 IPv4 端点的任何 AWS 区域 访问。此外，0x9 标记指示时间服务充当客户端，并使用 `SpecialPollInterval` 来确定与所配置的时间服务器核查时间的频率。
+ **类型** –“NTP”指示服务将充当独立的 NTP 客户端而不是作为域的一部分。
+ **已启用和 InputProvider** – 时间服务已启用并向操作系统提供时间。
+ **特殊轮询间隔**：对照所配置的 NTP 服务器，每 900 秒（即 15 分钟）检查一次。
**注意**  
对于 Windows Server 2025 AMI，`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 | 启用 | 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 的 IPv6 端点（`fd00:ec2::123`），而不是 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 System](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 区域：美国东部（弗吉尼亚州北部）、美国东部（俄亥俄州）、亚太地区（马来西亚）、亚太地区（泰国）、亚太地区（东京）和欧洲地区（斯德哥尔摩）
+ 支持的 Local Zones：美国东部（纽约市）
+ 支持的实例系列：
  + **通用型：**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 连接通过 PTP 硬件时钟将您的 Linux 实例配置为使用本地 Amazon Time Sync Service。需要在 `chrony` 配置文件中添加 PTP 硬件时钟的服务器条目。

**要配置到 PTP 硬件时钟的直接 PTP 链接（仅限 Linux 实例）**

1. **安装必备组件**

   连接到您的 Linux 实例并执行以下操作：

   1. 安装弹性网络适配器（ENA）版本 2.10.0 或更高版本的 Linux kernel driver。

   1. 启用 PTP 硬件时钟。

   有关安装说明，请参阅 *GitHub* 上的 [Linux kernel driver for Elastic Network Adapter (ENA) family](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>

您可以将您的实例或任何连网设备（例如您的本地计算机或本地服务器）设置为使用公共 Amazon Time Sync Service，该服务可通过 `time.aws.com` 在互联网上进行访问。您可以使用公共 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>

**使用 chrony 或 ntpd 将您的 Linux 实例或设备设置为使用公共 Amazon Time Sync Service**

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. 对于 **Set date and time automatically**（自动设置日期和时间），请输入 **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 是域的一部分，此选项卡将不可用。在这种情况下，您的 PC 将与域控制器同步时间。您可以将控制器配置为使用公共 Amazon Time Sync Service。

1. 选择 **Change settings**（更改设置）。

1. 选中**与互联网时间服务器同步**复选框。

1. 在 **Server**（服务器）旁边输入 **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 的时钟误差范围。有关测量和监控时钟准确度的更多信息，请参阅 [Manage Amazon EC2 instance clock accuracy using Amazon Time Sync Service and Amazon CloudWatch – Part 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
   ```