ディスク使用量の確認
容量不足はトラブルの定番原因です。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 にはもう1つ重要な使い方があります。-i オプションを付けた df -i です。これは容量(バイト数)ではなく、inode の使用状況を表示します。前のトピックで触れたとおり、inode はファイル1つにつき1つ消費される管理単位で、ファイルシステム作成時にほぼ総数が決まっています。そのため、小さなファイルが大量にあると、ディスク容量にはまだ余裕があるのに inode を使い切ってしまい、「容量は空いているのにファイルが作れない」という一見不可解な状態に陥ることがあります。df -h では使用率が低いのに新規ファイルが作れない、というときは df -i で inode の使用率を疑うのが定石です。
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 .[!.]* も併せて見るか、対象ディレクトリを直接指定します。
du には深さを制限する便利なオプションもあります。du -h --max-depth=1 /var は、/var 直下の各ディレクトリの合計サイズだけを表示し、その奥までは展開しません。du -sh * と似た結果を、移動せずに対象パスを指定して得たいときに重宝します。ファイル単位で大きいものを探すなら、find と組み合わせて find /var -type f -size +100M のように「100メガを超えるファイル」を列挙する手もあります。なお du はファイルが実際に占めるブロック量を集計するため、ls -l で見えるファイルサイズの単純な合計とは値が少しずれることがあります(まばらなファイルや、ブロック境界での切り上げが理由です)。
使い分けと実務の勘どころ
2つのコマンドの関係は、「df は全体の残量、du は中身の内訳」と覚えるのが一番すっきりします。容量トラブルの調査は、たいてい次の順で進みます。まず df -h でどのファイルシステム(マウントポイント)が逼迫しているかを突き止める。次に、そのマウントポイントへ移動して du -sh * で内訳を見て、容量を食っている場所を絞り込む。そして犯人のディレクトリを掘り下げて、削除や移動の対象を特定する。この流れを身につけておけば、「ディスクがいっぱい」という曖昧な症状から、原因のファイルまで最短で到達できます。なお、du の結果と df の使用量がぴったり一致しないことがありますが、これはすでに削除されたのにプロセスが掴んでいて領域が解放されていないファイルなどが原因で、その場合は該当プロセスの再起動で解消することがあります。ブロックデバイスやマウントの全体像は lsblk でも併せて確認しておくと、状況の理解が立体的になります。