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
    

Posted at 23:54 in computer

Oct 15, 2009

玄箱HG NetBSD 5.0.1 [computer]

これは個人的なメモ

玄箱(HG)のCPUはOSをセルフビルドすると丸一日かけても終わらない程度に非力なのでOSなどのシステムを構築するにはクロス開発環境があったほうがいい。幸いNetBSDではクロス環境でOSを構築するのは簡単にできるようになっている。

今回は玄箱に接続したディスクには領域を確保はしておくが、まずUSBメモリ上に動作するNetBSDを構築してみる。

  1. 玄箱HGの初期セットアップ
  2. クロス環境のホスト上でソースコードの展開、パッチの摘要をする
  3. カーネル、リリースバイナリのクロスビルド、USBメモリへインストール
  4. デバイスファイルの作成
  5. 玄箱HG上にNetBSDをブートするためのブートマネージャを設定する
というような手順になる。

具体的手順

  1. 玄箱HGの初期セットアップ
  2. 私の所有している玄箱にはシリアルコンソールコネクタをつけてあるので特に困るようなところはない。通常の玄箱のセットアップ手順のとおり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用パッチで多分何とかなるだろう。ならなかったら何とかしようという方針で。

  3. クロス環境のホスト上でソースコードの展開、パッチの摘要をする
  4. 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 つまった記憶はないので多分問題ないんだろう。

  5. カーネル、リリースバイナリのクロスビルド、USBメモリへインストール
  6. % ./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
    

  7. デバイスファイルの作成
  8. 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
    
  9. 玄箱HG上にNetBSDをブートするためのブートマネージャを設定する
  10. 元々古めの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を直すなりパッケージを入れるなり適当に

Posted at 08:23 in computer