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

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


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

またしても、ご無沙汰いたしております、うすだです。

さて、突然ですが、会社のメール環境が厳しくなりまして、 基本的に SSL とか SMTP Auth とかが必須となりました。

いままで、会社のメールも個人のメールも一緒くたにして処理していたのですが、 このままでは叱られそうですので、分けることにしました。

受信も送信も経路や方法が異なりますので、 メール送受信の度にいちいち切替えています。 …が、やってみると結構面倒くさいです。
いや、本当は、Emacs 上で読んでますから、Emacs Lisp をちょちょいと書けば、 ほぼ自動で切替えられそうな気がするのですが…。

昔なら、忙しいときほど、そういった脱線的作業に集中していたと思うので、 年をとってしまったのかなあ、という気がしております。

…いやいやいや、それは、それだけは、認めたくありません。
認めたくないので、今後は、積極的に脱線するようにしたいと思います。

間違った結論に達したところで、今週も、はりきってまいりましょう!

今週のお題 - udev の設定をカスタマイズする

先週お休みだったからなのか、udev をネタにしたからなのか、 はたまたそれ以外の理由なのか、実のところはさだかではありませんが、 読者数がいつもより増えた、という事実を前向きにとらえて、 今週も udev をネタにさせていただこうと思います。

先週、udev を使うと、実在するデバイスのデバイスファイルだけを作成してくれる、 とても便利なひとである、ということをご紹介しました。

Vol.114 - udev の仕組みを理解する
http://www.usupi.org/sysad/114.html

しかし、その全自動的な便利さゆえの両刃の剣、とでも言いましょうか、 逆にカスタマイズの敷居が高くなってしまっているように思われます。

このデバイスのパーミッションを変更したいとか、 とあるデバイスが追加されたときになにか実行したい、などといったときに、 途方に暮れていては、システム管理者の名が廃ります。

そんなときのために、どのあたりを触ればよいか、という程度の知識を、 今のうちに得ておくと、なにかと安心(?)ですよね。
というわけで今週は、udev の設定について、ご紹介したいと思います。


まずは、udev の設定ファイルのありかや、 記述するにあたっての決まりごとについて、ご紹介します。

udev の設定ファイルのありかは、/etc/udev/rules.d/ の下です。

実際に見ていただくとわかりますが、いくつかファイルがあります。
(以下は、Vine Linux 4.1 の素の状態です。)

  # ls /etc/udev/rules.d/
  05-udev-early.rules  60-net.rules      90-hal.rules
  50-udev.rules        60-pcmcia.rules   95-pam-console.rules
  51-hotplug.rules     60-vboxdrv.rules  99-fuse.rules

そして、いずれも、ファイル名の最後が .rules になっています。
udev は、最後が .rules のファイルだけを、辞書順に参照します。

ですので、バックアップをとるときに、 バックアップのファイル名の最後が .rules にならないようにすれば、 評価されなくて済みます。

  # cd /etc/udev/rules.d
  # cp -p 80-dummy.rules 80-dummy.rules.backup

こうしてから、80-dummy.rules を編集すればよいわけですね。


さて、設定ファイルの内容ですが、例によって例のごとく、 以下のようなデファクトスタンダード的(?)決まりごとがあります。

  • 1行につき1つのルールを記述する。
  • 先頭が # の行はコメントとみなされる。
  • 1つのルールを複数行にわたって書きたいときは、行末に \ を書く。

そして各行には、キーと呼ばれる、デバイスを特定するための条件、 条件が一致したときに設定する内容を、カンマ(,) で区切って記述します。

  条件1, 条件2, ..., 設定1, 設定2, ...

百聞は一見にしかず、というわけで、簡単な例を示します。

  KERNEL=="nvram", GROUP="adm", MODE="0660"

上記の場合、条件となるキーが KERNEL=="nvram"、 設定となるキーが残りの GROUP="adm" と MODE="0660" です。

KERNEL というのは、デバイスの名前を表しますので、もし、 デバイス名が nvram だったら、この行の条件が満たされ、 設定が有効になります。
GROUP はグループを、MODE はモードを表しますので、 作成するデバイスファイルのグループを adm、モードを 0660 にします。

