web-dev-qa-db-ja.com

ディスクスペースがなくなった:スペースを占有しているものを見つけるにはどうすればよいですか

16.04を実行しているサーバーの1つで問題が発生しました。ディスク容量が残っていません。

何がスペースを占有しているのかわかりません。現在のディレクトリサイズを一覧表示するコマンドがあるので、すべてのスペースを占有してディレクトリ内を移動できますか?

75
Karl Morrison

Linuxでいつものように、仕事を成し遂げる方法は複数あります。ただし、CLIから実行する必要がある場合は、これが推奨される方法です。

ルートとして、またはSudoでこれを実行することから始めます。

du -cha --max-depth=1 / | grep -E "M|G"

Grepは、返される行をメガバイトまたはギガバイトの範囲の値で返される行に制限します。ディスクが十分に大きい場合は、|Tを追加してテラバイトの量を含めることもできます。ディスク上の実際のファイルではないため、/proc/sys、および/または/devでエラーが発生する場合があります。ただし、ルート内の残りのディレクトリに有効な出力を提供する必要があります。最大のものを見つけたら、そのディレクトリ内でコマンドを実行して、原因を絞り込むことができます。たとえば、/varが最大の場合、次のようにできます。

du -cha --max-depth=1 /var | grep -E "M|G"

それはあなたを問題の子供たちに導くはずです!

追加の考慮事項

上記のコマンドは確かにトリックを実行しますが、以下のコメントには建設的な批判がありました。

  1. 指定したgrepにより、ディレクトリまたはファイルの名前に大文字のGまたはMが含まれる場合、「K」値が返されることがあります。K値のディレクトリのいずれも絶対に表示したくない場合正規表現ゲームをより創造的で複雑なものにしたいと考えています。例えばgrep -E "^[0-9\.]*[MG]"
  2. どのドライブが問題であり、その上に検索に含めて時間を無駄にしたくない他のマウントされたドライブがある場合は、-xフラグをduコマンドに追加できます。 。そのフラグのマニュアルページの説明:

      -x, --one-file-system
          skip directories on different file systems
    
  3. duコマンドの出力を並べ替えて、最大値が下になるようにすることができます。これをコマンドの最後に追加するだけです:| sort -h

89
TopHat

これにはncduを使用できます。とてもうまくいきます。

Sudo apt install ncdu

enter image description here

71
Duncan

私はこのコマンドを使用します

Sudo du -aBM -d 1 . | sort -nr | head -20

奇妙な場所に何かを置いたため、/ディレクトリから実行する必要がある場合があります。

18
Charles Green

スペースの大部分を占めるディレクトリを見つける方法については、すでに多くの良い答えがあります。多数の小さなファイルではなく、少数の大きなファイルが主な問題であると信じる理由がある場合は、find / -size +10Mのようなものを使用できます。

13
Luca Citi

