事实上在Linux中有两个时钟系统,分别是系统时间和硬件时间
UTC是协调世界时(Universal Time Coordinated)英文缩写,它比北京时间早8个小时.
二)date
date能够打印/设定系统时间.
打印系统时间时,date命令会经过调用clock_gettime函数获取时间,同时会经过localtime文件(时区文件)计算出本地的时间.
设定系统时间时,date命令会经过读取localtime文件(时区文件)肯定本地的时区,再调用clock_settime函数计算出本地的时间.
三)hwclock
hwclock能够打印/设定硬件时钟.
校订Linux系统时间并把系统时间写入硬件windows
先校订Linux系统时间:安全
# ntpdate 0.cn.pool.ntp.org
13 Nov 18:27:41 ntpdate[7167]: step time server 85.199.214.101 offset 340324836.877469 sec
# date
Mon Nov 13 18:27:47 CST 2017
查看硬件时钟:
# hwclock --show
Wed 31 Jan 2007 08:19:51 PM CST -0.103558 seconds
而后把系统时间写入到硬件:
#
hwclock -w
#
hwclock --show 或者hwclock -r
Mon 13 Nov 2017 07:04:03 PM CST -0.478211 seconds
经过strace咱们能够跟踪hwclock执行时打开的文件,以下:
strace -e trace=open hwclock -r
open("/etc/ld.so.cache", O_RDONLY) = 3
open("/lib/libaudit.so.1", O_RDONLY) = 3
open("/lib/libc.so.6", O_RDONLY) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 4
open("/dev/rtc", O_RDONLY|O_LARGEFILE) = 4
open("/etc/adjtime", O_RDONLY|O_LARGEFILE) = 5
open("/usr/share/zoneinfo/Universal", O_RDONLY) = 5
open("/etc/localtime", O_RDONLY) = 5
open("/usr/share/locale/locale.alias", O_RDONLY) = 5
open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/util-linux-ng.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US.utf8/LC_MESSAGES/util-linux-ng.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en_US/LC_MESSAGES/util-linux-ng.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.UTF-8/LC_MESSAGES/util-linux-ng.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en.utf8/LC_MESSAGES/util-linux-ng.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en/LC_MESSAGES/util-linux-ng.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
Mon 17 Oct 2011 02:29:49 AM CST -0.567399 seconds
注:
1)hwclock首先打开了/dev/rtc,读取硬件时钟.
2)打开/etc/adjtime文件,经过先前的记录来估算硬件时钟的误差,并用来校订目前的时间.
3)打开/etc/localtime时区文件,将硬件时间转换为当前时区对映的时间.
下面介绍hwclock经常使用的几个参数:
-s(--hctosys)从硬件时钟读取时间更新到系统时钟.
-w(--systohc)将系统时钟时间写入硬件时钟.
--debug显示hwclock执行时详细的信息,例如:
hwclock -r --debug
hwclock from util-linux-ng 2.17.2
Using /dev interface to clock.
Last drift adjustment done at 1318866683 seconds after 1969
Last calibration done at 1318866683 seconds after 1969
Hardware clock is on UTC time
Assuming hardware clock is kept in UTC time.
Waiting for clock tick...
...got clock tick
Time read from Hardware Clock: 2011/10/17 15:51:32
Hw clock time : 2011/10/17 15:51:32 = 1318866692 seconds since 1969
Mon 17 Oct 2011 11:51:32 PM CST -0.117361 seconds
--set --date=<日期与时间>设定硬件时钟,以下:
读取硬件时间,如今是11:54(PM)
hwclock -r
Mon 17 Oct 2011 11:54:47 PM CST -0.003885 seconds
设定硬件时间为12:54(PM)
hwclock --set --date=12:54
再次读取硬件时间,发现时间已经变为12:54(PM)
hwclock -r
Mon 17 Oct 2011 12:54:03 PM CST -0.027942 seconds
注:
最后要说明的是hwclock输出的是带有AM/PM表示方式的硬件时间.
咱们能够经过hwclock --localtime将硬件时间转换为utc时间.
以下:
hwclock --localtime
Mon 17 Oct 2011 05:00:49 PM CST -0.478863 seconds
hwclock
Tue 18 Oct 2011 01:00:52 AM CST -0.821415 seconds
四)AM与PM
AM是上午,PM是下午,例如:
01:30:56 AM表示24小时制的凌晨01:30:56
01:30:56 PM表示24小时制的下午13:30:56
咱们能够用date命令在获取系统时间时,是AM仍是PM,以下:
date +%r
01:34:17 AM
五)时区与时间
只有设定了正确时区的前提下,才能正确的得出本地的时间.
例如:
若是咱们在中国大陆,但选择了美国的时区,经过ntpdate同步时,也获得的是美国当前时间.
时间文件是/etc/localtime,/usr/share/zoneinfo/目录下存放了全部的时区文件.
咱们使用的中国上海的时区文件,文件格式以下:
file /etc/localtime
/etc/localtime: timezone data, version 2, 3 gmt time flags, 3 std time flags, no leap seconds, 17 transition times, 3 abbreviation chars
有的人说也要设置/etc/sysconfig/clock文件,实际上这不是必须的,以下:
more /etc/sysconfig/clock
# The time zone of the system is defined by the contents of /etc/localtime.
# This file is only for evaluation by system-config-date, do not rely on its
# contents elsewhere.
ZONE="Asia/Shanghai"
六)RTC
Real time clock(RTC):实时时钟是用来持久存放系统时间的设备,即使系统关闭后,它也能够靠主板上的微电池提供的电力保持系统定时.
查看rtc的详细信息,以下:
cat /proc/driver/rtc
rtc_time : 17:16:08
rtc_date : 2011-10-16
alrm_time : 17:12:39
alrm_date : ****-**-**
alarm_IRQ : no
alrm_pending : no
24hr : yes
periodic_IRQ : no
update_IRQ : no
HPET_emulated : no
DST_enable : no
periodic_freq : 1024
batt_status : okay
注:这里的rtc_time时间是utc时间.
ls -l /sys/class/rtc/rtc0/
total 0
-r--r--r--. 1 root root 4096 Oct 18 00:00 date
-r--r--r--. 1 root root 4096 Oct 18 00:00 dev
lrwxrwxrwx. 1 root root 0 Oct 18 00:00 device -> ../../../00:04
-r--r--r--. 1 root root 4096 Oct 18 2011 hctosys
-rw-r--r--. 1 root root 4096 Oct 18 00:00 max_user_freq
-r--r--r--. 1 root root 4096 Oct 18 00:00 name
drwxr-xr-x. 2 root root 0 Oct 18 00:00 power
-r--r--r--. 1 root root 4096 Oct 18 00:00 since_epoch
lrwxrwxrwx. 1 root root 0 Oct 18 2011 subsystem -> ../../../../../class/rtc
-r--r--r--. 1 root root 4096 Oct 18 00:00 time
-rw-r--r--. 1 root root 4096 Oct 18 2011 uevent
-rw-r--r--. 1 root root 4096 Oct 18 00:00 wakealarm
从rtc中获取的日期信息
cat /sys/class/rtc/rtc0/date
2011-10-17
从rtc中获取的时间信息
cat /sys/class/rtc/rtc0/time
16:27:56
rtc设备的主设备号和从设备号
cat /sys/class/rtc/rtc0/dev
254:0
非特权用户能够从这个rtc中请求的最大中断率
cat /sys/class/rtc/rtc0/max_user_freq
64
从1970-01-01 00:00:00开始的时间累计(秒数)
cat /sys/class/rtc/rtc0/since_epoch
1318868801
注:能够用date +%s来获取系统的时间.
七)总结:
咱们能够经过date命令获取系统的时间,系统时间是由可编程定时/计数器产生的输出脉冲触发中断而产生的.每个输出脉冲也叫作一个时间滴答.
在操做系统中能够经过修改grub中的内核引导参数(tick_divider)来调整时钟中断频率,例如:
咱们将tick_divider=10,也就是100Hz,那么每秒就有100次时间滴答,每一个时钟滴答就是10毫秒(10ms).相应的系统时间就会每10ms增1.
内核经过经过变量jiffy来记录系统启动后产生的时间滴答的总数.
tick_divider可以使用下列值:
2=500 Hz
4=250 Hz
5=200 Hz
8=125 Hz
10= 100 Hz
只限于X86和X86_64架构,不支持Xen.
第二部分:
1、首先要弄清几个概念:
1. “
系统时间”与“
硬件时间”
系统时间: 通常说来就是咱们执行 date 命令看到的时间,linux系统下全部的时间调用(除了直接访问硬件时间的命令)都是使用的这个时间。
硬件时间: 主板上BIOS中的时间,由主板电池供电来维持运行,系统开机时要读取这个时间,并根据它来设定系统时间(注意:系统启动时根据硬件时间设定系统时间的过程可能存在时区换算,这要视具体的系统及相关设置而定)。
2. “
UTC时间”与“
本地时间”
UTC时间:Coordinated Universal 8 e2 i( H7 t0 ^/ ^Time 世界协调时间(又称世界标准时间、世界统一时间),在通常精度要求下,它与GMT(Greenwich Mean Time,格林威治标准时间)是同样的,其实也就是说 GMT≈UTC,但 UTC 是以原子钟校准的,更精确。
本地时间:因为处在不一样的时区,本地时间通常与UTC是不一样的,换算方法就是
本地时间 = UTC + 时区 或 UTC = 本地时间 - 时区
时区东为正,西为负,例如在中国,本地时间都使用北京时间,在linux上显示就是 CST(China Standard Time,中国标准时,注意美国的中部标准时Central Standard Time也缩写为CST,与这里的CST不是一回事!),时区为东八区,也就是 +8 区,因此 CST=UTC+(+8小时) 或 UTC=CST-(+8小时)。
2、时间命令
1. 系统时间 date
直接调用 date,获得的是本地时间。若是想获得UTC时间的话,使用 date -u。
[12-01 19:07> ~]$ date
2009年 12月 07日 星期一 14:22:20 CST
[12-01 19:07> ~]$
date -u
2009年 12月 07日 星期一 06:22:22 UTC
2. 硬件时间 /sbin/hwclock
直接调用 /sbin/hwclock 显示的时间就是 BIOS 中的时间吗?未必!这要看 /etc/sysconfig/clock 中是否启用了UTC,若是启用了UTC(UTC=true),显示的实际上是通过时区换算的时间而不是BIOS中真正的时间,若是加上 --localtime 选项,则获得的老是 BIOS 中实际的时间.
[12-01 19:07> ~]# hwclock
2009年12月07日 星期一 14时28分43秒 -0.611463 seconds
[12-01 19:07> ~]# hwclock --utc
2009年12月07日 星期一 14时28分46秒 -0.594189 seconds
[12-01 19:07> ~]# hwclock --localtime
2009年12月07日 星期一 06时28分50秒 -0.063875 seconds
3. /etc/localtime
这个文件用来设置系统的时区,将 /usr/share/zoneinfo/ 中相应文件拷贝到/etc下并重命名为 localtime 便可修改时区设置,并且这种修改对 date 命令是及时生效的。不管是 date 仍是 hwclock 都会用到这个文件,会根据这个文件的时区设置来进行UTC和本地之间之间的换算。
4. /etc/sysconfig/clock
这个文件只对 hwclock 有效,并且彷佛是只在系统启动和关闭的时候才有用,好比修改了其中的 UTC=true 到 UTC=false 的先后,执行 hwclock (--utc, 或 --localtime) 都没有变化,要重启系统后才生效。注:若是设置 UTC=false 并重启系统后,执行一些命令结果以下:
date 2009年 12月 07日 星期一 19:26:29 CST
date -u 2009年 12月 07日 星期一 11:26:29 UTC
hwclock 2009年12月07日 星期一 19时26分30秒 -0.442668 seconds
hwclock --utc 2009年12月08日 星期二 03时26分31秒 -0.999091 seconds
hwclock --localtime 2009年12月07日 星期一 19时26分32秒 -0.999217 seconds
可见,若是不使用UTC,BIOS时间(红色部分)就是系统本地时间,并且注意这时执行 hwclock --utc 获得的结果没有任何意义,由于这里咱们已经禁用了UTC,并且也明显不符合“本地时间=UTC+时区”的关系。
3、linux与windows双系统间的时间同步
系统启动和关闭时,硬件时间与系统时间之间的同步有两种方式(假设在中国,用CST表明本地时间):
方式A: 使用UTC(对linux就是 /etc/sysconfig/clock 中 UTC=true)
开机: BIOS--------->UTC(将BIOS中的时间当作是UTC)------(时区变化)----->CST
关机: CST -------(时区变化)----->UTC-------存储到------>BIOS
方式B: 不使用UTC(对linux就是 /etc/sysconfig/clock 中 UTC=false)
开机: BIOS----------------------->CST(将BIOS中的时间当作是CST)
关机: CST ---------存储到------>BIOS
经过设定 /etc/sysconfig/clock,linux能够支持这两种方式,然而windows只支持方式B(至少是默认支持B,而我不知道怎么能让它支持A),那么在双系统状况下,若是linux设成A方式,那么在linux与windows系统切换时必定会形成时间混乱的,解决办法就是将linux中的UTC禁用,也设成B方式就能够了。
注:能够经过 hwclock --hctosys 来利用硬件时间来设置系统时间(注意不是简单的复制BIOS中的时间为系统时间,要看是否使用UTC,若是使用的话则要作时区换算),经过 hwclock --systohc 来根据系统时间设置硬件时间(也要看是否启用UTC来决定是否作时区换算)。总之,不论使用 --systohc 仍是 --hctosys,同步后直接运行不带参数的 hwclock 获得的时间与直接运行 date 获得的时间应该一致,这个时间是否就是BIOS中的时间(hwclock --localtime)那就不必定了,若是启用了UTC就不是,没启用UTC就是。
并且好要注意:在系统中手动使用 hwclock hwclock --set --date='yyyy-mm-dd' 来设置BIOS时间只在系统运行时有效,由于当系统关闭时,还会按设定好的方式根据系统时间来重设BIOS时间的,因而手动的设置便被覆盖掉了。
--------------------------------------------------------
Linux的时间设置与同步 (NTP)
Network Time Protocol (NTP) 也是RHCE新增的考试要求. 学习的时候也顺便复习了一下如何设置Linux的时间,如今拿出来和你们分享设置NTP服务器不难可是NTP自己是一个很复杂的协议. 这里只是简要地介绍一下实践方法和上次同样,下面的实验都在RHEL5上运行 1. 时间和时区 若是有人问你说如今几点? 你看了看表回答他说晚上8点了. 这样回答看上去没有什么问题,可是若是问你的这我的在欧洲的话那么你的回答就会让他很疑惑,由于他那里还太阳当空呢. 这里就有产生了一个如何定义时间的问题. 由于在地球环绕太阳旋转的24个小时中,世界各地日出日落的时间是不同的.因此咱们才有划分时区(timezone) 的必要,也就是把全球划分红24个不一样的时区. 因此咱们能够把时间的定义理解为一个时间的值加上所在地的时区(注意这个所在地能够精确到城市) 地理课上咱们都学过格林威治时间(GMT), 它也就是0时区时间. 可是咱们在计算机中常常看到的是UTC. 它是Coordinated Universal Time的简写. 虽然能够认为UTC和GMT的值相等(偏差至关之小),可是UTC已经被认定为是国际标准,因此咱们都应该遵照标准只使用UTC 那么假如如今中国当地的时间是晚上8点的话,咱们能够有下面两种表示方式 20:00 CST 12:00 UTC 这里的CST是Chinese Standard Time,也就是咱们一般所说的北京时间了. 由于中国处在UTC+8时区,依次类推那么也就是12:00 UTC了. 为何要说这些呢(呵呵这里不是地理论坛吧...)? 第一,无论经过任何渠道咱们想要同步系统的时间,一般提供方只会给出UTC+0的时间值而不会提供时区(由于它不知道你在哪里).因此当咱们设置系统时间的时候,设置好时区是首先要作的工做第二,不少国家都有夏令时(我记得小时候中国也实行过一次),那就是在一年当中的某一天时钟拨快一小时(好比从UTC+8一下变成UTC+9了),那么同理到时候还要再拨慢回来.若是咱们设置了正确的时区,当须要改变时间的时候系统就会自动替咱们调整 如今咱们就来看一下如何在Linux下设置时区,也就是time zone 2. 如何设置Linux Time Zone 在Linux下glibc提供了咱们事先编译好的许多timezone文件, 他们就放在/usr/share/zoneinfo这个目录下,这里基本涵盖了大部分的国家和城市
代码:
# ls -F /usr/share/zoneinfo/
Africa/ Chile/ Factory Iceland Mexico/ posix/ Universal
America/ CST6CDT GB Indian/ Mideast/ posixrules US/
Antarctica/ Cuba GB-Eire Iran MST PRC UTC
Arctic/ EET GMT iso3166.tab MST7MDT PST8PDT WET
Asia/ Egypt GMT0 Israel Navajo right/ W-SU
Atlantic/ Eire GMT-0 Jamaica NZ ROC zone.tab
Australia/ EST GMT+0 Japan NZ-CHAT ROK Zulu
Brazil/ EST5EDT Greenwich Kwajalein Pacific/ Singapore
Canada/ Etc/ Hongkong Libya Poland Turkey
CET Europe/ HST MET Portugal UCT在这里面咱们就能够找到本身所在城市的time zone文件. 那么若是咱们想查看对于每一个time zone当前的时间咱们能够用zdump命令
代码:
# zdump Hongkong
Hongkong Fri Jul 6 06:13:57 2007 HKT那么咱们又怎么来告诉系统咱们所在time zone是哪一个呢? 方法有不少,这里举出两种 第一个就是修改/etc/localtime这个文件,这个文件定义了我么所在的local time zone. 咱们能够在/usr/share/zoneinfo下找到咱们的time zone文件而后拷贝去到/etc/localtimezone(或者作个symbolic link) 假设咱们如今的time zone是BST(也就是英国的夏令时间,UTC+1)
代码:
# date
Thu Jul 5 23:33:40 BST 2007咱们想把time zone换成上海所在的时区就能够这么作
代码:
# ln -sf /usr/share/zoneinfo/posix/Asia/Shanghai /etc/localtime
# date
Fri Jul 6 06:35:52 CST 2007这样时区就改过来了(注意时间也作了相应的调整) 第二种方法也就设置TZ环境变量的值. 许多程序和命令都会用到这个变量的值. TZ的值能够有多种格式,最简单的设置方法就是使用tzselect命令
代码:
# tzselect
...
TZ='America/Los_Angeles';export TZtzselect会让你选择所在的国家和城市(我省略了这些步骤),最后输出相应的TZ变量的值.那么若是你设置了TZ的值以后时区就又会发生变化
代码:
# date
Thu Jul 5 15:48:11 PDT 2007经过这两个例子咱们也能够发现TZ变量的值会override /etc/localtime. 也就是说当TZ变量没有定义的时候系统才使用/etc/localtime来肯定time zone. 因此你想永久修改time zone的话那么能够把TZ变量的设置写入/etc/profile里 好了如今咱们知道怎么设置时区了,下面咱们就来看看如何设置Linux的时间吧 3. Real Time Clock(RTC) and System Clock 说道设置时间这里还要明确另一个概念就是在一台计算机上咱们有两个时钟:一个称之为硬件时间时钟(RTC),还有一个称之为系统时钟(System Clock) 硬件时钟是指嵌在主板上的特殊的电路, 它的存在就是平时咱们关机以后还能够计算时间的缘由系统时钟就是操做系统的kernel所用来计算时间的时钟. 它从1970年1月1日00:00:00 UTC时间到目前为止秒数总和的值 在Linux下系统时间在开机的时候会和硬件时间同步(synchronization),以后也就各自独立运行了 那么既然两个时钟独自运行,那么时间久了必然就会产生偏差了,下面咱们来看一个例子
代码:
# date
Fri Jul 6 00:27:13 BST 2007
# hwclock --show
Fri 06 Jul 2007 12:27:17 AM BST -0.968931 seconds经过hwclock --show命令咱们能够查看机器上的硬件时间(always in local time zone), 咱们能够看到它和系统时间仍是有必定的偏差的, 那么咱们就须要把他们同步 若是咱们想要把硬件时间设置成系统时间咱们能够运行如下命令
代码:
# hwclock --hctosys反之,咱们也能够把系统时间设置成硬件时间
代码:
# hwclock --systohc那么若是想设置硬件时间咱们能够开机的时候在BIOS里设定.也能够用hwclock命令
代码:
# hwclock --set --date="mm/dd/yy hh:mm:ss"若是想要修改系统时间那么用date命令就最简单了
代码:
# date -s "dd/mm/yyyy hh:mm:ss"如今咱们知道了如何设置系统和硬件的时间. 但问题是若是这两个时间都不许确了怎么办? 那么咱们就须要在互联网上找到一个能够提供咱们准确时间的服务器而后经过一种协议来同步咱们的系统时间,那么这个协议就是NTP了. 注意接下去咱们所要说的同步就都是指系统时间和网络服务器之间的同步了 4. 设置NTP Server前的准备 其实这个标题应该改成设置"NTP Relay Server"前的准备更加合适. 由于不论咱们的计算机配置多好运行时间久了都会产生偏差,因此不足以给互联网上的其余服务器作NTP Server. 真正可以精确地测算时间的仍是原子钟. 但因为原子钟十分的昂贵,只有少部分组织拥有, 他们链接到计算机以后就成了一台真正的NTP Server. 而咱们所要作的就是链接到这些服务器上同步咱们系统的时间,而后把咱们本身的服务器作成NTP Relay Server再给互联网或者是局域网内的用户提供同步服务 好了,前面讲了一大堆理论,如今咱们来动手实践一下吧. 架设一个NTP Relay Server其实很是简单,咱们先把须要的RPM包装上
代码:
# rpm -ivh ntp-4.2.2p1-5.el5.rpm那么第一步咱们就要找到在互联网上给咱们提供同步服务的NTP Server
http://www.pool.ntp.org是NTP的官方网站,在这上面咱们能够找到离咱们城市最近的NTP Server. NTP建议咱们为了保障时间的准确性,最少找两个个NTP Server 那么好比在英国的话就能够选择下面两个服务器 0.uk.pool.ntp.org 1.uk.pool.ntp.org 它的通常格式都是number.country.pool.ntp.org 第二步要作的就是在打开NTP服务器以前先和这些服务器作一个同步,使得咱们机器的时间尽可能接近标准时间. 这里咱们能够用ntpdate命令
代码:
# ntpdate 0.uk.pool.ntp.org
6 Jul 01:21:49 ntpdate[4528]: step time server 213.222.193.35 offset -38908.575181 sec
# ntpdate 0.pool.ntp.org
6 Jul 01:21:56 ntpdate[4530]: adjust time server 213.222.193.35 offset -0.000065 sec假如你的时间差的很离谱的话第一次会看到调整的幅度比较大,因此保险起见能够运行两次. 那么为何在打开NTP服务以前先要手动运行同步呢? 1. 由于根据NTP的设置,若是你的系统时间比正确时间要快的话那么NTP是不会帮你调整的,因此要么你把时间设置回去,要么先作一个手动同步 2. 当你的时间设置和NTP服务器的时间相差很大的时候,NTP会花上较长一段时间进行调整.因此手动同步能够减小这段时间 5. 配置和运行NTP Server 如今咱们就来建立NTP的配置文件了, 它就是/etc/ntp.conf. 咱们只须要加入上面的NTP Server和一个driftfile就能够了
代码:
# vi /etc/ntp.conf
server 0.uk.pool.ntp.org
server 1.uk.pool.ntp.org
driftfile /var/lib/ntp/ntp.drift很是的简单. 接下来咱们就启动NTP Server,而且设置其在开机后自动运行
代码:
# /etc/init.d/ntpd/start
# chkconfig --level 35 ntpd on6. 查看NTP服务的运行情况 如今咱们已经启动了NTP的服务,可是咱们的系统时间到底和服务器同步了没有呢? 为此NTP提供了一个很好的查看工具: ntpq (NTP query) 我建议你们在打开NTP服务器后就能够运行ntpq命令来监测服务器的运行.这里咱们可使用watch命令来查看一段时间内服务器各项数值的变化
代码:
# watch ntpq -p
Every 2.0s: ntpq -p Sat Jul 7 00:41:45 2007
remote refid st t when poll reach delay offset jitter ============================================================================== +193.60.199.75 193.62.22.98 2 u 52 64 377 8.578 10.203 289.032 *mozart.musicbox 192.5.41.41 2 u 54 64 377 19.301 -60.218 292.411如今我就来解释一下其中的含义 remote: 它指的就是本地机器所链接的远程NTP服务器 refid: 它指的是给远程服务器(e.g. 193.60.199.75)提供时间同步的服务器 st: 远程服务器的级别. 因为NTP是层型结构,有顶端的服务器,多层的Relay Server再到客户端. 因此服务器从高到低级别能够设定为1-16. 为了减缓负荷和网络堵塞,原则上应该避免直接链接到级别为1的服务器的. t: 这个.....我也不知道啥意思^_^ when: 我我的把它理解为一个计时器用来告诉咱们还有多久本地机器就须要和远程服务器进行一次时间同步 poll: 本地机和远程服务器多少时间进行一次同步(单位为秒). 在一开始运行NTP的时候这个poll值会比较小,那样和服务器同步的频率也就增长了,能够尽快调整到正确的时间范围.以后poll值会逐渐增大,同步的频率也就会相应减少 reach: 这是一个八进制值,用来测试可否和服务器链接.每成功链接一次它的值就会增长 delay: 从本地机发送同步要求到服务器的round trip time offset: 这是个最关键的值, 它告诉了咱们本地机和服务器之间的时间差异. offset越接近于0,咱们就和服务器的时间越接近 jitter: 这是一个用来作统计的值. 它统计了在特定个连续的链接数里offset的分布状况. 简单地说这个数值的绝对值越小咱们和服务器的时间就越精确 那么你们细心的话就会发现两个问题: 第一咱们链接的是0.uk.pool.ntp.org为何和remote server不同? 第二那个最前面的+和*都是什么意思呢? 第一个问题不难理解,由于NTP提供给咱们的是一个cluster server因此每次链接的获得的服务器都有多是不同.一样这也告诉咱们了在指定NTP Server的时候应该使用hostname而不是IP 第二个问题和第一个相关,既然有这么多的服务器就是为了在发生问题的时候其余的服务器还能够正常地给咱们提供服务.那么如何知道这些服务器的状态呢? 这就是第一个记号会告诉咱们的信息 * 它告诉咱们远端的服务器已经被确认为咱们的主NTP Server,咱们系统的时间将由这台机器所提供 + 它将做为辅助的NTP Server和带有*号的服务器一块儿为咱们提供同步服务. 当*号服务器不可用时它就能够接管 - 远程服务器被clustering algorithm认为是不合格的NTP Server x 远程服务器不可用 了解这些以后咱们就能够实时监测咱们系统的时间同步情况了 7. NTP安全设置 运行一个NTP Server不须要占用不少的系统资源,因此也不用专门配置独立的服务器,就能够给许多client提供时间同步服务, 可是一些基本的安全设置仍是颇有必要的那么这里一个很简单的思路就是第一咱们只容许局域网内一部分的用户链接到咱们的服务器. 第二个就是这些client不能修改咱们服务器上的时间 在/etc/ntp.conf文件中咱们能够用restrict关键字来配置上面的要求 首先咱们对于默认的client拒绝全部的操做 代码: restrict default kod nomodify notrap nopeer noquery而后容许本机地址一切的操做 代码: restrict 127.0.0.1最后咱们容许局域网内全部client链接到这台服务器同步时间.可是拒绝让他们修改服务器上的时间 代码: restrict 192.168.1.0 mask 255.255.255.0 nomodify把这三条加入到/etc/ntp.conf中就完成了咱们的简单配置. NTP还能够用key来作authenticaiton,这里就不详细介绍了 8. NTP client的设置 作到这里咱们已经有了一台本身的Relay Server.若是咱们想让局域网内的其余client都进行时间同步的话那么咱们就都应该照样再搭建一台Relay Server,而后把全部的client都指向这两台服务器(注意不要把全部的client都指向Internet上的服务器). 只要在client的ntp.conf加上这你本身的服务器就能够了 代码: server ntp1.leonard.com server ntp2.leonard.com9. 一些补充和拾遗 1. 配置文件中的driftfile是什么? 咱们每个system clock的频率都有小小的偏差,这个就是为何机器运行一段时间后会不精确. NTP会自动来监测咱们时钟的偏差值并予以调整.但问题是这是一个冗长的过程,因此它会把记录下来的偏差先写入driftfile.这样即便你从新开机之后以前的计算结果也就不会丢失了 2. 如何同步硬件时钟? NTP通常只会同步system clock. 可是若是咱们也要同步RTC的话那么只须要把下面的选项打开就能够了 代码: # vi /etc/sysconfig/ntpd SYNC_HWCLOCK=yes10.