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

/ 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?

Так как 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`;
        }
    }
}