tsutsuiの作業記録置き場

NetBSDとかPC-6001とかの作業記録のうち、Twitterの140字では収まらない内容や記事としてまとめるべき内容をとりあえず置いてみる予定

NetBSD + RaspberryPi + RaSCSI 補足メモ

以下の各エントリで記載した内容の補足とか追記事項とかを雑多に書きました。

Raspberry Pi のブートパーティション形式

Raspberry Pi 3 + NetBSD/evbarm で RaSCSI の記事で「(ブートパーティションは)FAT32フォーマットである必要があるらしい」と書きました。

が、結論からすると FAT16 でも FAT32 でもどちらでもよいようです。

このあと実際に 8GB の SDに FAT32 な 4GBパーティションを作って起動ファイル一式を置いて RaspberryPi 3B で試してみましたが、特に問題なくカーネル起動しました。ファームウェアFAT16 でも FAT32 でもそつなく解釈してくれるようです。

RaSCSI ベンチマーク

今まで RaSCSIの接続ターゲットとして OMRON LUNA の spc(4) SCSI と SPARCstation 20 の esp(4) SCSI を試してみて、「SPARCの場合は RaSCSI側のカーネルドライバ必須」という結果は出ていました。じゃあ、もっと速いホストアダプタを持ってきたらどうなるのか、ということで、 PCISCSIホストアダプタと PCIスロットのある旧PCを引っ張り出してきて検証してみました。

当該 PCには NetBSD/i386 8.0_BETA が入っていたので、そのまま Raspberry Pi 3 Model B + AIBOM製変換アダプタ + RaSCSI 1.34 + NetBSDカーネルドライバ で dd(8) ベンチマークをやってみたところ、

と、 1.6MB/sec 弱、という数字でした。

非同期転送の SCSI の場合は転送速度の理論限界というものは定義されていませんが、「SCSI2 詳細解説」の記載によれば「2〜3MB/s」とのことなので、各種コマンドのオーバーヘッドを考えれば、レトロPCには十分な速度が出ているのではないでしょうか。

ちなみに、カーネルドライバ内にはデータ転送時のタイミング調整用に 150ns のウェイトを入れている部分があるのですが、何も考えずにそのウェイトを削ってみると、見かけ上の転送速度だけは速くなるようです。

ただし、この設定の場合の転送データの信頼性については検証できていません。もともとの 150ns という数字は SCSI規格もしくは実機検証で決められた値でしょうから、むやみにいじってよい値ではないでしょう……。無責任実験ですがあくまでも一検証結果ということで

RaSCSI と LUN

SCSI には LUN (Logical Unit Number) というものがあり、一つの SCSI ID に対して 8つまでのデバイスが接続可能という規格があります。厳密には 255 LUN という規格もあるようですが詳細を知らないので省略

SCSIバイスによってはこの LUNのサポートがいい加減で、 LUN番号を無視してすべての LUNに対して応答してしまい、OSによっては「同じデバイスが8台見えてしまう」という現象が発生することがあります。

これらの出来の悪いデバイスに対する対応として、 OS側ではデバイスに対する inquiry に対する応答文字列からデバイスを判別して NGなデバイスの場合は LUNを使用しない、という実装が入っています。 NetBSD の場合は src/sys/dev/scsipi/scsiconf.cscsi_quirk_patterns[] のテーブルPQUIRK_NOLUNS の定義が該当します。

RaSCSI の場合は LUNも正しく処理されているようで、NetBSD上では複数の LUNに対する probe に反応するということはありませんでした。

ただし、 PCI SCSI I/Fの付属 BIOSの probeでは、なぜか複数の LUNに反応しているようでした。

このあたりは実際にどういうコマンドが送られていてどのような応答をしているのかを検証する必要がありますね。が、まだサボっていて確認できていません

変換基板種別とカーネルドライバメッセージ

RaSCSI のドキュメントにあるとおり、 RaSCSI のコマンドをビルドする場合は変換基板の種別に応じて gpiobus.h の定義を修正した上でバイナリを作る必要があります。つまり、複数の変換基板を使う場合はバイナリを使い分ける必要があります。当然、 rascsi の制御コマンドとカーネルドライバの両方のバイナリについて適切なものを使用する必要があります。

rascsi の制御コマンドは起動時にビルドされている設定を表示するようになっているのですが、カーネルドライバでは手抜きでロード時に何も表示しておらず、 GAMERnimu.com版をつないでいる RPIであいぼむ版のカーネルドライバをロードしてしまうというヒヤリハットをやってしまいました。

この場合、ホストアダプタ側からはターゲットが応答しないという動作になるのですが、ハード的なダメージがどれだけあるかは検証できていません。いずれにせよこれはマズい、ということで NetBSDカーネルドライバ側でもロード時にメッセージを表示するようにしました。

NetBSD の場合、 /etc/modules.conf に読み込ませたいモジュール (モジュール名 もしくは モジュールの foo.kmod ファイルの絶対パス) を記述しておくと起動時にモジュールをロードしてくれるので、上記ツイートはその設定での起動写真です。

なお、当然ながらオリジナルの Linuxカーネルドライバでは最初からバイナリに対応する接続方法が表示されるようになっています。

RaSCSI のディスクイメージサイズ

RaSCSI 添付のドキュメント rascsi.txt を読むと、 SCSIハードディスクの HDSファイル形式の場合は
「ファイルサイズは10MB以上4095MB以下の範囲で任意のサイズ(但し512バイト単位)」
とあります。

ただ、ざっと RaSCSI 関連のソースコードを見た範囲では off_t もしくは off64_t 等を使っており、特に 32ビット整数範囲の制限は無いように見えました。

上記マニュアルの記述は 32ビット Windowsがターゲットだった XM6 時代の記載が残っているだけかな、ということで試しに 4GB超のイメージファイルを指定するとどうなるかやってみました。

とりあえず、 newfs(8) でのファイルシステム作成、 cvs checkout による pkgsrc のファイル展開、その後の fsck(8) のチェック等では明示的なエラーが出ることはなく動いているようです。イメージファイル破損等の問題がないかはまた追って検証したいと思います。