嵌入式linux添加NTP服务

2019-07-12 14:35发布

版本信息:
  Linux version 4.1.15
需求: RTC时间不够精确,过一段时间就可以看出和实际时间有明显出入,有必要添加NTP服务,使系统可以与网络同步时间。  首先把NTP服务build进rootfs,修改/etc/ntp.conf,网上参考很多,内容如下: driftfile /var/lib/ntp/drift restrict default kod nomodify notrap nopeer noquery restrict -6 default kod nomodify notrap nopeer noquery restrict 127.0.0.1 restrict -6 ::1 restrict 10.0.0.0 mask 255.0.0.0 nomodify notrap restrict 192.168.0.0 mask 255.255.0.0 nomodify notrap restrict 172.16.0.0 mask 255.15.0.0 nomodify notrap # Use public servers from the pool.ntp.org project. server 210.72.145.44 perfer server 0.cn.pool.ntp.org server 1.cn.pool.ntp.org server 2.cn.pool.ntp.org server 0.asia.pool.ntp.org server 1.asia.pool.ntp.org server 2.asia.pool.ntp.org server 0.CentOS.pool.ntp.org server 1.centos.pool.ntp.org server 2.centos.pool.ntp.org server 127.127.1.0 # local clock fudge 127.127.1.0 stratum 10  更新rootfs,重启系统(确保可以上网),发现时间确实和网上同步了。
查看date, ~# date Wed Mar 28 01:12:39 UTC 2018  系统时间是UTC时间,我们希望是中国时间,需要在rootfs添加时区配置,默认rootfs没有localtime,使用UTC时间,NTP在同步时间时,会把系统时间改为真正的UTC时间。添加中国时区(Shanghai)方法如下:
从ubuntu 拷贝/usr/share/zoneinfo/Asia/Shanghai 到目标机,再执行
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  重启系统,这样date 就是上海时区的时间了。     ~# date;hwclock -r Wed Mar 28 09:22:39 CST 2018 Wed Mar 28 01:22:39 2018 0.000000 seconds   不过RTC时间总是UTC时间, 可执行hwclock -r -u   ~# date;hwclock -r -u Wed Mar 28 10:00:51 CST 2018 Wed Mar 28 10:00:51 2018 0.000000 seconds  系统开机时,系统会读rtc时间设定系统时间,关机时会把系统时间写入rtc.具体执行脚本在
    /etc/rc2.d/S20hwclock.sh —>/etc/init.d/hwclock.sh
从中可以看出,hwclock.sh从/etc/default/rcS 读出UTC 变量值,决定tz (时区) 是–UTC,或者 –localtime. 决定hwclock –hctosys ,hwclock -systohc 用–UTC 还是–localtime. 可以修改/etc/default/rcS VERBOSE=yes,这样系统开关机时可以从串口看到hwclock.sh的执行过程。
 ntpd启动脚本在 /etc/rc2.d/S20ntpd.sh —>/etc/init.d/ntpd
执行  /etc/init.d/ntpd restart
date时间即可以立即同步。
ntpd启动后,执行ntpdate会报端口占用错误,如果想用ntpdate同步时间,可把/etc/init.d/ntpd执行属性去掉,重启系统,
  执行 ntpdate 0.cn.pool.ntp.org
date时间即可以和网上同步。 修改ntpd的授时间隔(Polling interval):
默认ntpd的Polling interval是6~10, 即
minpoll 6  
maxpoll 10
意思是Polling interval 64s~1024s.
minpoll最小可取3,maxpoll最大可取17, 把
minpoll 6  
maxpoll 8
添加到/etc/ntp.conf, 重启系统测试: 
这是时间不准时的时间,  ~# hwclock -r;date Wed Mar 28 11:00:38 2018 0.000000 seconds Wed Mar 28 11:00:38 CST 2018 这是时间被ntp校准后的时间,经过4、5分钟,date时间确实被校准了。 :~# hwclock -r;date Wed Mar 28 11:06:04 2018 0.000000 seconds Thu Mar 29 11:13:36 CST 2018 但rtc没有被同时校准,网上有提示在 /etc/sysconfig/ntpd 添加
SYNC_HWCLOCK=yes
经过实际测试,date和rtc没有被同时校准,不过,过一段时间rtc也被校准了。 ~# hwclock -r;date Thu Mar 29 03:50:41 2018 0.000000 seconds Thu Mar 29 11:50:40 CST 2018   目前还有一个小毛病是date使用localtime, hwclock -r却是UTC时间,尝试修改/etc/default/rcS UTC=no,依然如此,也许是ntpd把RTC时间改为UTC时间了吧,好在可以通过hwclock -r -u 获取和date一致的时间。