ハウツー:/procディレクトリを活用する
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 family
の6
は真ん中の数字を表わしている)の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
左側の列はファイルシステムをブロックデバイスにマウントしているかどうかを示している。上記から、ext2
とext3
のパーティションをマウントしていることが分かる。 - /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年に渡るシステム開発、コンサルティング、大学講師の経験がある。