您的位置:首页 > 运维架构 > Linux

linux系统时间和硬件时钟问题(date和hwclock)

2014-05-23 16:08 267 查看
总结一下hwclock,这个容易晕:

1)/etc/sysconfig/clock 文件,只对 hwclock 命令有效,且只在系统启动和关闭的时候才有用(修改了其中的 UTC=true 到 UTC=false 的前后,执行 hwclock (--utc, 或 --localtime) 都没有变化,要重启系统后才生效);

2)/etc/rc.d/rc.sysinit 文件,run once at boot time,其中有从硬件时钟同步时间到系统时间的操作;

3)hwclock --localtime 的输出,才是硬件时钟真正的时间。如果输出结果带时区(比如CST),还要看/etc/sysconfig/clock里的UTC参数,如果 UTC=false,那时区有意义;如果 UTC=true,那时区没意义,实际上是UTC时间。

4)在 /etc/sysconfig/clock 中 UTC=false 时,date、hwclock、hwclcok --localtime 输出的时间应该都一致,且此时 hwclock --utc是没有意义的;

5)在 /etc/sysconfig/clock 中 UTC=ture 时,date、hwclock 的输出是一致的,hwclock --localtime 的输出则是UTC时间;

6)如果不想在输出中带时区,则 export LANG=C ,然后再运行 hwclock 就没有什么CST了,免得时区误导你;

7)hwclock --utc 很闹腾,还是别看了,你会晕的。。。

8)系统关闭时会同步系统时间到硬件时钟,系统启动时会从硬件时钟读取时间更新到系统,这2个步骤都要根据 /etc/sysconfig/clock 文件中UTC的参数来设置时区转换。

2、实际案例分析:修改了 /etc/sysconfig/clock 中UTC参数但系统未正常关闭的情况

修改 /etc/sysconfig/clock 文件后,如果系统内核突然崩溃,然后直接按电源重启,则系统没有进行 系统时间到硬件时钟的 同步;但是 系统启动时,又根据 /etc/sysconfig/clock 中UTC的参数,来同步硬件时钟到系统,这时就会出现时间问题:

0)假设系统的时区为CST(UTC+8);

1)假设原 /etc/sysconfig/clock 中 UTC=true,修改成 UTC=false;

2)如果此时系统未正常关机,系统时间未按参数 UTC=false 同步时间到硬件时钟(没有+8小时);

3)但系统被按电源重启后,系统读取到 UTC=false,认为硬件时钟为CST时间,直接用于系统时间;

4)那么此时,系统时间将少了8小时。

=======================================================

[引用]linux时间问题两篇[zz]

2010年07月19日 星期一 上午 09:43

http://hi.baidu.com/lujunqianglw/blog/item/bc2d9144d24fc48fb3b7dc1d.html

(一)

一、首先要弄清几个概念:

1. “系统时间”与“硬件时间”

系统时间: 一般说来就是我们执行 date 命令看到的时间,linux系统下所有的时间调用(除了直接访问硬件时间的命令)都是使用的这个时间。

硬件时间: 主板上BIOS中的时间,由主板电池供电来维持运行,系统开机时要读取这个时间,并根据它来设定系统时间(注意:系统启动时根据硬件时间设定系统时间的过程可能存在时区换算,这要视具体的系统及相关设置而定)。

2. “UTC时间”与“本地时间”

