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

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


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

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

わたしは、毎年、このくらいの時期から、静電気に悩まされます。

ドアとか金属なものはありがちだと思いますが、会社にいますと、金属に限らず、 硬いものに触ると、必ずと言っていいほどビリッときます。
何かに呪われているんじゃないか、とあらぬ疑いでもかけたくなるくらいに、 頻発します。いやもうほんとに。

静電気防止のわっかみたいなものを腕につけていても、 まったくと言っていいほど効果がありません。 魔よけがほんものの悪魔には効かないようなものでしょうか。

ですので、ものを触ろうとするたびに、スリッパを脱いで足を接地して、 万が一ビリッときても仕方ないという覚悟ができてから、触れます。

そういえば、ネバーエンディングストーリーで、ふりむいてはいけない、 ふりむくと固められてしまう、みたいな門がありましたよね。
思いきって触れることと、ふりむかずに門をくぐるのは、 どこか似ているような気がします。

…頭の中がやや混乱していますが、今年も、どきどきしながら、 冬の会社を満喫したいと思います。

静電気のことはとりあえず忘れて、今週も、はりきってまいります!

今週のお題 - USBポートを監視する

サーバはみんなのものですので、むちゃな使い方をすると、 みんなの迷惑になります。
また、いろんなひとのいろんなデータが置いてありますので、データなどの扱いには、 十分注意する必要があります。

しかしながら、リソースがあれば使いたくなる、データがあると中を見てみたくなる、 というのが、人間というものではないでしょうか。
つまり、そこに USB ポートがあると、機器を挿してなにかさせてみたくなるのが、 人情というものではないか、と思うわけです。

…ああ、持っていきかたが強引ですが、なにはともあれ、システム管理者たるもの、 得られる情報は限りなく収集し、迅速に対処すべきです。
ですので、USB が乱用悪用されないよう、USBポートを常に監視することは、 みんなのために当然行うべきことだ、と胸をはって言えます。

大風呂敷を広げきったところで、今週は、USBポートを監視する方法を、 ご紹介したいと思います。


最初に種明かしをしてしまいますと、実は、 USB機器の抜き差しを知らせてくれる仕組みが、Linux カーネルにはあります。

Linux カーネルは、USB機器を新たに見つけたり、USB機器が抜きとられたとき、 /proc/sys/kernel/hotplug に登録されたコマンドを実行してくれるようになっています。
たとえば、VineLinux では、murasaki というひとが登録されています。

  % cat /proc/sys/kernel/hotplug
  /sbin/hotplug.murasaki

ちなみに、sysctl コマンドでも確認できます。

  % sysctl kernel.hotplug
  kernel.hotplug = /sbin/hotplug.murasaki

さらにちなみに、手元の Fedora Core 5 では、以下のように、 何も登録されていませんでした。

  % sysctl kernel.hotplug
  kernel.hotplug = 

ということで、USB機器の抜き差しを知るには、 登録されている hotplug になにかを仕込めば、実現できそうに思われます。

とはいえ、もともとの hotplug に細工をするのは気が引けます。
ですので、hotplug の代わりになるスクリプトを用意する、という方法を用います。 以下のような、簡単なシェルスクリプトを作ってみました。

  #!/bin/sh
  ORG_HOTPLUG="/sbin/hotplug.murasaki"

  if [ "z$1" = "zusb" ]; then
      /usr/bin/printenv | /usr/bin/Mail -s "usb: $ACTION" root
  fi
  [ -x "$ORG_HOTPLUG" ] && $ORG_HOTPLUG $*

$ORG_HOTPLUG には、 /proc/sys/kernel/hotplug に登録されているパスを指定してください。 (つまり、上記の場合は、VineLinux 用です。)
機能的にはもとの hotplug(==$ORG_HOTPLUG) と同じである必要がありますので、 最後の行で、それを実行しています。
ただ、それだけではもとの hotplug と機能的に変わりませんので、 引数が "usb" だった場合、環境変数一覧を root にメールする、 という仕込みを入れてみました。

これを、例えば /usr/local/sbin/hotplug.test というファイル名で保存し、 実行可能な状態にしておきます。
そして、実際に hotplug として登録してみましょう。

  # sysctl -w kernel.hotplug=/usr/local/sbin/hotplug.test
  kernel.hotplug = /usr/local/sbin/hotplug.test

