之前测试部门一直反馈,安装了某包之后系统的时间会被修改,原因是系统的时区被修改了,时间戳没有变。
可是我测试从来没有发生过这样的问题,总怀疑是某个cron或者系统监控修改了时区,查了半天还是没有找到。
于是给测试部说将时区有问题的机器重装,放几天看看会不会被修改。过了3天,一切正常。
只好开始查找是谁修改了时区。
现有的线索就是时区被修改了,/etc/localtime这个文件被修改了。
最初的想法是安装一下systemtap,监控那个进程动了这个文件。然后在安装systemtap之后发现时区已经被修改。测试了2台机器都是这样。原因很明显是哪个rpm动了手脚。
既然是rpm问题,不外乎两个原因
rpm安装时直接覆盖了文件
rpm中的脚本修改了这个文件
如果是第一个比较好找原因,如果是第二种,那就耗费点体力。所幸的是,原因是第一个。下面说说怎么回事。
如果是rpm安装包覆盖文件,这个很好找,看看/etc/localtime这个文件是那个rpm包的。执行下面命令可以得到:
[root@test ~]# rpm -qf /etc/localtime
glibc-2.12-1.149.el6.x86_64
刚好的更新了这个包。这里确定一定时这个包的原因很简单,如果是其它安装包,肯定会引起文件冲突而安装失败。
现在需要看这个包的spec文件。rpmrebuild这个工具可以看到已安装rpm的spec(大部分信息可以看到),这个工具可以去官网下载。
执行下面命令:
rpmrebuild -e glibc-2.12-1.149.el6.x86_64
可以发现spec文件中有这么一行:
%config(noreplace) %attr(0644, root, root) %verify(not md5 size mtime) “/etc/localtime”
%verify这个参数是做认证的,这里是不对md5 size mtime做验证,%verify的认证有以下几种:
group: 认证文件的组
maj: 认证文件的主设备号
md5: 认证文件的MD5
min: 认证文件的辅设备号
mode: 认证文件的权限
mtime: 认证文件最后修改时间
owner: 认证文件的所有者
size: 认证文件的大小
symlink:认证符号连接
很可能就是这句对文件做了修改,将其中的一台虚拟机还原到最初状态,查看/etc/localtime文件,结果如下:
[root@test ~]# ll /etc/localtime
lrwxrwxrwx. 1 root root 33 7月 14 16:53 /etc/localtime -> /usr/share/zoneinfo/Asia/Shanghai
这里是一个软连接,所以这里%verify不通过,然后将这个文件覆盖。
这也解释了为何我测试的时候总是没有问题,因为我测试环境中/etc/localtime这个文件并不是一个软连接。
解决办法也就是这样,在修改/etc/localtime文件是不要软连接,直接覆盖文件就行。
如果是rpm中的脚本修改了/etc/localtime文件,那就看看安装了那些包,一个一个找吧。
——————————————————
我又厚颜无耻的追加一段。
上一面说了为何系统时钟被修改了,当我在那台测试机上将/etc/localtime 换成一个文件(不在是一个软连接),安装glibc之后发现时区还是被修改了。
庆幸的是这次我只升级了glibc,连同升级的是glibc-common包。那么修改系统时区的肯定就是这两个包了。
下面是我的测试过程:
1.下载glibc-2.12-1.149.el6.x86_64.rpm和glibc-common-2.12-1.149.el6.x86_64.rpm的安装包
2.执行:cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
3.执行:rpm -ivh –force glibc-2.12-1.149.el6.x86_64.rpm
4.发现系统时区没有被改变
5.执行:rpm -ivh –force glibc-common-2.12-1.149.el6.x86_64.rpm
6.这是时区被修改了。
7.查看glibc-common-2.12-1.149.el6.x86_64.rpm的spec文件(这个文件怎么得到上面说明了),里面有这么一句:%triggerin -p /usr/sbin/tzdata-update — tzdata,也就是执行了 /usr/sbin/tzdata-update这个命令。
/usr/sbin/tzdata-update这个文件的说明在这里:http://www.g-loaded.eu/2009/10/07/how-to-change-the-timezone/
原因就是测试机/etc/sysconfig/clock文件中ZONE=”America/New_York”,这里设置的数去不对。修改为:ZONE=”Asia/Shanghai” 。然后执行/usr/sbin/tzdata-update 就可以。
0 条评论。