linux 时间同步
- 在windows中,系统时间设定后,机器关机、重启时系统时间会自动保存在Bios的时钟里面。启动计算机的时候会自动在bios里面读取硬件时间,以保证时间的不间断。
- 在linux下,默认情况,系统时间和硬件时间不会自动同步。在linux运行过程中,系统时间和硬件时间互不干扰。硬件时间是靠bios电池来维持,系统时间是靠cpu tick来维持。
linux时间与时区
概念:
系统时间 system time
- linux操作系统运行时的时间,存储在内存中,内核会持续更新这个时间。在系统重启后,系统时间从硬件时钟中读取并加载到内存中,操作系统使用系统时间作为主要的时间源。
硬件时间hardware time, RTC(Real-Time Clock)
- 硬件时间是主板上的实时时钟RTC提供的时间信息,它在系统关闭时仍然保持运行,确保时间不会丢失。硬件时钟是杜立德,不以来操作系统的运行,系统关机后依然记录时间。
- 系统启动时,内核会读取硬件时间,并设置系统时间。
- 系统关机或重启时,通常会将系统时间写回到硬件时间,以确保下一次启动时硬件时间是最新的。
- 系统运行期间,系统时间会定期同步或手动同步,不会直接影响硬件时间。
时区 Timezone
时区是定义时间相对于标准时间UTC的偏移量。时区定义了一个地理区域的标准时间,linux系统允许用户设置本地失去,以便显示本地时间。
UTC vs 本地时间
在linux系统中默认使用UTC(universal Time Coordinated),来存储和计算时间。如果设置了本地时区,系统会在显示时将UTC时间转换为指定时区的本地时间。
时区文件: 时区信息保存在 /etc/localtime文件中, 这个文件是一个指向具体时区信息的符号链接,时区数据存储在 /usr/share/zoneinfo/目录中。可以通过链接到指定区域的时区文件来临更改系统的时区。
1
sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
timedatectl命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# 查看当前时区
timedatectl
Local time: Mon 2024-10-18 12:34:56 CST
Universal time: Mon 2024-10-18 04:34:56 UTC
RIC time: Mon 2024-10-18 04:34:56
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
NTP serveice: active
TRC in local TZ: no ## RTC是否以本地时区存储
# 设置时区
sudo timedatectl set-timezone Asia/Shanghai
# 将硬件硬件时钟设置为UTC:
sudo timedatectl set-local-rtc 0
# 将硬件时钟设置为本地时区:
sudo timedatectl set-local-rtc 1
windows的做法,如果同一台机器装了linux和windows需要这样做
linux 系统时间的设定
date命令
1
2
3
4
5
6
7
8
9
10
11# 查看命令
date
2024年10月19日星期五 18:00:32 CST
# 设置命令
date -set="2024-10-19 00:01"
2024年10月19日星期五00:00:01 CST
# 设置命令
date 101900012004.35
2004年10月19日00:01:35 CST
linux 硬件时间的设定
hwclock命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14# 查看命令
hwclock --show
2024-10-18 18:11:13.147770+08:0
# 查看命令
hwclock
2024-10-18 18:11:13.147770+08:0
# 设置命令
hwclock --set --date="10/19/23 00:00:01"
2023年10月19日 00:00:01 cst
# 根据系统时间设置硬件时间
hwclock -w
linux系统时间和硬件时间的同步
hwclock命令
1
2
3
4
5
6
7
8
9
10
11# 根据系统时间设置硬件时间
hwclock --systohc # sys time to hadr clock
# 根据系统时间设置硬件时间
hwclock -w
# 根据硬件时间设置系统时间
hwclock -hctosys # hadr clock to sys time
# 根据硬件时间设置系统时间
hwclcok -s
linux 不同机器间的时间同步
为了避免主机因长时间运转下所导致的时间偏差,进行时间同步synchronize的工作是非常必要的。linux系统下,一般使用ntp服务器来同步不同机器的时间,一台机器可以同时是ntp客户端和ntp服务器。
ntpdate命令 强制将系统时间设置为ntp服务器时间
1
2
3ntpdate [-nv] [NTP IP/hostname]
ntpdate time.ntp.org
ntpdate 192.168.0.2这样的同步只是强制性的将系统时间设置为ntp服务器时间,如果cpu tick有问题,只是指标不治本。所以一般配合cron命令,来进行定期同步设置。在crontab中添加0 12 * * * * /usr/sbin/ntpdate 192.168.0.1,这样会在每天12点同步一次时间。 ntp服务器ip为192.168.0.1
ntpd有一个自我保护设置:如果本机与ntp服务器时间差距太大,ntpd将不会运行。新设置的时间服务器一定要先ntpdate从上源取得时间初值。然后启动ntpd服务。ntpd服务先是每64秒与ntp服务器同步一次,根据每次同步时测得的时间差值经复杂计算逐步调整自己的时间,随着误差减小,逐步增加同步的间隔,每次跳动都会重复这个过程。
ntpd服务
- ntp安装
1
sudo pacman -S ntp # archlinux
配置文件/etc/ntp.conf
1
2
3
4server 0.pool.ntp.org iburst # iburst客户端无法立即连接到服务器时,允许快速发送几个同步请求
server 1.pool.ntp.org iburst #pool.ntp.org通用的ntp服务器
server 2.pool.ntp.org iburst
server 3.pool.ntp.org iburst启动ntpd
1
2
3sudo systemctl start ntpd
sudo systemctl status ntpd
sudo systemctl enable ntpd手动同步时间
1
2sudo ntpd -gq
# -g 允许时间进行大幅度调整,-q ntpd调整完后立即退出而不作为守护进程查看ntp同步状态
1
2
3
4
5ntpq -p
remote refid st t when poll reach delay offset jitter
=======================================================================
time.cloudflare .CFCD. 3 u 60 64 1 50.236 -12.345 5.678
ntp1.ntp.org .GPS. 1 u 30 64 1 32.586 0.234 1.234第一个当前使用的服务器 time.cloudflare
第二个备选服务器ntp1.ntp.org
st 层级 stratum
delay 客户端和服务器之间的延迟
offset 本地时钟和远程时钟之间的时间差
jitter 时间抖动(时间的波动)