ITPub博客

首页 > Linux操作系统 > Linux操作系统 > ibm3850与linux系统的时钟问题

ibm3850与linux系统的时钟问题

原创 Linux操作系统 作者:279531451 时间:2009-09-02 20:00:43 0 删除 编辑

在Linux中有硬件时钟与系统时钟两种时钟。硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟。系统时钟则是指kernel中的 时钟。当Linux启动时,系统时钟会去读取硬件时钟的设定,之後系统时钟即独立运作。所有Linux相关指令与函数都是读取系统时钟的设定。 hwclock实现了BIOS和linux的时间同步

Hwclock语法说明

语法格式:

hwclock [--adjust][--debug][--hctosys][--show][--systohc][--test]
[--utc][--version][--set --date=<日期与时间>]

参数说明:

  • –adjust or -a

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

  • –hctosys or -s

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

  • –set –date=<日期与时间>

设定硬件时钟。

  • –show or -r

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

  • –systohc or -w

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

  • –version or -v

显示版本信息。

  • –debug

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

  • –test

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

  • –utc

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

Hwclock使用

同步系统时钟和硬件时钟

# hwclock –w

设置硬件时钟时间:

# hwclock --set --date="9/8/2007 16:45:05"

查看硬件时钟

# hwclock -r

系统时钟错误的问题

在做AS4的双机测试中,因为LK的序列号已经过期.所以要改时间使用.所以就用hwclock --systohc 来保存时间,省的老是修改,谁知道不然,出错了

]# hwclock --systohc
select() to /dev/rtc to wait for clock tick timed out

上网仔细查了下,发现是3850的一个硬件BUG,和 APIC/ACPI 有关的,禁用掉就可以恢复正常。不过还有一个解决办法就是给 hwclock 加上 --directisa 参数。

即:

[root@02 ~]# hwclock --systohc --directisa
[root@02 ~]# date
Fri Feb 1 00:18:43 CST 2008

OK,问题解决,从起也不怕了.继续验证LK方案~

结果重起发现时间居然还是快8小时,导致LK失败.查了点资料发现如果BIOS里所设置时间为本地时间的话,那么需要修改/etc/sysconfig/cloc,将UTC=false改为UTC=no,再加上一句CLOCKFLAGS=--directisa即可.

例如我的是:

ZONE="Asia/Shanghai"
CLOCKFLAGS=--directisa
UTC=no
ARC=false

参考以下资料:

先说时区的配置。以前Debian有个好胜的时区配置工具,叫tzconfig,现在也没有了。但配置时区倒也简单,主要是两个文件:

/etc/localtime

/etc/timezone

timezone这个文件是个文本,里面只需要写一行自己的时区就行,我们这里就是上海,Asia/Shanghai(谁知道为什么不是北京呢?)。 localtime这个文件的类型不清楚,里面就写了些timezone data,它可以从系统自带时区文件那里拷贝,位置在:/usr/share/zoneinfo

从这个目录下找到Shanghai拷贝到/etc下的localtime即可。有人说建个连接也可,这样还可以保证系统数据有变化时不必再管。

设定了时区,还要确定Linux的时间方案。Linux支持UTC时间,Coordinated Universal Time,也就是世界协调时,也就是本初子午线上的时间,它和以前的格林威治标准时(GMT)的区别似乎是它是由多个原子钟平均出来的。在 /etc/default/rcS这个文件中,设定了系统是否使用UTC,UTC=yes就是用。

计算机自己还有自己的时间,也就是硬件时间,hard clock,也就是存在BIOS里那个时间,关机也不会丢失。计算机启动时,就要读取这个时间。这个时间如果设定为UTC(GMT),也就是伦敦那地方的时间,就要在rcS文件中设定UTC=yes,反之则要设为no。

总之就是两种正确的设置:

BIOS=本地时间,UTC=no

BIOS=UTC时间,UTC=yes

一般来讲,BIOS里面都设定为当地时间,这是因为如果装双系统的话,Windows似乎不懂utc,就会出问题。这时UTC=no。

如果一切顺利,到这时,进入Linux之后显示的时间应该是正确的了。但不少人的机器,包括这回这台640m,仍旧不正确,而是比正确时间再往前跑了8小时。这里的问题出在Linux读取硬件时间上了。

Linux读取这个硬件时间要用到hwclock这个命令:

hwclock --show :显示硬件时间

hwclock --systohc :将系统时间写入硬件

hwclock --hctosys :将硬件时间写入系统时间

在出问题的时候,hwclock 这一组命令的运行通常是不能成功的,错误经常是这样的:

select() to /dev/rtc to wait for clock tick timed out

也就是不能读取/dev/rtc,也就是硬件时间。这又是因为某些机器的BIOS处理方式和Linux的rtc内核模块之间出现了问题。

Linux又有3个这类模块,rtc/genrtc/rtc_dev,似乎是一个比一个新,而debian通常自己用的是rtc这个老模块;但 Dell/ibm/acer等等厂商现在都可能使用新的BIOS,这种BIOS和这个rtc就可能不对付。如果出现了上面那个timeout的问题,有两种方法可以解决:

1, 给hwclock加参数,--directisa,也就是:

hwclock --directisa --show

如果运行成功,说明这个办法可行。则把此参数添加为hwclock的缺省参数即可。在debian 4.0之后,可以直接在/etc/default/rcS中添加一行:

HWCLOCKPARS="--directisa“

而在4.0以前,可能只能在hwclock启动脚本中添加,/etc/init.d/hwclock.sh,把里面的”/sbin/hwclock“ 全部替换为 ”/sbin/hwclock --directisa"。现在在debian sid中,这个脚本的第一行其实是HWCLOCKPARS=,也可以像rcS一样添加参数了。

2, 换用其他内核rtc模块,用如下方法测试哪个模块好用:

# modprobe rtc

# hwclock --show

# rmmod rtc

# modprobe genrtc

# hwclock --show

# rmmod genrtc

# modprobe rtc_dev

# hwclock --show

# rmmod rtc_dev

没有显示time out的就是好用的了,然后可以在blacklist中阻止不好用的,在modules里面加上好用的那个。

用完这两个方法,hwclock应该能直接工作了,也就是可以读取硬件时间了。再配上utc设置正确,重启之后时间就是对的了。

为了让BIOS时间更准确,除了可以找个精确的时间源,比如CDMA手机或是GPS,靠自己的手指来精确设定BIOS时间之外,还可以用hwclock把准确的时间写入BIOS。前一种方法细心点可以做到几秒误差,而后一种怎么也在1秒以下了。

安装ntpdate这个包,它可以从时间服务器上读取到正确的时间,精度还是很高的:

aptitude install ntpdate

ntpdate pool.ntp.org

此时系统时间就已经是ntp的时间了,相当精确,把它写入硬件:

hwclock --systohc

这样BIOS时间也就很准了。以后开机没网络,没办法运行ntpdate的时候也都是准的。

这里的关键有:bios时间,utc设定,rtc模块,hwclock读取,ntpdate对时。

在Debian的老bug里还看到因为系统有多个分区,比如/usr单独分,fsck运行时会对时,并因此又造成快几个小时的问题,不知道怎么处理的

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7551038/viewspace-613818/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-09-01

  • 博文量
    100
  • 访问量
    153899