## Linux ATAPI-PD メモ

1999/01/?
加藤貞彰

    skato@venus.dti.ne.jp

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

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

## 基本的なこと

まず、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 でためしてみることをおすすめします。

## 実際の使用法

私の環境では、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 をどうぞ。

## 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 を公開されてた

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

のですが、 なぜかうまくあてられなかったので、それを参考にして作りました。

以下を切り取って、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&lsqb;0&rsqb; == READ_6 || c&lsqb;0&rsqb; == 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&lsqb;0&rsqb; == READ_6 || c&lsqb;0&rsqb; == WRITE_6) {
    ***************
    *** 164,169 ****
    --- 165,178 ----
      			c&lsqb;3&rsqb; = c&lsqb;1&rsqb; & 0x1f;	c&lsqb;2&rsqb; = 0;		c&lsqb;1&rsqb; &= 0xe0;
      			c&lsqb;0&rsqb; += (READ_10 - READ_6);
      		}
    + 		if (c&lsqb;0&rsqb; == MODE_SENSE || (c&lsqb;0&rsqb; == MODE_SELECT && buf&lsqb;3&rsqb; == 8)) {
    + 		        pc->request_transfer -= 4;
    + 		        memset (c, 0, 12);
    + 		        c&lsqb;0&rsqb; = sc&lsqb;0&rsqb; | 0x40;c&lsqb;2&rsqb; = sc&lsqb;2&rsqb;;c&lsqb;8&rsqb; = sc&lsqb;4&rsqb; - 4;
    + 		        if (c&lsqb;0&rsqb; == MODE_SENSE_10) return;
    + 		        for (i = 0; i <= 7; i++) buf&lsqb;i&rsqb; = 0;
    + 		        for (i = 8; i < pc->buffer_size - 4; i++) buf&lsqb;i&rsqb; = buf&lsqb;i + 4&rsqb;;
    + 		}
      	}
      }

    ***************
    *** 171,181 ****
      {
      	idescsi_scsi_t *scsi = drive->scsi;
      	u8 *buf = pc->buffer;

      	if (scsi->media == TYPE_ROM) {
    ! 		if (pc->c&lsqb;0&rsqb; == INQUIRY)
    ! 			buf&lsqb;2&rsqb; |= 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&lsqb;0&rsqb; == MODE_SENSE_10 && pc->scsi_cmd->cmnd&lsqb;0&rsqb; == MODE_SENSE) {
    ! 	                buf&lsqb;0&rsqb; = buf&lsqb;1&rsqb;;buf&lsqb;1&rsqb; = buf&lsqb;2&rsqb;;
    ! 			buf&lsqb;2&rsqb; = 0;buf&lsqb;3&rsqb; = 8;
    ! 			for (i = pc->buffer_size - 1; i >= 12; i--)
    ! 			buf&lsqb;i&rsqb; = buf&lsqb;i - 4&rsqb;;
    ! 			for (i = 11; i >= 4; i--) buf&lsqb;i&rsqb; = 0;
    ! 		}
    ! 	        if (pc->c&lsqb;0&rsqb; == INQUIRY)
    ! 	                buf&lsqb;2&rsqb; |= 2;
    !         }
      }

      static inline void idescsi_free_bh (struct buffer_head *bh)
    --------- ここまで -----------

## 上級編

起動時に出力される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 に上記 の一行を追加するとこれまたコケますので処置なしです。もしうまくい ってるかたがいらっしゃいましたら御一報ください。

## その他

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

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

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

- (LinuxDoc 変換：2000/05/12 中野武雄)
- (DocBook 変換：2001/03/03 千旦裕司)