-->
ラベル distcc の投稿を表示しています。 すべての投稿を表示
ラベル distcc の投稿を表示しています。 すべての投稿を表示

2011-05-20

distccの設定

(1) distccクライアントで binutils, gcc, linux-headers, glibc を入っているバージョンに、手動でマスクします。
$ tail -n4 /etc/portage/package.mask
>sys-devel/binutils-2.20.1-r1
>sys-devel/gcc-4.3.4
>sys-kernel/linux-headers-2.6.27-r2
>sys-libs/glibc-2.11.3
$ grep CHOST /etc/make.conf
CHOST="powerpc-unknown-linux-gnu"

(2) distccサーバーで同じバージョンをインストールします。
$ sudo USE="-gtk -multilib -openmp -mudflap -nptl" crossdev -t powerpc-unknown-linux-gnu --binutils 2.20.1-r1 --gcc 4.3.4 --kernel 2.6.27-r2 --libc 2.11.3

(3) 確認します。
distccサーバーの/etc/conf.d/distccdにログファイルを設定します。
DISTCCD_OPTS="${DISTCCD_OPTS} --log-level debug --log-file /var/tmp/distcc.log" など
distccを再起動してログを閲覧します。distccクライアントでemergeを実行します。成功の場合ログが表示されます。
$ tail -f /var/tmp/distcc.log|grep -iP "time:.*ms"
distccd[29406] (dcc_job_summary) client: 192.168.0.150:50257 COMPILE_OK exit:0 sig:0 core:0 ret:0 time:9627ms powerpc-unknown-linux-gnu-gcc builtin/merge.c
...

crossdevの-tはdistccクライアントのCHOSTです。
distccクライアントのCFLAGSには-march=nativeを使えません。
上記は違うCPU用の設定です。



以下はメモです。

### distccホスト。
distccクライアントに合わせて作成します。
$ sudo USE="-gtk -multilib -openmp -mudflap -nptl" crossdev -t powerpc-unknown-linux-gnu --binutils 2.18-r3 --gcc 4.3.4 --kernel 2.6.27-r2 --libc 2.10.1-r1
確認します。
$ emerge -pv cross-powerpc-unknown-linux-gnu/binutils cross-powerpc-unknown-linux-gnu/gcc cross-powerpc-unknown-linux-gnu/linux-headers cross-powerpc-unknown-linux-gnu/glibc
$ tail -n4 /etc/portage/package.mask

### distccクライアント。
確認します。
$ emerge -pv binutils gcc linux-headers glibc

失敗しないようにマスクします。
$ cat /etc/portage/package.mask|tail -n5
>=sys-fs/udev-146
>sys-devel/binutils-2.18-r3
>sys-devel/gcc-4.3.4
>sys-kernel/linux-headers-2.6.27-r2
>sys-libs/glibc-2.10.1-r1

pump用の設定をします。
$ cat /etc/distcc/hosts
192.168.0.100,cpp,lzo 192.168.0.100,cpp,lzo 192.168.0.100,cpp,lzo 192.168.0.100,cpp,lzo 192.168.0.100,cpp,lzo

様子を表示します。
$ sudo DISTCC_DIR=/var/tmp/portage/.distcc distccmon-text 1|grep 192.168.0.100

パッケージをアップデートします。
$ sudo pump emerge --update --deep --newuse --verbose --tree --with-bdeps=y --jobs=10 --load-average=20 --keep-going world 1>/var/tmp/scriptlog/emerge_`date +%Y-%m-%d_%H-%M-%S`.log 2>&1 &

この場合ロードアベレージが20以下の場合、同時に10個までインストールの動作をします。
コンパイルに失敗しても、できるだけ進みます。

pump emergeの出力を見ます。
$ tail -f /var/tmp/scriptlog/emerge_2011-05-17_00-23-39.log

成功している場合distccmon-textでファイル名が表示されます。
$ sudo DISTCC_DIR=/var/tmp/portage/.distcc distccmon-text 1|grep 192.168.0.100
 20970  Preprocess  huffman.c                                 192.168.0.100[2]
 20970  Preprocess  huffman.c                                 192.168.0.100[2]
 20970  Preprocess  huffman.c                                 192.168.0.100[2]
 21492  Preprocess  crctable.c                                192.168.0.100[1]
 21492  Preprocess  crctable.c                                192.168.0.100[1]
 21492  Preprocess  crctable.c                                192.168.0.100[1]
