第5章 proc ファイルシステム
Linux カーネルには、コンピューター上の物理デバイスへのアクセスを制御し、それらのデバイスとプロセスがいつ、どのような方法で情報のやりとりを行うかをスケジュールするという、2 つの主要な機能があります。
/proc/
ディレクトリー( proc
ファイルシステムとも呼ばれます)には、カーネルの現在の状態を表す特別なファイルの階層が含まれており、アプリケーションとユーザーがシステムのカーネルビューにピア接続できるようにします。
/proc/
ディレクトリー内で、システムのハードウェアと現在実行しているプロセスの詳細情報を見つけることができます。さらに、/proc/
ディレクトリーツリー内のファイルの一部をユーザーおよびアプリケーションが操作して、設定の変更をカーネルに通信できます。
5.1. 仮想ファイルシステム
Linux では、すべてのデータはファイルとして保存されます。大半のユーザーは、主要な 2 つのファイルタイプ (テキストとバイナリー) について精通していますただし、
/proc/
ディレクトリーには、仮想 ファイル と呼ばれる別のタイプのファイルが含まれます。このため、/proc/
は 仮想ファイルシステム と呼ばれることがよくあります。
これらの仮想ファイルには固有の特性があります。これらのほとんどはゼロバイトとして一覧表示され、表示されても大量の情報が含まれます。さらに、仮想ファイルの日時設定の大半は、現在の時刻と日付を反映しており、これらは常に更新されることを示しています。
/proc/interrupts
、/proc/meminfo
、/proc/mounts
、および /proc/partitions
などの仮想ファイルは、システムのハードウェアを最大から移動できます。/proc/filesystems
ファイルや /proc/sys/
ディレクトリーなどの他の場合は、システム設定情報とインターフェイスを提供します。
情報を体系化するために、同様のトピックに関する内容が記載されたファイルは、仮想ディレクトリー/サブディレクトリーにグループ化されます。たとえば、
/proc/ide/
には、すべての物理 IDE デバイスの情報が含まれます。同様に、プロセスディレクトリーには、システムで実行している各プロセスに関する情報が含まれます。
5.1.1. 仮想ファイルの表示
/proc/
ディレクトリー内のファイルで cat コマンド、より多く の、または less コマンドを使用すると、ユーザーはシステムに関する膨大な量の情報にすぐにアクセスできます。たとえば、コンピューターが持つ CPU のタイプを表示するには、cat /proc/cpuinfo と入力して、以下のような出力を受信します。
processor : 0 vendor_id : AuthenticAMD cpu family : 5 model : 9 model name : AMD-K6(tm) 3D+ Processor stepping : 1 cpu MHz : 400.919 cache size : 256 KB fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 1 wp : yes flags : fpu vme de pse tsc msr mce cx8 pge mmx syscall 3dnow k6_mtrr bogomips : 799.53
/proc/
ファイルシステムでさまざまな仮想ファイルを表示すると、人間が判読できないものの、一部の情報を簡単に理解できます。これは、仮想ファイルからデータを取得し、それを便利な方法で表示するユーティリティーが存在する理由の一部です。このユーティリティーの例には、lspci、apm、free、および top が含まれます。
注記
/proc/
ディレクトリー内の仮想ファイルの一部は、root ユーザーのみが読み取り可能です。
5.1.2. 仮想ファイルの変更
一般的なルールとして、
/proc/
ディレクトリー内のほとんどの仮想ファイルは読み取り専用です。ただし、一部の を使用してカーネルの設定を調整することができます。これは、/proc/sys/
サブディレクトリー内のファイルに対して特に当てはまります。
仮想ファイルの値を変更するには、echo コマンドと、> より大きい記号(>)を使用して、新しい値をファイルにリダイレクトします。たとえば、オンザフライでホスト名を変更するには、以下を入力します。
echo www.example.com > /proc/sys/kernel/hostname
その他のファイルは、バイナリーまたはブール値のスイッチとして機能します。cat /proc/sys/net/ipv4/ip_forward を実行すると、
0
または 1
のいずれかが返されます。0
は、カーネルがネットワークパケットを転送していないことを示します。echo コマンドを使用して ip_forward
ファイルの値を 1
に変更すると、すぐにパケット転送が有効になります。
ヒント
/proc/sys/
サブディレクトリーで設定を変更するために使用されるもう 1 つのコマンドは、/sbin/sysctl です。このコマンドの詳細については、を参照してください。 「sysctl コマンドの使用」
/proc/sys/
サブディレクトリーで利用可能なカーネル設定ファイルの一部の一覧は、「 /proc/sys/
」 を参照してください。
5.1.3. プロセスディレクトリーへのアクセス制限
マルチユーザーシステムでは、
/proc/
に保存されているプロセスディレクトリーを保護し、root
ユーザーのみが表示できるようにすることが便利なことがよくあります。hidepid
オプションを使用すると、これらのディレクトリーへのアクセスを制限できます。
ファイルシステムのパラメーターを変更するには、mount コマンドに
-o remount
オプションを指定して実行します。root
で以下のコマンドを実行します。
mount-o remount
,hidepid
=value/proc
hidepid
に渡される 値 は以下のいずれかになります。
0
(デフォルト): すべてのユーザーが、プロセスディレクトリーに保存されている全ユーザーが読み取り可能なファイルを読み取ることができます。1
- ユーザーは自分のプロセスディレクトリーにのみアクセスできます。これにより、cmdline
、sched
、またはstatus
などの機密ファイルが root 以外のユーザーによるアクセスから保護されます。この設定は、実際のファイルパーミッションには影響しません。2
- プロセスファイルは、root 以外のユーザーには表示されません。プロセスの存在は他の手段で学習できますが、有効な UID と GID は非表示になっています。これらの ID を非表示にすると、侵入者が実行中のプロセスに関する情報を収集するタスクが複雑になります。
例5.1 プロセスディレクトリーへのアクセス制限
root
ユーザーのみがプロセスファイルにアクセスできるようにするには、以下を入力します。
~]# mount-o remount
,hidepid
=1
/proc
hidepid
=1
を使用すると、root 以外のユーザーはプロセスディレクトリーのコンテンツにアクセスできません。これを試みると、以下のメッセージで失敗します。
~]$ ls /proc/1/
ls: /proc/1/: Operation not permitted
hidepid
=2
を有効にすると、root 以外のユーザーにプロセスディレクトリーが非表示になります。
~]$ ls /proc/1/
ls: /proc/1/: No such file or directory
また、
hidepid
が 1 または 2 に設定されている場合でも、ファイルを処理するユーザーグループを指定できます。これを行うには、gid
オプションを使用します。root
で以下のコマンドを実行します。
mount-o remount
,hidepid
=value,gid
=gid/proc
gid を、特定のグループ ID に置き換えます。選択したグループのメンバーの場合、プロセスファイルは
hidepid
が 0 に設定されているかのように動作します。ただし、システム全体のタスクを監視しないユーザーは、グループに追加しないでください。ユーザーおよびグループの管理に関する詳細は、37章ユーザーとグループ を参照してください。