NetBSD/hp300, OpenBSD/hp300 のための

SunOS 4.x(NIT), Solaris 2.x(DLPI), HP-UX 10(DLPI), HP-UX 9(LLA), NEWS-OS 4.x(old-BPF), NetBSD(BPF), OpenBSD(BPF), FreeBSD(BPF), Linux(SOCK_PACKET) 上で動作する sun-rbootd-1.3.2

[English is here]

sun-rbootd-1.3.2 のソースを公開します。
HP-UX 10 に続き HP-UX 9 も追加され、さらに FreeBSD にも対応しました。
現在、SunOS 4.x, Solaris 2.x, HP-UX 10, HP-UX 9, NEWS-OS 4.x, Linux, NetBSD, OpenBSD, FreeBSD で動作します。
ether_ntohost() の無い、slackware Linux にも対応しました。

Works on

OS SunOS 4.x Solaris 2.x/7 NEWS-OS 4.x NetBSD OpenBSD FreeBSD HP-UX 10 HP-UX 9 Linux
raw network device NIT DLPI old-BPF BPF DLPI LLA SOCK_PACKET

この sun-rbootd は、Michael Wolfson 氏の、

Setting up the rbootd server, Diskless NetBSD/hp300 HOW-TO

に詳しい説明があります。


以下、README.jp から引用します。

sun-rbootd-1.3.2

  NetBSD/hp300, OpenBSD/hp300 のための
  SunOS4/Solaris2/NEWS-OS4/HP-UX/Linux/NetBSD/OpenBSD/FreeBSD 上で動作する
  sun-rbootd (NIT, DLPI, LLA, BPF, または SOCK_PACKET を使用)
                                                                 Mar 13 1999
                                                       yamamori@kt.rim.or.jp

Mar 13 1999 Release ver 1.3.2
  FreeBSD でも動作するようにしました。
  NetBSD での select() を修正しました。
  Solaris 2.x 用に Makefile を修正しました。

Dec 12 1998 Release ver 1.3.1
  HP-UX 9 LLA 上でも動作するようにしました。
  NetBSD/OpenBSD での Ethernet address を正しくしました。
  debug mode で、my_addr を表示するようにしました。

Sep 29 1998 Release ver 1.3
  HP-UX 10 DLPI 上でも動作するようにしました。

Sep 26 1998 Release ver 1.2.2
  ブート前に hp300 のコンソールで何かキー入力すると、ブートファイルが
  無限に表示され続けるというバグが直りました。
  ether_ntohost() が無く、コンパイルができなかった slackware Linux 等でも
  動作するようにしました。
  gcc だけでなく、K&R の cc でもコンパイルできるようにしました。

Aug 21 1998 Release ver 1.2.1
  Linux/x86 のために byte order 修正。(x86 での動作確認はしていません)
  Linux で、recvfrom() ではなく read() を使うようにした。

Aug 21 1998 Release ver 1.2
  NEWS-OS 4.x, Linux/sparc でも動作するようにしました。
  さらに、NetBSD/OpenBSD でも動作します。

Aug 15 1998 Release ver 1.1.2
  デバッグ出力オプション追加。Ether インターフェイスをオプションで指定、
  または自動選択可能。("sun-rbootd -a" が、以前のバージョンの "sun-rbootd" に
  相当します) その他プログラムの改良等。

Jul 20 1998 Release ver 1.1.1
  Solaris2 version で、MAC address をマルチキャストで動作するようにしました。
  (SunOS4 version では既にそうなっています)
  Solaris2/x86 のため、byte order を修正しました。
  (ただし、x86 での動作確認はしていません)

Jul 18 1998 Release ver 1.1
  Solaris 2.x(sparc) DLPI 上でも動作するようにしました。

Jun 5 1998 Initial version
  SunOS 4.x NIT 上で動作するようにしました。


sun-rbootd は、もともと BPF の無い、SunOS 4.x 等のプラットフォームを
サーバーにして、何とか hp300 をブートさせようとして作ったサーバープログラム
です。しかし、その後、本家の NetBSD/OpenBSD の BPF 上でも、NEWS-OS 4.x の
BPF でも、そして Linux でも動作するようにしました。

  Note:
    * NEWS-OS 4.x の BPF は、古いバージョンの BPF が実装されていて、
      他の一般的な BPF とは異なっています。例えば、フィルタープログラムでは、
      BPF_LD|BPF_H|BPF_ABS や、BPF_JMP|BPF_JEQ|BPF_K というのは無く、
      代わりに LdHOp とか EQOp とかいう命令があったりします。
      また、条件分岐命令のオフセットの計算方法が違っています。

    * Linux では、カーネルやデバイスドライバーレベルのパケットフィルターは
      無いと思われます。そのため、アプリケーションレベルでフィルターを
      行なっています。


内容:
  Makefile     : 修正無しで全プラットフォームで使えます
  README       : 英語版 README
  README.jp    : このファイル
  sun-rbootd.c : RMP プロトコルによるブートプログラム本体
  config.h     : #ifdef 等があります
  nitlib.h     : nitlib.c のヘッダー
  nitlib.c     : NIT(SunOS), DLPI(Solaris,HP-UX 10), LLA(HP-UX 9)
                 BPF(NEWS-OS,NetBSD,OpenBSD,FreeBSD), SOCK_PACKET(Linux)
                 に対応した関数ライブラリ
  rmp.h        : NetBSD/OpenBSD のオリジナル rbootd のソースのヘッダ
  rmp_var.h    :   (同上)


  このプログラムは、NetBSD/hp300 や OpenBSD/hp300 を diskless で boot
させるために必要となる rbootd を、SunOS 4.x の NIT 上、Solaris 2.x の
DLPI 上、NetBSD/OpenBSD/NEWS-OS 4.x の BPF 上、そして Linux の
SOCK_PACKET 上で動作させるようにしたものです。

  HP300 は、RMP というデータリンク層のプロトコルを使ってブートするため、
サーバープログラムとして rbootd が必要です。オリジナルの rbootd は、
BPF を使って書かれています。このため、BPF が(標準では)無い SunOS 4.x 等では、
rbootd は動きません。そこで、各種プラットフォーム上で動くように、
新たに sun-rbootd というサーバープログラムを作成しました。

  さらに、sun-rbootd では、以下のような改良も行ないました。

    * rarpd ライクに /etc/ethers を用いる。
        オリジナル rbootd では /etc/rbootd.conf に MAC アドレスと
        ブートファイル名を書きますが、これが冗長に思われるので、
        rarpd ライクに /etc/ethers (or NIS ethers) を ether_ntohost() を
        使って読むようにしました。(rbootd.conf は使わなくなりました)

    * rarp/tftp ライクにブートファイルは /tftpboot/C0A8XXXX にする。
        SunOS の rarp/tftp ライクに、ブートファイルの置き場所等を
        変更しました。オリジナル rbootd では /usr/mdec/rbootd/SYS_UBOOT
        ですが、sun-rbootd では、rarp/tftp のように client IP が
        192.168.xx.xx なら、/tftpboot/C0A8XXXX を読みます。
        SYS_UBOOT を /tftpboot/SYS_UBOOT に置いて、C0A8XXXX と sym-link
        すると良いでしょう。

make 方法:
  * 単に make とやればいいです。ただし、HP-UX 9 では make hpux9
    として下さい。環境変数 CC や CFLAGS が、CC=gcc CFLAGS=-O2 のように
    設定されていれば、それらが使われます。

使用方法:
  * ブートサーバーの /etc/ethers に、
    client の MAC アドレスとホスト名を記述する。
    (SunOS/Solaris/NEWS-OS で NIS を使用している場合は、NIS サーバーの
     /etc/ethers に必要項目を記述した後、NIS make が必要)

  * /tftpboot 以下に、ブートする OS に付属の SYS_UBOOT を置き、
    client の IP アドレスの16進名と sym-link する。
    (192.168.xx.xx なら、C0A8XXXX)

  * (その他、/etc/hosts に client ホスト名等が登録されているとか、
     diskless boot に一般的に必要な設定はできているものとします)

  * root で、sun-rbootd -a として起動する。

  * HP300 の電源を入れる。

--- これで、SYS_UBOOT が読み込まれ、その後 rarp/bootparam/NFS で
  カーネルが読み込まれて diskless client が立ち上がるはずです。

