Ubuntu无法连接NTP时如何强制设置时间且保留NTP同步
无RTC设备Ubuntu 20.04手动设时间+保留NTP自动同步方案
Ubuntu 20.04默认使用systemd-timesyncd作为轻量NTP客户端,碰到的NTP开启状态下设时间报错、关NTP设时间再重启服务时间回退问题,均来自该组件的默认运行逻辑。
问题根因
- 开启自动时间同步时
timedatectl set-time返回Failed to set time: Automatic time synchronization is enabled:是组件的默认保护机制,只要NTP同步处于激活状态,就直接拦截手动时间修改操作,避免非预期时间跳变影响运行中服务。 - 关闭NTP设完时间再重启服务立刻回退:
systemd-timesyncd会把最后一次拿到的可信时间(之前成功NTP同步的时间)存在/var/lib/systemd/timesync/clock文件中,服务启动时会先比对当前系统时间和该文件记录的时间戳,如果认为当前系统时间可信度低于该文件记录值,就会直接把系统时间跳回该文件记录的旧时间。
标准操作步骤
你摸索到的更新clock文件时间戳的方法是完全符合组件设计逻辑的正规解法,不是hack操作,完整严谨的操作流程如下,全程不需要关闭NTP服务的开机自启:
- 临时停止运行中的timesyncd服务
sudo systemctl stop systemd-timesyncd
- 手动设置需要的准确系统时间,替换为你需要的实际日期时间即可
sudo timedatectl set-time "YYYY-MM-DD HH:MM:SS"
- 更新可信时间戳记录文件,把你刚设置的系统时间写入记录,替换旧的NTP同步时间
sudo touch /var/lib/systemd/timesync/clock
注意:如果之前手动修改过
/var/lib/systemd/timesync/clock的文件权限,直接执行touch可能导致服务无法读取该文件,需要先执行以下命令恢复默认权限再更新时间戳:sudo chown systemd-timesync:systemd-timesync /var/lib/systemd/timesync/clock sudo chmod 0644 /var/lib/systemd/timesync/clock
- 重新启动timesyncd服务,保持NTP自动同步功能开启
sudo systemctl start systemd-timesyncd
操作后效果
- 手动设置的时间立刻生效,不会出现回退
- NTP服务保持正常运行状态,后续只要网络连通、可访问NTP服务器,会自动完成时间校准,不需要人工干预
- 设备下次重启时,即使处于断网、无NTP服务的内网环境,服务也会读取更新后的
clock文件初始化系统时间,不会跳回1970纪元时间或旧的错误时间
方案优劣势说明
该方法是当前场景下的最优方案:
- 完全依托systemd-timesyncd原生逻辑实现,不需要修改服务默认配置、不需要关闭时间跳变保护机制,不会引入NTP同步异常的风险
- 不需要额外安装chrony、ntpd等第三方时间同步组件,资源占用极低,适配树莓派这类低性能嵌入式设备
- 完全匹配需求:既支持无NTP环境下手动校准时间,又保留了联网自动同步的能力,没有功能损失
内容的提问来源于stack exchange,提问作者GafferMan2112
相关产品推荐
相关产品推荐

