Procfs

procfsは、Process Filesystem の略で、Unix系システムにある擬似ファイルシステム。主にプロセスに関するカーネル情報にアクセスする手段を提供する。procfs は実際のファイルシステムではないので、ディスクスペースを消費しないし、メモリもごくわずかしか消費しない。

通常、procfs は立ち上げ時に /proc ディレクトリにマウントされる。Solaris、BSD、Linux、AIX、QNXなどでサポートされ、特にLinuxではプロセス関連以外のデータにも拡張されている。procfs は機能をカーネルモードからユーザーモードに移すことに重要な役割を果たしている。例えば GNUプロジェクト版の psコマンドは全てのデータを procfs から得ており、特別なシステムコールを使用しない。

1. 歴史
-----

Tom J. Killian は Version 8 Unix 上に /proc を実装し、1984年6月、USENIXで //Processes as Files// という題の論文を発表した。これは、プロセスのトレースを行う //ptrace// システムコールを置き換える目的で設計された。

Roger Faulkner と Ron Gomes は V8 /proc を SVR4 に移植し、1991年1月、USENIX で //The Process File System and Process Model in UNIX System V// という論文を発表した。この procfs は psコマンドの実装に使える程度の機能を有するようになったが、procfs内のファイルには read、write、ioctl といったシステムコールしか使えなかった。

Plan 9で実装された procfs は V8 のものよりずっと進化していた。V8 の procfs では、あるプロセスに関する機能はひとつのファイルへの操作で実現されていた。Plan 9 は、それを複数のファイルに機能毎に分割し、procfs をよりファイルシステムらしくした。

4.4BSDで実装された procfs はプロセス毎のサブディレクトリがあり、プロセスのメモリ、レジスタ、現在ステータスにアクセスすることができた。Solaris 2.6 の procfs もプロセス毎のディレクトリがあり、制御用の //ctl// ファイルが用意され、トレースやプロセス毎の操作ができるようになっていた。

2. Linux
--------

Linux では、procfs は動作中プロセスに関する情報を /proc///PID// というディレクトリで提供し、以下のような情報を提供する。

/proc///PID///cmdline - そのプロセスを起動した際のコマンド行文字列
/proc///PID///cwd - そのプロセスのカレントディレクトリへのシンボリックリンク
/proc///PID///environ - そのプロセスの設定している環境変数とその中身
/proc///PID///exe - 元々の実行ファイルへのシンボリックリンク
/proc///PID///fd - オープンしているファイル記述子に対応したシンボリックリンク群のあるディレクトリ
/proc///PID///fdinfo - オープンしているファイル記述子に対応したファイルの位置やフラグを記したファイル群があるディレクトリ
/proc///PID///root - そのプロセスにとってのルートディレクトリへのシンボリックリンク。通常は / だが、chrootしている場合は異なる。
/proc///PID///stat - プロセスの状態についての情報
/proc///PID///status - プロセスの動作状態やメモリ使用状況についての基本情報
/proc///PID///task - そのプロセスを親プロセスとしている全プロセスへのハードリンクを格納したディレクトリ
/proc///PID///maps - そのプロセスの仮想アドレス空間のマッピング状況特定のプロセスのPIDは、pgrep、pidof、ps といったユーティリティで得られる。

$ ls -l /proc/$/fd # 最近起動された `python' というプロセスの全ファイル識別子を一覧表示 samtala 0 lrwx------ 1 baldur baldur 64 2011-03-18 12:31 0 -> /dev/pts/3 lrwx------ 1 baldur baldur 64 2011-03-18 12:31 1 -> /dev/pts/3 lrwx------ 1 baldur baldur 64 2011-03-18 12:31 2 -> /dev/pts/3 $ readlink /proc/$/exe # 最近起動された `python' というプロセスの実行ファイルのパス名を表示 /usr/bin/python3.1

procfs では個々のプロセスとは直接関係しないシステム情報も提供するが、Linuxカーネル 2.6 では大部分が別の擬似ファイルシステム //sysfs// に分離移動されている。

/proc/acpi または /proc/apm - パワーマネジメント関連情報
/proc/buddyinfo - バディブロック・アルゴリズムに関する情報
/proc/bus - PCI/USBなどの情報。/sys/bus の方が情報が豊富。
/proc/fb - 利用可能なフレームバッファの一覧
/proc/cmdline - カーネルに渡されたブートオプション文字列
/proc/cpuinfo - CPUに関する情報。BogoMipsの値もあるが、実際の性能を反映しているとは言えない。
/proc/devices - メジャーデバイス番号とデバイスグループの一覧
/proc/diskstats - 各論理ディスクデバイスの統計情報
/proc/filesystems - カーネルがサポートしているファイルシステムの一覧
/proc/interrupts, /proc/iomem, /proc/ioports, /proc/irq - 各種システム資源についての詳細情報
/proc/meminfo - メモリ使用状況の概要情報
/proc/modules - 現在ロードされているカーネルモジュールに関する情報
/proc/mounts - 現在マウントされているデバイスとマウントポイントの一覧
/proc/net - ネットワークのプロトコルスタックに関する情報
/proc/partitions - 存在するパーティションについての各種情報
/proc/scsi - SCSIまたはRAIDコントローラで接続されているデバイスに関する情報
/proc/self - 現在動作中のプロセスの /proc///PID/// へのシンボリックリンク
/proc/swaps - 使用中のスワップ領域の一覧
/proc/sys - 動的に変更可能なカーネルオプションへのアクセスを提供。
/proc/sysvipc - 共有メモリなどIPCに関する情報
/proc/tty - 端末に関する情報
/proc/uptime - システム起動からの時間とアイドル状態だった時間
/proc/version - カーネルのバージョン番号、gccのバージョン番号などprocfs を使用する Linux 上のユーティリティは procps パッケージに収められており、利用するには procfs が /proc にマウントされていなければならない。

3. *BSD
-------

FreeBSD 及び OpenBSD ではデフォルトで procfs はマウントされない。
NetBSD 及び DragonFlyBSD ではマウントされるが、ファイル構造が異なる。

4. 脚注
-----

5. 参考文献
-------

[1] - 最初のprocfs
[2] - Plan 9 で拡張されたprocfs
[3] Linux のprocfsのマニュアル
[4] procfs についてのLinuxカーネル文書

6. 外部リンク
--------

[5] Eric Schrock's Weblog
[6] An IBM developerWorks article by M. Tim Jones
[7] Linux Documentation Project
[8]
[9] An article by Pétur I. Egilsson