Я в процессе перевода некоторых серверов на 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`;
}
}
}