Linux内核编译实在是费时间的事,搞内核移植的时候总要编译,生命有一部分就浪费在等内核编译完成上,有心想买个HP的工作站,看了下Z840的价格,想想还是算了。distcc早就听说过,一直没有去试试,今天终于试了试,真是大赞啊!!下面说下如何配置,为了方便叙述,先定义几个称呼

  • 我直接工作的电脑称为L
  • 用来加速编译的电脑们称为A、B、C(它们也被称为compile farm)

安装

# L电脑
sudo apt install distcc distccmon-gnome distcc-pump # A/B/C电脑
sudo apt install distcc

配置

在L/A/B/C电脑上更改 /etc/default/distcc内容如下(注释已经删除)

STARTDISTCC="true"

# 下面的 /16表示前面的IP地址16位有效,即192..xx.xx的IP都是接受的
ALLOWEDNETS="127.0.0.1 192.168.0.0/16" LISTENER="" NICE="" JOBS="" ZEROCONF="true"

然后执行

sudo systemctl restart distcc

此时,若在任何一台电脑上执行 distcc --show-hosts,将会列出L/A/B/C电脑的IP或IPv6,格式为

<A-IP>:/
<C-IP>:/
<B-IP>:/
<L-IP>:/

其中3632是端口,这个是默认端口,一般不用改变,'/'后面限制的任务数,默认按4倍<CPU-threads>来计算的,如果这个时候执行后面将会提到的distcc-pump就会报没有host具有,cpp属性(这可以认为是distcc的一个bug,不过人家在man distcc里说明了,zeroconf不支持lzo和cpp属性,github上也明确表示不会合并patch,所以zeroconf我觉得也就是可以用来debug或初始化)

