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

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

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

Linuxを触っていると、/proc という不思議なディレクトリに出会います。一見ふつうのフォルダのように見えて、cd で入れますし ls で中身も見られますが、その正体はディスク上に実体を持たない疑似ファイルシステム(仮想ファイルシステム)です。procfs とも呼ばれます。ここに並んでいるファイルは、ハードディスクやSSDのどこかに保存されているわけではなく、読もうとした瞬間にカーネルがその時点の情報を生成して返してくれる、いわば『カーネル内部へのぞき窓』です。だから /proc/meminfo を読むたびに中身(空きメモリ量など)が変わります。カーネルが頭の中に持っている状態を、ファイルという誰もが知っている形に見せてくれる——これがprocfsの考え方です。

システム全体の情報を読む

/proc の直下には、システム全体に関する情報ファイルが多数あります。代表的なものを挙げると、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』で始まる行を数える、といった使い方もでき、専用コマンドがなくても必要な数字を取り出せます。

数字のディレクトリ — 1プロセス1ディレクトリ

/proc の中を ls すると、cpuinfo のような名前のファイルに混じって、1 や 1234 のような数字だけの名前のディレクトリがずらりと並んでいます。この数字は、それぞれ稼働中のプロセスの PID(プロセス番号)に対応しています。つまり『1プロセスにつき1つのディレクトリ』が用意され、そのプロセスの詳しい情報が中に格納されているのです。たとえば /proc/1 は PID 1、すなわち systemd(init)のディレクトリです。各プロセスのディレクトリの中を見ると、そのプロセスを起動したコマンドライン引数(cmdline)、実行ファイルへのリンク(exe)、現在の作業ディレクトリへのリンク(cwd)、開いているファイル一覧(fd ディレクトリ)、メモリやスケジューリングの統計(status)などを覗けます。あるプロセスがどのファイルを開いているか調べたいとき、ls -l /proc/PID/fd を見る、といった調査がここから可能になります。

/proc から書き込んで挙動を変える(/proc/sys)

/proc は読むだけの場所だと思われがちですが、一部は書き込みによってカーネルの挙動を変えることもできます。とくに /proc/sys 以下には、カーネルの動作パラメータが多数ぶら下がっています。たとえば /proc/sys/net/ipv4/ip_forward に 1 を書き込むとIPフォワーディング(パケット転送)が有効になり、Linuxをルータのように振る舞わせる第一歩になります。同様に /proc/sys/vm 以下にはメモリ管理の調整つまみが、/proc/sys/kernel 以下にはホスト名(hostname)など基本的な設定が並んでいます。ただし、こうしたファイルへ直接書き込んだ変更は再起動すると消えてしまうため、恒久的に設定したい場合は sysctl コマンドや /etc/sysctl.conf を使うのが本来の作法です。sysctl は内部的にこの /proc/sys を読み書きしているだけなので、両者は同じものを別の入り口から触っている、と理解しておくと混乱しません。/proc/sys を直接いじるのは、その場で挙動を試す一時的な手段、と位置づけておくとよいでしょう。

よくある誤解と実務の使いどころ

よくある誤解は、/proc を『ふつうのファイルが置かれたディレクトリ』だと思い込むことです。ここにあるのはディスク上のファイルではなくカーネルが動的に作る情報なので、サイズが 0 と表示されたり、削除やコピーが意味をなさなかったりします。また、procfs はあくまでプロセスやシステム全体の状態を扱う場所であり、ハードウェアデバイスの構造そのものは次のトピックで扱う /sys(sysfs)の担当です——両者は役割が分かれています。実務では、監視ツールやコマンドが入っていない最小構成の環境(組込みやコンテナなど)で、cat だけでCPU・メモリ・カーネルバージョン・稼働プロセスを確認できるのが大きな強みです。実際、top や ps、free といったおなじみのコマンドも、内部ではこの /proc を読み取って表示を組み立てています。言い換えれば、これらのコマンドは /proc の情報を人間に読みやすく整形してくれる便利な皮であって、その下では誰もが cat で読める同じ情報が動いている、ということです。困ったときにまず /proc/cpuinfo や /proc/meminfo を覗く習慣をつけておくと、どんな環境でも調査の足がかりを失いません。

この項目に出てくる用語

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

関連コマンド

catuname

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