Cross compiling ports with distcc on OpenBSDの手順に従ってやってみますね。とはいえ、原典はmacppc向けのビルド手順ですが、自分はarmv7向けにやります。あと、ネットワークに繋がってるマシンはVMware Player上に用意した4コアの仮想マシンということで。
仮想マシンのゲストOSの設定、いつもだと「その他のOS/64bit」にしているのですが、今回は「その他のLinux 5.x以降のカーネル(64bit)」にしています。またデバイスは必要最低限(SCSIのHDD, CD/DVD, ネットワークとディスプレイ)として、vmxファイルのethernet0.virtualDev="vmxnet3"としてvmx(4)を使うようにしています。
普通にOpenBSD-6.8/amd64を仮想マシンにインストールして(起動時のVMware tools for Linuxのインストールに関する表示が鬱陶しいけど)…先に、Preparing the amd64 machineの手順に従って作業します。
- chrootを使うにはwxallowedな区画が必要で、/dev/sd0aをまるごと/にマウントしてしまうような場合は/etc/fstabの<DUID> / ffs rw,wxallowed 1 1となっていることを確認
- distccを動かすマシンでも、ports.tar.gzをダウンロードして/usr/portsに展開する
- chrootな環境を放り込むディレクトリは、とりあえず mkdir /usr/local/chroot で用意
- /usr/ports/infrastructure/bin/proot -B /usr/local/chroot actions=chown_all
※詳細はproot(1)参照
- cp /etc/installurl /usr/local/chroot/etc
※原典では/usr/local/chrootへのコピーになっているが、多分こちらのはず(そもそもinstallurlはpkg_addのダウンロード元を指定するもので、無ければデフォルトのURLが使われるだけ)
- chroot /usr/local/chroot でchroot環境へ移行
↓ここからchroot環境下での作業↓
コンパイラをクロスコンパイル用にすげ替えます(と原典に書いてある)。
- pkg_add llvm distcc-server distcc
※distccはupdate-distcc-symlinksのために必要
- cd /usr/bin; rm c++ cc clang clang++ clang-cpp
- echo "exec /usr/local/bin/clang --target=\"arm-unknown-openbsd\" \"\$@\"" > cc
- chmod 755 cc
- for i in c++ clang clang++ clang-cpp; do ln -s cc $i; done
distccに--make-me-a-botnetを指定しないで済むよう、使用可能なコマンド一覧を記述します。
- mkdir -p /etc/distcc
- for i in c++ cc clang clang++ clang-cpp; do echo /usr/bin/$i >> /etc/distcc/commands.allow; done
最後に、distccdを起動するためのスクリプトを用意します。cp /etc/rc.d/distccd{,_local} でコピーした後、/etc/rc.d/distccd_localを編集します。IPアドレスについては特定のマシンに限っても良いですし、ネットマスクを使用してネットワーク内の任意のマシンとすることも可能です。
- daemon="/usr/local/bin/distccd --daemon" → daemon="/usr/bin/env DISTCC_CMDLIST=/etc/distcc/commands.allow /usr/local/bin/distccd --daemon"
- daemon_flags="--allow 127.0.0.1" → daemon_flags="--allow 127.0.0.1 --allow 192.168.0.0/24"
update-distcc-symlinks を実行してから、以下のコマンドでdistccdを起動できます。
- rcctl enable distccd_local
- rcctl start distccd_local
問題が無ければdistccd_local(ok)となりますが、うまくいかない場合は/var/log/message等を見て対処してください。作業が終わったらexitでchroot環境から抜けられます。
↑ここまでchroot環境下での作業↑
この作業により、今後は chroot /usr/local/chroot rcctl start distccd_local でdistccdを起動させることが可能になります。
ここからはarmv7側の設定、まずはdistccのインストールと設定。
- mkdir /var/distcc
- chown _pbuild /var/distcc
- pkg_add distcc
/etc/mk.confにdistccを使うよう、指示を追加。
- echo "COMPILER_WRAPPER=/usr/bin/env \\" > /etc/mk.conf
- echo "DISTCC_IO_TIMEOUT=600 \\" >> /etc/mk.conf
- echo "DISTCC_DIR=/var/distcc \\" >> /etc/mk.conf
- echo "DISTCC_HOSTS=\"192.168.0.xxx/4\" \\" >> /etc/mk.conf
- echo "DISTCC_VERBOSE=0 \\" >> /etc/mk.conf
- echo "distcc" >> /etc/mk.conf
DISTCC_HOSTSでdistccの動く仮想マシンのIPアドレスを指定するだけでなく、実行するジョブ数も指定してください(/4なら4つ)。
とりあえずBanana Pi BPI-P2からports/archivers/lhaをビルドして時間を測ってみたのですが、distccの有無/portsをNFS上に置いたかどうか/make -j4オプションの有無の組み合わせを試してもそんなに差が出ません。
- distccあり
- 1m04.27s real 0m09.94s user 0m14.15s system
- distccなし
- 1m00.50s real 0m33.65s user 0m14.18s system
- distccあり/NFS上
- 0m59.51s real 0m09.57s user 0m14.25s system
- distccなし/NFS上
- 1m02.34s real 0m34.39s user 0m14.14s system
- distccあり/-j4
- 1m02.85s real 0m09.95s user 0m13.85s system
- distccなし/-j4
- 1m03.95s real 0m33.97s user 0m14.29s system
- distccあり/NFS上/-j4
- 0m59.71s real 0m10.08s user 0m14.58s system
- distccなし/NFS上/-j4
- 1m02.24s real 0m34.14s user 0m14.57s system
distccを使うとuserが減ってはいるので何らかの恩恵はありそうなのですが、それを帳消しにするような何かも起こっているように見えます。/usr/portsをNFS上に置いたとはいえ、それ以外の何かがmicroSD上にあることで足を引っ張っているのでしょうか。
armv7側のpkg_add distccした際に気付いたのですが、25-Oct-2020の時点では存在しなかったOpenBSD/6.8/packages/arm、今はちゃんと揃っているのでarmv7のportsを無理にクロスビルドする必要性は無くなっちゃいましたね…52.35kg(06:55)