2004年1月12日月曜日

Debian GNU/Linux, コンパクトフラッシュカードを使う

Debian カーネル2.2.17 でコンパクトフラッシュカードを使う

いきなり最近の話となる。 最近とはいつなのかと言えば、2002年の3月である。

ダIクマというディスカウントストアにてコンパクトフラッシュカード(以下CFと省略するかも)を購入した。 買ったのは32MBのものだ。 もともとSharpのZaurus(MI-P2)を持っており、こいつでCFを読めるということで、便利かなと思い、買った。 ただし、説明書にはZaurus MI-P2で32MBのCFを読めるとは書いてはいなかった。 この時点でメーカー保証外である。 今回はメーカー保証外の事ばかり載せている。 もちろん筆者も保証はしないが。
さて、話をもどすことに。 実はそこらの電気屋よりこのディスカウントストアでの方が安くCFを売っていた。

だけどこれまた、CFなんか買ってはみたものの、まだZaurus本体のメモリがいっぱいになったワケでもないし、パソでCF読めるわけでもないし、全っ然CFを使わなかったのである。 これでは何のために買ったのかわからないではないか。 これではいけないと思い、とりあえずパソコンでCFを読めるようにすることに挑戦するのであった。

まず、筆者は一台のWin95機を所有している。
だが、どのCF R/W(リーダ/ライタ)もUSBでパソに繋ぐ仕様だ。 Win95しかもPC98シリーズのマシンに、USBを扱わせるのは残念ながら不可能だった。 CFを使える環境はWin・Macユーザには広く問戸を開いてはいるが、ネット上で探した限りはLinuxでCFを読めるようにしてくれるような道具を見つけることが出来なかった。 CFを使うためにWin98以降のどれかをインストールせねばならないかとあきらめかけていたそのとき、ビxクカメラにて不思議な商品に出会ったのである。 名前はREX-CF03F。ラトックシステムの製品である。 パッケージにはLinux Readyとある。
linux ok のロゴ画像 ←このロゴ
店員に聞けば、ネットからCF R/Wのドライバを落として、それをインストールしてもらう形になる、とのこと。 メーカーホームページにはいくつかのLinuxディストリビューションでの動作報告(?)があったが、この製品に関してはRedHatとLaser5だけだった。 おそらくRHLもLaser5も新しめのバージョンに限ってのようだった。 (RHLなら7.1と6.2と6.1、Laser5なら6.2とのこと、2002.3現在のメーカーホームページより)
もちろんLinuxでこの商品を使うのはメーカーの保証外。 今の時代、これは当り前のことなのかもしれない。 WinやMacの独壇場のCF R/Wの世界にLinuxで殴りこみにいっているようなものだと己に言い聞かせる。 その日はすぐに商品を買わずに帰宅した。 いま一度、購入を検討してみたかったのだ。

やっぱり買う事に決めた。 もし今使っているDebian GNU/LinuxでCF R/Wが動かなかったとしてもしようがない、WinかRHLかどっちかをパソにインストールしよう、と思った次第だ。
まず説明書であるテキスト文書によれば、カーネルのバージョンなどにより大きく2種のインストール方法があるようである。
カーネルにドライバが組み込まれているか、いないかで大きく分かれるようである。 RHLの7.1にはすでに組み込み済みであるらしい。 これがカーネルのバージョンによる違いらしく、RHL7.2のカーネルは2.4.Xで、その他のRHL6.1や6.2やLaiser5 6.2では2.2.Xであるとのこと。 筆者の環境はカーネル2.2.17であるからして、後者の方である。 その場合はBackportパッチというものを当てて、カーネルを再構築しなければならない。 Backportパッチを当てることによりカーネル2.4.X並のUSB対応環境を得ることができるという。 なにやらむつかしいが、カーネルをどう構築するかをmake xconfigやmake menuconfigなどで設定するときに、USB関連の設定項目がパッチ当てる前よりも増えている、ということのようだ。 とりあえず筆者の落としたのはusb-2.4.0-test2-pre2-for-2.2.16-v3.diff.gzというもの。 (ここからDLした) このパッチファイルを落としたら準備は万端である。 インストール方法をざっと見ていく。
カーネル2.4.X系の方のインストール法は割愛。 だってこっちはやってないし。

