树莓派上使用htpdate同步时间
最近住处的网络由电信换为移动宽带之后,之前一直使用的 Raspberry Pi 树莓派板子上出现系统时间不正确的问题(显示为 1970 年 1 月 1 日),由于树莓派板子上没有 RTC 硬件和电池,因此树莓派上的系统时间重启是保存不了的。
之前设置的是每次开机自动使用 ntpdate 命令从 NTP 服务器上同步时间,但现在每次运行时都提示:
root@XBian:~# ntpdate ntp.sjtu.edu.cn 13 Oct 23:49:01 ntpdate[1484]: no server suitable for synchronization found
同时公司里电信网络环境下这个命令又是完全正常的,移动宽带环境下直接 ping 这个 NTP 服务器也是通的,因此估计就是移动宽带直接把 NTP 给封了。
在谴责移动的同时只能另想办法,还好网上已经有人想到这种应对 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
然后重启树莓派就可以正常同步系统时间了。