web-dev-qa-db-ja.com

開いたままになっている削除済みファイルからディスク領域を解放する最良の方法

こんにちは私は削除された多くのファイルを持っていますが、何らかの理由で、削除されたファイルに関連付けられたディスク領域は、ディスク領域を取るファイルのプロセスを明示的に強制終了するまで利用できません

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

上記の削除されたファイルが占めるディスク領域により、タブキーを使用してファイルパスをオートコンプリートしようとすると、_bash: cannot create temp file for here-document: No space left on deviceエラーが発生するなどの問題が発生します。

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

私の質問は:

  • ファイルが最初に削除されたときに、このスペースがすぐに解放されないのはなぜですか?
  • 削除されたファイルに関連付けられているファイルスペースを取り戻すための最良の方法は何ですか?

そして、私が使用した誤った用語や、この状況に関するその他の関連情報を教えてください。

28
BryanK

Unicesでは、ファイル名はファイルが存在するメモリを指す単なるポインタ(inodes)です(ハードドライブまたはRAMでバックアップされたファイルシステムの場合もあります)。各ファイルは、そのファイルへのリンクの数を記録します。リンクは、ファイル名(同じファイルへの複数のハードリンクがある場合は複数)にすることができます。また、ファイルを開くたびに、プロセスは実際に「リンク」を保持します。同じスペース。

スペースが物理的に解放されるのは、リンクが残っていない場合のみです(そのため、そこに到達することはできません)。それが唯一の賢明な選択です。ファイルが使用されている間、他の誰かがそのファイルにアクセスできなくなっても重要ではありません。そのファイルを使用していて、閉じるまでファイルを制御できます。ファイル名に気付くことすらありません。なくなったか、移動したか、なんでも。これは一時ファイルにも使用されます。一部の実装では、ファイルを作成してすぐにリンクを解除するため、ファイルシステムには表示されませんが、それを作成したプロセスは通常使用しています。 Flashプラグインは特にこの方法が好きです。ダウンロードされたすべてのビデオファイルは開いたままですが、ファイルシステムには表示されません。

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

26
orion

ファイルは、このiノードへの参照が削除されるファイルシステムから削除されます。参照はディスク上(任意のディレクトリのリンク)、および開いているアプリケーションから可能です。ファイルを削除すると、ディスクから参照のみが削除されますが、アプリケーションからの参照はまだ残っています。

次に、2つの方法でスペースを「解放」できます。

  1. 上記のように-あなたはファイルを開くアプリケーションを殺すことができます。
  2. できます...ファイルを切り捨てます。削除しても:

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

 undefine @ uml:〜$ ls -l /proc/18596/fd
razem 0 
 lrwx ------ 1 undefine undefine 64 lut 1 00:06 0- > /dev/pts/30
lrwx------ 1 undefine undefine 64 lut 1 00:06 1-> /dev/pts/30
lrwx------ 1 undefine undefine 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 undefine undefine 64 lut 1 00:06 4-> anon_inode:inotify 

ご覧のとおり-3 fdが削除されます。コマンドで切り捨てることができます(例):

 undefine @ uml:〜$:>/proc/18596/fd/3 
 undefine @ uml:〜$ 

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

24
undefine

他の人が言ったように、lsofは、開いているファイル記述子のためにまだディスク上にあるすべての削除済みファイルをリストするために使用できます。ただし、これは非常に長いリストになる場合があります。これらのファイルをサイズの昇順(バイト単位)で一覧表示するコマンドを次に示します。

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

これを行うにはもっと簡潔な方法があるかもしれませんが、上記のコマンドは私のために働きました。

8
jcoffland

実行中のプロセスには、削除したばかりのファイルへのオープンファイルハンドルがまだあるため、スペースはすぐには解放されません。結局のところ、プロセスがまだファイルを使用しようとしているのであれば、おそらくカーネルにファイル(ファイル)を削除してほしくないでしょう。それはプロセスを少し動揺させるかもしれません。スペースを解放する最善の(そして私が知る限りでは)最善の方法は、あなたがしたことと同じようにすることです-プロセスを強制終了します。

5
John

以下のコマンドを使用してみてください

lsof | grep deleted

そして、削除されたファイルのpidを殺します。

1
Sumit Tyagi