我有一个Linux系统,我需要对系统时间做一些小的定期调整,以跟踪外部时间源,但我希望避免日期/时间跳转。
我考虑使用adjtimex()内核函数(参见:adjtimex(2),adjtimex(8)),但是我有一些疑问:
--offset的参数必须在-512000.512000范围内(因此它只能对+/- 0.5s进行更正),并且没有提到--singleshot的任何值adjtimex命令行实用程序),这些限制似乎都不适用。
任何帮助都是非常感谢的。
发布于 2014-02-12 18:49:19
(请参阅Linux手册页项目中的Linux手册页。他们更有可能是最新的。注释表明实现的逻辑应该遵循RFC 1305)。)
有关实现细节,只需浏览Linux内核源代码即可。adjtimex()系统调用是在内核/时间c中定义的;查找SYSCALL_DEFINE.*(adjtimex,。
adjtimex()本身调用在内核/时间/时间保持中定义的do_adjtimex()。基本范围检查是在ntp_validate_timex()中定义的内核/时间/ntp.c中完成的。
关于你的具体问题:
ADJ_OFFSET_SINGLESHOT,则adjtimex()表现为adjtime(),并且只能使用.offset字段。根据调整的大小和符号,NTP时钟被加速或减慢一段时间,直到达到所需的偏移;然后NTP时钟速率恢复到原来的状态。您不能与它一起使用任何其他模式标志。
ADJ_SETOFFSET将.time添加到当前时间;立即将时钟向前移动。
ADJ_OFFSET还调整了NTP时钟速率,以在合理的时间内实现所需的偏移,因此效果应该与单击模式相同。但是,您也可以在同一个调用中使用其他ADJ_模式标志。
在Grodriguez的评论之后编辑:
只有在偏移量被认为是好的情况下,ADJ_OFFSET才有效果,即时钟状态是锁相的,STA_PLL。通常,如果采样间隔较长,或者NTP守护进程有一个错误的示例,NTP守护进程将将状态更改为频率锁定(STA_FLL)。
要使用ADJ_OFFSET,程序可能应该使用模式模式ADJ_OFFSET|ADJ_STATUS,并设置.status=STA_PLL。这将导致将当前时间设置为参考时间,以便相对于当前系统时间计算偏移量,并启用时钟偏移调整。MAXPHASE常量(在包含/linux/timex.h中)定义偏移限制。目前,它以纳秒为单位,并指定了半秒钟;较大的值(在大小上)被悄悄地限制在半秒钟内,没有任何错误。
在2.6.26之前的中,极限较小(±131071)。新的限制是在2008年5月中添加的。
(这个限制的改变是传达给Linux手册维护人员,Michael,2009年6月,但是很明显adjtimex(2)手册页面从未被更新以反映这一变化。不过,我认为建议的措辞不够清楚。)https://stackoverflow.com/questions/21732321
复制相似问题