いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.083 / 読者数:953名

こんばんは、うすだです。

いやいやいやいや、とうとう Vine Linux 4.0 が出ましたね!

Vine Linux
http://vinelinux.org/

カーネルが 2.6 になったり、GNOME 2.14 になったり、GRUB になったりと、 いろいろ様相が変わっておられるようです。

なにはともあれ、インストール CD のイメージをダウンロードして、 早速アップグレードしてみました。(わたくし、Vine ユーザですので。)

アップグレード自体は、特に問題もなく、すんなりといけました。
周辺機器なども、今まで通り、いやどちらかというと今まで以上に、 動作してくれています。(とある USBメモリが、使えるようになりました。)

そんなわけで、たいしてはまることもなく、移行できた…と思ってましたが、 ひとつ、大きな問題にぶち当たっています。

それは、マウスです。
今まで、移動速度を遅く設定して使っていましたが、アップグレードしてからは、 一番遅い設定にしても、速過ぎるのです。
毎日絵を描いているわたくしとしましては、 このあたりの使用感が作品に大きく反映されてしまいますので、結構困っております。

ふつうのひとは、こんなところに不満を持ったりしないんだろうなと思いつつ、 なにか策がないか、試行錯誤しております。

ま、個人的な話は置いときまして、今週も、はりきってまいりましょう!

今週のお題 - USBポートをわかりやすく監視する

先週は、USB機器の挿抜を検出して、メールする方法をご紹介しました。

Vol.082 - USBポートを監視する
http://www.usupi.org/sysad/082.html

しかしながら、先週のメールによる通知では、環境変数が無造作に並んでいるだけで、 いまいちユーザフレンドリーではありませんでした。
ですので、今週は、もう少しわかりやすいものにしたいと思います。


おっとその前に、先週の補足から、始めさせていただきます。
カーネルから hotplug に渡される環境変数の説明をさせてください。

USB機器には、ディスクリプタというものがあります。
ディスクリプタには、その機器のいろいろな情報が含まれています。
USBホスト・ドライバは、USB機器が挿入されたとき、 このディスクリプタを読み出して、必要なドライバを呼び出すようになっています。

ディスクリプタにはいくつかの種類がありますが、もっとも基本的なものが、 デバイス・ディスクリプタです。
これには、USBのバージョンや、デバイスの種類を表すクラス、 ベンダIDなどが含まれます。
カーネルが hotplug に渡す環境変数のうち、$TYPE と $PRODUCT には、 デバイス・ディスクリプタの以下の値が格納されます。

  TYPE = クラス/サブクラス/プロトコル
  PRODUCT = ベンダID/プロダクトID/デバイスリリース番号

クラスとは、USB で定義されているクラス仕様を表すコードのことです。
たとえば、マウスやキーボードは 3、プリンタは 7 となっています。
他にもいくつかあり、以下に、一覧が公開されています。

USB.org - Defined 1.0 Class Codes
http://www.usb.org/developers/defined_class

ただし、デバイス・ディスクリプタに記述されていない場合があります。
その場合、インターフェース・ディスクリプタ内の同項目に、 記載されていることがあります。(というか、その方が多いように思います。)
hotplug からは、$INTERFACE という環境変数で、参照できます。

  INTERFACE = クラス/サブクラス/プロトコル

クラス仕様に基づかない機器の場合は、 ベンダIDやプロダクトIDなどから特定するしかないと思います。 (カーネルさんも、そうしています。)

 

ちなみに、hotplug 以外のひとでも、/proc/bus/usb/devices を参照することで、 ディスクリプタ(の概要)を確認することができます。
ルートHUB を含むすべてのUSB機器の情報を含みますので、少々見づらいですが、 T: で始まる行から、次の T: の手前までが、1つの機器の情報に該当します。 (あ、2.6 だと改行が入るので、やや見やすいです。)

  T: バスやポート番号、速度などの情報
  B: バンド幅に関する情報
  D: デバイス・ディスクリプタのうち、クラスなどの情報
  P: デバイス・ディスクリプタのうち、ベンダIDなどの情報
  S: ストリング・ディスクリプタの情報 (デバイスに関連)
  C: コンフィグレーション・ディスクリプタの情報
  I: インターフェース・ディスクリプタの情報
  E: エンドポイント・ディスクリプタの情報

百聞は一見にしかずですので、まずは cat などしてみてください。
カーネル・ソースの drivers/usb/core/devices.c を見ると、 細かく理解できるかもです。(2.4 系だと drivers/usb/devices.c です。)

  % 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 経由でもディスクリプタを参照できます。
/sys/class/usb_device/usdev?.?/device/ の下に、 各ディスクリプタの項目に相当するファイルがあります。 (? のところは、数値です。)
b, bcd や id で始まるファイルは、ディスクリプタの値そのものを指し、 そうでないファイルは、わかりやすく変換したものだと思われます。
大雑把ですが、USBメモリの場合の例を、以下に示します。

  % 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 $*

…長くてすみません。
$TYPE か $INTERFACE からクラスの値を取り出し、case 文で、 それぞれの名前を出力するようにしています。
他の部分は、先週とほぼ同等の内容となっております。
($ORG_HOTPLUG には、もともと登録されている 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 が終了するまで hotplug を待たせるのはよろしくなさそうですので、 xmessage はバックグラウンドで実行させてみました。

xmessage は、-file オプションで指定されたファイルの内容を出力するのですが、 ファイル名が - だと、標準入力から読み込みます。

出力内容を $TMPFILE に記録しているのに、標準入力から読み込んでいるのは、 このスクリプトが終了する際に、$TMPFILE を消しているためです。
xmessage が起動して $TMPFILE を読み込むまでに、スクリプトが終了してしまうと、 $TMPFILE を読み込めないんですね。

 

さらに、xmessage を別のマシンのディスプレイに出力するには、 -display オプションを使用します。
別のマシンのホスト名が yourhost の場合、以下のように実行します。

  /usr/X11R6/bin/xmessage -display yourhost:0 -file - < $TMPFILE &

ただし、yourhost さんが許可している場合に限られます。
サーバのホスト名が myhost で、myhost からのウィンドウなどの出力を許可するには、 xhost コマンドを用います。

  yourhost# xhost myhost
  myhost being added to access control list

許可したくなくなったら、ホスト名に - をつけて実行しましょう。

  yourhost# xhost -myhost
  myhost being removed from access control list

ちなみに、引数なしで xhost を実行すると、今の状態がわかります。

 

それ以前に、yourhost さんの X サーバが、 受け付けない設定で起動している可能性もあります。
たとえば Vine Linux の場合、 /etc/X11/gdm/gdm.conf の DisallowTCP を false にしておく必要があります。
(Vine Linux 4.0 では、/etc/X11/gdm/custom.conf です。)

  DisallowTCP=false

でないと、xhost で許可してあっても、ウィンドウが出力されません。
(DisallowTCP=true では、 /usr/X11R6/bin/X が -nolisten tcp 付で起動されてしまいます。 詳しくは man Xserver などをご覧ください。)

このあたり、本来ならば、X Window System のことを、まずご紹介すべきなのですが、 諸般の事情により、後日にあらためさせていただきます。

今週の宿題

今週の宿題は、

  USB機器の挿抜を、さらにわかりやすく通知してください。

です。

たとえば、Manufacturer や Product, SerialNumber は、 文字として参照できますので、それを出したいと思ったのですが、いかがでしょうか。

…なんて書いちゃいましたが、実現方法はまだ考えていません。
来週までに、悪戦苦闘したいと思います。

あとがき

そのマウスなんですが、sysfs で少し設定を変えることができました。
/sys/class/input/mouse0/device/ 以下に、speed とか sensitivity などがあり、 これらをいじると、マウスの挙動が変わりました。

わたしは、マウスの動作を遅くしたかったので、speed の値をぐっと下げました。 もとが 97 でしたので、以下のように値を下げました。

  # cat /sys/class/input/mouse0/device/speed
  97
  # echo -n 16 > /sys/class/input/mouse0/device/sensitivity

まだカクカクとしたギコチない動きをしますが、少し前の状態に近づいてきました。 もっと状態を戻すべく、いろいろ格闘しています。

しかし、このあたりのドキュメントって、見当たらないですね。
そんなときは、ソースを読め! ということで、 マウスドライバのソースを斜め読みつつあります。
(ThinkPad なので、drivers/input/mouse/trackpoint.c あたりです。)

 

いやいやいやいや、しかし、Vine Linux はよいです。よいですよ。

なにがどういいのかと申しますと、やはり、 CD 1枚でインストールできてしまう手軽さではないかと思います。
そして、コンパクトな割に、必要なものが揃っている、 痒いところに手が届く的な使用感が、よろしいのではないかと思います。

それに、今どきなパッケージも、VinePlus などにいろいろ揃ってます。
噂の Compiz もありましたよ。わたしの PC では動作しませんが…。

というわけで、もし機会がありましたら、 VMware などのエミュレータ上でもいいと思いますので、 インストールして使ってみましょう。

 

今週も、ここまで読んでいただき、ありがとうございました。
それでは、また来週に、お会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」−毎日描いてます。喫茶店などでの展示を妄想中です。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://www.fumido.co.jp/kuriniki/ (栗日記ぎゃらりー)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本