Я создаю автоматические тесты для утилиты, похожей на rsync, и мне нужно иметь возможность перевести часы на 24 часа назад для одного из тестов. Однако, когда я использую timedatectl для установки времени и даты, они возвращаются к текущему времени через 15 секунд.
Проверяя статус timedatectl, я вижу, что NTP не работает:
# timedatectl status
Local time: Wed 2019-05-15 23:24:17 EDT
Universal time: Thu 2019-05-16 03:24:17 UTC
RTC time: Wed 2019-01-16 02:13:40
Time zone: America/New_York (EDT, -0400)
NTP enabled: no
NTP synchronized: no
RTC in local TZ: no
DST active: yes
Last DST change: DST began at
Sun 2019-03-10 01:59:59 EST
Sun 2019-03-10 03:00:00 EDT
Next DST change: DST ends (the clock jumps one hour backwards) at
Sun 2019-11-03 01:59:59 EDT
Sun 2019-11-03 01:00:00 EST
Я также проверил, что NTPD не работает и ничего не привязано к порту 123.
Есть ли у timedatectl другой метод синхронизации времени? Тестовая машина CentOS 7 работает в контейнере Docker под образом VirtualBox, поэтому подключение к Интернету несколько ограничено. Я также тестирую CentOS непосредственно на VirtualBox, поэтому мне нужно будет решить и случай, не связанный с Docker.
Гостевые дополнения VBox по умолчанию включают синхронизацию времени с хостом.
Вы можете отключить это с помощью следующей команды:
vboxmanage setextradata <vmname> "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled" "1"
Или добавьте следующую строку в свой файл VM.vbox
<ExtraDataItem name="VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled" value="1"/>
timedatectl вызывается systemd после определенной частоты, которую он проверяет / etc / adjtime, / usr / share / zoneinfo /, / etc / localtime и многие другие файлы, чтобы проверить, доступна ли какая-либо информация, у него есть собственная логика для настройки часов без использования ntp.
static int context_write_data_timezone(Context *c) {
_cleanup_free_ char *p = NULL;
int r = 0;
assert(c);
if (isempty(c->zone)) {
if (unlink("/etc/localtime") < 0 && errno != ENOENT)
r = -errno;
return r;
}
p = strappend("../usr/share/zoneinfo/", c->zone);
if (!p)
return log_oom();
r = symlink_atomic(p, "/etc/localtime");
if (r < 0)
return r;
return 0;
}