需求来源
嵌入式系统通常分上位机
和下位机
,如果二者的日志时间戳 能一致,则对定位问题价值巨大。另外有些原型系统的RTC时钟没装电池,更需要从外部获取真实时间,否则每次开机都是1970年1月1号
。
如果能够让下位机每次开机都跟上位机对一次时,即同步一下时间,则可满足上述需求,那么怎么对时呢?
解决方案:NTP
NTP又叫网络时间协议
,是一种用于时间同步的网络协议。
配置Windows为NTP服务器
Linux和Windows都有NTP客户端,但是Windows作为上位机,还必须得具备NTP服务器的能力,幸好,
win7以后的系统已经自带NTP server模块了,用户只需要打开即可,打开的方法见这篇文章
配置Linux为NTP客户端
Linux本身已经自带NTP客户端ntpdate
了,我们要做的是让它开机自动对时,于是在/root/.bashrc
里加一行即可
ntpdate 192.168.20.103 #上位机的IP
注意,本文假设你的下位机是默认root账户登录,若是普通账户则需要sudo来提升权限,以及expect脚本来实现自动输入密码!
注意2,为了正确显示时间,还要确保时区配置正确,这里只要设置TZ
环境变量即可,在/root/.bashrc
的ntpdate
语句前加一行:
TZ='Asia/Shanghai'; export TZ
就能正确显示时区了!
ps.如果你想用别的时区,可以运行tzselect
这个交互式命令查询你想要的时区,它会给出对应的TZ
环境变量值。
pps.设置时区前系统的时间是UTC时间,设置后是CST时间,这里是二者的区别
root@linaro-ubuntu-desktop:~# date
Mon Aug 16 18:20:53 UTC 2021
root@linaro-ubuntu-desktop:~# TZ='Asia/Shanghai'; export TZ
root@linaro-ubuntu-desktop:~# date
Tue Aug 17 02:22:09 CST 2021
让NTP服务随Windows开机启动
之前开启的NTP服务属于手工启动,Windows重启后就停了,这时Linux客户端会报错:找不到服务器
所以需要让NTP服务开机启动,做法是:计算机管理
->服务和应用程序
->服务
,找到Windows Time
服务,双击打开属性
对话框,点开启动类型
下拉框,将手动
改为自动
,最后点确定
退出。
使用效果
配置后第一次重启
Connecting to 192.168.20.161:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Welcome to Linaro 12.11 (GNU/Linux 4.6.0 uImageV0.2 -svn316 armv7l)
* Documentation: https://wiki.linaro.org/
Last login: Thu Jan 1 00:00:07 1970
19 Jul 08:26:23 ntpdate[1692]: step time server 192.168.20.103 offset 1626683154.275740 sec