UTC时间:Coordinated Universal 8 e2 i( H7 t0 ^/ ^Time 世界协调时间(又称世界标准时间、世界统一时间),在一般精度要求下,它与GMT(Greenwich Mean Time,格林威治标准时间)是一样的,其实也就是说 GMT≈UTC,但 UTC 是以原子钟校准的,更精确。

本地时间:由于处在不同的时区,本地时间一般与UTC是不同的,换算方法就是

本地时间 = UTC + 时区 或 UTC = 本地时间 - 时区

时区东为正,西为负,例如在中国,本地时间都使用北京时间,在linux上显示就是 CST(China Standard Time,中国标准时,注意美国的中部标准时Central Standard Time也缩写为CST,与这里的CST不是一回事!),时区为东八区,也就是 +8 区,所以 CST=UTC+(+8小时) 或 UTC=CST-(+8小时)。

二、时间命令

1. 系统时间 date

直接调用 date,得到的是本地时间。如果想得到UTC时间的话,使用 date -u。

[12-01 19:07> ~]$ date

2009年 12月 07日 星期一 14:22:20 CST

[12-01 19:07> ~]$ date -u

2009年 12月 07日 星期一 06:22:22 UTC

2. 硬件时间 /sbin/hwclock

直接调用 /sbin/hwclock 显示的时间就是 BIOS 中的时间吗?未必!这要看 /etc/sysconfig/clock 中是否启用了UTC,如果启用了UTC(UTC=true),显示的其实是经过时区换算的时间而不是BIOS中真正的时间,如果加上 --localtime 选项,则得到的总是 BIOS 中实际的时间.

[12-01 19:07> ~]# hwclock

2009年12月07日 星期一 14时28分43秒 -0.611463 seconds

[12-01 19:07> ~]# hwclock --utc

2009年12月07日 星期一 14时28分46秒 -0.594189 seconds

[12-01 19:07> ~]# hwclock --localtime

2009年12月07日 星期一 06时28分50秒 -0.063875 seconds

3. /etc/localtime

这个文件用来设置系统的时区,将 /usr/share/zoneinfo/ 中相应文件拷贝到/etc下并重命名为 localtime 即可修改时区设置,而且这种修改对 date 命令是及时生效的。不论是 date 还是 hwclock 都会用到这个文件,会根据这个文件的时区设置来进行UTC和本地之间之间的换算。

4. /etc/sysconfig/clock

这个文件只对 hwclock 有效,而且似乎是只在系统启动和关闭的时候才有用,比如修改了其中的 UTC=true 到 UTC=false 的前后,执行 hwclock (--utc, 或 --localtime) 都没有变化,要重启系统后才生效。注:如果设置 UTC=false 并重启系统后,执行一些命令结果如下:

date 2009年 12月 07日 星期一 19:26:29 CST

date -u 2009年 12月 07日 星期一 11:26:29 UTC

hwclock 2009年12月07日 星期一 19时26分30秒 -0.442668 seconds

hwclock --utc 2009年12月08日 星期二 03时26分31秒 -0.999091 seconds

hwclock --localtime 2009年12月07日 星期一 19时26分32秒 -0.999217 seconds

可见,如果不使用UTC,BIOS时间(红色部分)就是系统本地时间,而且注意这时执行 hwclock --utc 得到的结果没有任何意义,因为这里我们已经禁用了UTC,而且也明显不符合“本地时间=UTC+时区”的关系。

三、linux与windows双系统间的时间同步

系统启动和关闭时,硬件时间与系统时间之间的同步有两种方式(假设在中国,用CST代表本地时间):

方式A: 使用UTC(对linux就是 /etc/sysconfig/clock 中 UTC=true)

开机: BIOS------->UTC(将BIOS中的时间看成是UTC)------(时区变化)----->CST

关机: CST -------(时区变化)----->UTC-------存储到------>BIOS

方式B: 不使用UTC(对linux就是 /etc/sysconfig/clock 中 UTC=false)

开机: BIOS--------------------->CST(将BIOS中的时间看成是CST)

关机: CST ---------存储到------>BIOS

通过设定 /etc/sysconfig/clock,linux可以支持这两种方式,然而windows只支持方式B(至少是默认支持B,而我不知道怎么能让它支 持A),那么在双系统情况下,如果linux设成A方式,那么在linux与windows系统切换时一定会造成时间混乱的,解决办法就是将linux中 的UTC禁用,也设成B方式就可以了。

注:可以通过 hwclock --hctosys 来利用硬件时间来设置系统时间(注意不是简单的复制BIOS中的时间为系统时间,要看是否使用UTC,如果使用的话则要做时区换算),通过 hwclock --systohc 来根据系统时间设置硬件时间(也要看是否启用UTC来决定是否做时区换算)。

总之,不论使用 --systohc 还是 --hctosys,同步后直接运行不带参数的 hwclock 得到的时间与直接运行 date 得到的时间应该一致,这个时间是否就是BIOS中的时间(hwclock --localtime)那就不一定了,如果启用了UTC就不是,没启用UTC就是。

而且还要注意:在系统中手动使用 hwclock hwclock --set --date='yyyy-mm-dd' 来设置BIOS时间只在系统运行时有效,因为当系统关闭时,还会按设定好的方式根据系统时间来重设BIOS时间的,于是手动的设置便被覆盖掉了。

---------------------------------------------------------------------

(二)

Linux时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟。系统时钟是指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的时钟,这个硬件时钟可以在BIOS中进行设置。当Linux启动时,硬件时钟会去读取系统时钟的设置,然后系统时钟就会独立于硬件运作。

Linux中的所有命令(包括函数)都是采用的系统时钟设置。在Linux中,用于时钟查看和设置的命令主要有date、hwclock和clock。其中,clock和hwclock用法相近,只用一个就行,只不过clock命令除了支持x86硬件体系外,还支持Alpha硬件体系。

1、date

查看系统时间

# date

设置系统时间

# date --set “07/07/06 10:19" (月/日/年 时:分:秒)

2、hwclock/clock

查看硬件时间

# hwclock --show

或者

# clock --show

设置硬件时间

# hwclock --set --date="07/07/06 10:19" (月/日/年 时:分:秒)

或者

# clock --set --date="07/07/06 10:19" (月/日/年 时:分:秒)

3、硬件时间和系统时间的同步

按照前面的说法,重新启动系统,硬件时间会读取系统时间,实现同步,但是在不重新启动的时候,需要用hwclock或clock命令实现同步。

硬件时钟与系统时钟同步:

# hwclock --hctosys(hc代表硬件时间,sys代表系统时间)

或者

# clock --hctosys

系统时钟和硬件时钟同步:

# hwclock --systohc

或者

# clock --systohc

4、时区的设置 tzselect

# tzselect

Please identify a location so that time zone rules can be set correctly.

Please select a continent or ocean.

1) Africa

