LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1405|回复: 9

请教distcc交叉编译

[复制链接]
发表于 2009-12-12 18:11:49 | 显示全部楼层 |阅读模式
我的配置
笔记本 T2390 gentoo i686
台式 VIA C3 gentoo i585

看了手册http://www.gentoo.org/doc/zh_cn/distcc.xml?style=printable,对distcc交叉编译只是简单一提。

在两台机子上已经完成的设置:
编辑make.conf
在FEATURES 添加 "distcc"
添加DISTCC_DIR=${PORTAGE_TMPDIR}/portage/.distcc
MAKEOPTS=-j4
运行/etc/init.d/distccd start

另外:对手册中这句“注意: 你应当取消 PORTAGE_TMPDIR 行注释。”不理解,在make.conf中没有PORTAGE_TMPDIR这行。

问题:
1怎样才能实现distcc交叉编译
2用无线路由器上网,台式机有线连接,笔记本54M无线网卡连接速度差些对distcc影响是否会很大
3不同发行版在设置distcc上有何差异,家里还有 Althon3000+ arch x86_64和Loongson2e debian squeeze mips o32也想加入distcc
发表于 2009-12-12 20:43:59 | 显示全部楼层
Post by hujy;2055234
我的配置
笔记本 T2390 gentoo i686
台式 VIA C3 gentoo i585

看了手册http://www.gentoo.org/doc/zh_cn/distcc.xml?style=printable,对distcc交叉编译只是简单一提。

在两台机子上已经完成的设置:
编辑make.conf
在FEATURES 添加 "distcc"
添加DISTCC_DIR=${PORTAGE_TMPDIR}/portage/.distcc
MAKEOPTS=-j4
运行/etc/init.d/distccd start

另外:对手册中这句“注意: 你应当取消 PORTAGE_TMPDIR 行注释。”不理解,在make.conf中没有PORTAGE_TMPDIR这行。

问题:
1怎样才能实现distcc交叉编译
2用无线路由器上网,台式机有线连接,笔记本54M无线网卡连接速度差些对distcc影响是否会很大
3不同发行版在设置distcc上有何差异,家里还有 Althon3000+ arch x86_64和Loongson2e debian squeeze mips o32也想加入distcc


假设你有两台gentoo机器, 姑且称为A, B, A启用distcc, B安装但不启用
1. A,B都安装distcc

emerge distcc

2. 配置A的/etc/make.conf

     方法和你所说的一样,
      PORTAGE_TMPDIR默认的值应该是/var/tmp
     通过emerge --info | grep TMPDIR 检查下,
     如果没有结果的话, 你自己手动在/etc/make.conf添加如下
     PORTAGE_TMPDIR=”/var/tmp“
    注意: 添加的内容必须在DISTCC_DIR之前

3. A,B同时配置/etc/conf.d/distccd里面DISTCCD_OPTS的allow, listen选项

示例如下
DISTCCD_OPTS="${DISTCCD_OPTS} --allow 192.168.2.0/24"
DISTCCD_OPTS="${DISTCCD_OPTS} --listen 192.168.2.135"
allow:哪些网段的机器可以参与本机的distcc
listen: 本地机器的ip地址
注意A,B的listen是不同的

4. A配置/etc/env.d/02distcc, 添加DISTCC_HOSTS

DISTCC_HOSTS="192.168.2.120 192.168.2.140 192.168.2.135 192.168.2.150"
告诉A需要象哪些机器去发送distcc的请求
里面的ip地址的排列顺序和优先级是成正比的, 一般本机是第一位, 网络连接比较慢的,速度不快的机器放在后面。 连接速度的差异是会导致distcc不能完全发挥效率的,但是从你的情况来看54M的无线网卡, 一般是支持80211g的, 问题不会太大。

5 确保A,B的path中包含/usr/lib/distcc/bin

(可选)如果启用ccache确保PATH中的/usr/lib/ccache/bin在usr/lib/distcc/bin之前。

6 更新环境

env-update && source /etc/profile

7 重启distccd

/etc/init.d/distccd restart

8 在A, B机器行都运行 netstat -ap | grep distcc
如果都能看到结果, 恭喜你已经顺利完成设置工作, 可以开始emerge了

9 其他的linux的机器也是可以安装distcc帮助编译的,

安装distcc, 配置和gentoo B类似,
设置allow,listen选项, 启动distcc服务

需要额外的配置工作是, gentoo的机器emerge是采用的是类似于i686-pc-linux-gnu-gcc编译指令, 在其他版本的/usr/bin中会没有这个可执行文件,
假设在arch的/usr/bin中的存在gcc这个可执行文件,
你在arch中创建如下链接
ln -sv /usr/bin/gcc /usr/bin/i686-pc-linux-gnu-gcc

最后提醒下 如果gentoo机器要启用分布式编译在/etc/make.conf 的CFLAGS关于CPU类型请不要使用native的选项, 这样会导致严重的后果。 gcc, glibc最好也不要使用distcc编译。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-12-13 00:15:33 | 显示全部楼层
谢谢如此详细的回复。
我把VIA C3做为A,TT2390做为B,按步骤下来。完成8后,在A, B机器行都运行 netstat -ap | grep distcc成功,之后在A机运行 emerge,B机没有参与编译。
回复 支持 反对

使用道具 举报

发表于 2009-12-13 01:57:46 | 显示全部楼层
在两台机器上分别查看下/usr/lib/distcc/bin中的文件名字

必须保证A的机器上的emerge是所执行的编译指令在B的机器上的/usr/lib/distcc/bin能找的到
看你的配置 VIA 与TT2390的cpu类型是不一样, 你要自己创建链接, 达到在TT2390的/usr/lib/distcc/bin/可以找到匹配VIA的编译指令.

如果还是不行, 请设定/etc/env.d/02distcc中的DISTCC_LOG变量, 然后把相应的log文件内容贴出来
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-12-13 14:02:15 | 显示全部楼层
看了不开花的帖子Gento distcc文档和distcc交叉编译指南
http://linuxsir.cn/bbs/showthrea ... mp;highlight=distcc
英文手册distcc交叉编辑指南
http://www.gentoo-cn.org/doc/en/cross-compiling-distcc.xml

按照手册来做
在B机上,
# emerge crossdev
# crossdev -t i586
安装i586的编译工具链
再在A机上
# cd /usr/lib/distcc/bin
# rm g++ c++ gcc cc
# vim i586-pc-linux-gnu-wrapper
写入
#!/bin/bash
exec /usr/lib/distcc/bin/i586-pc-linux-gnu-g${0[-2]} "$@"
# chmod a+x i586-pc-linux-gnu-wrapper
# ln -s i586-pc-linux-gnu-wrapper g++
# ln -s i586-pc-linux-gnu-wrapper c++
# ln -s i586-pc-linux-gnu-wrapper gcc
# ln -s i586-pc-linux-gnu-wrapper cc

一试distcc还是不行,查看了B机上i586的编译工具链,安装了china-overlay中gcc-4.4.2,A机上的gcc是4.3.4。
emerge  =cross-i586-pc-linux-gnu/gcc-4.3.4

之后好像distcc运行了,但是运行distccmon-gui没有内容显示。
回复 支持 反对

使用道具 举报

发表于 2009-12-13 14:44:52 | 显示全部楼层
我玩过的一次供参考.

http://linuxsir.cn/bbs/thread344735.html
回复 支持 反对

使用道具 举报

发表于 2009-12-13 15:06:24 | 显示全部楼层
distcc做交叉编译确实比较麻烦,两边的编译器版本和路径需要完全相同,如果要用到pump模式要求更严格一些。
至于编译时distccmon-gui看不到结果,可能是DISTCC_DIR环境变量设置和make.conf里面的不匹配。通常distcc默认~/.distcc目录,portage里面调用会设置成/var/tmp/portage/.distcc,所以需要写成DISTCC_DIR=/var/tmp/portage/.distcc distccmon-gui才能看到正确过程。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-12-13 16:03:42 | 显示全部楼层
DISTCC_DIR=/var/tmp/portage/.distcc distccmon-gui
确实有用,能正确显示了。
回复 支持 反对

使用道具 举报

发表于 2011-3-12 07:54:27 | 显示全部楼层
4. A配置/etc/env.d/02distcc, 添加DISTCC_HOSTS

DISTCC_HOSTS="192.168.2.120 192.168.2.140 192.168.2.135 192.168.2.150"
告诉A需要象哪些机器去发送distcc的请求
里面的ip地址的排列顺序和优先级是成正比的, 一般本机是第一位, 网络连接比较慢的,速度不快的机器放在后面。 连接速度的差异是会导致distcc不能完全发挥效率的,但是从你的情况来看54M的无线网卡, 一般是支持80211g的, 问题不会太大。

--------------------------------
修正2楼一个问题。

这里应该是改/etc/distcc/hosts.
注释默认的127.0.0.1, 添加类似: 192.168.2.120 192.168.2.140.
/etc/init.d/distccd restart后,用distcc --show-hosts,如果出现;
192.168.2.120
192.168.2.140字样说明设置distcc hosts成功。

我原来按照2楼的设置,distcc有时能行,有时不起作用, 完全本机编辑 ,监控无send字样。
回复 支持 反对

使用道具 举报

发表于 2011-3-12 20:43:47 | 显示全部楼层
最好是gcc的版本一致
会减少很多莫名的问题
个人觉得distcc
在两台CPU和MEM差不多计算机上
提速不是很明显
distcc最明显的提速是C2D帮P3编译
呵呵
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表