開いている削除されたファイルからディスク領域を解放する最良の方法

開いている削除されたファイルからディスク領域を解放する最良の方法

こんにちは。複数の削除されたファイルがあり、何らかの理由でディスク領域を占有していたファイルのプロセスを明示的に終了するまで、削除されたファイルに関連するディスク領域は使用できません。

$ lsof /tmp/
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
cron     1623 root    5u   REG   0,21        0 395919638 /tmp/tmpfPagTZ4 (deleted)

上記で削除したファイルが占めるディスク容量が原因で、Tabキーを使用してファイルパスをオートコンプリートしようとするとエラーが発生するなどの問題が発生する可能性があります。bash: cannot create temp file for here-document: No space left on device

ただし、そのPIDのスペースを実行した後、kill -9 1623そのPIDのスペースが解放され、エラーは発生しなくなります。

私の質問は次のとおりです

  • ファイルを最初に削除したときにそのスペースがすぐに解放されないのはなぜですか?
  • 削除されたファイルに関連するファイルスペースを回復するための最良の方法は何ですか?

私が使用した誤った用語やこの状況に関するその他の情報がある場合は、お知らせください。

答え1

unice では、ファイル名はファイルを含むメモリ (ハードドライブまたは RAM 対応ファイルシステムの場合もあります) へのポインタ (インデックスノード) にすぎません。各ファイルは、自分を指すリンクの数を追跡します。リンクはファイル名(同じファイルへの複数のハードリンクがある場合は複数形)であり、ファイルが開かれるたびにプロセスは実際に「リンク」を保存します。 「同じ空間に。

スペースは、リンクが残っていない場合にのみ物理的に解放されます(したがって、そのスペースに到達できません)。これが唯一合理的なオプションです。ファイルの使用中に他の人がファイルにアクセスできなくても構いません。ファイルを使用しており、ファイルが閉じられるまで制御を続けることができます。ファイル名が消えたり、移動したり、別のものを確認してください。これは一時ファイルにも当てはまります。一部の実装ではファイルを作成してすぐにリンクを解除するため、ファイルシステムには表示されませんが、ファイルを作成したプロセスはそのファイルを正常に使用しています。 Flashプラグインは特にこのアプローチを好みます。ダウンロードしたすべてのビデオファイルは開いていますが、ファイルシステムはそのファイルを表示しません。

したがって、答えはプロセスでまだファイルが開いている間してはいけないスペースを取り戻してください。リリースされていませんが、積極的に使用されています。これがアプリケーションがファイルを使い終わった後に実際にファイルを閉じる必要がある理由の1つです。一般的な使用では、そのスペースを空きスペースと見なすべきではなく、一般的ではありません。意図的にリンクを解除した一時ファイルを除外すると、未使用と見なしたいがまだ開いているファイルは実際には存在しないでください。このタスクを頻繁に実行するプロセスがあるかどうかを確認し、どのように使用されるかを検討するか、より多くのスペースを見つけてください。

答え2

ファイルがファイルシステムから削除され、このinodeへのすべての参照が削除されます。参照はディスク(すべてのディレクトリにリンクされています)にあり、開いているアプリケーションでも可能です。ファイルを削除すると、ディスクからのみ参照が削除されますが、アプリケーションにはまだ参照が残ります。

次の 2 つの方法でスペースを「確保」できます。

  1. 上記のように、ファイルを開くアプリケーションを終了できます。
  2. ファイルを切り捨てることができます。削除された場合でも:

pidを知っている場合は、このpidでどのファイルが開くかを確認してください。 ls -l /proc/PID/fd ここに次のリンクが表示されます。

undefine@uml:~$ ls -l /proc/18596/fd
ラジェム0
lrwx------ 1 定義のキャンセル 定義のキャンセル 64 lut 1 00:06 0 -> /dev/pts/30
lrwx------ 1 定義のキャンセル 定義のキャンセル 64 lut 1 00:06 1 -> /dev/pts/30
lrwx------ 1 定義のキャンセル 定義のキャンセル 64 lut 1 00:05 2 -> /dev/pts/30
lr-x----- 1 undefine undefine 64 lut 1 00:06 3 -> /home/undefine/x (削除済み)
lr-x----- 1 定義の取り消し 定義の取り消し 64 lut 1 00:06 4 -> anon_inode:inotify

ご覧のとおり、3つのfdが削除されました。たとえば、次のコマンドで切り取ることができます。

undefine@uml:~$ :>/proc/18596/fd/3
@uml:~$ 定義解除

アプリケーションがこのファイルからデータを読み取ると、アプリケーションにとって危険になる可能性があることに注意してください。ただし、ログファイルの場合は安全に切り取ることができます。

答え3

他の人が言ったように、lsof開かれたファイル記述子のためにディスクに残っているすべての削除されたファイルを一覧表示するために使用できます。しかし、これは長いリストかもしれません。次のコマンドは、これらのファイルをバイトサイズの昇順でリストします。

sudo lsof -F sn0 | tr -d '\000' | grep deleted | sed 's/^[a-z]*\([0-9]*\)n/\1 /' | sort -n

これを行うよりきれいな方法があるかもしれませんが、上記のコマンドは私にとって効果的です。

答え4

次のコマンドを試してください

lsof | grep deleted

その後、削除されたファイルのpidを終了します。

関連情報