...

distccホストで確認します。
$ sudo tcpdump port 3632
tcpdump: WARNING: eth0: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 68 bytes
01:07:34.635882 IP 192.168.0.150.34107 > amdgentoo.distcc: S 1412879801:1412879801(0) win 5840 <mss 1460,[|tcp]>
01:07:34.635929 IP amdgentoo.distcc > 192.168.0.150.34107: S 2709116734:2709116734(0) ack 1412879802 win 5792 <mss 1460,[|tcp]>
01:07:34.636101 IP 192.168.0.150.34107 > amdgentoo.distcc: . ack 1 win 6 <nop,nop,timestamp[|tcp]>
01:07:34.861439 IP 192.168.0.150.34107 > amdgentoo.distcc: P 1:263(262) ack 1 win 6 <nop,nop,timestamp[|tcp]>
...

distccホストでログを取ります。修正後、再起動します。
$ rcsdiff distccd,v /etc/conf.d/distccd
===================================================================
RCS file: distccd,v
retrieving revision 1.4
diff -r1.4 /etc/conf.d/distccd
24,25c24,25
< DISTCCD_OPTS="${DISTCCD_OPTS} --log-level critical"
< #DISTCCD_OPTS="${DISTCCD_OPTS} --log-level debug --log-file /tmp/distcc.log"
---
> #DISTCCD_OPTS="${DISTCCD_OPTS} --log-level critical"
> DISTCCD_OPTS="${DISTCCD_OPTS} --log-level debug --log-file /var/tmp/distcc.log"

ログを表示します。
$ tail -f /var/tmp/distcc.log|grep -iP "time:.*ms"
distccd[29406] (dcc_job_summary) client: 192.168.0.150:50257 COMPILE_OK exit:0 sig:0 core:0 ret:0 time:9627ms powerpc-unknown-linux-gnu-gcc builtin/merge.c
distccd[25088] (dcc_job_summary) client: 192.168.0.150:50259 COMPILE_OK exit:0 sig:0 core:0 ret:0 time:6624ms powerpc-unknown-linux-gnu-gcc builtin/merge-file.c
distccd[19439] (dcc_job_summary) client: 192.168.0.150:50260 COMPILE_OK exit:0 sig:0 core:0 ret:0 time:6900ms powerpc-unknown-linux-gnu-gcc builtin/merge-index.c
...

### distccの再設定
gcc, linux-headers をそのままにした。他を更新。
distccクライアントでdistccを無効にしなくてもbinutils,glibcの更新はエラーにならなかった。

### distccクライアント
package.maskは手動で追加した。
$ tail -n4 /etc/portage/package.mask
>sys-devel/binutils-2.20.1-r1
>sys-devel/gcc-4.3.4
>sys-kernel/linux-headers-2.6.27-r2
>sys-libs/glibc-2.11.3

入ったバージョンの確認。
$ eix -c "^(binutils|gcc|linux-headers|glibc)$"
[I] sys-devel/binutils (2.20.1-r1@2011年05月19日): Tools necessary to build programs
[I] sys-devel/gcc (4.3.4(4.3)@2011年05月18日): The GNU Compiler Collection
[I] sys-kernel/linux-headers (2.6.27-r2@2010年01月14日): Linux system headers
[I] sys-libs/glibc (2.11.3(2.2)@2011年05月20日): GNU libc6 (also called glibc2) C library
Found 4 matches.

### distccサーバー
CHOSTとそれぞれのバージョンを合わせてcrossdevを実行する。
$ sudo USE="-gtk -multilib -openmp -mudflap -nptl" crossdev -t powerpc-unknown-linux-gnu --binutils 2.20.1-r1 --gcc 4.3.4 --kernel 2.6.27-r2 --libc 2.11.3

入ったバージョンの確認。
$ eix -C cross-powerpc-unknown-linux-gnu -cI
[I] cross-powerpc-unknown-linux-gnu/binutils [1] (2.20.1-r1(powerpc-unknown-linux-gnu)@2011年05月20日): Tools necessary to build programs
[I] cross-powerpc-unknown-linux-gnu/gcc [1] (4.3.4(powerpc-unknown-linux-gnu-4.3)@2011年05月16日): The GNU Compiler Collection
[I] cross-powerpc-unknown-linux-gnu/glibc [1] (2.11.3(powerpc-unknown-linux-gnu-2.2)@2011年05月20日): GNU libc6 (also called glibc2) C library
[I] cross-powerpc-unknown-linux-gnu/linux-headers [1] (2.6.27-r2(powerpc-unknown-linux-gnu)@2011年05月16日): Linux system headers
...

自動で追加される。
$ grep cross-powerpc-unknown-linux-gnu /etc/portage/package.mask
>cross-powerpc-unknown-linux-gnu/binutils-2.20.1-r1
>cross-powerpc-unknown-linux-gnu/gcc-4.3.4
>cross-powerpc-unknown-linux-gnu/linux-headers-2.6.27-r2
>cross-powerpc-unknown-linux-gnu/glibc-2.11.3

2011-03-31

revdep-rebuildでエラーのままファイルを消したのでコンパイル自体ができない例

システムの更新に失敗した例です。

(1) revdep-rebuild --library 'libmpfr.so.1'に失敗しているが、
rm '/usr/lib64/libmpfr.so.1'を行うと、その後インストールできなくなる。

バイナリパッケージをemergeでインストールできるので、1個前のバージョンを
再インストールして、/usr/lib64/libmpfr.so.1がある状態に戻す。
$ sudo PORTAGE_BINHOST=http://tinderbox.dev.gentoo.org/default-linux/amd64/ emerge -avgK --oneshot =dev-libs/mpfr-2.4.2_p3

(2) eselect pythonでバージョンを変更していないが、
emerge --depclean -av で消した場合にemergeなどが動作しなくなる。

emergeが動作しないのでバイナリパッケージのpython2.6を手動でダウンロードしてインストールする。
$ wget http://tinderbox.dev.gentoo.org/default-linux/amd64/dev-lang/python-2.6.6-r2.tbz2
$ tar xvjf python-2.6.6-r2.tbz2
$ cp -pri usr/ /

(3) crossdevでi686-pc-linux-gnu用のインストールをすると、
/usr/libexec/gcc/i686-pc-linux-gnu/ld: crt1.o: No such file: No such file or directoryで失敗する。

新しいcrossdevを使用する。
$ sudo ACCEPT_KEYWORDS="~amd64" emerge --oneshot -av =sys-devel/crossdev-20110310
$ sudo crossdev -t i686-pc-linux-gnu --binutils 2.20.1-r1 --gcc 4.4.5 --kernel 2.6.36.1 --libc 2.11.3



以下は詳細。
更新前のバージョンのバイナリをインストールする。
$ sudo PORTAGE_BINHOST=http://tinderbox.dev.gentoo.org/default-linux/amd64/ emerge -avgK --oneshot =dev-libs/mpfr-2.4.2_p3

cpuごとにURLを変更する。この場合x86だと下記のようなエラーになる。
- sys-devel/gcc-4.4.5 (masked by: CHOST: i686-pc-linux-gnu)
- dev-libs/mpfr-2.4.2_p3 (masked by: ~amd64 keyword, CHOST: i686-pc-linux-gnu)

cpuごとのディレクトリの一覧が見える。
http://tinderbox.dev.gentoo.org/default-linux/

再度実行する。
$ sudo revdep-rebuild --library 'libmpfr.so.1'
# これは成功時に実行する。
# rm '/usr/lib64/libmpfr.so.1'

エラーの内容。
$ sudo revdep-rebuild --library 'libmpfr.so.1'
...
emerge: there are no ebuilds to satisfy "cross-powerpc-unknown-linux-gnu/gcc:powerpc-unknown-linux-gnu-4.3".

emerge: searching for similar names...
emerge: Maybe you meant any of these: dev-ruby/osmlib-base, dev-ruby/kirbybase, dev-ruby/snmplib?
 *
 * revdep-rebuild failed to emerge all packages.

黒箱用のコンパイラが古いままだった。古いので使う場合は再度入れるはずなので消す。
$ grep gcc /etc/portage/package.mask
>cross-powerpc-unknown-linux-gnu/gcc-4.3.4
#>cross-i686-pc-linux-gnu/gcc-4.4.3-r2
>=cross-i686-pc-linux-gnu/gcc-4.4.4
$ grep cross-powerpc-unknown-linux-gnu /var/lib/portage/world
cross-powerpc-unknown-linux-gnu/binutils
cross-powerpc-unknown-linux-gnu/gcc
cross-powerpc-unknown-linux-gnu/glibc
cross-powerpc-unknown-linux-gnu/linux-headers
$ sudo emerge -Cav cross-powerpc-unknown-linux-gnu/binutils cross-powerpc-unknown-linux-gnu/gcc cross-powerpc-unknown-linux-gnu/glibc cross-powerpc-unknown-linux-gnu/linux-headers

まずバイナリインストールの古いバージョンを手動で更新してからrevdep-rebuildする。
$ sudo emerge --oneshot -avt =dev-libs/mpfr-3.0.0_p3
$ sudo revdep-rebuild --library 'libmpfr.so.1'

lddなどで確認する。その後消す。
$ ldd /usr/libexec/gcc/x86_64-pc-linux-gnu/4.4.5/cc1
        linux-vdso.so.1 =>  (0x00007fff8c7e2000)
        libmpfr.so.1 => /usr/lib/libmpfr.so.1 (0x00007fa81fc9e000)
        libgmp.so.3 => /usr/lib/libgmp.so.3 (0x00007fa81fa45000)
        libc.so.6 => /lib/libc.so.6 (0x00007fa81f6eb000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa81feed000)
$ ldd /usr/libexec/gcc/x86_64-pc-linux-gnu/4.4.5/cc1
        linux-vdso.so.1 =>  (0x00007fff56fff000)
        libmpfr.so.4 => /usr/lib64/libmpfr.so.4 (0x00007f7092c8e000)
        libgmp.so.3 => /usr/lib64/libgmp.so.3 (0x00007f7092a35000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f70926da000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f7092ee2000)
$ sudo rm '/usr/lib64/libmpfr.so.1'

カーネル更新する。
$ cd /usr/src/
$ sudo rm -i linux
$ sudo ln -s linux-2.6.36-gentoo-r8 linux
$ sudo genkernel --kernel-config=/etc/kernels/kernel-config-x86_64-2.6.36-gentoo-r5 all

/usr/share/genkernel/arch/x86_64/modules_loadはソフトを更新すると初期化するので、
たぶんコマンドで指定できるような気がする。

ブートローダーの再インストール。
$ grub
device (hd0) /dev/sda
root (hd0,0)
setup (hd0)
device (hd0) /dev/sdb
root (hd0,0)
setup (hd0)
quit

depclean実行後にpython関連が動かなくなった。
$ sudo emerge --depclean -av

python-updaterが失敗しているっぽい。(eselectで変更していないのが原因)
手動でバイナリパッケージを再インストールする。
$ wget http://tinderbox.dev.gentoo.org/default-linux/amd64/dev-lang/python-2.6.6-r2.tbz2
$ tar xvjf python-2.6.6-r2.tbz2
$ cp -pri usr/ /

一応入れなおす。
$ sudo emerge --oneshot -avt =dev-lang/python-2.6.6-r2
上書きの警告が出る。
 ...
 * This package will overwrite one or more files that may belong to other
 ...

2.7に変更する。
$ eselect python list
$ sudo eselect python set --python2 2
$ sudo python-updater ${options}
 * Starting Python Updater...
 * Main active version of Python:  2.7  <= たぶんここが2.6だった。
 * Active version of Python 2:     2.7  <= たぶんここが2.6だった。
 * Active version of Python 3:     3.1
 *   Adding to list: app-admin/pessulus:0
 ...
 大量に続く。
 ...
>>> Emerging (1 of 78) app-emulation/emul-linux-x86-baselibs-20110129

trampは本体にあるので消す。
$ sudo emerge -Cav app-emacs/tramp
$ equery files emacs | grep tramp | wc -l
25

確認して2.6を消す。
$ sudo emerge --depclean -av -p
$ eselect python list
$ sudo emerge --depclean -av

普通の更新コマンドを最初から。
$ sudo emerge --update --deep --newuse --verbose --tree --with-bdeps=y --ask world
$ sudo emerge --depclean -av
$ sudo revdep-rebuild
 ...
 *  !!! /usr/lib64/python2.6/lib-dynload/_bsddb.so not owned by any package is broken !!!
 *   /usr/lib64/python2.6/lib-dynload/_bsddb.so -> (none)
 ...

確認して消す。
$ equery belongs /usr/lib64/python2.6/lib-dynload/_bsddb.so
[ Searching for file(s) /usr/lib64/python2.6/lib-dynload/_bsddb.so in *... ]
$ equery belongs /usr/bin/less
[ Searching for file(s) /usr/bin/less in *... ]
sys-apps/less-436 (/usr/bin/less)

2.6のディレクトリは?
$ equery belongs /usr/lib64/python2.6
[ Searching for file(s) /usr/lib64/python2.6 in *... ]
sys-libs/tdb-1.2.1 (/usr/lib64/python2.6)

再インストール。
$ sudo emerge --oneshot -avt =sys-libs/tdb-1.2.1

消えた。
$ equery belongs /usr/lib64/python2.6
[ Searching for file(s) /usr/lib64/python2.6 in *... ]

flashの更新をした。
http://labs.adobe.com/downloads/flashplayer10_square.html
http://download.macromedia.com/pub/labs/flashplayer10/flashplayer10_2_p3_64bit_linux_111710.tar.gz
$ ll ~/.mozilla/plugins/
合計 0
lrwxrwxrwx 1 usui usui 36 2010-11-02 00:26:13 libflashplayer.so -> /home/usui/plugins/libflashplayer.so
usui@amdgentoo ~ $ ll ~/plugins/
合計 10360
-rw-r--r-- 1 usui usui 10606256 2010-11-17 09:10:13 libflashplayer.so

消した。
$ sudo rm -i /usr/lib64/python2.6/lib-dynload/_bsddb.so
$ sudo revdep-rebuild -i

消した。なぜかroot権限では無いのでとりあえずsudo無しで消したら消えたのでびっくりした。
$ equery belongs /usr/lib64/python2.6/
[ Searching for file(s) /usr/lib64/python2.6 in *... ]
$ ll /usr/lib64/python2.6/
合計 28
drwxr-xr-x 3 usui usui  4096 2011-03-27 17:04:24 bsddb/
drwxr-xr-x 2 usui usui  4096 2011-03-28 06:23:43 lib-dynload/
drwxr-xr-x 2 usui usui 20480 2011-03-28 05:42:48 test/
$ rm -rf /usr/lib64/python2.6/

消した。
$ ll /usr/lib64/ | grep usui
drwx------  3 usui usui     4096 2011-03-28 06:00:38 mozilla/
$ equery belongs /usr/lib64/mozilla/
[ Searching for file(s) /usr/lib64/mozilla in *... ]
$ rm -rf /usr/lib64/mozilla/

/usr/lib64/python2.6/のディレクトリがrootではなくなっていた、の関連で、
ディレクトリが一部rootではなくなっていた。操作したユーザーになっていた。
$ find /usr/ -user 1000 | grep -v /usr/local/
$ sudo chown root.root /usr
$ sudo chown root.root /usr/share/
$ equery belongs /usr/share/mozilla
$ sudo rm -rfi /usr/share/mozilla
$ sudo chown root.root /usr/share/doc
$ sudo chown root.root /usr/share/man
$ sudo chown root.root /usr/share/man/man1
$ sudo chown root.root /usr/bin
$ sudo chown root.root /usr/lib64
$ sudo chown root.root /usr/include/

他もおかしそうなので全部再インストールした。
# emerge -eav system
# emerge -eav world

crossdevが失敗する。
* Emerging cross-glibc-headers ...
 * glibc failed :(
 * If you file a bug, please attach the following logfiles:
 * /var/log/portage/cross-i686-pc-linux-gnu-info.log
 * /var/log/portage/cross-i686-pc-linux-gnu-glibc-headers.log

/var/log/portage/cross-i686-pc-linux-gnu-glibc.log によればエラーはcrt1.oが無い。
/usr/libexec/gcc/i686-pc-linux-gnu/ld: crt1.o: No such file: No such file or directory

使用するバージョンを下げても関係なかったので少し新しいcrossdevを使用すると成功した。
$ sudo ACCEPT_KEYWORDS="~amd64" emerge --oneshot -av =sys-devel/crossdev-20110310
$ sudo crossdev -t i686-pc-linux-gnu --binutils 2.20.1-r1 --gcc 4.4.5 --kernel 2.6.36.1 --libc 2.11.3

自動で変わる。/etc/portage/package.mask
>cross-i686-pc-linux-gnu/binutils-2.20.1-r1
>cross-i686-pc-linux-gnu/gcc-4.4.5
>cross-i686-pc-linux-gnu/linux-headers-2.6.36.1
>cross-i686-pc-linux-gnu/glibc-2.11.3

使う側を書き換え。/etc/portage/package.mask
>sys-devel/binutils-2.20.1-r1
>sys-devel/gcc-4.4.5
>sys-kernel/linux-headers-2.6.36.1
>sys-libs/glibc-2.11.3
同じバージョンにする前にdistccをoffにしたほうが安全。同じバージョンにした後に有効にする。

2010-01-14

crossdevのインストール

2010-7-11 追記 この記事は間違っています。

この記事は違うcpuでdistcc を使うの補足です。

distccをインストールして起動します。
http://www.gentoo.org/doc/ja/distcc.xml

kurobox-hg 側のバージョンを確認します。
$ emerge -pv binutils gcc linux-headers glibc

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild   R   ] sys-devel/binutils-2.18-r3  USE="nls -gold -multislot -multitarget -test -vanilla" 0 kB
[ebuild   R   ] sys-kernel/linux-headers-2.6.27-r2  0 kB
[ebuild   R   ] sys-devel/gcc-4.3.4  USE="fortran nls -altivec -bootstrap -build -doc (-fixed-point) -gcj -gtk (-hardened) (-libffi) -mudflap (-multilib) -multislot (-n32) (-n64) -nocxx -nopie -nptl -objc -objc++ -objc-gc -openmp -test -vanilla" 0 kB
[ebuild   R   ] sys-libs/glibc-2.9_p20081201-r2  USE="gd nls -debug -glibc-omitfp (-hardened) (-multilib) -profile (-selinux) -vanilla" 0 kB

CPUが早い方の gentoo の入ったパソコンで同じバージョンをインストールします。
その際USEをそろえます。
sudo USE="-nptl -gtk -multilib -openmp mudflap" crossdev -t powerpc-unknown-linux-gnu --binutils 2.18-r3 --gcc 4.3.4 --kernel 2.6.27-r2 --libc 2.9_p20081201-r2

確認します。
$ emerge -pv cross-powerpc-unknown-linux-gnu/binutils cross-powerpc-unknown-linux-gnu/gcc cross-powerpc-unknown-linux-gnu/linux-headers cross-powerpc-unknown-linux-gnu/glibc

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild   R   ] cross-powerpc-unknown-linux-gnu/binutils-2.18-r3  USE="nls -gold -multislot -multitarget -test -vanilla" 0 kB [1]
[ebuild   R   ] cross-powerpc-unknown-linux-gnu/linux-headers-2.6.27-r2  0 kB [1]
[ebuild   R   ] cross-powerpc-unknown-linux-gnu/gcc-4.3.4  USE="fortran (multilib) nls (-altivec) -bootstrap -build -doc (-fixed-point) -gcj -gtk -hardened -libffi -mudflap -multislot (-n32) (-n64) -nocxx -nopie -nptl -objc -objc++ -objc-gc -openmp -test -vanilla" 0 kB [1]
[ebuild   R   ] cross-powerpc-unknown-linux-gnu/glibc-2.9_p20081201-r2  USE="gd (multilib) nls -debug -glibc-omitfp -hardened -profile (-selinux) -vanilla" 0 kB [1]

早い方のgentooのpackage.keywords, package.mask, package.useに設定が追加されます。
その際 kurobox-hg 側に同じようなマスクを追加します。
>sys-devel/binutils-2.18-r3
>sys-devel/gcc-4.3.4
>sys-kernel/linux-headers-2.6.27-r2
>sys-libs/glibc-2.9_p20081201-r2

早い方の gentoo にインストールしたパッケージが消されないように登録します。
$ sudo grep cross-powerpc-unknown-linux-gnu /var/lib/portage/world
cross-powerpc-unknown-linux-gnu/binutils
cross-powerpc-unknown-linux-gnu/gcc
cross-powerpc-unknown-linux-gnu/glibc
cross-powerpc-unknown-linux-gnu/linux-headers

kurobox-hg 側の emerge の設定に distcc を追加します。
$ grep -i distcc /etc/make.conf
FEATURES="distcc"
DISTCC_HOSTS="192.168.0.100 192.168.0.100 192.168.0.100 192.168.0.100 192.168.0.100"

