ディスク使用量の確認
容量不足はトラブルの定番原因です。df はファイルシステム単位の空き容量と使用率を一覧し、-h を付けると人が読みやすい単位(G・M)で表示します。どのディレクトリが容量を食っているかは du で調べ、du -sh * のように使うと各項目の合計サイズが分かります。df は「全体の残量」、du は「中身の内訳」を見る道具と覚えると使い分けやすいです。
サーバやマシンのトラブルで、定番中の定番として何度も現れる症状がある。ディスクの容量不足だ。
ログが溜まり続けて空きがなくなる、巨大なファイルがいつの間にか増えている、といった事態は珍しくない。容量が尽きると、アプリケーションがデータを書けずにエラーを出したり、最悪の場合システムが正常に動かなくなったりする。
とくにルート(/)が満杯になると、ログが書けない・一時ファイルが作れないといった形で、一見無関係なところまで不調が波及する。
だからこそ、いま容量がどれくらい使われているのか、どこが容量を食っているのかを素早く調べる手段を身につけておくことが、運用の基礎体力になる。容量不足は突然起きるのではなく、日々の監視で「使用率がじわじわ上がってきた」と早めに気づければ、慌てずに対処できる。
この用途で使う二大コマンドが df と du で、この2つは役割がはっきり分かれている。まずは「全体」を見るほうから入ろう。
📊 df は、何の残量を見せるのか
df(disk free)は、マウントされている各ファイルシステムごとに、全体の容量・使用量・空き容量・使用率・マウントポイントを一覧表示する。
引数なしで df と打つと、システム上のすべてのファイルシステムが対象になる。ただし既定ではバイト数に近い分かりにくい単位で表示されるため、実務ではほぼ必ず -h(human-readable)を付ける。df -h とすると、容量が 20G・1.5G・512M のように、人間が一目で分かる単位で表示される。
出力の Use%(使用率)の列を見れば、どのファイルシステムが満杯に近いかがすぐ分かる。「ディスクがいっぱいだ」と言われたら、まず df -h を打って、どのマウントポイントの使用率が高いのかを特定する。これが調査の第一歩だ。
🧩 容量は空いているのにファイルが作れない
df -h を見ると使用率は低いのに、なぜか新しいファイルが作れない――そんな不可解な事態に出くわすことがある。
その正体を暴くのが、もう1つの使い方、-i オプションを付けた df -i だ。これは容量(バイト数)ではなく、inode の使用状況を表示する。
前のトピックで触れたとおり、inode はファイル1つにつき1つ消費される管理単位で、ファイルシステム作成時にほぼ総数が決まっている。そのため、小さなファイルが大量にあると、ディスク容量にはまだ余裕があるのに inode を使い切ってしまい、「容量は空いているのにファイルが作れない」という一見不可解な状態に陥ることがある。
df -h では使用率が低いのに新規ファイルが作れない、というときは df -i で inode の使用率を疑うのが定石だ。
さて、満杯のファイルシステムは分かった。だが「どこが」食っているのかは、df では分からない。
🔎 du は、どこが食っているかを見せる
df が「ファイルシステム全体の残量」を見る道具なのに対し、du(disk usage)は「中身の内訳」を調べる道具だ。du は指定したディレクトリ以下が実際にどれだけの容量を使っているかを、ディレクトリごとに計算して表示する。
最もよく使う形が du -sh だ。-s は合計(summary)だけを表示するオプション、-h は df と同じく読みやすい単位での表示である。たとえば du -sh /var/log とすれば、/var/log ディレクトリ全体の合計サイズが 2.3G のように1行で分かる。
だが、合計が大きいと分かっても、その中の「誰が」犯人かはまだ見えない。
犯人探しに威力を発揮するのが du -sh * という書き方だ。これはカレントディレクトリにある各項目(ファイルやサブディレクトリ)それぞれの合計サイズを一覧表示する。
たとえば容量を食っているマウントポイントに cd で移動してから du -sh * を打てば、どのサブディレクトリが大きいかが分かる。そして、大きかったディレクトリの中へさらに cd して再び du -sh * を打つ、というのを繰り返していけば、容量を食っている大本のファイルやディレクトリへ段階的にたどり着ける。
サイズ順に並べたいときは du -sh * | sort -h のように sort -h(人間可読な数値でソート)に繋ぐと、大きいものが下に並んで見つけやすくなる。隠しファイル(ドットで始まるもの)も含めたいときは du -sh .[!.]* も併せて見るか、対象ディレクトリを直接指定する。
毎回 cd で移動するのは面倒だ、と感じたら使えるオプションもある。du には深さを制限する便利なオプションもあり、du -h --max-depth=1 /var は、/var 直下の各ディレクトリの合計サイズだけを表示し、その奥までは展開しない。du -sh * と似た結果を、移動せずに対象パスを指定して得たいときに重宝する。
ファイル単位で大きいものを探すなら、find と組み合わせて find /var -type f -size +100M のように「100メガを超えるファイル」を列挙する手もある。
なお du はファイルが実際に占めるブロック量を集計するため、ls -l で見えるファイルサイズの単純な合計とは値が少しずれることがある(まばらなファイルや、ブロック境界での切り上げが理由だ)。
🧭 結局、2つはどう使い分けるのか
2つのコマンドの関係は、「df は全体の残量、du は中身の内訳」と覚えるのが一番すっきりする。
容量トラブルの調査は、たいてい次の順で進む。まず df -h でどのファイルシステム(マウントポイント)が逼迫しているかを突き止める。次に、そのマウントポイントへ移動して du -sh * で内訳を見て、容量を食っている場所を絞り込む。そして犯人のディレクトリを掘り下げて、削除や移動の対象を特定する。
この流れを身につけておけば、「ディスクがいっぱい」という曖昧な症状から、原因のファイルまで最短で到達できる。
なお、du の結果と df の使用量がぴったり一致しないことがあるが、これはすでに削除されたのにプロセスが掴んでいて領域が解放されていないファイルなどが原因で、その場合は該当プロセスの再起動で解消することがある。ブロックデバイスやマウントの全体像は lsblk でも併せて確認しておくと、状況の理解が立体的になる。