Linux 时间操作及其同步

本文将以 Arch Linux 为例,讨论 Linux 的时间操作和同步方法。

操作系统的时间 (clock) 由三或四部分决定:

  • 时间值;
  • 是否为 UTC 时间;
  • 时区;
  • (如果有)夏令时。

而操作系统的时间一般有两种:硬件时间和系统时间。

硬件时间 (也即真实时间 (Real Time Clock, RTC) 或 CMOS 时钟) 一般只存储时间值,直至 2016 年后 UEFI 硬件支持对时区和夏令时的存储。

系统时间 (也即软件时间) 可以追踪时间值、时区以及可能存在的夏令时。系统时间由 Linux 内核计算,时间值为 UTC+0 下自 1970 年 1 月 1 日午夜至今的秒数——可以在 time.is 网站查询得到。

尤其需要注意的是:操作系统完全启动后,系统时间与硬件时间是 独立的。

Linux 的时间状态可由 timedatectltimedatectl status 命令获取。输出类似于:

               Local time: Sun 2022-02-27 12:52:24 UTC
           Universal time: Sun 2022-02-27 12:52:24 UTC
                 RTC time: n/a
                Time zone: UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

我们可以得知:

上方的示例中硬件时间 (RTC time) 显示为”n/a”,也就是不存在。在一部存在硬件时间的 Linux 设备上,可以执行 hwclock --show 查看硬件时间:

$ hwclock --show
2022-02-27 21:14:16.129670+08:00

timedatectl 更进一步的是, hwclock 可以显示有关硬件时间的更详细信息:

$ hwclock --verbose
hwclock from util-linux 2.34
System Time: 1645967662.035542
Trying to open: /dev/rtc0
Using the rtc interface to the clock.

Assuming hardware clock is kept in UTC time.

Waiting for clock tick...

...got clock tick
Time read from Hardware Clock: 2022/02/27 13:14:24
Hw clock time : 2022/02/27 13:14:24 = 1645967664 seconds since 1969
Time since last adjustment is 1645967664 seconds
Calculated Hardware Clock drift is 0.000000 seconds
2022-02-27 21:14:23.020178+08:00

对此输出不再作进一步介绍。

我们一般很少手动设置硬件时间。若要设置,可以使其与系统时间保持一致:

[En]

We rarely set the hardware time manually. To set it, you can make it consistent with the system time:

sudo hwclock --systohc

这会新建或更新 /etc/adjtime 的内容,示例如下:

$ cat /etc/adjtime
0.000000 1645969156 0.000000
1645969156
LOCAL
sudo timedatectl set-time "yyyy-MM-dd hh:mm:ss"

例如:

sudo timedatectl set-time "2014-05-26 11:13:54"

设置时区前,先需要知道可用的时区:

timedatectl list-timezones

其中有”Asia/Shanghai”,可将时区设置为此:

sudo timedatectl set-timezone Asia/Shanghai

此处提到的同步指的是系统时间与其他服务器提供的时间同步。以下提供两种方式。

[En]

The synchronization mentioned here refers to the synchronization of system time with the time provided by other servers. There are two ways to do this.

首先启用该服务,执行 systemctl start systemd-timesyncd。可以选择加入自启动项。

打开 /etc/systemd/timesyncd.conf 文件,其中的内容可能如下:

[Time]
#NTP=
#FallbackNTP=0.arch.pool.ntp.org 1.arch.pool.ntp.org 2.arch.pool.ntp.org 3.arch.pool.ntp.org
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048
#SaveIntervalSec=60

删去前两行的注释记号,并作如下修改:

NTP=0.cn.pool.ntp.org 1.cn.pool.ntp.org 2.cn.pool.ntp.org 3.cn.pool.ntp.org
FallbackNTP=0.arch.pool.ntp.org 1.arch.pool.ntp.org 2.arch.pool.ntp.org 3.arch.pool.ntp.org

若要验证配置,执行 timedatectl show-timesync --all。一般输出类似于:

