Chinaunix首页 | 论坛 | 博客
  • 博客访问: 145121
  • 博文数量: 44
  • 博客积分: 2085
  • 博客等级: 大尉
  • 技术积分: 455
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-31 11:03
文章分类

全部博文(44)

文章存档

2013年(3)

2011年(8)

2010年(11)

2009年(22)

我的朋友

分类:

2010-03-26 14:05:59

我们一般使用“date -s”命令来修改系统时间。比如将系统时间设定成2005年7月26日的命令如下。
  
  #date -s 07/26/2005
  
  将系统时间设定成下午11点12分0秒的命令如下。
  
  #date -s 11:12:00
  
  注意,这里说的是系统时间,是linux由操作系统维护的。
  
  在系统启动时,Linux操作系统将时间从CMOS中读到系统时间变量中,以后修改时间通过修改系统时间实现。为了保持系统时间与CMOS时间的一致 性,Linux每隔一段时间会将系统时间写入CMOS。由于该同步是每隔一段时间(大约是11分钟)进行的,在我们执行date -s后,如果马上重起机器,修改时间就有可能没有被写入CMOS,这就是问题的原因。如果要确保修改生效可以执行如下命令。
  
  #clock -w
  
  这个命令强制把系统时间写入CMOS。

时区问题

UTC是格林威治时间,CST是中国标准时间,很显然CST=UTC+8。基于此,如果你的CMOS是本地时间(也即CST时间),并且你想使用本 地时间,那么你需要做如下修改: shell>sudo vim /etc/default/rcS (找到关于utc的设置) #utc=yes #注释掉,并改为no utc=no #保存退出如果你本地时间还不准确的话,可以这样修改: shell>sudo date -s MM/DD/YY shell>sudo date -s hh:mm shell>sudo /etc/init.d/hwclock.sh restart #将修改后的正确时间写入cmos 修改过程中,可能出现执行命令时,提示距将来时间太早,不用太在意这种提示,重起后在修改。

  Linux默认情况下使用UTC格式作为标准时间格式,如果在Linux下运行程序,且在程序中指定了与系统不一样的时区的时候,可能会造成时 间错误。如果是Ubuntu的桌面版,则可以直接在图形模式下修改时区信息,但如果是在Server版呢,则需要通过tzconfig来修改时区信息了。 使用方式(如将时区设置成Asia/Chongqing):

  sudo tzconfig

  然后按照提示选择 Asia对应的序号,选完后会显示一堆新的提示—输入城市名,如Shanghai或Chongqing,最后再用 sudo date -s “” 来修改本地时间。

  在操作过程中,发现Ubuntu7.10 Server 不支持tzconfig工具,在这种情况下,需要使用tzselect 来修改时间了,使用方式与tzconfig工具差不多 ,只是提示的信息与选择的信息略有不同(与tzconfig不同的是设置完后还需要执行这条指令:sudo cp /usr/share/zoneinfo/Asia/ShangHai /etc/localtime)。示例:

  tzselect

  按照提示进行选择时区,然后:

  sudo cp /usr/share/zoneinfo/Asia/ShangHai /etc/localtime

  执行

  sudo ntpdate cn.pool.ntp.org

  cn.pool.ntp.org是位于中国的公共NTP服务器,用来同步你的时间(如果你的时间与服务器的时间截不同的话,可能无法同步时间哟,甚至连sudo reboot这样的指令也无法执行)。

让linux自动同步时间
vi /etc/crontab 
加上一句: 
00 0 1 * * root rdate -s time.nist.gov

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

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


阅读(5485) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~