NTP (Network Time Protocol)

  • 地球共有24个时区,而以格林威治时间(GMT)为标准时间;
  • 最准确的时间为使用原子钟(Atomic clock)所计算的,例如 UTC(Coordinated Universal Time)就是一例。
  • linux系统本来就有两种时间,一种是linux 以 1920/01/01开始计数的系统时间,一种则是BIOS记载的硬件时间。 软件时钟: 由Linux 操作系统根据 1970/01/01 开始计算的总秒数; 硬件时钟: 主机硬件系统上面的时钟,例如BIOS记录的时间;
  • linux 可以透过网络校时,最常见的网络校时为使用NTP服务器,这个服务启动在 udp port 123;
  • NTP 服务器为一种阶梯式的服务,所以NTP服务器本来就会与上层时间服务器时间的同步化,因此 nptd 与 ntpdate 两个命令不可同时使用;
  • NTP 服务器的联机状态可以使用 ntpstat 及 ntpq -p 来查询。

查看NTP服务器是否与上层联机。

[root@localhost ebin]# ntpstat
synchronised to NTP server (120.25.115.20) at stratum 3
   time correct to within 79 ms
   polling server every 1024 s

[root@localhost etc]# ntpq -p
    remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+darwin.kenyonra 255.83.201.76    2 u  93m 1024  340  267.338    5.893   9.263
*120.25.115.20   10.137.38.86     2 u  288 1024  377   31.105   -1.139  15.493
+120.25.115.19   10.137.38.86     2 u 1052 1024  377   32.006   -2.325  18.519
+mx.comglobalit. 200.98.196.212   2 u  306 1024  257  313.641    1.955  13.162
  • NTP 提供的客户端软件为 ntpdate 这个指令。
  • 在 linux 下想要手动处理时间时, 需以 date 设定时间后,以 hwclock -w 来写入 BIOS 所记录的时间。
  • NTP 服务器之间的时间误差不可超过 1000 秒,否则 NTP服务会自动关闭。

NTP这个deamon是如何让Server与Client同步他们的时间的呢?

  1. 首先,主机当然需要启动这个deamon,之后,
  2. client会向NTP Server 发送出调校时间的message,
  3. 然后NTP Server 会送出当前的标准时间给Client,
  4. client接收了来自Server的时间后,会据以调整自己的时间,就达成了网络校时咯!

NTP服务端的设置

关于权限设定部分:
权限的设定主要以restrict这个参数来设定,主要的语法为:

restrict IP 地址 mask 子网掩码 参数  

其中IP 可以是IP地址,也可以是default, default 就是指所有的IP

参数有一下几个:
ignore: 关闭所有的NTP联机服务。
nomodify: 客户端不能更改服务器端的时间参数,但是客户端可以通过服务端进行网校时。
notrust: 客户端除非通过认证,否则该客户端来源将被视为不信任子网。
noquery: 不提供客户端的时间查询。
注意: 如果参数没有设定,那就表示该IP(或子网)没有任何限制!

利用server 设定上层NTP服务器
上层NTP服务器的设定方式为:

server [IP or hostname] [prefer]

在 server 端后可以接ip 或者主机名。 perfer 表示[优先使用]的服务器。

上级时间服务器的设定
由于我们配置的NTP服务器需要网络上面比较准确的NTP服务器来更新自己的时间,所以在我们的NTP服务器上面需要配置一部上级时间服务器来进行校准!

用server这个参数设定上级时间服务器语法为:

server IP地址或域名[prefer]

IP 地址或域名就是我们指定的上级时间服务器,如果Server参数最后加上 perfer,
表示我们的NTP服务器主要以该部主机时间进行校准。

以driftfile 记录时间差异
设定的方式如下:

driftfile [可以被ntpd 写入的目录与文件]

因为预设的NTP Server 本身的时间计算的依据 BIOS 的芯片震荡周期频率来计算的, 但是这个数值与上层 Time Server 不见得会一致啊! 所以NTP这个daemon(ntpd)会自动的去计算我们自己主机的频率与上层 Time server 的频率,并且将两个频率的误差记录下来,记录下来的文件就是在 driftfile 后面接的完整文档名当中了!
关于文档:

  • driftfile 后面接的文档需要使用完整路径文件名;
  • 该文档不能是连结档;
  • 该文档需要设定成ntpd这个daemon 可以写入的权限;
  • 改文档所记录的数值单位为: 百万分之一秒(ppm) driftfile 后面接的文档会被ntpd自动更新,所以他的权限一定要能够让ntpd 写入才行。

除了以restrict 来限制客户端的联机之外,我们也可以透过秘钥系统来给客户端认证。
如此一来可以让主机端更放心。

keys [key_file]

 # Key file containing the keys and key identifiers used when operating
 # with symmetric key cryptography.
 keys /etc/ntp/keys