LinkNTPServers=
SystemNTPServers=
FallbackNTPServers=0.arch.pool.ntp.org 1.arch.pool.ntp.org 2.arch.pool.ntp.org 3.arch.pool.ntp.org
ServerName=0.arch.pool.ntp.org
ServerAddress=103.47.76.177
RootDistanceMaxUSec=5s
PollIntervalMinUSec=32s
PollIntervalMaxUSec=34min 8s
PollIntervalUSec=1min 4s
NTPMessage={ Leap=0, Version=4, Mode=4, Stratum=2, Precision=-21, RootDelay=177.398ms, RootDispersion=142.196ms, Reference=C342F10A, OriginateTimestamp=Mon 2018-07-16 13:53:43 +08, ReceiveTimestamp=Mon 2018-07-16 13:53:43 +08, TransmitTimestamp=Mon 2018-07-16 13:53:43 +08, DestinationTimestamp=Mon 2018-07-16 13:53:43 +08, Ignored=no PacketCount=1, Jitter=0 }
Frequency=22520548

但若出现类似如下的输出:

LinkNTPServers=
SystemNTPServers=0.cn.pool.ntp.org 1.cn.pool.ntp.org 2.cn.pool.ntp.org 3.cn.pool.ntp.org
FallbackNTPServers=0.pool.ntp.org 1.pool.ntp.org 2.arch.pool.ntp.org 3.arch.pool.ntp.org
ServerName=
ServerAddress=
RootDistanceMaxUSec=5s
PollIntervalMinUSec=32s
PollIntervalMaxUSec=34min 8s
PollIntervalUSec=0
Frequency=0

请跳过本小节,跳转至 chrony

若要使配置生效,执行 timedatectl set-ntp true

同步过程需要持续一段时间。若要检查同步状态,执行 timedatectl status。输出类似于:

               Local time: Thu 2015-07-09 18:21:33 CEST
           Universal time: Thu 2015-07-09 16:21:33 UTC
                 RTC time: Thu 2015-07-09 16:21:33
                Time zone: Europe/Amsterdam (CEST, +0200)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

若要查看详细信息,执行 timedatectl timesync-status。输出类似于:

       Server: 103.47.76.177 (0.arch.pool.ntp.org)
Poll interval: 2min 8s (min: 32s; max 34min 8s)
         Leap: normal
      Version: 4
      Stratum: 2
    Reference: C342F10A
    Precision: 1us (-21)
Root distance: 231.856ms (max: 5s)
       Offset: -19.428ms
        Delay: 36.717ms
       Jitter: 7.343ms
 Packet count: 2
    Frequency: +267.747ppm

大部分软件管理器中均有该软件包。执行:

sudo pacman -S chrony

这将在 /usr/bin 下放置 chrony 的两个可执行文件 chronycchronyd,分别作为客户端和服务端(保护进程)。

也可以在官网中查阅其他安装方式。

配置文件一般为 /etc/chrony.conf/etc/chrony/chrony.conf

打开配置文件,做如下更改:

  • 定位到 pool 配置项,修改其后的服务器地址为 0.cn.pool.ntp.org
  • 定位到 makestep 配置项,根据需求修改;
  • 第一个数字:进行”时间跳跃”的阈值——同步时若系统时间与服务器返回结果相差在阈值内,则程序会逐渐调整当前系统时间;反之则会直接将系统时间设为正确时间( 注意:“时间跳跃”可能会对其他程序造成负面影响,不宜将此值调至过小);
  • 第二个数字:可进行时间调整的范围——设置为 n 表示仅前 n 次时间更新过程可发生这种调整。
  • 定位到 logdir 配置项,删去配置记号;
  • 定位到 rtcsync 配置项,删去注释记号。

启用该服务,执行 systemctl start chronyd。可以选择加入自启动项。重启,读取系统时间检查:

               Local time: Sun 2022-02-27 23:16:28 CST
           Universal time: Sun 2022-02-27 15:16:28 UTC
                 RTC time: n/a
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

观察到”System clock synchronized”栏的输出是”yes”。

若要立刻更改系统时间,执行 chronyc makestep

Original: https://www.cnblogs.com/littleye233/p/15943989.html
Author: 小叶Little_Ye
Title: Linux 时间操作及其同步

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/72160/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • ubuntu 切换到 root 用户

    如果登录账户不是 root,则需要执行 sudo -H -s 切换为 root 账户 Original: https://www.cnblogs.com/qingsong/p/15…

    Linux 2022年8月26日
    0120
  • 【转】linux怎么修改文件权限

    在linux中,可以利用chmod命令来修改文件权限,它是控制用户对文件的权限的命令,可以使用绝对模式(八进制数字模式)或符号模式来指定文件的权限;语法”chmod […

    2022年8月11日
    0192
  • Linux配置和管理设备映射多路径multipath

    (一)多路径管理软件的由来在企业中,服务器和存储通常是分开放置的,服务器上的硬盘通常用于安装操作系统和应用软件,业务数据存储在单独的存储设备上,那么,服务器是如何连接到存储的呢?根…

    2022年8月13日
    0134
  • 使用 gitlint 让 commit message 服从 conventional 规范

    看了阮一峰的文章 Commit message 和 Change log 编写指南,认同 git commit message 应该规范化的观点;但用来检查是否符合规范的工具,阮提…

    Linux 2022年8月30日
    0127
  • git 分支批量操作命令

    来源: https://digitaldrummerj.me/git-remove-local-merged-branches/ After a while your list o…

    Linux 2022年8月30日
    0142
  • Docker基础用法

    Docker基础用法 1、Docker为什么会出现? 一款软件产品必须经过:开发 -> 上线 开发人员负责将应用程序开发制作出来。运维人员负责上线,配置应用程序。 这里有一个…

    Linux 2022年10月15日
    0104
  • 【Example】C++ 模板概念讲解及编译避坑

    C++ 不同于 Java,它没有标准的 Object 类型。也就意味着 C++ 并不存在完整的泛型编程概念。 为什么不存在完整的泛型编程概念,放到最后一个例子讲,先讲 &#8220…

    Linux 2022年11月5日
    0118
  • hexo部署码云后报错(ERROR Deployer not found: git)

    解决办法:npm install –save hexo-deployer-git 一个人必须能够忍受孤独,才能保持繁荣。生活中最痛苦的事是你舍不得放手,你不属于自己的幸福。及时放…

    Linux 2022年8月30日
    0165
  • 离线版centos8安装docker笔记

    嗨嗨哈哈,已经很久没有坐下来胡编乱造一点笔记了,平时云服务器搞惯了,一个命令就安装好了docker了的,但这次生不逢时的新机房就没那么幸运了,有多不逢时超乎想象,不仅仅服务器没有外…

    Linux 2022年11月8日
    091
  • Git解决中文乱码问题

    git status 乱码解决方法: git config –global core.quotepath false git commit 乱码解决方法: git config …

    Linux 2022年8月30日
    0157
  • SpringBoot-Redis

    SpringBoot 整合 Redis 15. SpringBoot-Redis 15.1 导入相关依赖 org.springframework.boot spring-boot-…

    Linux 2022年11月8日
    091
  • Windows下PowerShell监控Keepalived

    一、 背景 某数据库服务器为CentOS,想要监控Keepalived的VIP是否有问题,通过邮件进行报警,但这台机器不能上外网,现在只能在Windows下通过PowerShell…

    Linux 2022年9月14日
    088
  • CentOS——Redis远程连接可视化工具Rdis Desktop Manage

    前排提示 Centos没有安装Redis的可参考 https://www.cnblogs.com/tianhengblogs/p/15265028.html 一。 修改redis….

    Linux 2022年9月14日
    0139
  • Git 相关命令

    Git 版本控制系统是一个分布式的系统(与SVN不一样),可用于保存工程源代码及其历史状态的命令行工具。 Git下载地址:https://git-scm.com/downloads…

    Linux 2022年8月30日
    0188
  • Linux C++ Socket 高并发短连接 TIME_WAIT 挥之不去解决方法

    近期遇到一个项目 需要在Linux上建立一个Socket 进行 HTTP_GET , 需要线程高并发的 使用TCP Socket 进行Send 发送HTTP_GET请求到 指定网站…

    Linux 2022年8月26日
    0137
  • 教你搞懂Jenkins安装部署!

    前言:请各大网友尊重本人原创知识分享,谨记本人博客: 南国以南i Jenkins介绍 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作…

    Linux 2022年9月10日
    0107
最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总