distcc交叉编译龙芯2F

年前入了一台龙芯上网本,其龙芯处理器架构为mips64,最高频率只有797MHz,可以安装多个发行版,我选择了Gentoo。Gentoo每次升级都是下载代码在本地编译,这对于龙芯小本来说有点吃力了,当时在上面编译GCC4.8.2花了好像一天一夜的时间。

了解到distcc这项技术,就是将一个机器上的编译任务通过网络,分发给其它机器,由其它机器负责编译,再将编译结果返回。将龙芯小本的编译任务交给高性能的计算机,编译速度即可大大加快。

概述

mips64架构的龙芯小本,是用portage时,将具体的要编译的代码发送给一台高性能计算机X86构架,由后者通过交叉编译链,实现对mips64代码的编译,再将编译结果返回给龙芯小本。大体像这样:

loongson-2f-distcc-1

distcc 主要分为两个部分:client 和 server ,client 是有编译任务,但是要把代码传给别的机器的那一方,在这里就是龙芯小本, server 就是接收代码,执行编译的这一方,在这里一台笔记本。

要实现这一功能,需要完成三个部分的工作:

  1. 龙芯小本 distcc client、portage 的设置
  2. 笔记本交叉编译链的设置
  3. 笔记本 distcc server 的设置

龙芯小本设置

首先安装 distcc : emerge distcc

配置Portage,打开对 distcc 的支持:

配置 /etc/portage/make.conf ,添加这么几行:

#distcc
MAKEOPTS="-j8 -l1"
FEATURES="distcc"

其中 -j 后的貌似是总CPU数 -l 后是本地(龙芯)CPU数,不太明白

添加 host ,就是让 distcc 能找到笔记本做的 server ,在我的局域网里笔记本IP是192.168.0.65:

distcc-config --set-hosts 192.168.0.65

至此,龙芯上就配置好了。当使用 portage ,需要编译时,会调用 distcc ,distcc 会根据我们设置的 host 去寻找 server 。

交叉编译链的设置

笔记本的架构是 X86 ,而龙芯小本的架构是 mips64 ,对于笔记本来说,当龙芯小本传来源代码时,不能调用本机的 GCC 进行编译,因为本机的 GCC 编译出来的目标文件是基于 X86 构架的,不能运行于 mips64 。

这里就需要交叉编译链,其包含一系列用于编译程序的编译工具,包含了 GCC ,有了它,我们就能够在 X86 机器上编译出 mips64 的目标文件。

所以说,当龙芯小本传来源代码时,我们笔记本上的 distcc server 要能调用起这套编译工具。

首先,我们需要获得交叉编译链,有两种途径,一种是采用 crosstool-ng 程序来制作一套工具链,另一种是直接上网上下载别人编译好了的。

Maxiee 将会写一篇博客介绍手工编译龙芯2F的交叉编译链。

现成的龙芯2F的交叉编译链。下载下来解压即可。

两种方法最终都会得到一个文件夹 mips64el-unknown-linux-gnu ,它的子目录 bin 里就是我们需要的工具。

bin 下的部分内容如下(有很多,只列出一部分):

addr2line     mips64el-unknown-linux-gnu-addr2line     mips64el-unknown-linux-gnu-nm
ar            mips64el-unknown-linux-gnu-ar            mips64el-unknown-linux-gnu-objcopy
as            mips64el-unknown-linux-gnu-as            mips64el-unknown-linux-gnu-objdump
c++           mips64el-unknown-linux-gnu-c++           mips64el-unknown-linux-gnu-populate
cc            mips64el-unknown-linux-gnu-cc            mips64el-unknown-linux-gnu-ranlib
c++filt       mips64el-unknown-linux-gnu-c++filt       mips64el-unknown-linux-gnu-readelf

……

下面我们需要将这个 bin 目录加入到 PATH 环境变量中去:

我的这个目录的绝对路径是: /home/maxiee/x-tools/mips64el-unknown-linux-gnu/bin

需要在 ~/.bashrc 里添加一行: export PATH=$PATH:/home/maxiee/x-tools/mips64el-unknown-linux-gnu/bin

重启一下终端

这样我们的交叉编译链就设置好了, distcc server 到时候就能找到所需的编译工具。

distcc server 的设置

由于我的笔记本上安装的 Linux 发行版为 Fedora ,首先也要安装 distcc :

yum install distcc distcc-server

distcc 在传输的时候需要使用3632端口,所以要在 Fedora 的防火墙设置里打开这个端口,否则在实际运行的时候,会报错: distcc no route to host ,具体设置如图:

distcc-firewall下面,我们就可以启动 distcc server 了:

distccd --daemon --allow 192.168.0.70 --log-file=/home/maxiee/distcc_log.log

其中 --daemon 表示作为守护进程运行,--allow 192.168.0.70 表示允许来自这个IP的请求,这是龙芯小本的地址,--log-file 来指定日志文件。

Gentoo安装distcc

上一小节讲得是在 Fedora 中安装 distcc server。现在 Maxiee 主要使用的发行版为 Gentoo ,下面就记录一下,在 Gentoo 里构建 distcc server 的过程。

首先安装 distcc 包,其中包含了 client 和 server 。(这一点与 Fedora 不同,Fedora 是分为两个包的)

emerge --ask distcc

之后要修改设置文件 /etc/conf.d/distccd ,配置允许请求的 ip 。

在 DISTCCD_OPTS 里添加 --allow 选项

DISTCCD_OPTS="--port 3632 --log-level notice --log-file /var/log/distccd.log -N 15 --allow 192.168.0.0"

其中,192.168.0.0 表示,允许 192.168.0 网段里的所有计算机访问。

下一步是到 龙芯2F的交叉编译链 上下载交叉编译链。(据说本周 GCC3.9 要出了……到时候就要自己做一套编译链了)

下面我们需要将这个 bin 目录加入到 PATH 环境变量中去:

我的这个目录的绝对路径是: /home/maxiee/mips64el-unknown-linux-gnu/bin

需要在 ~/.bashrc 里添加一行: export PATH=$PATH:/home/maxiee/mips64el-unknown-linux-gnu/bin

重启一下终端

这样我们的交叉编译链就设置好了, distcc server 到时候就能找到所需的编译工具。

总结

至此,龙芯2F的 distcc 交叉编译系统就搭建好了,在龙芯小本上运行一下 emerge 试试,看看是不是编译速度加快了。另外,这台龙芯 Yeeloong 小本的2D图形加速功能没有打开,在屏幕上绘制文本也需要耗费 CPU 资源,也会拖累编译速度,可以将输出重定向到文件。