星期日, 十一月 04, 2007

gentoo下给fvwm打patch[转]

最近使用gentoo+fvwm, 遇到一个问题,每当我在fvwm下工作一两个小时(时间长短不是关键因素,只是一个现象)之后,就会出现鼠标失灵的现象,这时我在桌面上单击鼠标左键,鼠 标指针就会变成等待状态,然后fvwm就陷入了假死状态,之后我只好Ctrl+Alt+Backspace退出X,然后重新启动,试图以此修复问题,但是 我发现这样重新启动是没有任何作用的,只要在桌面上单击鼠标左键,fvwm马上又陷入假死状态,于是我怀疑是fvwm的问题,但是我还不能够确定问题出在 哪里,于是我再次退出fvwm。执行下面的命令卸载fvwm:

emerge -Ca fvwm


然后重新emerge fvwm,开启debug功能:

USE="debug" emerge -av fvwm


这之后,我使用下面的命令启动X,进入fvwm:

startx > startx.log 2>&1 >/dev/null


记 录日志。这样进入fvwm不久,问题又来了,于是退出。查看startx.log文件,发现有大量的处理X事件的日志,网上搜了一下,在fvwm- worker的邮件列表中找到了一个和我有类似问题的人解决办法,修改fvwm源码中FlushMessageQueue函数的实现,包括修改超时值和处 理超时请求的策略两个方面,按照他的方法,我修改了源码,然后为了维护gentoo软件安装的一致性,我仍然借助emerge工具集进行编译,然后安装, 具体过程如下:

首先,emerge默认是采用源码编译安装的方式安装软件的,而在将源码的压缩包下载到本地之后,先要根据以下两个文件检查该源码压缩包的完整性:

digest
Manifest


这两个文件在每个软件的portage目录下面都有,可以使用emrege --sync进行更新。

在这两个文件中,存放的是安装这个软件所需的所有压缩包的散列值,包括MD5,RMD160, SHA1, SHA256
几种哈希算法的散列值。

因此使用emerge方式重新编译安装自己打过patch的fvwm的方式如下;


tar jxvf fvwm-2.5.19.tar.bz2
cd fvwm-2.5.19
修改代码
mv fvwm-2.5.19.tar.bz2 fvwm-2.5.19.tar.tar.bz2.bak
tar jcvf fvwm-2.5.19.tar.bz2 fvwm-2.5.19/
rm -fr fvwm-2.5.19/


之后就是对新的fvwm源码包计算各个哈希值,更新digest和Manifest文件。这里介绍openssl,一个非常强大
加密软件包,里面包含了各种常用的加密和哈希算法。比如,如果需要计算一个文件的MD5哈希值,只需简单的输入
下面的命令即可:


mallory#openssl dgst -md5 your_file


然后你就可以得到该文件的MD5值,是不是很方便呢?而且关键是它还能够帮你计算SHA1, SHA2, SHA256, SHA512, RMD160等等很多的类型,因此如果需要计算这些值,强烈建议使用openssl。

好了,撤远了,下面接着刚才的步骤说,现在需要更新digest文件和Manifest文件中fvwm-2.5.19.tar.bz2对应的哈希值和文件大小信息,如下:

#openssl dgst -md5 /usr/portage/distfiles/fvwm-2.19.tar.bz2
#openssl dgst -ripemd160 /usr/portage/distfiles/fvwm-2.19.tar.bz2
#openssl dgst -sha1 /usr/portage/distfiles/fvwm-2.19.tar.bz2
#openssl dgst -sha256 /usr/portage/distfiles/fvwm-2.19.tar.bz2


这里没有将输出列出来,其实你运行上面的指令就会看到相应的输出,很醒目,不需提示即可知道是什么意思.

然后使用这些计算得来的值更新digest和Manifest。
之后还得更新文件大小字段。

然后还需要更新Manifest文件中digest文件的相应的MD5, RMD160, SHA256散列值。方法同上,不再细数。

做好了上述工作之后,终于可以重新emerge我的fvwm了。由于在本地的源码目录中已经有fvwm的源码包,并且在修改代码并重新打包之后,已经根据新的包更新的digest和Manifest两个emerge用来判断包完整性的文件,因此
当我输入emerge -av fvwm时,emerge直接从本地源码包路径(默认是/usr/portage/distfiles/)中得到源码压缩包,计算包的各个散列值,和digest文件以及Manifest文件中的散列值做比较,如果都相同,则解压源码包,
编译,安装。

至此,按照这个方法,我成功的给fvwm加上了一个patch。目前fvwm运行正常,已经经过了大概四个多小时了,这个之前是从没有过的,呵呵。虽然还不能确定我的这个patch是否正确,但是至少到目前为止,还不能说明它有问题,这已经够了。呵呵。

0 意見: