Optical disk driver patch set for FreeBSD 2.2.7-RELEASE ======================================================= Sep 13, 1998 秋山 俊輔 akiyama@jp.FreeBSD.org 概要 ---- FreeBSD-2.2 のスナップショットから、拙作の od-driver が含まれるこ とになりました。ただし、この配布されているものでは、512 バイト/セク タのメディア以外を使用することはできません。 本パッチ・セットは、3.0-current の変更点を取り込み、FreeBSD 2.2.7- RELEASE で 1024 バイト/セクタや 2048 バイト/セクタのメディアを使用 可能にし、さらに、バグ・フィックス/改良を行うためのものです。 * 1024 バイト/セクタ、2048 バイト/セクタ・メディアで、UFS および MSDOS-FSを使用することができるようになりました。 * エラー時の処理の改善を行いました。 * fdisk コマンドの改良を行いました。 * 光ディスクからブートを行うことができるようになりました。 * 松下の DVD-RAM ドライブ LF-D100 が使用できるようになりました。 なお、本パッチ・セットの一次配布先は、 ftp://jaz.jp.freebsd.org/pub/FreeBSD-jp/OD/ となっています。また、ここには過去のリリースやユーティリティも置いて あります。 動作環境 -------- このパッチ・セットは、FreeBSD 2.2.7-RELEASE 上で動作を確認していま す。2048 バイト/セクタのメディアでの動作も確認済みです。 開発機の環境は、以下の通りです。 CPU : MMX Pentium Overdrive 200 MHz MB : ASUS P/I-P55TP4XE Memory : 64 MB SCSI Adapter : Adaptec AHA-2940 MO Drive : 富士通 M2512A(3.5 インチ内蔵型) : 富士通 M2513A(3.5 インチ内蔵型) MO ドライブは、光メモリ・デバイスのモード(FreeBSD ならば、システム 立ち上げ時のデバイス・プローブで、type 7 と表示されるモード)で使用 しますが、HD 互換モード(type 0 removable と表示される)での使用も可 能です。ただし、この場合は、ソース・コードの変更を行う必要があります。 制限事項 -------- * Windows 95 でフォーマットを行ったメディア、フォーマット済みで販売 されているメディアを使用すると、コンソールに以下のようなエラー・メッ セージが出力されることがある。 ILLEGAL REQUEST asc:21,0 Logical block address out of range これは、MBR の内容が不正なため、各スライス上のディスク・ラベルを読 み込もうとしてエラーとなるためです。ただし、使用する上で問題になる ことはないと思います。 原因はわかっているのですが、どのように対処すればいいのか、現在検討 中です。 * FreeBSD-2.0-950412-SNAP 対応の本ドライバを数名の方にテストしていた だき、次の問題点が発見されています。 1.古いタイプのオリンパスの MO ドライブで、大量の書き込みを行うと、 カーネル・パニックをおこしてしまう。 問題となるドライブは、キャッシュ・メモリを 1MB 搭載しているタ イプのものです。これらのドライブは、キャッシュがいっぱいになっ た時のメディアへの書き込みを、SCSI バスを掴んだまま行なうよう です。これには比較的時間がかかるため、SCSI アダプタへのコマン ド発行がタイムアウトし、結果的にカーネル・パニックとなっている ようです。 これは、ドライブのライト・キャッシュを OFF にすると、問題が改 善されるようなので、別途リリースしている odcontrol を使ってみ てください。 ただし、最近のものでは、問題なく使用できるようになっているよう です。 * 松下の DVD-RAM ドライブ LF-D100 で DVD-ROM ディスクを使用した場合 の動作は未確認です。 また、このドライブは、od と cd の各デバイスとしてそれぞれ使用する ことができますが、同時にデバイスのアクセスを行った場合の動作は、保 証されません。(おそらく、変な動作をすると思われます。) 内容 ---- このパッチ・セットには以下の内容のファイルが納められています。 README.od-J このファイル README.od このファイルの英語版 kernel.diff カーネルに当てるパッチ non512support.diff 1024 バイト/セクタ、2048 バイト/セク タ・メディアのサポート用パッチ fdisk.diff fdisk コマンド用パッチ disktab.od 光ディスク用サンプル disktab エントリ HowToInstall.od-J 光ディスクからのインストールに関するド キュメント さらに、伊藤 暢浩(いとう のぶひろ)さん による MO ドライブ動作リストを同封し ています。 MO-REPORT/MO-List980910.txt 動作確認されている光磁気ディスクドライ ブの一覧 MO-REPORT/result-980910.txt 光磁気ディスクの動作確認報告 パッチの使用方法 ---------------- このパッチ・セットは以下のようにして使用します。 1.パッチを当てるソースを用意する このパッチ・セットを使用するには、まずカーネル、および、fdisk コ マンドのソースが必要になります。ディストリビューション・セットの 中から、カーネル部分(ssys.??)/該当コマンド(ssbin.??)のソー スを展開してください。 なお、このパッチ・セットも適当なディレクトリに展開しておきます。 2.fdisk コマンドを作り直す fdisk コマンドは、すでに 1024 バイト/セクタ、2048 バイト/セク タのメディアを使用可能になっていますが、これらのメディアに対して実 行した際にエラー・メッセージを表示します(動作自体に問題はありませ ん)。パッチを当てることで、このエラー・メッセージが出ないようにな ります。 スライスをこれらのメディア上に作成しない、あるいは、そんなメッセー ジは気にしないのであれば、fdisk コマンドを作り直す必要はありません。 /usr/src または、ソースを展開したディレクトリでパッチ(fdisk.diff) を当てます。この後、fdisk コマンドを再構築してインストールします。 ex. # cd /usr/src/sbin/i386/fdisk # patch < /somewhere/od-driver-2.2.7R/fdisk.diff # make depend # make # make BINDIR=/sbin install 3.カーネル・ソースにパッチを当てる /usr/src/sys または、/sys ディレクトリの下で、同封のパッチ (kernel.diff)を当ててください。patch コマンドには、"-p" オプショ ンが必要です。 ex. # cd /sys # patch -p < /somewhere/od-driver-2.2.7R/kernel.diff 1024 バイト/セクタ、2048 バイト/セクタ・メディアのサポートが必要 であれば、続けてパッチ(non512support.diff)を当ててください。松下 の DVD-RAM ドライブ LF-D100 を使用する場合も、このパッチが必要です。 ここでも、patch コマンドには、"-p"オプションが必要です。 ex. # patch -p < /somewhere/od-driver-2.2.7R/non512support.diff 4.光ディスク対応のカーネルを作成/インストール 光ディスクのデバイス名は od です。カーネル・コンフィギュレーショ ン・ファイルの中に、 device od0 を追加して、カーネルを作成してください。(GENERIC にはすでに記述し てあります) なお、松下の DVD-RAM ドライブ LF-D100 を cd デバイスとしても認識さ せる場合は、さらに、 device cd0 を追加します。(これも GENERIC にはすでに記述してあります) 新しいカーネルができたら、これをインストールします。 ex. [コンフィグレーション・ファイルを GENERIC からコピーして使う] # cd /sys/i386/conf # cp GENERIC ODDRIVER # vi ODDRIVER # config ODDRIVER # cd ../../compile/ODDRIVER # make depend # make # make install 5.デバイス・ファイルを作成する MAKEDEV スクリプトで、必要となる光ディスクのデバイス・ファイルを 作成します。スライス対応のデバイス・ファイル(od*s*)も必要ならば 作っておいてください。 ただし od0 は、FreeBSD のインストール時に作成されているはずなので、 作らなくてもかまいません。 ex. [スライス1に対応するデバイス・ファイルを同時に作る] # cd /dev # sh MAKEDEV od0 od0s1a 6.システムをリブートする システムをリブートします。 これで、次にシステムが立ち上がったときから、光ディスクを /dev/od*[a-h] /dev/rod*[a-h] /dev/od* /dev/rod* /dev/od*s[1-4] /dev/od*s[1-4][a-h] /dev/rod*s[1-4] /dev/rod*s[1-4][a-h] /dev/rod*.ctl として使用することができるようになります。デバイス名が異なる他は sd デバイスとほとんど同じように使うことができます。 光ディスク・ドライバのカーネル・コンフィグレーション ---------------------------------------------------- 現在、光ディスク・ドライバ関連のカーネル・コンフィギュレーション・ パラメータには次のものがあります。それぞれ、カーネル・コンフィギュレー ション・ファイルにて指定することで、動作の変更を行うことができます。 1.options OD_BOGUS_NOT_READY ドライブおよびそのファームウェアによっては、システム立ち上げ時に メディアを挿入していないと、ブート時に "NOT READY" というエラー・ メッセージが出力されるものがあります。このタイプのドライブをお使い の方は、このオプションを試してみてください。 このエントリが必要となるのは、主に一部の古いタイプの富士通製ドライ ブのようですが、必要でないものもあるようです。 2.options OD_AUTO_TURNOFF 光ディスク・メディアをマウントしていない場合は、ドライブのスピン ドル・モータの動作を停止します。 ただし、このオプションを指定すると、メディアをマウントしていない場 合に、SCSI control device (/dev/rod*.ctl) を使用しようとしても、動 作しないドライブがあるので注意してください。 このオプションを指定したカーネルで、こういったドライブを使用すると、 拙作の odcontrol 等、動作しないプログラムがでてきます。 3.options OD_WAIT_READY 光ディスク・デバイスをオープンする際に、ドライブがレディ状態にな るまで一定期間ウェイトし、オープン動作をリトライするようになります。 ただし、このオプションを指定すると、本当にドライブがレディ状態でな い場合、エラーとなるまでに時間を要するようになるので注意が必要です。 (例えば、/stand/sysinstall の起動時にメディアが挿入されていないと、 立上りに時間がかかるようになる、等) 4.options ODBOOT 光ディスクからブートを行うカーネルを作成する際に指定します。 現在のカーネルでは、光ディスクを起動ディスクにすることはできません が、これを可能にします。 なお、光ディスクからブートを行うためには、biosboot の再作成が必要 になります。詳細は、後述します。 光ディスクの使用方法 -------------------- od ドライバを使用することで、光ディスクを(少なくとも)以下のファ イル・システムとして使用することが可能になります。 a. DOS ファイル・システム(スーパー・フロッピー・フォーマット) b. DOS ファイル・システム(HD 互換フォーマット) c. UNIX ファイル・システム(UFS) a. および b. は、mount コマンドで "-t msdos" オプションを指定するか、 mount_msdos コマンドを使用することで、利用可能となります。 c. の UFS として使用する場合、ディスク・ラベルの書き込み、および、ファ イル・システムの構築が必要となります。 これには、/stand/sysinstall を使用して一連の作業を行うことができます。 これが、光ディスク上にファイル・システムを構築する、最も簡単な方法で しょう。 ここでは、手動で、光ディスク上に UFS を作成して、使用する方法につい て記述します。 現行バージョンの FreeBSD において UFS は、 (1) 全てのディスク領域を使う (2) ディスク上のスライス(いわゆる物理パーティション)の領域を使う 方法で構築することができます。 (1) の場合、ディスク・ラベルの書き込み/ファイル・システムの構築を行 うことで、通常のディスクと同じようにマウントして使用可能となります。 1. disktab エントリの準備 サンプルの disktab.od を参照してください。サンプルでは、1メディ ア/1パーティションですが、必要なら、さらに細かくパーティション を定義します。 2. ディスク・ラベルの書き込み 用意した disktab エントリを使って、ディスク・ラベルを書き込みま す。 # disklabel -r -w -B od0 mo128 3. ファイル・システムの構築 newfs コマンドでファイル・システムを作成します。 # newfs /dev/rod0a or # newfs -t 64 -u 32 /dev/rod0a or # newfs -t 0 -u 0 /dev/rod0a (2) の場合は、まずスライスの確保を行ってから、ディスク・ラベルの書き 込み/ファイル・システムの構築を行います。スライスの確保は、fdisk コ マンドを使用します。 1. スライスの確保 fdisk コマンドを使って、FreeBSD 用のスライスを確保します。 # fdisk -i /dev/rod0 or # fdisk -u /dev/rod0 2. disktab エントリの準備 確保した FreeBSD 用スライスのサイズに応じた disktab エントリを作 成します。なお、各 UFS パーティションのオフセットは、FreeBSD 用 スライス内のオフセット値を使用します。(FreeBSD-1.X では、ディス クの先頭からのオフセットを指定していました。) disktab エントリのパラメータは、fdisk コマンドで書き込まれた MBR の内容と矛盾してはいけません。矛盾したパラメータがあると、ディス ク・ラベルが書き込めません。 3. ディスク・ラベルの書き込み 用意した disktab エントリを使って、ディスク・ラベルを書き込みま す。 # disklabel -r -w -B od0 XXXXX 4. ファイル・システムの構築 newfs コマンドで、ファイル・システムを構築します。 使用するデバイスは、確保したスライスに対応したデバイスを使用しま す。 # newfs /dev/rod0s1a or # newfs -t 64 -u 32 /dev/rod0s1a or # newfs -t 0 -u 0 /dev/rod0s1a デバイス・ファイルと用途 ------------------------ /dev/MAKEDEV スクリプトで作成するデバイス・ファイルには以下のもの があります。 /dev/od*[a-h] /dev/rod*[a-h] /dev/od* /dev/rod* /dev/od*s[1-4] /dev/od*s[1-4][a-h] /dev/rod*s[1-4] /dev/rod*s[1-4][a-h] /dev/rod*.ctl これらのデバイス・ファイルは、それぞれ用途によって使い分けます。 以下、簡単にまとめておきます。 なお、デバイス名の先頭に r が付くものは、キャラクタ・デバイスです。 (下の表には入れていません。) ┌───────────┬────────────────────┐ │ デバイス・ファイル │ 用 途 │ ┝━━━━━━━━━━━┿━━━━━━━━━━━━━━━━━━━━┥ │/dev/od* │ディスク全体のアクセスに使用します。 │ │ │スーパー・フロッピー・フォーマットの MO │ │ │をマウントする場合などは、このデバイス・│ │ │ファイルを指定します。 │ │ │MBR の書き込みなども、このデバイスを使う│ │ │ようです。 │ ├───────────┼────────────────────┤ │/dev/od*[a-h] │UFS の各パーティションに対応する。 │ │ │ディスクがスライス分割されている場合は、│ │ │最初に現れた FreeBSD スライスにマップさ │ │ │れます。 │ ├───────────┼────────────────────┤ │/dev/od*s[1-4] │各スライス(物理パーティション)に対し │ │ │てのアクセスに使用します。HD 互換フォー │ │ │マットの MO の DOS 領域のマウントには、 │ │ │このデバイス・ファイルを指定します。 │ ├───────────┼────────────────────┤ │/dev/od*s[1-4][a-h]  │スライス内に設けられたパーティションに │ │ │アクセスする場合は、これらのデバイス・ │ │ │ファイルを使用します。 │ └───────────┴────────────────────┘ ブート可能光ディスクの作成 -------------------------- 2.2.5-RELEASE より、ブート・デバイスの選択が、/boot.config ファイ ルにて柔軟に対応できるようになったため、光ディスクから FreeBSD をブー トすることができるようにしてみました。 ただし、ブート処理には BIOS が使われており、その制限により 512 バイ ト/セクタ・メディア以外を使用することはできません。また、クラッシュ・ ダンプを光ディスク・メディアに対して行うことはできません。 また、その作成には、光ディスクを備えた FreeBSD システムが必要となり ます。 1.BIOS ブート・コードの更新 本パッチ・セットのパッチ(kernel.diff)を当てます。その後、 /sys/i386/boot/biosboot ディレクトリに移動し、Makefile の 45 行目 #CFLAGS+= -DODBOOT 部分のコメントを外します。 後は、このディレクトリで、make obj depend all install を行うと、新 しいブート・コードが /usr/mdec にインストールされます。 2.カーネルの作成 ブート可能光ディスクにインストールするカーネルを作成します。 この時、カーネル・コンフィギュレーション・ファイルには、必ず config kernel root on od0 options ODBOOT を指定してください。 3.インストール 光ディスクに、FreeBSD システムをインストールします。ブート・フロッ ピーのインストーラを使うなり、手動でインストールを行うなりしてくだ さい。 ただし、インストーラを使う場合は、インストール途中で、 Unable to add /mnt/dev/od0s1b as a swap device: Device not configured というエラーが発生しますが、無視して作業を進めてください。 インストール完了後、先程作り直したブート・コードとカーネルを書き込 みます。 さらに、boot.config を設定します。この中の BIOS ドライブ番号の設定 は、各システムの環境によって異なります。ここでは、私の環境の場合を 例にとって記述してあります。詳しくは、man 8 boot を参照してくださ い。 ex. # disklabel -B od0 # mount /dev/od0a /mnt # chflags noschg /mnt/kernel # cp /sys/compile/YOUR_KERNEL/kernel /mnt # echo '3:od(0,a)/kernel' > /mnt/boot.config # umount /mnt 光ディスクの他に FreeBSD がブート可能なハード・ディスクが接続され ている場合は、このブート・コードも更新しておく必要があるかもしれま せん。ただし、後述するブート・フロッピーを作成すれば、必要ないと思 います。 4.SCSI アダプター設定 光ディスクからのブートを行うには、BIOS から光ディスクのアクセスが 可能でなければなりません。したがって、SCSI アダプタ上の BIOS を有 効にするとともに、その他オプションの設定を行う必要があります。これ に関しては、各アダプタのマニュアルを参照して設定を行ってください。 ちなみに、私の使っている Adaptec AHA-2940 では、BIOS を有効にする とともに、セットアップ・ユーティリティ(SCSISelect(TM) Utility v1.21)から、 Configure/View Host Adapter Settings → Additional Options → Advanced Configuration Options → Support Removable Disks Under BIOS as Fixed Disks の項目を、[All Disks] に設定する必要がありました。 以上で、FreeBSD のブート時のブート・プロンプトに、 Boot: 3:od(0,a)/kernel などと指定することにより、光ディスクから FreeBSD をブートすること ができるようになります。 5.ブート・フロッピー いちいちブート・プロンプトで入力するのは面倒だ、あるいは、他のシス テムがディスクに入っているので、そもそもそんな指定はできない、など の場合は、ブート・フロッピーを作成しておきます。 まず、フロッピーをフォーマットします。 # fdformat -f 1440 fd0 ディスク・ラベルを書き込み、newfs をかけます。 # disklabel -rwB fd0 fd1440 # newfs /dev/rfd0a boot.config/boot.help を書き込みます。 # mount /dev/fd0a /mnt # echo '3:od(0,a)/kernel' > /mnt/boot.config # cp /boot.help /mnt # umount /mnt 以上で完成です。このフロッピーを使ってブートを行えば、光ディスクか らカーネルを読み込み、ブートすることができるようになります。 なお、この方法は、一般のハード・ディスクから起動する場合にも応用が 効きます。覚えておきましょう。 6.fbsdboot.exe を使ったブート SCSI アダプタ上に BIOS がない場合は、fbsdboot.exe を使ってみましょ う。fbsdboot.exe は、/usr/mdec ディレクトリにあります。これと、2. で作成したカーネルを MSDOS-FS にコピーしておいて、DOS のコマンド・ プロンプトから、 C:\> fbsdboot -r -D /kernel というように指定すれば、光ディスク上の FreeBSD システムを起動する ことができるはずです。ただし、余計なドライバとかが組み込まれている とうまくブートできないようですから、この場合は、フロッピー・ブート した clean DOS で試してみてください。 SPECIAL THANKS ---------------------------- FreeBSD-950412-SNAP 用のドライバのテストを行ってくださった方々: 龍 忠 さん 井上 敬介 さん 大矢 正雄 さん 田中 健 さん 岸本 英明 さん 初期のころのドキュメントの翻訳を行なっていただきました: Satoshi Asami 1024 バイト/セクタ・サポート・パッチを参考にさせていただきました: 住田 尚亮 さん PD の disktab に関する情報をお寄せ頂きました方々: 岸本 英明 さん 江木 康雄 さん 今村 友明 さん いろいろな御意見等をいただき、開発協力もして頂きました: Joerg Wunsch MO-REPORT を頂きました: 伊藤 暢浩 さん パッチと大変有益な後意見をいただきました: 今田 宏司 さん DVD-RAM ドライブ LF-D100 でのテストを行っていただきました: 伊藤 靖幸 さん 皆さん、ありがとうございました。 その他 ------ バグ・フィックスや機能拡張などがあれば、ぜひ私の方にフィードバック をお願いします。 なお、他の光ディスクの disktab エントリも募集しています。 $Id: README.od-J,v 2.13 1998/09/13 12:47:11 akiyama Exp $