# 2020-10-05 #「Linux」- 同步系统时间(基于 systemd 管理)

    科技2022-08-07  99

    在较新的 Linux 发行版中,通常使用 timedatectl 设置操作系统时间。

    查看当前时钟设置(查看)

    使用 timedatectl 查看时间同步状态:

    # timedatectl Local time: Mon 2020-05-25 10:58:29 EDT Universal time: Mon 2020-05-25 14:58:29 UTC RTC time: Mon 2020-05-25 14:58:28 Time zone: America/New_York (EDT, -0400) NTP enabled: yes NTP synchronized: yes RTC in local TZ: no DST active: yes Last DST change: DST began at Sun 2020-03-08 01:59:59 EST Sun 2020-03-08 03:00:00 EDT Next DST change: DST ends (the clock jumps one hour backwards) at Sun 2020-11-01 01:59:59 EDT Sun 2020-11-01 01:00:00 EST

    选择并设置时区(时区)

    时区信息由 NANA 维护,但是时区采用地区命名,即使用在时区中的某个地区代表这个时区。这带来的问题的就是我们不知道使用哪个地区名,比如到底是 Asia/Beijing 还是 Asia/Shanghai 代表我们的时区。使用 tzselect 命令,根据提示进行选择,最后可以确定要使用的时区。该命令用于确定时区,但是不会修改时区。

    使用 timedatectl set-timezone 设置:

    timedatectl set-timezone Asiz/Shanghai

    直接修改时间信息(时间)

    使用 timedatectl set-time 设置,时间使用 “YYYY-MM-DD hh:mm:ss” 格式,日期可以省略:

    timedatectl set-time "09:00:00"

    开启时间自动同步(自动同步)

    将 set-ntp 设置为 yes 即可开启时间自动同步:

    timedatectl set-ntp yes

    Failed to set ntp: NTP not supported.

    在执行 timedatectl set-ntp yes 命令时,产生 Failed to set ntp: NTP not supported. 错误。

    题外话:有些东西(UNIX System V),使用起来麻烦,但是排查问题简单。有些东西(systemd),使用起来简单,但是排查问题复杂。

    使用 timedatectl set-ntp 背后

    timedatectl => systemd-timedated => systemd-timesyncd => chronyd.service

    1)当使用 timedatectl set-ntp 命令时,命令 timedatectl 与 systemd-timedated 交互, 2)服务 systemd-timedated 到 ntp-units.d/ 查找用于时间同步的服务,可能是 chronyd 服务(或者其他服务) 3)如果是 chronyd 服务,则 systemd-timedated 将 start 并 enable chronyd 服务,时间将自动同步

    4)如果是 systemd-timesyncd 服务,还会检查 $SYSTEMD_TIMEDATED_NTP_SERVICES 环境变量列出的时间同步服务, 5)如果没有定义该环境变量,则直接使用 systemd-timesyncd 同步时间。

    然而实际情况永远不会这么简单…………

    在 Debian 10 中

    根据 Debian 10 手册,指令 set-ntp 控制网络时间同步服务是否激活并启用(如果可用),所以该指令的作用是启用某个时间同步服务。

    那么它会启用哪个时间同步服务呢? 1)在 systemd-timedated.service 中,环境变量 $SYSTEMD_TIMEDATED_NTP_SERVICES 列出可用的时间服务, 2)而 set-ntp yes 将 enable 并 start 列出的第一个可用的服务, 3)而 set-ntp no 将禁用所有的列出的时间服务。 4)如果没有设置 $SYSTEMD_TIMEDATED_NTP_SERVICES 环境变量,则使用 systemd-timesyncd.service(8) 服务

    => 解决方案:因此我们需要安装 chronyd 服务(或者 systemd-timesyncd 服务)来进行时间同步。

    在 CentOS 中

    根据 Systemd TimeSyncd 与 CentOS 7.2 Minimal Time synchronization timedated and/or ntpd/chrony 的描述,RedHat 在编译 systemd 时,移除 systemd-timesyncd 特征。因此对于 CentOS 7.x 系列,无法使用 systemd-timesyncd 服务。

    => 解决方案:因此我们需要安装 chronyd 服务来进行时间同步。

    参考文献

     

    K4NZ / 同步系统时间(基于 systemd 管理)CentOS / RHEL 7 : Configuring NTP using chronyChrony client do not change system and hardware datesystemd-timedated.servicesystemd-timesyncd.service

     

    Processed: 0.008, SQL: 8