はじめに (対象読者・この記事でわかること)
この記事は、Linuxシステム管理者や開発者の方を対象にしています。特に、サーバーのディスク容量管理に関わる方や、コマンドライン操作に慣れている方におすすめです。
この記事を読むことで、dfコマンドとduコマンドの結果が一致しないというよくある問題の原因を理解し、実際にシステム上でディスク使用量の差異を調査・解決する方法を習得できます。具体的には、inodeの使用状況、削除済みファイルの保持、特殊なファイルシステムの影響といった技術的な要因について学べます。
前提知識
この記事を読み進める上で、以下の知識があるとスムーズです。 前提となる知識1 (例: Linuxの基本的なコマンド操作) 前提となる知識2 (例: ファイルシステムとinodeの基本的な概念)
ディスク使用量の不一致問題とは
Linuxシステム管理において、ディスク容量の監視は非常に重要です。しかし、dfコマンドとduコマンドで表示されるディスク使用量が一致しないという問題は、多くのシステム管理者が直面する一般的な課題です。
dfコマンドはファイルシステム全体の使用状況を表示し、duコマンドは特定のディレクトリ内のファイルサイズを再帰的に計算します。通常、これらの値は近いはずですが、実際には大きな差異が生じることがあります。
この不一致の原因は多岐にわたり、単純な計算ミスではなく、Linuxファイルシステムの動作特性に起因する場合が多いです。特に、削除済みファイルがまだプロセスによって開かれている場合や、inodeの使用量がファイルサイズに比べて異常に多い場合など、システム内部の状態を理解していないと原因特定が困難です。
この記事では、実際に遭遇したケースを基に、不一致問題の原因を特定し、解決するための具体的な手法を解説します。
原因特定と解決方法
不一致問題の解決には、系統的なアプローチが必要です。以下に、ステップバイステップで解決方法を説明します。
ステップ1: 基本的な確認
まずは、基本的な確認手順から始めます。
Bash# dfコマンドでファイルシステムの使用状況を確認 df -h # duコマンドでディレクトリの使用量を確認 du -sh /path/to/directory
この時点で、どのファイルシステムで不一致が発生しているか特定します。また、duコマンドに-xオプションを追加して、異なるファイルシステムを跨がないように確認することも有効です。
Bashdu -xsh /path/to/directory
ステップ2: inode使用量の確認
ファイルシステムの使用量は、データブロックの使用量だけでなく、inodeの使用量も重要です。inodeが不足している場合、dfコマンドは100%使用と表示しますが、duコマンドは実際のデータサイズを示します。
Bash# inode使用量の確認 df -i # 特定ディレクトリのinode数の確認 find /path/to/directory -type f | wc -l
inode使用量が異常に多い場合、小さなファイルが大量にある可能性があります。以下のコマンドで、小さなファイルの数を確認できます。
Bash# 1KB以下のファイル数を確認 find /path/to/directory -type f -size -1k | wc -l # 1KB以下のファイルの合計サイズを確認 find /path/to/directory -type f -size -1k -exec du -ch {} + | grep total$
ステップ3: 削除済みファイルの確認
削除済みファイルがまだプロセスによって開かれている場合、ファイルシステム上のスペースは解放されませんが、duコマンドではカウントされません。
Bash# lsofコマンドで削除済みファイルを確認 lsof | grep deleted # 特定のファイルシステム内の削除済みファイルを確認 lsof | grep /path/to/filesystem | grep deleted
削除済みファイルが特定できた場合、対応するプロセスを再起動するか、システムを再起動してスペースを解放します。
Bash# プロセスIDを特定して終了 kill -9 <PID>
ステップ4: 特殊ファイルの確認
Linuxシステムには、通常のファイル以外にも特殊なファイル(デバイスファイル、ソケットファイル、パイプファイルなど)があります。これらのファイルはdfコマンドではスペースを使用しますが、duコマンドではカウントされない場合があります。
Bash# 特殊ファイルの数を確認 find /path/to/directory -type c -o -type p -o -type s | wc -l
ステップ5: ゴミ箱や一時ファイルの確認
ユーザーのゴミ箱やシステムの一時ディレクトリに大量のファイルが溜まっている場合、dfコマンドでは使用量としてカウントされますが、duコマンドでは対象外となることがあります。
Bash# ゴミ箱の確認 ls -la /home/*//.local/share/Trash/files # 一時ディレクトリの確認 ls -la /tmp ls -la /var/tmp
これらのディレクトリの使用量を確認し、必要に応じてクリーンアップします。
ステップ6: ファイルシステムの整合性チェック
ファイルシステムに破損がある場合、dfとduの結果が不一致することがあります。ファイルシステムの整合性をチェックします。
Bash# ext4ファイルシステムの場合 fsck /dev/sdXn # XFSファイルシステムの場合 xfs_repair /dev/sdXn
注意: fsckやxfs_repairは実行中のシステムでは危険な場合があるため、可能であればシングルユーザーモードで実行してください。
ステップ7: スナップショットの確認
ファイルシステムスナップショットが存在する場合、dfコマンドはスナップショットの使用量を含めて表示しますが、duコマンドは含めません。
Bash# LVMスナップショットの確認 lvs # ZFSスナップショットの確認 zfs list -t snapshot
不要なスナップショットがあれば削除して、スペースを解放します。
ステップ8: ログファイルの確認
システムやアプリケーションのログファイルが肥大している場合、dfコマンドでは使用量としてカウントされますが、duコマンドでは対象外となる場合があります。
Bash# ログファイルの使用量を確認 du -sh /var/log # ログファイルの中で大きいものをトップ5表示 du -sh /var/log/* | sort -hr | head -5
ログローテーションが正しく設定されていない場合、手動で古いログを削除します。
まとめ
本記事では、dfコマンドとduコマンドの結果が一致しない問題の原因と解決方法について解説しました。
- 不一致の主な原因はinodeの使用量、削除済みファイルの保持、特殊ファイルの存在、ゴミ箱や一時ファイルの溜まり、ファイルシステムスナップショット、ログファイルの肥大など多岐にわたります。
- 解決のためのステップとして、基本的な確認、inode使用量の確認、削除済みファイルの確認、特殊ファイルの確認、ゴミ箱や一時ファイルの確認、ファイルシステムの整合性チェック、スナップショットの確認、ログファイルの確認という系統的なアプローチを紹介しました。
- 重要なのは、問題解決には系統的なアプローチが必要であり、一見すると原因が特定できなくても、ステップバイステップで調査を進めることで必ず解決策が見つかるという点です。
この記事を通して、読者はLinuxシステムのディスク使用量に関する問題を自力で解決する能力を身につけたはずです。今後は、ディスク容量の監視と管理に関する高度なテクニックについても記事にする予定です。
参考資料
- Linux dfコマンドの公式ドキュメント
- Linux duコマンドの公式ドキュメント
- Linux inodeについての解説
- [Linuxファイルシステムの管理に関する書籍: "Linuxファイルシステム管理ガイド"]
