各bit从低位到高位依次表示
STA_PLL Enable PLL updates (read-write).
STA_PPSFREQ Enable PPS freq discipline (read-write).
STA_PPSTIME Enable PPS time discipline (read-write).
STA_FLL Select frequency-lock mode (read-write).
STA_INS Insert leap (read-write).
STA_DEL Delete leap (read-write).
STA_UNSYNC Clock unsynchronized (read-write).
STA_FREQHOLD Hold frequency (read-write).
STA_PPSSIGNAL PPS signal present (read-only).
STA_PPSJITTER PPS signal jitter exceeded (read-only).
STA_PPSWANDER PPS signal wander exceeded (read-only).
STA_PPSERROR PPS signal calibration error (read-only).
STA_CLOCKERR Clock hardware fault (read-only).
STA_UNSYNC在0x40位,也就是前面提到的64bit,当此位为0时,11分钟模式是开启的,为1时关闭,因此当结构中modes的MOD_STATUS位为1,且STA_UNSYNC为1时,执行ntp_adjtime后将关闭该模式,MOD_STATUS位为1且STA_UNSYNC为0时,执行ntp_adjtime后将开启该模式。
再附上我修改ntp-4.2.4p4版本ntpd的patch
diff -ur ntp-4.2.4p4/ntpd/ntp_loopfilter.c
ntp-4.2.4p4.modify/ntpd/ntp_loopfilter.c
--- ntp-4.2.4p4/ntpd/ntp_loopfilter.c 2007-02-24
19:02:05.000000000 +0800
+++ ntp-4.2.4p4.modify/ntpd/ntp_loopfilter.c 2008-07-04
13:41:03.000000000 +0800
@@ -636,15 +636,18 @@
}
}
+
+ ntv.status |= STA_UNSYNC;
+
if (ntp_adjtime(&ntv) == TIME_ERROR) {
- NLOG(NLOG_SYNCEVENT | NLOG_SYSEVENT)
- msyslog(LOG_NOTICE,
- "kernel time sync error x", ntv.status);
+ //NLOG(NLOG_SYNCEVENT | NLOG_SYSEVENT)
+ //msyslog(LOG_NOTICE,
+ //"kernel time sync error x", ntv.status);
ntv.status &= ~(STA_PPSFREQ |
STA_PPSTIME);
} else {
if ((ntv.status ^ pll_status) & ~STA_FLL)
附ntpdate的用法
ntpdate 支持下列选项:
-a
启用身份验证功能并指定要用于身份验证的密钥标识符。密钥和密钥标识符必须在客户端密钥文件和服务器密钥文件中都匹配。缺省设置是禁用身份验证功能。
-B 强制始终使用adjtime 系统调用来微调时间(即使测量到的偏移量大于+-128 毫秒)。缺省设置是在偏移量大于+-128
毫秒时使用clock_settime 系统调用步进时间。请注意,如果偏移量比+-128
毫秒大得多,则可能需要较长的时间(数小时)来将时钟微调到正确的值。在此期间,不应使用主机来同步化客户端。
-b 强制使用clock_settime 系统调用来步进时间,而不是使用adjtime
系统调用来微调时间(缺省值)。如果在引导时从启动文件中调用,则应使用该选项。
-d 启用调试模式,在该模式下ntpdate
将经历所有步骤,而不仅仅是调整本地时钟。另外还将输出可用于一般性调试的信息。
-e authdelay 将执行身份验证功能的处理延迟指定为值authdelay
(以秒及其分数为单位;有关详细信息,请参阅xntpd(1M) )。虽然指定一个值可以在速度很慢的CPU
上提高走时精度,但是该数通常都非常小,以至在大多数情况下都可以将其忽略。
-k keyfile 将身份验证密钥文件的路径指定为字符串keyfile 。缺省值为/etc/ntp.keys
。该文件应该采用xntpd 中所述的格式。
-o version 将外发数据包的NTP 版本指定为整数版本(可以是1 或2)。缺省值是3。它允许将ntpdate与早期NTP
版本一起使用。
-p samples 将要从每个服务器中获取的示例数指定为整数示例,其值的范围是1 到8(包括这两个数)。缺省值为4。
-q 输出偏移量测量结果、服务器层次以及延迟测量结果,但不调整本地时钟。它类似于-d
选项,后者提供更为详细的调试信息。
-s 将日志记录输出从标准输出(缺省)转移到系统syslog (请参阅syslog(3C) )工具。它主要是为便于使用cron
脚本而设计。
-t timeout 将等待服务器响应的最长时间指定为超时值,以秒及其分数为单位。该值将四舍五入成0.2 秒的倍数。缺省值是1
秒,该值适用于轮询局域网。
-u 指示ntpdate
将无特权的端口用于外发的数据包。在防火墙后,如果阻塞向特权端口的传入流量,并且您希望与防火墙后的主机进行同步,则该选项极为有用。请注意,
-d 选项始终使用无特权的端口。
-v 输出NTP 版本号和偏移量测量信息。
当ntpdate提示下面错误时,使用ntpdate –b x.x.x.x就ok了
ntpdate: Can't adjust the time of day: Invalid argumen