Chapter 12. devfs 擬似ファイルシステム

devfs の中核的なドキュメントは、W5を参考にしてく ださい。 SCSI サブシステムにおける devfs の命名規則の概要は、 Section 3.3にあります。 devfs は、カーネル構築オプションの CONFIG_DEVFS_FS で選択します。 ブート時に(/dev として)マウントされるかどうかは、 カーネル構築オプションの CONFIG_DEVFS_MOUNT で決まります。 後者のオプションは、カーネルブート時のオプションである「devfs=mount」 もしくは「devfs=nomount」の好きな方どちらによっても変更できます。

devfs の SCSI ノード名と、デフォルトのパーミッションは下記の通りです。

disc        rw-------   whole disk including mbr
part1       rw-------   first partition {...p1}
...
part15      rw-------   15th partition {...p15}
cd          rw-rw-rw-   cd or dvd devices
mt          rw-rw-rw-   tape mode 0 with rewind {...m0}
mtl         rw-rw-rw-   tape mode 1 with rewind {...m1}
mtm         rw-rw-rw-   tape mode 2 with rewind {...m2}
mta         rw-rw-rw-   tape mode 3 with rewind {...m3}
mtn         rw-rw-rw-   tape mode 0 with no rewind {...m0n}
mtln        rw-rw-rw-   tape mode 1 with no rewind {...m1n}
mtmn        rw-rw-rw-   tape mode 2 with no rewind {...m2n}
mtan        rw-rw-rw-   tape mode 3 with no rewind {...m3n}
generic     rw-r-----

これらのノード名は、対応しているデバイス(もしくはデバイスのサブエントリー (例えばパーティション))とドライバが存在する時にだけ現れます。例えば sg ドライバがなければ「汎用」デバイス名は存在しません。上記の {}中の文字列は、下記で説明する「c0b0t0u0」という簡略表記の後ろに適宜追加 されます。

ブロックスペシャルファイルやキャラクタスペシャルファイルになっている devfs ファイル名を、ここではプライマリデバイス名と呼びます。devfs のデーモン devfsd は、これらのプライマリデバイス名に対してたくさんの シンボリックリンクを張っています。これは下位互換性と利便性のためです。 これらのシンボリック・リンクは、セカンダリデバイス名と呼びます。

セカンダリデバイス名は、devfsd の設定ファイルで制御されます。設定ファイル は通常 /etc/devfsd.conf です。デフォルトの devfsd.conf ファイルを使うと、セカンダリデバイス名は下記のリストになります。


セカンダリ名         プライマリデバイス名へのシンボリックリンク
--------------------------------------------------------------
/dev/sda             /dev/scsi/host0/bus0/target2/lun0/disc
/dev/sda1            /dev/scsi/host0/bus0/target2/lun0/part1
/dev/sd/c0b0t2u0     /dev/scsi/host0/bus0/target2/lun0/disc
/dev/sd/c0b0t2u0p1   /dev/scsi/host0/bus0/target2/lun0/part1
/dev/sr0             /dev/scsi/host0/bus0/target4/lun0/cd
/dev/sr/c0b0t4u0     /dev/scsi/host0/bus0/target4/lun0/cd
/dev/st0             /dev/scsi/host1/bus0/target0/lun0/mt
/dev/nst0a           /dev/scsi/host1/bus0/target0/lun0/mtan
/dev/st/c1b0t0u0m0   /dev/scsi/host1/bus0/target0/lun0/mt
/dev/st/c1b0t0u0m3n  /dev/scsi/host1/bus0/target0/lun0/mtan
/dev/sg0             /dev/scsi/host0/bus0/target2/lun0/generic
/dev/sg1             /dev/scsi/host0/bus0/target4/lun0/generic
/dev/sg2             /dev/scsi/host1/bus0/target0/lun0/generic
/dev/sg/c0b0t2u0     /dev/scsi/host0/bus0/target2/lun0/generic
/dev/sg/c0b0t4u0     /dev/scsi/host0/bus0/target4/lun0/generic
/dev/sg/c1b0t0u0     /dev/scsi/host1/bus0/target0/lun0/generic

SCSI CD-ROM 用として良く使われる /dev/scd0 系が サポートされていないことに気づきましたか。/dev/discs/dev/cdroms/dev/tapes といった、そのカテゴリに入るデバイスすべて(つまり、SCSI デバイスに限らない) に対するシンボリックリンクを集めたディレクトリも存在します。


セカンダリ名         プライマリデバイスへのシンボリックリンク
------------------------------------------------------------
/dev/discs/disc0     /dev/ide/host0/bus0/target0/lun0      *
/dev/discs/disc1     /dev/scsi/host0/bus0/target2/lun0     *
/dev/cdroms/cdrom0   /dev/ide/host0/bus1/target1/lun0/cd
/dev/cdroms/cdrom1   /dev/scsi/host0/bus0/target4/lun0/cd
/dev/tapes/tape0     /dev/scsi/host1/bus0/target0/lun0     *

「*」がついた項目は、プライマリデバイスがあるディレクトリです。 IDE(ATA)デバイスは SCSI デバイスの前にリストされます。これらセカンダリ デバイス名の永続性は、プライマリデバイス名と同じ規則に従います。 したがって、SCSI デバイス(?)もしくはその低レベルもしくは高レベルのドライバ が削除されると、対応していたプライマリ・セカンダリデバイス名も削除されます。

devfs が /dev でマウントしてある場合でも、 以前の /dev/sda6 もある状況下では利用できます。これは カーネルブート時に入力が必要な場合に便利でしょう。例えばユーザが「devfs」を 使っているマシンのルートパーティションを変更したい場合は、下記のブート時 オプションのいずれも使えます。

   root=/dev/sda6
   root=/dev/scsi/host0/bus0/target0/lun0/part6
   root=/dev/sd/c0b0t0u0p6

プログラムの中には、デバイスをスキャンする際に devfs 以前のデバイス名を 想定しているものがたくさんあります。それらのプログラムが devfs を 認識するまでにはしばらく時間がかかりるでしょう。 また、sg ドライバのロード (モジュールになっていて、まだロードされていない場合)を、(例えば) /dev/sg0のオープンによって行うようなプログラムも あります。これについては /etc/devfsd.conf の次の項目で調整できます。

        LOOKUP          sg.*            MODLOAD
そして /etc/modules.devfs は下記のようになります。

        probeall        /dev/sg         scsi-hosts sg
        alias           /dev/sg*        /dev/sg

sg デバイスのパーミッションは、/etc/devfsd.conf ファイル の項目で調整できます。

  REGISTER scsi/host.*/bus.*/target.*/lun.*/generic
                              PERMISSIONS 0.0 rw-rw-rw-
詳しくは、「man devfsd」を見てください。

アプリケーションから devfsd が動作中かどうかを判断するのに、 /dev/.devfsd の有無が使えます。

永続的なファイルシステム(例えば ext2)に基づく /dev ディレクトリの特徴のひとつ に、デバイスファイル名とパーミッションとを関係付け、それをブートとブートの間 にも維持する機能が挙げられます。上記で述べたように、devfs のデフォルトの動作 では、マシンがブートするごとにデバイスファイル名のパーミッションを割り当て ます。/etc/devfsd.conf の PERMISSION 動作をパーミッション 指定に使えますが、これは少々面倒だと思います。 devfs のドキュメント(W5)では、一石二鳥な方法を記述 されています。このテクニックは Linux カーネル 2.4 に最近追加された、複数の 場所に同じファイルシステムをマウントする機能によるものです。