RedHat 对其发出警告主页:
闰秒事件将于 2016 年 12 月 31 日 23 点 59 分 60 秒(世界标准时间)发生。
它的前缀是一个感叹号,看起来像是重要的。闰秒会对系统造成什么危害?我们该如何处理呢?
答案1
没有任何。
自 1972 年以来,闰秒一直在出现,Unix 系统也一直在经历闰秒毫发无伤一直以来。
RedHat 这次选择在其客户支持 WWW 站点的顶部显示琥珀色警报消息,这给人们留下了相当错误的印象,并导致人们认为这类似于零日病毒警报,并以多种方式做出反应例如可以在以下位置看到闰秒 Bug 2016 年 12 月 31 日谈论“闰秒错误”。
闰秒不是一个错误,Unix 系统可以完美地处理它们。几十年来,C 库一直提倡这样一种思想:tm_sec
结构域tm
可以有时值为 60。
事实上,唯一真正的问题是,Unix 和 Linux 系统根据喜好有多种不同的处理方式。因此,人们必须知道自己选择了什么设置,才能知道需要采取什么行动(如果有的话)。
RedHat 页面将其隐藏在广泛的背景下,对 TAI-10 系统做出了虚假的假设,并且并不是询问有关 Unices 和 Linux 操作系统的一般问题的答案(尽管对于世界观就是仅限于 RedHat Linux)。
从根本上来说,您需要回答三个问题才能知道您需要做什么:
- 您的内核时钟是否以 UTC 运行?还是在 TAI-10 中?
- 您使用什么来将机器的时钟与其他系统同步?
- 其他系统如何处理闰秒?
一些应该做什么的案例
您的内核时钟是 TAI-10,机器正在使用 TAI 感知工具与 TAI-10 服务器同步
同步工具类似于 Daniel J. Bernstein 的taiclock
,Laurent Bercot 的s6-taiclock
,或 OpenBSD 的rdate
默认 TAI-10 模式。
在这种情况下,您几乎不需要做任何事情,除了确保您的闰秒表是最新的。内核时钟继续以每秒 1 SI 秒的速度滴答作响(振荡器漂移等的修正允许),并且闰秒表处理从 TAI-10 到 UTC 的调整。
有两组表需要保持最新:
- 时区文件中的文件
right/
,通过确保系统上拥有最新版本的时区文件包(无论是什么)来保持最新版本 - Bernstein 和其他人的工具集使用的工具集位于
/etc/leapsecs.dat
伯恩斯坦先生尚未更新cr.yp.to
leapsecs.dat
,但我已经发表了更新的leapsecs.dat
其中包括 2016-12-31 23:59:60 UTC 闰秒,打包在一个leapsecs
包中。
由于您同步的服务器也使用 TAI-10,因此它们发布的秒数也旨在始终为 1 SI 秒长。使用 TAI-10 的服务器不会出现踩踏、旋转或拖尾的情况。每个人都以恒定长度的 SI 秒为刻度,而闰秒仅作为 C 库的工件可见。
您的内核时钟是 TAI-10,机器正在使用 TAI 感知工具与 UTC 服务器同步
同步工具将是 OpenBSD 的rdate
UTC 模式。
同样,在这种情况下,您几乎不需要做任何事情,除了确保您的闰秒表是最新的,就像在前面的情况中一样。内核时钟再次以每秒 1 SI 秒的速度继续计时。
问题是服务器没有。
- 如果他们涂抹闰秒,然后他们报告说,在今年最后一天的大部分时间里,时间略有放缓。您的时间同步工具不必要地调整 TAI-10 以保持与这个错误的 UTC 同步,最终导致 TAI-10 在闰秒到来时落后一秒。闰秒之后,您的同步工具将需要加快时钟速度,以赶上在同步到长于 SI 秒的 UTC 秒和系统时钟秒时错过的额外 TAI-10 时钟周期将比 SI 秒短一段时间以进行补偿。
- 如果他们屠杀闰秒,那么他们将在新年的第一天报告稍微提前的时间。您的时间同步工具将不必要地调整 TAI-10 以与该错误的 UTC 保持同步。具有讽刺意味的是,他们会在闰秒立即以 TAI-10 开始正确,并且在第二天它会逐渐偏离正确,然后随着时间服务器逐渐减慢回到 UTC 而您的同步工具又回来。同时尝试将 TAI-10 加速到其错误的 UTC 时间。
- 如果他们步闰秒,他们根本不会向您报告单调递增的时间,但同步工具完成的闰秒插入实际上应该正确计算,除非在闰秒的那一刻,来自服务器的 UTC 报告不明确。不过,它们至少会以每秒 1 SI 秒的速度滴答作响,并且 TAI-10 在前后几天都将保持正确,并且不会不必要地尝试将 TAI-10 与 UTC 时间同步,即其实是错的。
因此,如果您使用 TAI-10 运行,您往往会喜欢 UTC 时间服务器步闰秒,因为其他选项实际上会导致您的 TAI-10 时间不必要地与加速或减慢的 UTC 同步,并失去每秒一 SI 秒的性质。
您的内核时钟是 UTC,并且机器正在使用 UTC 工具与 UTC 服务器同步。
这种情况根据您要同步的时间服务器的功能进行细分。
- 如果他们涂抹闰秒,然后他们报告说,在今年最后一天的大部分时间里,时间略有放缓。您的时间同步工具将与之同步,并且您的时钟将落后时间一天。
- 如果他们屠杀闰秒,那么他们将在新年的第一天报告稍微提前的时间。您的时间同步工具将与其同步,并且您的时钟将提前一天的一部分时间。
- 如果他们步闰秒,他们根本不会向您报告单调增加的时间,并且对于您的同步工具来说,系统时钟会突然超出一秒,需要纠正。它们的反应方式取决于您如何配置同步工具。
- 他们可能只是简单地步系统时钟也是如此,在这种情况下,您的应用程序将看到时间倒退一秒。
- 他们更有可能屠杀不过,系统时钟;在这种情况下,您的机器将在一段时间内滴答比实际 SI 秒长的秒数,并提前一天的一部分时间。
- 如果他们宣布闰秒,只是警告一步即将到来,然后他们将有关如何操作的决定传递给同步工具。
- 他们可能只是简单地步系统时钟也是如此,在这种情况下,您的应用程序将看到时间倒退一秒。
- 他们更有可能屠杀或者涂抹不过,系统时钟;在这种情况下,您的机器将在前一天或后一天滴答比实际 SI 秒长的秒数。
结果
只有在 UTC 服务器+UTC 机器的情况下,您的机器的时间才会正确,在这种情况下,应用程序会看到时间倒退,这是 Unix 应用程序不喜欢看到的情况。在所有其他 UTC 服务器+UTC 机器的情况下,您的机器时间最多将有一天不正确。
在 TAI-10-servers+TAI-10-machine 的情况下,您的机器时间始终是正确的。在其中一种 UTC 服务器+TAI-10 机器的情况下,服务器所在的情况脚步时间,你的机器的时间也将始终是正确的,除非它碰巧在不明确的 UTC 时间上进行了轮询。
机器时间不正确的后果是应用程序级别的。操作系统对此很满意。 (与普遍的看法相反,POSIX 实际上允许系统时钟出错,可能是故意的。)例如,如果您执行按秒向人们开账单之类的操作,那么您对一秒有多长以及每一秒何时发生的想法,与客户的想法不同,可能有两天。您的客户和您可能没有选择相同的设置。
然后,您选择与一组混合的时间服务器同步可能会出现问题,其中一些服务器屠杀UTC,其中一些步UTC,其中一些涂抹世界标准时间。在这种情况下,当你把同步工具搞得一团糟时,会发生很多搞笑的事情。其中也有很多讽刺之处。 “哑”同步工具比“智能”同步工具更好地处理不同步的时间源,“智能”同步工具试图找出哪个时间源正在告诉正确的时间。在这种特殊情况下只有步进器才能报出正确的时间。然而,屠杀者和抹黑者对什么是矛盾的想法错误的UTC 时间是。
最后一个不光彩的提及是 Linux 内核,在 RedHat 页面上进行了讨论。同步工具可以选择自己步进时间,也可以指示内核执行此操作。正如 RedHat 报告的那样,这方面的问题由来已久,从内核中的内部计时机制无法正常工作到机器冻结。