Gentoo Logo

Gentoo Distcc文档

内容:

1. 介绍

什么是 distcc?

Distcc 是一个程序,设计为将编译任务分布到网络中的参与主机。 它包含一个服务器,distccd 和一个客户程序,distcc。Distcc 能够和 ccache 透明的工作,也能和 portage 配合进行一些安装。

依赖性

代码 1.1: Distcc 依赖性

>=sys-apps/portage-2.0.46-r11
>=sys-devel/gcc-config-1.3.1
sys-apps/shadow
(当你的 USE 标签中有 gtk 时,distcc 有下面可选的依赖性(在版本 2.8))
>=x11-libs/gtk+-2.2.1

2. 配置

配置 Portage 使用 Distcc

使用 portage 配置 distcc 非常简单。在你想要使用 distcc 的每台计算机上执行下面的步骤:

代码 2.1: 整合 Distcc 和 Portage

# emerge distcc
# nano -w /etc/make.conf

注意: 编辑你的 FEATURES 标签来包含 "distcc"

注意: 设置 DISTCC_DIR=${PORTAGE_TMPDIR}/portage/.distcc

注意: 你应当取消 DISTCC_TMPDIR 行注释。

接下来你要指定你将使用什么主机。要做这个,你可以使用 distcc-config 命令来设置主机列表。 这有一个包含几个主机的例子,也许在你的列表中也一样:

代码 2.2: 主机定义示例

192.168.0.1        192.168.0.2                     192.168.0.3
192.168.0.1/2      192.168.0.2                     192.168.0.3/10
192.168.0.1:4000/2 192.168.0.2/1                   192.168.0.3:3632/4
@192.168.0.1       @192.168.0.2:/usr/bin/distccd   192.168.0.3

可能看起来都很难懂,但是在许多情况下行 1,2的变体都会工作。 每一行的解释是: 行 1 仅仅是任何事都使用缺省的空间范围主机列表。 行 2 是一个指定在给定时间(由 /n指定)发给主机最大任务数(通过使用 /N)的主机列表。 因为大多数人都不会使用行 3或行 4,我会 指示你 distcc 文档来获得更多信息。

设置主机示例命令(行 1):

代码 2.3: 设置主机的示例命令

# /usr/bin/distcc-config --set-hosts "192.168.0.1 192.168.0.2 192.168.0.3"

把 distcc 整合到 Portage 的最终步骤是重打开你的 /etc/make.conf 并编辑 MAKEOPTS 来包含 -jN (其中 N 是一个整数)。 代表行的,你会想把这设置为你网络中处理器的总数加一。

代码 2.4: make.conf 中的最后步骤

# nano -w /etc/make.conf
MAKEOPTS=-jN

重要: 别忘了启动 distcc 守护进程 /etc/init.d/distccd start

设置 Distcc 来同 Automake 一起工作

有些情况下这比设置 Portage 更简单。你所要做的就是更新你的 PATH 环境变量, 在 gcc(/usr/bin)之前包含 /usr/lib/distcc/bin。 然而,有一点警告。如果你使用 ccache,你要把 distcc 放在 ccache 部分之后。像这样:

代码 2.5: 设置你的路径

# export PATH="/usr/lib/ccache/bin:/usr/lib/distcc/bin:${PATH}"

然后,像你以前通常键入 make,你要键入 make -jN (其中的 N 是一个整数)。 N的安全取值取决于你的网络和你用来编译的机器的类型。 对于我,我有一台双处理器 P3,一台 K6-2/400 来编译我桌面(一台 1200MHz Athlon Thunderbird)的一切,所以我用 -j5。 测试你自己的设置来找出恰当的数值。

3. 交叉编译

交叉编译笔记

交叉编译是使用一种体系结构来构造其它体系结构的程序。 这可能就是简单的使用 Athlon (i686) 来为 K6-2 (i586) 构造程序,或者使用 Sparc 来为 ppc 构造程序。

交叉编译个人笔记

我喜欢能够在 Gentoo 上 help out 交叉编译成果,但是我并没有任何非x86的机器。 我能从理论上创建一些东西,但是我要依靠别人来测试我所写的。 那样达到了一定的程度,不过它是健壮的。

我希望在不久的将来能够得到一台 Sparc 装上 Gentoo,我就可以在家进行了。

4. 使用 Distcc Bootstrap

步骤 1: 构造打包 Tarball

如果你要在 Gentoo 的安装过程中使用 Distcc,这一部分会是有帮助的。 出人意料的是这并不那么困难。 你所需要的仅仅是另一台运行 Gentoo 的机器,一种方式来传输打包到你的新系统(我使用 scp)。

首先,你要构造一个 Distcc 打包,并包含一个 /usr/lib/libpopt.so.* 库。

代码 4.1: 构造打包

# USE='-gtk -selinux' emerge --buildpkg distcc
# mkdir -p /tmp/distcc/usr/lib
# cp /usr/portage/packages/sys-devel/distcc-DISTCC_VERSION.tbz2 /tmp/distcc/
# cp /usr/lib/libpopt.so.* /tmp/distcc/usr/lib
# cd /tmp/distcc
# tar cfzv distcc.tar.gz *
(确定你用 distcc版本更换了 DISTCC_VERSION,像 2.10-r1)

