技术博客

26/10/2016 作者 Mikkel

使用distcc对树莓派(Raspberry Pi)进行构建

在树莓派(Raspberry Pi)上本地构建可能很慢。最常见的方法是交叉编译,这样速度会更快,但需要更多的设置。1 还有第三个选择,就是使用 distcc,它以透明的方式将编译分发到远程计算机。与交叉编译相比,设置distcc会稍微简单些,但是与本地构建相比,我们还获得了速度。

distcc程序可以在网络上的多台机器上分发构建。2今天,我们将使用distcc在运行Rasbian 8.0的老款树莓派B型上设置和编译CANlib,将编译分发到运行Ubuntu 16.04的Linux计算机上。

设置主机

首先,我们需要设置和配置我们的Ubuntu主机。

安装所需的软件包

使用apt安装所需软件包distcc 和 git.

$ sudo apt update
$ sudo apt install distcc
$ sudo apt install git

获取并设置工具链

树莓派基金会在其GitHub存储库中提供了一个即用的工具链。创建一个目录并从GitHub获取工具链。我们只对最新版本感兴趣,而不是所有的历史版本,所以我们使用参数 --depth 1 .

$ mkdir ~/rpi_cross
$ cd ~/rpi_cross
$ git clone https://github.com/raspberrypi/tools.git --depth 1

现在我们必须确保当distcc调用我们的编译器时,它应该使用我们的交叉编译器。为此,我们创建指向编译器的符号链接。

$ cd tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin
$ ln -s arm-linux-gnueabihf-c++ c++
$ ln -s arm-linux-gnueabihf-cc cc
$ ln -s arm-linux-gnueabihf-cpp cpp
$ ln -s arm-linux-gnueabihf-g++ g++
$ ln -s arm-linux-gnueabihf-gcc gcc

配置distcc

对在/etc/default/distcc路径内的distcc配置文件进行编辑。

  1. STARTDISTCC设置为“true”,以便在引导时启动distcc守护程序、distccd
  2. 更改ALLOWEDNETS以允许网络或个人电脑连接。我们只允许树莓派连接,所以在这里设置它的IP地址。
  3. 注释排除包含‘LISTENER=”127.0.0.1″‘的行,否则distcc将只监听环回接口。
  4. 使用JOBS设置允许的最大任务。您可以使用nproc命令获取计算机上可用的处理器数。在我们的机器上,我们想要将任务数量限制为两个。

/etc/default/distcc路径下的编辑后的配置文件现在如下(注释省略):

STARTDISTCC="true"
ALLOWEDNETS="192.168.0.27"
NICE="10"
JOBS="2"
ZEROCONF="false"

现在我们需要确保distcc找到并使用我们的工具链。我们通过在 /etc/init.d/distcc中的PATH变量首先包含交叉工具链的路径来实现。我们的用户在Ubuntu主机上被命名为“ubu”,所以行变成:

PATH=/home/ubu/rpi_cross/tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

重新加载systemd,因为我们更改了init脚本,还需启动distccd

sudo systemctl daemon-reload
sudo systemctl start distcc

设置树莓派

我们现在可以设置和配置我们的树莓派。

安装所需的软件包

使用apt安装所需的软件包。在内核上bc命令要求可执行make prepare

sudo apt update
sudo apt install distcc
sudo apt install bc

设置和配置distcc

创建指向distcc的符号链接。

$ cd /usr/local/bin
$ sudo ln -s /usr/bin/distcc c++
$ sudo ln -s /usr/bin/distcc cc
$ sudo ln -s /usr/bin/distcc cpp
$ sudo ln -s /usr/bin/distcc g++
$ sudo ln -s /usr/bin/distcc gcc

设置distcc环境变量。注意,你必须在每次登录时都这样设置,除非你把它们放在/etc/profile路径中。

  1. DISTCC_HOSTS环境变量设置为以空格分隔的主机列表。我们仅将主机IP地址192.168.0.2添加到我们的单主机。
  2. 如果不想在本地编译任何内容,就设置环境变量“DISTCC_SKIP_LOCAL_RETRY”=1
$ export DISTCC_HOSTS="192.168.0.2"
$ export DISTCC_SKIP_LOCAL_RETRY=1

查找正确版本的Linux头文件

如何找到要使用的Linux头文件版本见博文《在树莓派Raspberry Pi上构建CANlib

获取和创建Linux头文件

如何下载和提取内核源码也同样在博文《在树莓派Raspberry Pi上构建CANlib》里进行了描述。

现在我们可以完全按照博文《在树莓派Raspberry Pi上构建CANlib》所述设置内核配置并创建头文件。但是,这次我们将使用distcc工具链并将编译任务发送到我们的Ubuntu主机。

$ sudo modprobe configs
$ zcat /proc/config.gz > .config
$ make prepare
$ make modules_prepare

这两个make命令现在花了大约两分钟,比本地构建只少一分钟,但仍然减少大约30%的时间。

使用的版本

主机使用以下版本:

OS                     Ubuntu 16.04 x86_64 with kernel 4.4.0-21-generic 
distcc                 version 3.1 (package version 3.1-6.2)            
raspberrypi/tools.git  rev 6376a50ed059b3c852ce3836981ba5ff07d6b368 

客户端,树莓派B型使用以下版本:

OS            Rasbian 8.0 with kernel 4.4.11+              
distcc        version 3.1 (package version 3.1-6.2)        
firmware.git  rev 3b98f7433649e13cf08f54f509d11491c99c4c0b 
linux.git     rev 233755da0e7903fccb41f0b8c14e1da5244b69ec

脚注

1 点此获取有关为树莓派Raspberry Pi构建内核详情。

2 点此查看distcc文档。

Author Image

Mikkel Gerdes