Linux ATAPI-PD メモ 加藤貞彰 skato@venus.dti.ne.jp 1999/01/? この文書では、Linux で ATAPI-PD を使用する際の注意点をおおざっぱにまと めてあります。 kernel の make 等については知ってるものとみなして書いていますので、わか らないかたは他の JF のドキュメントや書籍などをあたってください。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Table of Contents 1. 基本的なこと 2. 実際の使用法 3. kernel-2.0.35(or 36) で ATAPI-PD を使うには 4. 上級編 5. その他 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) --------- ここまで ----------- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 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 に従います。 (LinuxDoc 変換:2000/05/12 中野武雄) (DocBook 変換:2001/03/03 千旦裕司) Notes [1] fj.os.linux Message-ID: <35D6E360.AF9D2BED@st.rim.or.jp>