注意:
  "-d" オプションを付けると sun-rbootd は debug mode になりますが、
  debug mode では sun-rbootd は boot file を /tftpboot ではなく、
  カレントディレクトリから読みます。


Thanks to:
  Michael Wolfson(コーネル大学)
  sun-rbootd の HP-UX 10 および 9 への移植のため、HP-UX のアカウントを
  お貸しいただきました。その他、さまざまな助力をいただきました。


動作確認環境:
  Boot server:
    SunOS 4.x
    Solaris 2.x/7  (SPARC, i386)
    NEWS-OS 4.x    (RISC-NEWS, CISC-NEWS)
    NetBSD 1.3.2   (SPARC, hp300, i386)
    OpenBSD 2.3    (SPARC, hp300, i386)
    FreeBSD 2.2.8  (i386)
    Linux kernel-2.0.x (SPARC, i386)
    HP-UX 9
    HP-UX 10

  Diskless client:
    NetBSD/hp300   (HP9000/318, HP9000/345)
    OpenBSD/hp300  (HP9000/318, HP9000/345)

---
yamamori@kt.rim.or.jp
http://www.tt.rim.or.jp/~yamamori/sun/  "謎の処理系 SunOS 4.1.4"

これまでのあらすじ


(以下は以前の記述です)

SunOS 4.x の NIT 上で rbootd 互換のサーバープロセスを作り、SunOS4 をブートサーバーにして OpenBSD-2.2/hp300 がブート可能に!

SunOS4 上の rbootd 互換サーバー

hp300 では、HP の RMP という、データリンク層のプロトコルを使ってブートします。このため、 NetBSD/hp300 or OpenBSD/hp300 をディスクレスでブートさせるには、 rbootd という、RMP に対応したサーバーが必要です。rbootd は、 NetBSD/sparc or OpenBSD/sparc 上で動いているので、今まではこれを使って hp300 をブートさせていました。しかし、SunOS4 をサーバーにして、ここから直接 hp300 をブートさせたいとずっと考えていました。

rbootd には BPF が必要です。SunOS4 では標準では BPF ではなく NIT です。SunOS4 用の bpf パッケージも配布されていますが、これをインストールするには kernel オブジェクトの if_le.o を置き換えなければならず、この部分はバイナリーでしか入手できない (SunOS4 のソースライセンスは無い)ので、bpf のインストールには抵抗がありました。

tcpdump 等で使用される libpcap は、SunOS4 の場合、bpf の関数インターフェイスを NIT に変換して動作するようで、これを利用することも考えましたが、どうやら libpcap は、Ethernet を読むことはできても書き込みができないようでした。

その後、etherlib.tar.gz という名前で配布されているライブラリを見つけました。これには、 ether_open(), ether_read(), ether_write() などの関数が含まれ、NIT を簡単に利用できそうです。

このライブラリーを利用し、オリジナル rbootd のソースを読み、SunOS4 上で rbootd 同様に動作するサーバーを書きました。

この際、以下のような変更も行ないました。

  • rarpd ライクに /etc/ethers を用いる。
    オリジナル rbootd では /etc/rbootd.conf に MAC アドレス とブートファイル名を書きますが、これが冗長に思われるので、 rarpd ライクに /etc/ethers (or NIS ethers) を ether_ntohost() を使って読むようにしました。(rbootd.conf は使わなくなりました)

  • rarp/tftp ライクにブートファイルは /tftpboot/C0A8XXXX
    さらに、SunOS の rarp/tftp ライクに、ブートファイルの置き場所等を変更しました。オリジナル rbootd では /usr/mdec/rbootd/SYS_UBOOT ですが、これを /tftpboot/SYS_UBOOT に置き、client IP が 192.168.xx.xx なら、C0A8XXXX に sym-link して、SunOS の流儀に合わせました。

これで、SunOS4 上で自作 rbootd 互換サーバーを動かし、hp300 の電源を入れると、/tftpboot/SYS_UBOOT が読み込まれて OpenBSD-2.2/hp300 が無事立ち上がりました。


初めて NetBSD/hp300 をブートした時に書いた NetNews

