文章搜集自:[url]http://publishblog.blogchina.com/blog/tb.b?diaryID=2745968[/url]
一、背景
机器装的是
busybox
,使用的是最小集合的
linux
。硬件时钟是本地时间,而内核时钟是
UTC
时间,没有设置时区,也没有任何时区设置的选项。
busybox
,使用的是最小集合的
linux
。硬件时钟是本地时间,而内核时钟是
UTC
时间,没有设置时区,也没有任何时区设置的选项。
二、需求
这台机器需要定时进行
NTP
时间同步。同步之后显示给用户的是本地时间。
NTP
时间同步。同步之后显示给用户的是本地时间。
三、过程
1
.时区的支持
(
1
)
hwclock
1
)
hwclock
为了查看硬件时钟是否为本地时间,运行命令
hwclock –r
。结果系统提示:“
Could not open RTC: No such file or directory
”,即找不到
RTC
文件。
hwclock –r
。结果系统提示:“
Could not open RTC: No such file or directory
”,即找不到
RTC
文件。
(
2
)
/dev/rtc
2
)
/dev/rtc
由于内核在编译过程中没有提供
RTC
支持,需要重新编译内核(或为内核增加一个
module
)。方法为,在
make menuconfig
阶段,选中“
Character device
”的“
Enhanced Real Time Clock Support
”一项的支持。
为内核增加了该模块后,目录
/proc/drive/
下已出现了
rtc
文件,
cat
也能查看到正常的内容。但
/dev/
目录下仍没有
rtc
文件。
/proc/drive/
下已出现了
rtc
文件,
cat
也能查看到正常的内容。但
/dev/
目录下仍没有
rtc
文件。
于是通过
mknod
命令在
/dev
目录下增加
rtc
文件。通过
man rtc
可以得知,
RTC
为只读字符设备,主
10
,从
135
。因此命令为“
mknod /dev/rtc c 10
135
”。命令执行完毕后,
/dev
下成功生成了
rtc
文件。
mknod
命令在
/dev
目录下增加
rtc
文件。通过
man rtc
可以得知,
RTC
为只读字符设备,主
10
,从
135
。因此命令为“
mknod /dev/rtc c 10
135
”。命令执行完毕后,
/dev
下成功生成了
rtc
文件。
运行
hwclock –r
,能够看到硬件时间为本地时间。通过
date
命令查看系统时间,却为
UTC
时间。这说明系统没有进行本地时间的设置。
hwclock –r
,能够看到硬件时间为本地时间。通过
date
命令查看系统时间,却为
UTC
时间。这说明系统没有进行本地时间的设置。
(
3
)
/etc/localtime
3
)
/etc/localtime
Linux
的系统时区是通过符号连接
/etc/localtime
来得到的。可以通过
tzset
命令来设置时区。如果没有该命令,可以通过命令“
ln –s /etc/localtime /usr/share/zoneinfo/Asia/Shanghai
”来将时区设置为亚洲的上海。
由于最初构建系统的时候没有包含
zoneinfo
信息,因此
/usr/share
目录下不存在
zoneinfo
目录及其文件。所以将包含
zoneinfo
信息的机器的
/usr/share
目录下的整个
zoneinfo
目录复制到本机的
/usr/share
目录下。
zoneinfo
信息,因此
/usr/share
目录下不存在
zoneinfo
目录及其文件。所以将包含
zoneinfo
信息的机器的
/usr/share
目录下的整个
zoneinfo
目录复制到本机的
/usr/share
目录下。
通过
date
命令检查时间,发现已变成了正常的本地时间:
date
命令检查时间,发现已变成了正常的本地时间:
Mon Aug 29 13:14:29 CST 2005
(
4
)
/etc/sysconfig/clock
4
)
/etc/sysconfig/clock
该配置文件可用来设置用户选择何种方式显示时间。如果硬件时钟为本地时间,则
UTC
设为
0
,并且不用设置环境变量
TZ
。如果硬件时钟为
UTC
时间,则要设置
UTC
为
1
,并设置环境变量
TZ
(或配置文件
/etc/TZ
)为时区信息,如“
Asia/Shanghai
”。
我机器的硬件时间为本地时间,因此该配置文件内容为:
ZONE=”Asia/Shanghai”
UTC=0
ARC=0
2
.
NTP
同步设置
(
1
)
ntpdate
1
)
ntpdate
如果只是通过
NTP
服务器同步系统时间,可以使用命令
ntpdate
(位于
/usr/sbin/
下,使用
ntpd
会提供更佳全面的功能)。
Ntpdate
用到的库包括:
libcap.so.1 => /lib/libcap.so.1
、
libc.so.6 => /lib/tls/libc.so.6
、
/lib/ld-linux.so.2 (0xf6fdf000)
。将该命令文件及相关的库都复制到这台机器上,并找到一个最近的稳定的
NTP
服务器。我使用的是
nets.org.sg
(
IP
:
203.117.180.36
)。运行命令“
ntpdate 203.117.
180.36
”,再通过
date
命令查看时间,发现时间已更新。
NTP
服务器同步系统时间,可以使用命令
ntpdate
(位于
/usr/sbin/
下,使用
ntpd
会提供更佳全面的功能)。
Ntpdate
用到的库包括:
libcap.so.1 => /lib/libcap.so.1
、
libc.so.6 => /lib/tls/libc.so.6
、
/lib/ld-linux.so.2 (0xf6fdf000)
。将该命令文件及相关的库都复制到这台机器上,并找到一个最近的稳定的
NTP
服务器。我使用的是
nets.org.sg
(
IP
:
203.117.180.36
)。运行命令“
ntpdate 203.117.
180.36
”,再通过
date
命令查看时间,发现时间已更新。
四、相关知识
Linux
时钟
Linux
机器里有两个时钟,一个是硬件时钟(
CMOS
时钟),一个是内核时钟。硬件时钟是电池驱动的,通过专门的芯片工作。可以通过
BIOS
设置屏或一些系统命令(如
hwclock
)进行设置。内核时钟是由内核维护的,启动时从硬件读取时间,之后独立运行。
RTC
(
Real Time Clock
)
即
Linux
实时的时钟驱动,通常
它们被嵌在计算机的芯片中,也有一些是在主板上使用Motorola MC146818(或clone)实现的。该硬件设备可映射到/dev/rtc,供root编程访问。
NTP
(
Network time protocol
)
NTP
为一种网络时间协议,是一种确保网络上的主机调整时间的方法。很多地方都会提供
NTP
服务器(
ISP
或网管,也可以在
[url]http://www.eecis.udel.edu/~mills/ntp/clock[/url]1a.html
寻找一个最近的服务器)。
转载于:https://blog.51cto.com/liujia/121125