舞台裏への入り口:なぜSysAdminは/procと/sysを知る必要があるのか?
SysAdminになりたての頃、私は不思議に思っていました。topやfree -m、lscpuといったコマンドはどうやってあんなに素早くデータを取得しているのだろうか?と。これらはハードディスクをスキャンしているわけではありません。後にカーネル(Kernel)を深く掘り下げていくうちに、Linuxには非常に優れた仕組みがあることを知りました。それが、仮想ファイルシステム(Virtual Filesystems)です。
Linuxにおいて、「すべてはファイルである(Everything is a file)」という哲学が最も明確に表れているのが、/procと/sysという2つのディレクトリです。これらはSSDやHDDの容量を消費しません。実際には RAM上に存在し、ユーザーと対話するための架け橋としてカーネルによって作成されます。
私は現在、メモリ4GBという控えめなスペックのUbuntu 22.04サーバークラスターを管理しています。システムが過負荷になった際、重い監視ツールをインストールするのを待つよりも、これらのファイルに直接アクセスする方がはるかに高速です。これは、サーバーがネットワークの輻輳やI/Oのハングアップに見舞われた際の「救命」スキルとなります。
クイックチェック:システムの準備はできていますか?
これらはカーネルに組み込まれているため、apt installなどで何かをインストールする必要はありません。Linuxが起動すると、カーネルは自動的にこれらをシステムにマウントします。
確認のためにmountコマンドを入力してみてください:
mount | grep -E "proc|sysfs"
次のような結果が表示されるはずです:
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
興味深い点: ls -lを使用すると、これらのファイルのサイズが0バイトであることがわかります。しかし、catを使用すると、膨大な量のデータが表示されます。これは、カーネルがファイル読み取りを要求された瞬間にのみデータを生成するためです。
実践:内部に秘められたパワーを探る
1. /procディレクトリ – プロセスの「戸籍抄本」
/procディレクトリ(process of 略)には、実行中のプロセスやシステムリソース全般に関する情報が格納されています。
ハードウェアの超高速チェック:
他のコマンドの複雑なフラグを覚える代わりに、私はよく元のファイルを直接読み取ります:
# CPUのモデル、キャッシュ、コア数の詳細を表示
cat /proc/cpuinfo
# RAMの状態を表示(freeコマンドより詳細、特にDirty pagesセクション)
cat /proc/meminfo
特定のプロセスを「覗き見る」:
実行中の各アプリケーションには、PID(プロセスID)に基づいた専用のディレクトリが割り当てられます。例えば、PID 1234のプロセスの実行ファイルがどこにあるかを知るには、次のようにします:
ls -l /proc/1234/exe
そのプロセスが使用している環境変数(Environment Variables)を確認したい場合は、次を試してください:
strings /proc/1234/environ
カーネルランタイムへの介入:/proc/sysディレクトリを使用すると、再起動なしでシステムの動作を変更できます。例えば、サーバーをルーターとして機能させるためにIPフォワーディングを有効にするには:
echo 1 > /proc/sys/net/ipv4/ip_forward
2. /sysディレクトリ – ハードウェアの詳細マップ
/procが歴史的な経緯から少し乱雑であるのに対し、/sys(sysfs)はより整理されて設計されています。バス、ドライバー、デバイスごとに明確に分類されています。
物理接続の確認:
ネットワークカード eth0 が接続されているかどうかを確認するために、サーバーのLEDを見る必要はありません:
cat /sys/class/net/eth0/carrier
# 1は接続中、0は信号なしを意味します。
LinuxノートPC向けのヒント:
ファンクションキーが故障しても、ドライバーに直接値を書き込むことで画面の明るさを調整できます:
echo 400 > /sys/class/backlight/intel_backlight/brightness
最適化:自分専用の監視ツールを自作する
重いエージェントをインストールする代わりに、私はよくシェルスクリプトを使って/procからデータを読み取ります。この方法は非常に軽量で、古いシステムでも安全です。
以下は、ロードアベレージ(1分、5分、15分の平均負荷)と空きメモリを監視するスクリプトです:
#!/bin/bash
while true; do
load=$(cat /proc/loadavg | awk '{print $1, $2, $3}')
mem_free=$(grep MemFree /proc/meminfo | awk '{print $2 " " $3}')
echo "[$(date +%T)] システム負荷: $load | 空きメモリ: $mem_free"
sleep 5
done
実体験から: サーバーがI/O待ち(Disk Wait高)でハングアップした際は、/proc/diskstatsを確認してください。ここの数値は一見ぶっきらぼうに見えますが、iostatコマンドも実際にはここからデータを取得し、見やすいように整形しているだけなのです。
特に、設定ミスでSSHが遮断されたもののコンソールアクセスが可能な場合は、/proc/sysrq-triggerを介してMagic SysRq Keyを使用してください。これにより、電源を突然切る代わりに、ファイルシステムの破損を避けて安全にサーバーを再起動できます:
# 緊急だが安全な再起動信号を送信
echo b > /proc/sysrq-trigger
/procと/sysを理解することで、Linuxは謎めいた「ブラックボックス」から透明なシステムへと変わります。すべてのパラメータがあなたの手の中にあります。真のDevOpsエンジニアを目指すなら、時間をかけてこれら2つのディレクトリを「いじって」みてください。どんな理論書よりも多くのことを学べるはずです。

