zoukankan      html  css  js  c++  java
  • Raspberry Pi开发之旅-同步时间

    使用htpdate同步时间

    由于树莓派板子上没有 RTC 硬件和电池,因此树莓派上的系统时间重启是保存不了的。网上已经有人想到应对 NTP 被防火墙封掉类似的需求了,开源的 htpdate 命令直接使用 HTTP 协议来进行系统时间同步,项目主页在这里:

    https://github.com/iridium77/htpdate

    htpdate 的原理也非常简单,直接解析 HTTP 协议头中的服务器时间信息,然后设置本地时间,我们来看百度返回的 HTTP 头:

    HTTP/1.1 200 OK
    Date Mon, 13 Oct 2014 16:05:18 GMT
    Content-Type text/html
    Transfer-Encoding chunked
    Connection Keep-Alive
    Cache-Control private
    Expires Mon, 13 Oct 2014 16:05:18 GMT
    Server BWS/1.1
    BDPAGETYPE 2
    BDQID 0x8b40c1f700000bd4
    BDUSERID 13923551
    Set-Cookie BDSVRTM=133; path=/
    Set-Cookie BD_HOME=1; path=/

    上面的 Date Mon, 13 Oct 2014 16:05:18 GMT 就是百度的 Web 服务器上的系统时间了。

    htpdate 命令做时间同步会有 0.5 秒左右的误差(看看 HTTP 头就知道里面很多时间都是以秒为单位哈),对于我的树莓派来说就完全没有关系,如果对这个比较在意的话只能尽量用 NTP 时间同步了。

    htpdate 使用上也很简单,简单编译安装之后把这条命令加到 Raspberry Pi Raspbian 系统的 /etc/rc.local 文件中(不加 -t 参数基本不能同步成功哦):

    htpdate -t -s ntp.neu.edu.cn

    然后重启树莓派就可以正常同步系统时间了。

    使用局域网NTP服务器同步时间

    1、配置局域网NTP服务器

    下载地址:https://www.meinbergglobal.com/english/sw/ntp.htm
    按默认步骤安装即可。

    2、修改配置文件ntp.conf

    配置文件默认路径为:C:Program Files (x86)NTPetc tp.conf
    去掉

    1. #server 127.127.1.0  
    2. #fudge 127.127.1.0 stratum 12 

    前的#
    保存

    笔者改完后的配置文件内容如下

    1. # NTP Network Time Protocol   
    2. # **** ATTENTION ****: *You have to restart the NTP service when you change this file to activate the changes*   
    3. # PLEASE CHECK THIS FILE CAREFULLY AND MODIFY IT IF REQUIRED   
    4. # Configuration File created by Windows Binary Distribution Installer Rev.: 1.27  mbg  
    5. # please check http://www.ntp.org for additional documentation and background information  
    6. # restrict access to avoid abuse of NTP for traffic amplification attacks   
    7. # see http://news.meinberg.de/244 for details    
    8. restrict default noquery nopeer nomodify notrap    
    9. restrict -6 default noquery nopeer nomodify notrap    
    10.    
    11. # allow status queries and everything else from localhost   
    12. restrict 127.0.0.1   
    13. restrict -6 ::1   
    14.    
    15. # if you need to allow access from a remote host, you can add lines like this:   
    16. # restrict <IP OF REMOTE HOST>   
    17.    
    18. # Use drift file   
    19. driftfile "D:Program Files (x86)NTPetc tp.drift"  
    20.   
    21. # your local system clock, could be used as a backup  
    22. # (this is only useful if you need to distribute time no matter how good or bad it is)  
    23. server 127.127.1.0  
    24. # but it should operate at a high stratum level to let the clients know and force them to  
    25. # use any other timesource they may have.  
    26. fudge 127.127.1.0 stratum 12  
    27.   
    28. # Use a NTP server from the ntp pool project (see http://www.pool.ntp.org)  
    29. # Please note that you need at least four different servers to be at least protected against  
    30. # one falseticker. If you only rely on internet time, it is highly recommended to add  
    31. # additional servers here.   
    32. # The 'iburst' keyword speeds up initial synchronization, please check the documentation for more details!  
    33.  server 0.asia.pool.ntp.org iburst minpoll 6 maxpoll 7  
    34.  server 1.asia.pool.ntp.org iburst minpoll 6 maxpoll 7  
    35.  server 2.asia.pool.ntp.org iburst minpoll 6 maxpoll 7  
    36.  server 0.us.pool.ntp.org iburst minpoll 6 maxpoll 7  
    37.  server 1.us.pool.ntp.org iburst minpoll 6 maxpoll 7  
    38.  server 2.us.pool.ntp.org iburst minpoll 6 maxpoll 7  
    39.   
    40.   
    41. # End of generated ntp.conf --- Please edit this to suite your needs 

    3、重启服务

    计算机--右键 管理--服务与应用程序--服务,找到Network Time Protocol Daemon,右键重启
    或者通过开始菜单重启。两者作用一样
    开始--Meinberg--Network Time Protocol--Service Control--Restart NTP Service

    4、本地测试

    命令行输入
    ntpq -p
    结果中的第一行如果出现LOCAL,说明NTP服务器进程存在

    1. Microsoft Windows [版本 6.3.9600]  
    2. (c) 2013 Microsoft Corporation。保留所有权利。  
    3.   
    4. C:Windowssystem32>ntpq -p  
    5.      remote           refid      st t when poll reach   delay   offset  jitter  
    6. ==============================================================================  
    7.  LOCAL(0)        .LOCL.          12 l  201   64   10    0.000    0.000   0.000  
    8. +ntp2.aliyun.com 10.137.38.86     2 u   61   64    7   55.655    1.918   7.038  
    9. *118.189.211.186 .PPS.            1 u   62   64    7  117.009   10.206   3.703  
    10. +shim.active-app 218.186.3.36     2 u  124   64    2  105.239   -4.597   2.797  
    11. -104.156.99.226  192.12.19.20     2 u   61   64    5  256.067   -2.231   7.130  
    12. -y.ns.gin.ntt.ne 249.224.99.213   2 u   10   64    5  138.076   11.235   8.025  
    13.   
    14. C:Windowssystem32> 

    5、添加防火墙例外

    将ntp.exe添加到防火墙例外或者将UDP的123端口添加到防火墙例外

    6、再次重启服务器

    7、配置树莓派同步时间

    首先熟悉几个关于时间命令

    1. date #查看当前时间  
    2. date -s "2016-03-31 10:18:00" #设置当前时间为2016年3月31日10:18:00  
    3. date -s 2016-03-31 #设置当前日期为2016年3月31日0:00:00  
    4. date -s 10:18:00 #设置当前时间为10:18:00

    8、安装ntpdate

    sudo apt-get install ntpdate

    9、对时

    sudo ntpdate 172.26.69.87

    其中172.26.69.87为局域网NTP服务器的IP地址
    对时后可用date命令查看时间

    tip1:如果遇到the NTP socket is in use, exiting的提示,这是因为ntpd也是用的UDP123端口更新时间,我们先将ntp这个服务关掉

    sudo service ntp stop

    然后再执行

    sudo ntpdate 172.26.69.87 

    tip2:如果遇到no server suitable for synchronization found的提示,多半是因为网络不通或者对应的NTP服务器没有启动。

    10、修改时区

    默认情况下树莓派使用的是UTC时间,与北京时间相差8小时,所以需要修改时区
    tzselect命令并不能真正的修改
    正确的做法是替换掉时区文件

    sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 

    修改之后用date查看到的是CST时间

    11、添加局域网NTP服务器地址

    修改配置文件ntp.conf

    sudo nano /etc/ntp.conf

    在server项目前面添加如下内容

    1. server 172.26.69.87 prefer  
    2. server 192.168.42.254 iburst  
    3. server cn.pool.ntp.org iburst  
    4. server asia.pool.ntp.org iburst  
    5. server pool.ntp.org iburst 

    这个配置文件用于ntpd程序同步时间,每次树莓派开机启动后都会启动这个程序,同步的时间需要5分钟。

    12、查看时间

    date

    13、配置开机自启

    在实际运行中,如果计算机的时间与网络时间相差超过30分钟,那么ntpd就不会自动同步了,笔者处于每天断电7~8个小时的校园网,所以每次开机必须先用ntpdate强制同步时间,但这个进程不能执行得太早,太早的话可能还没联网。所以加了个延迟40秒启动。

    编辑

    sudo nano /usr/bin/synctime 

    内容

    1. #! /bin/sh  
    2.   
    3. #延迟40秒启动  
    4. sleep 40s  
    5.   
    6. #停止ntpd服务  
    7. killall ntpd  
    8.   
    9. #对时  
    10. ntpdate -u 202.199.131.1  
    11.   
    12. #开启ntpd服务器  
    13. ntpd -c /etc/ntp.conf 

    保存
    修改脚本执行权限

    sudo chmod a+x /usr/bin/synctime 

    加入开机启动

    sudo nano /etc/rc.local

    #在exit 0前面添加

    sudo /usr/bin/synctime > /dev/null 2>&1

    保存
    修改执行权限

    sudo chmod +x /etc/rc.local

    重启

    reboot

    附:

    DJTU内网推荐NTP配置

    1. server 222.26.224.216 prefer  
    2. server 202.199.131.1 iburst  
    3. server 202.120.2.100 iburst  
    4. server cn.pool.ntp.org iburst 
  • 相关阅读:
    【内网穿透】【natapp】web服务映射
    【javascript】日期转字符串
    【springcloud】Transaction rolled back because it has been marked as rollback-only
    MySQL 快速创建索引
    MySQL 快速导入大量数据 资料收集
    基于WinCE的JSON 类库 源码
    C# 模拟提交 Form表单的数据
    git恢复删除的分支及内容
    js数组push方法使用注意
    mint-ui的search组件如何在键盘显示搜索按钮
  • 原文地址:https://www.cnblogs.com/sirius-swu/p/6654402.html
Copyright © 2011-2022 走看看