Diary?

2007-12-31
Mon

(17:08)

MTR からデータを落としてきたりするのにわざわざ mount コマンドを叩くのはかったるいので、自動で MTR の USB エクスポートモードをマウントするようにしてみた。

俺の使ってる MTR である BR-600 の USB モードは実際にはコンパクトフラッシュなんかのカードリーダのようなものなので、ちょっと /dev/ を調べたみたら /dev/sda という名前となっていた。もっともこれは動的に変わる名前で、例えばデジカメを接続したときにも同じデバイス名となってしまう。ここは udev でどうにかしよう。

udev ってのは要するに動的に接続されるデバイスの統合管理ツールみたいなもので、これを使うと

  • /dev/ 以下のデバイス名のカスタマイズ
  • デバイスの接続/切断時のフック

とかが出来るわけだ。詳しいことに付いてはudevルールの書き方が参考になるけど、どうも情報が古くてちょっと現状の udev では使えなさそうなので、なるべくなら原文を読んだ方が良いというか読め。

udev のルールは一見すると面倒くさいのだけど、

  • FOO=="bar" は FOO というキーの値と bar という値のパターンマッチ
  • HOGE="hage" は HOGE というキーの値に hage を代入
  • FUNGA+="nugaa" は FUNGA というキーの値に nugaa を追加 (多分。リストへの追加みたいな感じ?)

というわけで、こうして要素要素に分解すればさほど難しくはなさそうだ。

最大の問題はどうやって接続されたデバイスを識別するのかだけど、これには記事中にあるとおり udevinfo で調べられる。調べる先のデバイスは割と総当たりで調べないといけないのが厳しいんだけど、特に設定をいじっていないなら大体 /sys/block/sda とかの一般的なところに情報が出てくる。例えば次のような感じ。

    KERNEL=="11:0:0:0"
    SUBSYSTEM=="scsi"
    DRIVER=="sd"
    ATTR{modalias}=="scsi:t-0x00"
    ATTR{ioerr_cnt}=="0x2"
    ATTR{iodone_cnt}=="0x35"
    ATTR{iorequest_cnt}=="0x35"
    ATTR{iocounterbits}=="32"
    ATTR{timeout}=="60"
    ATTR{state}=="running"
    ATTR{rev}=="1.00"
    ATTR{model}=="BR-600          "
    ATTR{vendor}=="BOSS    "
    ATTR{scsi_level}=="0"
    ATTR{type}=="0"
    ATTR{queue_type}=="none"
    ATTR{queue_depth}=="1"
    ATTR{device_blocked}=="0"
    ATTR{max_sectors}=="240"

どうやら vendor に "BOSS" とでも入れておけば良さそうだ。 model は他の BOSS 製品と合わせて使うのなら必要だろうが、今回は使わない。他には SUBSYSTEM はとりあえず入れておこう。今回は /dev/br600 にマウントさせてみることにしたので、 /etc/udev/rules.d/10-local.rules に以下のように記述。そうそう、俺は Gentoo ユーザなので、他のディストリビューションの人は適当に読み替えてくれ。

SUBSYSTEMS=="scsi", ATTRS{vendor}=="BOSS",  NAME="br600"

これで udevcontrol reload_rules を叩けば設定が反映されて /dev/br600 で MTR がマウント可能になる。基本的には念のために NAME は手付ずで SYMLINK に名前を追加するようだけど、今後似たような作業をするときになって、そのときに sda[1-9] という形で複数の名前が存在してるのが嫌だと思ったので NAME を書き換えちまった。

一応これで名前のマッピングは出来たものの、これだと自動マウントが出来ないし切断した後に何も起こらないのが少し不安だ。なので、

  • 接続を検知して自動でマウント
  • 切断したら一応アンマウント

ということをやってみる。とりあえずサンプル。

SUBSYSTEMS=="scsi", ACTION=="add", ATTRS{vendor}=="BOSS", RUN+="/PATH/TO/MOUNTPROGRAM br600"
SUBSYSTEMS=="scsi", ACTION=="remove", ATTRS{vendor}=="BOSS", RUN+="/PATH/TO/UNMOUNTPROGRAM br600"

プログラムの詳細については省略。要するに ACTION で指定されたイベントを検知したら、 RUN にあるプログラムが走るという寸法だ。代入じゃなくて追加にしたのは、例えば SCSI 接続時にデフォルトで動作するプログラムとかがあった場合に代入だと問題になりそうだったから (いや、それともこれってパターンマッチの条件全部に対して個別に設定されるのかな)。

とりあえず今のところはこれで問題なく使えている。デジカメも同じように出来そうで、こっちは自動的にファイルのコピーまでやってもいいかな。

(23:00)

今年一年を振り返ろうかとも思ったけど、振り返っても仕方がないっつーか鬱になるだけなのでやめとこ。

Creative Commons
この怪文書はクリエイティブ・コモンズ・ライセンスの元でライセンスされています。引用した文章など Kuwata Chikara に著作権のないものについては、それらの著作権保持者に帰属します。