dfとduの結果が一致しない理由|Linuxディスク使用量のズレを完全解説

  • URLをコピーしました!

Linux運用で必ずと言っていいほど遭遇するのが、df と du の結果が合わない問題です。

df -h
du -sh /

「dfでは空きがないのに、duではそんなに使っていない」 この状態、実は障害の前兆であることも少なくありません。

本記事では、

  • df と du の本質的な違い
  • 結果がズレる典型パターン
  • 即使える調査コマンド
  • 正しい解消方法

現場で迷わないレベルまで解説します。

目次

まず結論:dfとduは「見ているもの」が違う

dfが見ているもの

df はファイルシステム全体の使用状況を見ています。

  • ブロック単位
  • マウントポイント単位
  • 削除済みでも解放されていない領域も含む

duが見ているもの

du はディレクトリ配下に存在するファイルの合計を見ています。

  • 実体のあるファイルのみ
  • 既に削除されたファイルは見えない

dfとduが一致しない典型パターン

① 削除されたがプロセスが掴んでいるファイル

最も多い原因です。

ログファイルを削除しても、プロセスがファイルを open したままだと、

  • df:使用中としてカウント
  • du:存在しないのでカウントしない

→ 結果がズレます。

確認コマンド

lsof | grep deleted

または:

lsof +L1

deleted と表示されているファイルが犯人です。

② /proc や仮想ファイルシステムを du している

以下のようなコマンドを実行していませんか?

du -sh /

/proc や /sys は実体のない仮想FSです。

df と du の対象がズレるため、正確な比較になりません。

正しいduの使い方

du -sh /* --exclude=/proc --exclude=/sys

③ マウントポイント配下の別ファイルシステム

/var や /home が別パーティションの場合、

  • df:個別に表示
  • du:まとめて計算

→ 意図せずズレます。

④ inode 枯渇が絡んでいるケース

容量は空いているが inode が尽きている場合、

  • df -h:余裕あり
  • df -i:100%
df -i

この場合、du の数字だけ見ても原因は分かりません。

⑤ ファイルシステムの予約領域

ext4 などでは root 用に予約ブロックがあります。

  • df:予約領域を含めて表示
  • du:通常ファイルのみ

実務での調査フロー(迷わない手順)

① dfで異常を検知

df -h

② inode も同時に確認

df -i

③ duで大きなディレクトリを特定

du -sh /var/* | sort -h

④ deleted ファイルを確認

lsof +L1

⑤ 該当プロセスを特定

ps -fp <PID>

正しい解消方法

方法① 該当サービスを再起動

systemctl restart httpd

最も安全で確実な方法です。

方法② プロセスを停止

kill <PID>

※業務影響を必ず確認してください。

やってはいけない対処

  • ディスクが苦しいから rm -rf
  • 原因不明のまま再起動

再発します。

再発防止のための設計ポイント

  • logrotate の適切な設計
  • truncate の正しい理解
  • /var の分離
  • 使用率・inode の監視

まとめ

df と du の不一致は、

  • Linuxを理解しているか
  • 障害対応の引き出しがあるか

が一瞬で試されるポイントです。

「削除したのに空かない」と感じたら、

  1. df
  2. du
  3. lsof

この順で確認すれば、必ず原因に辿り着けます。

ぜひ障害対応時の即戦力記事として活用してください。

目次