Last-Modified: 2007/8/5
いますぐ実践! Linux システム管理 / Vol.114 / 読者数:1125名
ご無沙汰いたしております、うすだです。
1週間お休みをいただきましたが、ずいぶん間があいてしまったような気 がします。そのくらい、この2週間の時間の流れが遅く感じられました。
それはつまり、苦手なお仕事が続いてテンションが低かった、ということ だと思います。(おっと、テンションが低いのは、現在進行形でした。)
しかし、結局、やらなければいけないことに変わりはないわけで、後回し にすればするほど、自分の首を締めることになりますよね。
「どちらにしてもやらなければいけないなら、今すぐにやりなさい!」と いつも息子に言っている以上、親の私がまず実践すべきだということに、 (いまさらですが)気づき、(重い腰を上げて)がんばろうと思いました。
子どもを見ていると、自分のよくないところが、いやでも目につきます。
子どもが、ダイレクトに直球で指摘してくれることもあります。
結婚せずひとりでいたら、その分自由ではありますが、自分の欠点を知る
機会が格段に減っていたと思います。
ですので、ここはひとつ、その気づきや指摘を、素直に受け入れるところ
から始めようと思っている次第です。
…と、微妙な宣言をしたところで、今週も、はりきってまいりましょう!
今週のお題 - udev の仕組みを理解する
みなさんは、新しいデバイスを接続しても、デバイスファイルがないため に、そのデバイスが使えない、という経験をしたことがないでしょうか?
Linux が 2.4 カーネル以前の場合、/dev の下には、使用される可能性の あるデバイスファイルが、あらかじめごっそりと作成されていました。
新たにデバイスを追加したとき、デバイスファイルがすでに存在すれば、
そのデバイスを使うことができます。
ですが、デバイスファイルが存在しないと、メジャー番号やマイナー番号
を調べて、手動で作成しなければなりません。
ですので、メジャー番号やマイナー番号がわからないとき、途方に暮れる
こともあったように記憶しております。
そんな迷える仔羊のために、2.6 カーネル以降では、udev というものが 登場しました。udev を使えば、上記の問題が、一気に解消されます。
じゃあ、そういうことがもうないなら、知らなくてもいいじゃん、という ことになりそうですが、それでは、当メルマガの存在意義(あるいはネタ) がなくなってしまいます。
…じゃなくて、Linux で飯を食うひとは、そのくらい知ってないと、後輩 に聞かれたときなどに、気まずい思いをする可能性があります。
ですので、今週は、udev の仕組みを追いかけてみたいと思います。
udev のことを知らなくて、後輩やお客さまに聞かれる可能性のある貴兄
は、念のため一読されることをお勧めします。
− − − − − − − − − − − − − − − − − −
…いやもうほんとに、前置きを短く書くコツを知りたいものです。
という反省は置いておきまして、本題に入りたいと思います。
以降では、Linux カーネル 2.6 の最新に近いやつを対象に、話を進めて
いこうと思います。
その比較的新しめの 2.6 カーネルでは、デバイスの存在を認識したり、 デバイスがなくなったりしたときに、netlink を介して、ユーザにその旨 を通知してくれるようになりました。
udev は、そのカーネルからのメッセージを受けて、デバイスファイルを 作成したり消去したりします。ですので、手動で作成する必要がなくなる わけですね。ああ、便利です。
今までは、使用する可能性のあるデバイスファイルが、/dev の下に全部
存在していましたが、udev が導入されてからは、実在するデバイスだけ
が /dev の下に存在します。
今存在するデバイスがわかるという点でも、便利ではないかと思います。
ちなみに、これらの処理を、udevd というデーモンが行います。
% ps -C udevd
PID TTY TIME CMD
358 ? 00:00:00 udevd
udevd は、/etc/udev/rules.d/ の下にある設定ファイルにしたがって、
デバイスファイルを作成したり、何らかのコマンドを実行したりします。
…が、このあたりは、深追いすると出てこられなくなりますので、今回は
説明を割愛させていただきます。
(説明できるほどには知らない、というだけだったりもします。)
− − − − − − − − − − − − − − − − − −
では、カーネルが送信するメッセージを、観察してみましょう。
といっても、udevmonitor というコマンドを実行するだけです。
実行すると、以下のメッセージが出力されます。(root権限が必要です。)
# udevmonitor
udevmonitor prints the received event from the kernel [UEVENT]
and the event which udev sends out after rule processing [UDEV]
カーネルから受け取ったイベントが UEVENT で、udevd が処理して返事を 返したものが UDEV だ、というようなことをおっしゃっていますね。
ここで、USB カメラを差しますと、以下のメッセージが出力されました。
(行末が \ の行は、実際には改行せずに、次の行が続きます。)
UEVENT[1186251356.080090] add@/devices/pci0000:00/0000:00:1d.1/\
usb2/2-1
UDEV [1186251356.081721] add@/devices/pci0000:00/0000:00:1d.1/\
usb2/2-1
UEVENT[1186251356.096690] add@/devices/pci0000:00/0000:00:1d.1/\
usb2/2-1/2-1:1.0
UEVENT[1186251356.096745] add@/class/video4linux/video0
UEVENT[1186251356.096764] add@/class/usb_device/usbdev2.14
UDEV [1186251356.185101] add@/devices/pci0000:00/0000:00:1d.1/\
usb2/2-1/2-1:1.0
UDEV [1186251356.210017] add@/class/video4linux/video0
UDEV [1186251356.245688] add@/class/usb_device/usbdev2.14
USB のポートに video0 が挿入された的なことをおっしゃっているのが、 それとなくわかると思います。(あいまいですみません。)
実際、/dev/video0 と、そのシンボリックリンクである /dev/video が、 自動的に作成されていました。
次に、USB カメラを抜くと、以下が出力されました。
UEVENT[1186251396.659816] remove@/class/video4linux/video0
UEVENT[1186251396.660819] remove@/devices/pci0000:00/0000:00:1d.1/\
usb2/2-1/2-1:1.0
UEVENT[1186251396.660847] remove@/class/usb_device/usbdev2.14
UEVENT[1186251396.660865] remove@/devices/pci0000:00/0000:00:1d.1/\
usb2/2-1
UDEV [1186251396.663174] remove@/class/video4linux/video0
UDEV [1186251396.669726] remove@/devices/pci0000:00/0000:00:1d.1/\
usb2/2-1/2-1:1.0
UDEV [1186251396.676687] remove@/class/usb_device/usbdev2.14
UDEV [1186251396.683526] remove@/devices/pci0000:00/0000:00:1d.1/\
usb2/2-1
/dev/video0 と /dev/video は、きれいさっぱりなくなっていました。
− − − − − − − − − − − − − − − − − −
上記のように、あとから認識されるデバイスはいいのですが、カーネルの
立上り時に認識されたデバイスは、どうすればいいでしょうか。
netlink を介してメッセージを送られても、それが udevd の起動前だと、
受け取ることができません。
実は、sysfs 上の uevent というファイルをつっつくと、カーネルが再度 メッセージを送ってくれるようになっています。
ですので、udevd は、起動時に、/sys/block と /sys/class 以下にある uevent というファイルを探し、それをつっつくことで、udevd 起動前に 認識されたデバイスの処理を行います。
このあたりを、実際に確かめてみたいと思います。
/sys/class/input/misc/ の下にある uevent で、試してみましょう。
まず、メッセージを確認するため、udevmonitor を起動しておきます。
そして、別の端末から、以下を実行します。(root権限が必要です。)
# echo > /sys/class/input/mice/uevent
すると、udevmonitor が以下を出力します。
UEVENT[1186033694.276923] add@/class/input/mice
UDEV [1186033694.366521] add@/class/input/mice
uevent ファイルをつっつくことで、メッセージを再送信してくれている ことがわかります。
ちなみに、唐突に話はそれますが、udevmonitor を、--env オプション付 で実行すると、詳細(環境変数一式)を出力してくれます。
# udevmonitor --env:
...中略...
UEVENT[1186033967.674478] add@/class/input/mice
ACTION=add
DEVPATH=/class/input/mice
SUBSYSTEM=input
SEQNUM=713
MAJOR=13
MINOR=63
...後略...
− − − − − − − − − − − − − − − − − −
以上、udev の動きを、さらっと追いかけてみました。
あまり「実践」という感じではありませんでしたが、どのような仕組みで
動いているのか、大まかにでも知ることは大事だと思います。
udevmonitor などを実際に動かして、ああなるほどと思っていただけます
と、幸いです。
宿題の答え
先週の宿題は、
nsswitch.conf の hosts の設定方法を確認し、host.conf の order と
設定を合わせましょう。
でした。
/etc/nsswitch.conf の hosts は、
hosts: files dns
のように、検索してほしい順に、スペースで区切って指定します。
指定できるのは、files, dns, nis と nisplus です。
ですので、たとえば、host.conf の order の指定が、
order bind,hosts
となっていて、これと同じ設定にしたいなら、nsswitch.conf は、
hosts: dns files
と記述します。
ちなみに、確認方法ですが、hosts にしか存在しないエントリと、DNS に しか存在しないエントリを作っておき、どちらかを問い合わせることで、 どちらで解決しているのかを確認することができます。
今週の宿題
今週の宿題は、
デバイスを挿入するなどしたときに、デバイスファイルが自動的に作成
されることを確認しましょう。
です。
デバイスの挿入前と挿入後の状態を比較すれば、わかりますよね。
比較するのは簡単だと思いますので、是非やってみてください。
あとがき
スラッシュドットなどでも話題になっていましたので、ご存じの方も多い のではないかと思いますが、あまりにも私の心に響くものがありましたの で、あえてご紹介させていただきます。
インターネットサービスプロバイダー相互接続マップ http://i.impressrd.jp/e/2007/07/30/19
かつて、インターネットマガジンに毎月付録としてついてきた、ISP相互 接続マップの一部が、上記で公開されています。
この時代に、会社のインターネットサーバなどを管理していましたので、 私にとっては、非常に感慨深いものがあります。
上記で一番古い、1995年6月のマップを見ますと、Spin の直下に、64kbps で、「東海地域インターネット」がぶら下がっていると思います。当時は この下に、アナログ専用回線で、つながせてもらっていました。
これが、次の年の1996年2月のマップになりますと、一瞬どこにあるのか わからないくらい密集しています。同年10月のマップは、さらに密集して いて、えらいことになっています。(ちなみに、IIJ名古屋の下の TCP と いうやつです。このころは、すでにデジタル専用回線 64kbps でした。)
当時は、インターネットが広まってきたなあ、くらいにしか思ってません でしたが、こうやって図で見ると、ものすごい勢いで広まっていたのだと いうことがわかり、今さらながらびっくりさせられます。
今でも、インターネットは、Web2.0 などでまだまだ熱いと思いますが、 上記のように、その熱気がビジュアルでわかると面白いのになあ、と思い ました。(強引に結論)
さて、またまた申し訳ないのですが、苦手なお仕事とかお盆とかがどっと
押し寄せてきますので、来週はお休みにさせていただきたいと存じます。
おそらく、それなりな会社にお勤めの、せっぱ詰まっていない貴兄なら、
お休みを満喫していて、実践する暇も気力もないですよね。ね。ね。
…すみません。今後は休み癖がつかないよう、努力させていただきます。
今週も、ここまで読んでいただき、ありがとうございました。
それでは、また再来週…す、すみません…に、お会いしましょう!
「いますぐ実践! Linux システム管理」はこちらです。
メルマガの解除、バックナンバーなども、以下からどうぞ。
https://www.usupi.org/sysad/ (まぐまぐ ID:149633)
その他、作者に関するページは、概ね以下にございます。
https://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
https://twitter.com/kuriking/ (twitter)
https://facebook.com/kuriking3 (facebook)
https://jp.pinterest.com/kuriking/pinterest)
https://www.instagram.com/kuri_king_/ (instagram)