ファイルシステムと書庫

INPUT · スライド

ファイルの形をした今(`/proc`)

01 / 06

ディスクに無いファイル

章9の最後は、少し不思議な場所だよ。

~ $ cat /proc/uptime2.36 1.43

起動してから何秒たったかが出たね。でもこの /proc/uptime は、ディスクの上に無いんだ。

df -h で /proc を見ると、大きさは 0ls -l /proc/uptime も、大きさは 0それでも cat すると中身が出る

何が起きているかというと、読もうとした瞬間にカーネルが作って渡しているんだよ。

cat /proc/uptime  ↓ 「読みたい」と伝えるカーネルが今の数字を計算する「2.36 1.43」という文字を渡す

だから2回読めば、違う数字が返るんだ。ファイルのふりをした窓口だね。

こういう仕組みを Linux では procfs(プロセス・ファイルシステム)と呼ぶよ。前の回で dfproc という行が出ていたのを覚えているかな。あれがこれだったんだ。

02 / 06

なぜファイルの形にするのか

「わざわざファイルのふりをしなくても、専用のコマンドを作ればいいのに」と思ったかな。いい疑問だよ。

答えはこれだよ。

> ファイルの形にすれば、いま持っている道具が全部使える

cat /proc/meminfo                     見るgrep MemFree /proc/meminfo            探すawk '{print $2}' /proc/loadavg        列を抜くwatch cat /proc/uptime                くり返す

新しい道具を1つも覚えずに、システムの状態を調べられるでしょう。

これは Linux の設計の考え方そのものだよ。

「すべてはファイル」(everything is a file)

実際に、あなたはもうこの考え方に何度も出会っているんだ。

見たもの正体
/dev/null書いたものを捨てる窓口
/dev/zero0 を出し続ける窓口
/dev/urandomでたらめな値を出す窓口
/proc/uptime今の稼働時間を出す窓口

どれも「ファイル」ではないのに、ファイルとして読み書きできたでしょう。入口と出口の形をそろえておけば、道具は使い回せるという発想なんだ。

03 / 06

数字のディレクトリはプロセス

/proc を覗くと、数字の名前がたくさん並んでいるよ。

~ $ ls /proc1  10  11  12  ...  78  cpuinfo  meminfo  uptime  ...

この数字はプロセスの番号(PID)だよ。章8で ps で見たあの番号だね。

1つ入ってみるとこうなっているよ。

/proc/78/├─ cmdline     どんなコマンドで起動したか├─ status      名前・親・状態・使っているメモリ├─ stat        同じ情報を数字だけで並べたもの├─ cwd         いまいるディレクトリ(リンク)├─ exe         本体のプログラム(リンク)└─ fd/         開いているファイル

章8の ps は、ここを読んで表にしていただけなんだ。種も仕掛けもここにあったんだよ。

自分のシェルを見るには $$ を使うよ。

~ $ grep Name /proc/$$/statusName:   sh~ $ grep PPid /proc/$$/statusPPid:   1

名前は sh、親は 1(init)だね。章8で描いた親子の木が、ファイルとしても読めるわけだよ。

なお cwdexefd/ は、この環境では権限で覗けないよ。プロセスの持ち主が root だからだね。章6と章7でやった権限の話は、/proc にもそのまま効いているんだ。

04 / 06

よく読む窓口

覚えておくと役に立つものを並べておくね。全部 cat で読めるよ。

場所分かること
/proc/uptime起動してからの秒数
/proc/loadavg混み具合(1分 / 5分 / 15分)
/proc/meminfoメモリの内訳
/proc/cpuinfoCPU の種類
/proc/versionカーネルの版
/proc/mountsいま何がどこに付いているか
/proc/filesystems扱える置き場の種類
/proc/sys/kernel/hostnameこのマシンの名前

章8で使った topfree は、ここを読んで表にしていた道具だよ。

/proc/loadavg は5つの列になっているよ。

0.00 0.00 0.00 1/35 84  ↑    ↑    ↑    ↑   ↑ 1分  5分  15分  動/全 最後のPID

/proc/mountsdf の元ネタだね。

~ $ grep 9p /proc/mountshost9p /home/manabiya 9p rw,relatime,... 0 0

あなたのホームが 9p という方式で付いていると書いてあるでしょう。前の回で dfhost9p と言っていたのは、ここから来ていたんだよ。

05 / 06

書き込める窓口もある

/proc の一部は、書くとシステムの動きが変わるんだ。

/proc/sys/ の下は設定の窓口

たとえばマシンの名前は、ここに書くと変わるよ。

# echo newname > /proc/sys/kernel/hostname

# で始めたのは、root でないと書けないからだよ。章7でやった話だね。

この仕組みが面白いのは、設定を変えるための専用コマンドが要らないことだよ。

cat で読む   →  いまの設定が分かるecho で書く  →  設定が変わる

もちろん強い力なので、意味の分からない場所に書かないでね。ネットワークやメモリの挙動を変える窓口もあるので、いきなり動かなくなることもあるよ。

そして忘れずに。

/proc への書き込みは、再起動すると消える

ディスクではなくメモリの上の窓口だからね。ずっと残したい設定は /etc の下のファイルに書く。/etc は永続、/proc は今という住み分けだよ。地図の回で見た並びが、こういう意味を持っていたんだね。

06 / 06

さあ、打ってみよう

この回で読むものをまとめておくね。

cat /proc/uptime                    起動からの秒数cat /proc/loadavg                   混み具合grep MemTotal /proc/meminfo         メモリの合計cat /proc/version                   カーネルの版cat /proc/sys/kernel/hostname       マシンの名前grep Name /proc/$$/status           自分のシェルの名前grep PPid /proc/$$/status           その親grep 9p /proc/mounts                どう付いているか

新しいコマンドは1つも無いでしょう。catgrepawk だけだよ。それで足りるのが /proc の値打ちなんだ。

最後にひとつ、面白い確かめ方をするよ。

ls -l /proc/uptime   →  大きさは 0wc -c < /proc/uptime →  12 バイト

大きさ 0 なのに、読むと 12 バイトある。ふつうのファイルでは絶対に起きないことだね。

カーネルには「これから何バイト渡すか」が事前に分からないので、大きさを 0 と答えているんだ。読まれた瞬間に作るからだよ。

この1つが、/proc が何なのかをいちばんよく表していると思うよ。では読んでみよう。