在双引导系统中,我通常使用 FreeBSD 9,但是当我引导到 Windows 7 时,我的系统时间在两个操作系统中都会自动更改并显示不正确的时间。有什么问题,我该如何解决?
我知道我可以ntp
在来宾中安装,但是我对到目前为止我在 Google 上搜索过的内容的困惑理解表明这没有必要。
Host 是 CentOS 6.3,guest 是 Debian Wheezy,似乎是使用 kvm 时钟作为时间源:
# cat /sys/devices/system/clocksource/clocksource0/current_clocksource
kvm-clock
Run Code Online (Sandbox Code Playgroud)
我需要做什么特别的事情才能让客人使用主机时钟吗?
我正在使用该awful.widget.textclock
小部件在 Arch Linux 上的 Awesome WM 中显示时间,并且我正在使用一个称为tzupdate
定期根据地理位置自动更新我的系统时间的程序。
我经常出差,所以我认为自动化这个会很好。但是,除非我重新启动 Awesome(或重新登录/重新启动),否则 textclock 小部件不会更改时间。我可以在 lua 脚本中添加一些东西来让小部件刷新时区吗?
tzupdate
工作正常。我有一个systemd
计时器,每五分钟更新一次时区。系统的时区以这种方式成功更改。timedatectl
立即输出显示更新的时区,日期命令的输出正确显示正确的更新本地时间。
但是,如上所述,在我重新启动 ( CtrlModR) 或注销之前,Awesome 无法注意到此时区更改。
的输出 cat /sys/devices/system/clocksource/clocksource0/available_clocksource
列出了可用的硬件时钟。
我已经改变了时钟,没有任何明显的区别。
sudo /bin/sh -c 'echo acpi_pm > current_clocksource'
更改硬件时钟的实际含义是什么?有没有办法检查可用时钟的分辨率(或其他一些可见的变化)?
我有一个运行 Raspbian(Debian 衍生产品)的 Raspberry Pi,它可以记录实时温度。作为其中的一部分,我需要一个精确到几秒钟的时钟。在服务器启动时的正常操作中,我知道 Raspberry Pi 会定期通过网络连接到 NTP 服务器,以确保其本地时钟合理地接近正确的时间。这种精度水平适合我的应用程序。Raspberry Pi 没有电池供电的时钟来在服务器关闭或断电时保持时间,因此当它第一次启动时,系统时间不正确,直到它建立互联网连接并通过 NTP 获取正确时间。
我发现一个问题是当停电并且 Raspberry Pi 在没有电源的情况下关闭一段时间,然后在某个时间后(比如 30 分钟)恢复供电。Pi 启动,我的应用程序启动并再次开始记录温度,但 Pi 上的时钟不正确,因此它以错误的时间戳记录温度。它似乎以某种方式保存了最后一个已知时间并从那里恢复(重新启动时它不会重置为纪元时间)。最终,当 Pi 所在的 LAN 恢复并重新获得互联网连接时,Pi 将更正其时间(通过 NTP),但在此之前,我记录了不准确的时间戳。
我想弄清楚解决这个问题的最佳行动方案是什么?
出于维护原因,我宁愿不添加电池支持的附加时钟(不希望任何人必须更换电池,因为这本质上是嵌入式设备,用户不易访问)。
我愿意让我的应用程序推迟记录温度,直到我知道从网络中准确检索了时间,但我什至不知道如何检测该状态。任何人都知道如何知道现在何时从 NTP 服务器更新时间并且现在是正确的?
我的应用程序是通过在启动时运行脚本来启动的。
关于如何解决这个问题的任何其他想法?
Arch wiki建议
时间标准
推荐:将 Arch Linux 和 Windows 都设置为使用 UTC,遵循Windows 中的 Time#UTC。另外,一定要防止 Windows 同步在线时间,因为硬件时钟将默认回本地时间。
不推荐:将 Arch Linux 设置为 localtime 并禁用任何与时间相关的服务,例如NTPd。这将使 Windows 负责硬件时钟校正,您需要记住在DST 开始时每年至少启动两次(春季和秋季)进入 Windows 。所以请不要在论坛上问为什么时钟是一个如果您通常数天或数周没有启动到 Windows,则延迟或提前一小时。
Ubuntu 中的 UTC
如果在 Ubuntu 安装期间在任何磁盘上检测到 Windows,Ubuntu 及其衍生产品将硬件时钟设置为“本地时间”。这样做显然是为了允许新的 Linux 用户在他们的 Windows 计算机上试用 Ubuntu,而无需编辑注册表。
要在 Ubuntu 中更改此行为,您需要执行以下操作。打开文件:
Run Code Online (Sandbox Code Playgroud)/etc/default/rcS
并将 UTC 标志更改为UTC=yes。
那么,有没有什么方法可以让 Arch Linux 像 Ubuntu 一样运行UTC=no
,即不需要修改 Windows 时钟(即硬件时钟使用本地时间)并且仍然可以让 Arch Linux 同步时间(因为我几乎不使用Windows 了,但不幸的是不能放弃它,也不想记住我是如何解决时间问题的,如果我必须重新安装 Windows)?
我想在过去设置 GPG 子密钥的到期日期,但gpg --edit-key
不允许我这样做。有什么解决方法吗?
基本原理:将子项的过期日期设置为过去以便暂时禁用它是很有用的。如果您只是撤销它,您将无法在以后再次启用它。
我真的很想理解为什么我们的来宾 VM 没有“像他们应该那样”使用 kvm-clock 驱动程序。他们正在运行 RHEL 7.2、glibc-2.17、kern 3.10.0。诸如date
和 之类的程序perl -e 'print time'
获取当前时间,但无需进行系统调用即可。这证实使用Strace和ltrace和通过用gdb和组件跟踪通过该旁路进一步证实syscall
和转而执行一些指令来调用rtdscp
。
这是 glibc 作者的优化尝试吗?有什么方法可以禁用它并强制 glibc 调用进行系统调用(缺少 LD_PRELOAD hacks)?
更新2016-10-14:
在查看了最新的POSIX 草案后,部分答案很清楚:有一种方法可以从 CPU 请求时钟,但是 GNU glibc 错误地将这种实现强加给了它的用户。解决方法是直接调用系统调用。(嘘)
如果定义了 _POSIX_CPUTIME,则实现应支持通过调用 clock_getcpuclockid() 获得的时钟 ID 值,它表示给定进程的 CPU 时间时钟。实现还应支持特殊的clockid_t 值CLOCK_PROCESS_CPUTIME_ID,它表示调用clock_ () 或timer_ () 函数之一时调用进程的CPU 时间时钟。
鉴于用户可以 是否有任何真正的论据反对将 ifclock_id
设置为CLOCK_REALTIME
,则应该使用系统调用?
根据大量消息来源,KVM 时钟驱动程序加载如下所示:
cat /sys/devices/system/clocksource/clocksource0/current_clocksource
Run Code Online (Sandbox Code Playgroud)
这些消息来源似乎都认为这必然意味着运行 Linux 的来宾 VM 正在从该时钟驱动程序中获取其时钟值。我的经验是事实并非如此。几个独立的测试表明,与主机时钟和网络时间源相比,来宾操作系统时钟每天关闭多达 3 秒。该hwclock
程序也用于确认这一点。是否需要一些额外的步骤来获取 current_clocksource?还是其他地方的问题?还是应该使用tsc
驱动程序?
我使用gnome-clocks作为它的计时器选项。这个应用程序非常简单有效。但是我无法更改闹钟和计时器的默认声音。我尝试在dconf 中设置配置,Settings > Sound > Sound Effects
但无法更改。
这个应用程序的配置文件在哪里?如何更改默认声音?