updateのコマンドを実行します。
(例) $ sudo emerge --update --deep --newuse --verbose --tree --with-bdeps=y --jobs=10 --load-average=5 --keep-going -ask world

成功している場合、付属のコマンドで、経過が出力されます。
cpu貸りる側。
$ sudo DISTCC_DIR=/var/tmp/portage/.distcc distccmon-text 1|grep -v ^$
 29861  Blocked                                                            [0]
 29856  Preprocess  io.cc                                     192.168.0.100[0]
 29757  Preprocess  base.cc                                   192.168.0.100[1]
 29792  Preprocess  versionsort.cc                            192.168.0.100[2]
 29860  Preprocess  header.cc                                 192.168.0.100[3]

cpu貸す側。
$ sudo tcpdump tcp port 3632 -n -v

gccなどの使われないパッケージも有ります。
pump emerge を使うと、より使うそうだが php で試したらセグメンテーション違反になりました。
libtool を使うものと相性が悪いらしいです。
cpu 借りる側の cpu 以外の性能も悪ければ cpu 貸す側は phenom9350e 以下で余裕で足ります。
この例の場合、このcpu1個で足ります。topなどでロードアベレージが0.5いきません。

後日、再度 pump emerge -av php をやったら大丈夫でした。

2009-12-06

違うcpuでdistcc を使う の補足 part2

2010-7-11 追記 この記事は間違っています。

この記事は違うcpuでdistcc を使うの補足です。

pump emerge xxx は libtool 関連で使わない方がいいかもしれません。
php の worker モジュールで exit signal Segmentation fault と出たので pump を使わずに再インストールしたところ、再現しませんでした。
$ equery depends libtool

2009-12-04

違うcpuでdistcc を使う の補足

2010-7-11 追記 この記事は間違っています。

この記事は違うcpuでdistcc を使うの補足です。

linux-headers 以外の package.mask 変更しました。
distcc client
>=sys-devel/binutils-2.19
>=sys-kernel/linux-headers-2.6.28
>=sys-devel/gcc-4.4
>=sys-libs/glibc-2.10
>=sys-devel/distcc-3.2

distcc host
>=cross-i686-pc-linux-gnu/binutils-2.19
>=cross-i686-pc-linux-gnu/gcc-4.4
>=cross-i686-pc-linux-gnu/linux-headers-2.6.28
>=cross-i686-pc-linux-gnu/glibc-2.10
>=sys-devel/distcc-3.2

pumpを有効にしました。
DISTCC_HOSTS に同じ設定を連続して書くことに意味は無いです。
MAKEOPTS="-j5"
FEATURES="distcc"
DISTCC_HOSTS="192.168.0.100,cpp,lzo 192.168.0.100,cpp,lzo 192.168.0.100,cpp,lzo 192.168.0.100,cpp,lzo 192.168.0.100,cpp,lzo"

作業状況を閲覧するコマンドは distccmon-xxx です。
$ sudo DISTCC_DIR=/var/tmp/portage/.distcc distccmon-text 1|grep -v ^$

インストール後のメッセージです。
* Messages for package sys-devel/distcc-3.1-r4:

 *
 * Tips on using distcc with Gentoo can be found at
 * http://www.gentoo.org/doc/en/distcc.xml
 *
 * How to use pump mode with Gentoo:
 * # distcc-config --set-hosts "foo,cpp,lzo bar,cpp,lzo baz,cpp,lzo"
 * # pump emerge -u world
 *
 * To use the distccmon programs with Gentoo you should use this command:
 * # DISTCC_DIR="/var/tmp/portage/.distcc" distccmon-text 5
 *
 * ***SECURITY NOTICE***
 * If you are upgrading distcc please make sure to run etc-update to
 * update your /etc/conf.d/distccd and /etc/init.d/distccd files with
 * added security precautions (the --listen and --allow directives)
 *

遅いPCが重い作業をしている時に、CPUを借りると遅くなります。
(例)
kurobox-hg を distcc のホストにしてCPUを借りる。
kurobox-hg で emerge world などを行う。
kurobox-hg に渡した分のコンパイルが長時間帰って来ない。

CPUを借りる側の、CPU以外に余裕がないと、効果は薄いです。
(例)
./configure などは distcc に関係が無い。
処理時間の大部分がコンパイル以外にある。
vmstat の io の bi, bo の部分の数字が高い。

2009-12-02

違うcpuでdistccを使う

2010-7-11 追記 この記事は間違っています。

この記事は違うcpuでdistccを使う際の参考です。

この例の場合の条件
ネットワーク => 192.168.0.0/24(192.168.0.0/255.255.255.0)
CPUが新しい  => phenom(192.168.0.100)
CPUが古い    => pen3(192.168.0.200)

192.168.0.200 で現在のバージョンを確認します。
$ emerge -pv binutils gcc linux-headers glibc

192.168.0.100 で現在のバージョンを確認します。
emerge -pv cross-i686-pc-linux-gnu/binutils cross-i686-pc-linux-gnu/gcc cross-i686-pc-linux-gnu/linux-headers cross-i686-pc-linux-gnu/glibc

192.168.0.100 でマッチするバージョンをインストールします。
USEをそろえます。multilib はCPUを貸す側には追加されます。
crossdev でインストールします。
USE="-gtk -multilib -openmp mudflap" crossdev -t i686-pc-linux-gnu --binutils 2.18-r3 --gcc 4.3.4 --kernel 2.6.27-r2 --libc 2.9_p20081201-r2

192.168.0.100 で /etc/conf.d/distccd に設定します。
一つのサーバーでIPアドレスが複数ある場合は設定します。
DISTCCD_OPTS="${DISTCCD_OPTS} --listen 192.168.0.100"

192.168.0.200 で/etc/conf.d/distccdに設定します。
一つのサーバーでIPアドレスが複数ある場合は設定します。
DISTCCD_OPTS="${DISTCCD_OPTS} --listen 192.168.0.200"

192.168.0.200 で設定します。
$ distcc-config --set-hosts "192.168.0.100"

192.168.0.200 で /etc/portage/package.mask に設定します。
>sys-devel/binutils-2.18-r3
>sys-kernel/linux-headers-2.6.27-r2
>sys-devel/gcc-4.3.4
>sys-libs/glibc-2.9_p20081201-r2

192.168.0.200 で /etc/make.conf に設定します。
ccache を手前にすると ccache が先になります。
FEATURES="ccache distcc"        # ccache, distcc を使う
DISTCC_HOSTS="192.168.0.100"    # distcc のCPUに余裕のあるIPアドレスの指定
CCACHE_SIZE="2G"                # ccache のキャッシュファイルの最大容量
CCACHE_DIR="/var/tmp/ccache"    # ccache の保存ディレクトリ
MAKEOPTS="-j3"                  # emerge の gcc に渡す同時実行数(pump とは異なる)

192.168.0.100 で /etc/portage/package.mask に設定します。
>cross-i686-pc-linux-gnu/binutils-2.18-r3
>cross-i686-pc-linux-gnu/gcc-4.3.4
>cross-i686-pc-linux-gnu/linux-headers-2.6.27-r2
>cross-i686-pc-linux-gnu/glibc-2.9_p20081201-r2

両方のサーバーでdistccを起動します。
$ rc-update add distccd default
$ /etc/init.d/distccd restart

192.168.0.200 で /etc/make.conf の -march=native を分解します。
-march=native をコンパイルオプションに含む場合 distcc は無効になります。
CFLAGS="-march=pentium3 --param l1-cache-size=16 --param l1-cache-line-size=32 -mtune=generic -fomit-frame-pointer -O2"
CXXFLAGS="${CFLAGS}"

192.168.0.200 で emerge パッケージ名 などのコマンドを実行します。
$ emerge -eav system

192.168.0.100 でパケットを見ます。
$ tcpdump tcp port 3632 -n

以前 glibc のバージョンが違う場合で、かつ ppc が CPU を借りる側の場合に glibc が sunrpc に関するエラーでコンパイルできなかったので、バージョンを合わせるのはお勧めです。

gcc,glibcなどのパッケージの3つ目の番号が違う場合は、動きます。
xxx-3.4.5 => xxx-3.4.6

コンパイル以外の部分は早くなりません。
./configure
...
checking xxx

参考
http://d.hatena.ne.jp/tmatsuu/20090110/1231557035
http://www.gentoo.org/doc/ja/distcc.xml
http://www-auklet.gentoo.org/doc/ja/handbook/handbook-sparc.xml?part=2&chap=3