/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`;
}
}
}