次のページ 前のページ 目次へ

$Id: ATAPI-PD-memo.sgml,v 1.1.1.1 1999/02/22 19:20:49 baba Exp $

                   Linux ATAPI-PD メモ

              加藤 貞顕 / skato@venus.dti.ne.jp

この文書では、LinuxでATAPI-PDを使用する際の注意点をおおざっぱに
まとめてあります。

kernelのmake等については知ってるものとみなして書いていますので、
わからないかたは他のJFのドキュメントや書籍などをあたってください。

1. 基本的なこと

まず、kernelは 2.0.33 を使用するのがいちばん簡単です。以下の設定
でmakeしてやるだけです。(2.0.35や36を使いたいかたは第3章をご覧く
ださい)

ポイントは、make *configで

- Floppy,IDE,and other block devices
     ・SCSI emulation support  = Y
     ・Include IDE/ATAPI CDROM support = N
- SCSI suppurt 
     ・SCSI disk support = Y
     ・SCSI CDROM support = Y 
     ・Probe all LUNs on each SCSI device = Y

とするということです。ATAPI CDROM supportはNなのにご注意ください。
「俺はPD以外にATAPI-CDROMドライブを持っているんだけどこれでいい
のかな?」と思ったかた、大丈夫です。ATAPI-CDROMドライブもPDドラ
イブも、両方ともSCSI emulationで認識されます。

最後のProbe all LUNsはなかなか問題のあるオプションでして、よくわ
からんけどとにかく認識させたいんだ!というかたはYにしとくのが無
難です。Panasonicのものならなくてもいける場合もありますので、ま
ずはYでやってみて、うまくいったらNにして試してみるというのもいい
でしょう。
また、Probe all LUNsをYにすると起動時に全てのSCSI IDを検索します
ので、起動時のメッセージがたいへんうるさくなります。実害はないの
ですが、なんだか気持ち悪いというかたは、カーネルのパラメータに
max_scsi_luns=? を与えてやりましょう。うちでは2にしてました。カー
ネルへのオション指定のやりかたがわからんというかたは、liloや
loadlinのドキュメントを読みましょう。

なお、NEC製などの Probe all LUNs がYでないと認識されないPD drive
でも、Nにできるようにする方法もあります。ただ、カーネルソースに
手を入れなくてはいけないので、上級編として最後に紹介ます。

いずれにしても、とりあえずはYでためしてみることをおすすめします。


2. 実際の使用法

私の環境では、PDのCDは /dev/scd2 にわりあてられました。
これは起動時に、

Detected scsi CD-ROM sr2 at scsi0, channel 0, id 1, lun 0
  Vendor: NEC       Model: PD-1 ODX654P      Rev: A113
  Type:   Optical Device                     ANSI SCSI revision: 02

というメッセージがでることから確認しました。sr2というのがポイン
トです。なぜsr2がscd2になるのかは謎ですが、そういうもんのようで
す。
/dev/を見ると、scd2がなかったので新たに作ってやらなければなりま
せんでした。  こういう時は、/dev/MAKEDEVコマンド(これがなければ
mknod)を使います。詳しくは、man MAKEDEV(mknod)をどうぞ。
PDとして使うときは/dev/sdaがわりあてられています。このへんは環境
によって異なると思うので、起動時のメッセージを見て適切に読みかえ
てください。

PDドライブでPDとCDが問題なくmount、umountできることを確認した後、
/etc/fstabを書きかえましょう。例えば、私の/etc/fstabは以下のよう
になってます。

/dev/hda2       /       ext2        defaults   1   1
/dev/hda1       /win    vfat        defaults   1   2
/dev/hda3       swap    swap        defaults
/dev/scd0       /cdrom  iso9660     user,ro,noauto
/dev/scd2       /pcd    iso9660     user,ro,noauto
/dev/sda        /pd     vfat        user,noauto

見ればわかる通り、マウントポイントとして/pcdと/pdというディレク
トリをあらかじめ作っています。/cdromは別につながっている
ATAPI-CDROMドライブ用です。PDのオプションをvfatにしたのは、Win98
とのデータ交換も考えてのことですので、御使用なさる環境にあわせて
適切に設定してください。

なお、蛇足ですがこのようにuserオプションをつけると一般ユーザでも、

% mount /pcd          PDのCDをmount
% mount /pd           PDをmount

などとできるようになって便利です。詳しくはman mountをどうぞ。


3. kernel-2.0.35(or 36)でATAPI-PDを使うには

2.0.35(or 36)ではなぜかPDが常にread onlyで認識されるという問題が
あります。これを回避するためには、kernel sourceの
drivers/scsi/ide-scsi.cの150-200行目のあたりを2.0.33と同じにする
ことが必要なようです。この方法ではもしかしたらなにか問題があるの
かもしれませんが、少くともうちでは安定動作しています。
以下は、2.0.35 (or 36)でATAPI-PDを使うpatchです。fj.os.linuxで高
垣さんというかたが、2.0.34 用のpatchを公開されてた(*1)のですが、
なぜかうまくあてられなかったので、それを参考にして作りました。

以下を切り取って、 ide-scsi.c.diffとでも名付けて保存して、
drivers/scsi/で、

$ patch < ide-scsi.c.diff

などとしてあててください。あとは1章に従ってmakeするだけです。