步骤 2:设置新盒子

重要: 别忘了为 LiveCD 启动 sshd 并且重置 root 密码!

下一步,你要从 Gentoo Linux LiveCD 引导你的新盒子,然后所有的步骤直到 bootstrapping。 然后在新的盒子上进行初步的设置。

代码 4.2: 初步设置

(在这我们增加 distcc 到 FEATURES)
# echo "FEATURES=\"\${FEATURES} distcc\"" >> /etc/make.conf
(你也可以使用 nano 编辑 /etc/make.conf 
来手动增加 distcc 到 FEATURES。)
# echo "MAKEOPTS=\"\${MAKEOPTS} -jN\"" >> /etc/make.conf
(就像上面的一样,你可以使用 nano 
编辑 /etc/make.conf 来手动修改 MAKEOPTS。)

接着增加 distcc 到你的 /etc/passwd

代码 4.3: 向 /etc/passwd 增加 distcc 用户

# echo "distcc:x:240:2:distccd:/dev/null:/bin/false" >>/etc/passwd
(别忘了‘>>’)

步骤 3: 复制打包

接下来你会复制你刚刚做好的 distcc 打包。

代码 4.4: 复制打包到新盒子

(在“旧”盒子上执行)
# scp /tmp/distcc/distcc.tar.gz [email protected]:/mnt/gentoo/
(以你新盒子的 IP 替换 ip.of.new.box)

步骤 4:解压打包

代码 4.5: 解压打包

# tar xvfz distcc.tar.gz
# tar xvfjp distcc-DISTCC_VERSION.tbz2
(确定你用 distcc版本更换了 DISTCC_VERSION,像 2.10-r1)

步骤 5:设置 Distcc 本身

现在设置 distcc 本身...

代码 4.6: 最后 distcc 设置

# /usr/bin/distcc-config --install
# /usr/bin/distcc-config --set-hosts "localhost host1 host2 host3 ..."

distcc 现在要设置为 bootstrap!继续官方安装指南, 别忘了在 emerge system 之后重新 emerge distcc。

5. Distcc 已知问题

Mozilla 和 Xfree

当你 emerge 各种软件包的时候,你会注意到他们没有被分布的编译(而且确实没有并行的构建)。 这是因为 Mozilla 和 Xfree 的开发者。 ebuild 系统(文件)禁止了并行构建,因为已经知道那将会导致问题。这并不一定是 distcc 的问题。

那并不是说,distcc 有时会导致软件包编译错误。

混合增强的gcc和非增强gcc是不完善的。

与这样长的标题相比,任何解释都将是文不对题。 然而,如果你计划在 distcc 主机系统中使用带有 PaX/增强-gcc 的主机和没有增强的主机,你将会遇到问题。

解决需要你有一些远见;你要在带有 PaX/增强-gcc的主机上运行 hardened-gcc -R, 或者你在你的内核中使用 PaX 保护并且 emerge hardened-gcc。 两个都是很好的,因为对于大多数部分两个包提供的保护是不错的,并且是用户透明的。

混合 GCC 版本

如果在你的主机上有不同版本的 GCC,将会有非常奇异的问题。 解决方法就是使所有的主机使用相同的 GCC 版本。

6. Distcc 附加

Distcc 监视器

Distcc 携带了两个监视器。基于文本的总是内置,叫做 distccmon-text。 第一次运行可能会令人糊涂,不过它真的是使用简单。 如果你无参数的运行它,它会运行一次。不过,如果你传递一个数值,它会每 N 秒钟更新一次, 其中的 N 是你传递的参数。

只有当你的 USE 标签中加进了 gtk,另一个监视器才会启用。 这一个基于 GTK+ ,运行在 X 环境,而且它很可爱。

有一个使用程序的注意,如果你要监视任何 emerge,你必须这样启动监视器:

代码 6.1: 启动监视器

# DISTCC_DIR=/path/to/distccdir portage distccmon-text N
(或者你可以启动图形监视器...)
# DISTCC_DIR=/path/to/distccdir portage distccmon-gnome

注意: 如果你不使用 Portage ,你没有必要指定 DISTCC_DIR (例如,只键入,distccmon-text N)。

重要: 如果你使用 Portage 并且使用上面的例子,这个会是 DISTCC_DIR=/var/tmp/portage/.distcc

7. Distcc 和 Gentoo 的未来计划

distcc-subnetscan

distcc-subnetscan 是一个开发中的 perl 程序,用来扫描子网找到参与的 distcc 守护进程。 这个甚至可以增强,以测试远程主机守护进程是否具有特定的 CHOST 设置,使得交叉编译更容易。

perl 脚本就在 这里 直到找到更加正规的居所。

distcc-config

distcc-config,distcc 已经过时的用户方配置工具。 很快就会重写来bring up 当前版本 distcc。



打印

更新于2003年9月30日

本翻译已经不再被维护

总结: 本文档是一篇解决在 Gentoo 中使用 distcc 的 HOWTO。

Lisa Seelye
Author

Mike Frysinger
Editor

Erwin
Editor

Sven Vermeulen
Reviewer

Tiemo Kieft
Reviewer

Zhang Liqiang
Translator

Donate to support our development efforts.

Copyright 2001-2007 Gentoo Foundation, Inc. Questions, Comments? Contact us.