L电脑的打开 /etc/distcc/hosts,将刚才 distcc --show-hosts的输出写进去,并在每行后面加上,cpp,lzo,大约如下(把+zeroconf注释掉

<A-IP>:/,cpp,lzo
<C-IP>:/,cpp,lzo
<B-IP>:/,cpp,lzo
<L-IP>:/,cpp,lzo

使用hosts文件有几个好处(可能就是因为这些好处,以至于开发者都不去修正zeroconf的BUG)

  • 各电脑按照配置高低排序,把配置高的放前面,当任务少时先分配给配置高的机器
  • 各电脑的任务限制数可以手动更改(给A/B/C电脑一点剩余CPU)
  • L电脑自己需要执行预处理任务,应该把自己放到靠后的位置,并适当限制任务数,甚至不要放到列表中去
  • 手动增加,cpp,lzo属性,避开BUG

配置完成后,此时在L电脑上再次执行 distcc --show-hosts,输出就是/etc/distcc/hosts的文件内容

安装编译器

所有电脑需要安装编译器,并且放到相同的位置(我认为不太必要,只要都在PATH环境变量中就可以了吧),最好都是相同的版本。

编译内核

编译内核时,一般会先export ARCH 和 CROSS_COMPILE,这个不用改变,正常来即可,也可以放到命令行上,我比较喜欢export,最后编译执行命令是

distcc-pump make -j$(distcc -j) O=build-xxx CC="distcc ${CROSS_COMPILE}gcc"

这个时候可以打开 distccmon-gnome 看看壮观的景象,几分钟之后内核就编译好了!

后记

还有一个叫dmucs的东西,可以手动指定每台机器的power,然后自动执行负载均衡,并优先发给power强的机器,不过我配置的半天都不好使,而且我觉得配置起来也比较麻烦,就放弃了。有兴趣的同志可以研究下。

补记

在编译Linux内核某版本时,总是报远程无法编译过,但本地可以编译过,然后后面就会使用plain distcc mode,也就是本地预处理,远程编译的方式。这种方式显著降低编译速度,因为大量工作由本机来完成,而我本机的性能还不如编译服务器,一开始我也以为配置的问题,后来 man include_server告诉我,可以 export DISTCC_FALLBACK=0,然后远程编译的错误信息就会打出来,便于诊断,发现是下面的代码的问题

#define __gcc_header(x) #x
#define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h)
#define gcc_header(x) _gcc_header(x)
#include gcc_header(__GNUC__)

也就是说distcc预处理时无法知道要发送哪个头文件,并且没有检测出这个问题,导致远程编译时报 linux/compiler-gcc##x.h 未找到,这个问题work around的方法是,根据打印消息,把源代码临时改掉,不要因为这一个问题,导致编译速度显著下降。

另外 CC=distcc xxxx,如果xxxx不是绝对路径,那在远程编译服务器上也会按PATH去搜索,不过要注意PATH在远程是什么,如果是绝对路径就不需要搜索了,直接也使用绝对路径。

distcc加速内核编译的更多相关文章

  1. 【内核】linux2.6版本内核编译配置选项(二)

    目录 Linux2.6版本内核编译配置选项(一):http://infohacker.blog.51cto.com/6751239/1203633 Linux2.6版本内核编译配置选项(二):http ...

  2. 在阿里云中编译Linux4.5.0内核 - Ubuntu内核编译教程

    实验环境:Ubnuntu 64位(推荐使用14.04)+Xshell 阿里云现在提供的云服务器很好用的,用来编译内核性能也不错.本文介绍最基本的内核编译方法,为了方便,所有操作均在root用户下进行. ...

  3. zju(3)内核编译与运行

    1.实验目的 学习和掌握Linux配置和编译的基本步骤. 二.实验内容 1. 对Linux内核及用户程序进行配置: 2. 编译生成内核映像文件: 3. 把编译的映像文件烧写到FLASH中,查看运行结果 ...

  4. linux内核编译,配置本机驱动

    1.前言  编译linux内核失败的原因很多时候就是驱动选错,适合自己本机的驱动没编译进去.面对特殊平台(或者有些洁癖者,我就是^_^),要编译精简内核,只要本机驱动,其他都不需要.面对内核里面这么多 ...

  5. linux内核编译相关

    参考:http://www.arm.linux.org.uk/docs/kerncomp.php 一. 内核编译1) linux 2.4make clean/make mrpropermake dep ...

  6. 运行在TQ2440开发板上以及X86平台上的linux内核编译

    一.运行在TQ2440开发板上的linux内核编译 1.获取源码并解压 直接使用天嵌移植好的“linux-2.6.30.4_20100531.tar.bz2”源码包. 解压(天嵌默认解压到/opt/E ...

  7. 【转】内核编译时, 到底用make clean, make mrproper还是make distclean(转载)

    原文网址:http://dongyulong.blog.51cto.com/1451604/449470 内核编译时, 到底用make clean, make mrproper还是make distc ...

  8. linux 驱动模块 内核编译环境

    目录(?)[+] Linux设备驱动Hello World程序介绍 如何编写一个简单的linux内核模块和设备驱动程序.我将学习到如何在内核模式下以三种不同的方式来打印hello world,这三种方 ...

  9. linux内核编译环境配置

    linux内核编译环境配置 如果不是编译内核,只需要安装与内核相匹配的kernel-devel开发包即可.即是/lib/modules/`uname -r`/build -> /usr/src/ ...

随机推荐

  1. Python_Tips[1] -> 利用 Python 的字典实现 Switch 功能

    利用 Python 的字典实现 Switch 功能 Python是没有switch语句的,当遇到需要实现switch语句的功能时,一般可以用if/else进行代替,但是还有一种更加简洁的实现方法,利用 ...

  2. Xamarin XAML语言教程通过数据绑定使用Progress属性

    Xamarin XAML语言教程通过数据绑定使用Progress属性 开发者除了可以为ProgressBar定义的Progress属性直接赋双精度类型的值外,还可以通过数据绑定的方式为该属性赋值,此时 ...

  3. [BZOJ 1266] 上学路线Route

    Link: BZOJ 1266 传送门 Solution: 好不容易自己写出来一道水题,练链式前向星的模板调了一小时o(╯□╰)o 思路非常好想,既然要想让最短路不成立,使最短路部分不连通即可 又要求 ...

  4. [TJOI2009] 战争游戏

    题目背景 小R正在玩一个战争游戏.游戏地图是一个M行N列的矩阵,每个格子可能是障碍物,也可能是空地,在游戏开始时有若干支敌军分散在不同的空地格子中.每支敌军都可以从当前所在的格子移动到四个相邻的格子之 ...

  5. 【bzoj4443】【[Scoi2015]小凸玩矩阵】二分+二分图最大匹配

    (上不了p站我要死了,侵权度娘背锅) Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个数字不能在同一行或同一列,现小凸 ...

  6. 面向对象-QuickHit项目

    package com.ketang.game; /** * 游戏级别类 * @author * */ public class Level { private int levelNo; //各级别编 ...

  7. sql server 2005 链接服务器:未将服务器 配置为用于 RPC

    原文:sql server 2005 链接服务器:未将服务器 配置为用于 RPC  RPC: 远程过程调用(Remote Procedure Calls) --LinkedServer.Rpc 属性: ...

  8. 【log4j】springboot项目启动 ,使用的druid数据源,log4j报错 log4j:WARN Please initialize the log4j system properly.

    springboot项目启动 ,使用的druid数据源,log4j报错 -- :: --- [ restartedMain] o.hibernate.annotations.common.Versio ...

  9. hdu1021(C++)

    打表找规律,发现是n%4==2就是yes,否则是no #include<iostream>using namespace std;int main(){ int n; while (cin ...

  10. docker部署 自动测试脚本记录

    1 首先配置virtualenv, 并启动之,source py3env/bin/activate 2 安装各种必备包 ,如simplejson,chardet, configparser等 3 注意 ...