--------- ここから -----------
*** linux/drivers/scsi/ide-scsi.c.35.org        Mon Nov 16 21:45:00 1998
--- linux/drivers/scsi/ide-scsi.c       Tue Nov 17 05:07:21 1998
***************
*** 156,162 ****
  static inline void idescsi_transform_pc1 (ide_drive_t *drive, idescsi_pc_t *pc)
  {
        idescsi_scsi_t *scsi = drive->scsi;
!       u8 *c = pc->c;
  
        if (scsi->media == TYPE_ROM) {
                if (c[0] == READ_6 || c[0] == WRITE_6) {
--- 156,163 ----
  static inline void idescsi_transform_pc1 (ide_drive_t *drive, idescsi_pc_t *pc)
  {
        idescsi_scsi_t *scsi = drive->scsi;
!       u8 *c = pc->c, *buf = pc->buffer, *sc = pc->scsi_cmd->cmnd;
!       int i;
  
        if (scsi->media == TYPE_ROM) {
                if (c[0] == READ_6 || c[0] == WRITE_6) {
***************
*** 164,169 ****
--- 165,178 ----
                        c[3] = c[1] & 0x1f; c[2] = 0;               c[1] &= 0xe0;
                        c[0] += (READ_10 - READ_6);
                }
+               if (c[0] == MODE_SENSE || (c[0] == MODE_SELECT && buf[3] == 8)) {
+                       pc->request_transfer -= 4;
+                       memset (c, 0, 12);
+                       c[0] = sc[0] | 0x40;c[2] = sc[2];c[8] = sc[4] - 4;
+                       if (c[0] == MODE_SENSE_10) return;
+                       for (i = 0; i <= 7; i++) buf[i] = 0;
+                       for (i = 8; i < pc->buffer_size - 4; i++) buf[i] = buf[i + 4];
+               }
        }
  }
  
***************
*** 171,181 ****
  {
        idescsi_scsi_t *scsi = drive->scsi;
        u8 *buf = pc->buffer;
  
        if (scsi->media == TYPE_ROM) {
!               if (pc->c[0] == INQUIRY)
!                       buf[2] |= 2;
!       }
  }
  
  static inline void idescsi_free_bh (struct buffer_head *bh)
--- 180,198 ----
  {
        idescsi_scsi_t *scsi = drive->scsi;
        u8 *buf = pc->buffer;
+       int i;
  
        if (scsi->media == TYPE_ROM) {
!               if (pc->c[0] == MODE_SENSE_10 && pc->scsi_cmd->cmnd[0] == MODE_SENSE) {
!                       buf[0] = buf[1];buf[1] = buf[2];
!                       buf[2] = 0;buf[3] = 8;
!                       for (i = pc->buffer_size - 1; i >= 12; i--)
!                       buf[i] = buf[i - 4];
!                       for (i = 11; i >= 4; i--) buf[i] = 0;
!               }
!               if (pc->c[0] == INQUIRY)
!                       buf[2] |= 2;
!         }
  }
  
  static inline void idescsi_free_bh (struct buffer_head *bh)
--------- ここまで -----------

(*1) fj.os.linux
     Message-ID: <35D6E360.AF9D2BED@st.rim.or.jp>


4.上級編

起動時に出力されるPDドライブのVenderとModelをdrivers/scsi/scsi.c
のブラックリストに登録すれば、通常はProbe all LUNsが必要な機種で
もOFFにしてもよくなることがわかりました。

うちの機械の場合は、

*** scsi.c.bak  Fri Jan 29 08:28:58 1999
--- scsi.c      Fri Jan 29 08:28:58 1999
***************
*** 280,285 ****
--- 280,286 ----
  {"IOMEGA","Io20S         *F","*", BLIST_KEY},
  {"INSITE","Floptical   F*8I","*", BLIST_KEY},
  {"INSITE","I325VM","*", BLIST_KEY},
+ {"NEC","PD-1 ODX654P","*", BLIST_FORCELUN | BLIST_SINGLELUN},
  {"NRC","MBR-7","*", BLIST_FORCELUN | BLIST_SINGLELUN},
  {"NRC","MBR-7.4","*", BLIST_FORCELUN | BLIST_SINGLELUN},
  {"REGAL","CDC-4X","*", BLIST_MAX5LUN | BLIST_SINGLELUN},

と、してます。たった1行の追加でいいとは楽ですね。ただしこの結果、
PDのCDが/dev/scd1にわりふられるようになってしまった(こっちのほう
がまともな動作ですが)ので、fstabの変更が必要でした。なお、この情
報はkernel-MLのアーカイブで得ました。

もしあなたが他のメーカーのものをお使いでも、dmesgして

hdc: NEC PD-1 ODX654P, ATAPI CDROM drive - enabling SCSI emulation

などとなってるところを見て、VenderとModelを置き換えてやるだけで
おんなじようにうまくいくんではないかと思います(この手でうまくいっ
たかたは教えてください)。
しかしProbe All LUNsしなくてよくなるといっても、実際は別にいいこ
とはなにもないのですが、なにしろこのほうが気持ちいいですね。

ちなみに2.2.[01]ではide-scsi.cがとてもbuggyなので、ATAPI-PDを使
う限りは乗り換えをしばらく控えたほうが無難です。SCSI-emulattion
をonにしてProbe All LUNsをonにすると、PDを認識しようとするあたり
でコケます。かといって、Probe All LUNsをOFFにして、scsi.cに上記
の一行を追加するとこれまたコケますので処置なしです。もしうまくい
ってるかたがいらっしゃいましたら御一報ください。


5. その他

この文書及び添付されたpatchは無保証です。トラブルが起こっても私
は責任がとれませんので、ご自分の責任で使用してください。
間違いの指摘、感想などは大歓迎です。

Minori TAKAGAKI <takagaki@aurora.dti.ne.jp>様からは有益なコメン
トをいただきました。ありがとうございました。

再配布についてはGPLに従います。

次のページ 前のページ 目次へ