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

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


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

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

このあいだ、ノートPC 用のメモリを、衝動買いしました。
我が家の近くの中古屋さんで、たまたま PC133 512MB の DIMM が置いてあり、 最近めったに見かけないので、ついうっかり買ってしまいました。

でも、これで、メモリは合計 640MB になりました。
GNOME 上で、XEmacs と Firefox を使っているだけであれば、 スワップは一切使われません。夢のような環境です。

今まで使っていた 256MB の DIMM は、よめの iBook に差すことで、 第2の人生を送ることになりました。そんなわけで、 無駄がほとんど発生していないので、買って正解だったよなあ、 と正当化することにしました。

…まあ、いずれの環境も、かなりの周回遅れであることは、十分承知しています。 でも、CPU なんて 1GHz もあれば十分実用に耐えますので、壊れでもしないかぎり、 買い替える必要なんてないんですよね。
ちょっと遅いくらいは、我慢すればいいんですよ。ね。

Xen とか Compiz とか、いろいろ誘惑はありますけどね…。
(でも、ほんとは、対応している速いマシンで試したいなあ…(遠い目))

…夢は夢のままにしておいて、今週も、はりきってまいりましょうか。

今週のお題 - USB機器を使えなくする

先々週〜先週と、USB機器の挿抜を検出して、メールする方法について、 ご紹介しました。

Vol.082 - USBポートを監視する
http://www.usupi.org/sysad/082.html
Vol.083 - USBポートをわかりやすく監視する
http://www.usupi.org/sysad/083.html

しかし、ただ通知するだけでは、少々受動的ではないかと思います。
もし万が一、USBメモリ経由などで、大事なデータを持ち出されてしまいますと、 いくら通知などを仕込んでおいても、後の祭りです。
そういう事態にならないよう、USB機器を最初から使えなくしておくと、 やや安心ですよね。

というわけで、今週は、USB機器を使えなくしてみたいと思います。
漠然と「USB機器」、というのもアレですので、 今回は、USBストレージを使えなくしてしまおうと思います。


USB機器をぷすっと差したとき、 必要なドライバが自動的にロードされて機器が使える状態になりますが、 ドライバのロードはだれがやっているのでしょうか?

実は、ドライバのロードは、カーネルが行います。
厳密には、カーネルは、必要なドライバがあると、 modprobe を呼び出してドライバをロードしようとします。

ただし、hotplug が登録されている場合は、 カーネルではなく hotplug が代わりに処理をしてくれます。

ですので、hotplug になにかコマンドが登録されていれば hotplug に、 登録されていなければ modprobe に、なにかしら細工をすれば、 使えなくできそうです。

ただ、後者の場合、/sbin/modprobe に直接手を加えるのは、 勇気が100倍くらい必要ですので、できれば避けたいところです。
実は、modprobe の場合も、/kernel/sys/kernel/modprobe に登録されたコマンドを、 カーネルが実行するようになっています。
ですので、これを差し替えて対処したいと思います。


まずは、modprobe を差し替える方法から、ご紹介します。
単刀直入ですが、以下を、modprobe の代替品としてみようと思います。

  #!/bin/sh
  ORG_MODPROBE=/sbin/modprobe
  DO_MODPROBE=1
  for arg in $*; do
      if [ "z$arg" = "zusb-storage" ]; then
          DO_MODPROBE=0
      fi
  done
  [ -x "$ORG_MODPROBE" -a $DO_MODPROBE -gt 0 ] && $ORG_MODPROBE $*

$ORG_MODPROBE には、もともと登録されている modprobe を記述します。
もし引数のいずれかに usb-storage という文字列があると、 ホンモノの modprobe を実行しないよう($DO_MODPROBE を 0)にしています。
そうでなければ、最後の行で、普通に modprobe を実行します。

…という、なんとも単純明解なスクリプトですが、これで、 USBメモリなどを挿入しても usb-storage をロードしなくなりますので、 自動マウントなども行われなくなります。