ちなみに、条件で使用されるパラメータには、KERNEL の他にも、 例えば以下があります。

  KERNEL:    デバイス名。
  ACTION:    追加の場合は "add", 削除の場合は "remove".
  SUBSYSTEM: デバイスの種類。"block" や "scsi", "usb" など。
  BUS:       接続されているバスなどの種別。"ide", "scsi" など。

設定されるパラメータにも、GROUP などの他に、例えば以下があります。

  NAME:    作成されるデバイスファイル名。
  SYMLINK: デバイスファイルのシンボリックリンクが必要なら指定。
  OWNER:   デバイスファイルの所有者。
  GROUP:   デバイスファイルの所有グループ。
  MODE:    デバイスファイルのパーミッション(モード)。
  RUN:     実行するコマンド。
  OPTIONS: "last_rule" は、以降の評価を行わない。
           "ignore_device" は、イベントを無視する。
           "ignore_remove" は、削除のイベントを無視する。…など。

もう少し、設定例を見てみましょう。

 

  KERNEL=="*", OWNER="root", GROUP="root", MODE="0600"

条件には、* や ?, [] が使用できます。
この場合、すべてのデバイスが条件に当てはまりますので、デフォルトでは、 所有者が root、所有グループが root、モードが 0600 になります。

 

  KERNEL=="mice", NAME="input/%k", SYMLINK+="mouse usbmouse"

デバイス名が mice の場合、/dev/input/mice というデバイスファイルを作成します。 ここで、NAME に含まれる "%k" という呪文は、実際には、 KERNEL の内容に置き換わります。
(他にもあります。気になるかたは、man udev でご確認ください。)

また、SYMLINK で、mouse と usbmouse が指定されていますので、 これらのシンボリックリンクが作成されます。

  % ls -l /dev/mouse /dev/usbmouse 
  lrwxrwxrwx 1 root root 10  8月18日 20:55 /dev/mouse -> input/mice
  lrwxrwxrwx 1 root root 10  8月18日 20:55 /dev/usbmouse -> input/mice

ちなみに、SYMLINK には += を使用しています。ですので、 以前のルールで SYMLINK が設定済でも、+= で追加するため、上書きされません。

 

  ACTION=="add", SUBSYSTEM=="scsi_device", RUN+="/sbin/modprobe sg"

ACTION が "add" で、かつ SUBSYSTEM が "scsi_device" の場合、 つまり SCSI デバイスの追加の場合に、/sbin/modprobe sg を実行する、 という意味になります。


…あ、このままですと、 またしても「実践」からはほど遠い内容になってしまいますね。
ですので、ここでは実際に、設定の変更を試してみたいと思います。

今回は、シリアルポートである /dev/ttyS0 の、モードを変更してみようと思います。 (組込みなお仕事で、よくご世話になるデバイスです。)

RedHat 系なかたの場合、/etc/udev/rules.d/50-udev.rules に、 以下の行があると思います。

  KERNEL=="tty[A-Z]*", NAME="%k", GROUP="uucp", MODE="0660"

これによって、/dev/ttyS0 は、所有グループが uucp、 モードが 0660 に設定されることになります。
(なかったらすみません。例えば、Ubuntu にはないですし、 所有グループは dialout です。でも、以降はちゃんと動作しましたよ。)

  % ls -l /dev/ttyS0
  crw-rw---- 1 root uucp 4, 64  8月18日 20:55 /dev/ttyS0

ここで、70-ttyS0.rules というファイルを作ってみましょう。
内容は、以下のような感じにしてください。

  KERNEL="ttyS0", MODE="0666"

作成したら、イベントを再発行させて、udev に再評価してもらいます。

  # echo > /sys/class/tty/ttyS0/uevent

すると、モードが、指定した内容(0666)に変わります。

  % ls -l /dev/ttyS0
  crw-rw-rw- 1 root uucp 4, 64  8月18日 20:55 /dev/ttyS0

おっと、誰でも読み書きできてしまいすね。ちょっと恐ろしいです。
本番的環境をお使いの貴兄は、可及的速やかに、元に戻しましょう。

  # mv 70-ttyS0.rules 70-ttyS0.rules.bad
  # echo > /sys/class/tty/ttyS0/uevent

