为 Linux 实例设置时间 - Amazon Elastic Compute Cloud

Linux 实例设置时间

对于许多服务器任务和进程来说,Linux 实例上准确一致的时间参考是非常重要的。系统日志中的时间戳在识别问题发生的时间和事件的时间顺序方面起着至关重要的作用。使用 AWS CLI 或 AWS SDK 从您的实例发送请求时,这些工具会以您的名义签署请求。如果实例的日期和时间设置不准确,可能会导致签名中的日期和请求的日期之间存在差异,进而导致 AWS 拒绝请求。

为解决这一重要问题,Amazon 提供了 Amazon Time Sync Service,该服务可从所有 EC2 实例访问,并由各种 AWS 服务 使用。该服务在每个 AWS 区域 中使用一组与卫星连接的原子参考时钟,以提供准确的协调世界时(UTC)全球标准的当前时间读数。

Amazon Time Sync Service 要么使用网络时间协议(NTP),要么在支持的实例上提供本地精确时间协议(PTP)硬件时钟。PTP 硬件时钟支持 NTP 连接或直接 PTP 连接。NTP 连接和直接 PTP 连接使用相同的高精度时间源,但直接 PTP 连接比 NTP 连接更准确。与 Amazon Time Sync Service 的 NTP 连接支持闰秒涂抹,而与 PTP 硬件时钟的 PTP 连接不涂抹时间。有关更多信息,请参阅 闰秒

要备份到实例上的 Amazon Time Sync Service,以及将 Amazon EC2 之外的资源连接到 Amazon Time Sync Service,您可以使用位于 time.aws.com 的公共 Amazon Time Sync Service。与本地 Amazon Time Sync Service 一样,公共 Amazon Time Sync Service 会自动涂抹添加到 UTC 中的任何闰秒。公共 Amazon Time Sync Service 由每个 AWS 区域 中一组与卫星连接的原子参考时钟在全球范围内提供支持。

对于 Windows 实例,请参阅为 Windows 实例设置时间

将您的实例设置为使用本地 Amazon Time Sync Service

您的实例可以访问本地 Amazon Time Sync Service,如下所示:

  • 通过 NTP 在以下 IP 地址端点进行访问:

    • IPv4:169.254.169.123

    • IPv6:fd00:ec2::123(只有基于 Nitro System 而构建的实例才能访问。)

  • 通过直接 PTP 连接连接到本地 PTP 硬件时钟进行访问:

    • PHC0

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

PTP 硬件时钟是 Nitro 系统的一部分,因此无需使用任何客户资源即可在支持的裸机和虚拟化 EC2 实例上直接访问。

PTP 硬件时钟的 NTP 端点与通过 IPv4 或 IPv6 进行的常规 Amazon Time Sync Service 连接相同。如果您的软件配置为 NTP 端点,并且在带有 PTP 硬件时钟的实例上运行,则其将通过 NTP 自动连接到 PTP 硬件时钟。

默认情况下,AL2023 以及最新版本的 Amazon Linux 2 和 Amazon Linux AMI 配置为使用 Amazon Time Sync Service IPv4 端点。除非您希望使用 IPv6 端点或直接连接到 PTP 硬件时钟,否则从这些 AMI 启动的实例无需进行进一步配置。有关 IPv6 配置说明,请参阅 连接到 Amazon Time Sync Service 的 IPv6 端点。有关 PTP 硬件时钟配置说明,请参阅 连接到 PTP 硬件时钟

如果您使用的 AMI 默认情况下未配置 Amazon Time Sync Service,请参照以下过程之一使用 chrony 客户端在实例上配置 Amazon Time Sync Service。

连接到 Amazon Time Sync Service 的 IPv4 端点

本节介绍如何配置实例以通过 IPv4 端点使用本地 Amazon Time Sync Service。需要向 chrony 配置文件添加 Amazon Time Sync Service 的服务器条目。在最新版本的 AMI 上,已安装 chrony 并配置为使用 Amazon Time Sync Service IPv4 端点。

请使用适用于您实例操作系统的说明。

Amazon Linux
注意

在 AL2023 以及最新版本的 Amazon Linux 2 和 Amazon Linux AMI 上,已安装 chrony 并配置为使用 Amazon Time Sync Service IPv4 端点。如果您使用的是其中一个最新的 AMI,则可以跳过此过程。

使用 chrony 连接到 Amazon Linux 上的 Amazon Time Sync Service 的 IPv4 端点
  1. 连接到您的实例并卸载 NTP 服务。

    [ec2-user ~]$ sudo yum erase 'ntp*'
  2. 安装 chrony 软件包。

    [ec2-user ~]$ sudo yum install chrony
  3. 使用任何文本编辑器(如 nanovim)打开 /etc/chrony.conf 文件。确认该文件包含以下行:

    server 169.254.169.123 prefer iburst minpoll 4 maxpoll 4

    如果该行存在,则已配置 Amazon Time Sync Service 为使用 Amazon Time Sync Service 的 IPv4 端点,您可以转到下一步。如果不存在,请在该文件中已包含的任何其他 serverpool 语句后面添加该行,然后保存您的更改。

  4. 重启 chrony 守护程序 (chronyd)。

    [ec2-user ~]$ sudo service chronyd restart
    Starting chronyd: [ OK ]
    注意

    在 RHEL 和 CentOS (最高版本为 6) 上,服务名称是 chrony 而不是 chronyd

  5. 要配置 chronyd 为在每次系统启动时启动,请使用 chkconfig 命令。

    [ec2-user ~]$ sudo chkconfig chronyd on
  6. 确认 chrony 使用 169.254.169.123 IPv4 端点来同步时间。

    [ec2-user ~]$ chronyc sources -v
    210 Number of sources = 7 .-- Source mode '^' = server, '=' = peer, '#' = local clock. / .- Source state '*' = current synced, '+' = combined , '-' = not combined, | / '?' = unreachable, 'x' = time may be in error, '~' = time too variable. || .- xxxx [ yyyy ] +/- zzzz || Reachability register (octal) -. | xxxx = adjusted offset, || Log2(Polling interval) --. | | yyyy = measured offset, || \ | | zzzz = estimated error. || | | \ MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^* 169.254.169.123 3 6 17 43 -30us[ -226us] +/- 287us ^- ec2-12-34-231-12.eu-west> 2 6 17 43 -388us[ -388us] +/- 11ms ^- tshirt.heanet.ie 1 6 17 44 +178us[ +25us] +/- 1959us ^? tbag.heanet.ie 0 6 0 - +0ns[ +0ns] +/- 0ns ^? bray.walcz.net 0 6 0 - +0ns[ +0ns] +/- 0ns ^? 2a05:d018:c43:e312:ce77:> 0 6 0 - +0ns[ +0ns] +/- 0ns ^? 2a05:d018:dab:2701:b70:b> 0 6 0 - +0ns[ +0ns] +/- 0ns

    在返回的输出中,^* 指示首选的时间源。

  7. 验证 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 上的 Amazon Time Sync Service 的 IPv4 端点
  1. 连接到您的实例并使用 apt 安装 chrony 软件包。

    ubuntu:~$ sudo apt install chrony
    注意

    如有必要,请先运行 sudo apt update 以更新您的实例。

  2. 使用任何文本编辑器(如 nanovim)打开 /etc/chrony/chrony.conf 文件。在该文件中已包含的任何其他 serverpool 语句前面添加以下行,然后保存您的更改:

    server 169.254.169.123 prefer iburst minpoll 4 maxpoll 4
  3. 重新启动 chrony 服务。

    ubuntu:~$ sudo /etc/init.d/chrony restart
    Restarting chrony (via systemctl): chrony.service.
  4. 确认 chrony 使用 169.254.169.123 IPv4 端点来同步时间。

    ubuntu:~$ chronyc sources -v
    210 Number of sources = 7 .-- Source mode '^' = server, '=' = peer, '#' = local clock. / .- Source state '*' = current synced, '+' = combined , '-' = not combined, | / '?' = unreachable, 'x' = time may be in error, '~' = time too variable. || .- xxxx [ yyyy ] +/- zzzz || Reachability register (octal) -. | xxxx = adjusted offset, || Log2(Polling interval) --. | | yyyy = measured offset, || \ | | zzzz = estimated error. || | | \ MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^* 169.254.169.123 3 6 17 12 +15us[ +57us] +/- 320us ^- tbag.heanet.ie 1 6 17 13 -3488us[-3446us] +/- 1779us ^- ec2-12-34-231-12.eu-west- 2 6 17 13 +893us[ +935us] +/- 7710us ^? 2a05:d018:c43:e312:ce77:6 0 6 0 10y +0ns[ +0ns] +/- 0ns ^? 2a05:d018:d34:9000:d8c6:5 0 6 0 10y +0ns[ +0ns] +/- 0ns ^? tshirt.heanet.ie 0 6 0 10y +0ns[ +0ns] +/- 0ns ^? bray.walcz.net 0 6 0 10y +0ns[ +0ns] +/- 0ns

    在返回的输出中,以 ^* 开始的行会指示首选的时间源。

  5. 验证 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 上的 Amazon Time Sync Service 的 IPv4 端点
  1. 使用任何文本编辑器(如 /etc/chrony.confvim)打开 nano 文件。

  2. 确认该文件包含以下行:

    server 169.254.169.123 prefer iburst minpoll 4 maxpoll 4

    如果此行不存在,请添加它。

  3. 注释掉任何其他服务器或池行。

  4. 打开 yaST 并启用 chrony 服务。

连接到 Amazon Time Sync Service 的 IPv6 端点

本节介绍如果您将实例配置为通过 IPv6 端点使用本地 Amazon Time Sync Service,在 连接到 Amazon Time Sync Service 的 IPv4 端点 中所述的步骤有何不同。它没有解释整个 Amazon Time Sync Service 配置流程。

IPv6 端点只能在 Nitro 系统上构建的实例上访问。

注意

我们不建议在您的 chrony.conf 文件中同时使用 IPv4 和 IPv6 端点条目。IPv4 和 IPv6 NTP 数据包来自您的实例的同一个本地服务器。没有必要同时配置 IPv4 和 IPv6 端点,这样做也不会提高实例上时间的准确性。

根据您使用的 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 端点,则配置完成。

连接到 PTP 硬件时钟

本节介绍如何使用直接 PTP 连接通过 PTP 硬件时钟将您的实例配置为使用本地 Amazon Time Sync Service。需要向 chrony 配置文件添加 PTP 硬件时钟的服务器条目。

如果您的实例具有 PTP 硬件时钟并且配置了 NTP 连接(到 IPv4 或 IPv6 端点),则您的实例时间将自动从 PTP 硬件时钟获取。以下步骤配置直接 PTP 连接,这将为您提供比 NTP 连接更准确的时间。

要求

当满足以下要求时,PTP 硬件时钟在实例上可用:

  • 支持的 AWS 区域:亚太地区(东京)

  • 支持的实例系列:R7g

  • 支持的操作系统上已安装 ENA 驱动程序版本 2.10.0 或更高版本。有关支持的操作系统的更多信息,请参阅 GitHub 上的驱动程序先决条件

连接到 PTP 硬件时钟
  1. 连接到您的实例并安装弹性网络适配器(ENA)版本 2.10.0 或更高版本的 Linux kernel driver。有关安装说明,请参阅 GitHub 上的 Linux kernel driver for Elastic Network Adapter (ENA) family

  2. 验证 /dev/ptp0 设备是否显示在您的实例上。

    [ec2-user ~]$ ls /dev/ptp0

    预期的输出如下所示:如果输出中没有 /dev/ptp0,则说明未正确安装 ENA 驱动程序。查看此安装驱动程序过程中的步骤 1。

    /dev/ptp0
  3. 使用文本编辑器编辑 /etc/chrony.conf,并将以下行添加到文件中的任何位置。

    refclock PHC /dev/ptp0 poll 0 delay 0.000010 prefer
  4. 使用以下命令重启 chrony。

    [ec2-user ~]$ sudo systemctl restart chronyd
  5. 验证 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 后,您可能需要等待几秒钟才能显示星号。

将您的实例或任何联网设备设置为使用公共 Amazon Time Sync Service

您可以将您的实例或任何连网设备(例如您的本地计算机或本地服务器)设置为使用公共 Amazon Time Sync Service,该服务可通过 time.aws.com 在互联网上进行访问。您可以使用公共 Amazon Time Sync Service 作为本地 Amazon Time Sync Service 的备份,并将 AWS 以外的资源连接到 Amazon Time Sync Service。

根据您实例或设备的操作系统,参照以下过程之一将您的实例或设备设置为使用公共 Amazon Time Sync Service。

Linux
使用 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
    2. 添加以下行以连接到公共 Amazon Time Sync Service。

      pool time.aws.com iburst
  2. 使用以下命令之一重启进程守护程序。

    • chrony

      sudo service chronyd force-reload
    • ntpd

      sudo service ntp reload
macOS
将您的 macOS 实例或设备设置为使用公共 Amazon Time Sync Service
  1. 打开 System Preferences (系统首选项)

  2. 选择 Date & Time(日期和时间),然后选择 Date & Time(日期和时间)选项卡。

  3. 要进行更改,请选择锁定图标,并在出现提示时输入密码。

  4. 对于 Set date and time automatically(自动设置日期和时间),请输入 time.aws.com

Windows
将您的 Windows 实例或设备设置为使用公共 Amazon Time Sync Service
  1. 打开 Control Panel(控制面板)。

  2. 选择 Date and Time(日期和时间)图标。

  3. 选择 Internet Time(互联网时间)选项卡。如果您的 PC 是域的一部分,此选项卡将不可用。在这种情况下,您的 PC 将与域控制器同步时间。您可以将控制器配置为使用公共 Amazon Time Sync Service。

  4. 选择 Change settings(更改设置)。

  5. 选择 Synchronize with an Internet time server(与互联网时间服务器同步)复选框。

  6. Server(服务器)旁边输入 time.aws.com

将您的 Windows Server 实例或设备设置为使用公共 Amazon Time Sync Service

比较时间戳

如果您使用的是 Amazon Time Sync Service,就可以将 Amazon EC2 实例上的时间戳与 ClockBound 进行比较,以确定事件的真实时间。ClockBound 可以测定 EC2 实例的时钟的准确性,并允许您检查一个给定的时间戳是早于还是晚于实例的当前时钟。在确定整个 EC2 实例中的事件与事务的顺序和一致性方面,这些信息十分重要,并且不会收到各个实例的地理位置的影响。

ClockBound 是一个开源守护进程和开源库。要了解关于 ClockBound 的详情,包括安装说明,请参阅 GitHub 上的 ClockBound

如果您使用与 PTP 硬件时钟的直接 PTP 连接,则您的时间进程守护程序(例如 chrony)将低估时钟误差范围。这是因为 PTP 硬件时钟不会像 NTP 那样将正确的误差范围信息传递给 chrony。因此,您的时钟同步进程守护程序假定时钟精确到 UTC,因此误差范围为 0。为了测量完整的误差范围,Nitro 系统会计算 PTP 硬件时钟的误差范围,并通过 ENA 驱动程序 sysfs 文件系统将其提供给您的 EC2 实例。您可以使用以下命令将其直接读取为以纳秒为单位的值:

cat /sys/devices/pci0000:00/0000:00:05.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

更改实例上的时区

Amazon Linux 实例默认设置为 UTC(协调世界时)时区。您可以将实例上的时间更改为本地时区或网络中的其他时区。

重要

此信息适用于 Amazon Linux。有关其他发布版本的信息,请参阅特定于该版本的文档。

更改 AL2023 或 Amazon Linux 2 实例上的时区
  1. 查看系统的当前时区设置。

    [ec2-user ~]$ timedatectl
  2. 列出可用的时区。

    [ec2-user ~]$ timedatectl list-timezones
  3. 设置选定的时区。

    [ec2-user ~]$ sudo timedatectl set-timezone America/Vancouver
  4. (可选)通过运行 timedatectl 命令,确认当前时区已更新为新时区。

    [ec2-user ~]$ timedatectl
要更改 Amazon Linux 实例上的时区
  1. 确定将在实例上使用的时区。/usr/share/zoneinfo 目录包含时区数据文件的层次结构。浏览该位置的目录结构,查找针对您的时区的文件。

    [ec2-user ~]$ ls /usr/share/zoneinfo Africa Chile GB Indian Mideast posixrules US America CST6CDT GB-Eire Iran MST PRC UTC Antarctica Cuba GMT iso3166.tab MST7MDT PST8PDT WET Arctic EET GMT0 Israel Navajo right W-SU ...

    该位置的部分条目是目录 (如 America),这些目录包含针对特定城市的时区文件。查找要用于实例的城市 (或时区中的一个城市)。

  2. 使用新时区更新 /etc/sysconfig/clock 文件。在此示例中,我们使用洛杉矶的时区数据文件 /usr/share/zoneinfo/America/Los_Angeles

    1. 使用文本编辑器(如 vimnano)打开 /etc/sysconfig/clock 文件。您需要在编辑器命令中使用 sudo,因为 /etc/sysconfig/clockroot 所有。

      [ec2-user ~]$ sudo nano /etc/sysconfig/clock
    2. 查找 ZONE 条目,将其更改为时区文件 (忽略路径的 /usr/share/zoneinfo 部分)。例如,要更改为洛杉矶时区,请将 ZONE 条目更改为以下内容:

      ZONE="America/Los_Angeles"
      注意

      请勿将 UTC=true 条目更改为其他值。此条目用于硬件时钟;如果您在实例上设置了其他时区,则无需调整此条目。

    3. 保存文件,退出文本编辑器。

  3. /etc/localtime 与时区文件之间创建一个符号链接,以便实例在引用本地时间信息时找到此时区文件。

    [ec2-user ~]$ sudo ln -sf /usr/share/zoneinfo/America/Los_Angeles /etc/localtime
  4. 重启系统,以便所有服务和应用程序接受新时区信息。

    [ec2-user ~]$ sudo reboot
  5. (可选)使用 date 命令确认当前时区已更新为新时区。当前时区将显示在输出中。在下面的示例中,当前时区是 PDT,它指的是洛杉矶时区。

    [ec2-user ~]$ date Sun Aug 16 05:45:16 PDT 2020

闰秒

闰秒的概念于 1972 年引入,是偶尔对 UTC 时间进行一秒钟的调整,将地球自转中的不规则性考虑在内,以适应国际原子时间(TAI)和太阳时(Ut1)之间的差异。为了代表客户管理闰秒,我们在 Amazon Time Sync Service 中设计了闰秒涂抹。有关更多信息,请参阅 Look Before You Leap – The Coming Leap Second and AWS

闰秒即将消失,我们完全支持在第 27 届国际计量大会上做出的在 2035 年或之前取消闰秒的决定。

为了支持这种过渡,当通过本地 NTP 连接或我们的公共 NTP 池(time.aws.com)访问 Amazon Time Sync Service 时,我们仍计划在闰秒事件期间涂抹时间。但是,PTP 硬件时钟不提供涂抹时间选项。如果出现闰秒,PTP 硬件时钟将按照 UTC 标准添加闰秒。在大多数情况下,闰秒涂抹和闰秒时间源是相同的。但是,由于其在闰秒事件中有所不同,因此我们不建议在闰秒事件期间在时间客户端配置中同时使用已涂抹和未涂抹的时间源。