今天早晨部门同事告诉我说 nginx 的日志轮换有些问题。我观察了一下细节,发现 nginx 0.7.62 在收到 USR1 信号之后,会同时访问 error.log 和 error.log.1 两个错误日志文件,于是就加入了 nginx 的英文邮件列表,发了信过去。
20:46 作者确认是bug;22:05收到作者发来的补丁。
对比一下 OpenSSL 的官僚作风,我觉得有时个人比团队还好一些。
今天早晨部门同事告诉我说 nginx 的日志轮换有些问题。我观察了一下细节,发现 nginx 0.7.62 在收到 USR1 信号之后,会同时访问 error.log 和 error.log.1 两个错误日志文件,于是就加入了 nginx 的英文邮件列表,发了信过去。
20:46 作者确认是bug;22:05收到作者发来的补丁。
对比一下 OpenSSL 的官僚作风,我觉得有时个人比团队还好一些。
来看这篇文章的人,大都应该同意《Unix编程艺术》中提到的那些观点吧。今天就给大家看一个反例:yum 的 $releasever 变量
在 /etc/yum.repos.d/ 目录下的软件库定义文件中,常常会在 baseurl 的路径中提到 $releasever 这个变量,表示当前发行版的大版本号,但大家知道这个变量是在哪设置的吗?我 grep 了整个 etc 目录都没找到,还是看了 yum.conf 才知道的,是在 yum.conf 文件里 distroverpkg 选项定义的。但这个选项就很有问题:
够变态吧?别人都是直接赋值,或者 include 一个各种变量定义的文件进来,而yum竟然用某个包的属性作为值,违反了“everything is file”的原则。烂!用属性实现,则相关软件必须能读取属性。这个功能对于yum来说无所谓,但是对于别的软件呢?还得特地加入rpm相关的代码才能实现,加入了平台相关特性,降低了可移植性,麻烦。正确的方法是以文件内容作为表示形式。当然了,这样的话用属性就没意义了,yum还能减点肥。
另外,如果/etc/redhat-release 文件和 redhat-release 包标示的信息不同,又该以哪个为准呢?redhat犯过不止一次这样的错误了,比如ifcfg-eth0里可以写DEVICE=eth1之类的。一个信息到处存放,则必将面临各处副本不一致的危险。
有人为心爱的 RedHat 分辩说是为了升级 redhat-release 包之后可以自动升级整个系统,但事实证明 RedHat 的选择一向都是很傻的。为什么不在软件库定义文件中 include 一个表示版本号的头文件,每次大升级的时候更改这个文件呢?
再举个例子:
Debian系里面,内核包的版本维护是利用一个虚拟的某个风格的内核包,比如 linux-image-generic 包,而该包又依赖于 linux-image-2.6.28-15-generic,后者就是真正的内核包,其版本号直接写在包名里,同时也表现在包属性里。系统升级的时候,由于 linux-image 和 linux-image-generic 的依赖关系变动,会依赖于新的 linux-image-2.6.xx-yy-generic 包,自然会装上。而新的 linux-image-2.6.xx-yy-generic 和旧的根本不是一个名字,因此旧的内核包不会“被升级”掉。apt后加入的删除无用包的功能可以指定不删除 linux-image 开头的所有包。
反观 RedHat系 的做法:各个内核包,只有若干个 kernel-<flavor> 的风格包名,版本号作为 RPM 的属性来实现,但是内核这么重大的包又不能轻易用新的代替旧的,于是再给 yum 新增一个 installonlyn 插件(没错,后面还有个n字母,表示数量)来抑制新的高版本 kernel 代替同名旧 kernel 包的动作。
10月2日早晨,去北京西站赶火车,路过龙腾五南边的工地时,突然看见朝霞美景。赶紧掏出手机拍下来

