🐧 Linux 総合学習プラットフォーム
OS内部/起動の仕組み ・ 上級

/proc 疑似ファイルシステム

/proc はディスク上に実体を持たない疑似ファイルシステムで、カーネルが保持する情報をファイルのように見せてくれます。/proc/cpuinfo でCPUの詳細、/proc/meminfo でメモリの状況、/proc/version でカーネルのバージョン文字列を確認できます。数字のディレクトリ(例 /proc/1)は各プロセスに対応し、その内部からコマンドライン引数や開いているファイルなどを覗けます。cat で読むだけでカーネル内部の状態を観察できるため、専用ツールがない環境でも調査の足がかりになります。

Linuxを触っていると、/proc という不思議なディレクトリに出会う。一見ふつうのフォルダのように見える。cd で入れるし ls で中身も見られる。

だが、その正体はディスク上に実体を持たない疑似ファイルシステム(仮想ファイルシステム)で、procfs とも呼ばれる。

🔗
たとえディスクに保存された書類ではなく、のぞくたびに係員がその場で書いて手渡してくれる伝票のようなものだ。読んだ瞬間の値が返る。

ここに並んでいるファイルは、ハードディスクやSSDのどこかに保存されているわけではない。読もうとした瞬間にカーネルがその時点の情報を生成して返してくれる、いわば「カーネル内部へのぞき窓」だ。

あなたcat /proc/.../procのぞき窓(ディスク実体なし)カーネル内部の状態読んだ瞬間にカーネルが今の値を生成して返す

その証拠に、/proc/meminfo を読むたびに中身(空きメモリ量など)が変わる。カーネルが頭の中に持っている状態を、ファイルという誰もが知っている形に見せてくれる。これがprocfsの考え方である。

📊 専用コマンドなしでシステムの状態を読む

/proc の直下には、システム全体に関する情報ファイルが多数ある。代表的なものを挙げる。

cat /proc/cpuinfo でCPUの詳細、cat /proc/meminfo でメモリの状況、cat /proc/version でカーネルのバージョン文字列が表示される。

cat /proc/cpuinfo でCPUのモデル名・コア数・対応機能などの詳細が、cat /proc/meminfo で総メモリ量・空き容量・キャッシュの状況などが、cat /proc/version でカーネルのバージョン文字列が、それぞれ表示される。

たとえば /proc/version の出力には、カーネルのリリース番号やコンパイルされた日時、使われたコンパイラのバージョンまで含まれている。この /proc/version は、コマンドの uname が返すのと同じカーネルバージョンを、より生に近い形で見せてくれるもので、両者は表裏の関係にある。

ほかにも便利なファイルが揃っている。システムが起動してからの経過時間を秒で示す /proc/uptime、現在のロードアベレージを示す /proc/loadavg、起動時にカーネルへ渡された起動パラメータを示す /proc/cmdline、マウント中のファイルシステム一覧を示す /proc/mounts などだ。専用コマンドを使わなくてもcat一発でシステムの状態を把握できる。

たとえばCPUの論理コア数だけを知りたいなら、/proc/cpuinfo を cat して「processor」で始まる行を数える、といった使い方もできる。専用コマンドがなくても必要な数字を取り出せるわけだ。

🔢 数字だけの名前のディレクトリの正体

/proc の中を ls すると、cpuinfo のような名前のファイルに混じって、1 や 1234 のような数字だけの名前のディレクトリがずらりと並んでいる。

💡
ポイント数字だけのディレクトリは、稼働中プロセスの PID に対応する。/proc/1 は PID 1、すなわち systemd(init)のディレクトリだ。

この数字は、それぞれ稼働中のプロセスの PID(プロセス番号)に対応している。つまり「1プロセスにつき1つのディレクトリ」が用意され、そのプロセスの詳しい情報が中に格納されているのだ。たとえば /proc/1 は PID 1、すなわち systemd(init)のディレクトリである。

