我正在将一些服务器迁移到 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`;
}
}
}