Linux 下用 hwclock 调节系统时钟

来源:互联网 发布:psp损坏的数据 编辑:程序博客网 时间:2024/04/29 19:42

由 Linux 内核管理的时钟与硬件时钟并不相同。硬件时钟又叫 BIOS 时钟,在系统关闭后仍在运行,可以通过修改 BIOS 修改硬件时钟。不过当系统已经启动之后,仍可通过 hwclock 命令查看并修改硬件时间。

1.显示系统日期和时刻

输入 hwclock 即可查看硬件时钟,默认选项是 -r 或者 --show。

# hwclockFri 16 Aug 2013 04:45:28 PM CST  -0.428900 seconds# hwclock -rFri 16 Aug 2013 04:45:35 PM CST  -0.063468 seconds# hwclock --showFri 16 Aug 2013 04:45:42 PM CST  -0.719671 seconds

hwclock 得到的时间和 date 命令得到的时间可能相同,也可能不同,因为来源不同。
# dateFri Aug 16 16:47:30 CST 2013

在本人的机器上,有大约两分钟的差别,内核时钟与北京时间吻合,硬件时钟略微有点慢。

2.将系统时间复制到硬件时间

当然,系统时间和硬件时间相等是满足强迫症患者的必要条件。而它们的差别的确是存在的。
我们需要的选项是 --systohc
# hwclock --systohc# hwclockFri 16 Aug 2013 04:54:23 PM CST  -0.438495 seconds# dateFri Aug 16 16:54:24 CST 2013

我们看到,差别已经消失了,相应的短选项是 -w,不过这个非常难记,长选项意思很明确:SYStem TO Hardware Clock,非常容易记忆。

3.手动调节硬件时钟

手动调节主要使用 --set 命令和 --date 选项。
# hwclock --set --debug --date 8/16/2013                                     Issuing date command: date --date="8/16/2013" +seconds-into-epoch=%sresponse from date command = seconds-into-epoch=1376582400date string 8/16/2013 equates to 1376582400 seconds since 1969.hwclock from util-linux 2.20.1Using /dev interface to clock.Last drift adjustment done at 1376643258 seconds after 1969Last calibration done at 1376643258 seconds after 1969Hardware clock is on UTC timeAssuming hardware clock is kept in UTC time.Waiting for clock tick......got clock tickTime read from Hardware Clock: 2013/08/16 10:20:49Hw clock time : 2013/08/16 10:20:49 = 1376648449 seconds since 1969Time elapsed since reference time has been 0.318806 seconds.Delaying further to reach the new time.Setting Hardware Clock to 16:00:00 = 1376582400 seconds since 1969ioctl(RTC_SET_TIME) was successful.Not adjusting drift factor because it has been less than a day since the last calibration.
这里用到了 --debug 选项,后面详细说。
hwclock 命令的 --date 选项还与 date 命令输出格式兼容。
# hwclock --debug --set --date "`date`"Issuing date command: date --date="Fri Aug 16 18:24:44 CST 2013" +seconds-into-epoch=%sresponse from date command = seconds-into-epoch=1376648684date string Fri Aug 16 18:24:44 CST 2013 equates to 1376648684 seconds since 1969.hwclock from util-linux 2.20.1Using /dev interface to clock.Last drift adjustment done at 1376648658 seconds after 1969Last calibration done at 1376648658 seconds after 1969Hardware clock is on UTC timeAssuming hardware clock is kept in UTC time.Waiting for clock tick......got clock tickTime read from Hardware Clock: 2013/08/16 10:24:44Hw clock time : 2013/08/16 10:24:44 = 1376648684 seconds since 1969Time elapsed since reference time has been 0.428459 seconds.Delaying further to reach the new time.Setting Hardware Clock to 10:24:44 = 1376648684 seconds since 1969ioctl(RTC_SET_TIME) was successful.Not adjusting drift factor because it has been less than a day since the last calibration.
上面的命令相当于 --systohc 选项。
还有一种格式为:
# hwclock --set --date "8/11/2013 23:10:45"
注意,这种方式调整时间后默认为本地时间(local time)而不是 UST。

4.将硬件时钟复制到系统时钟

基本命令和上面相似,长选项是 --hctosys,相应的短选项是 -s。

5.回过头来说说调试模式

如果加上 --debug 选项,程序将输出一些调试信息,这些调试信息表明了程序究竟做了什么。例子见上面的 shell 输出,更多的例子在下面两节。

6.调节硬件时钟

系统启动的时候会读取硬件时钟,/etc/adjtime 文件被 hwclock 的 --adjust 选项调用以控制调节过程,先看看该文件:
# cat /etc/adjtime0.380822 1376648684 0.0000001376648684UTC
第一行有三个数字,分别为:系统漂移率(时钟每天产生的偏差),从最近一次调整算起回溯到 1969 UTC 的总秒数,一个零(没有物理意义);第二行是第一行的第二个数字;第三行是 UTC 或者是 local。
# hwclock --debug --adjusthwclock from util-linux 2.20.1Using /dev interface to clock.Last drift adjustment done at 1376648684 seconds after 1969Last calibration done at 1376648684 seconds after 1969Hardware clock is on UTC timeAssuming hardware clock is kept in UTC time.Waiting for clock tick......got clock tickTime read from Hardware Clock: 2013/08/16 10:44:58Hw clock time : 2013/08/16 10:44:58 = 1376649898 seconds since 1969Time since last adjustment is 1214 secondsNeed to insert 0 seconds and refer time back 0.005351 seconds agoNeeded adjustment is less than one second, so not setting clock.
上面是一个典型的例子,仔细读一下后,--adjust 选项的作用还是很明显的。

7.测试模式

由于操作系统时间是个比较敏感的问题,搞乱了内核时钟或是硬件时钟都会惹来麻烦,所以 hwclock 增加了 --test 选项。
# hwclock --systz --testNot setting system clock because running in test mode.
也就是说程序执行了,但是没有真正改动任何数据,所以总要加上 --debug 选项来输出程序的行为。
# hwclock --debug --test --systzhwclock from util-linux 2.20.1Last drift adjustment done at 1376648684 seconds after 1969Last calibration done at 1376648684 seconds after 1969Hardware clock is on UTC timeAssuming hardware clock is kept in UTC time.Current system time: 1376650362 = 2013/08/16 10:52:42Calling settimeofday:UTC: 2013/08/16 10:52:42tv.tv_sec = 1376650362, tv.tv_usec = 932224tz.tz_minuteswest = -480Not setting system clock because running in test mode.
从上面的输出可以看出 --systz 选项自动调节系统时区,有时候看 man page 看的云里雾里的时候可以用 --test 做个实验,一切就简单了。
hwclock 还有很多功能和参数,上面几个是主要的,其他的可以用 --test 玩一下就可以明白其功用。

英文原文:http://www.thegeekstuff.com/2013/08/hwclock-examples/?utm_source=feedburner&utm_medium=email&utm_campaign=Feed%3A+TheGeekStuff+%28The+Geek+Stuff%29
原创粉丝点击