上記は sysctl コマンドで行っていますが、 下記のように proc_fs 経由でも登録できます。

  # echo /usr/local/sbin/hotplug.test > /proc/sys/kernel/hotplug

登録したら、実際に USB機器を挿してみてください。
問題なければ、root 宛に、以下のようなメールが届くはずです。

  Subject: usb: add

  PATH=/sbin:/bin:/usr/sbin:/usr/bin
  ACTION=add
  INTERFACE=8/6/80
  PRODUCT=781/5150/10
  TYPE=0/0/0
  ...後略...

Linux カーネルが用意してくれた環境変数は、主に以下があります。

環境変数名概 要
ACTION挿したときは add, 抜いたときは remove
TYPEデバイスクラス/サブクラス/プロトコル
INTERFACEインターフェースクラス/サブクラス/プロトコル
PRODUCTベンダID/プロダクトID/デバイスリリース番号

詳細は割愛しますが、挿抜は $ACTION で知ることができ、 USB機器の種類は $TYPE や $INTERFACE, $PRODUCT で判別できます。

 

ただ、Fedora Core 5 では、hotplug がなぜか2回呼ばれました。
そのうち1回は、TYPE や INTERFACE などの環境変数が設定されていませんでした。 ですので、いちいち2通もメールが来るのはいやだという貴兄は、 以下のように、$TYPE などの存在をチェックすれば、1通に減らせます。

  #!/bin/sh
  ORG_HOTPLUG="/sbin/hotplug.murasaki"

  if [ "z$1" = "zusb" -a -n "$TYPE" ]; then
      /usr/bin/printenv | /usr/bin/Mail -s "usb: $ACTION" root
  fi
  [ -x "$ORG_HOTPLUG" ] && $ORG_HOTPLUG $*

以上、USBポートを監視する方法について、ご紹介しました。

まとめますと、Linux カーネルは、USB機器の挿抜に気づいたら、 usb という文字列を引数に hotplug を実行します。
そして、その際に設定された、 $ACTION, $TYPE, $INTERFACE や $PRODUCT などの環境変数をもとに、 USB機器の種類を知ることができます。

ということでしたが、やや中途半端感が漂っているように思いますので、 来週は、そのどんよりとした空気を払拭したいと思います。

あ、それから、上記を試したあとは、hotplug をもとに戻すことを、 忘れないようにしてくださいませ。(そのままでいいかたは、そのままで…。)

宿題の答え

先週の宿題は、

  DHCP サーバは、リレーエージェント経由でアドレスを割り当てるとき、
  クライアントのいるサブネットの情報を、どこから得るのでしょうか?

でした。

まずは、tcpdump でパケットをキャプチャしてみましょう。

以下のような環境を用意し、DHCPクライアントから、 DHCP でアドレスを要求させたときのパケットを、tcpdump で入手しました。
DHCPサーバが 192.168.1.0/24 というサブネットに、 リレーエージェントが 192.168.2.0/24 からのリクエストを中継する役目を負っています。

          192.168.1.1     192.168.1.254            192.168.2.254
  [DHCPサーバ] --------+---------- [リレーエージェント] --------+-
                       |                                        |
                  192.168.1.0/24                    192.168.2.0/24

リレーエージェントが中継した DHCPDISCOVER なパケットは、以下の通りです。 (MACアドレスとチェックサムなどは、xx で隠蔽しました。)

  # tcpdump -n -x port bootps
  ...中略...
  22:15:08.325219 IP 192.168.1.254.bootps > 192.168.1.1.bootps: \
  BOOTP/DHCP, Request from xx:xx:xx:xx:xx:xx, length: 548
        0x0000:  4500 0240 0000 4000 4011 xxxx c0a8 01fe
        0x0010:  c0a8 0101 0043 0043 xxxx xxxx 0101 0601
        0x0020:  2344 b409 0000 0000 0000 0000 0000 0000
        0x0030:  0000 0000 c0a8 02fe xxxx xxxx xxxx 0000
        0x0040:  ...以降 0 が続く...

tcpdump を -x オプションつきで実行していますので、0x0000: 以降に、 IPパケットの中身が16進数でダンプされています。

0x001c 以降が DHCP の部分で、さらにその後の 0x0034 にある c0a8 02fe の箇所が、 giaddr というフィールドです。ここには、 リレーエージェントのIPアドレスを格納する、という決まりがあります。
c0a8 02fe を10進数で表すと、192.168.2.254 になります。

はいそうです、これは、リレーエージェントの、 DHCPクライアントのいる側のサブネットのアドレスですね。
これを頼りに、DHCPサーバはアドレスを割り振っているようです。

 

念のため、dhcpd のソースコードを眺めてみました。
ちなみに、dhcp のバージョンは、3.0.5rc1 です。

server/dhcp.c の dhcp() という関数で、受信したパケットの処理を行いますが、 その前にまず、locate_network() を用いて、 DHCPクライアントが属するサブネットを求めています。
locate_network() では、giaddr が 0 でなければ、 giaddr のサブネットを用いるようになっていました。
(ただし、subnet-selection という option が指定されていれば、 そちらが優先されます。(詳しくは RFC3011 を参照くださいまし。))

 

というわけで、やはり、giaddr をもとにしているようですね。
…わかりにくくてすみません。でも、わたくし的にはスッキリしました。

今週の宿題

今週の宿題は、

  USB機器の挿抜を、ビジュアルに通知するようにしてください。

です。

xmessage という、指定したメッセージをウィンドウで出力するコマンドがあります。 これを使って、同様のメッセージを、ウィンドウで出力してみてください。 (他にもっといいものがあれば、それを使ってください。)

ただ、サーバのディスプレイにウィンドウを出しても、 あまり意味がないように思います。 余力があるなら、普段みなさんがご使用のマシン上に、 ウィンドウが出るようにしてみてください。

あとがき

仕事上、仕方なく Windows マシンを使っておりますが、 なるべくマウスに触らないようにするため、極力、 コマンド・プロンプト上で作業を行うようにしています。

そのコマンド・プロンプトですが、みなさんご存知の通り、 bash や tcsh などに慣れた身には、やや受け入れ難い使用感です。
ですので、Cygwin や SFU を入れたりなど小細工をして、 ごまかしながら使っておりました。

しかし、そんな辛い日々とももうおさらばです(?)。
本家本元より、 次世代 Windows シェル『Windows PowerShell』なるものが公開されました。

Windows Server 2003 Service Pack 1 および Windows XP Service Pack 2 用の Windows PowerShell 1.0 ローカライズ版インストール パッケージ
http://support.microsoft.com/kb/926140

早速、試してみました。
内蔵されたコマンドが豊富だったり、関数やエイリアスが使えるのが便利っぽいです。 面白いのは、関数やエイリアス、環境変数、レジストリなどが、 仮想的なドライブとしてアクセスできるところです。
たとえば、こんなことができます。

  PS C:\> Set-Location HKLM:
  PS HKLM:\> cd SOFTWARE\Mozilla\Mozilla Firefox 2.0
  PS HKLM:\SOFTWARE\Mozilla\Mozilla Firefox 2.0> dir

   Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\
   SOFTWARE\Mozilla\Mozilla Firefox 2.0

  SKC  VC Name                           Property
  ---  -- ----                           --------
    0   1 bin                            {PathToExe}
    0   2 extensions                     {Components, Plugins}

  PS HKLM:\SOFTWARE\Mozilla\Mozilla Firefox 2.0> Get-ItemProperty bin

  PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\
                 SOFTWARE\Mozilla\Mozilla Firefox 2.0\bin
  PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\
                 SOFTWARE\Mozilla\Mozilla Firefox 2.0
  PSChildName  : bin
  PSDrive      : HKLM
  PSProvider   : Microsoft.PowerShell.Core\Registry
  PathToExe    : C:\Program Files\Mozilla Firefox\firefox.exe

独特の雰囲気があって、慣れるまでにちょっと時間がかかりそうですが、 いじくっていると頭の体操になりそうで、いろいろと楽しめそうです。
みなさんも、なにかの逃避などの際に、是非お試しください。:-)

 

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

 

「いますぐ実践! 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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本