od-driver

FreeBSD 3.x-RELEASE や 4.x-RELEASE では /dev/od* がなくなったため、 標準のカーネルではファイルシステムとしては扱えません。 そこで、カーネルに od-driver というパッチを当てて Optical Disk である MO を使用可能にします。

2001/12/17 現在、最新バージョンは 4.1.1R 用です。 そこで、OS が 4.2R や 4.4R のときは、 著者作のパッチでとりあえずインストールしています。 ただし、od-driver で提供されている「以外」のパッチなどは 素人の著者作ですので、無保証無保障です。

用意するもの

FreeBSD のバージョン
注意[2003/06/02]
4.x 系では /dev/da* が SCSI 接続の MO ドライブに対応しており、 標準で(od-driver をインストールしなくても)使えるようです。 ただし、640MB (以上)の MO をフォーマットするには /etc/disktab に 640MB 用の記述(od-driver 付属のものでよいみたい)を 追加しておくとよいようです。640MB と 1300MB の MO 用 /etc/disktab は 次の通りです。
mo640|Generic 3.5in 640MB MO disk:\
       :dt=SCSI:ty=removable:\
       :se#2048:nt#64:ns#32:nc#152:su#310352:\
       :pa#310352:oa#0:ba#8192:fa#2048:ta=4.2BSD:\
       :pb#0:ob#0:tb=swap:\
       :pc#310352:oc#0:

mo1300|Generic 3.5in 1300MB MO disk:\
       :dt=SCSI:ty=removable:\
       :se#2048:nt#64:ns#32:nc#296:su#605846:\
       :pa#605846:oa#0:ba#8192:fa#2048:ta=4.2BSD:\
       :pc#605846:oc#0:
参考:

3.4-RELEASE
以下では、od-driver-3.3R を使っていますが、 インストール当時にまだ od-driver-3.4R が出ていなかったためです。 現在は、od-drier-3.4R が出ていますが、 おそらく MAKEDEV では同じように困るのではないかと思います。

OS のインストール状況

著者が od-driver で MO の UFS フォーマットに成功した時の インストール状況を示しておきます。 マシンは、IBM InteliStation ZPro です。 おそらく、X-Kern-Developer でも大丈夫でしょう。 PAO3 を入れないと、/dev/MAKEDEV に対するパッチがうまく当たらず、 かつ /etc/disktab を手動で変更しないといけません。

od-driver-3.3R のインストール

  1. od-driver-3.3R をどこか(/somewhere とする)に展開する
    % cd /somewhere
    % ls
    od-driver-3.3R.tar.gz
    % tar zxf od-driver-3.3R.tar.gz
  2. 各種パッチを当てる
    # cd /dev
    # patch < /somewhere/od-driver-3.3R/MAKEDEV.diff
    # cd /usr/src
    # patch -p1 < /somewhere/od-driver-3.3R/kernel.diff
    # patch -p1 < /somewhere/od-driver-3.3R/msdosfs.diff
    パッチ MAKEDEV.diff がうまく当らないときは、下の トラブルシューティング を 参照して下さい。
  3. /stand/sysinstall を変更する場合は、以下のパッチも当てる
    これをしておくと、/stand/sysinstall から MO のフォーマットが できて便利。。。だそうですが、著者はやり方がよく分かっていません。 システム(sys)以外のソースを入れていない場合は、 この項は飛ばしてください。
    # cd /usr/src
    # patch -p1 < /somewhere/od-driver-3.3R/release.diff
    # cd /usr/src/lib/libdisk
    # make obj
    # make depend
    # make all
    # make install
    # cd /usr/src/release/sysinstall
    # make obj
    # make depend
    # make all
    # make install
  4. カーネルコンフィギュレーション
    カーネルコンフィギュレーションファイルに 次の一行があるか確認して、なければ追加する。
    device od0
  5. カーネルを再構築する
    # cd /usr/src/sys/i386/conf
    # config MYKERNEL
    # cd ../../compile/MYKERNEL
    # make depend
    # make
    # make install
  6. デバイスファイルを作成する
    # cd /dev
    # sh MAKEDEV od0 od0s4a
    リブートする

