Больше места на диске: как я могу найти, что занимает пространство?

39

У меня возникла проблема на одном из моих серверов с 16.04: осталось свободное место.

Я понятия не имею, что занимает пространство. Есть ли команда, чтобы перечислять текущие размеры каталога, чтобы я мог перемещаться и заканчивать в каталоге, занимающем все пространство?

    
задан Karl Morrison 04.05.2017 в 17:21
источник

11 ответов

43

Как всегда в Linux, есть более чем один способ выполнить работу. Однако, если вам нужно сделать это из CLI, это мой предпочтительный метод:

Я запускаю его как root или sudo:

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

grep должен ограничивать возвращаемые строки теми, которые возвращаются со значениями в диапазоне Megabyte или Gigabyte. Если ваши диски достаточно велики, вы можете добавить |T , а также включить количество терабайтов. Вы можете получить некоторые ошибки на /proc , /sys и / или /dev , поскольку они не являются реальными файлами на диске. Тем не менее, он должен по-прежнему предоставлять действительный вывод для остальных каталогов в корне. После того, как вы найдете самые большие, вы можете запустить команду внутри этого каталога, чтобы сузить свой путь до преступника. Например, если /var было самым большим, вы могли бы сделать это следующим образом:

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

Это должно привести к проблемам детей!

Дополнительные соображения

В то время как вышеприведенная команда, безусловно, сделает трюк, у меня была некоторая конструктивная критика в комментариях ниже, в которых были указаны некоторые вещи, которые вы также могли бы включить.

  1. Предоставленный grep может привести к возврату случайного «K», если имя каталога или файла имеет значение G или M. Если вы абсолютно не хотите, чтобы какой-либо из K-значных каталогов отображался вы хотите, чтобы ваша игра в регулярном выражении была более творческой и сложной. например %код%
  2. Если вы знаете, какой диск является проблемой, и на нем есть другие смонтированные диски, которые вы не хотите тратить время, в том числе на поиск, вы можете добавить флаг grep -E "^[0-9\.]*[MG]" в команду -x . Описание страницы этого флага:

      -x, --one-file-system
          skip directories on different file systems
    
  3. Вы можете сортировать вывод команды du , чтобы наивысшее значение было внизу. Просто добавьте это в конец команды: du

ответ дан TopHat 04.05.2017 в 17:36
источник
42

Вы можете использовать ncdu для этого. Он работает очень хорошо.

sudo apt install ncdu

    

ответ дан Erman 04.05.2017 в 17:28
14

Я использую эту команду

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

Иногда мне нужно запустить его из каталога / , поскольку я поместил что-то в нечетное местоположение.

    
ответ дан Charles Green 04.05.2017 в 17:25
10

Уже есть много хороших ответов о том, как найти каталоги, занимающие большую часть пространства. Если у вас есть основания полагать, что основная проблема связана с несколькими большими файлами, а не с несколькими маленькими, вы можете использовать что-то вроде find / -size +10M .

    
ответ дан Luca Citi 04.05.2017 в 22:21
9

Я не знаю Ubuntu и не могу проверить свой ответ, но отправлю здесь свой ответ, основанный на моем опыте как администратор unix давно.

  1. Узнайте, какая файловая система исчерпала пространство

    df -h
    

    отобразит всю файловую систему, ее размер и свободное пространство. Вы просто теряете время, если исследуете файловые системы, у которых достаточно места. Предположим, что полная файловая система - это / myfilesystem. проверьте выход df, если есть файловые системы, установленные на поддиректорах / myfilesystems. Если это так, следующие изменения должны быть адаптированы к этой ситуации.

  2. Узнайте, сколько пространства используется файлами этой файловой системы

    du -sh /myfilesystem
    

    Параметр -x может использоваться, чтобы гарантировать, что учитываются только файлы, входящие в эту файловую систему. Некоторые Unix-варианты (например, Solaris) не знают опции -x для du. Затем вы должны использовать некоторые обходные пути, чтобы найти дю файловой системы.

  3. Теперь проверьте, является ли дю видимых файлов приблизительно размером используемого пространства, отображаемого df. Если это так, вы можете начать поиск больших файлов / каталогов файловой системы / myfilesystem для очистки.

  4. , чтобы найти самые большие подкаталоги каталога /.../dir use

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

    параметр -k заставляет выводить sie в килобайте без какой-либо единицы. Это может быть значение по умолчанию для некоторых систем. Тогда вы можете опустить эту опцию. Самые большие файлы / подкаталоги будут показаны внизу вывода.

  5. Если вы нашли большой файл / каталог, который вам больше не нужен, вы можете удалить его соответствующим образом. Не беспокойтесь о небольших каталогах в верхней части вывода. Он не решит вашу проблему, если вы их удалите. Если у вас все еще недостаточно места, вы можете повторить шаг 4 в больших подкаталогах, которые отображаются в нижней части списка.

Но что произошло, если выход du не является приблизительно доступным пространством, отображаемым df?

