今すぐfsに削除されたファイルからスペースを解放するように指示する


73

カーネルに空きディスク領域をすぐに返すように指示する方法はありますか?/ proc /内の何かへの書き込みのように?Ubuntu 11.10をext4で使用します。

これはおそらく古くて非常に繰り返されるテーマです。エディターが開いたソースコードファイルを保存できなかったときにのみスペースが0になった後、フォルダーリストに0バイトのサイズが表示されるようになり、削除を開始しました。

ユーザーとルートの両方から数百MBの大きなファイルを削除し、ハードリンクも行いました。

直前にapt-get clean/ var / cache / apt / archivesに900MB以上ありましたが、現在は108KBしかありません。

# du
108 /var/cache/apt/archives

1時間後もまだ空き領域がなく、エディターで開いた貴重なファイルを保存できませんが、以下の不一致に注意してください。

# sync; df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda4             13915072  13304004         0 100% /

助言がありますか?一部のサービス/プロセスを停止しましたが、ディスク領域を積極的に消費している可能性のある人を確認する方法がわかりません。

詳細情報

# dumpe2fs  /dev/sda4
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              884736
Block count:              3534300
Reserved block count:     176715
Free blocks:              422679
Free inodes:              520239
First block:              0
Block size:               4096
Fragment size:            4096

4
ファイルシステムはすぐにスペースを解放します。ただし、ext [234]のルート予約ブロック機能と、カーネルが開いているファイルを予約したままにする方法により、スペースが失われたように見える場合があります。
ハハム

複数のファイルシステム(パーティション)がある場合、一方の領域を解放しても、もう一方の領域では何の効果もありません。
フォンブランド14

「予約済み」の5Goブロックが自身を回収する前に、パーティションを埋めることができたのはなぜですか?
Psddp 14

回答:


117

lsof開いたままになっているファイルがあるかどうかを確認してください。スペースは、閉じられるまで解放されません。

sudo /usr/sbin/lsof | grep deleted

削除されたファイルがまだ開いたままになっていることがわかります。


良い。mysqld/ tmpにいくつかのロックを示しましたがapport-gt、/ var / lib / apt / lists / partial /にある絶滅したファイルの多くの用途が明らかに蓄積されています。したがってkillall apport-gt、最初に調査する可能性があります。
マルコス

1
最も近い回答としてマークしますが、実際にそれらを使用してファイルハンドル/プロセスを閉じた直後にスペースを「戻す」ことはありません。他のカーネル/ proc / fsベースのアプローチを探しています。
マルコス

18
使用することもできますlsof +L1(リンクされていない開いているファイルを選択します)。
マーティンフィド

この回答の情報は正しいですが、OPが抱えていた問題はおそらくこれによってではなく、ルート予約スペース(他の回答が対応している)が原因でした。
marcelm

37

lsof削除されたが開いているファイルを見つけるために使用して、まだスペースを消費しています:

lsof | grep deleted | grep etilqs_1IlrBRwsveCCxId
chrome     3446       user  128u      REG              253,2              16400       2364626 /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)  

/proc/<pid>/fd/ファイルハンドルに対応するエントリを見つけます:

ls -l /proc/3446/fd/etilqs_1IlrBRwsveCCxId
lrwx------. 1 user unix 64 Feb 11 15:31 128 -> /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)

さて、ただcat /dev/nullfdに:

cat /dev/null > /proc/3446/fd/128

iノードはまだ開いていることに注意してください。ただし、長さは0になりました。

chrome     3446       user  128u      REG              253,2         0    2364626 /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)

5
catをトランケートするための余分な使用。Bourneシェルでは、これで十分> /proc/3446/fd/128です。
200_success 14

2
プログラムが実際にファイルの一部を将来再読み込みすると予想される場合は、これをしないでください。
マイケルR.ハインズ

13

dfrootとして予約されている場合でも、予約されたスペースは表示されませんroot

# df -h
Filesystem            Size  Used Avail Use% Mounted on
...
/dev/optvol           625G  607G     0 100% /opt
...

「予約ブロック率」を変更する方法

  1. 予約スペースを4%に削減

    # tune2fs -m4 /dev/sda4

df -h 現在、45Mが無料で表示されています。

  1. ファイルをすばやく保存しました
  2. 5%に戻す

    # tune2fs -m5 /dev/sda4


