以下の各エントリで記載した内容の補足とか追記事項とかを雑多に書きました。
Raspberry Pi のブートパーティション形式
Raspberry Pi 3 + NetBSD/evbarm で RaSCSI の記事で「(ブートパーティションは)FAT32フォーマットである必要があるらしい」と書きました。
が、結論からすると FAT16 でも FAT32 でもどちらでもよいようです。
Raspberry Pi の起動用ファイルの入っている FATパーティションは FAT32 である必要がある(という説明が書いてあるページがある)ということをブログに書いたけれど、ラズパイイメージの FATは100MBくらいしかなくてそれだとクラスタサイズ1KBにしないとフォーマットできない。実はFAT16でもいける?
— Izumi Tsutsui (@tsutsuii) 2018年5月11日
NetBSD の src/distrib/utils/embedded/mkimage の中でも makefs(8) の引数で明示的な FATの種別 (fat_type) は指定されていないので、サイズ的デフォルトの FAT16 で作成されているはず? https://t.co/VUdOyGKMjG
— Izumi Tsutsui (@tsutsuii) 2018年5月11日
まあ、サイズ制約がないのであれば FAT32 に限定する必要はないというか、むしろ FAT16 限定じゃないのかという気はするな
— Izumi Tsutsui (@tsutsuii) 2018年5月11日
というわけで、ラズパイの起動用ファイルを置く FATパーティションについては FAT32という制約はなくて FAT16 であっても起動可能っぽい。むしろ FAT32 の場合は起動するのだろうか(試すのめんどい) pic.twitter.com/cprOnlHBNP
— Izumi Tsutsui (@tsutsuii) 2018年5月11日
このあと実際に 8GB の SDに FAT32 な 4GBパーティションを作って起動ファイル一式を置いて RaspberryPi 3B で試してみましたが、特に問題なくカーネル起動しました。ファームウェアは FAT16 でも FAT32 でもそつなく解釈してくれるようです。
RaSCSI ベンチマーク
今まで RaSCSIの接続ターゲットとして OMRON LUNA の spc(4)
SCSI と SPARCstation 20 の esp(4)
SCSI を試してみて、「SPARCの場合は RaSCSI側のカーネルドライバ必須」という結果は出ていました。じゃあ、もっと速いホストアダプタを持ってきたらどうなるのか、ということで、 PCIな SCSIホストアダプタと PCIスロットのある旧PCを引っ張り出してきて検証してみました。
RaSCSI 耐久をしようと思ったら Symbios 53C875 な UltraWide だけど 50ピンの PCI SCSI を持ち出せばよいのだろうか
— Izumi Tsutsui (@tsutsuii) 2018年5月10日
デバドラを書くために SCSI アダプタを買っていた昔( ´_ゝ`) pic.twitter.com/yGhf555iyI
— Izumi Tsutsui (@tsutsuii) 2018年5月10日
当該 PCには NetBSD/i386 8.0_BETA が入っていたので、そのまま Raspberry Pi 3 Model B + AIBOM製変換アダプタ + RaSCSI 1.34 + NetBSD用カーネルドライバ で dd(8)
ベンチマークをやってみたところ、
最速 RaSCSI over esiop(4) on NetBSD/i386 (1585408 bytes/sec) pic.twitter.com/xEiPN1oWd1
— Izumi Tsutsui (@tsutsuii) 2018年5月10日
と、 1.6MB/sec 弱、という数字でした。
非同期転送の SCSI の場合は転送速度の理論限界というものは定義されていませんが、「SCSI2 詳細解説」の記載によれば「2〜3MB/s」とのことなので、各種コマンドのオーバーヘッドを考えれば、レトロPCには十分な速度が出ているのではないでしょうか。
ちなみに、カーネルドライバ内にはデータ転送時のタイミング調整用に 150ns のウェイトを入れている部分があるのですが、何も考えずにそのウェイトを削ってみると、見かけ上の転送速度だけは速くなるようです。
RaSCSI 理論限界チャレンジ pic.twitter.com/Qv9aCRbxT6
— Izumi Tsutsui (@tsutsuii) 2018年5月10日
このへんが限界? pic.twitter.com/S6QkIB6Tdj
— Izumi Tsutsui (@tsutsuii) 2018年5月10日
ただし、この設定の場合の転送データの信頼性については検証できていません。もともとの 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.c
の scsi_quirk_patterns[]
のテーブルの PQUIRK_NOLUNS
の定義が該当します。
RaSCSI の場合は LUNも正しく処理されているようで、NetBSD上では複数の LUNに対する probe に反応するということはありませんでした。
ただし、 PCI SCSI I/Fの付属 BIOSの probeでは、なぜか複数の LUNに反応しているようでした。
Symbios 53c870 な SCSI ボードの BIOS が RaSCSI を probe するときにデバイスが複数あるように見ている (≒複数の LUNに応答している?) ように見えるのだけれど、NetBSDカーネルだと LUN 0 にしか応答していないし BIOS の画面もほぼ一瞬しか出ないので特定が難しい
— Izumi Tsutsui (@tsutsuii) 2018年5月12日
SCSI BIOS 認識画面撮れた、と思ったらタブレットで保存したフォルダの画像ファイルが壊れるという罠にハマって撮り直し。果たしてどういうロジックなのか pic.twitter.com/JFPSnegCO7
— Izumi Tsutsui (@tsutsuii) 2018年5月12日
このあたりは実際にどういうコマンドが送られていてどのような応答をしているのかを検証する必要がありますね。が、まだサボっていて確認できていません
変換基板種別とカーネルドライバメッセージ
RaSCSI のドキュメントにあるとおり、 RaSCSI のコマンドをビルドする場合は変換基板の種別に応じて gpiobus.h
の定義を修正した上でバイナリを作る必要があります。つまり、複数の変換基板を使う場合はバイナリを使い分ける必要があります。当然、 rascsi
の制御コマンドとカーネルドライバの両方のバイナリについて適切なものを使用する必要があります。
rascsi
の制御コマンドは起動時にビルドされている設定を表示するようになっているのですが、カーネルドライバでは手抜きでロード時に何も表示しておらず、 GAMERnimu.com版をつないでいる RPIであいぼむ版のカーネルドライバをロードしてしまうというヒヤリハットをやってしまいました。
RaSCSI メモ:
— Izumi Tsutsui (@tsutsuii) 2018年5月12日
NetBSD カーネルドライバロード時にも CONNECT_DESC (STANDARD / FULLSPEC / AIBOM products / https://t.co/2bwSCIREF6) のいずれかを表示するようにしないと混乱するという要改善点(手抜きでデバッグメッセージしか出していなかった)
この場合、ホストアダプタ側からはターゲットが応答しないという動作になるのですが、ハード的なダメージがどれだけあるかは検証できていません。いずれにせよこれはマズい、ということで NetBSDカーネルドライバ側でもロード時にメッセージを表示するようにしました。
RaSCSI の NetBSD/evbarm 用カーネルドライバでも組み込み時に対応ボード設定を表示するようにした。これで2種類の変換基板を使い分けていてもバイナリを間違える事故は減るはず…… pic.twitter.com/1ZRYPhvKPj
— Izumi Tsutsui (@tsutsuii) 2018年5月13日
NetBSD の場合、 /etc/modules.conf
に読み込ませたいモジュール (モジュール名 もしくは モジュールの foo.kmod
ファイルの絶対パス) を記述しておくと起動時にモジュールをロードしてくれるので、上記ツイートはその設定での起動写真です。
なお、当然ながらオリジナルの Linux用カーネルドライバでは最初からバイナリに対応する接続方法が表示されるようになっています。
RaSCSI のディスクイメージサイズ
RaSCSI 添付のドキュメント rascsi.txt
を読むと、 SCSIハードディスクの HDSファイル形式の場合は
「ファイルサイズは10MB以上4095MB以下の範囲で任意のサイズ(但し512バイト単位)」
とあります。
ただ、ざっと RaSCSI 関連のソースコードを見た範囲では off_t
もしくは off64_t
等を使っており、特に 32ビット整数範囲の制限は無いように見えました。
RaSCSI のソースを斜め読みした感じではディスクイメージサイズ 32bit制限は特にないように見えたけどどうなのかな(試そうとしたらSDが一杯)
— Izumi Tsutsui (@tsutsuii) 2018年5月10日
上記マニュアルの記述は 32ビット Windowsがターゲットだった XM6 時代の記載が残っているだけかな、ということで試しに 4GB超のイメージファイルを指定するとどうなるかやってみました。
rascsi コマンドで 4GB 超の 8GB の .hds ファイルを指定してみたけれど、特に問題なくアクセスできているっぽい? pic.twitter.com/mq2azvkEXB
— Izumi Tsutsui (@tsutsuii) 2018年5月12日
とりあえず、 newfs(8)
でのファイルシステム作成、 cvs checkout
による pkgsrc のファイル展開、その後の fsck(8)
のチェック等では明示的なエラーが出ることはなく動いているようです。イメージファイル破損等の問題がないかはまた追って検証したいと思います。