以上、udev の設定方法とその例を、いくつかご紹介しました。

所有者や所有グループ、モードの変更くらいならできそうだ、 と思われたのではないでしょうか。そうなら、是非、実際に試してみてください。

宿題の答え

先週の宿題は、

  デバイスを挿入するなどしたときに、デバイスファイルが自動的に作成
  されることを確認しましょう。

でした。

いろいろな方法が考えられると思いますが、ごく普通と思われる方法を、 以下にご紹介します。

まず、機器を差す前の状態を記録します。

  % ls -1 /dev > /tmp/before.log

次に、機器はなんでもいいのですが、ここでは USB メモリカードを挿入します。 そして、同様に状態を記録します。

  % ls -1 /dev > /tmp/after.log

できたら、あとは、差分をみるだけです。

  % diff -u /tmp/before.log /tmp/after.log
  ...前略...
  +sda
  +sda1
   sequencer
   sequencer2
  +sg0
   shm/
   snd/

先頭が + で記されている行が、 機器挿入後に udev が作成したデバイスファイルです。(推測)
sg0 は一般的な SCSI デバイス、sda は SCSI ディスクです。
使用したカードは、パーティションが1つしかないので、 sda1 だけが作成されています。(複数あれば sda2, sda3, ...と作成されます。)
USB ストレージは、SCSI のコマンドでやりとりしますので、 ソフト的にみると SCSI になるわけですね。

もうちょっと詳しく知りたいという貴兄は、ls -l としてみてください。

  % ls -l /dev > /tmp/before.log
  (USB メモリカードの挿入)
  % ls -l /dev > /tmp/after.log
  % diff -u /tmp/before.log /tmp/after.log
  ...前略...
  +brw-r----- 1 root  disk     8,   0  8月 8日 01:31 sda
  +brw-r----- 1 root  disk     8,   1  8月 8日 01:31 sda1
   crw------- 1 usu   root    14,   1  7月31日 06:18 sequencer
   crw-rw---- 1 root  root    14,   8  7月31日 06:18 sequencer2
  +crw------- 1 usu   root    21,   0  8月 8日 01:31 sg0
   drwxrwxrwt 2 root  root         40  7月30日 21:18 shm/
   drwxr-xr-x 2 root  root        160  8月 6日 23:41 snd/

今週の宿題

今週の宿題は、

  複数の行の条件が成り立つ場合にどうなるか、試してみましょう。

です。

たとえば、前述の

  KERNEL=="tty[A-Z]*", NAME="%k", GROUP="uucp", MODE="0660"
  KERNEL="ttyS0", MODE="0666"

では、後者が MODE の設定を上書きしていましたよね。

しかし、他の例で試したときに、後の設定がまったく反映されないことがありました。 正直に申しますと、よくわかっていません。
というわけで、来週までに、いろいろ試してみたいと思います。

あとがき

よめが、 「賢くなるパズル」という本を買ってきました。

5x5 のマスに、ある条件にしたがって、1から5の数字を、 上下左右に同じ数が並ばないよう当てはめていくだけのパズルです。
「ある条件」というのは、いくつかのマスの数の足し算や、 2つのマスの引き算の数を、指定された数値にする、というだけです。

最初はあまり気がすすまなかったのですが、デニーズで、 料理が来るのを待っている間、いっしょになってワイワイやっていると、 意外とそれなりに楽しめました。

よめは、普段ひとりでこつこつやっていますが、お仕事の合間に、 職場のひとといっしょになってやると、凝り固まった頭がほぐれてよいのでは、 と思いました。(職場にもよると思いますが…。)

足し算引き算の他にも、かけ算割り算があり、 またそれぞれ初級から上級まであります。 小学生用もありましたので、今度、子どもに勧めてみようと思います。 (やってくれなさそうな気がとってもしますが…。)

 

あ、来週は、休まずに、udev の最終章をお届けしたいと思います。
休まずに、とか言ってますが、本来は休まないのが普通でしたね。

 

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

 

「いますぐ実践! 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/ (栗日記ブログ)


[バックナンバーのトップへ] [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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本