Нет больше места на диске: как я могу найти то, что занимает место?

82

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

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

Карл Моррисон
источник
1
Проверьте анализатор использования диска
Pranal Narayan
@PranalNarayan Нет GUI, так как он на моем сервере, я боюсь :(
Карл Моррисон
1
Черт возьми , теперь я пошел искать, нашел этот bugs.launchpad.net/ubuntu/+source/baobab/+bug/942255 и хотел бы, чтобы это было вещь.
Сэм
1
«Не GUI, это сервер»: вы можете установить приложение GUI (при условии, что оно вас устраивает и библиотеки поддержки находятся на сервере) и использовать его на локальном экране через X11-tunnelled-through-SSH с чем-то вроде export DISPLAY=:0.0; ssh -Y <user>@<server> filelight(замените filelightпредпочитаемым инструментом). Конечно, когда места не осталось, если у вас еще нет установленного инструмента, вам все равно придется использовать что-то еще!
Дэвид
4
@DavidSpillett Как уже говорилось, на сервере не осталось места . Так что я ничего не могу установить.
Карл Моррисон

Ответы:

95

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

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

TopHat
источник
Это именно то, что я делаю.
Легкость гонок с Моникой
5
Ваш grep возвращает также любые папки с буквами M или G в их именах. Творческое регулярное выражение должно попадать в числа с дополнительной точкой + M | G, может быть"^[0-9]*[.]*[0-9]*[MG]"
Xen2050
4
Если вы знаете, что проблема связана с одним диском, вы можете использовать -xопцию, чтобы duостаться на этом диске (предоставляется в командной строке). Вы также можете проложить канал, sort -hчтобы правильно отсортировать мегабайты / гигабайты понятные человеку значения. Я обычно отказывался от --max-depthопции и просто искал весь диск таким образом, сортируя соответственно, чтобы получить самые большие вещи в нижней части.
Музер
1
@alexis Мой опыт показывает, что иногда я сталкиваюсь с другим мусором, смонтированным ниже точки монтирования, в которой я заинтересован (особенно, если это так /), и использование -xдает мне гарантию, что я не буду неправильно подсчитывать вещи. Если ваша система /заполнена, и у вас есть отдельно смонтированный /homeили какой - либо другой инструмент , использование -x- это в значительной степени необходимость избавиться от ненужных вещей. Так что я считаю, что проще использовать его постоянно, на всякий случай.
Музер
1
Если у вас есть вид, вам не нужен grep.
Стоп Harm Monica
77

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

sudo apt install ncdu

введите описание изображения здесь

Дункан
источник
34
Я пинаю себя, поскольку я обычно использую эту программу, однако, так как места не осталось, я не могу установить ее, ха-ха
Карл Моррисон
@KarlMorrison Я вижу несколько возможных решений, просто смонтируйте его поверх sshfs на другом компьютере и запустите там ncdu (при условии, что у вас уже есть ssh-сервер ..) - или, если у вас нет ssh-сервера, вы можете сделать наоборот, установите ncdu на другом сервере и смонтируйте его с помощью sshfs и запустите ncdu с монтирования (при условии, что у вас уже есть sshfs на сервере) - или, если у вас его нет, ... если ncdu - единственный скрипт, вы может просто curl http://path/to/ncdu | sh, и он будет работать в кэше ввода-вывода ввода-вывода в памяти, но это потребует некоторой удачи. возможно, есть способ создать
RAM
@KarlMorrison или вы можете загрузить живой образ Linux и установить его там.
после установки введите sudo ncdu /из командной строки. sudoпотому что, если вы не введете sudo, он не будет сообщать о размерах папок, принадлежащих пользователю root, и /потому что, если вы не введете его, он будет сообщать только рекурсивно вниз из папки, в которой вы находитесь
Макс Кэрролл
19

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

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

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

Чарльз Грин
источник
Давать вам +1 за это работает! Однако решение TopHats на самом деле читает мой диск быстрее!
Карл Моррисон
Я часто нахожу более полезным делать это без -d 1переключателя (и обычно с lessвместо head -20), чтобы получить полный рекурсивно перечисляемый список всех файлов и каталогов, отсортированных по месту, которое они занимают. Таким образом, если я вижу каталог, занимающий много места, я могу просто прокрутить вниз, чтобы увидеть, действительно ли большая часть пространства занята каким-то конкретным файлом или подкаталогом в нем. Это хороший способ найти ненужные файлы и каталоги, которые нужно удалить, чтобы освободить место: просто прокрутите вниз, пока не увидите то, что вы не хотите сохранить, удалите его и повторите.
Илмари
@KarlMorrison он не читает его быстрее, он просто sortожидает завершения вывода, прежде чем начать вывод.
Муру
@ Муру А, ладно. Тем не менее, я получаю информацию быстрее, чтобы начать быстрее, если это лучший термин!
Карл Моррисон
13

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

Лука Чити
источник
11

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

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

    df -h
    

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

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

    du -sh /myfilesystem
    

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

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

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

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

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

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

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

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

  1. некоторые процессы используют файл, который уже был удален. Поэтому эти файлы были удалены из каталога, и вы их не видите. Но для файловой системы их блоки все еще используются, пока процессы не закроют файлы. Вы можете попытаться найти соответствующие процессы (например, с помощью 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
источник
На занятом сервере вы не всегда можете размонтировать вещи. Но вы можете привязать верхний каталог к ​​временному каталогу, и он не будет включать другие монтирования и предоставит доступ к скрытым файлам.
Зан Рысь
До появления systemd у меня часто возникали сбои монтирования, что приводило к заполнению / mount мусором. Запись резервной копии в / mnt / backup без подключения USB-накопителя, например. Теперь я проверяю, есть ли у этих рабочих мест требования к монтажу.
Зан Рысь
@ZanLynx Спасибо, я никогда не слышал о Монтировании до
miracle173
@ZanLynx: не только на занятых серверах. Представьте, что у вас есть /tmpотдельная файловая система (например, tmpfs) и что-то создало файлы /tmpдо того, как они стали точкой монтирования в другой файловой системе. Теперь эти файлы находятся в корневой файловой системе, скрытые точкой монтирования, и вы не можете получить к ним доступ без перезагрузки в режиме восстановления (который не обрабатывается /etc/fstab) или, как вы предлагаете, bind-mount.
Дэвид Фёрстер
9

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

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

введите описание изображения здесь

Габриель
источник
Это сервер, на котором я SSH, без графического интерфейса.
Карл Моррисон
@KarlMorrison Я думаю, что есть способы запуска программ с графическим интерфейсом через ssh, но это идея на потом, когда у вас будет место для установки пакетов
Xen2050
@ Дэвид О да, я пытаюсь выбраться из этого. Раньше это было необходимо на другой платформе, которую я использовал. Я исправлю этот комментарий.
@Karl да, это легко, если X уже установлен на клиенте: ssh -X <your host>а затем запустите вашу программу из командной строки
@MarkYisri суть в том, что вам нужно установить программу и ее зависимости. А в случае с Filelight требуются как минимум KDElibs и Qt, которые не очень малы. Посмотрите, например, эту страницу для filelight пакета Ubuntu , обратите внимание, сколько у него зависимостей.
Руслан
5

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

Дональд Шахини
источник
1
Уже делал это раньше :( Но хорошая идея для других!
Карл Моррисон
3

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

du -sh /*/

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

cd big_dir
du -sh */

При необходимости вы также можете сделать это автоматически с

du -s /*/ | sort -n
phuclv
источник
2

Не совсем ответ - но приложение.

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

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

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

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

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

Criggie
источник
2

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

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

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

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

Matteo Italia
источник
Вы можете просто отсортировать -n du_output.txt
Zan Lynx
Я нахожу графическое отображение использованного пространства более интуитивным.
Matteo Italia
-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
источник