DEVFS(8)

名称
devfs - DEVFS 制御コマンド

書式
devfs [-m mount-point] keyword argument ...

解説
devfs ユーティリティは、マウントされた devfs(5) のプロパティを操作するためのインタフェースです。

keyword 引数で残りの引数のコンテキストを指定します。 例えば、 ほとんどのルールサブシステム関連のコマンドの前には rule キーワードをつけなければならないことになっています。 次のフラグはすべてのキーワードに共通のものです:

-m mount-point
    操作する mount-point を指定します。 ここには、 devfs(5) がマウントされていなければなりません。 このオプションがない時には、 devfs は /dev を操作します。

  ルールサブシステム
devfs(5) のルールサブシステムは、システム管理者が DEVFS の各ノードの属性を変更できる ようにするためのものです。 DEVFS マウントポイントにはそれぞれに “ruleset” (ルールセット) というルールのリストが関連づけられています。 デバイスドライバが新しいノードを作成する時には、 そのノードがユーザランドから見えるようになる前に それぞれのマウントポイントに関連づけられているルールセットの すべてのルールが適用されます (下記参照) 。 これによって、管理者がノードの可視性を含めた属性を変更することが できるようになっています。 例えば、 jail(2) の /dev にあるすべてのディスクノードを隠すというようなこともできます。

  ルールの操作
ルール操作コマンドは rule キーワードに続けて使用します。 次のフラグは、すべてのルール操作コマンドに共通のものです :

-s ruleset
    ruleset で指定したルールセットを操作します。 このフラグが指定されていない時は、 指定したマウントポイントに現在関連づけられているルールセットを 操作します。

次のコマンドが使用できます:

rule add [rulenum] rulespec
    rulespec (下記参照) で、記述されたルールをルールセットに追加します。 ルール番号は、 rulenum が明示的に指定されている場合にはその番号に、 指定されていない場合には自動的にカーネルによって決められます。

rule apply rulenum | rulespec
    ルール番号 rulenum または rulespec で、指定されたルールをマウントポイントに適用します。 “適用される” ルールには条件があって、マウントポイントのすべてのノードに対して チェックを行い、条件が一致すれば指定のアクションを起こします。

rule applyset
    ルールセットのすべてのルールをマウントポイントに適用します (上記 “apply” の説明を参照) 。

rule del rulenum
    ルールセットからルール番号 rulenum のルールを削除します。

rule delset
    指定したルールセットのすべてのルールを削除します。

rule show [rulenum]
    rulenum で指定したルール番号のルール、 またはルールセットのすべてのルールを表示します。 出力行は (ルール毎に 1 行ずつ) 正しい rulespec になっています。

rule showsets
    設定されているルールセットの番号を表示します。

ruleset ruleset
    ruleset で指定した番号のルールセットをマウントポイントのカレントルールセットにします。

  ルール仕様
ルールには 2 つのパートがあります: 条件部とアクション部です。 条件部でルールを適用する DEVFS ノードを指定し、 アクション部でルールが当てはまるノードに何をするかを指定します。 例えば、メジャー番号が 53 のすべてのデバイスの GID を “games” に設定するルールを書くこともできます。 ルール指定の最初のトークンがダッシュ文字 1 つ (‘-’) の場合、ルールは標準入力から読み込まれて残りの指定は無視されます。

次のような条件が使用できます。 デバイスをチェックする時には、条件は AND されます。 OR 条件を使いたい時には、複数のルールを書いてください。

major majdev
    メジャー番号が majdev のすべてのノードに適合します。

path pattern
    パス名が pattern に合うノードすべてに適合します。 このパターンは glob(3) と同じパターンで解析されます。

type devtype
    タイプが devtype のすべてのノードに適合します。 使用できるタイプは disk, mem, tape および tty です。

次のようなアクションが使用できます。 条件部とアクション部の間には特にデリミタはありませんが、 混乱することはないでしょう。

group gid
    ノードのグループ ID を gid に設定します。 グループ名 (/etc/group で照会されます) または、数値で指定します。

hide
    ノードを隠します。 隠されたノードは、マニュアルで mknod(8) を使用するか、 unhide アクションを使用するとまた見えるようになります。

include ruleset
    ルールセット番号が ruleset のルールセットのすべてのルールをノードに適用します。 これによってノードが変更されるとは限りません (例えば、ルールセットに一致するルールがない場合など)。

mode filemode
    ファイルのモードを filemode に設定します。 8 進数として解釈されます。