时间及NTP服务器设定相关的配置文件和重要数据文件有底下几个:

  • /etc/ntp.conf : 就是NTP服务器的主要配置文件,也是唯一的一个;

  • /usr/share/zoneinfo/ 为各个时区的时间格式对应档。

  • /etc/sysconfig/clock 设定时区与是否使用UTC时间钟的配置文件。每次开机后linux会自动的读取这个文件来设定 自己系统所默认要显示的时间。

  • /etc/localtime : 这个文件是本地的时间配置文件,刚刚那个clock 文件里面规定了使用的时间配置文件, /usr/share/zoneinfo/Asia/Taipei,

至于在常用于时间服务器与修改时间的指定方面,主要有底下这几个啦:

  • /bin/date: 用于linux 时间(软件时钟)的修改与显示的指令。

  • /sbin/hwclock : 用于 BIOS时钟(硬件时钟)的修改与显示的指令。 这是一个root才能执行的指令, 因为 linux 系统上面BIOS 时间与linux 系统时间是分开的,所以使用date这个指令调整了时间之后,还需要使用 hwclock 才能将修改过后的时间写入BIOS当中。

  • /usr/sbin/ntpd: 主要提供NTP服务的程序, 配置文件为 /etc/ntp.conf

  • /usr/sbin/ntpdate : 用于客户端的时间校正,如果你没有要启动NTP而仅想要使用 NTP client 功能的话, 那么只会用到这个指令而已啦!


NTP时间同步告警的采集

//获取NTP时间服务状态
//#define NTP_STAT_CHECK           "ntpstat"
//#define NTP_CONF_CHECK           "grep 'prefer' -r /etc/ntp.conf"
void CBusinessMsgPro::GetSyncState()
{
	//获取上报时间
	char pcCurTime[64] = {0};
	GetSysTime(pcCurTime);

	int nSyncState = 0;
#ifdef _LINUX_PPC_
	nSyncState = 1;//ppc上不判断时间同步,直接设置为正常状态
#else

	//获取时间同步状态
	char achBuff[255];
	char achBuff1[255];
	memset(achBuff, 0, sizeof(achBuff));
	memset(achBuff1, 0, sizeof(achBuff1));

	FILE *fpStream = popen(NTP_STAT_CHECK, "r");
	if (NULL == fpStream)
	{
		ADP_LOG(ADP_ERROR, "[GetSyncState] popen : %s error: %s\n", NTP_STAT_CHECK,strerror(errno));
		return;
	}

	fread(achBuff, sizeof(char), sizeof(achBuff),  fpStream);
	pclose(fpStream);

	ADP_LOG(ADP_INFO, "[GetSyncState] NTP_STAT_CHECK state is : %s\n",achBuff);

	//获取/etc/ntp.conf中的prefer ip
	fpStream = popen(NTP_CONF_CHECK, "r");
	if (NULL == fpStream)
	{
		ADP_LOG(ADP_ERROR, "[GetSyncState] popen : %s error : %s\n", NTP_CONF_CHECK,strerror(errno));
		return;
	}

	fread(achBuff1, sizeof(char), sizeof(achBuff1),  fpStream);
	pclose(fpStream);

	ADP_LOG(ADP_INFO, "[GetSyncState] NTP_CONF_CHECK state is : %s\n",achBuff1);

	//如果有同步成功的标识
	if ((NULL != strstr(achBuff, "synchronised")) && (NULL == strstr(achBuff, "unsynchronised")))
	{
		//判断是否是同步localhost成功,如果是的话,查看/etc/ntp.conf中的prefer是否为127.0.0.1,如果不是,则也视为时间同步失败
		if (NULL != strstr(achBuff, "synchronised to local net at"))
		{
			if ((NULL != strstr(achBuff1, "127.0.0.1")) || (NULL != strstr(achBuff1, "localhost")))
			{
				nSyncState = 1;
			}
		}
		else
		{
			nSyncState = 1;
		}
	}
#endif

	//上报时间同步状态
	json_t * ptJsRoot = json_pack("{s:s, s:s, s:s, s:s, s:i}",
					"devid", m_pServerInfo[emServTypePhysical]->m_achSrvGUID,
					"devtype", m_pServerInfo[emServTypePhysical]->m_achSrvType,
					"eventid", EV_SYSTIME_SYNC,//消息类型
					"rpttime", pcCurTime,
					"syncstate", nSyncState);//每个cpu核的详细信息

	if (NULL == ptJsRoot)
	{
		ADP_LOG(ADP_ERROR, "[GetSyncState] Json root pack failed!\n");
		return;
	}

	m_pServerInfo[emServTypePhysical]->SendMsg(ptJsRoot);
}

转载于:https://my.oschina.net/lvhuizhenblog/blog/871090

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值