2
ルートの予約スペースは、現在ではほとんどの場合大きすぎます。数パーセントに減らすことができます。df通常のユーザー使用可能スペースを表示します。aptはrootとして実行されるため、予約されたスペースは、root以外のユーザー(=通常のユーザーと独自のユーザーを持つサービス)が原因でいっぱいになるのを防ぐためにのみ役立ちます。
ジョフェル

同意する; mkfsこれらの日には、例えば予約しなければなりません。5%または300MBのいずれか少ない方。一部のサーバーを2%に再調整し、GBを解放しました!
マルコス

3
@jofel、いいえ、そうではありません。使用率が90%を超えると、多くの断片化が発生し始めます。使用率が100%に近づかないように、より多くのスペースを解放する必要があります。
-psusi

@psusi本当です、コメントありがとう。ただし、(一時的な)ほぼすべての利用可能なスペースを通常のユーザーとして使用する機会は本当に実用的であり、ext4を使用すれば、それほど悪くはありません。unix.stackexchange.com
a / 7965/

7

Ubuntuでは、ごみ箱を使用してファイルを削除した場合、ファイルは完全には削除されなかった可能性があります。

ごみ箱を空にした後でも、ファイルは~/.local/share/Trash/expunged再起動後まで、おそらくはさらに長く残ります。

これには正当な理由は見つかりませんでしたが、スペースが足りなくなった場合はrm、削除されたゴミファイルを常に手動で削除します。


1
いい視点ね。私はコマンドラインで生きて死ぬ人の1人ですが、グラフィカルファイルマネージャを使用することはめったにありません。ただし、フォルダが隠れ場所として消去されていることにまだ気付いていません。空のゴミ箱のクリックは常に最終的なものであり、必要に応じてディスク領域を返しました。
マルコス

6
sudo lsof | grep "(deleted)$" | sed -re 's/^\S+\s+(\S+)\s+\S+\s+([0-9]+).*/\1\/fd\/\2/' | while read file; do sudo bash -c ": > /proc/$file"; done

説明:削除されたファイルのみを抽出するための
Grep lsof出力。Sedは各行からプロセスIDとファイル記述子IDを抽出し、formatの文字列を作成します{pid}/fd/{fid}。ループして各ファイルに何も出力せず、空に設定します。


3
エラーが発生しました "予期しないトークンの近くの構文エラー`( '"
マジッドゴルシャディ

5

syncここで何か助けになるかと思いますが、ほとんどの(「多くの」?)システムのIIRCのように、ファイルシステムは30秒ごとに同期されるべきではありません。

私はカーネルログをチェックして(そうdmesg)、何か厄介なことが起こっているlsofかどうかを確認し、実行されて、大きな削除されたファイルがまだ開いているかどうかを確認します(実際、削除されたファイルはlsof出力でそのようにマークされると思います)。

削除されたファイルがスペースを解放しない原因となる可能性のある2つの理由(リンクする質問で指摘されたこれらの1つ)は、

  • 実際に削除されていないファイル:他の場所にハードリンクされているファイルを削除した(より正確には、複数のリンクをunlink()持つファイルを編集した)
  • まだ開いているファイル:開いているファイルは、ディレクトリエントリではなく、ファイル、iノード自体を使用して保持されます。エントリを削除しても、iノードは開いている限りそこに残ります。

しかし、私はそれが非常に多くのファイルで起こるかもしれない特定の理由を知りません...


sync助けなかった。ログに関しては、Ubuntuシステムなので、かなりバグが多いので、通常はうるさいです。apport/ var / crashは77MBしかありませんが、毎晩apt-get更新がクラッシュするため、頻繁にデプロイされています。また、気づいたことatdは/ var /のような繰り返し線で/ syslogのログを殺到しているatd[8892]: File a0015c0152ab76 is in wrong format - abortingに/ var / spool / cron / atspoolでいくつかのファイルはもちろんの問題円形作り、すべて0の大きさだったので、おそらく
マルコス

1

CentOS 6.3は、実際に空にしないゴミ箱を空にしたときにゴミ箱にすることもできます。私は走っrm -rf ~/.local/share/Trash/expunged/たばかりになって、スペースを取り戻す方法を見つけることができませんでした。多くの頭をひっかいた。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.