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. 木有了 ....