时间和时区的操作
- 1、概述
- 2、两种时钟
- 2.1、硬件时钟
- 2.2、系统时钟
- 2.3 硬件时钟与系统时钟间的同步
- 3、修改时区
- 3.1 检查当前时区
- 3.2 更改时区
- 4、总结
1、概述
大家好,我是欧阳方超,今天说一下操作系统时间和时区的校对、修改问题。
操作系统时间准确性是系统正常运行的重要保证,尤其是在使用分布式系统的场景中,不同机器间时间的同步显得尤为重要。
2、两种时钟
在Linux操作系统中有两种时钟,第一种是硬件时钟,又称为 RTC, CMOS时钟或BIOS clock,这种时钟的运转靠的是主板上的电池,所以即使关机了依然可以计时;第二种是系统时钟,该时钟有操作系统维护,系统启动时会读取硬件时钟并将其设置为系统时钟,即与硬件时钟同步一次;有趣的是在后续运行过程中,系统时钟和硬件时钟,并不会自动同步,而是以异步的方式运行,互不干扰。
2.1、硬件时钟
可以通过hwcolck或clock命令操作硬件时钟。
查看硬件时钟
[root@hadoopmaster ~]# hwclock --show
Sat 16 Apr 2022 08:04:47 PM CST -0.506149 seconds
You have mail in /var/spool/mail/root
[root@hadoopmaster ~]# clock --show
Sat 16 Apr 2022 08:04:57 PM CST -0.818679 seconds
设置硬件时钟
[root@hadoopmaster ~]# hwclock --set --date="2022-04-16 20:05:05"
[root@hadoopmaster ~]# hwclock --show
Sat 16 Apr 2022 08:05:13 PM CST -0.725406 seconds
2.2、系统时钟
查看系统时钟
[root@hadoopmaster ~]# date
Sun Apr 17 14:01:37 CST 2022
修改时钟,可以按照下面的命令将系统时钟改为指定值
[root@hadoopmaster ~]# date -s "yyyy-MM-dd HH:mm:ss"
可能会遇到修改后无效的情况,这种情况下可能的原因是从互联网同步时间的功能处于开启状态,可以使用如下命令将其关闭
[root@hadoopmaster ~]# timedatectl set-ntp 0
当然再次开始时执行timedatectl set-ntp 1即可。
这里对timdatectl命令做一下说明,使用timedatectl可以查看时间、时区等信息,
[root@hadoopmaster ~]# timedatectl
Local time: Sun 2022-04-17 16:06:55 CST
Universal time: Sun 2022-04-17 08:06:55 UTC
RTC time: Sun 2022-04-17 08:06:55
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
Local time是指地方时,
Universal time是指世界时,
RTC time指硬件时钟,
Time zone指时区,
NTP enabled: yes,yes是指NTP已经启用,当其值为no时说明NTP未启用,
NTP synchronized: yes,yes是指完成过NTP同步,no说明未完成过NTP同步,
2.3 硬件时钟与系统时钟间的同步
从硬件时钟同步时间至系统时钟
[root@hadoopmaster ~]# hwclock --hctosys
或者
[root@hadoopmaster ~]# clock --hctosys
从系统时钟同步时间至硬件时钟
[root@hadoopmaster ~]# hwclock --systohc
或者
[root@hadoopmaster ~]# clock --systohc
3、修改时区
时区是具有相同标准时间的地理区域。在操作系统安装过程中一般会让选择设置时区,但是后续也能对时区进行修改。下面介绍一下查看、修改时区的方法。
3.1 检查当前时区
检查当前时区用到的命令其实在上文中已经提到过,为timedatectl,当该命令不带任何参数时可以查看时区和时间,如下显示的时区为Asia/Shanghai
[root@hadoopmaster ~]# timedatectl
Local time: Sun 2022-04-17 16:06:55 CST
Universal time: Sun 2022-04-17 08:06:55 UTC
RTC time: Sun 2022-04-17 08:06:55
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
其实还可以通过查看/etc/localtime被链接到哪个文件进行确定当前时区属于哪个时区,如下时区信息为Asia/Shanghai
[root@hadoopmaster ~]# ll /etc/localtime
lrwxrwxrwx 1 root root 33 Apr 16 17:12 /etc/localtime -> /usr/share/zoneinfo/Asia/Shanghai
3.2 更改时区
时区的命名约定格式为“地区/城市名”方式,可以通过timedatectl list-timezone命令查询系统中所有可用的时区,下面展示的只是一部分
[root@bogon ~]# timedatectl list-timezones
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
Africa/Algiers
Africa/Asmara
Africa/Bamako
Africa/Bangui
Africa/Banjul
或者通过查看/usr/share/zoneinfo/下的文件来确认有哪些可用的时区
[root@bogon ~]# ll /usr/share/zoneinfo/
total 392
drwxr-xr-x. 2 root root 4096 Mar 9 2020 Africa
drwxr-xr-x. 6 root root 8192 Mar 9 2020 America
drwxr-xr-x. 2 root root 187 Mar 9 2020 Antarctica
drwxr-xr-x. 2 root root 26 Mar 9 2020 Arctic
drwxr-xr-x. 2 root root 4096 Mar 9 2020 Asia
drwxr-xr-x. 2 root root 196 Mar 9 2020 Atlantic
drwxr-xr-x. 2 root root 4096 Mar 9 2020 Australia
drwxr-xr-x. 2 root root 59 Mar 9 2020 Brazil
drwxr-xr-x. 2 root root 136 Mar 9 2020 Canada
-rw-r--r--. 1 root root 2102 Jan 30 2018 CET
drwxr-xr-x. 2 root root 45 Mar 9 2020 Chile
更改时区有两种方式,一种是使用timedatectl命令(如果系统中有该命令的话),另一种是为时区文件创建符合链接。
方式一:使用timedatactl命令
确定完要修改的时区后,可以使用如下命令进行修改,下面的命令将时区改为America/New_York时区
[root@hadoopmaster ~]# timedatectl set-timezone America/New_York
You have mail in /var/spool/mail/root
改完后可以查看验证一下是否更改成功,
[root@hadoopmaster ~]# timedatectl
Local time: Sun 2022-04-17 05:10:49 EDT
Universal time: Sun 2022-04-17 09:10:49 UTC
RTC time: Sun 2022-04-17 09:10:49
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 2022-03-13 01:59:59 EST
Sun 2022-03-13 03:00:00 EDT
Next DST change: DST ends (the clock jumps one hour backwards) at
Sun 2022-11-06 01:59:59 EDT
Sun 2022-11-06 01:00:00 EST
显然已经更改成功。
方式二:通过创建符号链接来更改时区
在没有timedatectl命令的系统中,可以通过将/usr/share/zoneinfo下的不同时区文件链接到/etc/localtime的方式来更改时区,一般而言系统中已经有时区文件链接到/etc/localtime,我们可以将该文件先备份:cp /etc/localtime /etc/localtime.20220417bak01,然后为新的时区文件创建符号链接,注意如果不加-f可能会报“failed to create symbolic link ‘xxx’: File exists”的错误,
ln -s /usr/share/zoneinfo/America/New_York /etc/localtime
4、总结
本文介绍了修改Linux系统时钟和硬件时钟的方法,同时也介绍了修改时区的办法,修改时区一种办法是使用timedate time-zone xxx命令,另一种办法是为时区文件创建符合链接,文章不宜过长,关于Linux时钟的问题先介绍到这里。