user uid
    ユーザ ID を uid に設定します。ユーザ名 (/etc/passwd で照会されます) または数値で指定します。

unhide
    ノードを見えるようにします。

実装に関する注
ルールセットは、最初に参照される時にカーネルによって作成され、 最後の参照がなくなる時に削除されます。 すなわち、ルールセットはルールが追加される時かどこかのマウントポイントの カレントルールセットに設定された時に作成されます。 また、セットの中の最後のルールが削除される時でもう他からの参照もない (つまり、他のルールにインクルードされてもなく、 どのマウントポイントのカレントルールセットにもなっていない) 時に削除されます。

ルールセット 0 番は すべての新しいマウントポイントのデフォルトルールセットです。 このルールセットは常に空で、変更や削除はできず、 showsets コマンドの出力にも表示されません。

ルールやルールセットは特定のマウントポイント毎ではなく、 システム全体で一意です。 つまり、 showsets は、 -m で指定したマウントポイントにかかわらず、常に同じ情報を表示します。 マウントポイントが有効なのは、 カレントルールセットを変更する時や apply コマンドを使用する時だけです。

実行例
システム起動時には、 ルールセット 0 番のみが存在しますが、 このルールセットは後から変更することができないので、 ルールを追加する前に別のルールセットを作成しなければなりません。 以下の例ではほとんど -m オプションを指定していませんので、 操作は /dev に対して実行されることに注意してください (これは、ノードのプロパティを変更するものだけが問題だからです) 。

    devfs ruleset 10

ルールセット 10 番を /dev のカレントルールセットに指定しています (もし、存在していなければ作成されます)。

    devfs rule add path speaker mode 666

パス名が “speaker” にマッチするすべてのノード (これは /dev/speaker だけですが) をファイルモード 666 (すべてのユーザが読み書き可能) にするルールを追加しています。 気をつけて欲しいのは、そのようなノードが既に存在する場合には、 このルール (やルールセット) が明示的に適用される (下記参照) まで そのノードは変更されないということです。 モードが変更 される のはルールが追加された 後に ノードが作成された場合です (つまり、上記のルールが追加された後に atspeaker モジュールがロードされた場合)。

    devfs rule applyset

カレントルールセットのすべてのルールを、 存在するすべてのノードに適用しています。 つまり、上記のルールが /dev/speaker を作成した後に追加された場合に、 このコマンドを使用してルール通りにファイルモードを 666 にすることができます。

    devfs rule add path snp* mode 660 group snoopers

(引数を引用符で囲うのは パス名 がシェルのファイルグロブ機能で展開されるのを防ぐ必要があるからです。) パス名が “snp*”, にマッチするすべてのデバイスのファイルモードを 660 に、GID を “snoopers” に設定します。 このようにすると、 “snoopers” グループのユーザが snp(4) デバイスを使えるようになります。

    devfs rule -s 20 add major 53 group games

ルールセット 20 番にルールを追加します。 このルールセットは どこのマウントポイントのカレントルールセットにもなっていないので、 このルールが自動的に適用されることはありません (後でルールセット 20 番がどこかのマウントポイントの カレントルールセットになるまでは)。 それでも以下のようにして、明示的にルールを適用することができます:

    devfs -m /my/jail/dev rule -s 20 applyset

このコマンドではルールセット 20 番のすべてのルールを /my/jail/dev の DEVFS マウントに適用しています。 このときには、ルールセット 20 番がそのマウントポイントの カレントルールセットであるかどうかにかかわりなくルールが適用されます。

    devfs rule apply hide

このルールには条件部がありませんので、 (hide) アクションがすべてのノードに適用されます。 すべてのノードを非表示にするのはあまり便利ではありませんので、 下のようにして取り消すことができます:

    devfs rule apply unhide

このコマンドは unhide をすべてのノードに適用して、 再び表示されるようにしています。

    cat my_rules | devfs rule -s 10 add -

my_rules ファイルに書いてあるルールをすべてルールセット 10 番に追加します。

    devfs rule -s 20 show | devfs rule -s 10 add -

show コマンドの出力が有効なルールになっているので、 この機能を利用してルールセットをコピーすることができます。 上のコマンドでは、ルールセット 20 番のルールをすべて ルールセット 10 番にコピーしています。 ルール番号は予約されていますが、 ルールセット 10 番にはすでに 衝突しない番号のルールが入っています (その番号も予約されます)。

関連項目
chmod(1), jail(2), glob(3), devfs(5), chown(8), jail(8), mknod(8)

作者
Dima Dorfman