RedHat 在其主页上发出警告:
闰秒事件将在 2016 年 12 月 31 日 23h 59m 60s UTC 发生。
它的前缀是一个感叹号,看起来很重要。闰秒对系统有什么危害?我们如何处理?
闰秒自 1972 年以来一直在发生,而 Unix 系统在这段时间里一直安然无恙地度过难关。
这一次,RedHat 选择在其客户支持 WWW 站点的顶部发布一条琥珀色警报消息,这给人们留下了非常错误的印象,并导致人们认为它类似于零日病毒警报,并以某种方式做出反应例如可以在Leap second Bug 2016 年 12 月 31 日看到的“闰秒错误”。
闰秒不是错误,Unix 系统可以很好地处理它们。几十年来,C 库一直提倡这样一种想法,即结构的tm_sec字段有时tm可以具有 60 值。
事实上,唯一真正的问题是 Unix 和 Linux 系统根据口味有多种不同的应对方式。因此,人们必须知道自己选择了什么设置,才能知道需要采取哪些行动(如果有的话)。
RedHat 页面将其隐藏在广泛的背景下,对 TAI-10 系统做出虚假假设,并且不是一般询问有关 Unices 和 Linux 操作系统的问题的答案(尽管这是一个很好的答案)仅限于 RedHat Linux 的世界观)。
从根本上说,您需要回答三个问题才能知道您需要做什么:
同步工具将类似于 Daniel J. Bernstein 的taiclock、Laurent Bercot 的s6-taiclock或 OpenBSD 的rdate默认 TAI-10 模式。
在这种情况下,您几乎不需要做任何事情,除非确保您的闰秒表是最新的。内核时钟保持每秒 1 SI 秒的滴答声(允许对振荡器漂移等进行修正),闰秒表处理从 TAI-10 到 UTC 的调整。
有两组表格需要更新:
right/时区文件中的那些,您可以通过确保您的系统上有最新版本的时区文件包(无论是什么)来保持最新/etc/leapsecs.datM.伯恩斯坦一直没有更新了leapsecs.dat在cr.yp.to,但我已经发布了更新leapsecs.dat,其中包括2016年12月31日23:59:60 UTC闰秒,封装在一个leapsecs包。
由于您同步的服务器也使用 TAI-10,它们发布的秒数也旨在始终保持 1 SI 秒长。使用 TAI-10 的服务器不会踩踏、旋转或拖尾。每个人都在固定长度的 SI 秒上滴答滴答,而闰秒仅作为您的 C 库的工件可见。
同步工具将是 OpenBSDrdate在其 UTC 模式下的东西。
同样,在这种情况下,您几乎不需要做任何事情,除非确保您的闰秒表是最新的,就像在前面的情况下一样。内核时钟再次以每秒 1 SI 秒的速度滴答作响。
问题是服务器没有。
因此,如果您使用 TAI-10 运行,您往往会喜欢步进闰秒的UTC 时间服务器,因为其他选项实际上会导致您的 TAI-10 时间不必要地同步到加快或减慢 UTC 时间,并丢失它的时间SI 秒每秒性质。
这种情况根据您要同步到的时间服务器执行的操作进行细分。
只有在 UTC-servers+UTC-machine 中的一种情况下,您的机器时间才会正确,即应用程序看到时间倒退的情况,这是 Unix 应用程序不喜欢看到的。在所有其他 UTC-servers+UTC-machine 情况下,您的机器时间最多会出现一天不正确。
在 TAI-10-servers+TAI-10-machine 的情况下,您的机器时间将始终正确。在其中一种 UTC-server+TAI-10-machine 情况下,即服务器步进时间的情况,您的机器时间也将始终正确,除非它恰好在不明确的 UTC 时间上进行轮询。
您的机器时间不正确的后果是在应用程序级别。操作系统对此很好。(与流行的看法相反,POSIX 实际上允许系统时钟出错,这可能是故意的。)例如,如果您执行诸如按秒计费之类的操作,那么您对一秒有多长以及每一秒何时发生的想法, 与您客户的想法不同,可能是两天。您的客户和您可能没有选择相同的设置。
再有就是你的选择要同步同一套混合时间服务器,其中一些的可能的问题杀UTC,其中一些步骤UTC,并且其中一些涂抹UTC。在这种情况下会发生很多欢笑,因为您将同步工具搞混了。也有很多讽刺。“笨”同步工具比“智能”工具更好地处理去同步的时间源,后者试图找出哪个时间源告诉正确的时间。在这种特殊情况下,只有步进器甚至会告诉正确的时间。而slewers和smearers对错误的UTC时间有矛盾的想法。
最后一个不光彩的提及是在 RedHat 页面上讨论的 Linux 内核。同步工具可以选择自己步进时间,也可以指示内核执行此操作。正如 RedHat 报告的那样,这方面存在问题的历史,从内核中的内部计时机制无法正常工作到机器冻结。