説明書を参考にしたインストール方法。カーネル2.2.X系の場合。もちろんDebianでのお話。

  1. 基本的にrootで作業を行うのでrootでログイン。別に一般ユーザでログインしてからsuしてもよいかとは思う。
  2. まず落としてきたパッチを当てる。
    とりあえずカーネルソースを展開したディレクトリ(筆者の環境ならば/usr/src/kernel-source-2.2.17/)へとBackportパッチのファイルを持って行く。 このディレクトリはカーネルソースのインストールをしたことがない場合には現れないので注意(?)。 そしてそのディレクトリへとcdコマンドで移動した後
    # gzip -dc usb-2.4.0-test2-pre2-for-2.2.16-v3.diff.gz | patch -p1
    を実行しパッチを当てる。 だがおそるべき事に説明書によればここでパッチを当てている最中に3つのファイルに対するパッチを当てるかどうかについて聞いてくるプロンプトが出るらしいのだが、我が家の環境ではそれはなく、ノンストップでパッチ当てが終わってしまう。 説明書によれば、ここで聞かれる3つのパッチに対してはスキップするように書かれているのだ。 たぶんうちの環境では3つのファイルに対してパッチを当ててしまったに違いない。
  3. # make distcleanをひきつづき実行
  4. /usr/src/kernel-source-2.2.17/arch/i386/config.inというファイルの中を見る。
    source drivers/usb/Config.in
    という行が#でコメントアウトされていたら#を消しておく。 ここはほぼ説明書通り。
  5. この製品に合わせ、モジュールを変更する。
    /usr/src/kernel-source-2.2.17/drivers/usb/usb-storage.cというファイルを編集する。 とりあえずこういう作業の際にはバックアップをとることをお忘れなく。
    説明書通り3箇所に書き込む。 これに関しては説明書見ろよ、と言いたいところだが説明書をコピペしておく。 「-->」で始まる行を付け加えるのである。 「-->」無しで始まる行はもうすでにファイル内にある。 もちろん「-->」はファイル内に書き込まない。
    ☆☆☆編集一箇所目☆☆☆
    
       if ((us->protocol == US_PR_CB) && 
         (result == USB_STOR_TRANSPORT_GOOD) &&
         ((srb->sense_buffer[2] & 0xf) == 0x0))
      srb->sense_buffer[0] = 0x0;
    
    --> /* Some device need the time for setup media. */
    --> if ((us->protocol == US_PR_BULK) &&
    -->      (srb->sense_buffer[0] == 0x70) &&
    -->      ((srb->sense_buffer[2] & 0xf) == 0x2) ) { // Not ready
    -->   /* 3A - Medium not present */
    -->   if ((srb->sense_buffer[12] == 0x3a) ||
    -->   /* 0401 - in progress of becomming ready */
    -->       (srb->sense_buffer[12] == 0x04 &&
    -->        srb->sense_buffer[13] == 0x01) ) {
    -->         srb->result = srb->result | (DID_ERROR << 16);
    -->    srb->allowed = 1000; // Max retry count 1000
    -->   }
    -->  }
        }
    
    
    
    ☆☆☆編集二箇所目☆☆☆
    
     { 0x07af, 0x0005, 0x0100,
       "Microtech USB-SCSI-HD50", US_SC_SCSI, US_PR_BULK, US_FL_ALT_LENGTH}, 
    -->  { 0x0584, 0x0001, 0x0100,
    -->    "RATOCSystems,Inc. USB Compact Flash Adapter", US_SC_SCSI,
    -->    US_PR_BULK, US_FL_SINGLE_LUN | US_FL_ALT_LENGTH | US_FL_START_STOP},
    -->  { 0x0584, 0x0001, 0x0101,
    -->    "RATOCSystems,Inc. USB Compact Flash Adapter", US_SC_SCSI,
    -->    US_PR_BULK, US_FL_SINGLE_LUN | US_FL_ALT_LENGTH | US_FL_START_STOP},
    -->  { 0x0584, 0x0001, 0x0102,
    -->    "RATOCSystems,Inc. USB Compact Flash Adapter", US_SC_SCSI,
    -->    US_PR_BULK, US_FL_SINGLE_LUN | US_FL_ALT_LENGTH | US_FL_START_STOP},
     { 0x0000, 0x0000, 0x0,
       "", 0, 0, 0}
    
    
    
    ☆☆☆編集三箇所目☆☆☆
    
      /* now register  - our detect function will be called */
      ss->htmplt.module = THIS_MODULE;
        -->  /* some device need bulk-reset process */
        -->  if (ss->protocol == US_PR_BULK)
        -->   ss->transport_reset(ss); /* BULK RESET */
      scsi_register_module(MODULE_SCSI_HA, &(ss->htmplt));
      
  6. /usr/src/kernel-source-2.2.17/へcdしてから# make xconfigとか# make menuconfigなどでカーネルをどう再構築するかの設定をする。 前者はGUIで後者はCUIである。 主にUSB関連の設定をここでは行う。 とりあえずここでは説明書通りの設定を行うことにした。 これに関しても説明書見ろよ、と言いたいところだが説明書をコピーしておく。 うーむ、大サービスだな、これは。(ぉぃ
    # make xconfig# make menuconfigの画面で以下のところをチェックする。 [*]はカーネルに組み込む、<M>はモデュールとして扱うことをいう。
    • Code maturity level options → [*] Prompt for development and/or incomplete code/drivers
    • USB support → <M> Support for USB
    • USB support → [*] USB verbose debug messages
    • USB support → --- Miscellaneous USB options → [*] Preliminary USB device filesystem
    • USB support → --- USB Controllers → <M> UHCI (Intel PIIX4, VIA, ...) support
    • USB support → --- USB Controllers → <M> UHCI Alternate Driver (JE) support
    • USB support → --- USB Controllers → <M> OHCI (Compaq, iMacs, OPTi, SiS, ALi, ...) support
    • USB support → --- USB Devices → <M> USB Mass Storage support (EXPERIMENTAL)
    設定が終わったら保存してxconfigやmenuconfigを終える。
  7. カーネルの再構築。(適当)
    場所は変わらず/usr/src/kernel-source-2.2.17/のままで
    # make-kpkg modules
    # make-kpkg kernel_image
    # cd ../
    # dpkg -i kernel-image-2.2.17_Custom.1.00_i386.deb←/usr/src/に勝手に作られているdebパッケージを指定
  8. 構築も終わり、BOOT DISKも作り終わり、LILO設定も終わったらリブート。
  9. つぎはマウントの仕方。起動後、rootになってから
    # depmod -av
    # mkdir /cf0←マウントポイント、一度作ったら今後もう二度と作る必要はない
    # modprobe usbcore←説明書通り
    # modprobe usb-uhci←説明書通り
    # modprobe usb-ohci←説明書通り
    # modprobe usb-storage←説明書通り
  10. マウントできるかな。
    # mount -t msdos /dev/sda1 /cf0
    これで/cf0のなかにCF内のデータがマウントされていたら成功、なんだけど・・・。 もちろんこのとき、USBでCF R/Wとパソは物理的につながっていないとダメ。
    ちなみにアンマウントはumount /cf0となる。

