Linuxのdfがファイル削除後に正しい空き容量を表示しない


143

ファイルを保存するために使用されるファイルサーバーがあります。ファイルは、1週間または1年間存在します。残念ながら、サーバーからファイルを削除すると、dfコマンドは解放されたスペースを反映しません。そのため、最終的にはサーバーがいっぱいになり(df99%が表示されます)、そこに数十GBの空き容量がある場合を除き、スクリプトはそれ以上ファイルを送信しません。

私が得たnoatimeことは、どんな違いがあれば取り付けられたパーティションにフラグを。


これは単一のパーティションまたはすべてのパーティションで発生していますか?
カレド

それは、メインデータパーティションで起こっていることです。これは、ファイルの書き込み/削除のみを行うので、私が気にする唯一のパーティションです。

ソリューションまたはそのリンクを教えてください。

どのファイルシステムですか?DFはスーパーブロックの統計を行います。ファイルシステムがsb iノードを更新していない可能性があります。キャッシュをフラッシュしようとしましたか?

ext4を使用します。キャッシュをどのようにフラッシュしますか?

回答:


236

ファイル名を削除しても、実際にはファイルは削除されません。他のプロセスがファイルを開いたままにしているため、削除されません。そのプロセスを再起動または強制終了して、ファイルを解放します。

つかいます

lsof +L1

削除された(リンクされていない)ファイルを使用しているプロセスを見つけます。


2
削除されたファイルは1か月以上アクセスされず、それらにアクセスするプロセスはnginxだけなので、疑わしいです。

39
+1。また、「lsof + L1」は、どのプログラムがファイルを開いたままにしているかを示します。
ペール

4
rootで「lsof -n | grep file」を実行すると、プロセスが何らかの理由でファイルを開いたままにしておくためにファイルがどれだけ長く続くことができるかに驚くでしょう。他のすべてが失敗した場合、再起動しますが、それを提案するのは気分が悪いですが、ファイルに何も保持されていないことを確実に確認します。ペールごとに、おそらくlsof + L1がより良い方法です。
-ScottZ

3
あなたはちょうど私を救った!93Gログファイルを削除しましたが、スペースを取り戻せず、理由を特定できませんでした。ありがとう。
ルークカズンズ

1
同じ行に沿って、これが他の人に役立つ場合、私は大きなnginx access.logファイルを消去しましたが、nginxを再起動した後にのみスペースを再利用できました:service nginx restart
Nick

28

Ignacioが言及しているように、ファイルを削除しても、そのファイルに対して開いているハンドルを持つプロセスを削除するまでスペースは解放されません。

それでも、プロセスを強制終了せずにスペースを再利用できます。必要なのは、ファイル記述子を削除することだけです。

最初にlsofを実行します| ファイルを保持しているプロセスを識別するためにgrepが削除されました

[hudson@opsynxvm0055 log]$ /usr/sbin/lsof |grep deleted
java       8859   hudson    1w      REG              253,0 3662503356    7578206 /crucible/data/current/var/log/fisheye.out (deleted)

次に実行します:

cd /proc/PID/fd

それから

[hudson@opsynxvm0055 fd]$ ls -l |grep deleted
total 0
l-wx------ 1 hudson devel 64 Feb  7 11:48 1 -> /crucible/data/current/var/log/fisheye.out (deleted)

「1」はファイル記述子です。「> FD」と入力して、そのスペースを再利用します

> 1

ファイルを保持している他のプロセスがある場合、操作を繰り返す必要があります。


1
何をし> FDますか?
Pred

それはファイルディスクリプタ削除
アドリアンDeccico

2
この>コマンドには名前がありますか?それを使用できるようにするには、zshからbashに切り替える必要がありました。zshで実行することは可能ですか?
アリエラ

1
出力リダイレクトであるため、ファイルが切り捨てられます。長いfromは「echo -n> 1」または「true> 1」です。FDを実際に削除するのではなく、後で空のファイルを指すだけです。
eckes

8

1つの可能性は、削除したファイルがファイルシステム内でより多くの参照を持っていることです。ハードリンクを作成した場合、いくつかのファイル名は同じデータを指し、データ(実際のコンテンツ)は、すべての参照が削除されるまで空き/使用可能としてマークされません。ファイルを削除する前に、stats(Linksという名前のエントリ)またはls -lを実行します(2番目の列になります)。

ファイルが他の場所で参照されていることが判明した場合、iノード番号を見つけるにはls -iファイルを検索し、-inum <inode-number>で検索して検索する必要があると思いますそのファイルへの他の参照(おそらく、同じファイルシステム内にとどまるために-mountも使用したいでしょう)。


4

ファイルは、開いているプロセスによってまだロックされています。スペースを解放するには、次の手順を実行します。

  1. 実行sudo lsof | grep deletedして、ファイルを保持しているプロセスを確認します。結果の例:

    $ sudo lsof | grep deleted
    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
    cron     1623 root    5u   REG   0,21        0 395919638 /tmp/tmpfPagTZ4 (deleted)
    
  2. を使用してプロセスを強制終了しますsudo kill -9 {PID}。上記のサンプルでは、​​PIDは1623です。

    $ sudo kill -9 1623
    
  3. 実行dfして、スペースがすでに解放されているかどうかを確認します。まだいっぱいになっている場合は、数秒待ってからもう一度確認する必要があります。


4

パーティションが、ディスクスペースの特定の部分をルート使用のみのために予約するように構成されている場合df、このスペースを使用可能として含めません。

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

ファイル/ディレクトリを削除してスペースを取り戻した後でも、非rootユーザーは特定のパーティションに書き込むことができません。

rootユーザーおよび非rootユーザーとしてデバイス上にファイルを作成しようとすることにより、そうであるかどうかを簡単に確認できます。

さらに、次を実行してファイルシステムの構成を確認できます。

tune2fs -l <device> | egrep "Block count|Reserved block count

自分で実際の%を計算します。

ルートのみの使用のために予約されているディスク%を変更するには、次を実行します。

tune2fs -m <percentage> <device>

1

他の答えは正解です。ファイルを削除してもスペースが解放されない場合、通常はファイルが開いたままであるか、他のハードリンクが存在します。

トラブルシューティングを支援するために、ドライブのスペースがどこに費やされているかを示すツールを使用duします。スペースを使用する場所の概要を取得するために使用できます。さらに良いことに、xdiskusageなどのグラフィカルツールを使用して(このようなものが多数あります)、犯人を追い詰めます。xdiskusageと友人は、スペースがどこに向かっているのかを見つけるために、最大のスペース豚を掘り下げることができます。

そうすれば、2番目のハードリンクのためにまだスペースを占有しているファイルをすばやく見つけることができます。また、削除されたが開いているファイルによって占有されているスペースも表示されます(ファイル名を読み取れないため、(許可が拒否されたように)。


1

私はあなたの多くがredhat inでこれを行っ/varており、FSが縮小することを期待してファイルをgzipしていますが、代わりに拡大するので、syslogを再起動してください。そして

lsof -v file

とにかくこれを表示します。


1
これは実際にはあまり追加されません。受け入れられた回答は2001年のその背後にあるロジックをカバーしていました。50人の担当者がいる場合、既存の回答に修飾子を追加する場合はコメントを使用します。
アンドリューB

0

もう1つのオプション:ログ、コアなどのデータを継続的に作成しているプロセスが原因で、ディスクがいっぱいになっている可能性があります。スペースは実際には解放されているが、すぐにいっぱいになる可能性があります。私は実際にそのようなケースを見てきました。dfこの場合、単純に穴の絵を表示しません。du詳細を学ぶために使用します。


0

私はEXT2を使用していますが、FSCKはこの状況で私を助けてくれました。shudown -F nowを試してみてください。再起動とfscksの後、使用済みの領域が半分になります。


1
親愛なるマーセラス、あなたの解決策は受け入れられた答えに含まれています。あなたがに強制されていない場合は、時にはあなたは、再起動を行うにはしたくない...
ディア・ハンター

-1

どの削除されたファイルがメモリを占有しているかを確認するには、次のコマンドを入力します

 $ sudo lsof | grep deleted

メモリを保持する削除されたファイルが表示されます。

次に、pidまたはnameでプロセスを強制終了します

$ sudo kill <pid>
$ df -h

今、あなたが同じメモリを持っていることを確認してください

以下のコマンドを入力しない場合、どのファイルがメモリを占有しているかを確認します

# cd /
# du --threshold=(SIZE)

しきい値サイズを超えて占有しているファイルが表示される任意のサイズに言及し、メモリを保持するファイルを削除します


-4

ターミナルを開くこのコマンドを試してくださいdf -Th次にこのコマンドを使用しますsudo du -h --max-depth = 1 /このコマンドでは、ディスク使用量の詳細が表示され、rootユーザーとしてファイルを削除します(root-local-share-trash)ファイルを削除します

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