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
|
使用 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 |
有些情况下这比设置 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。 测试你自己的设置来找出恰当的数值。
交叉编译是使用一种体系结构来构造其它体系结构的程序。 这可能就是简单的使用 Athlon (i686) 来为 K6-2 (i586) 构造程序,或者使用 Sparc 来为 ppc 构造程序。
我喜欢能够在 Gentoo 上 help out 交叉编译成果,但是我并没有任何非x86的机器。 我能从理论上创建一些东西,但是我要依靠别人来测试我所写的。 那样达到了一定的程度,不过它是健壮的。
我希望在不久的将来能够得到一台 Sparc 装上 Gentoo,我就可以在家进行了。
如果你要在 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) |
重要: 别忘了为 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 (别忘了‘>>’) |
接下来你会复制你刚刚做好的 distcc 打包。
代码 4.4: 复制打包到新盒子 |
(在“旧”盒子上执行) # scp /tmp/distcc/distcc.tar.gz [email protected]:/mnt/gentoo/ (以你新盒子的 IP 替换 ip.of.new.box) |
代码 4.5: 解压打包 |
# tar xvfz distcc.tar.gz # tar xvfjp distcc-DISTCC_VERSION.tbz2 (确定你用 distcc版本更换了 DISTCC_VERSION,像 2.10-r1) |
现在设置 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。
当你 emerge 各种软件包的时候,你会注意到他们没有被分布的编译(而且确实没有并行的构建)。 这是因为 Mozilla 和 Xfree 的开发者。 ebuild 系统(文件)禁止了并行构建,因为已经知道那将会导致问题。这并不一定是 distcc 的问题。
那并不是说,distcc 有时会导致软件包编译错误。
与这样长的标题相比,任何解释都将是文不对题。 然而,如果你计划在 distcc 主机系统中使用带有 PaX/增强-gcc 的主机和没有增强的主机,你将会遇到问题。
解决需要你有一些远见;你要在带有 PaX/增强-gcc的主机上运行 hardened-gcc -R, 或者你在你的内核中使用 PaX 保护并且 emerge hardened-gcc。 两个都是很好的,因为对于大多数部分两个包提供的保护是不错的,并且是用户透明的。
如果在你的主机上有不同版本的 GCC,将会有非常奇异的问题。 解决方法就是使所有的主机使用相同的 GCC 版本。
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。 |
distcc-subnetscan 是一个开发中的 perl 程序,用来扫描子网找到参与的 distcc 守护进程。 这个甚至可以增强,以测试远程主机守护进程是否具有特定的 CHOST 设置,使得交叉编译更容易。
perl 脚本就在 这里 直到找到更加正规的居所。
distcc-config,distcc 已经过时的用户方配置工具。 很快就会重写来bring up 当前版本 distcc。
本文档的内容遵循知识共享-署名-相同方式共享许可协议