/sbin/hwclock --utc --systohc 在 Ubuntu 下的 AWS EC2 上不起作用

/sbin/hwclock --utc --systohc 在 Ubuntu 下的 AWS EC2 上不起作用

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

相关内容