如何保持正确的时间,如何使用NTP和systemd让你的计算机在不滥用时间服务器的前提下保持同步。
它的时间是多少
让Linux来告诉你时间的时候,它是很奇怪的。你可能认为是使用time命令来告诉你时间,其实并不是,因为time只是一个测量一个进程运行了多少时间的计时器。为得到时间,你需要运行的是date命令,你想查看更多的日期,你可以运行cal命令。文件上的时间戳也是一个容易混淆的地方,因为根据你的发行版默认情况不同,它一般有两种不同的显示方法。下面是来自Ubuntu16.04LTS的示例:
$ls-l
drwxrwxr-x5carlacarla4096Mar272017stuff
drwxrwxr-x2carlacarla4096Dec811:32things
-rw-rw-r--1carlacarla626052Nov2112:07fatpdf.pdf
-rw-rw-r--1carlacarla2781Apr182017oddlots.txt
有些显示年,有些显示时间,这样的方式让你的文件更混乱。GNU默认的情况是,如果你的文件在六个月以内,则显示时间而不是年。我想这样做可能是有原因的。如果你的Linux是这样的,尝试用ls-l--time-style=long-iso命令,让时间戳用同一种方式去显示,按字母顺序排序。请查阅如何更改Linux的日期和时间:简单的命令去学习Linux上管理时间的各种方法。
检查当前设置
NTP——网络时间协议,它是保持计算机正确时间的老式方法。ntpd是NTP守护程序,它通过周期性地查询公共时间服务器来按需调整你的计算机时间。它是一个简单的、轻量级的协议,使用它的基本功能时设置非常容易。systemd通过使用systemd-timesyncd.service已经越俎代庖地“干了NTP的活”,它可以用作ntpd的客户端。
在我们开始与NTP“打交道”之前,先花一些时间来了检查一下当前的时间设置是否正确。
你的系统上(至少)有两个时钟:系统时间——它由Linux内核管理,第二个是你的主板上的硬件时钟,它也称为实时时钟(RTC)。当你进入系统的BIOS时,你可以看到你的硬件时钟的时间,你也可以去改变它的设置。当你安装一个新的Linux时,在一些图形化的时间管理器中,你会被询问是否设置你的RTC为UTC(世界标准时间CoordinatedUniversalTime)时区,因为所有的时区和夏令时都是基于UTC的。你可以使用hwclock命令去检查:
$sudohwclock--debug
hwclockfromutil-linux2.27.1
Usingthe/devinterfacetotheclock.
HardwareclockisonUTCtime
AssuminghardwareclockiskeptinUTCtime.
Waitingforclocktick...
...gotclocktick
TimereadfromHardwareClock:2018/01/2222:14:31
Hwclocktime:2018/01/2222:14:31=1516659271secondssince1969
Timesincelastadjustmentis1516659271seconds
CalculatedHardwareClockdriftis0.000000seconds
Mon22Jan201802:14:30PMPST.202760seconds
HardwareclockisonUTCtime表明了你的计算机的RTC是使用UTC时间的,虽然它把该时间转换为你的本地时间。如果它被设置为本地时间,它将显示Hardwareclockisonlocaltime。
你应该有一个/etc/adjtime文件。如果没有的话,使用如下命令同步你的RTC为系统时间,
$sudohwclock-w
这个命令将生成该文件,内容看起来类似如下:
$cat/etc/adjtime
0.00000015166619530.000000
1516661953
UTC
新发明的systemd方式是去运行timedatectl命令,运行它不需要root权限:
$timedatectl
Localtime:Mon2018-01-2214:17:51PST
Universaltime:Mon2018-01-2222:17:51UTC
RTCtime:Mon2018-01-2222:17:51
Timezone:America/Los_Angeles(PST,-0800)
Networktimeon:yes
NTPsynchronized:yes
RTCinlocalTZ:no
RTCinlocalTZ:no表明它使用UTC时间。那么怎么改成使用本地时间?这里有许多种方法可以做到。最简单的方法是使用一个图形配置工具,比如像openSUSE中的YaST。你也可使用timedatectl:
$timedatectlset-local-rtc0
或者编辑/etc/adjtime,将UTC替换为LOCAL。
systemd-timesyncd客户端
现在,我已经累了,但是我们刚到非常精彩的部分。谁能想到计时如此复杂?我们甚至还没有了解到它的皮毛;阅读man8hwclock去了解你的计算机如何保持时间的详细内容。
systemd提供了systemd-timesyncd.service客户端,它可以查询远程时间服务器并调整你的本地系统时间。在/etc/systemd/timesyncd.conf中配置你的(时间)服务器。大多数Linux发行版都提供了一个默认配置,它指向他们维护的时间服务器上,比如,以下是Fedora的:
[Time]
#NTP=
#FallbackNTP=0.fedora.pool.ntp.org1.fedora.pool.ntp.org
你可以输入你希望使用的其它时间服务器,比如你自己的本地NTP服务器,在NTP=行上输入一个以空格分隔的服务器列表。(别忘了取消这一行的注释)NTP=行上的任何内容都将覆盖掉FallbackNTP行上的配置项。
如果你不想使用systemd呢?那么,你将需要NTP就行。
配置NTP服务器和客户端
配置你自己的局域网NTP服务器是一个非常好的实践,这样你的网内计算机就不需要不停查询公共NTP服务器。在大多数Linux上的NTP都来自ntp包,它们大多都提供/etc/ntp.conf文件去配置时间服务器。查阅NTP时间服务器池去找到你所在的区域的合适的NTP服务器池。然后在你的/etc/ntp.conf中输入4-5个服务器,每个服务器用单独的一行:
driftfile/var/ntp.drift
logfile/var/log/ntp.log
server0.europe.pool.ntp.org
server1.europe.pool.ntp.org
server2.europe.pool.ntp.org
server3.europe.pool.ntp.org
driftfile告诉ntpd它需要保存用于启动时使用时间服务器快速同步你的系统时钟的信息。而日志也将保存在他们自己指定的目录中,而不是转储到syslog中。如果你的Linux发行版默认提供了这些文件,请使用它们。
现在去启动守护程序;在大多数主流的Linux中它的命令是sudosystemctlstartntpd。让它运行几分钟之后,我们再次去检查它的状态:
$ntpq-p
remoterefidsttwhenpollreachdelayoffsetjitter
=========================================================
+dev.smatwebdesi192.168.194.893u25643792.456-6.39518.530
*chl.la127.67.113.922u23643775.1758.8208.230
+four0.fairy.mat35.73.197.1442u226437116.272-10.03340.151
-195.21.152.161195.66.241.22u276437107.5591.82227.346
我不知道这些内容是什么意思,但重要的是,你的守护程序已经与时间服务器开始对话了,而这正是我们所需要的。你可以去运行sudosystemctlenablentpd命令,永久启用它。如果你的Linux没有使用systemd,那么,给你留下的家庭作业就是找出如何去运行ntpd。
现在,你可以在你的局域网中的其它计算机上设置systemd-timesyncd,这样它们就可以使用你的本地NTP服务器了,或者,在它们上面安装NTP,然后在它们的/etc/ntp.conf上输入你的本地NTP服务器。
NTP服务器会受到攻击,而且需求在不断增加。你可以通过运行你自己的公共NTP服务器来提供帮助。下周我们将学习如何运行你自己的公共服务器。
最后想要了解更多关于Linux发展前景趋势,请关注扣丁学堂Linux培训官网、微信等平台,扣丁学堂IT职业在线学习教育平台为您提供权威的Linux视频教程系统,通过千锋扣丁学堂金牌讲师在线录制的Linux视频教程课程,让你快速掌握Linux从入门到精通开发实战技能。扣丁学堂Linux技术交流群:659974587。