在四个都能跑Ubuntu20.04的linux开发板上运行linuxptp,建立好了主从时间同步关系,以其中一个开发板为主时钟,其他为从时钟,如何在主时钟下达一个指令返回当前从时钟与主时钟之间的时间误差?并且让作为从时钟的Linux开发板得知下发指令?
要实现这个功能,你需要在主时钟上运行一个NTP服务器,然后在其他三个从时钟上运行NTP客户端来同步时间。当主时钟下达指令时,NTP客户端会返回与主时钟之间的时间误差。以下是具体步骤:
在四个Linux开发板上安装ntp软件包:
sudo apt-get update
sudo apt-get install ntp
配置主时钟(假设为开发板1)作为NTP服务器:
编辑/etc/ntp.conf
文件,添加以下内容:
server 192.168.1.1 iburst
其中,192.168.1.1
是主时钟的IP地址。保存并退出。
重启NTP服务:
sudo systemctl restart ntp
在主时钟上安装和配置NTP客户端:
sudo apt-get install ntpdate
创建一个脚本sync_time.sh
,内容如下:
#!/bin/bash
while true; do
date=$(ntpdate -q pool.ntp.org | awk '{print $4,$5,$6,$7}')
echo "当前时间:${date}"
# 在这里添加你的指令,例如发送邮件、短信等
sleep 60
done &
给脚本添加可执行权限:
chmod +x sync_time.sh
运行脚本:
./sync_time.sh &
这将使主时钟每分钟同步一次时间。你可以根据需要调整同步间隔。
在其他三个开发板上配置NTP客户端并同步时间:
编辑/etc/ntp.conf
文件,删除所有行或保留与主时钟相同的服务器配置。保存并退出。
重启NTP服务:
sudo systemctl restart ntp
运行脚本sync_time.sh
,使从时钟与主时钟同步时间。
要基于 PTP(精确时间协议)在四个 Linux 开发板上返回从时钟与主时钟之间的时间误差,您可以按照以下步骤进行操作:
在主时钟开发板上:
在从时钟开发板上:
在主时钟开发板上执行以下指令:
使用 ptp4l 命令查看当前主从时钟的状态:
ptp4l -m
记下各从时钟的 Clock ID(时钟标识符),通常以数字开头,如 00:01:02:03:04:05。
在主时钟开发板上使用 ptp4l 命令向特定从时钟查询时间戳:
ptp4l -p <从时钟的 Clock ID>
在从时钟开发板上执行以下指令:
使用 ptp4l 命令查看当前主从时钟的状态:
ptp4l -m
在从时钟开发板上执行以下脚本,用于接收来自主时钟的查询指令并返回时间戳:
#!/bin/bash
while true
do
ptp4l -S -A -P -H -r -s -N -p 2>&1 | grep "ptp4l"
done
这样,您就可以在主时钟开发板上通过 ptp4l 命令查询特定从时钟的时间戳,并在从时钟开发板上执行脚本以返回时间戳信息。
要让主时钟下达一个指令返回当前从时钟与主时钟之间的时间误差,并让作为从时钟的Linux开发板得知下发指令,可以使用以下步骤:
nptpq -p 600 -n -o address main
,其中main是主时钟的名称。#!/bin/bash
# 获取主时钟的IP地址
main_ip=$(nptpq -p 600 -n -o address main)
# 获取主时钟和从时钟之间的对等关系
peer=$(nptpq -p 600 -n -o peer main)
# 获取主时钟和从时钟之间的对等关系的当前状态
status=$(ntpquery -v -s $main_ip -u $peer -w 30 -n)
# 输出时间误差
echo "主时钟和从时钟之间的时间误差为:$status"
将该脚本保存为get_time_error.sh
,并赋予执行权限:chmod +x get_time_error.sh
。
#!/bin/bash
# 监听主时钟的端口
nc -l 50000
# 接收主时钟的指令
while true
do
echo "等待接收指令..."
read cmd
# 根据指令执行相应的操作
case $cmd in
"get_time_error")
/path/to/get_time_error.sh
;;
*)
echo "未知指令:$cmd"
;;
esac
done
将该脚本保存为receive_cmd.sh
,并赋予执行权限:chmod +x receive_cmd.sh
。
scp
命令将get_time_error.sh
脚本上传到从时钟上,并赋予执行权限:scp get_time_error.sh user@from_ip:/path/to/
。nc
命令监听主时钟的端口,并接收主时钟的指令。例如:nc -l 50000
。get_time_error.sh
脚本,并将结果发送到从时钟上。例如:ssh user@from_ip 'bash /path/to/receive_cmd.sh "get_time_error"'
。要在一个开发板上作为主时钟,而其他开发板作为从时钟,并获得从时钟与主时钟之间的时间误差,可以使用linuxptp工具和相应的命令。
以下是一种可能的步骤:
首先,在主时钟的开发板上安装和配置linuxptp。确保网络连接正常并正确配置了时钟参考源(如GPS、PTP Grandmaster等)。
在主时钟开发板上,使用以下命令启动linuxptp以成为主时钟:
sudo ptp4l -i <network-interface> -m -H
其中<network-interface>
是网络接口的名称,例如eth0
。
在从时钟的开发板上,同样安装和配置linuxptp,并确保网络连接正常。
使用以下命令在从时钟开发板上将其连接到主时钟:
sudo ptp4l -i <network-interface> -s -m
这将使从时钟与主时钟进行时间同步。
要获取从时钟与主时钟之间的时间误差,可以使用以下命令在从时钟开发板上:
sudo phc2sys -s <master-ip-address>
其中<master-ip-address>
是主时钟开发板的IP地址。执行此命令后,从时钟的开发板将显示与主时钟的时间误差。
请确保主时钟和从时钟的开发板都能互相访问,并拥有正确的网络配置。此外,还应注意防火墙规则和网络延迟等因素可能会影响时间同步和误差计算的准确性
如果你想在主时钟下达一个指令返回当前从时钟与主时钟之间的时间误差,你可以尝试以下几种方法:
如果你是使用 ptp4l 程序来运行 linuxptp,你可以在主时钟上使用 -m 选项来打印主从偏移量(offset from master)和路径延迟(path delay)等信息。例如,你可以使用以下命令:
ptp4l -i eth0 -m
这样,你就可以在标准输出中看到类似以下的输出:
ptp4l[1234.567]: port 1: master offset -123 s0 freq +456 path delay 789
这里的 master offset 就是从时钟相对于主时钟的时间误差,单位是纳秒。你也可以使用 -M 选项来打印更详细的信息,例如从时钟的 ID 和 IP 地址等¹。
如果你是使用 phc2sys 程序来同步系统时钟,你可以在主时钟上使用 -m 选项来打印系统时钟和 PTP 硬件时钟(PHC)之间的偏移量(offset)和频率(frequency)。例如,你可以使用以下命令:
phc2sys -s eth0 -w -m
这样,你就可以在标准输出中看到类似以下的输出:
phc2sys[1234.567]: [eth0] CLOCK_REALTIME phc offset -123 s0 freq +456 delay 789
这里的 phc offset 就是系统时钟相对于 PHC 的时间误差,单位是纳秒。如果你想要知道从时钟相对于主时钟的时间误差,你需要在从时钟上也运行 phc2sys,并将两个偏移量相加。
如果你想让作为从时钟的 Linux 开发板得知下发指令,你可以在主时钟上使用 ssh 或其他远程控制工具,来执行 ptp4l 或 phc2sys 的命令,并将输出重定向到从时钟的标准输入或文件中。例如,你可以使用以下命令:
ssh slave@192.168.1.2 "ptp4l -i eth0 -m" > /dev/stdin
这样,你就可以在从时钟上看到主时钟发送的指令和输出。
在Linuxptp中,可以使用ntpq命令查询时间同步状态和误差。
首先,在主时钟上运行以下命令查询从时钟列表:
sudo ntpq -p
该命令将显示所有已配置的NTP服务器以及它们的状态。从时钟应该被列出并标记为“未同步”。
接下来,在主时钟上运行以下命令来同步从时钟:
sudo ntpdate pool.ntp.org
其中,pool.ntp.org是一个公共NTP服务器池。您可以使用您自己的NTP服务器池。
然后,在主时钟上运行以下命令来查看从时钟与主时钟之间的时间误差:
sudo ntpq -p | grep "stratum"
该命令将显示每个NTP服务器的时间戳、延迟和偏移量。从时钟应该被列出并标记为“未同步”,并且其偏移量应该为零。
最后,在从时钟上运行以下命令来请求主时钟同步时间:
sudo ntpdate master.example.com
其中,master.example.com是主时钟的IP地址或主机名。从时钟应该被列出并标记为“已同步”。
如果需要让从时钟得知下发指令,可以使用Linux系统的邮件通知功能。例如,在Ubuntu上,可以使用mailutils软件包发送电子邮件通知。在主时钟上运行以下命令来配置邮件通知:
sudo nano /etc/ntp.conf
在该文件中添加以下行:
restrict default nomodify notrap nopeer noquery
restrict -6 default nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict -6 ::1
这将限制NTP服务器只能响应来自本地主机的请求。保存并关闭文件后,重启NTP服务:
sudo systemctl restart ntp
现在,当从时钟请求时间同步时,它将收到一封包含同步命令的电子邮件通知。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。