Linuxの/procと/sys:カーネルとハードウェアと直接対話する

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

実践:「すべてはファイルである」という原則

ほとんどのLinuxユーザーは、システムの健康状態を確認するために、まずtoplscpufree -mなどのコマンドを実行することから始めます。これらのツールは便利ですが、あくまで「ラッパー(包み紙)」に過ぎません。これらは特定のファイルからデータを読み取り、テキストを整形して表示しているだけなのです。最小構成のコンテナやレガシーな組み込みシステムで作業している場合、これらのバイナリが存在しないことさえあります。

Linuxでは、ほぼすべてのものをファイルとして扱います。これは単なるスローガンではなく、オペレーティングシステム全体の核となる設計原則です。/proc/sysディレクトリは仮想ファイルシステムです。これらはSSD上には存在しません。その代わり、カーネルメモリへのライブウィンドウとして機能し、ハードウェア、ドライバ、実行中のプロセスに対するリアルタイムのインターフェースを提供します。

私がこれらの仮想ファイルの活用に切り替えたのは、4GBのRAMしか積んでいないUbuntu 22.04インスタンスでパフォーマンスの限界に直面したときでした。数秒ごとにlscpuを起動するのは些細なことに思えるかもしれませんが、fork/execের 呼び出しはPIDとメモリサイクルを消費します。テキストファイルを直接読み取ることで、モニタリングスクリプトのCPUオーバーヘッドを約18%削減できました。高頻度の自動化において、より高速で軽量、かつ信頼性の高い手法です。

仮想ファイルシステムへのアクセス

/proc/sysは、aptdnfのようなパッケージマネージャでは見つかりません。これらはLinuxカーネルに直接組み込まれています。ただし、中身を見るにはマウントする必要があります。最近の主要なディストリビューションでは、起動時にsystemdを使用して自動的に処理されます。

現在のマウント状況を確認して、これらのファイルシステムが有効であることを検証します:

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)

もしこれらが見当たらない場合(カスタムのchroot環境ではよくあります)、次の2つのコマンドで手動マウントできます:

mount -t proc proc /proc
mount -t sysfs sysfs /sys

その仕組みとして、/proc(procfs)はプロセスデータとカーネル統計を処理します。一方、/sys(sysfs)は、USBバスから電力管理まで、デバイスモデルの構造化されたマップを提供します。

実行中のカーネルをチューニングする

多くのユーザーは、/proc/sysは読み取り専用だと思い込んでいますが、それは間違いです。ここにある多くのファイルは「チューナブル(調整可能)」です。新しい値を書き込むことで、再起動せずに即座にカーネルの動作を変更できます。

/proc/sys インターフェース

/proc/sysサブディレクトリには、微調整可能なパラメータが格納されています。例えば、Linuxルーターをセットアップする場合、IPフォワーディングを有効にする必要があります。複雑な設定ツールは忘れましょう。カーネルに直接伝えるだけです:

# 状態を確認(0 = 無効, 1 = 有効)
cat /proc/sys/net/ipv4/ip_forward

# 即座に有効化
echo 1 > /proc/sys/net/ipv4/ip_forward

メモリ負荷の管理も一般的なタスクです。サーバーがキャッシュを溜め込みすぎて動作が重く感じる場合は、安全にクリアできます:

# PageCache、dentry、inodeをクリアする
echo 3 > /proc/sys/vm/drop_caches

/sys を介したハードウェア管理

/sysディレクトリはハードウェアへの直通回線です。ラップトップの画面を暗くしたり、バッテリーのサイクル数を確認したりするには、/sys/classを調べます。サーバー環境では、CPUスケーリングガバナーを強制的にパフォーマンスモードにするために使用しています。

最初のCPUコアの現在のガバナーを確認します:

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

省電力よりも速度を優先するには、’performance’ に変更します:

echo "performance" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

これらの変更は揮発性であることに注意してください。再起動するとリセットされます。永続化させるには、/proc/sysのエントリにはsysctl.confを、/sys内のハードウェアにはUdevルールを使用してください。

リアルタイムメトリクスの抽出

直接的なファイルアクセスは、DevOpsエンジニアにとっての秘密兵器です。煩雑なCLI出力をスクレイピングする代わりに、単純な文字列操作ツールを使って生のデータを取得できます。

RAMとCPUの使用状況

/proc/meminfoファイルは、RAMデータに関する包括的な情報源です。特に利用可能なメモリが必要な場合は、grepを使用して正確な行を抽出します:

grep "MemAvailable" /proc/meminfo

CPUのアクティビティについては、/proc/statが累積カウンタを記録しています。「cpu」の行には、前回の起動以降にユーザー、システム、およびアイドル状態で費やされた時間が表示されます。私のスクリプトでは、リアルタイムの使用率を計算するために、このファイルを1秒の間隔を空けて2回読み取っています。

プロセスの調査

実行中のすべてのプロセスには、そのプロセスID(PID)にちなんで名付けられたフォルダが/proc内に作成されます。PID 1234のプロセスであれば、その起動コマンドやバイナリの場所を簡単に確認できるため、詳細なプロセスの調査が可能です:

# 完全な起動コマンドを表示
cat /proc/1234/cmdline | tr '\0' ' '

# バイナリのパスを見つける
ls -l /proc/1234/exe

cmdlineファイルは区切り文字としてヌルバイトを使用しています。trを使用することで、読みやすさを向上させるためにこれらをスペースに変換します。

リンク状態と温度

ip linkをファイル読み取りに置き換えることは、ネットワークの健全性を確認する優れた方法です。ここで「eth0」にケーブルが物理的に接続されているかどうかを確認できます:

cat /sys/class/net/eth0/operstate

温度の確認も同様に簡単です。熱センサーはミリ摂氏単位でデータを報告します:

cat /sys/class/thermal/thermal_zone0/temp

48500という結果は48.5°Cを意味します。スクリプト内で単純な割り算を行えば、追加のツールを使わずにきれいな数値を取得できます。

Pythonによる自動化

カスタムのモニタリングエージェントを構築していますか?Pythonでこれらのファイルを読み取るのは非常に高速です。/proc/uptimeからシステムの稼働時間を直接取得する方法は以下の通りです:

def get_uptime():
    with open('/proc/uptime', 'r') as f:
        uptime_seconds = float(f.readline().split()[0])
        return uptime_seconds

print(f"稼働時間: {get_uptime()} 秒")

外部バイナリをバイパスすることで、システムを軽量に保つことができます。これにより、モニタリングツール自体がサーバー上で最大のリソース消費源にならないようにできます。カーネルモジュールのデバッグであれ、小さなクラウドインスタンスからのパフォーマンスの絞り出しであれ、これらの仮想ファイルを使いこなすことは、あらゆるLinuxプロフェッショナルにとって不可欠なスキルです。

Share: