Oct 20, 2009
玄箱HG NetBSD distcc で混合pkgsrc作成環境 [computer]
NetBSDのベースシステムはクロスビルドが簡単にできるようになっているがpkgsrcはそれほど簡単ではない。
pkgsrcはdistccに対応しているのでdistccを使ってホストPC側のクロスコンパイラを使うようにすることができる。configure等は玄箱上のセルフ環境で行うのですべてが速くなるわけではないが、pkgsrcがかなり「使える」ようになる。
- ホストPC側の設定
distccdを高速なホストPC側で動かす。distccのマニュアルによればdistccでクロスコンパイルを行う場合はターゲットアーキテクチャ用のクロスコンパイラを規則に従った名前にして...等あるが、ここではNetBSDのpkgsrcで使う関係上別の方法で対応する。
ホスト側のコンパイラはNetBSDベースシステムのクロスビルドで使用したtoolchainのコンパイラを利用する。
例えば/usr/local/evbppc/toolchain/bin以下にクロスコンパイラがあるとする。 (toolchainの作成時に例えば、
# ./build.sh -T /usr/local/evbppc/toolchain -m evbppc等で作成しておく)
# cd /usr/local/evbppc/toolchain/bin # ln -s powerpc--netbsd-gcc gcc # ln -s powerpc--netbsd-gcc cc # ln -s powerpc--netbsd-g++ g++ # ln -s powerpc--netbsd-c++ c++
distccdの起動時にPATHをクロスコンパイラのあるディレクトリにしておくようにする。 例えばホストのIPアドレスが 192.168.1.129 であるとして起動スクリプトで
#!/bin/sh PATH=/usr/local/evbppc/toolchain/bin distccd -a 192.168.1.0/24 --user distcc --daemon \ -P /var/run/distcc.pid --listen 192.168.1.129など。
ちなみにホストPC側がFreeBSDの場合、portsからdistccをインストールするとデフォルトではIPv6のアドレスに対してbindされるためIPv4でネットワークを構築している場合、上記のように--listenでIPv4のアドレスを指定しないと使えない場合がある。
NetBSDのpkgsrcでコンパイラにdistccを使う場合なら/etc/mk.confに以下のような記述を 入れておけばよい。DISTCC_HOSTSはdistccでコンパイル行うホストのアドレスを書いておく(distccのマニュアル参照)。
PKGSRC_COMPILER= distcc gcc DISTCC_HOSTS= 192.168.1.129
Oct 15, 2009
玄箱HG NetBSD 5.0.1 [computer]
これは個人的なメモ
玄箱(HG)のCPUはOSをセルフビルドすると丸一日かけても終わらない程度に非力なのでOSなどのシステムを構築するにはクロス開発環境があったほうがいい。幸いNetBSDではクロス環境でOSを構築するのは簡単にできるようになっている。
今回は玄箱に接続したディスクには領域を確保はしておくが、まずUSBメモリ上に動作するNetBSDを構築してみる。
- 玄箱HGの初期セットアップ
- クロス環境のホスト上でソースコードの展開、パッチの摘要をする
- カーネル、リリースバイナリのクロスビルド、USBメモリへインストール
- デバイスファイルの作成
- 玄箱HG上にNetBSDをブートするためのブートマネージャを設定する
具体的手順
- 玄箱HGの初期セットアップ
- クロス環境のホスト上でソースコードの展開、パッチの摘要をする
- カーネル、リリースバイナリのクロスビルド、USBメモリへインストール
- デバイスファイルの作成
- 玄箱HG上にNetBSDをブートするためのブートマネージャを設定する
私の所有している玄箱にはシリアルコンソールコネクタをつけてあるので特に困るようなところはない。通常の玄箱のセットアップ手順のとおりHDDを組み込んでLinuxのシステムをインストールする。気をつけるのはHDD上にNetBSDを組み込むための空き領域を作っておくことぐらい。mfdiskを手動で実行して空き領域を確保しよう。 あとは各種webサイトなどを参考に。 たとえば今はこんな状態。
Device Boot Start End Blocks Id System /dev/hda1 1 4161 2097112+ 83 Linux /dev/hda2 4162 4681 262080 82 Linux swap /dev/hda3 4682 29648 12583368 83 Linux /dev/hda4 29649 77545 24140088 a9 Unknown
NetBSDの3以降はevbppcをベースにしてパッチを当てたものが動いている。 5.0.1 (evbppc)+ 5.0用パッチで多分何とかなるだろう。ならなかったら何とかしようという方針で。
NetBSDのマスタサイトからソースコードアーカイブを持ってくる。(最近はbittorrentがおすすめらしいけど) http://ftp.netbsd.org/pub/NetBSD/NetBSD-5.0.1/source/sets/ などから src.tgz, syssrc.tgz, gnusrc.tgz, sharesrc.tgz を持ってくる。さすがにxsrc.tgzはいらんだろ。
% tar xvzf src.tgz % tar xvzf syssrc.tgz % tar xvzf gnusrc.tgz % tar xvzf sharesrc.tgz展開するとusrディレクトリを作ってその下にソースツリーが出来る。
パッチも持ってくる。
こちらを参考に 玄箱でNetBSDを動かす ここ から持ってきた。 使用したパッチは 20090124.diff.bz2
% cd usr/src % zbcat ../../20090124.diff.bz2 | patch -pクロスビルドはFreeBSD上でやっているのでpatchのオプションは上記の形になっているがOSによっては違うオプションが必要になるだろう。
普通にパッチは当たってrejectは出ないのでまあいいんだろう。 クロスビルドの方法は以下に従ってやってみる。 http://www.netbsd.org/docs/guide/en/chap-build.html つまった記憶はないので多分問題ないんだろう。
% ./build.sh -m evbppc tools % ./build.sh -u -m evbppc kernel=KUROBOX
生バイナリのカーネル usr/src/sys/arch/evbppc/compile/obj/KUROBOX/netbsd.bin が作成される
KUROBOXの設定で作られたカーネルは玄箱上のLinuxで動くブートマネージャで読み込むので玄箱のLinuxパーティション上に置いておく。私はLinuxのパーティションに/bootというディレクトリを作ってそこに置いている。
% ./build.sh -U -u -m evbppc release
usr/src/releasedir/evbppc/binary/sets 以下にリリースバイナリができる。
base.tgz comp.tgz etc.tgz games.tgz man.tgz misc.tgz tests.tgz text.tgz
カーネルも何種類かできるが使わない。PC上等で既に動いている FreeBSDやNetBSDでUSBメモリ上にffs作って上記のバイナリを展開しておく。 これがテンポラリに起動するNetBSD5.0.1になる。 /etc/rc.confなどが適切に設定されていないとマルチユーザモードにならないので設定しておく。
とりあえずbase.tgz, comp.tgz, etc.tgz, misc.tgzぐらいを入れておく
/etc/rc.confの設定は私は以下のようにしてみた。
rc_configured=YES hostname="nb_kurobox" domainname="hoge.local" dhclient=YES #defaultroute=192.168.0.1 sendmail=NO no_swap=YES clear_tmp=YES quota=NO savecore=NO syslogd=YES #kuro_avrd=YES sshd=YES postfix=NO named9=NO ntpd=NO
USBメモリ上にデバイスファイルを作っておく。例えばターゲットのUSBメモリが/mntにマウントされていて、クロスビルド環境は /usr/kuro_netbsd以下、ツールチェインのディレクトリが/usr/kuro_netbsd/usr/src/tooldir.HogeSystemの場合、
# cd /mnt/dev # sh MAKEDEV -m /usr/kuro_netbsd/usr/src/tooldir.HogeSystem/bin/nbmknod all
元々古めのsandpoint版玄箱NetBSDを入れていたマシンだったので、いい加減なことを書いてしまった。修正しておく。(2009/10/20)
ブートマネージャ(kuro_bootsel2)のアーカイブを玄箱HGのLinux環境上に展開し、make installを実行する(付属のドキュメントを参照)。 kuro_morse, kuroswread, kuro_bootsel2.sh が予定の場所にインストールされる。
NetBSDのカーネル(生バイナリ形式 netbsd.bin等)及びローダー(nbloader_v3.o)をLinux環境の/boot以下に置く
玄箱のLinuxパーティション上にブートマネジャー(nbloader_v3.o)をインストールしておく。/boot/nbloader_v3.oで置いてあるとする。起動時のスクリプトkuro_bootsel2.shを
玄箱のLinux上で/etc/init.d/kuro_bootsel2.shに置く。/etc/rc.d/rcS.d/にシンボリックリンクを作成する
設定ファイル/etc/kuro_boot.confに適切な設定を行う。
# Menu entry No.2 # menu2="NetBSD(USB:sd0a)" loader2=/boot/nbloader_v3.o kernel2=/boot/netbsd.bin option2='cmdline="bootdev=sd0a"'これでUSBメモリからの起動の実験ができるはず
- それから
うまく起動したらUSBメモリにリリースバイナリのアーカイブを入れてハードディスク上に確保した領域にNetBSDをインストールする。
ハードディスクへのインストールは最初に起動するところまではUSBで起動させるまでと大体同じ。
swapをLinuxのswapパーティションと共有する場合はLinuxのswap物理(fdisk)パーティションのoffsetとsizeを出してそれぞれoffset+8, size-8をNetBSDのswapのoffset, sizeにすればいいとか。disklableで見ると f:が元々あったLinuxのswapパーティションの情報、b:がNetBSD用に確保したswap領域
b: 524152 4194296 swap f: 524160 4194288 unused
あとはrc.confを直すなりパッケージを入れるなり適当に