Gentoo 系统的软件都以源码形式提供给用户,所以安装软件都是以编译源码形式安装。
使用 emerge 软件包管理工具安装软件还是非常方便的(自动解决依赖,安装后的软也能很好的被系统和其他软件识别),但是编辑(二次开发) emerge 下载的源码后,却由于hash的问题无法编译安装。本文以openssh为例,阐述了如何解决此问题。
openssh 是常用的远程登录软件,emerge 默认安装会泄漏该软件版本信息,如图下所示:
从上图可以看到 OpenSSH_5.9p1-hpn13v11lpk, OpenSSL 2.2.2j 10 May 2012 等版本信息(其中,OpenSSL 2.2.2j 10 May 2012 是改过的版本)。
现分析总结出一方法:
1. emerge 下载 openssh 软件包(-f 表示只下载不安装 )
从上图可见,下载了三个软件包并检查了各软件包的(rmd160, sha1, sha256 )
2. 更改下载的软件包信息(不局限于版本)
2.1 更改 openssh-5.9p1.tar.gz 版本信息
从上图可见,用 grep 在解压后的源码中未找到 OPENSSH_5.9p1 版本信息,那么继续查找:
去查找到版本信息的源码文件中更改版本(我把所有OpenSSH改成SSH,5.9改成3.3,p1改成p9 )
另外,上图中 grep 查找关键字 还是不太对,正确的见下图:
改完后,打包更改后的源码成 openssh-5.9p1.tar.gz (替换掉了 emerge -f 下载的 openssh-5.9p1.tar.gz )
2.2 改 openssh-5.9p1-hpn13v11.diff.gz 和 openssh-lpk-5.9p1-0.3.14.patch.gz 中的版本信息
我把所有OpenSSH改成SSH,5.9改成3.3,p1改成p9,hpn13v11改成 -bb- ,lpk 改成 cc 。
这样以来,预计完成后ssh 版本信息会从OpenSSH_5.9p1-hpn13v11lpk 变成 SSH_3.3p9-bb-cc
下图为我更改后的 openssh-5.9p1-hpn13v11.diff.gz
下图是我更改后的 openssh-lpk-5.9p1-0.3.14.patch.gz
3. 更改 portage Manifest
更改后的软件包不可以直接用于 emerge 安装, 无法通过 emerge checksum 检测。
我的方法是 找到 Portage 中记录的该软件包的 rmd160, sha1, sha256 并把其改成修改后该软件包的 rmd160, sha1, sha256 。
这样以来修改过的软件包就可以顺利通过 emerge 的验证了。
Portage 记录 openssh-5.9p1.tar.gz rmd160 ,openssh-5.9p1-hpn13v11.diff.gz 和 openssh-lpk-5.9p1-0.3.14.patch.gz 值的文件是:/usr/portage/net-misc/openssh/Manifest 。
具体方法如下(本文只演示了openssh-5.9p1.tar.gz rmd160, 其他同理)
3.1 用工具 openssl 计算出 openssh-5.9p1.tar.gz rmd160 的 rmd160, sha1, sha256 (还有文件大小哦)
3.2 用计算出的值,替换掉 /usr/portage/net-misc/openssh/Manifest 中的对应值(记得还有文件大小)
3.3 openssh-5.9p1-hpn13v11.diff.gz 和 openssh-lpk-5.9p1-0.3.14.patch.gz
4. 安装修改过的软件
直接运行 emerge openssh 即可(若出错,清自检自己之前的行为 :))
5. 结果(对照本文第一张图, 版本信息从之前的OpenSSH_5.9p1-hpn13v11lpk 变成 SSH_3.3p9-bb-cc)
6. 木有了 ....