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
>=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 *
|
步骤 2:设置新盒子
重要:
别忘了为 LiveCD 启动 sshd 并且重置 root 密码!
|
下一步,你要从 Gentoo Linux LiveCD 引导你的新盒子,然后所有的步骤直到 bootstrapping。
然后在新的盒子上进行初步的设置。
代码 4.2: 初步设置 |
# echo "FEATURES=\"\${FEATURES} distcc\"" >> /etc/make.conf
# echo "MAKEOPTS=\"\${MAKEOPTS} -jN\"" >> /etc/make.conf
|
接着增加 distcc 到你的 /etc/passwd:
代码 4.3: 向 /etc/passwd 增加 distcc 用户 |
# echo "distcc:x:240:2:distccd:/dev/null:/bin/false" >>/etc/passwd
|
步骤 3: 复制打包
接下来你会复制你刚刚做好的 distcc 打包。
步骤 4:解压打包
代码 4.5: 解压打包 |
# tar xvfz distcc.tar.gz
# tar xvfjp distcc-DISTCC_VERSION.tbz2
|
步骤 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。
本文档的内容遵循知识共享-署名-相同方式共享许可协议
|