2) Americas

3) Antarctica

4) Arctic Ocean

5) Asia

6) Atlantic Ocean

7) Australia

8) Europe

9) Indian Ocean

10) Pacific Ocean

11) none - I want to specify the time zone using the Posix TZ format.

#? 输入5,亚洲

Please select a country.

1) Afghanistan 18) Israel 35) Palestine

2) Armenia 19) Japan 36) Philippines

3) Azerbaijan 20) Jordan 37) Qatar

4) Bahrain 21) Kazakhstan 38) Russia

5) Bangladesh 22) Korea (North) 39) Saudi Arabia

6) Bhutan 23) Korea (South) 40) Singapore

7) Brunei 24) Kuwait 41) Sri Lanka

8) Cambodia 25) Kyrgyzstan 42) Syria

9) China 26) Laos 43) Taiwan

10) Cyprus 27) Lebanon 44) Tajikistan

11) East Timor 28) Macau 45) Thailand

12) Georgia 29) Malaysia 46) Turkmenistan

13) Hong Kong 30) Mongolia 47) United Arab Emirates

14) India 31) Myanmar (Burma) 48) Uzbekistan

15) Indonesia 32) Nepal 49) Vietnam

16) Iran 33) Oman 50) Yemen

17) Iraq 34) Pakistan

#? 输入9,中国

Please select one of the following time zone regions.

1) east China - Beijing, Guangdong, Shanghai, etc.

2) Heilongjiang

3) central China - Gansu, Guizhou, Sichuan, Yunnan, etc.

4) Tibet & most of Xinjiang Uyghur

5) southwest Xinjiang Uyghur

#? 输入1,北京时间

The following information has been given:

China

east China - Beijing, Guangdong, Shanghai, etc.

Therefore TZ='Asia/Shanghai' will be used.

Local time is now: Fri Jul 7 10:32:18 CST 2006.

Universal Time is now: Fri Jul 7 02:32:18 UTC 2006.

