2011年3月9日星期三

CentOS(RHEL)5 Mock build 的別權模擬編譯環境下修改再編譯的 dependency 問題

CentOS(RHEL, Fedora) 的 RPM base 下 mock build 的模擬編譯環境應用技術不是特許新鮮物, 一般終端電腦用戶其實也無需認識其編譯技術理念(尤其是習慣使用 Windows 的門徒), 模擬編譯環境適合編程人員或系統管理員及高階企鵝族, 在下列所提及的實際問題情況前要瞭解 Mock 應用技術可參考 Fedora Project 內 Mock 資料。Mock build 的模擬編譯環境一般都是用於再編譯(Re-compilation)處理, 例如將 abc.src.rpm 源碼套件再編譯打包到其他的 RPM base 系統(RHEL, Fedora 等等), 此類再編譯作業並不會有太多問題發生, 多數情況都是空間容量不足、repository 連線或 mock 權限等等, 在網海上沖積的參考資料全部都是基本的再編譯作業或是跨平台再編譯, 沒有難度可言一試即成。

不過在實際情況下, 如果要 mock 編譯的是修改的源碼套件, 而需要安裝利用自家新的編譯後已修改源碼的程式開發庫(devel library)再編譯其他軟體的話, 卻是另一個腦惱問題, 因為 mock-yum 只會利用預設的 repository 來安裝 chroot 環境的軟體需求, 執行 mock 時是無法強制 mock-yum 略過或安裝自家修改的軟體套件, 也許專才會認為新的 mock 版本不是已新增 --install 功能嗎?! 可惜在實測中(EPEL5 內的 mock-1.0.7-1.el5)發現...就筭執行 --no-clean --install aa-2.i386.rpm aa-devel-2.i386.rpm 然後再執行 --no-clean --rebuild bb.src.rpm(依賴 aa-devel-2.i386.rpm)卻是無法略過 mock-yum 的強蠻檢查, 如果系統預設 repository 只得 aa-1.i386.rpmaa-devel-1.i386.rpm, mock 就會傳回 ERROR 訊息的 "Cannot find build req aa-devel >= 2. Exiting" 而編譯失敗終止, 此問題是 mock python script 程式碼的瑕玼, 無論更新的版本亦無法以指令直接解決, 企鵝族及編程人員或多或小都會有自家修改的軟體需要再編譯, 最常見的是 freetype、firefox、xulrunner 等等。

mock build 編譯 firefox-3.6.14 時 mock-yum 無法找到 xulrunner-devel-1.9.2.14 而編譯失敗
唯一輕鬆可以解決的辦法是將自家更新的軟體套件在編譯的本機(或網絡)電腦內創建一個 local repository, 修改 mock 編譯預設文件檔案(例如 centos-5-i386.cfgcentos-5-x86_64.cfg)加入自家的 local repository 位置, 那樣在執行 mock build 時 mock-yum 就會因編譯需求自動在 chroot 環境內安裝自家的修改軟體庫了, 這是最方便的辦法, 適合多人網絡的模擬編譯環境使用而排除誤用舊軟體庫版本的問題, 只需在 mock build 前注意 local repository 的更新就可搞定, 此法亦適用於 x86_64 下跨平台編譯 i386/i686。

掛建 local repository 新增已修改軟體庫活用 mock 模擬編譯:
實機使用 CentOS 5.5 x86_64 的 mock-0.6.13-1.el5_2.3
安裝 mock 及配置:
  • yum 在線安裝 mock 軟體
    # yum install mock
  • 用戶帳號(例如 aa_user)加入 mock 群組
    # usermod -G users,mock aa_user
實例: mock 編譯 xulrunner-1.9.2.14 及 firefox-3.6.14
  • 首先自行準備好 xulrunner-1.9.2.14 及 firefox-3.6.14 的 src rpm 源碼套件
    例如: 借用舊的 xulrunner-1.9.2.13-3.el5.src.rpmfirefox-3.6.13-3.el5.centos.src.rpm 解壓到 ~/rpmbuild/SOURCE/ 目錄內自行修改(或針對性功能...在此省略)後 rpmbuild -bs --nodeps --define 'dist .el5' spec_filename.spec 指令打包成 xulrunner-1.9.2.14-0.el5.src.rpmfirefox-3.6.14-0.el5.src.rpm
  • 修改 mock 配置新增 distro 編號 '.el5'
    登入管理員權限
    編輯 /etc/mock/centos-5-x86_64.cfg/etc/mock/centos-5-i386.cfg
    #%dist 下新增一行
    %dist .el5
    儲存文件
mock 編譯 xulrunner:
  • 先執行 mock build 編譯 xulrunner(編譯 firefox 需要 xulrunner 及 xulrunner-devel)
    $ mock -r centos-5-x86_64 --arch=x86_64 --resultdir=/home/tester --autocache rebuild xulrunner-1.9.2.14-0.el5.src.rpm
    build xulrunner 超長時間...要有耐性惡玩(無耐性的可以試 freetype 及 fontconfig)
  • 如果要額外編譯 i386/i686(32bit) 系統的話
    $ setarch i386 mock -r centos-5-i386 --arch=i386 --resultdir=/home/tester --autocache rebuild xulrunner-1.9.2.14-0.el5.src.rpm
  • 編譯後結果 log 及 rpm 會產生在用戶個人目錄內 /home/tester/
    xulrunner 及 xulrunner-devel rpm 產生後就可以準備編譯 firefox。

創建本機 local repository(例如 x86_64):
  • yum 在線安裝 createrepo 軟體
    # yum install createrepo
  • 建立 local repository 目錄(例如 /opt/localrepo.x86_64//opt/localrepo.i386/)
    # mkdir /opt/localrepo.x86_64
  • 將 mock 編譯後的 xulrunner 及 xulrunner-devel rpm 放置到 local repository 目錄內
    # cp -v /home/tester/xulrunner-*x86_64.rpm /opt/localrepo.x86_64/
  • 在 /opt/localrepo.x86_64/ 目錄內創建 repository
    # createrepo -o /opt/localrepo.x86_64/ /opt/localrepo.x86_64/

修改 mock config 預設文件, 加入 local repository 條件:
登入管理員權限
編輯 /etc/mock/centos-5-x86_64.cfg(32bit 的是 centos-5-i386.cfg)
[updates] section 後及 [groups] 前新增如下
[local]
name=local
baseurl=file:///opt/localrepo.x86_64/

儲存文件

mock 編譯 firefox:
  • $ mock -r centos-5-x86_64 --arch=x86_64 --resultdir=/home/tester --autocache rebuild firefox-3.6.14-0.el5.src.rpm

  • 如果要額外編譯 i386/i686(32bit) 系統的話(需要自行準備 local repository 目錄 /opt/localrepo.i386/)
    $ setarch i386 mock -r centos-5-i386 --arch=i386 --resultdir=/home/tester --autocache rebuild firefox-3.6.14-0.el5.src.rpm
  • 編譯後結果 log 及 rpm 會產生在用戶個人目錄內 /home/tester/

完成後, 使用 mock 編譯後的 xulrunner 及 firefox rpm 打包套件就可以安裝到 CentOS 5 系統中使用。
以後需要更改軟體再編譯的話, 只需要更新 /opt/localrepo.x86_64/opt/localrepo.i386 的 repository 內容後就可以立即 mock 編譯了。

備註:
  • mock build 要利用 mock-yum 在線下載系統軟體來掛建 chroot, 如要加快下載速度, 可以利用 proxy 或建立同步的系統及更新 local repository(又是另一個題外話)。
  • mock build 模擬編譯時會在 /var/lib/mock/ 目錄內掛建 chroot, 注意會耗用很大容量空間, 完成所有 mock 編譯程序後 /var/lib/mock/ 目錄內的所有文件檔案都可以刪除清空以釋放硬碟空間。
  • 利用 mock build 模擬編譯好處是不用在自己的電腦內安裝大量的編譯需求套件(例如大量的 devel library), 亦可以排除使用 root 權限編譯的安全(或錯誤路徑)問題, 還可以支援不同 arch 下 cross compilation, 唯一缺點是...mock-yum 下載實在十分耗時, 所以對於大量使用 mock 的編程人員或管理員則建議建立同步的系統及更新 local repository, 減輕耗用網絡頻寬及下載時間, 而個人用戶的話可以暫時使用 proxy 來加速下載, 其他的需求視乎個別情況修改。
  • 在 x86_64 的系統內部分軟體還需要依靠 i386 的架構, 留意是否需要同時編譯 x86_64 及 i386。

2011年3月7日星期一

RHEL6 kernel 開源碼整合齊人包, Redhat 無私顯見私

RHEL6 的推出令到不小企業注意到舊系統的生命週期造成系統升級及遷移的進程企劃, 評估測試是最必然的事, 雖然 CentOS 社群仍未釋出(未知預期)開源碼企業社群版, 而另一個基於 RHEL6 的社群版 Scientific Linux 6 已經官方釋出, 但是眾多 RHEL6 的嘗鮮用戶或許仍不知道 Redhat 公司在 RHEL6 內改變了開源策略, RHEL6 內 kernel 的源碼已經變成了齊人包, 以往 RHEL 釋出的 kernel 所有(數十個)補丁修正文件現在全部被 Redhat 烹煮到 kernel 源碼內, 例如: RHEL6 的 kernel-2.6.32-71.el6.src.rpm 源碼套件內再沒有獨立的補丁修正文件(patch), kernel 源碼已整合成 linux-2.6.32-71.el6.tar.bz2

RHEL6 的 kernel src 源碼套件 kernel-2.6.32-71.el6.src.rpm 已整合「所有」patch
The Register:
Red Hat: 'Yes, we undercut Oracle with hidden Linux patches'

Redhat 的 CTO Brian Stevens 解說這次策略的改變明顯是衝著 Oracle 及 Novell 提供的支援服務, 將源碼整合打包並沒有違反 GPL 開源碼條款, 只針對競爭對手的商業客戶服務...云云。

Redhat 此法無私顯見私的改變對於個別終端用戶應該是不會有多大影響(可能還不知道吧), 不過對企鵝人甚至開發社群(CentOS 或 Scientific Linux)等等可能有產生源碼追蹤的問題, 尤其是對 kernel 查證源碼或特定環境改造都會更困難, 考慮升級的用戶或管理群應更詳細評估此情況的未知影響。