Total Pageviews

Saturday 27 October 2012

Linux的时钟问题

/etc/localtime应该是一个文件,在RHEL6上,更是必须如此。
RHEL6对时钟的处理与RHEL5不同。
RHEL5的系统时钟,是在系统启动时——内核初始化完,由init初始化OS环境时,由/etc/rc.d/rc.sysinit从BIOS中读取到系统的,在关机时,由/etc/rc.d/halt将系统时钟写回BIOS时钟。
而RHEL6的时钟,则是由内核初始化时,从BIOS中读取的:
/var/log/messages-20120506:May  5 07:35:16 hostname kernel: [    2.306873] rtc_cmos 00:03: setting system clock to 2012-05-04 23:34:14 UTC (1336174454)
在关机时,由/etc/rc.d/halt脚本将系统时钟写回BIOS。
由内核来读取时钟,就以为着,在设置系统时钟时,/etc/localtime文件指向的/usr/share/zoneinfo/Asia/Shanghai 还不可用,因为我们的/usr通常都是单独分区的,这个时候还没有挂载。所以导致系统时钟设置出错。
重现这个问题的时候,会发现一个怪圈,即每重启一次,时钟就会多差8个小时——因为设置时钟时/etc/localtime不可写,回写时钟是,/etc/localtime是能用的。一来一回,就差上了16个小时。
在RHEL5上,有一个硬件时钟是UTC时钟还是localtime时钟的问题。(这个问题是怎么来的?)Windows系统没有这个问 题,Windows将“本地时钟”写入BIOS。因为BIOS时钟没有时区概念,所以当我们装的Windows系统时,进BIOS看到的时钟,总是准确 的。
当我们安装的RHEL5时,假如我们在/etc/sysconfig/clock中,写入了UTC=true,那么,BIOS中的时钟是UTC时钟,与北京时钟差8个小时。当UTC= false时,BIOS中的时钟为本地时钟。
默认地,/etc/sysconfig/clock中,统一设置了UTC=false,即BIOS中的时钟是本地时钟。(这样做,也是因为担心一些附属硬件从BIOS中读取时钟,比如远程管理卡、RAID卡里,因了读取分析日志方便)。
而当使用RHEL6时,/etc/sysconfig/clock中,默认已经没有了UTC=、与ARC=的设置,而且/etc/rc.d /rc.sysinit中也没有了从BIOS读取时钟的命令,/etc/rc.d/halt中,将系统时钟写回BIOS的方式也不再去读取分析/etc /sysconfig/clock文件,即像Windows一样,统一使用系统本地时钟,将本地时钟写入BIOS。
Linux多选的时钟机制本来有些容易让人迷茫,而RHEL6统一了这一问题,统一地使用本地时钟。
另外,对/etc/localtime不建议使用link的原因,还有一个,就是这个文件在一些系统上是link,在一些系统是文件(在RHEL是文件),不同的管理员,有不同的习惯,很有可能在调整的时候,会破坏系统的zoneinfo文件。
时钟是个参照系.
-----------------------------------------------
 修改Linux系统的时区

1. 查看当前时区
cat /etc/sysconfig/clock
2. 复制相应的时区文件,替换系统默认时区
#cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime
对于中国服务器:
#cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime