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

Я столкнулся с проблемой на одном из моих серверов, работающих 16.04: нет никакого оставленного дискового пространства.

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

131
задан 5 May 2017 в 07:02

13 ответов

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

Я начинаю с запуска от имени root или с помощью 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 может привести к тому, что время от времени будет возвращаться значение «K», если имя каталога или файла имеет заглавную букву G или M. Если вы абсолютно не хотите, чтобы отображался какой-либо из K-значных каталогов, вам нужно сделать свою игру с регулярными выражениями более творческой и сложной. например grep -E "^ [0-9 \.] * [MG]"
  2. Если вы знаете, на каком именно диске возникла проблема, и на нем есть другие смонтированные диски, которые вы не хотите тратить зря Включая поиск, вы можете добавить флаг -x в свою команду du . Описание этого флага на странице руководства:

      -x, --one-file-система
      пропустить каталоги в разных файловых системах
     
  3. Вы можете отсортировать вывод команды du так, чтобы максимальное значение находилось внизу. Просто добавьте это в конец команды: | sort -h

146
ответ дан 22 November 2019 в 23:11

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

sudo apt install ncdu

enter image description here

98
ответ дан 22 November 2019 в 23:11

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

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

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

20
ответ дан 22 November 2019 в 23:11

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

14
ответ дан 22 November 2019 в 23:11

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

  1. Узнать, в какой файловой системе не хватает места

     df -h
     

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

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

     du -sh / myfilesystem
     

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

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

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

     du -sk / ...  / каталог / * | сортировка -n
     

    опция -k заставляет du выводить 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, чтобы вы работали с правильной файловой системой

12
ответ дан 22 November 2019 в 23:11

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

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

enter image description here

11
ответ дан 22 November 2019 в 23:11

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

4
ответ дан 22 November 2019 в 23:11

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

du -sh /*/

Затем, если я найду какие-то большие папки, я переключусь на него и проведу дальнейшее исследование

cd big_dir
du -sh */

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

du -s /*/ | sort -n
4
ответ дан 22 November 2019 в 23:11

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

У вас недостаточно места, и вы не можете установить ncdu из ответа @erman.

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

  • sudo apt clean all для удаления пакетов, которые вы уже загрузили. БЕЗОПАСНЫЙ
  • sudo rm -f / var / log / * gz очистить файлы журналов старше недели или двух - не удаляет новые / текущие журналы. САМЫЙ БЕЗОПАСНЫЙ
  • sudo lsof | grep deleted перечисляет все открытые файлы, но фильтрует те, которые были удалены с диска. FAIRLY SAFE
  • 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)

Ничего не могу сделать для строки инициализации, но вторая строка предполагает, что у salt-minion есть открытый файл, который был удален, а диск блокируется будет возвращено после того, как все дескрипторы файлов будут закрыты перезапуском службы.

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

2
ответ дан 22 November 2019 в 23:11

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

Обычно я делаю следующее:

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

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

2
ответ дан 22 November 2019 в 23:11

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

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

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

-1
ответ дан 22 November 2019 в 23:11

Для меня важно удалить директорию / mnt из вычислений (а также сэкономить время). Поскольку мой / mnt содержит другие разделы без исключения, результат будет следующим:

$time sudo du -cha --max-depth=1 /
  (... SNIP ...)

du: cannot access '/proc/27561/fd/3': No such file or directory
du: cannot access '/proc/27561/fdinfo/3': No such file or directory
270G    /
270G    total

real    2m21.540s

С / mnt исключение и подавление сообщений об ошибках:

$time sudo du -cha --max-depth=1  --exclude=/mnt / 2>/dev/null
  (... SNIP ...)

13M     /sbin
1.8M    /run
26G     /
26G     total

real    0m25.019s
  • 2> / dev / null отправляет сообщения об ошибках в битовое ведро.
  • 2 минуты сэкономлены за исключением 246 ГБ Windows и других дистрибутивов Ubuntu.
  • Теперь отображается точное / общее количество 26 ГБ.
  • Другие пользователи могут необходимо исключить каталоги / media или / run / user / 1000 .
0
ответ дан 5 January 2021 в 22:25

Перейдите в папку, которую вы хотите проверить, и используйте:

for i в `echo *` ; do echo $ i && du -sh $ i; готово; ,

команда выводит имя файла и размер, который он занимает на диске, в читаемом формате.

Если вы хотите проверять только папки, замените 'echo *' с 'echo * /' .

0
ответ дан 5 January 2021 в 22:25

Другие вопросы по тегам:

Похожие вопросы: