如何配置 Unix 系统以按 TAI 时间运行?

如何配置 Unix 系统以按 TAI 时间运行?

我想配置一个 Unix 系统来运行国际原子时(TAI)以便能够看到年末闰秒正确报告为 2016-12-31 23:59:60。我知道这会导致系统的时间戳与 POSIX 时间戳不兼容,但我这样做是为了做实验。我已经将时区文件从复制到/usr/share/zoneinfo/right//etc/localtime这些是我的问题。

  • 如何准确设置系统时间?我知道必须将其设置为 TAI 秒,而不是 UTC 秒。是否可以通过 NTP 执行此操作?目前,系统显示的时间与正确时间相差 36 秒。
  • 2017-02-01 之后显示的时间是否仍然正确?zoneinfo/right时区文件是否需要更新?

答案1

首先,计算机系统上的时钟必须提供 TAI 或 UTC 的概念并不完全准确。我可以使用时区获取和设置时间,例如 GNU coreutils date 命令非常灵活。在设置为 right/UTC 的系统上(稍后会详细介绍):

# date -s "Tue Dec 27 08:16:53 CST 2016"
Tue Dec 27 14:16:53 UTC 2016

参见 ESR 的文章 使用 C 语言进行时间、时钟和日历编程 涉及实际的数据结构以及一些很好的参考。

您仍可以照常配置 ntp、ptp,或者发出定时date或命令。chronyc settime

但是,您需要了解 TAI - UTC 偏移量以及源时间。NTP 时间是标准的 UTC,因此,只需在 UTC 同步系统上设置“正确”时区,就会偏离 TAI - 10 - UTC,目前为 26。

相反,一些 NTP 服务器可以提供 GPS 或 TAI。这加上一些闰秒技巧将消除内核或用户陆地时间同步纠正的闰秒误差。参见:“正确的” tz 数据库 (zoneinfo) 文件和基于 GPS 的 NTP

请注意,86401 秒不是标准的,并且违反了 POSIX 的要求。如果设置了这样做的 NTP 服务器,它们将无法为其他系统提供时间。它还会导致依赖于特定格式的时间的应用程序出现奇怪的行为。

TZ 数据需要更新,每年两次会捕捉闰秒。如果您出于这个原因修补闰秒,则需要再次修补。(很可能您已经出于各种原因需要更频繁地更新其他软件。)将会有额外的闰秒,地球自转的变化是物理上的必然。出于政治上的必然性,可能出现的时区和夏令时变化也是出于……非技术性原因。

时机很好,因为下一个闰秒是2016 年 12 月 31 日,23 小时 59 分钟 60 秒。Red
Hat 发布了一个很好的总结,介绍了在 Linux 上使用 UTC 时如何解决此问题。请注意,许多站点会重复、抹黑或让 NTP 修复错误秒数,而无需显示第 61 秒。 解决 Red Hat Enterprise Linux 中的闰秒问题

对我来说,这一切似乎都是很多工作。如果我可以让 NTP 或内核通过 Red Hat 描述的方法处理它,我宁愿不看到第 61 秒。

答案2

时区文件可能需要更新。您可以通过运行命令来查看已安装时区文件中的转换,以进行测试。以下示例包含闰秒转换。

$ zdump -c 2017,2018 -v /etc/localtime /etc/localtime -9223372036854775808 = NULL /etc/localtime -9223372036854689408 = NULL /etc/localtime Sat Dec 31 23:59:60 2016 UT = Sun Jan 1 01:59:60 2017 EET isdst=0 gmtoff=7200 /etc/localtime Sun Jan 1 00:00:00 2017 UT = Sun Jan 1 02:00:00 2017 EET isdst=0 gmtoff=7200 /etc/localtime Sun Mar 26 00:59:59 2017 UT = Sun Mar 26 02:59:59 2017 EET isdst=0 gmtoff=7200 /etc/localtime Sun Mar 26 01:00:00 2017 UT = Sun Mar 26 04:00:00 2017 EEST isdst=1 gmtoff=10800 /etc/localtime Sun Oct 29 00:59:59 2017 UT = Sun Oct 29 03:59:59 2017 EEST isdst=1 gmtoff=10800 /etc/localtime Sun Oct 29 01:00:00 2017 UT = Sun Oct 29 03:00:00 2017 EET isdst=0 gmtoff=7200 /etc/localtime 9223372036854689407 = NULL /etc/localtime 9223372036854775807 = NULL

如果时区文件需要更新,并且您的操作系统发行版没有提供闰秒(/right)时区文件,您可以按如下方式设置时区文件。

  • 获取时区分布https://www.iana.org/time-zones
  • 配置和安装,以及
  • 使用以下命令设置正确的区域文件(其中还包括闰秒信息)

sudo cp目录/etc/zoneinfo-leaps/你的时区 /etc/localtime

要从 NTP 服务器设置时间,您可以配置和安装 rdate(openrdate),然后运行如下命令sudo rdate -s -c -n 0.gentoo.pool.ntp.org

相关内容