/procと/sysを使いこなす:サードパーティツールを使わずにLinuxを「内視」する方法

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

舞台裏への入り口:なぜSysAdminは/procと/sysを知る必要があるのか?

SysAdminになりたての頃、私は不思議に思っていました。topfree -mlscpuといったコマンドはどうやってあんなに素早くデータを取得しているのだろうか?と。これらはハードディスクをスキャンしているわけではありません。後にカーネル(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つのディレクトリを「いじって」みてください。どんな理論書よりも多くのことを学べるはずです。

Share: