Gentoo Distcc 文件
1.
介紹
什麼是 distcc?
Distcc 是個設計讓您可以在不同的電腦上編譯程序的程式。它包含了伺服器端
distccd 以及客服端 distcc 程式。經由一些小小的設定,
Distcc 將可以配合著 ccache
以及 Portage 還有 Automake 一起運作。
使用 distcc 來 bootstrap
如果您計畫用 distcc 幫助您的 Gentoo bootstrap,請記得閱讀
使用 distcc 來 bootstrap 這一節,它位於本文件的下方。
2.
設定
相依性
在開始之前,所有在您網路裡使用 Distcc 的電腦必需有相同的 GCC 版本。若是混著
3.3.x (x 為版本號) 不會有問題,但是若是混著 3.3.x 以及 3.2.x 可能會導致
你的程式有錯誤。
安裝 Distcc
在您開始安裝 distcc 之前,這裡有許多選項您該知道的。
Distcc 內建了圖型介面的監視器讓您監視從您的電腦傳送出去編譯的程序。如果您使
用 Gnome 的話,在您的 USE 參數裡加入 "gnome"。如果您不使用 Gnome 但您還是想
要有一個監視器功能,則請在您的 USE 參數裡加入 "gtk"。
原始碼 2.1: 安裝 distcc |
# emerge distcc
|
設定讓 Portage 使用 Distcc
這個設定也非常簡單,您只要跟著下列步驟既可:
原始碼 2.2: 整合 Distc 和 Portage |
# emerge distcc
# nano -w /etc/make.conf
MAKEOPTS="-jN"
FEATURES="distcc"
|
指定使用的主機
使用 distcc-config 來設定主機列表。下面的例子將告訴您如何設定主機列表:
原始碼 2.3: 主機列表定義範例 |
192.168.0.1 192.168.0.2 192.168.0.3
192.168.0.1/2 192.168.0.2 192.168.0.3/10
192.168.0.1:4000/2 192.168.0.2/1 192.168.0.3:3632/4
@192.168.0.1 @192.168.0.2:/usr/bin/distccd 192.168.0.3
|
這看起來可能有點複雜,不過大部分的人只需要用第一或第二行的設定既可。
因為一般的人不會使用到第三和第四行的設定方式,我將
指引您至 distcc
的文件,請自行查看更多的資訊。
舉例來說,我們要設定上面範例中的第一行:
原始碼 2.4: 設定主機範例 |
# /usr/bin/distcc-config --set-hosts "192.168.0.1 192.168.0.2 192.168.0.3"
|
依照您的需要修改 /etc/conf.d/distccd,並確認 --allow 選項只
允許您信任的主機。為了增強安全性,你應該使用 --listen 選項告訴 distcc 監
聽哪個 IP。更多的資訊請參閱
Distcc Security Design。
重要:
使用 --allow 及 --listen 相當重要。請閱讀 distccd 手冊頁及上面的安全文件取得更多
資訊。
|
再來便是在所有有安裝 distcc 的電腦中,啟動 distcc 服務:
原始碼 2.5: 啟動 distcc 服務 |
# rc-update add distccd default
# /etc/init.d/distccd start
|
設定讓 Automake 使用 Distcc
這個設定在某些情況下比 Portage 設定還要簡單些。您只要把您的 PATH 參數
加入 /usr/lib/distcc/bin,並確定把它放在包含 gcc 的目錄
/usr/lib/distcc/bin 之前既可。然而,這裡您要注意一個地方,如果
您使用 ccache 的話,您將需要把 distcc 放在 ccache 的後面。像這樣:
原始碼 2.6: 設定您的 path |
# export PATH="/usr/lib/ccache/bin:/usr/lib/distcc/bin:${PATH}"
|
然後,在您平常時輸入 make 的地方,請改為使用 make -jN (N 是一個整
數)。N 通常用來指的是您全部用來編譯程序的電腦。建議您自行測試並找出一個最適合您
的一個數值。
3.
跨平台編譯
跨平台編譯的註釋
跨平台編譯 (Cross-Compiling) 是使用一種架構來為另一種架構編譯軟體。簡單的來說,
您可以將它想為利用一台 Athlon (i686) 的電腦來為一台 K6-2 (i586) 的電腦編譯
程式,或是使用一台 Sparc 來幫 PPC 編譯程式。
跨平台編譯介紹
如果您想要試試跨平台編譯,您可以 emerge 套件 crossdev。我無法提供相關支援,因為這個套件不是我寫的,但是這是接觸跨平台編譯一個好的起始點。
4.
使用 Distcc 來 Bootstrap
第一步:設定 Portage
使用 Gentoo Linux LiveCD 為您的新電腦開機並依著 安裝說明
直到 步驟至 bootstrap 部分。接下來請照著下面的方法做修改
讓 Portage 使用 Distcc:
原始碼 4.1: 初步設定 |
# nano -w /etc/make.conf
FEATURES="distcc"
MAKEOPTS="-jN"
|
原始碼 4.2: 設定您的路徑 |
# export PATH="/usr/lib/ccache/bin:/usr/lib/distcc/bin:${PATH}"
|
第二步:安裝 Distcc
在您開始安裝 distcc 之前,一個叫作 distcc 的使用者必需先加至
/etc/passwd:
原始碼 4.3: 建立一個叫 distcc 的使用者 |
# echo "distcc:x:240:2:distccd:/dev/null:/bin/false" >> /etc/passwd
|
重要:
要注意的一點就是這是非常差的新增使用者方法。我們在這裡使用的原因是在這個安裝階
段時,沒有 useradd 工具(常常用來新增使用者的工具)。
|
安裝 distcc:
原始碼 4.4: 安裝 Distcc 至新的電腦 |
# USE='-*' emerge --nodeps sys-devel/distcc
|
第三步:設定 Distcc
執行 distcc-config --install 來設定 distcc:
原始碼 4.5: 最後的 distcc 設定 |
# /usr/bin/distcc-config --set-hosts "localhost host1 host2 host3 ..."
|
distcc 現在應該可以 bootstrap 了!請繼續接著官方的安裝指南,並請別忘了
在emerge system 之後再重新 emerge distcc,這是為了確保所有您要的
依存性套件都有安裝。
注意:
請記住,在 bootstrap 和 emerge system 時,distcc 可能不會被使用,這是因
為某些 ebuilds 或是套件並無法好好的在 distcc 編輯,所以它們取消使用 distcc。
|
5.
解決問題
Mozilla 和 Xfree
在您 emerge 套件時,您會發現它們並不會平行編譯。這是因為 Mozilla 和 Xfree 的
.ebuilds 開發者關閉了平行編譯的功能,因為平行編譯將會造成錯誤。
有時候 distcc 在某個套件上會發生編譯錯誤的問題,如果您遇到這個問題,請
通知我們。
混著 hardened-gcc 和非 hardened-gcc 主機會造成錯誤
如果您計畫在有
PaX/hardened-gcc 和沒有 hardened-gcc 的主機群間進行平行編譯,您將會有許多
的問題。
這個問題的解決方法在於,您必需在有 PaX/hardened-gcc 的主機上執行
hardened-gcc -R,或著是在該主機的核心裡啟動 PaX 保護並 emerge hardened-gcc
。這兩種都是很好的解決辦法,因為這兩種辦法提供了大部分的防護,而且這對一般的使用者
沒有任何影響。
不同的 GCC 版本
如果在您的主機群間有著不同的 GCC 版本,您將會有非常詭異的問題發生。唯一的解決辦法就是
所有的主機均使用相同版本的 GCC。
最近 Portage 的更新讓 Portage 使用 ${CHOST}-gcc 而不是 gcc。這代
表說如果你把 i686 和其他類別的機器混合(i386,i586)你會碰到一些問題。一個解決方
法是 export CC='gcc' CXX='c++' 或是把這放在 /etc/make.conf。
重要:
這樣做會重新定義 Portage 一些行為,可能會有一些問題或奇怪的結果。只有在你有混合
的 CHOST 才用。
|
6.
額外的 Distcc 工具
Distcc 監視器
Distcc 包含兩個監視器。文字介面的是內建的,它叫作 distccmon-text。
第一次執行它可能會有點困擾,不過它是非常容易使用的。如果您執行它並且沒有加任何
的參數的話,它只會執行一次。然而,如果您在後面加入一個數值 N 的話,它會每 N 秒
更新一次。
另一個監視器只有在您的 USE 參數中啟動 gtk 或 gnome 才會打開。
它是建立於 GTK+ 並需執行於 X 的環境下。在 Gentoo 裡為了減少誤解,他叫作
distccmon-gui。其他地方可能稱為 distccmon-gnome。
原始碼 6.1: 啟動監視器 |
# distccmon-text N
# distccmon-gui
# DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-text N
# DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-gui
|
重要:
如果你的 distcc 放在別的目錄,依你的狀況改變 DISTCC_DIR 變數。
|
這份文件是以
Creative Commons - 姓名標示-相同方式分享 授權條款發布
|