/sbin/hwclock --utc --systohc не работает на AWS EC2 под Ubuntu

Я в процессе переноса некоторых серверов на AWS. Одна проблема, с которой я сталкиваюсь, заключается в том, что мой скрипт для синхронизации времени с использованием ntpdate и последующей записи этого времени в hwclock не работает. Когда сервер перезагрузится, я бы хотел, чтобы время было близко к точному. Тем не менее, я не могу настроить аппаратные часы.

Мой скрипт сообщает, что системное время и аппаратные часы отличаются примерно на полсекунды:

systime: 2018-01-03 05:51:58.529746-0500
hwtime: 2018-01-03 05:51:59.023462996-05:00
diff (sec): 0.493716955184937

Я ожидаю, что бег sudo /sbin/hwclock --utc --systohc бы исправить проблему. Это, безусловно, делает на моих традиционных не виртуализированных серверах. Однако когда я запускаю эту команду, я все еще вижу ту же разницу в полсекунды между системным временем и аппаратными часами.

Мой экземпляр был создан с использованием ubuntu/images/hvm-ssd/ubuntu-artful-17.10-amd64-server-20171208 (ami-d53b3eb5). Я получаю системное время, используя date --iso-8601=ns и аппаратное время, используя sudo /sbin/hwclock --show, Я сравниваю их после разбора с Perl Date::Parse.str2time,

Не поддерживается ли установка аппаратных часов в виртуализированных средах, таких как AWS? Если это так, есть ли обходной путь, обеспечивающий синхронизацию времени при перезагрузке серверов AWS?

1 ответ

Как сказано в комментариях Sum1sAdmin, виртуальные машины не имеют аппаратных часов. Вы можете узнать источник синхронизации, проверив /sys/devices/system/clocksource/clocksource0/current_clocksource,

Я изменил свой сценарий, чтобы проверить этот файл и синхронизировать аппаратные часы с системным временем только на машинах, которые не являются виртуальными машинами XEN.

my $clocksource=`cat /sys/devices/system/clocksource/clocksource0/current_clocksource`;
chomp $clocksource;
if ($clocksource !~ /^xen$/){  # Can't adjust hardware clock on virtual machines
    my $hwdate=`/sbin/hwclock --show`;
    chomp $hwdate;
    $hwdate=~s/T/ /g;
    $hwdate=~s/,/./g;
    my $hwtime=str2time($hwdate);

    my $diff=abs($systime-$hwtime);

    if ($diff > $report_change_threshold_seconds){
        print "diff (sec): $diff, hwtime: $sysdate, systime: $hwdate\n";
        my $msg="the hardware clock to the current system time";
        my $cmd="/sbin/hwclock --utc --systohc";
        if ($test){
            print "Set $msg using:\n";
            print "  sudo $cmd\n";
        } else {
            print "Setting $msg\n";
            print `$cmd`;
        }
    }
}
Другие вопросы по тегам