distcc的一点点注意

| 评论(0)

话说在Gentoo上用distcc来加速编译也有些时日了,但今天才比较明白研究是怎么个设置法,就把 自己觉得是关键的几个设置点勾勒勾勒。

首先,可以认为distcc的体系中有两个角色,一是把.c或.cpp发出去,等着收.o的机子,可 以认为是client;另一种是收.c或.cpp,编译为.o发出去的机子,可以认为是server。无论 是client还是server都需要有相同的toolchain和distcc,就是说 binutils、gcc、libtool、glibc、distcc都要一样。当然server上可以是交叉编译用的工 具链(可以用crossdev生成)

如果说client和server都是一样架构的机子,比如都是x86,那只需在client和server上都emerge上相同 版本的binutils、gcc、libtool、glibc和distcc即可。但如果说client是i686,server是x86_64就麻烦一些了。 怎么办呢?只要在server上做一个交叉编译的工具链就可以了。这可以用crossdev来做。

在x86_64的server机上emerge crossdev后,可以用crossdev -t i686-pc-linux-gnu来生成所需要的i686的工具链,此时在eix-update后你可以用eix -e binutils看到会有一个cross-i686-pc-linux-gnu/binutils,同样的情况还有gcc、linux-headers、glibc, 确保这几个cross-i686-pc-linux-gnu/xx和你client机上的相应包是一样的版本。之后在server和client上都 emerge上相同版本的distcc。

然后在server机上设置一下distccd,以便能接client机发出的编译请求。主要是建立一个日志文件,设置一下/etc/conf.d/distccd,然后启动distccd后台,并加到了default的runlevel中:

代码: 建立distccd日志文件
touch /var/log/distccd
chown distcc:daemon /var/log/distccd

chown一定要做,不然distccd会因为没有写不了日志而起不来。

文件: /etc/conf.d/distccd
DISTCCD_OPTS=""

# this is the distccd executable 
DISTCCD_EXEC="/usr/bin/distccd"

# this is where distccd will store its pid file
DISTCCD_PIDFILE="/var/run/distccd/distccd.pid"

# set this option to run distccd with extra parameters
# Default port is 3632.  For most people the default is okay.
DISTCCD_OPTS="${DISTCCD_OPTS} --port 3632"

# 设置一下日志文件
DISTCCD_OPTS="${DISTCCD_OPTS} --log-file /var/log/distccd"
DISTCCD_OPTS="${DISTCCD_OPTS} --log-level critical"
# 允许连接的client,以198.168.0.2和10.0.0.0/24为例,当然嘻嘻...
DISTCCD_OPTS="${DISTCCD_OPTS} --allow 198.168.0.2"
DISTCCD_OPTS="${DISTCCD_OPTS} --allow 10.0.0.0/24"
# server的ip
DISTCCD_OPTS="${DISTCCD_OPTS} --listen 198.168.0.3"
# set this for niceness
# Default is 15
DISTCCD_OPTS="${DISTCCD_OPTS} -N 15"

然后,启动distccd,并加到default的runlevel中:

代码: 启动distccd
/etc/init.d/distccd start
rc-update add distccd default

接着,我们需要在client上做一下设置,使得emerge时distcc出去的是i686-pc-linux-gnu-gcc这样 完整的编译器名称而不是简单的gcc。方法很简单,只需要在/usr/lib/distcc/bin下添加一个i686-pc-linux-gnu-wrapper:

文件: /usr/lib/distcc/bin/i686-pc-linux-gnu-wrapper
#!/bin/bash
exec /usr/lib/distcc/bin/i686-pc-linux-gnu-g${0:$[-2]} "$@"

然后cd到/usr/lib/distcc/bin下,把gcc、g++、cc、c++等直接指向/usr/bin/distcc的链接指向我们的 i686-pc-linux-gnu-wrapper:

代码: 指向i686-pc-linux-gnu-wrapper
cd /usr/lib/distcc/bin
ln -sf i686-pc-linux-gnu-wrapper gcc
ln -sf i686-pc-linux-gnu-wrapper g++
ln -sf i686-pc-linux-gnu-wrapper c++
ln -sf i686-pc-linux-gnu-wrapper cc

这样从client机子上distcc出去的就全部都是完整的i686-pc-linux-gnu-gcc和 i686-pc-linux-gnu-g++了。从而,在x86_64的server机上的distccd就能正确调用交叉编译 i686用的工具链而不是x86_64的工具链来编译了。

最后,在/etc/distcc/hosts中加上server,具体的设置可以man distcc看下。其实很简单,比如我打算在本机上编译1个任务,但在server上编译3个,那么:

文件: /etc/distcc/hosts
localhost/1 192.168.0.3/3

如果你有足够多的server的话,建议不让localhost作为server,因为distcc只能在server上编译而得到.o文件,configure、link等步骤在client上完成的,所以让你的client专门负责configure和link会使整个编译速度更快些。

mysql的加密连接设置

| 评论(0)

最近有设置一下mysql的数据库,需要从远程进行数据库的操作。为了保证安全, 就用了启用了SSL的加密连接。

mysql的加密连接设置并不复杂,首先需要生成CA的密钥对和server端及客户端的 密钥对。最简单的是用openvpn源代码中带的easy-rsa目录下的脚本,ca和key的生 成及签署可以一气呵成,具体的使用看一下openvpn的quick start,里面对各个文 件的作用也作了详细的说明,是不错的参考资料。

有了ca和公钥私钥后就可以进行mysql server和client的设置了,当然mysql编译的时候要加ssl的支持,Gentoo上加上ssl的USE就可以了。

server的设置有三步,

  1. 把ca.crt、server.key、server.crt复制到/etc/mysql/下
  2. 在/etc/mysql/my.cnf的[mysqld]中加入如下的设置,没有[mysqld]就自己加上嘛:
    • ssl
    • ssl-ca=/etc/mysql/ca.crt
    • ssl-key=/etc/mysql/server.key
    • ssl-cert=/etc/mysql/server.crt
  3. 然后/etc/init.d/mysql restart 重启mysql服务。用mysql -u root -p 登入mysql console,用show variable like "%ssl%";看看ssl的设置。再用 GRANT语句+REQURE SSL或REQUIRE X509给需要远程连接的帐户设定SSL加密的要 求。其中REQUIRE SSL需要client连接时必须用--ssl-ca=ca.crt出具和server端 一样的ca公钥,REQUIRE X509更严格,还需用--ssl-cert和--ssl-key指定公钥 私钥,估计公钥要用server端的ca签署

客户端上的设置类似,但可以在/etc/mysql/my.cnf或~/.my.cnf中的[client]或[mysql]中加入:

  • ssl
  • ssl-ca=ca文件
  • ssl-cert=客户端的公钥
  • ssl-key=客户端的私钥

这样,当客户端在连接服务器的时候就能用SSL连接了,否则就会有 ERROR 2026 (HY000): SSL connection error 的错误啦。

思绪纷乱

| 评论(0)

划过天际,光线的忽明忽暗忽暗。

似有似无,以何来纷然释出?

心灵的轨迹,那宛如星光般璀灿的光芒,又如那黑色的光线,从身边无声地滑过。

梦想,展开的画卷,宁静的深夜中最静谧的部分,在远方,在眼前。