トラブルシューティング

デバイスファイル /dev/od* を作成するには、/dev/MAKEDEV に パッチを当てなければならないのですが、これがうまく当たりませんでした。 /dev/MAKEDEV.rej というファイルができてしまうのです。 ここからは推測ですが、原因は PAO3 を入れなかったことでしょう。 PAO3 を入れると /dev/MAKEDEV に od の内容が記述されるが、 入れないと記述されていない。 だからパッチが「あれ?言われているのと違うやん」となって うまく当らなかったのではないでしょうか。

と、いうわけで od-driver-3.3R/MAKEDEV.diff を参照して GENERIC 用のパッチ MAKEDEV.GENERIC.patch を作りました。以下のようにパッチを当てて下さい。
# cd /dev
# patch < /somewhere/MAKEDEV.GENERIC.patch
# sh MAKEDEV od0 od0s4a

4.2-RELEASE
od-driver-4.1.1R.tar.gz をインストールします。 詳しくは、付属の README.od (or README.od-J) をご覧ください。
3.4-RELEASE へのインストール記録 も参考になるかも知れません。
  1. extract.sh (/usr/src がなければ)
    # sh extract.sh
  2. MAKEDEV へのパッチ
    付属の MAKEDEV.diff ではうまく行かなかったので、 MAKEDEV.patch を作った。
    # cd /dev
    # patch < /somewhere/MAKEDEV.patch
  3. disktab へのパッチ
    # cd /etc
    p # patch < /somewhere/od-driver-4.1.1R/disktab.diff
  4. カーネルソースファイルへのパッチ
    付属の kernel.diff ではうまく行かないファイルが一つ(disk.c)あったの で、disk.c 用のパッチ disk.c.patch を 作った。kernel.diff を当てたあと、次の作業を行う。
    # cd /usr/src
    # patch -p1 < /somewhere/od-driver-4.1.1R/kernel.diff
    # patch < /somewhere/disk.c.patch
  5. インクルードファイルの更新
    # cd /usr/src/sys/sys
    # install -c -m 444 mount.h /usr/include/sys
  6. mount コマンドを再作成する
    # cd /usr/src/sbin/mount
    # patch < /somewhere/od-driver-4.1.1R/mount.diff
    # make obj
    # make depend
    # make
    # make install
  7. sysinstall の再作成/インストール
    # cd /usr/src
    # patch -p1 < /somewhere/od-driver-4.1.1R/release.diff
    # cd /usr/src/lib/libdisk
    # make obj
    # make depend
    # make
    # make install
    # cd /usr/src/release/sysinstall
    # make obj
    # make depend
    # make
    # make install
  8. /sbin/newfs_msdos の再作成/インストール
    # cd /usr/src/sbin/newfs_msdos
    # patch < /somewhere/od-driver-4.1.1R/newfs_msdos.diff
    # make obj
    # make depend
    # make
    # make install
  9. 光ディスク対応のカーネルを作成/インストール カーネルコンフィギュレーションファイルに
    device od
    device cd
    という記述があるか確認する。なければ追加する。 同時に、SMP , Vnode も入れておく。 カーネルを再構築、インストールする。
    # cd /usr/src/sys/i386/conf
    # cp GENERIC HOGE
    # vi HOGE
    # config HOGE
    # cd ../../compile/HOGE
    # make depend
    # make
    # make install
  10. デバイスファイルを作成する
    # cd /dev
    # sh MAKEDEV od0 od0s4a
  11. リブート
