您的位置:首页 > 运维架构 > Linux

ARM Linux 的timezoneinfo 数据库的移植

2015-11-18 11:31 656 查看
Linux内核在启动时,将RTC的时间读到系统xtime数据结构中,作为系统时间。在系统关闭时,又将系统时间写入RTC时间。

通常地,Linux内核一般只使用UTC时间,因为Linux内核对时区识别没有相应的处理,它只会将上层传入的关于时区的数据结构转换为UTC时间,LCT时间在内核被设置时,都先转化为UTC时间,再写入xtime数据结构中。

既然内核不负责时区的信息的记录和处理,那么,时区信息的处理在那里呢? GLIBC,对,就是这个C库。

glibc用三个全局变量(用户可以访问)来记录时区信息:*tzname,daylight,timezone*。但是变量并不能永久保存时区信息,因此glic需要有一些时区的数据库保存在系统固定的路径,当要获取关于时区信息的时候,glibc直接从这些数据库文件获取相应的时区和时区转换规则。将UTC时间转换为本地时间。【总之,时区信息的处理是在glibc中,时区数据保存在文件系统中】为了更精确的描述这一点,我们列举date命令来说明这一点。

date 命令会先调用gettimeofday()来获取UTC时间; 然后调用localtime()这个函数将UTC时间转换为本地时间;

但是,在本地时间转换过程中,glibc需要获取本地的时区信息,然后通过时区信息将UTC转换为LCT。

glibc中,这些时区信息的默认保存路径为/user/local/etc/zoneinfo。时区文件默认为localtime。当然用户个以通过TZ和TZDIR的环境变量来修改时区数据库的保存位置。如果时区信息数据库不存在,那么localtime将不会转化UTC到LCT。

在很多嵌入式文件系统中,关于时区信息的数据库并没有移植上去,所以就没办法支持时区的转换。根据上面的描述,glibc总是按照这样的方式读取时区数据库,但如果不存在,就不转换时区时间。为了进行时区转换,我们需要移植timezoneinfo数据库:

我们按照下面的步骤移植:

1.下载tzdata和tzcode:

该软件的下载地址如下: https://www.iana.org/time-zones 下载: tzdata2015g.tar.gz和

tzcode2015g.tar.gz。 tzdata是时区信息的数据库,tzcode是时区的一些命令和用于生成时区数据库的工具。

tz数据库的生成需要一个命令,其为zic。zic是一个二进制文件,我们编译生成的能在target上运行的二进制文件,用该二进制文件生成tz数据库。

2. 解压,修改makefile:

分别将tzdata和tzcode解压,放到通通一个文件中,然后修改makefile:

主要修改:

cc=     arm-linux-gnueabihf-gcc  ##换成交叉编译器即可;
AR=     arm-linux-gnueabihf-ar


其他都不用修改,

3. make 阶段:

按照第二步方式修改,基本没有什么编译错误,很快通过。

3.make install 阶段:

我先编译了x86的tzdata,然后运行了make install命令,看它都作了什么,最后按照同样的步骤在板子上生成了相应的文件。

值得注意的是,这一阶段,主要用我们编译生成的zic命令在target板上进行安装:

./zic  -y ./yearistype -d /usr/local/etc/zoneinfo -L /dev/null africa antarctica asia australasia europe northamerica southamerica pacificnew etcetera backward systemv factory
rm -fr /usr/local/etc/zoneinfo-posix

ln -s zoneinfo /usr/local/etc/zoneinfo-posix || ./zic  -y ./yearistype -d /usr/local/etc/zoneinfo-posix -L /dev/null africa antarctica asia australasia europe northamerica southamerica pacificnew etcetera backward systemv factory

./zic  -y ./yearistype -d /usr/local/etc/zoneinfo-leaps -L leapseconds africa antarctica asia australasia europe northamerica southamerica pacificnew etcetera backward systemv factory


##./zic  -y ./yearistype -d /usr/local/123/etc/zoneinfo -l GMT -p Asia/Shanghai


cp -f iso3166.tab zone1970.tab zone.tab /usr/local/etc/zoneinfo/.
cp tzselect zic zdump /usr/bin/.


安装OK,timezoninfo的数据库便生成;

4.在shell终端中导出环境变量(也可以添加到profile中):

export TZDIR="/usr/local/etc/zoneinfo"
export TZ="Asia/Shanghai"


改变时区,输入date命令验证即可!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: