需求来源
嵌入式系统通常分上位机
和下位机
,如果二者的日志时间戳 能一致,则对定位问题价值巨大。另外有些原型系统的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
注意,本文假设你的下位机是默认root账户登录,若是普通账户则需要sudo来提升权限,以及expect脚本来实现自动输入密码!
注意2,为了正确显示时间,还要确保时区配置正确,这里只要设置TZ
环境变量即可,在/root/.bashrc
的ntpdate
语句前加一行:
TZ='Asia/Shanghai'; export TZ
就能正确显示时区了!
ps.如果你想用别的时区,可以运行tzselect
这个交互式命令查询你想要的时区,它会给出对应的TZ
环境变量值。
pps.设置时区前系统的时间是UTC时间,设置后是CST时间,这里是二者的区别
root@linaro-ubuntu-desktop:~
Mon Aug 16 18:20:53 UTC 2021
root@linaro-ubuntu-desktop:~
root@linaro-ubuntu-desktop:~
Tue Aug 17 02:22:09 CST 2021
让NTP服务随Windows开机启动
之前开启的NTP服务属于手工启动,Windows重启后就停了,这时Linux客户端会报错:找不到服务器
![NTP客户端找不到NTP服务器](https://img8.php1.cn/3cdc5/159cc/5a0/f439457d11824638.png#pic_center)
所以需要让NTP服务开机启动,做法是:计算机管理
->服务和应用程序
->服务
,找到Windows Time
服务,双击打开属性
对话框,点开启动类型
下拉框,将手动
改为自动
,最后点确定
退出。
![让NTP服务开机启动](https://img8.php1.cn/3cdc5/159cc/5a0/f97dc93d58a3d3ea.png#pic_center)
使用效果
配置后第一次重启
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
前后对比
![绿线以上为对时前](https://img8.php1.cn/3cdc5/159cc/5a0/46f8aa3a2243bbe0.png#pic_center)
完