私はUbuntuを知らないので、答えを確認することはできませんが、昔のunix管理者としての経験に基づいてここに答えを投稿します。

  1. スペースが不足しているファイルシステムを調べる

    df -h
    

    すべてのファイルシステム、サイズ、および空き容量がリストされます。十分なスペースがあるファイルシステムを調査する場合にのみ時間を無駄にします。ファイルシステム全体が/ myfilesystemであると仮定します。/myfilesystemsのサブディレクトリにファイルシステムがマウントされている場合は、df出力を確認してください。その場合、次のspepsをこの状況に適合させる必要があります。

  2. このファイルシステムのファイルがどのくらいのスペースを使用しているかを調べる

    du -sh /myfilesystem
    

    -xオプションを使用して、このファイルシステムのメンバーであるファイルのみが考慮されることを保証できます。一部のUnixバリアント(Solarisなど)は、duの-xオプションを認識しません。その後、いくつかの回避策を使用して、ファイルシステムのduを見つける必要があります。

  3. 次に、表示されているファイルのduが、dfによって表示される使用済みスペースのサイズとほぼ同じかどうかを確認します。その場合、クリーンアップするために/ myfilesystemファイルシステムの大きなファイル/ディレクトリの検索を開始できます。

  4. ディレクトリ/.../dirの最大のサブディレクトリを見つけるには

    du -sk /.../dir/*|sort -n
    

    -kオプションを指定すると、duは単位なしでキロバイト単位で出力します。一部のシステムではこれがデフォルトの場合があります。その後、このオプションを省略できます。最大のファイル/サブディレクトリが出力の下部に表示されます。

  5. 不要になった大きなファイル/ディレクトリが見つかった場合は、適切な方法で削除できます。出力の上部にある小さなディレクトリを気にしないでください。削除しても問題は解決しません。まだ十分なスペースがない場合は、リストの下部に表示される大規模なサブディレクトリで手順4を繰り返します。

しかし、duの出力がdfによって表示される使用可能なスペースとほぼ等しくない場合はどうなりますか?

Du出力が大きい場合、別のファイルシステムがマウントされているサブディレクトリを見逃しています。 du出力がはるかに小さい場合、somファイルはdu inspectsのどのディレクトリにも表示されません。彼の現象にはさまざまな理由があります。

  1. 一部のプロセスは、既に削除されたファイルを使用しています。したがって、このファイルはディレクトリから削除され、duはそれらを見ることができません。しかし、ファイルシステムでは、プロセスがファイルを閉じるまで、それらのブロックはまだ使用中です。関連するプロセスを見つけて(たとえば、lsofを使用して)、このファイルを強制的に閉じます(たとえば、アプリケーションを停止するか、プロセスを強制終了する)。または、単にマシンを再起動します。

  2. 親ディレクトリの1つに別のファイルシステムがマウントされているため、もう表示されていないディレクトリにファイルがあります。したがって、ファイル/ myfilesysem/subdir/bigfileがあり、別のファイルシステムを/ myfilesystem/subdirにマウントすると、このファイルは表示されなくなり、

    du -shx /myfilesystem 
    

    / myfilesystem/subdir/bigfileのサイズを含まない値を報告します。そのようなファイルが存在するかどうかを確認する唯一の方法は、/ myfilesystem/subirをアンマウントし、

    ls -la /myfilesystem/subdir 
    

    ファイルが含まれている場合。

  3. Lsコマンドからは見えないディスク上のスペースを使用/予約する特別なタイプのファイルシステムがあります。これを表示するには特別なツールが必要です。

Duコマンドを使用したこの体系的な方法の他に、使用できる他の方法がいくつかあります。したがって、findコマンドを使用して、指定した値より大きいファイルを検索したり、指定した値より大きいファイル、新しく作成されたファイル、または特別な名前(* .log、core、*など)を持つファイルを検索できます.trc)。ただし、正しいファイルシステムで作業するには、1で説明したように常にdfを実行する必要があります

11
miracle173

また、コマンドを使用しないことに興味がある場合は、アプリがあります: Filelight

任意のフォルダのディスク容量を使用しているものをすばやく視覚化できます。

enter image description here

9
Gabriel

Sudo apt-get autoremoveを試してください(まだ行っていない場合)。

5
Donald Shahini

私はこれをよく使います

du -sh /*/

その後、大きなフォルダーを見つけたら、それに切り替えてさらに調査します

cd big_dir
du -sh */

必要に応じて、自動的にソートすることもできます

du -s /*/ | sort -n
3
phuclv

Filelightのようなツールの出力は特に価値がありますが、あなたの場合のように、サーバーには通常GUIがインストールされていませんが、duコマンドは常に利用可能です。

私が普段していることは:

  • du出力をファイルに書き込みます(du / > du_output.txt);
  • マシンにファイルをコピーします。
  • DuFS を使用して、du出力を一時ディレクトリに「マウント」します。 DuFSは、duの出力に従って、Fuseを使用して仮想ファイルシステムを作成します(=ファイルは実際には作成されず、すべて偽物です)。
  • この一時ディレクトリでFilelightまたは別のGUIツールを実行します。

免責事項:私はdufsを書きました-ヘッドレスマシンのディスク領域を占有しているものを見つけなければならないことが多いからです。

2
Matteo Italia

実際には答えではありませんが、補遺です。

スペース不足のため、@ ermanの回答からncduをインストールできません。

いくつかの提案

  • Sudo apt clean allは、ダウンロード済みのパッケージを削除します。安全
  • Sudo rm -f /var/log/*gz 1週間または2週間より古いログファイルを削除します-新しい/現在のログを削除しません。最も安全
  • Sudo lsof | grep deletedは、開いているすべてのファイルをリストしますが、ディスクから削除されたファイルまでフィルタリングします。かなり安全
  • Sudo rm /tmp/*いくつかの一時ファイルを削除します-何かがそれらを使用している場合、プロセスを混乱させる可能性があります。本当に安全ではない

`lsof oneは次のような行を返します:

server456 ~ $ lsof | grep deleted
init          1          root    9r      REG              253,0  10406312       3104 /var/lib/sss/mc/initgro                        ups (deleted)
salt-mini  4532          root    0r      REG              253,0        17     393614 /tmp/sh-thd-1492991421                         (deleted)

Init行ではあまりできませんが、2行目では、salt-minionが開いているファイルが削除されており、サービスの再起動によってすべてのファイルハンドルが閉じられるとディスクブロックが返されることを示しています。

ここでのその他の一般的な容疑者には、syslog/rsyslog/syslog-ng、squid、Apache、またはサーバーが実行する「重い」プロセスが含まれます。

2
Criggie