Gentoo Distcc文档

Lisa Seelye  Author
Mike Frysinger  Editor
Erwin  Editor
Sven Vermeulen  Reviewer
Tiemo Kieft  Reviewer
Zhang Liqiang Translator

更新于2003年9月30日
本翻译已经不再被维护

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。