行云无鸣

2008-01-17

转:Debian下系统时间比正常时间快8小时的问题

Filed under: 未分类 — 标签:, , — hellyguo @ 16:24

Debian下系统时间比正常时间快8小时的问题

先说时区的配置。以前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运行时会对时,并因此又造成快几个小时的问题,不知道怎么处理的。

我的笔记本就是通过hwclock –directisa –show测试后,直接在/etc/default/rcS中添加一行:

HWCLOCKPARS=”–directisa”

这样搞定我的Debian下系统时间比正常时间快8小时的问题

2007-12-04

修改Linux的时间

Filed under: 未分类 — 标签:, — hellyguo @ 16:13

看到篇文章,比较有用,就记下了

修改Linux的时间
修改Linux时间一般涉及到3个命令: date, clock, hwclock
date: 修改系统当前的时间:
[root]#date –s ‘2005/12/5 10:01:00
系统当前的时间改成2005年12月5日,10点01分
这个修改在系统重启后就失效了,因此为了将这个时间永久生效,需要将修改的时间写入CMOS。
看CMOS的时间:
#clock –r
将当前系统时间写入CMOS中去
#clock –w
Linux机器上的时间比较复杂,有各式各样的时钟和选项等等。
机器里有两个时钟。硬件时钟从根本上讲是CMOS时钟;而系统时钟是由内核维护的,它是从1969年末(即传说中的标志Unix时代开端的那个拂晓)开始算起的累积秒数。
在DOS或Mac系统中,起作用的是硬件时钟。遗憾的是,你可能已经发现了,绝大多数电脑时钟都是很不准确的。它们从根本上讲是由小型电池供电的警报器时钟,这种锂电池一般可持续供电三年左右,那时候你系统各大块差不多都已经过时了。
而在Linux系统中,起作用的是系统时钟。在启动时,它靠读取硬件时钟获得计时起点,而不是靠记忆计时。
你可以通过BIOS修改系统硬件时钟,或者如果你不想重起机器,那就用hwclock命令。
比较酷的一点是,当你使用hwclock命令调整硬件时间很多次以后,hwclock就会获取你的时钟推移速率,然后就会把这个信息存在/etc/adjtime里边。以后,你就可以用它来随时更新你的硬件时间,用一条下面的命令:
hwclock –adjust
硬件时钟通常被设置成全球标准时间(UTC),而将时区信息保存在/usr/share/lib/timezone (或者在某些系统中可能是/usr/local/timezone)目录下某个适当的文件中,然后用一个符号链接文件/etc/localtime指向它。
查看硬件时钟用命令:
hwclock –show
重置硬件时钟用:
hwclock –set –date=”1/23/01 22:16:59″
如果需要修改你的时区信息,可以使用tzset命令,如果你系统中没有这条命令,那可以用类似下面的操作:
ln -s /etc/localtime /usr/share/zoneinfo/US/Pacific
要掌握linux的时间操作还有很多东西需要了解,包括用来创建实时时钟文件(/dev/rtc)的内核选项、在内核或TZ时区表中设置时区信息的方法、网络时间服务器功能和夏令时等等。

%d 博主赞过: