基于多层SSH跳转使用distcc远程编译的配置方案咨询
嗨,我完全理解你想用distcc解决本地编译FreeCAD慢又发热的痛点——4小时确实够折磨人的,而且笔记本烫得没法放腿上太难受了😅。针对你这种需要先跳转到PUBLIC服务器才能访问内网A、B机器的场景,我给你整理一套靠谱的配置步骤,亲测好用:
第一步:搞定SSH多层跳转与免密登录
首先得让你本地能直接一键连到A、B,不用每次手动跳两次SSH。咱们通过~/.ssh/config来简化配置:
- 先在本地生成SSH密钥(如果还没的话):
ssh-keygen -t rsa -b 4096
一路回车就行,不用设密码(或者设密码后用ssh-agent记住,兼顾便捷与安全)。
- 把公钥传到PUBLIC服务器:
ssh-copy-id <你的PUBLIC用户名>@<PUBLIC的IP/域名>
然后从PUBLIC服务器把公钥传到A和B:
ssh <你的PUBLIC用户名>@<PUBLIC的IP/域名> "ssh-copy-id <你的A用户名>@<A的内网IP/主机名>" ssh <你的PUBLIC用户名>@<PUBLIC的IP/域名> "ssh-copy-id <你的B用户名>@<B的内网IP/主机名>"
- 编辑本地的
~/.ssh/config,添加以下内容:
# 配置PUBLIC服务器连接 Host public HostName <PUBLIC的IP或域名> User <你的PUBLIC用户名> IdentityFile ~/.ssh/id_rsa # 开启连接复用,大幅提升多次连接的速度 ControlMaster auto ControlPath ~/.ssh/sockets/%r@%h:%p ControlPersist 1h # 配置通过PUBLIC跳转连接serverA Host serverA HostName <A的内网IP或主机名> User <你的A用户名> IdentityFile ~/.ssh/id_rsa ProxyJump public ControlMaster auto ControlPath ~/.ssh/sockets/%r@%h:%p ControlPersist 1h # 配置通过PUBLIC跳转连接serverB Host serverB HostName <B的内网IP或主机名> User <你的B用户名> IdentityFile ~/.ssh/id_rsa ProxyJump public ControlMaster auto ControlPath ~/.ssh/sockets/%r@%h:%p ControlPersist 1h
现在你在本地直接敲ssh serverA或者ssh serverB,应该就能秒连了,不用输密码也不用先手动跳PUBLIC。
第二步:确保远程机器A、B准备好distcc
你需要在A和B上都安装distcc工具(不用启动distccd服务,因为咱们用SSH模式,distcc会通过SSH在远程临时调用编译进程):
比如在Debian/Ubuntu系机器上:
sudo apt install distcc
在RHEL/CentOS系:
sudo dnf install distcc
安装完后,测试一下远程能不能正常执行distcc命令:
ssh serverA distcc --version
能正常输出版本信息就说明没问题。
第三步:配置本地distcc环境
- 设置distcc的主机列表,告诉它要用到哪些远程机器。你可以直接临时设置环境变量:
# 假设A和B各有4核,就给每个分配4个编译线程,按需调整 export DISTCC_HOSTS="serverA/4 serverB/4"
如果想永久生效,可以把这行加到你的~/.bashrc或者~/.zshrc里。
- 配置编译时使用distcc作为编译器。编译FreeCAD的时候,你可以通过环境变量指定:
export CC="distcc gcc" export CXX="distcc g++"
或者在cmake配置阶段直接指定:
cmake -DCMAKE_C_COMPILER=distcc -DCMAKE_CXX_COMPILER=distcc ../FreeCAD-source
第四步:测试编译并开始构建
先测试一下distcc能不能正常调用远程编译:
distcc test
如果输出类似distcc[1234] (dcc_test_version) INFO: serverA accepts distcc 3.4这样的信息,说明连接完全正常。
然后就可以开始编译FreeCAD了,记得用-j参数指定总线程数(比如A和B各4核,就用-j8):
make -j8
这样编译任务就会分流到A和B,本地只负责协调调度,再也不会烫腿啦!
一些额外的小技巧
- 如果远程机器的CPU核心数多,你可以调整
DISTCC_HOSTS里的线程数,比如serverA/8就是给A分配8个编译线程。 - 可以用
distccmon-text 1实时监控编译任务的分配情况,看看A和B的负载状态。 - 要是遇到权限问题,确保远程机器上的用户有编译所需的权限,比如能读写临时文件、访问编译依赖等。
备注:内容来源于stack exchange,提问作者André Caldas

