首先需要三台PC,如PC ABC,
在三台机器上都要安装distcc 和 dmucs
sudo apt-get install distcc dmucs
假设三台PC的ip地址如: A:192.168.0.1 B:192.168.0.2 C: 192.168.0.3
我用A做server(用于分发编译任务),B和C做client
在三台机器的/etc/hosts文件中找到各个机器的机器名:
如:sudo vi /etc/hosts
会看到:
127.0.0.1 localhost
127.0.0.1 A-desktop
A-desktop就是A机器的机器名,以此类推,B和C
在三台机器的/etc/hosts中后加上上台机器的ip地址和机器名如下:
192.168.0.1 A-desktop
192.168.0.2 B-desktop
192.168.0.3 C-desktop
server设置:
设置/etc/default/distcc
sudo vi /etc/default/distcc
STARTDISTCC="true"
ALLOWEDNETS="127.0.0.1 192.168.0.1/16"
LISTENER="192.168.0.1"
其他参数不变。
设置/etc/init.d/distcc
sudo vi /etc/init.d/distcc
在PATH=/usr/local/sbin:.....后面加上交叉编译器的bin目录:
export PATH=$PATH:/toolchaindir/arm-XXX-eabi-gcc/bin
ps aux | sed '/grep/d' | grep -q loadavg || loadavg -s A-desktop &
#loadavg -s 是为了向主机A-desktop发送编译负载信息。
最后在DEAMON_ARGS参数中加入-jN,N表示当前机器上将运行几个编译进程,一般为
CPU core数量 + 2,我的机器是双核的,所以用-j4
DEAMON_ARGS="-j4 --pid-file......"
配置dmus
sudo vi /etc/default/dmucs
SERVER=yes
#dmucs 是用于接收loadavg发送过来的编译负载信息,以及编译数据,用于在server端建立一个TCP的监听端口。
#默认监听端口为9714,client端loadavg会与server端的dumucs建立TCP连接,发送和接收数据
#可以用lsof | grep 9714 查看dmucs,当然先要启动dmucs。
最后再server上启动dmucs,和 distcc 守护进程
sudo /etc/init.d/dmucs start
sudo /etc/init.d/distcc start
#在distcc中运行loadavg的意思是,server也参与编译工作。自己做自己的client。
client端设置,以B为例,C以此类推
设置/etc/default/distcc
sudo vi /etc/default/distcc
STARTDISTCC="true"
ALLOWEDNETS="127.0.0.1 192.168.0.1/16"
LISTENER="192.168.0.2"
其他参数不变。
一般来说,LISTENER设置为本机Ip就可以了,但是大部分时候,client端都是DNS自动获取IP的,
所以我们可以用如下命令代替,它可以自动搜索到本机ip,所以即使client重启ip变了,也不用担心
LISTENER=`ifconfig | grep '192.168' | cut -d: -f2 | awk '{ print $1}' | head -n1`
设置/etc/init.d/distcc
sudo vi /etc/init.d/distcc
在PATH=/usr/local/sbin:.....后面加上交叉编译器的bin目录:
export PATH=$PATH:/toolchaindir/arm-XXX-eabi-gcc/bin
ps aux | sed '/grep/d' | grep -q loadavg || loadavg -s A-desktop &
sh /load.sh &
#loadavg -s 是为了向主机A-desktop发送编译负载信息。
#load.sh脚本是为了每隔60秒向server发送一次编译信息。
load.sh如下:
#!/sbin/sh
while true;do
ps aux | sed '/grep/d' | grep -q loadavg || loadavg -s A-desktop &
sleep 60;
done
启动distcc 守护进程,client端不用启动dmucs,
sudo /etc/init.d/distcc start
最后在client端设置编译参数:
sudo vi ~/.bashrc
加入:
export ARCH=arm
export CROSS_COMPILE="gethost --server A-desktop distcc arm-XXX-eabi-"
以同样的方式配置C完成以后就可以开始编译了,
选取一个linux kernel编译
make arm_defconfig
make -j20
console 会显示distcc的编译相关信息,
同时可以在当前编译的机器上,另外开一个console上输入distccmon-text来查看distcc分派编译包的信息
9133 Blocked
9298 Blocked
9314 Compile exec.c localhost[1]
9314 Compile fcntl.c localhost[2]
9314 Compile sem.c C-desktop[3]
9314 Compile page_alloc C-desktop[4]
9314 Preprocess swap.c A-desktop[5]
9314 Preprocess contxt.c A-desktop[5]