systemd 开机时间
大多数人都在关注时间。 我们及时起床执行早晨的礼节并上下班(如今,对于我们中的许多人来说这是短途旅行),休息一下午餐,在项目截止日期之前,庆祝生日和假期,乘飞机等等等等。 。
我们中有些人甚至痴迷于时间。 我的手表是太阳能供电的,并通过位于科罗拉多州柯林斯堡的美国国家标准技术研究院 (NIST)的WWVB时间信号广播电台获取确切的时间。 时间信号同步到同样位于柯林斯堡的原子钟。 我的Fitbit同步到我的手机,该手机同步到网络时间协议 (NTP)服务器,该服务器最终同步到原子钟。
我们的设备和计算机需要准确的时间有很多原因。 例如,在银行,股票市场和其他金融业务中,必须以正确的顺序维护交易,并且准确的时间顺序对此至关重要。
我们的手机,平板电脑,汽车,GPS系统和计算机都需要精确的时间和日期设置。 我希望计算机桌面上的时钟正确,因此我可以依靠本地日历应用程序在正确的时间弹出提醒。 正确的时间还可以确保SystemV cron作业和systemd计时器在正确的时间触发。
正确的时间对于日志记录也很重要,因此根据时间来定位特定的日志条目要容易一些。 例如,我曾经在北卡罗来纳州电子邮件系统的DevOps中工作(当时还没有被称为该工作)。 我们过去每天处理超过2000万封电子邮件。 当相关计算机保持准确时间时,通过电子邮件跟踪一系列服务器,或通过使用地理位置分散的主机上的日志文件来确定事件的确切顺序会容易得多。
Linux主机需要考虑两次:系统时间和RTC时间。 RTC代表实时时钟,它是系统硬件时钟的一个奇特的名称,并非特别准确。
通过使用系统主板上的电池,即使关闭计算机,硬件时钟也可以连续运行。 RTC的主要功能是保留与时间服务器的连接不可用时的时间。 在个人计算机的黑暗时代,没有互联网可以连接到时间服务器,因此计算机唯一可用的时间是内部时钟。 操作系统必须在启动时依赖RTC,并且用户必须使用硬件BIOS配置界面手动设置系统时间以确保正确。
硬件时钟不了解时区的概念; 只有时间存储在RTC中,而不是时区或与UTC(通用协调时间,也称为GMT或格林威治标准时间)的偏差。 您可以使用本文稍后将探讨的工具设置RTC。
系统时间是操作系统已知的时间。 它是您在桌面上的GUI时钟上,在date
命令的输出中,在日志的时间戳中以及在文件访问,修改和更改时间中看到的时间。
rtc
手册页包含有关RTC和系统时钟以及RTC功能的更完整讨论。
全球各地的计算机都使用NTP(网络时间协议)通过NTP服务器层次结构将其时间与Internet标准参考时钟同步。 主要时间服务器位于第1层,它们通过卫星,无线电甚至调制解调器通过电话线直接连接到第0层的各种国家时间服务。 在第0层的时间服务可以是原子钟,调谐到原子钟广播的信号的无线电接收机,或者是使用GPS卫星广播的高精度时钟信号的GPS接收机。
最初的NTP实现是ntpd ,并且它又加入了两个新的chronyd和systemd-timesyncd 。 这三者均使本地主机的时间与NTP时间服务器保持同步。 systemd-timesyncd服务不如chronyd健壮,但对于大多数目的而言已足够。 如果RTC不同步,它可以执行较大的时间跳动;如果本地系统时间稍有偏移,它可以逐渐调整系统时间以与NTP服务器保持同步。 systemd-timesync服务不能用作时间服务器。
Chrony是一个NTP实现,包含两个程序:chronyd守护程序和一个名为chronyc的命令行界面。 正如我在上一篇文章中所解释的,Chrony具有一些使其成为许多环境的最佳选择的功能,主要是:
需要明确的是,NTP是在Linux主机上使用Chrony或systemd-timesyncd.service实现的协议。
NTP,Chrony和systemd-timesyncd RPM软件包可在标准Fedora存储库中获得。 systemd-udev RPM是基于规则的设备节点和内核事件管理器,默认情况下已与Fedora一起安装但未启用。
您可以安装所有三个组件并在它们之间切换,但这很痛苦,也不值得为此烦恼。 Fedora,CentOS和RHEL的现代版本已从NTP迁移到Chrony,作为它们的默认计时实现,并且它们还安装了systemd-timesyncd。 我发现Chrony运作良好,提供了比NTP服务更好的界面,提供了更多信息,并增强了控制能力,这些都是sysadmin的优势。
NTP服务可能已在您的主机上运行。 如果是这样,则需要在切换到其他选项之前将其禁用。 我一直在使用chronyd,因此我使用了以下命令来停止和禁用它。 对主机上使用的任何NTP守护程序运行适当的命令:
[ root
@ testvm1 ~
]
# systemctl disable chronyd ; systemctl stop chronyd
Removed
/ etc
/ systemd
/ system
/ multi-user.target.wants
/ chronyd.service.
[ root
@ testvm1 ~
]
#
验证它是否已停止和禁用:
[ root
@ testvm1 ~
]
# systemctl status chronyd
● chronyd.service - NTP client
/ server
Loaded: loaded
(
/ usr
/ lib
/ systemd
/ system
/ chronyd.service; disabled; vendor preset: enabled
)
Active: inactive
( dead
)
Docs: man:chronyd
(
8
)
man:chrony.conf
(
5
)
[ root
@ testvm1 ~
]
#
systemd timesync的状态指示systemd是否已启动NTP服务。 由于尚未启动systemd NTP,因此timesync-status
命令不返回任何数据:
[ root
@ testvm1 ~
]
# timedatectl timesync-status
Failed to query server: Could not activate remote peer.
但是直接的status
请求提供了一些重要信息。 例如,不带参数或选项的timedatectl
命令将status
子命令默认为:
[ root
@ testvm1 ~
]
# timedatectl status
Local time: Fri
2020 -05-
15 08:
43 :
10 EDT
Universal time: Fri
2020 -05-
15
12 :
43 :
10 UTC
RTC time: Fri
2020 -05-
15 08:
43 :08
Time zone: America
/ New_York
( EDT, -0400
)
System clock synchronized: no
NTP service: inactive
RTC
in
local TZ:
yes
Warning: The system is configured to
read the RTC
time
in the
local
time zone.
This mode cannot be fully supported. It will create various problems
with
time zone changes and daylight saving
time adjustments. The RTC
time is never updated, it relies on external facilities to maintain it.
If at all possible, use RTC
in UTC by calling
'timedatectl set-local-rtc 0' .
[ root
@ testvm1 ~
]
#
这将返回主机的本地时间,UTC时间和RTC时间。 它显示系统时间设置为America/New_York
时区( TZ
),RTC设置为本地时区的时间,并且NTP服务未激活。 RTC时间已经开始偏离系统时间。 对于时钟未同步的系统,这是正常现象。 主机上的漂移量取决于自上次同步系统以来的时间量以及每单位时间的漂移速度。
还有一条关于将本地时间用于RTC的警告消息-这与时区更改和夏令时调整有关。 如果需要进行更改时计算机处于关闭状态,则RTC时间不会更改。 在24/7开机的服务器或其他主机中这不是问题。 此外,任何提供NTP时间同步的服务都将确保在启动过程中尽早将主机设置为正确的时间,因此在主机完全启动并运行之前它将是正确的。
通常,您可以在安装过程中设置计算机的时区,而无需更改它。 但是,有时需要更改时区,并且有一些工具可以提供帮助。 Linux使用时区文件来定义主机使用的本地时区。 这些二进制文件位于/usr/share/zoneinfo
目录中。 我的时区的默认设置是通过链接/etc/localtime -> ../usr/share/zoneinfo/America/New_York
。 但是您不必知道更改时区。
但是您确实需要知道您所在位置的官方时区名称。 假设您要将时区更改为洛杉矶:
[ root
@ testvm2 ~
]
# timedatectl list-timezones | column
< SNIP
>
America
/ La_Paz Europe
/ Budapest
America
/ Lima Europe
/ Chisinau
America
/ Los_Angeles Europe
/ Copenhagen
America
/ Maceio Europe
/ Dublin
America
/ Managua Europe
/ Gibraltar
America
/ Manaus Europe
/ Helsinki
< SNIP
>
现在您可以设置时区。 我使用date
命令来验证更改,但是您也可以使用timedatectl
:
[ root
@ testvm2 ~
]
# date
Tue
19 May
2020 04:
47 :
49 PM EDT
[ root
@ testvm2 ~
]
# timedatectl set-timezone America/Los_Angeles
[ root
@ testvm2 ~
]
# date
Tue
19 May
2020 01:
48 :
23 PM PDT
[ root
@ testvm2 ~
]
#
现在,您可以将主机的时区更改回本地时区。
systemd timesync守护程序提供了一个NTP实现,该实现易于在systemd上下文中进行管理。 默认情况下,它已安装在Fedora和Ubuntu中,默认情况下已在Ubuntu中启动,但未在Fedora中启动。 我不确定其他发行版; 您可以使用以下方法检查您的:
[ root @ testvm1 ~ ] # systemctl status systemd-timesyncd
systemd-timesyncd的配置文件是/etc/systemd/timesyncd.conf
。 这是一个简单的文件,包含的选项少于旧的NTP服务和chronyd。 以下是我的Fedora VM上此文件默认版本的完整内容:
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See timesyncd.conf(5) for details.
[ Time
]
#NTP=
#FallbackNTP=0.fedora.pool.ntp.org 1.fedora.pool.ntp.org 2.fedora.pool.ntp.org 3.fedora.pool.ntp.org
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048
除注释外,它包含的唯一部分是[Time]
,所有行都被注释掉了。 这些是默认值,不需要更改或取消注释(除非您有某些理由要这样做)。 如果您在NTP=
行中没有定义特定的NTP时间服务器,则Fedora的默认设置是回退到Fedora时间服务器池中。 我想将网络上的时间服务器添加到此行:
NTP =myntpserver
启动和启用systemd-timesyncd就像其他任何服务一样:
[ root
@ testvm2 ~
]
# systemctl enable systemd-timesyncd.service
Created symlink
/ etc
/ systemd
/ system
/ dbus-org.freedesktop.timesync1.service →
/ usr
/ lib
/ systemd
/ system
/ systemd-timesyncd.service.
Created symlink
/ etc
/ systemd
/ system
/ sysinit.target.wants
/ systemd-timesyncd.service →
/ usr
/ lib
/ systemd
/ system
/ systemd-timesyncd.service.
[ root
@ testvm2 ~
]
# systemctl start systemd-timesyncd.service
[ root
@ testvm2 ~
]
#
这是启动timesyncd后我的系统之一:
[ root
@ testvm2 systemd
]
# timedatectl
Local time: Sat
2020 -05-
16
14 :
34 :
54 EDT
Universal time: Sat
2020 -05-
16
18 :
34 :
54 UTC
RTC time: Sat
2020 -05-
16
14 :
34 :
53
Time zone: America
/ New_York
( EDT, -0400
)
System clock synchronized:
yes
NTP service: active
RTC
in
local TZ: no
RTC时间与本地时间(EDT)大约相差一秒钟,并且在接下来的几天中,差异还会增加几秒钟。 因为RTC没有时区的概念,所以timedatectl
命令必须进行比较以确定哪个时区是匹配的。 如果RTC时间与本地时间不完全匹配,则认为该时间不在本地时区。
为了寻找更多信息,我检查了systemd-timesync.service的状态并发现:
[ root
@ testvm2 systemd
]
# systemctl status systemd-timesyncd.service
● systemd-timesyncd.service - Network Time Synchronization
Loaded: loaded
(
/ usr
/ lib
/ systemd
/ system
/ systemd-timesyncd.service; enabled; vendor preset: disabled
)
Active: active
( running
) since Sat
2020 -05-
16
13 :
56 :
53 EDT; 18h ago
Docs: man:systemd-timesyncd.service
(
8
)
Main PID:
822
( systemd-timesyn
)
Status:
"Initial synchronization to time server 163.237.218.19:123 (2.fedora.pool.ntp.org)."
Tasks:
2
( limit:
10365
)
Memory: 2.8M
CPU: 476ms
CGroup:
/ system.slice
/ systemd-timesyncd.service
└─
822
/ usr
/ lib
/ systemd
/ systemd-timesyncd
May
16 09:
57 :
24 testvm2.both.org systemd
[
1
] : Starting Network Time Synchronization...
May
16 09:
57 :
24 testvm2.both.org systemd-timesyncd
[
822
] : System clock
time
unset or jumped backwards, restoring from recorded timestamp: Sat
2020 -05-
16
13 :
56 :
53 EDT
May
16
13 :
56 :
53 testvm2.both.org systemd
[
1
] : Started Network Time Synchronization.
May
16
13 :
57 :
56 testvm2.both.org systemd-timesyncd
[
822
] : Initial synchronization to
time server 163.237.218.19:
123
(
2 .fedora.pool.ntp.org
) .
[ root
@ testvm2 systemd
]
#
注意日志消息,指出系统时钟时间未设置或向后跳转。 时间同步服务从时间戳设置系统时间。 时间戳记由timesync守护程序维护,并在每次成功的时间同步时创建。
timedatectl
命令无法根据系统时钟设置硬件时钟的值; 它只能根据在命令行上输入的值来设置时间和日期。 但是,可以使用hwclock
命令将RTC设置为与系统时间相同的值:
[ root
@ testvm2 ~
]
# /sbin/hwclock --systohc --localtime
[ root
@ testvm2 ~
]
# timedatectl
Local time: Mon
2020 -05-
18
13 :
56 :
46 EDT
Universal time: Mon
2020 -05-
18
17 :
56 :
46 UTC
RTC time: Mon
2020 -05-
18
13 :
56 :
46
Time zone: America
/ New_York
( EDT, -0400
)
System clock synchronized:
yes
NTP service: active
RTC
in
local TZ:
yes
--localtime
选项可确保将硬件时钟设置为本地时间,而不是UTC。
任何NTP实施都将在启动过程中设置系统时钟,那么RTC是否必要? 并非如此,只要您与时间服务器建立网络连接即可。 但是,许多系统无法全时访问网络连接,因此硬件时钟非常有用,因此Linux可以读取它并设置系统时间。 与必须手动设置时间相比,这是一个更好的解决方案,即使它可能会偏离实际时间。
本文探讨了使用一些系统工具来管理日期,时间和时区。 systemd-timesyncd工具提供了一个不错的NTP客户端,可以将本地主机上的时间与NTP服务器同步。 但是,systemd-timesyncd不提供服务器服务,因此,如果您的网络上需要NTP服务器,则必须使用其他工具(例如Chrony)作为服务器。
我更喜欢对网络中的任何服务使用单一实现,因此我使用Chrony。 如果您不需要本地NTP服务器,或者您不介意与服务器处理Chrony事务,不与客户端进行systemd-timesyncd事务,并且不需要Chrony的其他功能,那么对于NTP客户端,systemd-timesyncd是一个有用的选择。
我还要提出另一点:您不必使用systemd工具来实现NTP。 您可以使用旧的ntpd或Chrony或其他一些NTP实现。 systemd由大量服务组成; 其中许多是可选的,因此可以将其禁用,并在其位置使用其他功能。 并非有人发现它是巨大的,整体的怪物。 可以不喜欢systemd或其中的一部分,这是可以的,但是您应该做出明智的决定。
我不喜欢systemd的NTP实现,但我更喜欢Chrony,因为它可以更好地满足我的需求。 这就是Linux的全部意义所在。
互联网上有大量有关systemd的信息,但是很多信息简洁,晦涩甚至是误导。 除了本文提到的资源之外,以下网页还提供了有关systemd启动的更详细和可靠的信息。
还有systemd的设计师和主要开发者Lennart Poettering撰写的一系列针对Linux sysadmin的技术性文章。 这些文章是在2010年4月至2011年9月之间撰写的,但它们现在和那时一样具有相关性。 关于systemd及其生态系统的许多其他优点都基于这些论文。
翻译自: https://opensource.com/article/20/6/time-date-systemd
systemd 开机时间