システム全体の情報cpuinfomeminfoversion= ファイル1プロセス = 1ディレクトリ/proc/1 (systemd)/proc/1234... PID ごと= 数字のディレクトリ/proc にはシステム情報ファイルとPIDディレクトリが同居する

各プロセスのディレクトリの中を見ると、そのプロセスを起動したコマンドライン引数(cmdline)、実行ファイルへのリンク(exe)、現在の作業ディレクトリへのリンク(cwd)、開いているファイル一覧(fd ディレクトリ)、メモリやスケジューリングの統計(status)などを覗ける。

コツあるプロセスがどのファイルを開いているか調べたいときは ls -l /proc/PID/fd を見る。PID 直下のディレクトリから一段深い調査ができる。

あるプロセスがどのファイルを開いているか調べたいとき、ls -l /proc/PID/fd を見る、といった調査がここから可能になる。

✍ 書き込むとカーネルの挙動が変わる

/proc は読むだけの場所だと思われがちだ。ところが、一部は書き込みによってカーネルの挙動を変えることもできる。

/proc/sys/net/ipv4/ip_forward に 1 を書き込むとIPフォワーディングが有効になり、Linuxをルータのように振る舞わせる第一歩になる。

とくに /proc/sys 以下には、カーネルの動作パラメータが多数ぶら下がっている。たとえば /proc/sys/net/ipv4/ip_forward に 1 を書き込むとIPフォワーディング(パケット転送)が有効になり、Linuxをルータのように振る舞わせる第一歩になる。

同様に /proc/sys/vm 以下にはメモリ管理の調整つまみが、/proc/sys/kernel 以下にはホスト名(hostname)など基本的な設定が並んでいる。

つまずき/proc/sys へ直接書いた変更は再起動で消える。恒久化したいなら sysctl コマンドや /etc/sysctl.conf を使うのが本来の作法だ。

ただし注意したい。こうしたファイルへ直接書き込んだ変更は再起動すると消えてしまうため、恒久的に設定したい場合は sysctl コマンドや /etc/sysctl.conf を使うのが本来の作法だ。

sysctl は内部的にこの /proc/sys を読み書きしているだけなので、両者は同じものを別の入り口から触っている、と理解しておくと混乱しない。/proc/sys を直接いじるのは、その場で挙動を試す一時的な手段、と位置づけておくとよい。

🛠 top や ps が下で読んでいるもの

よくある誤解は、/proc を「ふつうのファイルが置かれたディレクトリ」だと思い込むことだ。ここにあるのはディスク上のファイルではなくカーネルが動的に作る情報なので、サイズが 0 と表示されたり、削除やコピーが意味をなさなかったりする。

また、procfs はあくまでプロセスやシステム全体の状態を扱う場所であり、ハードウェアデバイスの構造そのものは次のトピックで扱う /sys(sysfs)の担当だ。両者は役割が分かれている。

実務では、監視ツールやコマンドが入っていない最小構成の環境(組込みやコンテナなど)で、cat だけでCPU・メモリ・カーネルバージョン・稼働プロセスを確認できるのが大きな強みになる。

💡
ポイントtop や ps、free も、内部では /proc を読んで表示を組み立てている。これらは /proc を人間に読みやすく整形した皮にすぎない。

実際、top や ps、free といったおなじみのコマンドも、内部ではこの /proc を読み取って表示を組み立てている。言い換えれば、これらのコマンドは /proc の情報を人間に読みやすく整形してくれる便利な皮であって、その下では誰もが cat で読める同じ情報が動いているのだ。

困ったときにまず /proc/cpuinfo や /proc/meminfo を覗く。この習慣をつけておけば、どんな環境でも調査の足がかりを失わない。

この項目に出てくる用語

procfs (/proc)ぷろっくえふえす
ディスクに実体を持たない疑似ファイルシステム。カーネルやプロセスの情報をファイルとして見せる。
カーネルかーねる
OSの中核。ハードウェアとソフトウェアの間に立ち、メモリ・プロセス・デバイスを管理する。

関連コマンド

catuname

▶ 学習アプリでこの続きを学ぶ・演習する