我试图在 Ubuntu 18.04 (systemd 237) 上设置一个假时间,以测试每月定期任务的执行。
这是在虚拟机(带有来宾添加的虚拟机)上运行的。
即使 ntp 同步已禁用,时间也会在几秒钟后自行重置为正确时间。
例子。
# Disable the sync
timedatectl set-ntp 0
# There aren't any ntp daemons running
systemctl -a | grep ntp # Returns nothing
# This confirms there is no sync active
timedatectl status
# Local time: Mo 2019-03-11 15:22:13 CET
# Universal time: Mo 2019-03-11 14:22:13 UTC
# RTC time: Mo 2019-03-11 14:22:13
# Time zone: Europe/Berlin (CET, +0100)
# System clock synchronized: no
# systemd-timesyncd.service active: no
# RTC in local TZ: no
# Setting up the fake time
timedatectl set-time '2015-11-20 16:14:50'
# It worked! Wuhuu!
timedatectl status
# Local time: Fr 2015-11-20 16:14:51 CET
# Universal time: Fr 2015-11-20 15:14:51 UTC
# RTC time: Fr 2015-11-20 15:14:51
# Time zone: Europe/Berlin (CET, +0100)
# System clock synchronized: no
# systemd-timesyncd.service active: no
# RTC in local TZ: no
# 5 sec later
timedatectl status
# Local time: Mo 2019-03-11 15:25:35 CET
# Universal time: Mo 2019-03-11 14:25:35 UTC
# RTC time: Fr 2015-11-20 15:14:51
# Time zone: Europe/Berlin (CET, +0100)
# System clock synchronized: no
# systemd-timesyncd.service active: no
# RTC in local TZ: no
如果没有同步服务,是什么让它保持同步?
但是还有。它内置在来宾操作系统中运行的 VirtualBox 服务中。
VBoxService
不幸的是,来宾操作系统中的服务可以同时完成很多事情,而停止它会完全消除它所做的一切。由于无法通过本机服务管理工具进行控制,因此唯一可用的细粒度控制是 Oracle 的工具:这不会禁用同步服务线程本身。它使线程调用的管理程序调用返回失败。同步服务线程继续运行。它只是反复无法获得主机时间。
进一步阅读
systemd-timesyncd
。Debian 错误 #812522。这似乎是由来自 VM 的服务与主机系统同步引起的。在我的情况下(Virtualbox)禁用该服务解决了这个问题。
其他答案/评论中指定了更复杂的解决方案,但它们需要在主机端执行一个步骤。就我而言,鉴于与此模拟相关的所有测试都需要在来宾上执行,因此记录起来更简单。