【2024年01月版】 /proc メモ 【中年エンジニアのためのLinuxメモ】

# はじめに

`/proc` って仮想ファイルシステムで、いろいろプロセス情報入ってる、ぐらいしかわからんから、調べてみる

# `/proc` とは

- Linuxの `/proc` ディレクトリは、特別な仮想ファイルシステム
- システムや実行中のプロセスに関する情報を含んでいる
- `/proc` は実際のファイルではなく、システムの現在の状態を反映した仮想ファイルとディレクトリを提供する
- FHS(Filesystem Hierarchy Standard) で定義されている

# `/proc` で公開されている情報

主に以下の情報が公開されている。

- プロセス情報
  - `/proc` 内の各数字名のディレクトリ
  - その番号に対応するプロセスの情報を含んでいる
  - 例えば、`/proc/1234` はプロセスID 1234の情報を持っている

- システム情報
  - システム全体の情報を公開している
  - 例えば、`/proc/meminfo` 、`/proc/cpuinfo` 、`/proc/mounts` などは、それぞれメモリ、CPU、マウントされたファイルシステムに関する情報を提供する

- 設定インターフェース
  - いくつかのファイルを通して、カーネルの動的な設定を参照したり、変更したりすることができる
  - 例えば、`/proc/sys` ディレクトリ内のファイルを通して、さまざまなカーネルパラメータを調整できる

- 実行中のカーネル情報
  - `/proc` は実行中のカーネルの状態に関する情報を公開している
  - 例えば、`/proc/interrupts` は割り込みに関する情報を、`/proc/version` はカーネルのバージョン情報を提供する

- リアルタイム情報
  - `/proc` ファイルシステムはリアルタイムで更新され、システムの現在の状態を反映している

## `/proc` で公開されている、プロセス情報

`/proc` ファイルシステム内のプロセス情報は、各実行中のプロセスに対応するディレクトリを通して提供される。これらのディレクトリはプロセスID（PID）で名付けられている。例えば、PIDが1234のプロセスの情報は `/proc/1234` ディレクトリに格納されている。このディレクトリ内には以下のようなファイルやサブディレクトリが含まる。

### `cmdline`

- プロセスが起動時に使用したコマンドライン引数

### `cwd`

- 現在の作業ディレクトリ（Current Working Directory）へのシンボリックリンク

### `environ`

- プロセスの環境変数

### `exe`

- プロセスを起動した実行可能ファイルへのシンボリックリンク

### `fd`

- ファイルディスクリプタのディレクトリで、プロセスによって開かれているすべてのファイルへのリンクが含まれる

### `maps`

- プロセスのメモリマップ情報が含まれる
- メモリアドレス、許可、オフセット、デバイス、および関連するファイルが含まれる

### `mem`

- プロセスのメモリへの直接アクセスを提供する

### `status`

- プロセスの状態に関する情報を簡潔にまとめたテキストファイルで、プロセスID、スレッド数、メモリ使用量などが含まれる

### `task`

- スレッドを表すサブディレクトリを含み、各スレッドに対する詳細情報が含まれる

## `/proc` で公開されている、プロセス情報

`/proc` ディレクトリには、システム全体の情報が含まれる。このディレクトリ内には以下のようなファイルやサブディレクトリが含まれる。

### `cpuinfo`

- システムのCPUに関する詳細な情報が含まれる
- プロセッサのタイプ、モデル、MHz、キャッシュサイズなどが含まれる

### `meminfo`

- メモリの状態に関する情報が含まれる
- 使用可能なRAM、フリーメモリ、スワップスペースなどの情報が含まれる

### `mounts`

- 現在システムにマウントされているファイルシステムのリストが含まれる

### `partitions`

- ディスク上のパーティションのリストと、それぞれのパーティションサイズの情報が含まれる

### `uptime`

- システムが起動してからの時間（秒単位）と、アイドル状態の時間が含まれる

### `version`

- カーネルのバージョン、コンパイル日時、コンパイラのバージョンなどが含まれる

### `filesystems`

- システムがサポートするファイルシステムのタイプのリストが含まれる

### `net`

- ネットワークインターフェースやプロトコルに関する詳細な情報が含まれる

### `sys`

- カーネルパラメータを調整するためのファイルが含まれる

## `/proc` で公開されている、設定インターフェイス

`/proc` ファイルシステムには、システムの設定を確認したり変更したりするためのインターフェイスが含まれる。主に`/proc/sys` ディレクトリを通じて提供される。システムの動的なカーネルパラメータを管理するために使用される。`/proc/sys` 内のファイルやディレクトリは、システムの様々な側面を制御する。

ファイルは通常テキスト形式。値を読み取るためにはファイルを開いて内容を表示する。値を変更するには、新しい値をファイルに書き込むことで行う。これらの操作は通常root権限が必要。`sysctl` コマンドを使用して、これらのパラメータをより簡単に管理することができる。このコマンドは `/proc/sys` にあるパラメータを読み書きするための専用のインターフェイスを提供している。

