ハウツー:/procディレクトリを活用する

 /procディレクトリは不思議な存在だ。本当に存在しているわけではないのだが、ディレクトリ内を見て回ることができる。ディレクトリ内にある各ファイルの容量は0で、バイナリでもテキストでもないのだが、ファイル属性を確認したりファイルの中身を表示したりすることができる。この特殊な/procディレクトリには、カーネル、プロセス、設定用パラメータなどに関して、Linuxシステムについてのあらゆる詳細な情報がある。そのため/procディレクトリを学ぶことで、Linuxのコマンドの仕組みを学んだり、さらにはシステム管理的なことをいくらか行ったりすることなどができる。

 Linuxではあらゆるものをファイルとして扱うようになっていて、例えばデバイスさえも(/devディレクトリ内の)ファイルとしてアクセスする。「普通の」ファイルは、テキストファイルかバイナリファイルのどちらか(ことによるとデバイスファイルやパイプファイル)だと考えているかもしれないが、/procディレクトリにあるのはもっと珍しいタイプのファイル――仮想ファイル――だ。仮想ファイルはlsで確認することができるが、ディスク上に実際に存在しているわけではなく、ユーザがファイルを読もうとしたときにオペレーティングシステムが動的に生成する。

 大半の仮想ファイルのタイムスタンプは常に現在時刻になっているが、これは絶えず更新され続けているということを表わしている。なお/procディレクトリ自体は、マシンの起動時に毎回作成される。一部のファイル(プロセスに関連するものなど)はプロセスを起動したユーザが所有しているので、/procディレクトリのすべての部分を見るためにはrootユーザになる必要がある。ほぼすべてのファイルは読み取りのみ可能だが、書き込み可能なものもいくつかあって(代表的なものは/proc/sys)、それらのファイルを利用すればカーネルのパラメータを変更することができる(ただしこれを行う際には注意が必要だ)。

/procディレクトリの内容

 /procディレクトリには仮想ディレクトリ/サブディレクトリがあり、ファイルは分野ごとに分類されている。ルートユーザとしてコマンドラインで「ls /proc」を実行すると以下のような結果が表示される。

1     2432  3340  3715  3762  5441  815        devices      modules
129   2474  3358  3716  3764  5445  acpi       diskstats    mounts
1290  248   3413  3717  3812  5459  asound     dma          mtrr
133   2486  3435  3718  3813  5479  bus        execdomains  partitions
1420  2489  3439  3728  3814  557   dri        fb           self
165   276   3450  3731  39    5842  driver     filesystems  slabinfo
166   280   36    3733  3973  5854  fs         interrupts   splash
2     2812  3602  3734  4     6     ide        iomem        stat
2267  3     3603  3735  40    6381  irq        ioports      swaps
2268  326   3614  3737  4083  6558  net        kallsyms     sysrq-trigger
2282  327   3696  3739  4868  6561  scsi       kcore        timer_list
2285  3284  3697  3742  4873  6961  sys        keys         timer_stats
2295  329   3700  3744  4878  7206  sysvipc    key-users    uptime
2335  3295  3701  3745  5     7207  tty        kmsg         version
2400  330   3706  3747  5109  7222  buddyinfo  loadavg      vmcore
2401  3318  3709  3749  5112  7225  cmdline    locks        vmstat
2427  3329  3710  3751  541   7244  config.gz  meminfo      zoneinfo
2428  3336  3714  3753  5440  752   cpuinfo    misc
/procについての文書
 /procファイルシステムについての文書はカーネルのソース内のあちらこちらに分散しているため、見つけるのは面倒かもしれない。探してみたところ、/usr/src/linux/Documentationディレクトリの中にproc.txtというファイルが見つかった。このファイルは情報満載だが、やや古く、最終更新日時はカーネル2.4.0リリース直前の2000年11月になっていた。それでもこのディレクトリを調査する方がCのソースファイルを読むよりは簡単だ。ただし必要以上の情報が得られてしまう可能性もあって、例えばlaptop-mode.txtファイルは/proc/sys/vm/laptop_modeファイルについての説明だけだが、1,000行近い長さがある。

 数字の名前がついているディレクトリ(詳しくは後述)はそれぞれ、実行中のプロセスに対応している。またselfという特別なファイルもあり、これはカレントプロセスへのシンボリックリンクとなっている。仮想ファイルには、ハードウェア情報を提供するもの(/proc/cpuinfo、/proc/meminfo、/proc/interruptsなど)や、ファイル関連の情報を提供するもの(/proc/filesystemsや/proc/partitions)などがある。また/proc/sysの中には、カーネルの設定に関するファイルがある(これについても後述)。

 「cat /proc/meminfo」を実行すると例えば以下のような結果が表示される。

MemTotal:       483488 kB
MemFree:          9348 kB
Buffers:          6796 kB
Cached:         168292 kB
(……以下複数行省略……)

 上記の数字のいくつかは、「top」や「free」の実行結果にも表示されるものだ。実のところ、よく知られている様々なユーティリティは/procディレクトリにアクセスして情報を入手している。したがって例えば使用中のカーネルのバージョンを知りたい場合には「uname -srv」を実行しても良いし、「cat /proc/version」を実行してその情報源を直接見ても良い。その他の興味深いファイルには次のようなものがある。

  • /proc/apm:(インストールされていれば)APM(Advanced Power Management)についての情報を提供する。
  • /proc/acpi:/proc/apmと似ているが、より新しいACPI(Advanced Configuration and Power Interface)についての情報を大量に提供する。例えば「cat /proc/acpi/ac_adapter/AC/state」を実行すれば、「on line」または「off line」と表示されて、ノートPCがAC電源に接続されているかどうかを確認することができる。
  • /proc/cmdline:ブート時にカーネルに渡されたパラメータを表示する。私のマシンの場合であれば「root=/dev/disk/by-id/scsi-SATA_FUJITSU_MHS2040_NLA5T3314DW3-part3 vga=0x317 resume=/dev/sda2 splash=silent PROFILE=QuintaWiFi」などの情報が表示される。これによりルートファイルシステムが含まれるパーティションや、使用しているVGAモードなどを知ることができる。なお最後のPROFILEはopenSUSEのSystem Configuration Profile Management翻訳記事)に関するパラメータだ。
  • /proc/cpuinfo:マシンのプロセッサについての情報を提供する。例えば私のノートPCの場合、「cat /proc/cpuinfo」を実行すると以下のような内容が表示された。
    processor       : 0
    vendor_id       : AuthenticAMD
    cpu family      : 6
    model           : 8
    model name      : Mobile AMD Athlon(tm) XP 2200+
    stepping        : 1
    cpu MHz         : 927.549
    cache size      : 256 KB
    
    上記は、0番の番号が付けられた、1GHz弱で走る、80686ファミリー(cpu family6は真ん中の数字を表わしている)のAMD Athlon XPプロセッサが1基あることを示している。
  • /proc/loadavg:プロセッサの平均負荷を示すファイルで、直近の1分間、5分間、15分間のCPUの使用状況や、現在実行中のプロセス数などの情報を表示する。
  • /proc/stat:ブート時からの統計情報を表示する。
  • /proc/uptime:マシンの起動時からの経過時間(単位:秒)とアイドル時間(単位:秒)の2つの数値だけが含まれる小さなファイル。
  • /proc/devices: 現在利用可能なすべてのキャラクタデバイスブロックデバイスを表示する。なお/proc/ideと/proc/scsiではIDEデバイスとSCSIデバイスについての情報がそれぞれ提供されている。
  • /proc/ioports:キャラクタ/ブロックデバイスとのI/Oのやり取りを行うのに使用されるIOポートの範囲についての情報を提供する。
  • /proc/dma:使用中のDMA(Direct Memory Access)チャネルを表示する。
  • /proc/filesystems:カーネルがサポートしているファイルシステムの一覧を表示する。以下に例を示す。
    nodev   sysfs
    nodev   rootfs
    nodev   bdev
    nodev   proc
    nodev   cpuset
    (……複数行省略……)
    nodev   ramfs
    nodev   hugetlbfs
    nodev   mqueue
           ext3
    nodev   usbfs
           ext2
    nodev   autofs
    
    左側の列はファイルシステムをブロックデバイスにマウントしているかどうかを示している。上記から、ext2ext3のパーティションをマウントしていることが分かる。
  • /proc/mounts: マシン上でマウントされているすべてのファイルシステムを表示する(出力結果は/etc/mtabに似ている)。同様に、/proc/partitionsと/proc/swapsはそれぞれ、すべてのパーティションとすべてのスワップ空間とを表示する。
  • /proc/fs:/proc/fsには多くのサブディレクトリやファイルがあるが、とりわけNFS経由でファイルシステムをエクスポートしている場合に、共有されているファイルシステムとそのパーミッションとを示す/proc/fs/nfsd/exportsがある。
  • /proc/net: ネットワーク関連の情報源として/proc/netに勝るものはないだろう。本稿で/proc/net内にあるすべてのファイルを説明することはできないが、代表的なものを挙げると、/dev(ネットワークデバイス)、様々なiptables(ファイアウォール)関連のファイル、ネットワーク/ソケットについての統計情報、ワイヤレス関連の情報などがある。

 その他にも、RAM関連のファイルがいくつかある。/proc/meminfoについてはすでに述べたが、マシン上のRAMメモリがどのように使用されているかを表示する/proc/iomemや、マシン上の物理RAMを表わす/proc/kcoreなどがある。なお他の仮想ファイルとは違って/proc/kcoreはRAMと同じ容量(とわずかなオーバーヘッド分の容量)の大きさがあるように表示される(ただしこのファイルはバイナリのため、画面が変になってしまう恐れがあるためcatを使って読もうとするのはやめた方が良いだろう)。最後に、/proc/interrupts、/proc/irq、/proc/pci(全PCIデバイスのリスト)、/proc/busなどのハードウェア関連のファイルやディレクトリがあるが、含まれているのは非常に細部の専門的な情報なので、ほとんどのユーザにとって必要になることはないだろう。

プロセスの内容

 前述した通り、数字の名前が付いているディレクトリは実行中の各プロセスを表わしている。プロセスが終了すれば、そのプロセスの/proc内のディレクトリは自動的に削除される。ディレクトリが/procディレクトリ内に存在している間に確認してみると、以下のような様々なファイルがあることが分かる。

attr             cpuset   fdinfo    mountstats  stat
auxv             cwd      loginuid  oom_adj     statm
clear_refs       environ  maps      oom_score   status
cmdline          exe      mem       root        task
coredump_filter  fd       mounts    smaps       wchan

 以下に主なファイル/ディレクトリを挙げる。

  • cmdline:プロセスを開始したコマンド名と、全パラメータを表示する。
  • cwd:プロセスのCWD(カレント・ワーキング・ディレクトリ)へのシンボリックリンク。なお同様にexeは プロセスの実行ファイルへのシンボリックリンク、rootはプロセスのルートディレクトリへのシンボリックリンク。
  • environ:プロセスの環境変数をすべて表示する。
  • fd:プロセスが使用しているすべてのファイル/デバイスのファイルディスクリプタを含むディレクトリ。
  • maps、statm、mem: プロセスが使用中のメモリに関連するファイル。
  • stat、status:プロセスの状態についての情報を提供する。statよりもstatusの方が分かりやすい表示になっている。

 以上のようなファイルを利用すれば、様々なスクリプトを書くこともできる。例えばゾンビ・プロセスを探し出したい場合には、数字の名前が付いた各ディレクトリの/statusファイルの中に「(Z) Zombie」という表示があるかどうかを確認すれば良い。同様に以前、あるプログラムが実行中なのかどうかを知る必要があったのだが、その際には/cmdlineファイルの中に目的の文字列があるかどうかを調べることで確認することができた(ただしこのことはpsコマンドの出力からも知ることができる)。さらに言えば、もっと見掛けの良いtopを作りたいという場合にも、必要な情報はすべて揃っている。

システムの調整:/proc/sys

 /proc/sysはシステムについての情報を提供するだけではなく、動的にカーネルパラメータを変更して各機能を有効にしたり無効にしたりすることができる(警告:当然ながらシステムに有害なことが起こる可能性もある)。

 ファイルが設定可能なのか読み取りのみ可能なのかを知るためには、「ls -ld」を実行すれば良い。ファイルに「W」の属性があれば、何らかの形でカーネルを設定するために利用することができることを意味する。例えば「ls -ld /proc/kernel/*」を実行すると以下のような結果が表示される。

dr-xr-xr-x 0 root root 0 2008-01-26 00:49 pty
dr-xr-xr-x 0 root root 0 2008-01-26 00:49 random
-rw-r--r-- 1 root root 0 2008-01-26 00:49 acct
-rw-r--r-- 1 root root 0 2008-01-26 00:49 acpi_video_flags
-rw-r--r-- 1 root root 0 2008-01-26 00:49 audit_argv_kb
-r--r--r-- 1 root root 0 2008-01-26 00:49 bootloader_type
-rw------- 1 root root 0 2008-01-26 00:49 cad_pid
-rw------- 1 root root 0 2008-01-26 00:49 cap-bound

 上記から、「bootloader_type」は変更することができないが、それ以外のファイルは変更可能であることが分かる。ファイルを変更するには「echo 10 >/proc/sys/vm/swappiness」などのようなコマンドを実行すれば良い(このコマンドの場合は仮想メモリのページングの性能を調整する)。なおこれらの変更は一時的なものであり、システムを再起動すれば無効になる。より持続的な変更を行いたい場合には、sysctlと/etc/sysctl.confファイルを使用する必要がある。

 それでは/proc/sysにあるディレクトリを見てみよう。

  • debug:文字通りデバッグ用の情報を提供する。カーネル開発に従事している場合に役立つ。
  • dev:システム上の特定のデバイスについてのパラメータを提供する。例えば/dev/cdromディレクトリなどがある。
  • fs:ファイルシステムについてのさまざまな情報を提供する。
  • kernel:カーネルの設定や操作を直接的に行なうことができる。
  • net:ネットワーク関連について制御することができる。ネットワーク接続を失いかねないので、変更する場合は慎重に行う必要がある。
  • vm:VMサブシステムを取り扱う。

まとめ

 /proc特殊ディレクトリはLinuxの内部的な働きに関する詳細な情報を豊富に提供していて、数多くの部分についての設定を細かく調整することもできる。しばらく時間をかけて/procディレクトリのあらゆる箇所について調べてみれば、より完璧なLinuxマシンを手に入れることができるだろう。完璧なLinuxマシンをあなたも是非手に入れて欲しい。

Federico Kerekiはウルグアイのシステムエンジニア。20年に渡るシステム開発、コンサルティング、大学講師の経験がある。

Linux.com 原文