Если выход du больше, вы пропустили подкаталог, в котором монтируется другая файловая система. Если выход du намного меньше, то som-файлы не отображаются ни в одной директории, которую проверяет. Для его явлений могут быть разные причины.

  1. некоторые процессы используют файл, который уже был удален. Поэтому эти файлы были удалены из каталога, и du не может их видеть. Но для файловой системы их блоки все еще используются до тех пор, пока процессы не закроют файлы. Вы можете попытаться найти соответствующие процессы (например, lsof) и заставить их закрыть эти файлы (например, остановив приложение или убив процессы). Или просто перезагрузите компьютер.

  2. есть файлы в каталогах, которые больше не видны, потому что в одном из своих родительских каталогов монтируется другая файловая система. Поэтому, если у вас есть файл / myfilesysem / subdir / bigfile и теперь смонтируйте другую файловую систему в / myfilesystem / subdir, вы больше не видите этот файл и

    du -shx /myfilesystem 
    

    сообщит значение, которое не содержит размер / myfilesystem / subdir / bigfile. Единственный способ узнать, существуют ли такие файлы, это размонтировать / myfilesystem / subir и проверить с помощью

    ls -la /myfilesystem/subdir 
    

    , если он содержит файлы.

  3. Могут существовать специальные типы файловых систем, которые используют / резервируют пространство на диске, которое не отображается в команде ls. Вам нужны специальные инструменты, чтобы отобразить это.

Помимо этого систематического способа использования команды du есть и другие, которые вы можете использовать. Таким образом, вы можете использовать команду find для поиска файлов, которые больше, чем какое-то значение, которое вы поставляете, вы можете искать файлы, которые больше, чем какое-либо значение, которое вы поставляете или которые были недавно созданы или имеют специальное имя (например, * .log, core, * .trc). Но вы всегда должны делать df, как описано в 1, чтобы вы работали над правой файловой системой

    
ответ дан miracle173 05.05.2017 в 09:12
6

Если вы также заинтересованы в том, чтобы не использовать команду, вот приложение: Filelight

Он позволяет быстро визуализировать, что использует дисковое пространство в любой папке.

    

ответ дан Gabriel 05.05.2017 в 23:32
4

Попробуйте sudo apt-get autoremove удалить неиспользуемые файлы, если вы этого еще не сделали

    
ответ дан Donald Shahini 05.05.2017 в 14:36
3

Я часто использую этот

du -sh /*/

Тогда, если я найду несколько больших папок, я переключусь на него и продолжу расследование

cd big_dir
du -sh */

При необходимости вы также можете автоматически сортировать его с помощью

du -s /*/ | sort -n
    
ответ дан Lưu Vĩnh Phúc 05.05.2017 в 05:05
2

Не совсем ответ, но добавление.

Вам тяжело не хватает места и не удается установить ncdu из ответа @erman.

Некоторые предложения

  • sudo apt clean all для удаления пакетов, которые вы уже загрузили. SAFE
  • sudo rm -f /var/log/*gz очищает файлы журналов старше недели или двух - не будет удалять более новые / текущие журналы. САМЫЕ БЕЗОПАСНЫЕ
  • sudo lsof | grep deleted перечислить все открытые файлы, но отфильтровать до тех, которые были удалены с диска. FAIRLY SAFE
  • sudo rm /tmp/* удаляет некоторые временные файлы - если что-то их использует, вы можете нарушить процесс. НЕ ДЕЙСТВИТЕЛЬНО ЧТО БЕЗОПАСНО

Для этого можно вернуть строки следующим образом:

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, но во второй строке показано, что солонка-миньон имеет открытый файл, который был удален, а блоки диска будут возвращены после того, как все дескрипторы файлов будут закрыты перезагрузкой службы.

Другие распространенные подозреваемые здесь включают в себя syslog / rsyslog / syslog-ng, squid, apache или любой процесс, выполняемый вашим сервером, который является «тяжелым».

    
ответ дан Criggie 05.05.2017 в 07:11
2

Я нахожу особенно ценным вывод таких инструментов, как Filelight, но, как и в вашем случае, на серверах обычно нет установленного графического интерфейса, но команда du всегда доступна.

Что я обычно делаю:

  • записать файл du в файл ( du / > du_output.txt );
  • скопировать файл на мою машину;
  • используйте DuFS , чтобы «смонтировать» выход du во временном каталоге; DuFS использует FUSE для создания виртуальной файловой системы (= файлы фактически не созданы, это все подделка) в соответствии с выходом du ;
  • запустите Filelight или другой инструмент GUI в этом временном каталоге.

Отказ от ответственности: я написал dufs - именно потому, что мне часто приходится выяснять, какое пространство на болоте занимают на безголовых машинах.

    
ответ дан Matteo Italia 06.05.2017 в 18:57
-1

Аналогично @TopHat, но фильтрует некоторые файлы, если они имеют M, G или T в имени. Я не верю, что он пропустит размер в первом столбце, но он не будет соответствовать имени файла, если вы не назовете файлы творчески.

du -chad 1 . | grep -E '[0-9]M[[:blank:]]|[0-9]G[[:blank:]]|[0-9]T[[:blank:]]'

Обнаружены ключи командной строки здесь , так как я не знал, что сделал c или a.

    
ответ дан user685769 05.05.2017 в 03:16