このディレクトリ内には以下のようなファイルやサブディレクトリが含まれる。

### net

- ネットワーク設定に関連するカーネルパラメータが含まれる
- 例えば、TCPのタイムアウト設定、IP転送設定などが含まれる

### vm

- 仮想メモリシステムの動作を制御するパラメータが含まれる
- 例えば、スワップの動作、ページキャッシュのサイズなどが調整可能

### fs

- ファイルシステム関連のパラメータが含まれる
- ファイルハンドルの数、inodeキャッシュの設定などが調整可能

### kernel

- カーネル自体の動作に影響を与える設定が含まれる
- プロセスの最大数、コアダンプの動作などを制御可能

## `/proc` で公開されている、実行中のカーネル情報

`/proc` ファイルシステムには、実行中のLinuxカーネルに関する情報が含まれる。これらの情報は、システムのカーネルに関する重要なデータを提供する。システム管理やトラブルシューティングに役立つ。このディレクトリ内には以下のようなファイルやサブディレクトリが含まれる。

### `version`

- カーネルのバージョン情報が含まれる
- カーネルがビルドされた日付、コンパイラのバージョン、カーネルをビルドした人の情報などが含まれる

### `cmdline`

- システム起動時にカーネルへ渡されたコマンドライン引数が含まれる

### `config.gz`

- カーネルがビルドされたときの設定オプションが含まれる
- すべてのカーネルオプションと、それらがどのように設定されたかが含まれる

### `interrupts`

- システム上の各割り込み要求（IRQ）ラインの割り込み回数を示している
- ハードウェアデバイスがどの程度システムリソースを使用しているかが含まれる

### `meminfo`

- システムのメモリ使用状況に関する詳細な情報が含まれる
- 使用可能なRAM、使用中のRAM、スワップスペースなどの情報が含まれる

### `modules`

- 現在ロードされているカーネルモジュールのリストが含まれる
- 各モジュールの名前、サイズ、使用しているリソース（例えば、使用中のデバイスや依存関係）が含まれる

## `/proc` で公開されている、リアルタイム情報

`/proc` ファイルシステムは、システムのリアルタイム情報を提供する。実際には物理的なディスク上に存在せず、カーネルとそのサブシステムの現在の状態を反映した仮想ファイルとして動的に生成される。システムのリアルタイムの状況を把握することが可能。このディレクトリ内には以下のようなファイルやサブディレクトリが含まれる。

### CPUとメモリの使用状況

- `/proc/meminfo`、`/proc/cpuinfo`、`/proc/loadavg`などは、現在のCPUとメモリの使用状況に関する情報をリアルタイムで提供する

### プロセス情報

- `/proc/[pid]/`ディレクトリには、各プロセスの現在の状態、メモリ使用量、オープンしているファイルなどの詳細が含れ、これらはプロセスが実行されている間常に更新される

### ネットワーク状態

- `/proc/net/`ディレクトリ内のファイルは、アクティブなネットワーク接続、ルーティングテーブル、各種ネットワークインターフェイスの統計など、ネットワークのリアルタイム状態を含む

### デバイスとドライバの状態

- `/proc/interrupts`、`/proc/ioports`、`/proc/dma`などは、ハードウェア割り込み、I/Oポートの使用状況、DMAチャネルの割り当てなど、システムのデバイスとドライバの現在の状態を含む

# /proc を使ったトラブルシューティング
以下のトラブルシューティングなどができるが、専用コマンドを使う方が楽かも。

## メモリの使用状況の確認

`/proc/meminfo` を使用して、システムのメモリ使用状況を確認できる。メモリリークや過剰なメモリ使用を特定することに役立つ。

## CPU使用状況の確認

`/proc/cpuinfo` や `/proc/loadavg` を使用して、CPUの性能や負荷状況を確認できる。システムが過負荷になっていないかを判断するのことに役立つ。

## プロセスの詳細情報の取得

`/proc/[pid]/` ディレクトリには、特定のプロセスに関する詳細情報が含まれる。リソースの使用状況やプロセスの状態を確認できる。

## システムの稼働時間と負荷の確認

`/proc/uptime` と `/proc/loadavg` を使用して、システムがどのくらいの期間稼働しているか、現在の負荷はどの程度かを確認できる。

## ネットワークの問題診断

`/proc/net/`内のファイルを利用して、ネットワークインターフェースの統計情報や、アクティブなネットワーク接続、ルーティング情報などを確認できる。

## デバイスとドライバの問題診断

`/proc/interrupts`、`/proc/ioports`、`/proc/dma` などのファイルを確認することで、ハードウェアの割り込みやリソースの使用状況を把握し、デバイスの問題を診断できる。

# 参考リンク

[Wikipedia procfs](https://ja.wikipedia.org/wiki/Procfs)
[man proc](https://man.archlinux.org/man/proc.5.en)
[Filesystem Hierarchy Standard](https://www.pathname.com/fhs/)

# さいごに

さくっと理解しておきたい