Назад | Перейти на главную страницу

CentOS 7 - как timedatectl синхронизирует время и дату без NTP?

Я создаю автоматические тесты для утилиты, похожей на 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;

}