基本的には以上のようにインストールした。 結果的には我が家の環境においては成功であった。

おまけ情報1。
今回のCF R/Wインストールに際して、実はmsdosファイルシステムとSCSI generic support と SCSI logging facility の3つをカーネルに組み込んだ。 この製品の説明書のテキストファイルにあるのだが、SCSIドライブとしてUSBのCF R/Wを認識させているらしい。 何か関係あるかなと思い、SCSI関連の設定もいじってみたりした。 この設定と何も関係がないともいえないので一応報告しておく。

おまけ情報2。
筆者は面倒なことはあまり好きではない。 まず、CFのマウントが一般ユーザに許されていない。 これでは少し面倒なので一般ユーザにもマウントを許可すべきだ。 それと、マウントするのにいちいち$ mount -t msdos /dev/sda1 /cf0とか長々と打ちたくない。
よって/etc/fstabというファイルに以下の1行を書き込んでみた。

/dev/sda1       /cf0            msdos   defaults,user,noauto            0      0

とはいえ、やっぱり一部のユーザやグループだけにマウントを許すようにしないと危ないかなあ。
ちなみにこのように書くと、
$ mount /cf0
とコマンドを打つだけでマウントができる。 幸せだね。

おまけ情報3。
リブートするたびに
rootになる → # depmod -av# modprobe usbcore# modprobe usb-uhci# modprobe usb-ohci# modprobe usb-storage
といったコマンドを打たないとCFのマウントできないのはちょっとだるい。
なので、usbcoreとusb-uhciとusb-ohciとusb-storageを/etc/modulesというファイルに書き込んでみた。

しかし、残念ながらこれだとusb-storageがうまくいかない。
よって現在はブート後はusb-storageだけrootでinsmodしている有り様である。 まあ4つのモデュールのところを1つに減らしたんならまあいいか??

おまけ情報4。
CFをパソで扱えるようになり、Zaurusライフも充実し始めた。 今までは完全にスタンドアロン状態でZaurusを使っていた。 契約していないので、Zaurusから直接ネットにこそ繋げないものの、Zaurus用のmoreソフトというアプリケーションプログラムをパソコンに落とし、それをさらにCFに移動させ、それをさらにZaurusへ移動させるという、なかなか面倒なことをすることでZaurusの機能拡張をはかっている。

筆者の勝手なおすすめmoreソフト紹介(筆者のZaurusはMI-P2)

ペンヤード:別のPDAではスタイラスっていうけど、Zaurusではタッチペンとかいいませんかね?とりあえずタッチペンをキューに見立てたビリヤードゲーム。これはタッチペンの特性を見事に利用したすばらしいゲームだと思います、はい。(ここでDL、うーむ、カラー画面がうらやましい)

かえで:テキストファイルの閲覧、編集が可能。テキストファイルの編集って、意外とZaurus(MI-P2)単体ではできない作業なのである。ここでDL

関数電卓:数学の授業などで使ったりする機会が最近多い関数電卓。ヨドバシとかで買わなきゃ、と思っていた矢先に見つけたソフト。買う手間省けたぞ。でもテストでZaurusは使えないっすね。(ここの関数電卓サンプルソフトをそのまま使用)