web-dev-qa-db-ja.com

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

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

マウントされたパーティションにnoatimeフラグが付けられました。

157
user11350

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

使用する

lsof +L1

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

249

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

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

まずlsofを実行します|ファイルを保持しているプロセスを特定するために削除されたgrep

[[email protected] 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

その後

[[email protected] 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

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

29
Adrián Deccico

1つの可能性として、削除したファイルのファイルシステム内の参照が多い可能性があります。ハードリンクを作成した場合、複数のファイル名が同じデータをポイントし、データ(実際のコンテンツ)は、それへのすべての参照が削除されるまで、フリー/使用可能としてマークされません。ファイルを削除する前に、それらをstat(リンクという名前のエントリ)するか、それらに対してls -lを実行します(2列目である必要があります)。

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

8

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

[[email protected]]# 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>
6
luka5z

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

  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
Aminah Nuraini

私はあなたのトンが/varおよびg = zipファイルはFSが縮小することを期待していますが、拡大する代わりに、syslogの再起動にサービスを提供していることを確認してください。

lsof -v file

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

1
user1802263

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

トラブルシューティングを支援するために、ドライブのスペースがどこで消費されているかを通知するツールを使用します。duを使用して、スペースの移動先の概要を取得できます。さらに良いのは、 xdiskusage (このようなものはたくさんあります)のようなグラフィカルツールを使用して、原因を特定することです。 xdiskusageとその仲間は、スペースがどこに向かっているのかを見つけるために、最大のスペースを独り占めすることを可能にします。

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

1
sleske

私はEXT2を使用しています。この状況でFSCKが役に立ちました。今すぐshutdown -Fを試してみてください。いくつかの再起動とfsckの後に、使用されているスペースの半分が表示されます。

0
Marcellus

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

0
Chen Levy