Nandフラッシュストレージパーティションは、dfコマンドで100%フルと表示されます。使用量を手動で計算すると、約7〜80%(最大)のみです。いくつかのファイルを削除しました(たとえば、約50〜60 MB)。それでも、dfコマンドの出力は変更されませんでした。新しいファイルを作成できません。エラー:「ストレージデバイスに空き容量がありません」。 sync
コマンドを試しましたが、違いはありません。
Filesystem 1K-blocks Used Available Use% Mounted on
tmpfs 262144 20780 241364 8% /tmp
tmpfs 512 0 512 0% /dev
/dev/ubi0_0 1275540 1275540 0 100% /storage
実際のストレージスペースがいっぱいではない場合(手動計算による)、なぜdoe dfコマンドは100%と表示するのですか?
再起動して再マウントすれば、問題は解決すると思います。
理由:この背後にある理由は、df
がファイルシステムの統計情報を取得するためにシステムコール statfs(2) を利用することです。オープンカーネルファイルディスクリプタをチェックして、指定された空きスペースをカウントすることを意味します(df = disk free)。 du
を使用すると、異なる結果が得られます。 df
は、ファイルが削除されたために100%使用されていることを示し、カーネルファイル記述子からまだ解放されていません。
次のscenerioを理解するのに役立ちます。
xyz.service
という名前の実行中のプロセスは、something.dump
パーティションにある/storage
という名前のファイルを使用しています。
file discriptor
のsomething.dump
は、process file discriptor table
のxyz.service
にリストされています。
次に、something.dump
を削除しましたが、xyz.service
はまだ実行中です。
xyz.service
は、something.dump
ファイルの更新されたsatusを認識していません。したがって、something.dump
のファイル記述子はまだ存在しています。
次に、df
コマンドを実行し、カーネルがすべてのプロセステーブルをチェックして、空き領域を計算するために使用されたファイル記述子を確認しました。
カーネルは、something.dump
のfdがxyz.service
プロセステーブルにあることを確認しました。したがって、something.dumpがまだファイルシステムにあるため、something.dumpのiノードが無料であるとは見なされません。これが、100%使用されている理由です。
したがって、sigkill xyz.service
すると、これらのiノードが解放され、確率で空きスペースを確認できます。
システムを再起動すると、手順7と同じことが行われます。