Is the above information OK?

1) Yes

2) No

#? 输入1,确认

如果不用tzselect命令,可以修改文件变更时区。

# vi /etc/sysconfig/clock

ZONE=Asia/Shanghai(查/usr/share/zoneinfo下面的文件)

UTC=false

ARC=false

# rm /etc/localtime

# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

重新启动即可

功能说明:显示与设定硬件时钟。

语  法:hwclock [--adjust][--debug][--directisa][--hctosys][--show][--systohc][--test]

[--utc][--version][--set --date=<日期与时间>]

补充说明:在Linux中有硬件时钟与系统时钟等两种时钟。硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟。系统时钟则是指kernel中的时钟。当Linux启动时,系统时钟会去读

取硬件时钟的设定,之后系统时钟即独立运作。所有Linux相关指令与函数都是读取系统时钟的设定。

参  数:

--adjust  hwclock每次更改硬件时钟时,都会记录在/etc/adjtime文件中。使用--adjust参数,可使hwclock根据先前的记录来估算硬件时钟的偏差,并用来校正目前的硬件时钟。

--debug  显示hwclock执行时详细的信息。

--directisa  hwclock预设从/dev/rtc设备来存取硬件时钟。若无法存取时,可用此参数直接以I/O指令来存取硬件时钟。

--hctosys  将系统时钟调整为与目前的硬件时钟一致。

--set --date=<日期与时间>  设定硬件时钟。

--show  显示硬件时钟的时间与日期。

--systohc  将硬件时钟调整为与目前的系统时钟一致。

--test  仅测试程序,而不会实际更改硬件时钟。

--utc  若要使用格林威治时间,请加入此参数,hwclock会执行转换的工作。

--version  显示版本信息。

注:要使系统时间准确,最好还是使用ntp方式。

示例:使用ntpdate命令从网络同步时间,再同步到硬件时钟

ntpdate命令是使用NTP协议来从网络同步时间的命令。NTP=Network Time Protocol 网络时间协议。

[root@linuxso.com~]# ntpdate 0.rhel.pool.ntp.org

6 Nov 21:17:55 ntpdate[4829]: step time server 123.146.124.28 offset -1.025258 sec

[root@linuxso.com~]# date

2010年 11月 06日 星期六 21:17:59 CST

[root@linuxso.com~]# hwclock -w

扩展阅读一:hwclock 使用

Linux机器上的时间比较复杂,有各式各样的时钟和选项等等。

一:

机器里有两个时钟:硬件时钟和系统时钟

硬件时钟从根本上讲是CMOS时钟;

系统时钟是由内核维护的,它是从1969年末(即传说中的标志Unix时代开端的那个拂晓)开始算起的累积秒数。

在DOS或Mac系统中,起作用的是硬件时钟。遗憾的是,你可能已经发现了,绝大多数电脑时钟都是很不准确的。它们从根本上讲是由小型电池供电的警报器时钟,这种锂电池一般可持续供电三年左右,

那时候你系统各大块差不多都已经过时了。

而在Linux系统中,起作用的是系统时钟。在启动时,它靠读取硬件时钟获得计时起点,而不是靠记忆计时。

你可以通过BIOS修改系统硬件时钟,或者如果你不想重起机器,那就用clock -w命令。

当你使用hwclock命令调整硬件时间很多次以后,hwclock就会获取你的时钟推移速率,然后就会把这个信息存在/etc/adjtime里边。以后,你就可以用它来随时更新你的硬件时间,用一条下面的命令:

hwclock --adjust

硬件时钟通常被设置成全球标准时间(UTC),而将时区信息保存在/usr/share/lib/timezone (或者在某些系统中可能是/usr/local/timezone)目录下某个适当的文件中,然后用一个符号链接文

件/etc/localtime指向它。

查看硬件时钟用命令:

hwclock --show 或者 hwclock -r

重置硬件时钟用:

#date 042817252009.00 //设置系统时钟 2009 年 04 月 28 日 星期四 17:25:00 CST

#hwclock -w