4.4-RELEASE
od-driver-4.1.1R.tar.gz をインストールします。 詳しくは、付属の README.od (or README.od-J) をご覧ください。
3.4-RELEASE へのインストール記録 4.2-RELEASE へのインストール記録 も参考になるかも知れません。
なお、ここのインストール方法による稼働実験はまだ行っていません (2001/12/17現在)。
  1. extract.sh (/usr/src がなければ)
    # sh extract.sh

  2. MAKEDEV へのパッチ
    付属の MAKEDEV.diff ではうまく行かなかったので、 MAKEDEV.patch を作った。
    # cd /dev
    # patch < /somewhere/MAKEDEV.patch

  3. disktab へのパッチ
    # cd /etc
    # patch < /somewhere/od-driver-4.1.1R/disktab.diff

  4. カーネルソースファイルへのパッチ
    付属の kernel.diff ではうまく行かないファイルが2つ (/usr/src/sys/sys/mount.h, /usr/src/sys/cam/scsi/scsi_od.c) あったので、mount.h 用のパッチ mount.h.patch と 新しい scsi_od.c を作った。
    # cd /usr/src
    # patch -p1 < /somewhere/od-driver-4.1.1R/kernel.diff
    # cd /usr/src/sys/sys
    # patch < /somewhere/mount.h.patch
    # cp /somewhere/scsi_od.c /usr/src/sys/cam/scsi

    何らかの理由で mount.h を元に戻すには mount.h.rev-patch を当てる。
    # cd /usr/src/sys/sys
    # patch < /somewhere/mount.h.rev-patch

    scsi_od.c は od-driver で新たに作られるファイルです。 4.1.1R では、/usr/src/sys/i386/i386/pmap.c で定義されている関数 pmap_kenter_temporary(vm_offset_t pa) が1つの引数を取るのに対し、 4.4R では同じ関数が pmap_kenter_temporary(vm_offset_t pa, ini i) と2つの引数を取ります。 このため、kernel.diff で作った scsi_od.c では、 新しいカーネルのコンパイルの際に、
    ../../cam/scsi/scsi_od.c: In function `oddump':
    ../../cam/scsi/scsi_od.c:696: too few arguments to function `pmap_kenter_temporary'
    ../../cam/scsi/scsi_od.c:698: too few arguments to function `pmap_kenter_temporary'
    *** Error code 1
    というエラーを吐いてストップしてしまいます。

  5. インクルードファイルの更新
    # cd /usr/src/sys/sys
    # install -c -m 444 mount.h /usr/include/sys

  6. mount コマンドを再作成する
    # cd /usr/src/sbin/mount
    # patch < /somewhere/od-driver-4.1.1R/mount.diff
    # make obj
    # make depend
    # make
    # make install

  7. sysinstall の再作成/インストール 付属の release.diff では /usr/src/lib/libdisk/disk.c に パッチが当たらないので、 disk.c.patch を作った。
    # cd /usr/src
    # patch -p1 < /somewhere/od-driver-4.1.1R/release.diff
    # cd /usr/src/lib/libdisk
    # patch < /somewhere/disk.c.patch
    # make obj
    # make depend
    # make
    # make install
    # cd /usr/src/release/sysinstall
    # make obj
    # make depend
    # make
    # make install

  8. /sbin/newfs_msdos の再作成/インストール
    # cd /usr/src/sbin/newfs_msdos
    # patch < /somewhere/od-driver-4.1.1R/newfs_msdos.diff
    # make obj
    # make depend
    # make
    # make install

  9. 光ディスク対応のカーネルを作成/インストール カーネルコンフィギュレーションファイルに
    device od
    という記述があるか確認する。なければ追加する。 同時に、SMP , Vnode も入れておく。 カーネルを再構築、インストールする。
    # cd /usr/src/sys/i386/conf
    # cp GENERIC HOGE
    # vi HOGE
    # config HOGE
    # cd ../../compile/HOGE
    # make depend
    # make
    # make install

  10. デバイスファイルを作成する
    # cd /dev
    # sh MAKEDEV od0 od0s4a

  11. リブート
4.5-RELEASE
od-driver-4.1.1R.tar.gz を 4.5R 用に変更してインストールします。 詳しくは、付属の README.od (or README.od-J) をご覧ください。
3.4-RELEASE へのインストール記録 4.2-RELEASE へのインストール記録 4.4-RELEASE へのインストール記録 や も参考になるかも知れません。
なお、ここのインストール方法による稼働実験はまだ行っていません (2002/04/09現在)。
  1. od-driver-4.1.1R.tar.gz を適当な場所に展開する
    % cd /somewhere
    % gunzip /somewhere/od-driver-4.1.1R.tar.gz | tar xf -

  2. extract.sh (/usr/src がなければ)
    # sh extract.sh

  3. MAKEDEV へのパッチ
    付属の MAKEDEV.diff ではうまく行かなかったので、 MAKEDEV.patch を作った。
    # cd /dev
    # patch < /somewhere/MAKEDEV.patch

  4. disktab へのパッチ
    # cd /etc
    # patch < /somewhere/od-driver-4.1.1R/disktab.diff

  5. カーネルソースファイルへのパッチ
    付属の kernel.diff ではうまく行かないファイルが3つ (/usr/src/sys/sys/mount.h, /usr/src/sys/cam/scsi/scsi_od.c, /usr/src/sys/ufs/ffs/ffs_vfsops.c)あるので、 を作った。上の3つをどこか (/somewhere)に置き、 kernel.diff をパッチした後、上の3つに関する処理も行う。
    # cd /usr/src
    # patch -p1 < /somewhere/od-driver-4.1.1R/kernel.diff
    # cd /usr/src/sys/sys
    # mv mount.h.orig mount.h.orig.orig
    # patch < /somewhere/mount.h.patch
    # rm mount.h.rej
    # cp /somewhere/scsi_od.c /usr/src/sys/cam/scsi
    # cd /usr/src/sys/ufs/ffs
    # mv ffs_vfsops.c.orig ffs_vfsops.c.orig.orig
    # patch < /somewhere/ffs_vfsops.c.patch
    # rm ffs_vfsops.c.rej

    ちょっと説明
    scsi_od.c は od-driver で新たに作られるファイルです。 4.1.1R では、/usr/src/sys/i386/i386/pmap.c で定義されている関数 pmap_kenter_temporary(vm_offset_t pa) が1つの引数を取るのに対し、 4.4R では同じ関数が pmap_kenter_temporary(vm_offset_t pa, ini i) と2つの引数を取ります。 このため、kernel.diff で作った scsi_od.c では、 新しいカーネルのコンパイルの際に、
    ../../cam/scsi/scsi_od.c: In function `oddump':
    ../../cam/scsi/scsi_od.c:696: too few arguments to function `pmap_kenter_temporary'
    ../../cam/scsi/scsi_od.c:698: too few arguments to function `pmap_kenter_temporary'
    *** Error code 1
    というエラーを吐いてストップしてしまいます。

  6. インクルードファイルの更新
    # cd /usr/src/sys/sys
    # install -c -m 444 mount.h /usr/include/sys

  7. mount コマンドを再作成する
    # cd /usr/src/sbin/mount
    # patch < /somewhere/od-driver-4.1.1R/mount.diff
    # make obj
    # make depend
    # make
    # make install

  8. sysinstall の再作成/インストール 付属の release.diff では /usr/src/lib/libdisk/disk.c に パッチが当たらないので、 disk.c.patch を作った。
    # cd /usr/src
    # patch -p1 < /somewhere/od-driver-4.1.1R/release.diff
    # cd /usr/src/lib/libdisk
    # patch < /somewhere/disk.c.patch
    # make obj
    # make depend
    # make
    # make install
    # rm disk.c.rej
    # cd /usr/src/release/sysinstall
    # make obj
    # make depend
    # make
    # make install

  9. /sbin/newfs_msdos の再作成/インストール
    # cd /usr/src/sbin/newfs_msdos
    # patch < /somewhere/od-driver-4.1.1R/newfs_msdos.diff
    # make obj
    # make depend
    # make
    # make install

  10. 光ディスク対応のカーネルを作成/インストール カーネルコンフィギュレーションファイルに
    device od
    という記述があるか確認する。なければ追加する。 同時に、必要なら SMP , Vnode も入れておく。 カーネルを再構築、インストールする
    # cd /usr/src/sys/i386/conf
    # cp GENERIC HOGE
    # vi HOGE
    # config HOGE
    # cd ../../compile/HOGE
    # make depend
    # make
    # make install

  11. デバイスファイルを作成する
    # cd /dev
    # sh MAKEDEV od0 od0s4a

  12. リブート

FreeBSD の部屋


Dec. 17, 2001