使い方は、hotplug のときと同様、sysctl などで登録するだけです。
上記のスクリプトを、/usr/local/sbin/modprobe.test という名前で保存した場合、 実行可能な状態にして、以下のように登録してください。

  # chmod +x /usr/local/sbin/modprobe.test
  # sysctl -w kernel.modprobe=/usr/local/sbin/modprobe.test
  kernel.modprobe = /usr/local/sbin/modprobe.test

ただし、すでに usb-storage がロード済ですと、 上記を仕込んでも意味がありませんので、 以下のように rmmod しておく必要があります。

  # lsmod | grep usb_storage
  usb_storage            72128  0 
  scsi_mod              139528  3 sd_mod,sg,usb_storage
  # rmmod usb_storage

よーく見ると、モジュール名が usb_storage (間が - ではなく _)です。
名前を間違えないよう、ご注意ください。


お次は、hotplug を差し替える方法を、ご紹介しましょう。
通知機能を省いた hotplug の代替品は、以下の通りです。

  #!/bin/sh
  ORG_HOTPLUG="/sbin/hotplug"
  DO_HOTPLUG=1
  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/"`
      if [ "$CLS" = "8" ]; then
          DO_HOTPLUG=0
      fi
  fi
  [ -x "$ORG_HOTPLUG" -a $DO_HOTPLUG -gt 0 ] && $ORG_HOTPLUG $*

$ORG_HOTPLUG には、もともと登録されている hotplug を記述します。
$TYPE か $INTERFACE のクラスを抜き出して($CLS)、 これがストレージを表す(つまり値が 8 である)場合、 ホンモノの hotplug を実行しないよう($DO_HOTPLUG を 0)にしています。
そうでなければ、最後の行で、普通に hotplug を実行します。

使い方は、今までと同様、sysctl などで登録するだけです。
上記のスクリプトを、/usr/local/sbin/hotplug.test という名前で保存した場合、 実行可能な状態にして、以下のように登録してください。

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

ただし、すでに usb-storage がロード済ですと、 上記を仕込んでも意味がありませんので、rmmod しておく必要があります。
(その方法は、modprobe の仕込みの最後のほうに、書いてあります。)


以上、USBストレージを使えなくする方法を、ご紹介しました。

どちらの方法を使うかは、環境によって異なります。お使いの環境をよくみてから、 試してみてください。

ちなみに、CD-ROM なども USBストレージの範疇ですので、 同様に使えなくなってしまいます。もし、USBメモリだけに限定したい場合は、 おそらく、環境変数などを見れば、なんとか判別できると思います。 興味のあるかたや、やんなきゃいけないかたは、 チャレンジしてみてくださいまし。
(そして、もし実現できたら、教えてください。:-p)

宿題の答え

先週の宿題は、

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

でした。

漠然とした宿題でしたが、ようするに、 Manufacturer や Product などの文字も通知してみましょう、ということでした。

思いつきで出した宿題でしたが、意外にも苦戦を強いられました。
申し訳ありませんが、2.6 カーネルで sysfs がある場合、 という前提で話を進めさせていただきます。
まず、hotplug の代替品として、以下のスクリプトを用意します。

  #!/bin/sh
  ORG_HOTPLUG="/sbin/hotplug.murasaki"
  /usr/bin/nohup `dirname $0`/hotplug_sub.test $* &
  [ -x "$ORG_HOTPLUG" ] && $ORG_HOTPLUG $*

本来の hotplug である $ORG_HOTPLUG を呼び出す前に、 hotplug_sub.test を呼び出しています。今回は、 hotplug_sub.test で通知の処理を行いますが、やや時間がかかりますので、 バックグラウンドで呼び出しています。

これを、いつものように /usr/local/bin/hotplug.test という名前で保存し、 実行可能な状態にしておきます。
そして、hotplug_sub.test は、以下のようなモノにしてみました。

  #!/bin/sh
  SYSBASE="/sys/class/usb_device"
  TMPFILE=`mktemp /tmp/prv-hotplug-XXXXXX`
  trap "rm -f $TMPFILE" 0 1 2 3 9 11 15

  [ "z$ACTION" = "zadd" ] && sleep 3  # ←ここが追加分
  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;;
          # ここは前回と同じなので割愛。なくても動きますし。
          *) echo $CLASS >> $TMPFILE;;
      esac
      echo "Vendor: $PRODUCT" >> $TMPFILE
      # ↓ここから fi までが追加分
      num=`echo $PRODUCT | \
          sed "s/^.*\/0*\([1-9][0-9]*\)\/0*\([1-9][0-9]*\)$/\1.\2/"`
      if [ -d "$SYSBASE/usbdev$num" ]; then
          basedir="$SYSBASE/usbdev$num/device"
          echo "Manufacturer: `cat $basedir/manufacturer`" >> $TMPFILE
          echo "Product: `cat $basedir/product`" >> $TMPFILE
          echo "Serial: `cat $basedir/serial`" >> $TMPFILE
      fi
      /usr/bin/Mail -s "usb: $ACTION" root < $TMPFILE
  fi

こちらは、ご覧の通り、前回の hotplug.test をベースにしています。
大きく異なるのは、6行目の sleep の処理と、22〜29行目の宿題的処理の部分です。

6行目では、$ACTION が "add" だったら sleep しています。 hotplug が呼ばれた直後では、うまく参照できない場合があるため、少し待ちます。
(3秒という時間は、直感的なものです。)

22〜29行目では、/sys/class/usb_device/usbdev?.?/device/ 以下から、 manufacturer などの文字をとってきています。
$PRODUCT に格納された procfs のパスから、バスとデバイス番号を取り出して、 上記のパスを作成し、manufacturer などを参照しています。

ここまでできたら、hotplug に登録して、確認してみてください。
たとえば、某USBメモリを差すと、以下のようなメールが届きます。

  Subject: usb: add

  Class: Mass Storage (8/6/80)
  Vendor: 58f/6381/103
  Manufacturer: Generic
  Product: Mass Storage Device
  Serial: 00000000

hotplug に登録せずに、以下を直接実行しても、雰囲気は味わえます。
(ルートHUBを参照していますので、動作確認程度の意味しかないです。)

  % TYPE=0/0/0 INTERFACE=9/0/0 PRODUCT=/proc/bus/ucb/001/001 \
  ACTION=add ./hotplug_sub.test usb

 

残念ながら、2.4 カーネルオンリーな貴兄は、sysfs がないので、 上記を試せません。すみません。
おそらく、libusb あたりを使えば、 直接ストリング・ディスクリプタを読み出せると思いますが、 それはもうスクリプトの範疇外ですので、断念してしまいました。 もし機会がありましたら、やってみたいと思います。

今週の宿題

今週の宿題は、

  USBストレージを使えなくしながら、USB機器の挿抜をメールで通知する
  ようにしてください。

です。

Vol.082〜084 のスクリプトを、ちょちょいと合体させれば、そのようになりますよね。

最近、宿題が重かったので、ちょっと軽めにしてみました。
ちょちょいと試してみてください。

あとがき

数日前に、前から気になっていた書籍を、うっかり買ってしまいました。
というのも、軽い気持ちで以下をやって、ショックを受けたからです。

Binary Hacks - バイナリアン度チェック
http://0xcc.net/binhacks/quiz.html

曲がりなりにも、組み込み系の会社におりますので、 7〜8割は堅いかなぁなんて思っていました。

で、結果は、40点でした。(あてずっぽうの正解込みです)

…というわけで、見事に釣られて、購入してしまいました。

Binary Hacks - ハッカー秘伝のテクニック100選
http://www.amazon.co.jp/exec/obidos/ASIN/4873112885/usupiorg06-22

いわゆる低レイヤに関するさまざまなテクニックが、紹介されています。
厳密には、詳しい本できちんと勉強すべきかもしれませんが、本メルマガ的には、 まずこのような本で、「習うより慣れろ」的に体験することが、 敷居を低くすることにつながるように思います。

GNUの開発ツールをお使いのかたはもちろん、そうでないかたも、 Linux や *BSD などをお使いのかたであれば、役に立つ内容が満載だと思います。
是非、本屋で立ち読んでみてください。

そんなわけで、当初は会社のお金で買うべく、 見習いのレジのお姉さんを四苦八苦させて領収証を書いてもらったのですが、 ここで紹介した以上、自腹を切るべきではないかと思ったりしております。

 

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

 

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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本