如果需要修改你的时区信息,可以使用tzset命令,如果你系统中没有这条命令,那可以用类似下面的操作:

ln -s /etc/localtime /usr/share/zoneinfo/US/Pacific

二:

实例:

板子上电

#date 042817252009.00 //设置系统时钟 2009 年 04 月 28 日 星期四 17:25:00 CST

#hwclock -w //将系统时钟写入硬件时钟

#hwclock -r //看时间是否在变化

如果没有出错, 就已经把2009 年 04 月 28 日 星期四 17:25:00 CST 写入RTC chip了

为了使系统时间和RTC时间同步,可以在初始化文件中添加命令

hwclock –s

使每次开机时读取RTC时间,并同步给系统时间。

在根文件系统:usr/etc/rc.local中添加

/sbin/hwclock -s

断电

等2分钟在上电

#hwclock -r //看时间是否同步,即使与2分钟后的时间相同

扩展阅读二:linux中时间设置date、hwclock、clock

Windows时钟大家可能十分熟悉了,Linux时钟在概念上类似Windows时钟显示当前系统时间,但在时钟分类和设置上却和Windows大相径庭。和Windows不同的是,Linux将时钟分为系统时钟(System

Clock)和硬件(Real Time Clock,简称RTC)时钟两种。系统时间是指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的那个主板硬件时钟,这个时钟可以在BIOS的"Standard BIOS

Feture"项中进行设置。

既然Linux有两个时钟系统,那么大家所使用的Linux默认使用哪种时钟系统呢?会不回出现两种系统时钟冲突的情况呢?这些疑问和担心不无道理。首先,Linux并没有默认哪个时钟系统。当Linux启动

时,系统时钟会去读取硬件时钟的设置,然后系统时钟就会独立于硬件运作。

从Linux启动过程来看,系统时钟和硬件时钟不会发生冲突,但Linux中的所有命令(包括函数)都是采用的系统时钟设置。不仅如此,系统时钟和硬件时钟还可以采用异步方式,即系统时间和硬件时间可

以不同。这样做的好处对于普通用户意义不大,但对于Linux网络管理员却有很大的用处。例如,要将一个很大的网络中(跨越若干时区)的服务器同步,假如位于美国纽约的Linux服务器和北京的Linux服

务器,其中一台服务器无须改变硬件时钟而只需临时设置一个系统时间,如要将北京服务器上的时间设置为纽约时间,两台服务器完成文件的同步后,再与原来的时钟同步一下即可。这样系统和硬件时

钟就提供了更为灵活的操作。

在Linux中,用于时钟查看和设置的命令主要有date、hwclock和clock。其中,clock和hwclock用法相近,只不过clock命 令除了支持x86硬件体系外,还支持Alpha硬件体系。由于目前绝大多数用户使用

x86硬件体系,所以可以视这两个命令为一个命令来学习。

1.在虚拟终端中使用date命令来查看和设置系统时间

查看系统时钟的操作:

# date

设置系统时钟的操作:

# date 091713272003.30

通用的设置格式:

# date 月日时分年.秒

2.使用hwclock或clock命令查看和设置硬件时钟

查看硬件时钟的操作:

# hwclock --show 或

# clock --show

2003年09月17日 星期三 13时24分11秒 -0.482735 seconds

设置硬件时钟的操作:

# hwclock --set --date="09/17/2003 13:26:00"

或者

# clock --set --date="09/17/2003 13:26:00"

通用的设置格式:hwclock/clock --set --date=“月/日/年时:分:秒”。

3.同步系统时钟和硬件时钟

Linux系统(笔者使用的是Red Hat 8.0,其它系统没有做过实验)默认重启后,硬件时钟和系统时钟同步。如果不大方便重新启动的话(服务器通常很少重启),使用clock或hwclock命令来同步系统时

钟和硬件时钟。

硬件时钟与系统时钟同步:

# hwclock --hctosys

或者

# clock --hctosys

上面命令中,--hctosys表示Hardware Clock to SYStem clock。

系统时钟和硬件时钟同步:

# hwclock --systohc

或者

# clock --systohc
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: