FreeBSD on ThinkPad i1620
〜 ThinkPad i1620 で、FreeBSD を使おう 〜


番外編   〜panic ! そして〜

注意)この記事は、FreeBSD 4.4R の時のものです。


ポータブルな 8倍速以上のCD-R が欲しいと思って探していたけれども、どれもこれも、USB接続なやつばかりで、6倍速どまりのものしか見当たりません。

そんな時、panasonic製の KXL-CB10AN というのをみつけました。

PC-CARD接続で x8/x4/x24 となっており、しかもDVD-ROM とのコンボドライブになっています。
かなり値が張りますが、ATAPI接続/Card-BUS/16bit の切り替え可能/LINUXでは使えたらしい、という情報を仕入れたので、さっそく買ってきました。


Panasonic製 KXL-CB10AN を使おう

KXL-CB10AN のPCカードには、 CARD-BUS/16bit の切り替えスイッチがついています。
これを 16bit に切り替えて、早速差し込んでみました。

残念ながら、カードを認識してくれません。
まあ、おそらく、ATAPIかなんかの接続だろう、ということで、
/etc/pccard.conf を作成して、

     card "KME" "KXLC006"
         config auto ata ?
と記述して、再起動を行ないました。(再起動しなくても、# kill -HUP `cat /var/run/pccardd` でいいんだけど……)

これで、PCCARDを挿入すれば、/dev/acd0c として認識されました。good !

補足)
なお、ウルトラベースX2 をドッキングして起動した場合、ウルトラベースX2のCDが、/dev/acd0c となり、KXL-CB10AN は、/dev/acd1c になります。
なお、/dev/acd1c のデバイスファイルがない場合は、デバイスを作る必要があります。(多分、あるはず)
# cd /dev
# ./MAKEDEV acd1
KXL-CB10ANを使って、CD の読み込み、CD-R の読み書き、CD-RW の読み書きを行いましたが、特に問題はありませんでした。(CD-Rへは8倍速、CD-RWへは4倍速での書き込みがとりあえず出来ています)
ちなみに、音楽用CDですが、こちらは本体から音を鳴らすことができません。(CDプレイヤーの背面にある、LINE-OUT端子にイヤホンを繋げると、ちゃんと鳴りますが。)
 


DVD-ROM で panic!

最近は雑誌の付録でも、DVD-ROM が付いていることがたまにあるので、今度は雑誌の付録の DVD-ROM を使ってみることにしました。
早速、DVD-ROMを入れてみると、iso9660のCDと認識されて、cdrom と同じようにマウント可能です。
ls で、ディレクトリの中も見えます。

しかし、DVD-ROM のファイルにアクセスしたとたんに、リブートしてしまいました。
何種類かのDVD-ROMを試してみましたが、いずれもpage fault でpanicし、リブートがかかります。
(もっとも、必ずpanic するわけではなく、特定のファイルをアクセスしたときに、panic します。これはどのDVD-ROMでも同じです。)


Happy (?) Hacking

実はこの現象、FreeBSD 4.3R では発生しません。FreeBSD 4.4R でのみ、発生しています。
なんとかうごかないか?
インターネットで検索してみましたが、特に情報はありません。
4.3R では動いていたのだから、4.4R で変更されたところを調べればわかるのでは?
ふと考え、無謀にもカーネルソースを見比べました。
・・・なんじゃこら。わけわからん。
まあ、カーネルソースなんざ一度も読んだことがないので、当然でしょう。
そもそも、ソースのどこをみればいいのかがわからない。
    1. cd9660ファイルシステムが読めないので、cd9660 の処理がおかしい?
    2. ATAデバイスなので、ataデバイスの処理がおかしい?
    3. PCCARD接続なので、pccardの処理がおかしい?
    4. page fault と表示されているので、仮想メモリがおかしい?
まあ、普通のCDは読めているので、iso9960の処理は大丈夫だろう、仮想メモリがおかしいはずはない。
PC-CARD も他のは使えているし、となれば、ATA の処理か???

とりあえず、/sys/dev/ata/ 以下のファイルを、4.3R と 4.4R とで見比べてみました。
何個所か変更されているようですが、何をどう変更したのかさっぱりわかりません。

4.3R のソースを、4.4Rに突っ込んだら、動くのでは?
めちゃくちゃな考えが頭をよぎり、/sys/dev/ata/ 以下のファイルを4.3Rのソースに差し替え、カーネルの再構築を行いました。コンパイルは問題なく終わり、早速再起動。
動いた………
なんと、panic せずに DVD-ROM が読めるようになりました。

やった!  というか、いいのか???


とりあえず、パッチを作成

その後、4.3R と 4.4R の違いを見比べましたが結局内容が全く理解できないまま、とりあえず 4.4R の /sys/dev/ata/atapi-cd.c の一部を 4.3R 相当のコードに置き換えれば、panic は起こらないことが分かりました。
 
--- /sys/dev/ata/atapi-cd.c Wed Aug 29 02:56:14 2001
 +++ /sys/dev/ataNEW/atapi-cd.c Fri Jan 11 13:10:39 2002
 @@ -1246,8 +1246,21 @@
  }
  cdp->toc.hdr.len = ntohs(cdp->toc.hdr.len);

 - cdp->block_size = (cdp->toc.tab[0].control & 4) ? 2048 : 2352;
 - cdp->disk_size = ntohl(cdp->toc.tab[cdp->toc.hdr.ending_track].addr.lba);
 + {
 + struct {
 + u_int32_t volsize; /* volume size in blocks */
 + u_int32_t blksize; /* block size in bytes */
 + } info;
 + 
 + bzero(ccb, sizeof(ccb));
 + ccb[0] = ATAPI_READ_CAPACITY;
 + if (atapi_queue_cmd(cdp->atp, ccb, (caddr_t)&info, sizeof(info), 
 + ATPR_F_READ, 30, NULL, NULL))
 + bzero(&info, sizeof(info));
 +
 + cdp->disk_size = ntohl(info.volsize);
 + cdp->block_size = (cdp->toc.tab[0].control & 4) ? 2048 : 2352;
 + }

  #ifdef ACD_DEBUG
  if (cdp->disk_size && cdp->toc.hdr.ending_track) { 

しかし処理内容は不明のままで、これによりどんな副作用がでるのかは不明です。
一応、CD-ROMのリード、DVD-ROM(cd9660)のリード、CD-Rのリード/ライト、CD-RWのリードライト、ともに正常に動いてるっぽいのですが………。

(でもなんか、コンパクトフラッシュを挿入すると、抜く時にハングしてしまう。副作用か?)


その後

FreeBSDの公式ホームページでは、FreeBSDの障害報告がたくさん載せられています。
ここで検索してみたところ、この DVD で panic する現象は何件か報告されており、その対策もちゃんと載っていました。はじめからここをチェックしておけばよかったのね………。

でも、今回のことで、「ソースが公開されているので、トラブってもなんとかなる !!」ということが実体験できました。
やっぱり、オープンソースっていいですね〜。

なお、FreeBSD 4.5R では当然、なんの問題もなく使えています。
 
 


「ホームページ」に戻る


Showzoh Fukunaga
メールはこちら……… fukuchan@mh1.117.ne.jp