レンタルサーバ + Webシステム開発 = E-business

■レンタルサーバご利用参考資料
サーバご利用の参考にJF Project によるJF (Japanese FAQ)を掲載しています。

Linux JF(Japanese FAQ)Project.
JF は, Linux に関する解説文書・FAQ などを作成・収集・配布するプロジェクトです.

グリーンネット・トップページへ戻る


一覧に戻る
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>                      

一覧に戻る
グリーンネット・トップページへ戻る

http://www.green.ne.jp/