[バックナンバーのトップへ] [Linux システム管理のトップへ] いますぐ実践! Linux システム管理 / Vol.083 / 読者数:953名こんばんは、うすだです。 いやいやいやいや、とうとう Vine Linux 4.0 が出ましたね!
Vine Linux カーネルが 2.6 になったり、GNOME 2.14 になったり、GRUB になったりと、 いろいろ様相が変わっておられるようです。 なにはともあれ、インストール CD のイメージをダウンロードして、 早速アップグレードしてみました。(わたくし、Vine ユーザですので。)
アップグレード自体は、特に問題もなく、すんなりといけました。 そんなわけで、たいしてはまることもなく、移行できた…と思ってましたが、 ひとつ、大きな問題にぶち当たっています。
それは、マウスです。 ふつうのひとは、こんなところに不満を持ったりしないんだろうなと思いつつ、 なにか策がないか、試行錯誤しております。 ま、個人的な話は置いときまして、今週も、はりきってまいりましょう! 今週のお題 - USBポートをわかりやすく監視する先週は、USB機器の挿抜を検出して、メールする方法をご紹介しました。
Vol.082 - USBポートを監視する
しかしながら、先週のメールによる通知では、環境変数が無造作に並んでいるだけで、
いまいちユーザフレンドリーではありませんでした。
おっとその前に、先週の補足から、始めさせていただきます。
USB機器には、ディスクリプタというものがあります。
ディスクリプタにはいくつかの種類がありますが、もっとも基本的なものが、
デバイス・ディスクリプタです。 TYPE = クラス/サブクラス/プロトコル PRODUCT = ベンダID/プロダクトID/デバイスリリース番号
クラスとは、USB で定義されているクラス仕様を表すコードのことです。
USB.org - Defined 1.0 Class Codes
ただし、デバイス・ディスクリプタに記述されていない場合があります。 INTERFACE = クラス/サブクラス/プロトコル クラス仕様に基づかない機器の場合は、 ベンダIDやプロダクトIDなどから特定するしかないと思います。 (カーネルさんも、そうしています。)
ちなみに、hotplug 以外のひとでも、/proc/bus/usb/devices を参照することで、
ディスクリプタ(の概要)を確認することができます。 T: バスやポート番号、速度などの情報 B: バンド幅に関する情報 D: デバイス・ディスクリプタのうち、クラスなどの情報 P: デバイス・ディスクリプタのうち、ベンダIDなどの情報 S: ストリング・ディスクリプタの情報 (デバイスに関連) C: コンフィグレーション・ディスクリプタの情報 I: インターフェース・ディスクリプタの情報 E: エンドポイント・ディスクリプタの情報
百聞は一見にしかずですので、まずは cat などしてみてください。 % cat /proc/bus/usb/devices T: Bus=03 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2 B: Alloc= 0/900 us ( 0%), #Int= 0, #Iso= 0 D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1 P: Vendor=0000 ProdID=0000 Rev= 2.06 S: Manufacturer=Linux 2.6.16-0vl60 uhci_hcd S: Product=UHCI Host Controller S: SerialNumber=0000:00:1d.2 ...
さらにちなみに、2.6 カーネルですと、
sysfs 経由でもディスクリプタを参照できます。 % cat /sys/class/usb_device/usbdev2.2/device/idVendor 0781 % cat /sys/class/usb_device/usbdev2.2/device/manufacturer SanDisk Corporation …すみません、前置きが長くなりました。本題に入ります。
今週は、クラス仕様に基づいた機器の場合に、
その名前を出力してみたいと思います。 #!/bin/sh ORG_HOTPLUG="/sbin/hotplug.murasaki" TMPFILE=`mktemp /tmp/prv-hotplug-XXXXXX` trap "rm -f $TMPFILE" 0 1 2 3 9 11 15 if [ "z$1" = "zusb" -a -n "$TYPE" ]; then if [ "z$TYPE" = "z0/0/0" ]; then CLASS=$INTERFACE else CLASS=$TYPE fi CLS=`echo $CLASS | sed "s/\([^\/]*\)\/[^\/]*\/[^\/]*/\1/"` echo -n "Class: " >> $TMPFILE case $CLS in 1) echo "Audio ($CLASS)" >> $TMPFILE;; 2) echo "Communication/CDC ($CLASS)" >> $TMPFILE;; 3) echo "HID ($CLASS)" >> $TMPFILE;; 5) echo "Physical ($CLASS)" >> $TMPFILE;; 6) echo "Still Imaging ($CLASS)" >> $TMPFILE;; 7) echo "Printer ($CLASS)" >> $TMPFILE;; 8) echo "Mass Storage ($CLASS)" >> $TMPFILE;; 9) echo "HUB ($CLASS)" >> $TMPFILE;; 10) echo "CDC ($CLASS)" >> $TMPFILE;; 11) echo "Smart Card ($CLASS)" >> $TMPFILE;; 13) echo "Content Security ($CLASS)" >> $TMPFILE;; 14) echo "Video ($CLASS)" >> $TMPFILE;; 220) echo "Diagnostic Device ($CLASS)" >> $TMPFILE;; 224) echo "Wireless Controller ($CLASS)" >> $TMPFILE;; 254) echo "Application Specific ($CLASS)" >> $TMPFILE;; 255) echo "Vendor Specific ($CLASS)" >> $TMPFILE;; *) echo $CLASS >> $TMPFILE;; esac echo "Product: $PRODUCT" >> $TMPFILE /usr/bin/Mail -s "usb: $ACTION" root < $TMPFILE fi [ -x "$ORG_HOTPLUG" ] && $ORG_HOTPLUG $*
…長くてすみません。 これを、先週同様、/usr/local/sbin/hotplug.test という名前で保存し、 実行可能な状態にして、以下のように登録します。 # sysctl -w kernel.hotplug=/usr/local/sbin/hotplug.test kernel.hotplug = /usr/local/sbin/hotplug.test すると、問題なければ、たとえば、USBメモリを挿入すると、 以下のようなメールが root 宛に届きます。 Subject: usb add Class: Mass Storage (8/6/80) Product: 781/5150/10 クラス毎に、さらにサブクラスやプロトコルも見るようにすれば、 もっとわかりやすくなるかもしれませんが、骨折り損になると思われますので、 このくらいで勘弁していただければと存じます。 以上、USB機器の挿抜を、わかりやすくする方法をご紹介しました。 USB の説明を始めると、とてつもなく長くなってしまいますし、 わたしがご紹介するよりも、もっといい本がたくさんあると思いますので、 そちらを参照してくださいませ。 また、どのような出力がわかりやすいか、というのは個人の好みでもあると思います。 いろいろいじくって、いいものに仕立てあげてください。 宿題の答え先週の宿題は、 USB機器の挿抜を、ビジュアルに通知するようにしてください。 でした。
xmessage は、引数に指定された文字列やファイルの内容を、
ウィンドウで出力してくれるコマンドです。 #!/bin/sh ORG_HOTPLUG="/sbin/hotplug.murasaki" TMPFILE=`mktemp /tmp/prv-hotplug-XXXXXX` trap "rm -f $TMPFILE" 0 1 2 3 9 11 15 if [ "z$1" = "zusb" -a -n "$TYPE" ]; then echo "USB : $ACTION" > $TMPFILE echo "------" >> $TMPFILE /usr/bin/printenv >> $TMPFILE /usr/X11R6/bin/xmessage -file - < $TMPFILE & fi [ -x "$ORG_HOTPLUG" ] && $ORG_HOTPLUG $*
出力したい内容を、一旦 $TMPFILE に記録しておいて、
これを xmessage にウィンドウで出力させています。 xmessage は、-file オプションで指定されたファイルの内容を出力するのですが、 ファイル名が - だと、標準入力から読み込みます。
出力内容を $TMPFILE に記録しているのに、標準入力から読み込んでいるのは、
このスクリプトが終了する際に、$TMPFILE を消しているためです。
さらに、xmessage を別のマシンのディスプレイに出力するには、
-display オプションを使用します。 /usr/X11R6/bin/xmessage -display yourhost:0 -file - < $TMPFILE &
ただし、yourhost さんが許可している場合に限られます。 yourhost# xhost myhost myhost being added to access control list 許可したくなくなったら、ホスト名に - をつけて実行しましょう。 yourhost# xhost -myhost myhost being removed from access control list ちなみに、引数なしで xhost を実行すると、今の状態がわかります。
それ以前に、yourhost さんの X サーバが、
受け付けない設定で起動している可能性もあります。 DisallowTCP=false
でないと、xhost で許可してあっても、ウィンドウが出力されません。 このあたり、本来ならば、X Window System のことを、まずご紹介すべきなのですが、 諸般の事情により、後日にあらためさせていただきます。 今週の宿題今週の宿題は、 USB機器の挿抜を、さらにわかりやすく通知してください。 です。 たとえば、Manufacturer や Product, SerialNumber は、 文字として参照できますので、それを出したいと思ったのですが、いかがでしょうか。
…なんて書いちゃいましたが、実現方法はまだ考えていません。 あとがき
そのマウスなんですが、sysfs で少し設定を変えることができました。 わたしは、マウスの動作を遅くしたかったので、speed の値をぐっと下げました。 もとが 97 でしたので、以下のように値を下げました。 # cat /sys/class/input/mouse0/device/speed 97 # echo -n 16 > /sys/class/input/mouse0/device/sensitivity まだカクカクとしたギコチない動きをしますが、少し前の状態に近づいてきました。 もっと状態を戻すべく、いろいろ格闘しています。
しかし、このあたりのドキュメントって、見当たらないですね。
いやいやいやいや、しかし、Vine Linux はよいです。よいですよ。
なにがどういいのかと申しますと、やはり、
CD 1枚でインストールできてしまう手軽さではないかと思います。
それに、今どきなパッケージも、VinePlus などにいろいろ揃ってます。 というわけで、もし機会がありましたら、 VMware などのエミュレータ上でもいいと思いますので、 インストールして使ってみましょう。
今週も、ここまで読んでいただき、ありがとうございました。
「いますぐ実践! Linux システム管理」の解除は、以下からできます。
バックナンバーは、こちらにほぼ全部そろっています。
「栗日記」−毎日描いてます。喫茶店などでの展示を妄想中です。 |
▼ トップ ▼ プロフィール ▼ リンク
▼ 作ってみました
▼ せんでん
▼ 最近読んだ本
▼ 気に入ってる本 |