ntp 配置详解
一.时间和时区
在LINUX系统中,有许多场合都使用时间戳的方式表示时间,即从1970年1月1日起至当前的天数或秒数。
世界遵循一个标准UTC,中国的标准是CST(北京时间)中国处于UTC+8时区
二.linux time zone设置
时区文件包含在这里
[root@director ~]# ls /usr/share/zoneinfo/
一般我们选择的是
/usr/share/zoneinfo/poxAsia/Chongqing
/usr/share/zoneinfo/Asia/Shanghai
文件类型是:
[root@director ~]# file /usr/share/zoneinfo/Asia/Shanghai
/usr/share/zoneinfo/Asia/Shanghai: timezone data, version 2, 3 gmt time flags, 3 std time flags, no leap seconds, 17 transition times, 3 abbreviation chars
1:使用date命令查看时区 东八区
[root@lnx01 ~]# date -R
Sun, 11 Jan 2015 23:06:02 +0800
2:查看clock系统配置文件
[root@db-server ~]# more /etc/sysconfig/clock
ZONE="Asia/Chongqing"
3.修改时区方法
方法1:使用tzselect设置时区
[root@db-server ~]# tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent or ocean.
1) Africa
2) Americas
3) Antarctica
4) Arctic Ocean
5) Asia
6) Atlantic Ocean
7) Australia
8) Europe
9) Indian Ocean
10) Pacific Ocean
11) none - I want to specify the time zone using the Posix TZ format.
#? 5
Please select a country.
1) Afghanistan 18) Israel 35) Palestine
2) Armenia 19) Japan 36) Philippines
3) Azerbaijan 20) Jordan 37) Qatar
4) Bahrain 21) Kazakhstan 38) Russia
5) Bangladesh 22) Korea (North) 39) Saudi Arabia
6) Bhutan 23) Korea (South) 40) Singapore
7) Brunei 24) Kuwait 41) Sri Lanka
8) Cambodia 25) Kyrgyzstan 42) Syria
9) China 26) Laos 43) Taiwan
10) Cyprus 27) Lebanon 44) Tajikistan
11) East Timor 28) Macau 45) Thailand
12) Georgia 29) Malaysia 46) Turkmenistan
13) Hong Kong 30) Mongolia 47) United Arab Emirates
14) India 31) Myanmar (Burma) 48) Uzbekistan
15) Indonesia 32) Nepal 49) Vietnam
16) Iran 33) Oman 50) Yemen
17) Iraq 34) Pakistan
#? 9
Please select one of the following time zone regions.
1) east China - Beijing, Guangdong, Shanghai, etc.
2) Heilongjiang (except Mohe), Jilin
3) central China - Sichuan, Yunnan, Guangxi, Shaanxi, Guizhou, etc.
4) most of Tibet & Xinjiang
5) west Tibet & Xinjiang
#? 1
The following information has been given:
China
east China - Beijing, Guangdong, Shanghai, etc.
Therefore TZ='Asia/Shanghai' will be used.
Local time is now: Sun Jan 11 23:31:51 CST 2015.
Universal Time is now: Sun Jan 11 15:31:51 UTC 2015.
Is the above information OK?
1) Yes
2) No
#? yes
Please enter 1 for Yes, or 2 for No.
#? 1
You can make this change permanent for yourself by appending the line
TZ='Asia/Shanghai'; export TZ
to the file '.profile' in your home directory; then log out and log in again.
Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Asia/Shanghai
注意:tzselect命令只告诉你选择的时区的写法,并不会生效。所以现在它还不是东8区北京时间。你可以在.profile、.bash_profile或者/etc/profile中设置正确的TZ环境变量并导出。 例如在.bash_profile里面设置 TZ='Asia/Shanghai'; export TZ并使其生效。
如修改
[root@director ~]# vi .bash_profile
11 TZ='Asia/Tibet' #西藏
12 export TZ
[root@director ~]# source .bash_profile
#时间自动调整,从上午10点--上午2点 东八区到东0区
[root@director ~]# date -R
Mon, 01 Feb 2016 02:15:08 +0000
方法2:复制相应的时区文件,替换系统时区文件;或者创建链接文件
在/usr/share/zoneinfo/下面有很多时区文件,如下所示,可以复制这些时区文件覆盖/etc/localtime文件,或修改符号链接/etc/locatime对应的文件
[root@director ~]# date -R
Mon, 01 Feb 2016 02:19:09 +0000
[root@director ~]# cp /usr/share/zoneinfo/America/Los_Angeles /etc/localtime
cp: overwrite `/etc/localtime'? y
注意:执行完成后,使用date -R没有生效,原因可能是在用户家目录下
配置了TZ,并导出了,取消即可,但是当前会话仍然保留了旧的时区,新建会话即可查看最新时间设置
使用链接的方式也可以,选项 软链接&强制
[root@db-server ~]# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
[root@db-server ~]# date -R
Mon, 12 Jan 2015 10:56:10 +0800
注意:顺便修改下/etc/sysconfig/clock中ZONE选项,不改也不影响使用。
统一一下配置信息,建议还是修改下
[root@director ~]# vi /etc/sysconfig/clock
1 ZONE="Asia/Shanghai"
方法3:使用timeconfig设置时区
timeconfig命令仅限于RedHat Linux 和 CentOS。
安装方法:
yum install system-config-date
timeconfig是linux提供的一个图形化的配置根据,相对比较直观。
图形界面,比较占用资源,如果事先没有安装好这个图形界面,则会要求安装过多的资源
和系统安装时候选择时区的配置是一致的,不再演示其效果
三:linux硬件时钟和系统时间的设置
格林威治时间 seconds since 1970-01-01 00:00:00 UTC
绝对时间,一般为了全球时间一致,都是用这个时间,然后换算成当地的时间
钟表现在使用的是时间振荡器,误差极小,主板上以后这个振荡器,又有纽扣电池,所以时间是非常精确的,这个时间就是硬件时间,实时时间 rtc
linux开机后复制了硬件时间后,就会自动进行计时,因此有两个时间
硬件时钟 clock hwclock
系统时钟 date
date语法:
SYNOPSIS
date [OPTION]... [+FORMAT]
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
1.时间查看:
[root@director ~]# clock
Mon 01 Feb 2016 10:38:07 AM CST -1.095871 seconds
[root@director ~]# hwclock
Mon 01 Feb 2016 10:40:12 AM CST -0.532677 seconds
[root@director ~]# date
Mon Feb 1 10:38:09 CST 2016
2.系统时间设置
-s :string的格式来设置
#常见的表示格式都支持
[root@director ~]# date -s "20150101 10:10:10"
Thu Jan 1 10:10:10 CST 2015
#直接设置,精确到秒
[root@director ~]# date 101710462015.20
Sat Oct 17 10:46:20 CST 2015
3.格式化显示时间
按照上面的语法,使用 '+' 开头来格式化输出,既然是格式化,就可以把%当作字符串了,因此可以格式化输出成字符串的形式
%n : 下一行
%t : 跳格
%H : 小时(00-23)
%I : 小时(01-12)
%k : 小时(0-23)
%l : 小时(1-12)
%M : 分钟(00-59)
%p : 显示本地 AM 或 PM
%r : 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M)
%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数
%S : 秒(00-60)
%T : 直接显示时间 (24 小时制)
%X : 相当于 %H:%M:%S
%Z : 显示时区
%a : 星期几 (Sun-Sat)
%A : 星期几 (Sunday-Saturday)
%b : 月份 (Jan-Dec)
%B : 月份 (January-December)
%c : 直接显示日期与时间
%d : 日 (01-31)
%D : 直接显示日期 (mm/dd/yy)
%h : 同 %b
%j : 一年中的第几天 (001-366)
%m : 月份 (01-12)
%U : 一年中的第几周 (00-53) (以 Sunday 为一周的第一天的情形)
%w : 一周中的第几天 (0-6)
%W : 一年中的第几周 (00-53) (以 Monday 为一周的第一天的情形)
%x : 直接显示日期 (mm/dd/yy)
%y : 年份的最后两位数字 (00.99)
%Y : 完整年份 (0000-9999)
上述格式不必全都记住,只需要掌握几个常用的即可。例如%Y表示年,%m表示月,%d表示日,%H表示小时,%M表示分钟,%S表示秒,%s表示从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数,相当于time函数,%w表示一周中的第几天。
[root@director ~]# date "+现在的时间为:%Y-%m-%d %H:%M:%S"
现在的时间为:2015-01-01 10:17:21
#显示时间戳
[root@director ~]# date +%s
1454295112
可以使用date year month now tomorrow yesterday next-day next monday weeks等词来操作
#显示3个月后的今天
[root@director ~]# date "+现在的时间为:%Y-%m-%d %H:%M:%S" -d "+3 month"
现在的时间为:2016-05-01 10:53:41
[root@director ~]# date "+现在的时间为:%Y-%m-%d %H:%M:%S" -d "now"
现在的时间为:2016-02-01 10:53:47
4.系统时间正确了,那要同步下硬件时间
hwclock -w #将硬件时间修改为系统时间
hwclock -s #将系统时间修改为硬件时间
四:ntp 网络时间协议来同步
1.ntp服务的安装,默认系统都会安装
#查看系统是否安装了ntp
[root@director ~]# rpm -qa | grep ntp
ntp-4.2.4p8-3.el6.i686
ntpdate-4.2.4p8-3.el6.i686
fontpackages-filesystem-1.41-1.1.el6.noarch
#查看安装的文件列表
[root@director ~]# rpm -ql ntp
2.设置NTP server前的准备
不论我们的计算机配置多好运行时间久了都会产生误差,所以不足以给互联网上的其他服务器做NTP Server. 真正能够精确地测算时间的还是原子钟. 但由于原子钟十分的昂贵,只有少部分组织拥有, 他们连接到计算机之后就成了一台真正的NTP Server. 而我们所要做的就是连接到这些服务器上同步我们系统的时间,然后把我们自己的服务器做成NTP Relay Server再给互联网或者是局域网内的用户提供同步服务
1)http://www.pool.ntp.org是NTP的官方网站,在这上面我们可以找到离我们城市最近的NTP Server. NTP建议我们为了保障时间的准确性,最少找两个个NTP Server
China ― cn.pool.ntp.org
To use this pool zone, add the following to your ntp.conf file:
server 2.cn.pool.ntp.org
server 0.asia.pool.ntp.org
server 2.asia.pool.ntp.org
2)在打开NTP服务器之前先和这些服务器做一个同步,使得我们机器的时间尽量接近标准时间.
这里我们可以用ntpdate命令手动更新时间
[root@director ~]# ntpdate 2.cn.pool.ntp.org
1 Feb 11:14:52 ntpdate[4118]: step time server 202.118.1.81 offset 576.293462 sec
[root@director ~]# ntpdate 0.asia.pool.ntp.org
1 Feb 11:14:56 ntpdate[4119]: adjust time server 203.160.128.3 offset -0.028097 sec
[root@director ~]# ntpdate 2.asia.pool.ntp.org
1 Feb 11:15:11 ntpdate[4120]: adjust time server 129.250.35.250 offset -0.008592 sec
假如你的时间差的很离谱的话第一次会看到调整的幅度比较大,所以保险起见可以运行两次.
3)那么为什么在打开NTP服务之前先要手动运行同步呢?
1. 因为根据NTP的设置,如果你的系统时间比正确时间要快的话那么NTP是不会帮你调整的,所以要么你把时间设置回去,要么先做一个手动同步
2. 当你的时间设置和NTP服务器的时间相差很大的时候,NTP会花上较长一段时间进行调整.所以手动同步可以减少这段时间
3.配置NTP服务
配置文件/etc/ntp.conf,默认一般有,无则手动创建
[root@director ~]# vim /etc/ntp.conf
server 2.cn.pool.ntp.org
server 0.asia.pool.ntp.org
server 2.asia.pool.ntp.org
# stratum 这行是时间服务器的层次。设为0则为顶级,如果要向别的NTP服务器更新时间,请不要把它设为0,默认为10
fudge 127.127.1.0 stratum 10
#设置服务启动,开启自启
service ntpd start
[root@director ~]# chkconfig ntpd on
4.查看那ntp的运行状态:
[root@director ~]# watch ntpq -p
Every 2.0s: ntpq -p Mon Feb 1 03:30:47 2016
remote refid st t when poll reach delay offset jitter
==============================================================================
dns1.synet.edu. 202.118.1.47 2 u 23 64 1 69.900 -13.409 0.001
ntp.verd.co.id 203.160.128.3 3 u 23 64 1 289.693 -15.772 0.001
web10.hnshostin 158.43.128.33 2 u 21 64 1 598.753 56.216 0.001
现在我就来解释一下其中的含义
remote: 它指的就是本地机器所连接的远程NTP服务器
refid: 它指的是给远程服务器(e.g. 193.60.199.75)提供时间同步的服务器
st: 远程服务器的层级别(stratum). 由于NTP是层型结构,有顶端的服务器,多层的Relay Server再到客户端. 所以服务器从高到低级别可以设定为1-16. 为了减缓负荷和网络堵塞,原则上应该避免直接连接到级别为1的服务器的.
t: 这个.....我也不知道啥意思^_^
when: 我个人把它理解为一个计时器用来告诉我们还有多久本地机器就需要和远程服务器进行一次时间同步
poll: 本地机和远程服务器多少时间进行一次同步(单位为秒). 在一开始运行NTP的时候这个poll值会比较小,那样和服务器同步的频率也就增加了,可以尽快调整到正确的时间范围.之后poll值会逐渐增大,同步的频率也就会相应减小
reach: 这是一个八进制值,用来测试能否和服务器连接.每成功连接一次它的值就会增加
delay: 从本地机发送同步要求到服务器的round trip time
offset: 这是个最关键的值, 它告诉了我们本地机和服务器之间的时间差别. offset越接近于0,我们就和服务器的时间越接近
jitter: 这是一个用来做统计的值. 它统计了在特定个连续的连接数里offset的分布情况. 简单地说这个数值的绝对值越小我们和服务器的时间就越精确
那么大家细心的话就会发现两个问题: 第一我们连接的是2.cn.pool.ntp.org为什么和remote server不一样? 第二那个最前面的+和*都是什么意思呢?
第一个问题不难理解,因为NTP提供给我们的是一个cluster server所以每次连接的得到的服务器都有可能是不一样.同样这也告诉我们了在指定NTP Server的时候应该使用hostname而不是IP
第二个问题和第一个相关,既然有这么多的服务器就是为了在发生问题的时候其他的服务器还可以正常地给我们提供服务.那么如何知道这些服务器的状态呢? 这就是第一个记号会告诉我们的信息
* 它告诉我们远端的服务器已经被确认为我们的主NTP Server,我们系统的时间将由这台机器所提供
+ 它将作为辅助的NTP Server和带有*号的服务器一起为我们提供同步服务. 当*号服务器不可用时它就可以接管
- 远程服务器被clustering algorithm认为是不合格的NTP Server
x 远程服务器不可用
5.ntp安全设置
运行一个NTP Server不需要占用很多的系统资源,所以也不用专门配置独立的服务器,就可以给许多client提供时间同步服务, 但是一些基本的安全设置还是很有必要的
那么这里一个很简单的思路就是第一我们只允许局域网内一部分的用户连接到我们的服务器. 第二个就是这些client不能修改我们服务器上的时间
关于权限设定部分
权限的设定主要以 restrict 这个参数来设定,主要的语法为:
restrict IP地址 mask 子网掩码 参数
其中 IP 可以是IP地址,也可以是 default ,default 就是指所有的IP
参数有以下几个:
ignore :关闭所有的 NTP 联机服务
nomodify:客户端不能更改服务端的时间参数,但是客户端可以通过服务端进行网络校时。
notrust :客户端除非通过认证,否则该客户端来源将被视为不信任子网
noquery :不提供客户端的时间查询
注意:如果参数没有设定,那就表示该 IP (或子网)没有任何限制!
在/etc/ntp.conf文件中我们可以用restrict关键字来配置上面的要求
首先我们对于默认的client拒绝所有的操作
示例:
#拒绝所有client的所有操作(rhel默认配置 -6是ipv6含义)
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
#允许本地的所有操作
restrict 127.0.0.1
#允许局域网本网段的用户操作,但不能修改服务端的时间
restrict 172.16.0.0 mask 255.255.0.0 nomodify notrap
6.ntp客户端设置
做到这里我们已经有了一台自己的Relay Server.如果我们想让局域网内的其他client都进行时间同步的话那么我们就都应该照样再搭建一台Relay Server,然后把所有的client都指向这两台服务器(注意不要把所有的client都指向Internet上的服务器). 只要在client的/etc/ntp.conf加上这你自己的服务器就可以了
1)
[root@RS1 ~]# vim /etc/ntp.conf
server 172.16.100.1
#linux客户端进行同步
[root@RS1 ~]# ntpdate 172.16.100.1
1 Feb 11:48:41 ntpdate[29202]: adjust time server 172.16.100.1 offset 0.000309 sec
注意事项:其它LINUX如果仅作为只客户端的话,则不能启动ntpd服务!否则无法运行ntpdata 服务器地址 来同步时间
之后可以使用cron或修改crontab文件定期向NTP服务器更新时间,并用 hwclock -w #把系统时间设置为硬件时间
2)
如果想定时进行时间校准,可以使用crond服务来定时执行。
编辑 /etc/crontab 文件
加入下面一行: #每隔一分钟更新,仅作测试
*/1 * * * * root /usr/sbin/ntpdate 172.16.100.1 ; /sbin/hwclock -w #172.16.100.1是NTP服务器的IP地址
然后重启crond服务
service crond restart
这样,每隔一分钟 Linux 系统就会自动的进行网络时间校准。
[root@RS1 ~]# tail /var/log/cron #通过查看这个日志可以看到定时任务是否执行
windows也可以同步时间
win7为例子:
windows界面-时间区域点击--弹开的窗口点击更改日期和时间设置--internet时间--更改设置--服务器修改为自己的ntp服务器域名或者ip地址
7.造成无法客户端无法更新的原因:
1)、客户端的日期必须要设置正确,不能超出正常时间24小时,不然会因为安全原因被拒绝更新。其次客户端的时区必须要设置好,以确保不会更新成其它时区的时间。
测试:可以用不同时区的ntp服务来做同步,系统会自动同步,只要UTC绝对尽量一致即可
2)、fudge 127.127.1.0 stratum 10 如果是LINUX做为NTP服务器,stratum(层级)的值不能太大,如果要向上级NTP更新可以设成2
3)、LINUX的NTP服务器必须记得将从上级NTP更新的时间从系统时间写到硬件里去 hwclock --systohc
NTP一般只会同步system clock. 但是如果我们也要同步RTC(hwclock)的话那么只需要把下面的选项打开就可以了
代码:
# vi /etc/sysconfig/ntpd
SYNC_HWCLOCK=yes
4)、Linux如果开启了NTP服务,则不能手动运行ntpdate更新时间(会报端口被占用),它只能根据/etc/ntp.conf 里server 字段后的服务器地址按一定时间间隔自动向上级NTP服务器更新时间。可以运行命令 ntpstat 查看每次更新间隔如:
[root@ESXI ~]# ntpstat
synchronised to NTP server (210.72.145.44) at stratum 2 #本NTP服务器层次为2,已向210.72.145.44 NTP同步过
time correct to within 93 ms #时间校正到相差93ms之内
polling server every 1024 s #每1024秒会向上级NTP轮询更新一次时间