序
作为《局域网内所有设备时间一致性方法探究》一文的延续,今天我来尝试在华硕ASUS RT-AC66U无线路由器(以后简称为“路由器”)上来部署NTP Server。
相关软硬件
- 硬件:华硕ASUS RT-AC66U (非B1) 一台
- 固件:Asus-Merlin 380.70,下载地址(MD5:bdf27327a7ce336ae310835f635e8ffc)
- ntp.conf: 下载地址
- service-start: 下载地址
- SSH客户端:顺手就行
路由器升级
如图所示,直接通过界面完成。
JFFS、SSH和NTP相关设置
升级完成后,对JFFS、SSH和NTP相关功能进行参数配置,即开启JFFS用户脚本和配置,开启局域网内的SSH功能和配置互联网NTP服务器地址,如下图所示:
建立ntp.conf配置文件
使用SSH客户端访问路由器:
- 在jffs目录下建立ntp子目录
- 在ntp目录中建立ntp.conf配置文件,可参考或直接使用前面共享的文件。
server 0.cn.pool.ntp.org iburst
server 1.cn.pool.ntp.org iburst
server 2.cn.pool.ntp.org iburst
server 3.cn.pool.ntp.org iburst
完成后的目录结构是:/jffs/ntp/ntp.conf
建立services-start脚本
路由器系统ntp服务只能识别内存中/etc目录中的ntp.conf文件,因此每次路由器重启后需要将/jffs/ntp/ntp.conf文件重新复制到/etc目录中。建立脚本的目的就是要自动完成这个步骤。
参考文档是利用post-mount来实现,但在380.70固件下,通过测试post-mount,service-start和wan-event三个脚本,发现只有service-start脚本在系统重启后能够正常调用,因此,最终使用services-start脚本。可参考或直接使用前面共享的文件。
注意:脚本执行前,需要执行以下命令:
chmod a+rx /jffs/scripts/*
以下为脚本内容:
#!/bin/sh
#脚本执行验证,用于判断系统重启后脚本是否执行,验证完成后屏蔽
#DATE=$(date +"%Y-%m-%d-%H%M%S")
#mkdir -p /tmp/logs
#touch /tmp/logs/$DATE-services-start
#开始检测ntp服务状态
retry=1
while [ "$(nvram get ntp_ready)" == "0" ] && [ "$retry" -lt "300" ]; do
retry=$((retry+1))
sleep 1
done
# Only start the NTP server if router has itself synchronised with Internet
cp /jffs/ntp/ntp.conf /etc/
logger -st "($(basename $0))" $$ "***SUCCESS Router copied ntp.conf-file to /etc!"
ntpd -l
logger -st "($(basename $0))" $$ "***SUCCESS Router initialized NTP Server!"
完成后的目录结构是:jffs/scripts/services-start
验证
重启路由器后,将局域网内的其他设备的ntp地址指向路由器地址,并手动执行时间同步操作,如提示同步失败,需进一步检查上述步骤和脚本是否正确操作和执行。
自此,华硕ASUS RT-AC66U无线路由器成为局域网内的NTP服务器,只需确保其同互联网的NTP服务时间同步,就能保证局域网内的所有设备的时间一致。