次のページ
前のページ
目次へ
$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に従います。
次のページ
前のページ
目次へ