Blog on 27th Floor
主页 随便 电脑 电影 社会 阅读 下载 本站 存档
主页 随便 电脑 电影 社会 阅读 下载 本站 存档

Linux下系统时间快8小时问题综述

07/06/07。  cathayan.org版权所有,保留一切权利。转载请保留此说明。谢绝商业转载。


在这次给Dell 640m装Debian sid之前,还真没遇到过这个“常见问题”。这次遇到之后果然很郁闷,于是刚才Google了一圈,把它给解决了。以下针对Debian sid。

先说时区的配置。以前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模块,用如下方法测试哪个模块好用:


没有显示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运行时会对时,并因为又造成快几个小时的问题,不知道怎么处理的。

07/06/07 00:05:00,由cathayan发表。目录:电脑

3条评论

实在是研究得仔细。我一直就是用ntpdate,开机时就自动对一下时间并写到硬件里去。我用的服务器是香港天文台的:stdtime.gov.hk

http://windrose.linuxsir.org windrose 于 07/06/07 11:00:19 发表. 

跟着做,做到rcS就成了。
谢谢:)

ameba 于 07/08/07 22:07:31 发表. 

真的很仔细,谢谢你拉。
不过用ntpd似乎比直接用ntpdate好一点。

http://www.joecen.com joecen 于 02/15/08 16:38:55 发表. 


这篇文章已经关闭,不能添加评论和投票
I am watching and will delete all spam.

我的E-Mail


Copy&Paste Exchange

访问CPeX Group

订阅Feed

订阅Feedburner
Feedsky订阅
本站订阅

请登录

导航

cathayan.org Web

最新贴

RIME 小狼毫/鼠须管的极点及五笔拼音配置
Software that rocks or sucks less
一棵热带的树换新叶的过程
几个有用的Vim招术
论语七 述而
Nomacs 图像浏览器
Windows 文件校验
Windows 10 文件批量命名简单方法
Windows 10 文件删除高级操作
本站也算是有响应式设计了

最新评论

Powered by

Powered by Nucleus CMS

版权声明

Creative Commons License
Blog on 27th floor by Cathayan is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
Powered by Nucleus CMS v3.71. Best view with Mozilla browsers.