すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Linux:df コマンドと du コマンドの出力が一致しない場合はどうすればよいですか?

最終更新日:May 16, 2025

標準の GNU coreutils には、ディスク容量使用量を確認するために使用される df コマンドと du コマンドが含まれています。ほとんどの場合、コマンドによって報告されるディスク容量使用量は似ていますが、コマンドの出力が大きく異なるという問題が発生する場合があります。このトピックでは、前述の問題の原因と解決策について説明します。

df コマンドと du コマンド

df コマンドと du コマンドの統計ロジックは若干異なります。

df コマンドは、ファイルシステムのディスク容量使用量を表示します。 df コマンドは、statfs() システムコールからファイルシステムの容量統計を取得します。 statfs() システムコールは、ファイルシステムの superblocks からデータを読み取ります。デフォルトでは、df コマンドは出力を 1 KB ブロック単位で表示します。 -B または --block-size=SIZE オプションを使用して、コマンド出力に異なる ブロックサイズを指定できます。

特性: df コマンドは、ファイルによって参照されていないがまだ解放されていない容量(ファイル記述子がプロセスによってまだ保持されている削除済みファイルなど)を含む、ファイルシステムレベルの容量使用量を表示します。

du コマンドは、ファイルとディレクトリのディスク容量使用量を表示します。 du コマンドは、ファイルシステムディレクトリ内のすべてのファイルとディレクトリを深さ優先でトラバースし、stat() システムコールから容量使用量の統計を取得します。 stat() システムコールは、各ファイルのサイズを KB 単位で読み取ります。

特性: du コマンドは、ファイルによって参照されていない容量を除外した、ファイルとディレクトリの実際の容量使用量を表示します。

2 つのコマンドの統計ロジックは異なります。ただし、この違いによってコマンド出力間に大きな不一致が生じることはありません。

問題

問題 1: ファイルは削除されているが解放されていない

問題の説明

df コマンドの出力はディスク容量が不足していることを示していますが、du コマンドの出力に表示される合計ディスク容量使用量は、df コマンドの出力に表示される容量よりも大幅に少なくなっています。

原因

特定のファイルは削除されていますが、そのファイル記述子はまだプロセスによって保持されています。ファイルシステムは、プロセスがファイル記述子を閉じるまで、対応するディスク容量を再利用できません。

次の lsof コマンドを実行して、ファイル記述子がまだプロセスによって保持されているすべての削除済みファイルをクエリします。

sudo lsof | grep deleted

解決策

プロセスを終了できる場合は、kill コマンドを実行してプロセスを終了し、ファイル記述子を閉じます。

<PID> を、lsof コマンドの出力に表示されるプロセスの ID に置き換えます。

sudo kill -9 <PID>

問題 2: 別のファイルシステムが、ファイルシステムのマウントポイントの下のサブディレクトリにマウントされている

問題の説明

du コマンドの出力に表示されるマウントポイントのディスク容量使用量は、df コマンドの出力に表示される容量とは大きく異なります。

原因

ファイルシステムがすでにマウントされているマウントポイントの下のサブディレクトリに別のファイルシステムがマウントされている場合、du コマンドはマウントポイントの最新のディレクトリツリートラバーサル統計を表示しますが、df コマンドはマウントポイントの元のディスク容量使用量を表示します。

たとえば、/dev/vdb/mnt/vdb にマウントされ、30 GB の容量が使用されており、/mnt/vdb/tmp ディレクトリに 1 GB のファイルが存在するとします。 /mnt/vdc などの別のデバイスが /mnt/vdb/tmp にマウントされ、5.1 GB の容量が使用されています。

  1. 次のコマンドを実行して、/mnt/vdb マウントポイントのマウント情報をクエリします。

    sudo mount | grep /mnt/vdb

    次のコマンド出力が返されます。

    /dev/vdb         40G   30G   11G  75% /mnt/vdb
    /dev/vdc         40G  5.1G   33G  14% /mnt/vdb/tmp
  2. 次のコマンドを実行して、/mnt/vdb ディレクトリのディスク容量使用量をクエリします。

    du -hs /mnt/vdb

    次のコマンド出力が返され、/mnt/vdc が /mnt/vdb/tmp にマウントされた後の /mnt/vdb ディレクトリの合計ディスク容量使用量が示されます。ただし、df コマンドは、/mnt/vdb ディレクトリの元のディスク容量使用量を表示します。

    34G     /mnt/vdb

解決策

次のコマンドを実行して、/mnt/vdb/tmp からファイルシステムをアンマウントし、df コマンドと du コマンドが同じファイルシステムを対象とするようにします。

sudo umount /mnt/vdb/tmp