/procと/sysによるカーネル情報の公開機構
topやpsが見ているのは実体のないファイル。procfsとsysfsはカーネル内部の状態を読み書きでそのまま操作できる窓口です。両者の実装と使い分けを原理から押さえれば、設定変更やデバッグの勘所がつかめます。
- 1.procfsもsysfsもディスクを持たない仮想ファイルシステムで、ファイルへのread/writeが実体データではなくカーネル内のコールバック関数を駆動する。catした瞬間に値が生成される。
- 2.procfsはプロセス(/proc/<pid>)とカーネル全体の雑多な情報を扱う歴史的な何でも置き場。sysfsはデバイス・ドライバ・バスの統一モデル(kobject階層)を1ファイル1属性の規律で公開する。
- 3.sysfsは原則1ファイル=1値・テキストという厳格な規約を持つのに対し、procfsは1ファイルに整形済みの複合情報を載せる。この設計差が両者の使い分けを決める。
procfsとsysfs:ディスクを持たないファイルシステム
cat /proc/cpuinfo や cat /sys/class/net/eth0/mtu が値を返すとき、ディスク上のどこかにそのファイルが保存されているわけではありません。procfs(/proc)と sysfs(/sys)は、ストレージを一切持たない 仮想ファイルシステム(疑似ファイルシステム) です。ファイルへの read や write は、ディスクブロックの転送ではなく、カーネル内のコールバック関数を呼び出す操作に変換されます。つまり cat した瞬間に、その時点のカーネル状態から値が生成されて返ります。
これが可能なのは、両者が VFS(仮想ファイルシステム)層 の操作テーブル(関数ポインタの集合)を埋めるだけで「ファイルの世界」に参加できるからです。open/read/write という システムコール はそのまま使え、相手がディスク上のファイルか、カーネル変数への窓口かをユーザー空間は意識しません。ls や cat、echo > ファイル といった既存のツールが、そのままカーネルの観測・制御インターフェースになる——これが「すべてはファイル」という Unix 哲学を内部状態の公開に適用した姿です。
ls -l /proc/cpuinfo はサイズ0と表示します。実体が無く、read の瞬間に内容が組み立てられるため、事前に確定したサイズが存在しないのです。stat で得られるサイズやタイムスタンプの多くは便宜的な値で、通常ファイルのメタデータとは意味が異なります。
procfs:プロセスとカーネルの「何でも置き場」
procfs は元来 プロセス(process)情報 を公開するために生まれました。/proc/<pid>/ 以下に、各プロセスの状態が並びます。
| パス | 公開する情報 |
|---|---|
| /proc/<pid>/status | 状態・UID・メモリ使用量などを整形したテキスト |
| /proc/<pid>/maps | 仮想アドレス空間のマッピング一覧 |
| /proc/<pid>/fd/ | 開いているファイルディスクリプタへのシンボリックリンク |
| /proc/<pid>/cmdline | 起動時の引数(NUL区切り) |
| /proc/meminfo, /proc/stat | システム全体のメモリ・CPU統計 |
ps や top の実装は、まさにこの /proc/<pid>/ を走査して情報を集めています。/proc/<pid>/fd/ がディスクリプタごとのシンボリックリンクとして見えるのは、ファイルディスクリプタ表 の中身を VFS のオブジェクトとして射影しているからです。
実装面では、procfs のファイルの多くは seq_file という仕組みの上に乗っています。read が来ると、登録された show 関数が呼ばれ、その場で行を組み立ててバッファへ流し込みます。値はディスクではなくカーネルのデータ構造(タスク構造体やグローバルカウンタ)から直接読み出されるため、常に最新です。/proc/sys/ 以下(sysctl)は書き込み可能で、echo 1 > /proc/sys/net/ipv4/ip_forward のような write がカーネル変数を更新するハンドラを起動します。
procfs の特徴は、1ファイルに整形済みの複合情報を載せる点にあります。/proc/meminfo は数十項目を人間が読める表として返し、/proc/<pid>/status も多数のフィールドを1ファイルに詰め込みます。便利な反面、機械的にパースしづらく、フォーマットが歴史的に増築されてきた経緯から 一貫した規約に欠ける——これが後発の sysfs を生む動機になりました。
本来プロセス情報のためのものが、/proc/cpuinfo・/proc/modules・/proc/interrupts のようにカーネル全般の情報まで引き受けるようになりました。デバイスやドライバの情報まで雑多に置かれた結果、構造が場当たり的になった反省が、デバイスモデル専用の sysfs 設計へつながっています。
sysfs:デバイスモデルを映す統一された木
sysfs は、Linux の デバイスモデル——デバイス・ドライバ・バス・クラスの関係——を、規律あるファイルツリーとして公開するために 2.6 系で導入されました。その背骨が kobject です。
kobject はカーネル内のオブジェクトに共通の「ハンドル」を与える基底構造で、参照カウント・名前・親へのリンクを持ちます。kobject 同士が親子リンクで木を成し、その木が そのまま sysfs のディレクトリ階層に対応します。つまり /sys を ls で辿る行為は、カーネル内 kobject グラフを歩くことと等価です。各ディレクトリ(kobject)にぶら下がる 属性(attribute) が個々のファイルになり、その show/store コールバックが読み書き時に呼ばれます。
kobject 階層 sysfs 上の見え方
bus:pci → /sys/bus/pci/
device 0000:00:1f.2 → /sys/bus/pci/devices/0000:00:1f.2/
attr "vendor" → .../vendor (read: show() が "0x8086\n" を生成)
attr "enable" → .../enable (write: store() がデバイスを有効化)
同じデバイスが複数の視点(どのバスに挿さっているか、どのクラスに属するか、ドライバは何か)から参照されるため、sysfs は シンボリックリンクを多用します。/sys/class/net/eth0 と /sys/devices/.../net/eth0 は同じ実体を別の切り口で指す、という構造です。デバイスモデルの全体像は デバイスドライバモデル で詳説しています。
sysfs の設計規約は厳格です。1つの属性ファイルは1つの値だけを、人間にもツールにも読めるテキストで表します。複数の値を1ファイルに詰めない、1回の read/write でページ(通常4KB)を超えない、というルールにより、cat/echo で安全に観測・設定できます。procfs の「1ファイルに山盛り」とは正反対の哲学です。
属性の読み書きがカーネル状態を橋渡しする仕組み
両者に共通する核心は、ファイル操作と関数呼び出しの橋渡しです。属性ファイルには show(読み出し)と store(書き込み)の2つのコールバックが結び付いています。
read("/sys/class/net/eth0/mtu"):
VFS が sysfs の read を呼ぶ
→ 属性に登録された show(kobj, buf) を実行
→ カーネル内の net_device->mtu を sprintf でテキスト化
→ ユーザー空間へ "1500\n" を返す
write("/sys/.../mtu", "9000"):
VFS が sysfs の write を呼ぶ
→ store(kobj, buf, len) を実行
→ "9000" を整数へ変換し、検証してから dev->mtu を更新(実デバイスへ反映)
ここで重要なのは、store が 単なる値の保存ではなく、副作用を伴うアクションになり得る点です。echo 9000 > .../mtu はファイルに文字列を書くのではなく、MTU を変更するというデバイス操作を引き起こします。/proc/sys/vm/drop_caches への書き込みがキャッシュ解放を実行するのも同じ原理で、ファイルへの write がコマンド実行と等価になっています。だからこそ、これらのファイルへの書き込み権限はカーネルへの制御権限そのものであり、慎重な権限管理が要ります。
ユーザー空間がこれらの変更を待ち受ける手段もあります。sysfs の属性は poll/select に対応し、値の変化で待機中のプロセスを起こせます(例:電源やネットワークの状態監視)。procfs/sysfs が単なる読み出し窓口でなく、イベント通知や制御の経路も兼ねていることがわかります。
sysfs は「1属性1値テキスト」という規約により ABI として比較的安定して扱われますが、procfs のテキスト整形は歴史的経緯で項目が増減し、フォーマット依存のパースが壊れることがあります。スクリプトで値を取る際は、列位置に依存せずキー名で引く、/proc/<pid>/stat のように括弧内にスペースを含む値(プロセス名)の扱いに注意する、といった防御が必要です。
設計上の使い分け:いつどちらを使うか
両者は似て非なる役割を持ちます。新しいインターフェースをどちらに置くべきかは、公開する情報の性質で決まります。
| 観点 | procfs (/proc) | sysfs (/sys) |
|---|---|---|
| 本来の対象 | プロセス情報+カーネル全般の雑多な状態 | デバイス・ドライバ・バスのモデル(kobject階層) |
| 1ファイルの粒度 | 複合・整形済み(多項目を1ファイル) | 原則1ファイル1値・テキスト |
| 階層の意味 | 歴史的・場当たり的 | kobject の親子関係をそのまま反映 |
| 主な書き込み | /proc/sys のカーネルパラメータ調整 | デバイス属性の設定・制御 |
| 新規追加の指針 | プロセス由来の情報に限る | デバイスモデルの属性はこちら |
実務上の指針はシンプルです。プロセスに固有の情報(/proc/<pid>/...)と歴史的に確立した sysctl は procfs に、デバイス・ドライバの属性は sysfs に置きます。新しいカーネル機能で「これは雑多な制御フラグだが procfs にも sysfs にも馴染まない」場合は、より自由度の高い debugfs(/sys/kernel/debug、デバッグ専用で ABI 安定性を保証しない)が選ばれることもあります。さらに、これらの仮想ファイルツリーは Linux名前空間とcgroups と連動し、PID 名前空間ごとに /proc の見え方が変わる(コンテナ内では自分の名前空間のプロセスしか見えない)など、隔離の文脈でも要となります。
(1)procfs/sysfs はディスクを持たず、read/write がコールバック(show/store)を駆動し、値はアクセス時に生成される。(2)procfs はプロセス情報+カーネル全般の「何でも置き場」で1ファイルに複合情報、sysfs はデバイスモデル(kobject 階層)を1ファイル1値テキストの規約で公開。(3)sysfs のディレクトリ木は kobject の親子関係をそのまま映す。(4)属性への write は値保存でなく副作用を伴うアクション(MTU 変更・キャッシュ解放など)。(5)/proc/sys は sysctl のインターフェース。この5点が頻出です。
まとめ
- procfs・sysfs はストレージを持たない仮想ファイルシステムで、ファイル操作が VFS 経由でカーネル内コールバックを呼び、値はアクセス時に生成される。
cat/echoがそのまま観測・制御の手段になる。 - procfs はプロセス(
/proc/<pid>)とカーネル全般の情報を扱う歴史的な何でも置き場で、1ファイルに整形済みの複合情報を載せる。ps/topの情報源であり、/proc/sysは sysctl の窓口。 - sysfs は kobject 階層に対応するデバイスモデルの木で、原則1ファイル1値・テキストという厳格な規約を持つ。
show/store属性が読み書きとカーネル状態を橋渡しし、writeは副作用を伴うアクションになる。 - 使い分けは公開情報の性質で決まる。プロセス情報は procfs、デバイス属性は sysfs、ABI を保証しないデバッグ用途は debugfs、が大まかな指針。
土台は VFS層 と システムコール、デバイスモデルの全体像は デバイスドライバモデル、コンテナでの見え方は Linux名前空間とcgroups を合わせて読むと、これらの「ファイルに見えるカーネル」がどこに位置するかが立体的に見えてきます。
OS Article
/procと/sysによるカーネル情報の公開機構を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
procfs
比較で見る軸
難易度: advanced / カテゴリ: OS / タグ数: 6
導入後に効く点
procfsはプロセス(/proc/<pid>)とカーネル全体の雑多な情報を扱う歴史的な何でも置き場。sysfsはデバイス・ドライバ・バスの統一モデル(kobject階層)を1ファイル1属性の規律で公開する。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- OS
- タグ数
- 6
判断チェックリスト
- 自社の用途が「procfs / sysfs」に近いか確認する。
- 強みである「procfsもsysfsもディスクを持たない仮想ファイルシステムで、ファイルへのread/writeが実体データではなくカーネル内のコールバック関数を駆動する。catした瞬間に値が生成される。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。