ファイルシステムと書庫

INPUT · スライド

空きと使用量(`df` と `du`)

01 / 08

サーバーが止まる理由の1位

いきなり実務の話をするね。動いていたサーバーが急に動かなくなる理由で、いちばん多いのがこれだよ。

> ディスクがいっぱいになった

書けなくなると、たいていのプログラムは止まってしまうんだ。ログも書けないので、原因すら残らないことがある。

しかも困ったことに、予告なしに来る。少しずつ増えていって、ある日いっぱいになるからね。

だから道具が2つ用意されているよ。

df   ディスク**ぜんたい**の空きを見る(disk free)du   **どこが**食っているかを見る(disk usage)

名前が似ているので混ざりやすいね。覚え方はこうだよ。

df = free(空き)  → 残りいくら?du = usage(使用) → 誰が使った?

まず df で全体を見て、危ないと分かったら du で犯人を探す。この順番だよ。

02 / 08

df -h で全体を見る

df-h(human readable)を付けて使うのが基本だよ。

~ $ df -hFilesystem      Size  Used Available Use% Mounted ondevtmpfs       10.4M     0     10.4M   0% /devtmpfs          11.1M  4.0K     11.1M   0% /tmphost9p        256.0G     0    256.0G   0% /home/manabiya

見るのは2つだけだよ。

Use%        何%使っているか(90% を超えたら注意)Mounted on  それがどの場所か

-h が無いと 1K 単位の数字がずらっと出るよ。人が見るなら -h だね。

行が何本もあることに気づいたかな。ディスクは1つではなく、場所ごとに分かれているんだ。

/dev            装置のための場所/tmp            一時おき場(メモリの上!)/home/manabiya  あなたの部屋

だから「ディスクがいっぱい」と言うときは、どこがいっぱいなのかを見る必要があるんだよ。/tmp が満杯でも、部屋には余裕があるかもしれないからね。

03 / 08

tmpfs はメモリの上

df -h に出てくる tmpfs は、ちょっと変わったものだよ。

tmpfs   11.1M  4.0K  11.1M  0% /tmp

ディスクではなく、メモリの上に作られた置き場なんだ。

速い(メモリだから)電源を切ると消える大きさはメモリの一部

/tmp が消えてよい場所だと前の回で言ったのは、こういう仕組みだからだよ。

そしてあなたのホームは host9p と出ているね。これはこの教材の特別な作りで、ブラウザの外(あなたのパソコン側)につながっている置き場だよ。

覚えてほしいのは、名前ではなく別々に分かれているという事実だよ。

/tmp            tmpfs(メモリ)/home/manabiya  host9p(別の置き場)

前の回で ln /etc/passwdCross-device link と断られたのは、まさにこれだったんだ。別の装置には札を付けられない、というわけだね。

04 / 08

du で内訳を見る

空きが少ないと分かったら、次は「誰が使っているか」だよ。

~ $ du -sh big.bin20.5K   big.bin

よく使う印は3つだけだよ。

意味
-s合計だけ出す(summarize)
-h人が読める形(K / M / G)
-k1K 単位の数字で出す

-s を付けないと、中のディレクトリを1つずつ全部出すよ。大きな木だと画面が流れてしまうので、たいてい -s を付けるんだ。

ディレクトリを渡すと、中身の合計を出してくれるよ。

~ $ du -sh hako11.0K   hako

ここが ls -l との違いだね。

ls -l   そのファイル1つの大きさ(ディレクトリの中身は数えない)du -s   中身を全部足した大きさ

「このフォルダ、ぜんぶで何 MB?」に答えられるのは du だけなんだ。

05 / 08

犯人を見つける3手

この形を覚えると、それだけで戦えるようになるよ。

~ $ du -sk * | sort -n1       small.txt11      mid.bin21      big.bin

-k で数字にそろえて、sort -n で小さい順に並べる。いちばん下が犯人だね。

1つだけ取り出すならこうだよ。

~ $ du -sk * | sort -n | tail -121      big.bin

章5でやった sort -n と章2の tail の組み合わせだね。測る道具と並べる道具を、パイプでつなぐだけで調査ができるんだ。

-hsort -n を一緒に使わないでね。

du -sh * | sort -n     ← うまく並ばない(1.5M と 900K の比較ができない)du -sk * | sort -n     ← こちらが正しい

-h は人が読む形なので、単位が混ざって数として比べられないんだ。並べるなら -k だよ。

06 / 08

深さを止める・ファイルまで見る

大きな木を調べるときは、深さを止めると読みやすいよ。

~ $ du -d 1 -k .12      ./hako44      .

-d 1 は「深さ1まで」だよ。中の中までは出さないんだ。

du -d 1 -k /var    /var の直下だけを比べる

これで「/var のどこが重いか」がすぐ分かる。重かったディレクトリに入って、また -d 1 で見る。上から順に降りていくのがコツだよ。

逆に、ファイル1つ1つまで見たいときは -a だよ。

~ $ du -ak hako11      hako/naka.bin12      hako

-a は all の a だね。

合計だけ足したいときは -c があるよ。

~ $ du -sc big.bin mid.bin21      big.bin11      mid.bin31      total

最後に total の行が付くんだ。複数のファイルをまとめて測るときに便利だね。

07 / 08

数えかたの細かい話

ls -ldu で数が合わないことがあるよ。

~ $ ls -l big.bin... 20480 big.bin      ← 20480 バイト~ $ du -sk big.bin21    big.bin          ← 21 K(= 21504 バイト相当)

少し大きいでしょう。理由は2つあるよ。

1. ディスクは決まった大きさのかたまりで使う

1バイトのファイルでも、かたまり1つ(たとえば 4K)を占める。だから小さいファイルをたくさん置くと、思ったより食うんだ。

2. 管理のための記録も要る

どこにデータがあるかを書いた台帳(inode の話だね)にも場所が必要だよ。

もうひとつ大事な性質があるよ。

> du はハードリンクを1回しか数えない

hako/a.bin ┐           ├→ 同じ中身(21K)hako/b.bin ┘du -sk hako  →  21(42 ではない)

中身が1つなんだから、当たり前だね。前の回の話が、測るときにも効いてくるわけだよ。

だから名前を1つ消しても、合計は減らないんだ。「消したのに減らない」の正体だね。

08 / 08

さあ、打ってみよう

この回で使うのはこれだけだよ。

df -h                     ぜんたいの空きを見るdf -h .                   いまいる場所のぶんだけdu -sh 名前               その大きさ(人が読む形)du -sk 名前               その大きさ(数字)du -sk * | sort -n        大きい順に並べるdu -d 1 -k .              深さ1までで比べるdu -ak 名前               ファイルまで出すdu -sc a b                合計も出す

大きなファイルを作る手も覚えておこう。

~ $ head -c 20480 /dev/zero > big.bin

/dev/zero は「0 をいくらでも出す装置」だよ。前の回で見た /dev/null(捨て場)の兄弟だね。そこから head -c で欲しいバイト数だけ取って、ファイルに落とすんだ。

/dev/null   書いたものを捨てる/dev/zero   読むと 0 がいくらでも出る

これで好きな大きさの練習用ファイルが作れるよ。では測ってみよう。