From: yamamori@kt.rim.or.jp (YAMAMORI Takenori)
Newsgroups: fj.os.bsd.netbsd,fj.sys.hp
Subject: NetBSD-1.2 on HP9000/300 install note
Date: 18 Jan 1997 14:02:15 GMT
Lines: 71
Message-ID: <5bql57$68i@news.kt.rim.or.jp>


  このグループは初めての、山森と申します。

  このたび、ジャンク品として、HP9000/300 という古いマシンを入手し、
これに NetBSD-1.2 をインストールすることができましたので、
そのことについて報告します。

  HP9000/300 は、ディスクレスでブートします。
  SunSPARCstation2 があるので、これをサーバーにします。

  HP9000/300 のブート方式については、
最初は、通常の rarp/bootparam を使ったやつかと思っていたのですが、
とりあえず HP9000/300 をネットワークにつないで電源を入れて、
SS2 側で etherfind で見てみると、rarp ではない変なプロトコルが
流れて来ます。

  NetBSD-1.2 の hp300 の INSTALL というファイルを見ると、
ブートにはサーバー側で rbootd というものが必要とあり、
これのソースも付いています。つまり、通常の rarp/tftp に相当するものを
HP9000/300 では rbootd というものがやるのです。
(ただし、bootparam については Sun 等と同じみたいです)

  そこでまず、SS2(SunOS4.x) 上で rbootd を make してみましたが、
これには bpf というものが必要で、とりあえず make は無理でした。

  そこで、一旦 SS2 にも NetBSD をインストールし、これをサーバーにして
HP9000/300 をブートすることにしました。

  SS2 への NetBSD のインストールは、miniroot を使ったインストールではなく、
もう1台の SS2 をサーバーにして(実は SS2 を2台持っている)これから
ディスクレスでブートさせるようにしました。
これ自体は通常の rarp/bootparam を使ったものなので、実に簡単でした。
(すでに周知のことと思いますので省略します)

#たとえ立ち上げに失敗しても、サーバー側からすべて操作できるので
#ディスクレスブートは大変便利です。


  これで、NetBSD/sparc が立ち上がったので、このマシン上で rbootd を
起動すればいいわけです。そのために、/etc/rbootd.conf に、HP9000/300 の
イーサネットアドレスとブートファイル名(SYS_NBOOT)を設定し、
/usr/mdec/rbootd というディレクトリ(/tftpboot に相当するもの)を作って
その下に SYS_NBOOT を置きます。

  そして通常通り、必要なファイルを展開し、MAKEDEV し、
カーネル(netbsd)、swap ファイルも配置し、サーバーの bootparams を
登録し、、、と作業を進めます。

  これで HP9000/300 の電源を入れます。すると、何もしなくても
自動的に、SYS_NBOOT がまず読み込まれ、root が NFS マウントされ、
そこから netbsd(カーネル)が読み込まれて、無事立ち上がります。

  あとは、/etc/rc, /etc/netstart 等を修正して、また、NIS client にして
と、楽しみながら環境設定・チューニングしていきます。


  心配だったのは、NetBSD-1.2 の hp300 の INSTALL ファイルに、
対応しているハードウエアとして、HP9000/318, 319, 320, 330, 350 等の
記述はあるものの、300 は書かれていないこと、
さらに、300 シリーズの初期のものでは、ROM モニターの Rev.C 以降にしか
対応していないみたいな記述があった(私のものは REV.B だった)ことです。

  しかし、ダメモトでやってみると幸い無事に動作することができました。

  現在、NetBSD/SS2 上の rbootd 経由でしかブートできませんが、
今後、SunOS4(または Solaris2上)で、何とか rbootd を make して、
ここから直接ブートできればいいなと考えています。

-------------------------------
山森丈範  yamamori@kt.rim.or.jp
-------------------------------

現在、rbootd 経由で読み込むブートファイルは、以前の SYS_NBOOT から、SYS_UBOOT と変わりました。

現在、sun-rbootd は、SunOS 4.x, Solaris 2.x, NEWS-OS 4.x, HP-UX 10, Linux, NetBSD, OpenBSD, FreeBSD で動作します。

そして、現在は NetBSD-1.4, OpenBSD-2.4 が最新となりました。


To 謎の処理系 SunOS 4.1.4 Home
yamamori@kt.rim.or.jp