2018年9月1日 星期六

使用 distcc 進行遠端編譯

在舊筆電上安裝 Gentoo,要更新 package 時,真是一段漫長的等待。身邊就擺著效能超強的桌機或伺服器,卻幫不上忙。若能把 compile 的任務丟給遠端的效能強大的電腦,在筆電上更新 package 將上一件多棒的事啊。這個想法確實可行,而且,看來已是很成熟的作法了,只是我到現在才知道。因為要請長假,把塵封的筆電拿出來,已有一年沒更新,連 make.profile 都已改變。若要更新,必然是要花個幾天幾夜才能完成,只好確定能開機,連回伺服器,就等回來上班後再處理了。

首先的要求是 gcc 的版本要一致,Gentoo 的穩定版是 gcc 7.3.0,而筆電還是 gcc  4.9.4。在 emerge --sync 同步 portage 後,大約 13:30 開始更新 gcc,約 15:30 完成,花了 2 個鐘頭的時間。

安裝和服務設定

安裝,很簡單
# emerge -av sys-devel/distcc

服務設定,修改 /etc/systemd/system/distccd.service.d/00gentoo.conf
Environment="ALLOWED_SERVERS=10.161.80.1/20"

雖然叫 ALLOWED_SERVERS,但也指 client 端,照做就對了。然後啟動服務
# systemctl daemon-reload
# systemctl start distccd

只是暫時使用,所以沒有 enable 此服務。

測試

# cat main.c
--------------------------------------------
#include <stdio.h>

int main() {
    printf("Hello distcc!\n");
    return 0;
}
--------------------------------------------
# /usr/bin/distcc-config --set-hosts 10.161.81.162
# export DISTCC_VERBOSE=1
# distcc gcc -c main.c -o main.o
# gcc main.o -o main
# ./main
Hello distcc!

筆電的安裝

年久失修,只好按照 "To bootstrap" 的說明來做。
USE='-*' PYTHON_TARGETS="python2_7" emerge --nodeps sys-devel/distcc

export PATH="/usr/lib/distcc/bin:${PATH}"
/usr/bin/distcc-config --set-hosts 10.161.81.162

使用 pump mode,速度會加快很多,
/usr/bin/distcc-config --set-hosts "10.161.81.162/20,cpp,lzo"

鈄線後面的數字 (即 '/20'),是可以接受的最大 job 數,預設是 4。跑 distccd 的 server 是雙 CPU,各 8 core,共 32 thread,平時沒在用,就設到 20 job,給它盡情的操吧。

修改 /etc/portage/make.conf,其中 j 的選項為 total (local + remote) CPU cores,l 的選項為  local CPU cores。
FEATURES="distcc distcc-pump"
MAKEOPTS="-j20 -l2"

升級 gcc,一次要跳過中間的版本,不曉得會怎樣。不管了,玩玩看,不成功的話,頂多從頭裝起。
# gcc-config --list-profiles
 [1] x86_64-pc-linux-gnu-4.9.4 *
 [2] x86_64-pc-linux-gnu-5.4.0
 [3] x86_64-pc-linux-gnu-7.3.0

# gcc-config 3
# source /etc/profile

# emerge --ask --oneshot --usepkg=n sys-devel/libtool sys-apps/sandbox

接下來,就只好慢慢的,一個一個 package 依次升級了。

emerge 失敗的問題

有時,會發生像下面錯誤訊息而安裝失敗,例如 kde-frameworks/kpty,將 distcc 取消就成功了。
fatal error: sys/filio.h: No such file or directory
 #include <sys/filio.h>

所以,碰到 emerge 失敗時,就試著將 distcc 取消,也許問題就解決了。

最後,實在太慢了,而且,太多的失敗與錯誤,乾脆拔硬碟,用 PC 來更新。原來折騰了一個週末,都搞不定,裝到 PC 上更新,一天就跑完了。

也許,原來的版本太舊了,隔了一年多才更新,有很多 package 都是被 mask 掉的。使用 distcc 時,發生很多衝突的狀況,都直接用 --nodeps 的選項來裝,造成程式潛伏的問題。

結尾

我現在的筆電是 ThinkPad X201,原本有點動心想再買一台 X230,但是一年都用不上,實在沒必要多花這一萬元啊。雖然,沒有完全使用 distcc 的作法,來完成更新。但 distcc 可以在往後更新用上,這筆電也能再用上好幾年,即使是在上面跑 Gentoo。


沒有留言:

張貼留言

網誌存檔