可惜就是手机拍摄光影的效果还是太差,而我恰恰又是对光影的重视超过对色彩的重视的人。唉!
这两天在考虑HTTPS撤销证书的问题,需要学习OpenSSL签X.509证书的流程,其中用到OpenSSL自带的CA.pl和CA.sh脚本。有个很奇怪的现象就是我用ubuntu里的CA.pl -newca可以生成正确的根证书,而同事用CentOS就不行。一起对比了一下配置文件、脚本,发现CentOS里的CA脚本少一句,导致签发出来的所谓根证书其实只是终端用户证书。然后看了一下RHEL 5,也有这个毛病。
于是就去centos网站提交了bug报告
http://bugs.centos.org/view.php?id=3860
另外,发现nginx只有0.8.7以上版本才支持CRL(证书撤销列表),唉……
补录:
下午验证了一下,发现OpenSSL原版源代码就那样。奇怪的是redhat为啥选择了有bug的CA.sh而不是正确的CA.pl呢?
https://bugzilla.redhat.com/show_bug.cgi?id=524780
2010年3月30日补录:
今天有新闻说 OpenSSL 终于发布 1.0 了,我看了一下,我提交的那个 bug 报告也被标记为已修复状态了。
kexec 是一个快速重启动 Linux 系统的工具,其快速主要体现在是从内核开始启动而不是从硬件初始化开始,在当今硬件越来越复杂,开机自检越来越慢的条件下,kexec 可算是提高生产力的一大发明。
kexec 的操作分为两步:
第一步的语法为 kexec -l 内核文件名 –initrd=initrd文件名 –append=内核参数。注意等号必不可少,否则,虽然 kexec 不报错,但是内核启动时会失败;第二部用 kexec -e 即可。通过查看 /sys/kernel/kexec_loaded 的内容可以判断是否已经加载内核。
目前遇到的问题有这几个:
相信很快就会搞明白的。
同时提一下,发行版提供的 kexec 软件包带有 /etc/init.d/ 脚本,可以把正常的 reboot 操作转变成 kexec 重启,从而加快速度。但是对于个人计算机、双操作系统的使用者来说,因为这样越过了 grub 阶段,所以无法正常进入另外一个操作系统。解决方法是修改 /etc/default/kexec 文件中的参数,禁止 /etc/init.d/kexec-load 脚本在关机前加载内核。
进去之后才发现只有一楼是卖器材的,二楼三楼是卖婚纱的。那这个市场其实还没有中关村鼎好那个器材城规模大。看了一圈,都是很贵的东西,找不到便宜又顺眼的“脚架”作为天线的支撑装置,凡是能看上的,价格几乎比电台还贵了。
好玩的是我回头时看到一个店招牌的第一个字:“头”后面几个都挡住了。要知道玩摄影的人们喜欢把镜头称为“头”、把三脚架称为“脚架”的,只有一个“头”字的招牌真是太传神了!
今天编译 Courier-authlib 0.62.2 版本,编译出来都是残废,不支持 MySQL 查询。后来看了 config.log,发现其需要的 mysql_connect 函数在 libmysqlclient 库中找不到。nm 了一下那个库,还真的是没有。
后来到 http://dev.mysql.com 翻文档,说这个函数改成 mysql_real_connect 了。MySQL 真是太过分了,就不知道留个接口给老的代码吗?
这件事也教育我们:没事不要自己编译,浪费时间和精力。
今天帮谢珮英装Oracle RAC和ASM,特地运行了FreeNAS作为iSCSI target,且在没了解过iSCSI和Oracle ASM的情况下安装成功,还发现oracleasm-createdisk的manpage里面的参数顺序是错误的。原来企业级就是在文档里保留部分未修正的错误,然后再偷偷告诉实施工程师。
说正经的,企业级软件考虑得还是很周全的,其集群控制机制,很多是我之前没有想到的。不过也要感叹,虽然我的经验比较少,但多年学习计算机技术的积累和聪明头脑也是难得一见的啊,为啥连找个工作都这么难呢?
1 上次通了六个区,但是包含本区,还不够升级。今天又通联到了2区大连的业余电台,终于凑够了升三级的资格。
2 今天抄收到9区西安的59+的信号,但是他抄收不到我的信号,郁闷啊
3 今天在29.6MHz有两位友台说已经给我回复卡片了。打电话问回笼鸟,说给我回复的卡片已经到了,打算晚饭后去拿,嘿嘿