NetBSDではpkgsrcという仕組があり、当然の如くNetBSD/hpcshでもこれを使う。これは、ソース形式で広く世間に公開されているソフトウェアをコンパイルし、インストールやアンインストール、バイナリパッケージの作成等というソフトウェアパッケージを管理するものである。
これはNetBSD全体共通、およびNetBSD以外のOSでも一部使えるようになっている。
詳しくはpkgsrc: The NetBSD Packages Collectionを参照して欲しい。
NetBSD/hpcshにおいてこのpkgsrcを利用する場合、重大な問題がある。それはバイナリパッケージが存在しないということがある。いわゆるPCのi386等ではコンパイルされたバイナリがあるため、自分でpkgsrcからコンパイルしなくても、これらのバイナリをインストールすれば良い。
しかし、NetBSD/hpcsh用のバイナリは今のところ提供されていないため、使用者が自分でコンパイルしなければならないのが現状である。NetBSD/hpcshで便利な環境を作ろうと思うとこれは非常に辛い状況である。
コンパイルしてソースからインストールする方法は他のNetBSDと何も変わらない。作業としては次のようになる。
pkgsrcのソースを取得し、展開する。pkgsrcにもcurrentと定期的に提供されるものがある。例えば2007Q1と呼ばれる物は以下となる。
ftp://ftp.NetBSD.org/pub/pkgsrc/pkgsrc-2007Q1/pkgsrc-2007Q1.tar.gz
このソースを展開するとトップディレクトリは./pkgsrcとなっているため、これを/usrに展開する。
pkgsrcを展開するとカテゴリ別のディレクトリがあり、その下にそれぞれのソフトウェア毎のディレクトリがあるので、そのディレクトリでmakeすればそのソフトウェアをコンパイルすることができる
例えば、perlをインストールしたければ、
# cd /usr/pkgsrc/lang/perl5 # make install
とするだけでperlと、それをコンパイルするのに必要なソフトウェア、動作させるために必要なソフトウェアをコンパイル/インストールできる。それぞれのソースは自動的にネットワークから取得してくるので、至極簡単である。
また、make packageとすれば、コンパイル/インストールした後、pkgsrc/packagesにバイナリパッケージを作成する。このバイナリパッケージを利用すれば他の環境に持っていきpkg_addコマンドでインストールすることができる。
このpkgsrcの仕組みを理解した上で、hpcshで実行する場合の問題点は以下のような物が考えられる。
さて、前者3つはある程度の環境を用意することで回避ができる。最後の1つは、本質的な回避はできないが、若干でも改善することはできる。
i386等の高速なマシン上にhpcshのシステムを展開しておき、そこをroot として起動してしまえば少なくともファイルシステム容量と書き換え寿命の問題を回避することができる。このためには当然、nfs serverとなるマシンが必要であり、また、jornadaで使えるネットワークカードが必要となる。
NetBSDでは簡単にnfs serverが用意できる。また、起動のためにbootpまたはDHCPサーバが必要となる。この手順については オフィシャルのドキュメント Diskless NetBSD HOW-TO が詳しい。hpcsh用の記述は特に無いが、dhcp serverの設定とNFS serverの設定がわかれば良い。
以下、簡単に記述する。
NetBSDには標準でdhcpサーバが含まれているのでこれを利用する。/etc/dhcpd.confの適切な箇所に以下のようなエントリを記述する。
host jornada { hardware ethernet XX:XX:XX:XX:XX:XX # jornadaに繋げるNICのMacアドレス fixed-address 10.200.0.133 # jornadaに割り当てるIPアドレス next-server 10.200.0.10 # nfs serverのIPアドレス option host-name "jornada" # 与えるホスト名 option root-path "/nfsroot/jornada/" # nfs rootのパス }
もちろん、MacアドレスやIPアドレス、ホスト名、nfsサーバのマウントパスは環境に応じて設定する。
ここで重要な注意事項だが、DHCPサーバを動かすとき、そのネットワークで他のDHCPサーバが動いているとネットワーク上で混乱してしまい正常な動作ができなくなる。そのため、いわゆるブロードバンドルータなどがDHCPサーバ機能を持っている場合、その機能を富めておくか、物理的に分離したネットワークにするしかない。環境によっては結構面倒なことになる。
適切に設定できたら、dhcpサーバを起動する。サーバ側で /etc/rc.confに dhcpd=YES を記述し、/etc/rc.d/dhcpd start とすれば良い。
nfs rootとするサーバ側での準備を行う。もちろんdhcpサーバと同じマシンで構わない。ここでは/nfsroot/jornada/を nfs rootにする。
このディレクトリにCFへのNetBSD/hpcshのインストールと同じようにインストールし設定すれば良い。または、既にインストールしたCFを使って、内容を全部コピーしてしまっても良い。
# mount /dev/sd0a /mnt # hpcshをインストールしたCFを/mntにマウント # tar cf - /mnt | tar xpf - -C /nfsroot/jornada
この後、nfs root用に最低限1箇所、fstabを変更する必要がある。/nfsroot/jornada/etc/fstabを以下のように修正。
10.200.0.10:/nfsroot/jornada / nfs rw 0 0 kernfs /kern kernfs rw procfs /proc procfs rw
nfs サーバのアドレスとディレクトリパス、nfsであることを指定する。
なお、ここまでIPアドレスで全て指定しているが、DNSサーバやhostsファイルで解決できるのであればhost名でも構わない。
nfs serverの /etc/exportsを作成、以下の記述を追加。
/nfsroot/jornada -maproot=root:wheel 10.200.0.133
rpcbind, mountd, nfsdを起動する。
# rpcbind # mountd # nfsd -tun 4
通常と同じようにCFをJornadaにセットし、hpcboot.exeを起動する。ここで画面の左下の、[root file systems]にあるチェックボックスのうち一番右のnfsをチェックする。
この状態でBootを押すと、CFからNetBSDのカーネルをロードするが、その後にDHCPリクエストを実行し、nfs rootをmountする。このように起動できれば、以後はCFを使わなくなる。
また、この環境でswapファイルを作成、swapctl -aで追加すれば当然nfs上のファイルシステムでswapを使うことができる。 pkgsrcのコンパイル用に使用するので、128MBくらいとってしまっても良いと思う。
最後の難問、コンパイル速度の改善を行うことは非常に難しい。現状のpkgsrcはクロスコンパイルには対応していないため、実機でmakeするしかない。
ただし、分散コンパイルツールのdistccを使うことで、コンパイルフェーズのみ、他のマシンのコンパイラを呼び出すことができる。これは大きなソースをコンパイルするときに有効となる。
当然ながら高速なマシンにクロスコンパイラをインストールしなければならない。 これには、NetBSD/i386などでNetBSDのソースを展開し、NetBSDの構築スクリプトbuild.shでできる。
# cd /usr/src # ./build.sh -m hpcsh -T /usr/tools tools
こうしてできた/usr/tools/binにクロスコンパイラが作成されている。
# cd /usr/tools/bin # ls shle* shle--netbsdelf-addr2line* shle--netbsdelf-g++* shle--netbsdelf-objcopy* shle--netbsdelf-ar* shle--netbsdelf-gcc* shle--netbsdelf-objdump* shle--netbsdelf-as* shle--netbsdelf-gcc-4.1.2* shle--netbsdelf-ranlib* shle--netbsdelf-c++* shle--netbsdelf-gccbug* shle--netbsdelf-readelf* shle--netbsdelf-c++filt* shle--netbsdelf-gcov* shle--netbsdelf-size* shle--netbsdelf-cpp* shle--netbsdelf-ld* shle--netbsdelf-strings* shle--netbsdelf-dbsym* shle--netbsdelf-lint* shle--netbsdelf-strip* shle--netbsdelf-disklabel* shle--netbsdelf-mdsetimage* shle--netbsdelf-fdisk* shle--netbsdelf-nm* #
これらをdistccから呼び出せるようにシンボリックリンクを作成する。
# ln -s shle--netbsdelf-gcc-4.1.2 gcc # ln -s shle--netbsdelf-gcc-4.1.2 cc # ln -s shle--netbsdelf-c++ c++ # ln -s shle--netbsdelf-g++ g++
コンパイルサーバにpkgsrcからdistccをmake installする。
コンパイルサーバ側でdistccdを起動する。
# env DISTCCD_PATH=/usr/tools/bin:{$PATH} distccd --listen 10.200.0.10 --user nobody --daemon -a 10.200.0.0/24 --port 3632
hpcsh側にもpkgsrcからdistccをインストール必要がある。つまり、ここまでは根性で全て自力コンパイルしなければならない。
# cd /usr/pkgsrc/devel/distcc # make install
これを実行すると、digest, gmake, libtool-base, poptといくつかの他のpkgsrcが自動で作成される。つまり、非常に我慢が必要になる。
無事にdistccが作成できたなら、hpcsh側の/etc/mk.confに次のように記述する。
PKGSRC_COMPILER=distcc gcc DISTCC_HOSTS=10.200.0.10:3632
hpcshはNetBSD/sh3の一つであり(endian little : sh3el)、他のsh3elとバイナリ互換性がある。このため、jornadaよりも高速なNetBSD/sh3elで作成したバイナリを利用することができる。
SH3-CPUを使用したマシンでは一般的にはjornadaの133MHzが最も高速らしい。が、SH4-CPUを使用したマシンが以下のようにある。
NetBSD/dreamcastはローカルファイルシステムを持たず、また、NetBSD動作環境までの道のりが非常に大変なため一般向きとは言いがたい。NetBSD/landiskは最近統合されたportであるが、CPUも高速、メモリも64MB、しかもpci接続のATA-133 IDEディスクを使えるとjornadaに比べると夢のような高速さが期待できる。が、しかし、最近のパソコンとは比べるべくもないのも事実なので、どのみちかなりの覚悟が必要なのは間違いがない。