$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 様からは有益なコメン トをいただきました。ありがとうございました。 再配布についてはGPLに従います。