Отслеживание места на диске в Linux?


532

При администрировании систем Linux я часто испытываю трудности с поиском виновника после заполнения раздела. Я обычно использую, du / | sort -nrно на большой файловой системе это занимает много времени, прежде чем возвращаются какие-либо результаты.

Кроме того, это обычно успешно выдвигает на первый план самого худшего преступника, но я часто прибегал к помощи duбез sort более тонких случаев, а затем приходилось перелистывать результаты.

Я бы предпочел решение для командной строки, которое основано на стандартных командах Linux, поскольку мне приходится администрировать довольно много систем, и установка нового программного обеспечения - это сложная задача (особенно когда не хватает места на диске!)


1
@ Барт, спасибо, что нашли время, чтобы улучшить посты здесь, но могу ли я попросить вас быть немного внимательнее при добавлении тегов? Теги не для наглядности, они описывают вопрос. Дисковый тег здесь не подходит (см. Его описание тегов), и по крайней мере два из тегов, которые вы добавили в этом предложенном редактировании, не были уместны (Kali не Debian, и в них не участвуют PPA).
Стивен Китт

Ответы:


615

Попробуйте ncduотличный анализатор использования дисков в командной строке:

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


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

14
sudo apt install ncduна Ubuntu получает это легко. Это здорово
Орион Эдвардс

10
Вы, наверное, знаете, в какой файловой системе недостаточно места. В этом случае вы можете использовать ncdu -xтолько для подсчета файлов и каталогов в той же файловой системе, что и сканируемый каталог.
Люк

7
лучший ответ. также: sudo ncdu -rx /должен давать чистое чтение ТОЛЬКО самых больших каталогов / файлов ТОЛЬКО на корневом диске. ( -r= только для чтения, -x = оставаться в той же файловой системе (то есть: не проходить через другие монтирования файловой системы))
bshea

5
У меня так мало места, что я не могу установить ncdu
Chris

337

Не иди прямо к du /. Используйте, dfчтобы найти раздел, который причиняет вам боль, а затем попробуйте duкоманды.

Я люблю пробовать

# U.S.
du -h <dir> | grep '[0-9\.]\+G'
# Others
du -h <dir> | grep '[0-9\,]\+G'

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

Как отмечает @jchavannes в комментариях, выражение может стать более точным, если вы обнаружите слишком много ложных срабатываний. Я включил предложение, которое делает его лучше, но все еще есть ложные срабатывания, поэтому есть только компромиссы (более простой expr, худшие результаты; более сложный и более длинный expr, лучшие результаты). Если в вашем выводе слишком много маленьких каталогов, измените свое регулярное выражение соответствующим образом. Например,

grep '^\s*[0-9\.]\+G'

является еще более точным (каталоги <1 ГБ не будут перечислены).

Если вы делаете квоты, вы можете использовать

quota -v

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


2
Это очень быстро, просто и практично
zzapper

24
grep '[0-9]G'содержал много ложных срабатываний и также пропускал любые десятичные дроби. Это работало лучше для меня:sudo du -h / | grep -P '^[0-9\.]+G'
jchavannes

1
В случае, если у вас действительно большие каталоги, вы захотите [GT]вместо простоG
Vitruvius

1
Есть ли инструмент, который будет постоянно отслеживать использование диска во всех каталогах (лениво) в файловой системе? Что-то, что может быть передано в веб-интерфейс? Желательно мягкая информация в реальном времени.
CMCDragonkai

20
Мне нравится использоватьdu -h | sort -hr | head
augurar

104

Для первого взгляда используйте «сводный» вид du:

du -s /*

Эффект состоит в том, чтобы напечатать размер каждого из его аргументов, то есть каждой корневой папки в случае выше.

Кроме того, как GNU, такdu и BSDdu могут быть ограничены по глубине ( но POSIX duне может! ):

  • GNU (Linux,…):

    du --max-depth 3
  • BSD (macOS,…):

    du -d 3
    

Это ограничит выходной дисплей до глубины 3. Вычисленный и отображаемый размер по-прежнему является суммой полной глубины, конечно. Но, несмотря на это, ограничение глубины отображения резко ускоряет вычисления.

Другой полезный вариант -h(слова как на GNU, так и на BSD, но, опять же, не только на POSIX du) для «читабельного» вывода (то есть с использованием KiB, MiB и т . Д. ).


23
если duжалуется -dпопробуйте --max-depth 5вместо.
ReactiveRaven

8
Отличный ответ. Кажется правильным для меня. Я предлагаю du -hcd 1 /directory. -h для человека, c для общего и d для глубины.

Я используюdu -hd 1 <folder to inspect> | sort -hr | head
jonathanccalixto

du --max-depth 5 -h /* 2>&1 | grep '[0-9\.]\+G' | sort -hr | headдля фильтрации В
доступе

49

Вы также можете запустить следующую команду, используя du:

~# du -Pshx /* 2>/dev/null
  • -sВариант обобщает и отображает общее количество для каждого аргумента.
  • h печатает Mio, Gio и т. д.
  • x = оставаться в одной файловой системе (очень полезно).
  • P = не переходите по символическим ссылкам (что может привести к тому, что файлы будут подсчитаны дважды, например).

Будьте осторожны, /rootкаталог не будет отображаться, вы должны запустить, ~# du -Pshx /root 2>/dev/nullчтобы получить это (однажды я много боролся, не указывая, что мой /rootкаталог переполнен).

Изменить: исправлена ​​опция -P


2
du -Pshx .* * 2>/dev/null+ скрытые / системные каталоги
Михаил Адамович

27

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

Еще одна вещь, опция x для du полезна, чтобы не использовать du для следующих точек монтирования в другие файловые системы. То есть:

du -x [path]

Полная команда, которую я обычно запускаю:

sudo du -xm / | sort -rn > usage.txt

Эти -mсредства возвращают результаты в мегабайтах, и sort -rnбудет сортировать результаты наибольшее число первых. Затем вы можете открыть файл use.txt в редакторе, и самые большие папки (начиная с /) будут вверху.


3
Спасибо за указание на -xфлаг!
SamB

1
«поиск самого большого занимает много времени ..» -> Ну, это зависит, но, как правило, не согласен: не занимает много времени с такими утилитами, как ncdu- по крайней мере, быстрее duили find(в зависимости от глубины и аргументов) ..
bshea

так как я предпочитаю не быть пользователем root, мне пришлось адаптироваться к месту написания файла:sudo du -xm / | sort -rn > ~/usage.txt
Bruno

20

Я всегда использую du -sm * | sort -n, что дает вам отсортированный список того, сколько из подкаталогов текущего рабочего каталога используется в мегабайтах.

Вы также можете попробовать Konqueror с режимом «просмотра размера», который аналогичен тому, что делает WinDirStat в Windows: он дает вам визуальное представление о том, какие файлы / каталоги занимают большую часть вашего пространства.

Обновление: в более поздних версиях вы также можете использовать, du -sh * | sort -hкоторые будут показывать удобочитаемые размеры файлов и сортировать по ним. (цифры будут добавлены с K, M, G, ...)

Для тех, кто ищет альтернативу представлению размера файла Konqueror в KDE3, можно взглянуть на подсветку, хотя это не так хорошо.


Это только Konqueror 3.x - размер файла пока не перенесен в KDE4.

'ду-ш * | sort -h 'отлично работает на моем Linux (дистрибутив Centos). Спасибо!
Пахариайоги

18

Я использую это для топ-25 худших преступников ниже текущего каталога

# -S to not include subdir size, sorted and limited to top 25
du -S . | sort -nr | head -25

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

Это в байтах?
Пользователь

По умолчанию в моей системе du -S дает хороший читабельный вывод. Вы получаете простое число байтов для небольших файлов, а затем число с суффиксом «КБ» или «МБ» для больших файлов.
serg10

Вы можете сделать du -Sh, чтобы получить читабельный вывод.
Сиддхартха

@Siddhartha Если вы добавите -h, это, вероятно, изменит эффект sort -nrкоманды - то есть сортировка больше не будет работать, а затем headкоманда также больше не будет работать
Клэр

14

В предыдущей компании у нас была работа cron, которая выполнялась в одночасье и определяла любые файлы определенного размера, например

найти / -size + 10000k

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


Вы можете использовать -x опцию find, чтобы убедиться, что вы не нашли файлы на других устройствах, кроме начальной точки вашей команды find. Это устраняет проблему с удаленно смонтированными дисками.
rjmunro

10

Одним из вариантов будет запуск команды du / sort в качестве задания cron и вывод в файл, так что он уже там, когда вам это нужно.


9

Для командной строки я думаю, что метод du / sort является лучшим. Если вы не на сервере, вам стоит взглянуть на Baobab - Анализатор использования дисков . Эта программа также требует времени для запуска, но вы можете легко найти подкаталог в глубине, где находятся все старые Linux-ISO.


2
Он также может сканировать удаленные папки через SSH, FTP, SMB и WebDAV.

Это здорово. Некоторые вещи просто лучше работают с графическим интерфейсом для их визуализации, и это одна из них! В любом случае мне нужен X-сервер на моем сервере для CrashPlan, так что он тоже работает на этом.
таймер

9

я использую

du -ch --max-depth=2 .

и я меняю максимальную глубину в соответствии со своими потребностями. Параметр «c» печатает итоги для папок, а параметр «h» печатает размеры в K, M или G в зависимости от ситуации. Как уже говорили другие, он по-прежнему сканирует все каталоги, но ограничивает вывод таким образом, чтобы мне было легче находить большие каталоги.


9

Я собираюсь на секунду xdiskusage. Но я добавлю в примечание, что на самом деле это интерфейс пользователя, который может читать вывод ду из файла. Таким образом, вы можете запустить du -ax /home > ~/home-duна своем сервере,scp файл обратно, а затем проанализировать его графически. Или пропусти через ssh.


6

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

Например, ниже показаны все каталоги, которые занимают более 500 МБ.

du -kx / | awk '{ if ($1 > 500000) { print $0} }'

Чтобы сделать вышеперечисленное немного более пригодным для повторного использования, вы можете определить функцию в вашем .bashrc (или вы можете превратить ее в отдельный скрипт).

dubig() {
    [ -z "$1" ] && echo "usage: dubig sizethreshMB [dir]" && return
    du -kx $2 | awk '{ if ($1 > '$1'*1024) { print $0} }'
}

Так что dubig 200 ~/ищет в домашнем каталоге (без следующих символических ссылок на устройстве) каталоги, которые используют более 200 МБ.


Жаль, что дюжина взломщиков grep более проголосовала. Да, и du -kэто сделает абсолютно уверенным, что du использует блоки KB
ndemou

Хорошая идея о -k. Ред.
Марк Боргердинг

Еще проще и надежнее: du -kx $2 | awk '$1>'$(($1*1024))(если вы указываете только условие или шаблон для awk, действие по умолчанию будет print $0)
dave_thompson_085

Хороший вопрос @ date_thompson_085. Это верно для всех известных мне версий awk (net / free-BSD и GNU). @ mark-borgerding, так что это означает, что вы можете значительно упростить свой первый пример доdu -kx / | awk '$1 > 500000'
ndemou

@ mark-borgerding: Если у вас где-то осталось всего несколько килобайт, вы также можете сохранить весь вывод du следующим образом du -kx / | tee /tmp/du.log | awk '$1 > 500000'. Это очень полезно, потому что если ваша первая фильтрация оказывается бесплодной, вы можете попробовать другие значения, подобные этой, awk '$1 > 200000' /tmp/du.logили проверить весь вывод, как этот, sort -nr /tmp/du.log|lessбез повторного сканирования всей файловой системы
ndemou

4

Мне нравится старый добрый xdiskusage как графическая альтернатива du (1).


Обратите внимание на эту часть вопроса: «Я бы предпочел решение для командной строки, которое опирается на стандартные команды Linux, так как ...»
ndemou

4

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

cd /folder_to_check
du -shx */

Это отобразит результаты с удобочитаемым выводом, таким как ГБ, МБ. Это также предотвратит обход через удаленные файловые системы. -sВариант только показывает резюме каждой папки найденной таким образом Вы можете перейти дальше , если заинтересованы в более подробной информации о папке. Имейте в виду, что это решение будет показывать только папки, поэтому вы можете пропустить / после звездочки, если вы тоже хотите файлы.


4

Здесь не упоминается, но вы также должны проверить lsof в случае удаленных / зависших файлов. У меня был 5,9 ГБ удаленный файл tmp из убегающего cronjob.

https://serverfault.com/questions/207100/how-can-i-find-phantom-storage-usage Помогли мне найти владельца процесса указанного файла (cron), а затем я смог перейти к /proc/{cron id}/fd/{file handle #}уменьшению файла в вопрос, чтобы получить начало разбега, разрешите это, а затем откройте файл "">, чтобы освободить место и позволить cron грациозно закрыть себя.


3

Из терминала вы можете получить визуальное представление об использовании диска с dutree.

Это очень быстро и легко, потому что это реализовано в Rust

dutree

$ dutree -h
Usage: dutree [options] <path> [<path>..]

Options:
    -d, --depth [DEPTH] show directories up to depth N (def 1)
    -a, --aggr [N[KMG]] aggregate smaller than N B/KiB/MiB/GiB (def 1M)
    -s, --summary       equivalent to -da, or -d1 -a1M
    -u, --usage         report real disk usage instead of file size
    -b, --bytes         print sizes in bytes
    -f, --files-only    skip directories for a fast local overview
    -x, --exclude NAME  exclude matching files or directories
    -H, --no-hidden     exclude hidden files
    -A, --ascii         ASCII characters only, no colors
    -h, --help          show help
    -v, --version       print version number

Посмотреть все детали использования на сайте


2

Для командной строки du (и его параметры) кажется наилучшим способом. DiskHog, похоже, также использует информацию du / df из задания cron, поэтому предложение Питера, вероятно, является лучшей комбинацией простого и эффективного.

( FileLight и KDirStat идеально подходят для графического интерфейса.)


2

Вы можете использовать стандартные инструменты, такие как findиsort для анализа использования дискового пространства.

Список каталогов отсортирован по размеру:

find / -mount -type d -exec du -s "{}" \; | sort -n

Список файлов, отсортированных по размеру:

find / -mount -printf "%k\t%p\n" | sort -n

1
Я считаю, что это лучший ответ для обнаружения большого размера в отсортированном порядке
Вимал Кришна

2

Возможно, стоит отметить, что mc(Midnight Commander, классический файловый менеджер в текстовом режиме) по умолчанию показывает только размер инодов каталогов (обычно 4096), но с помощью CtrlSpaceили с помощью меню Инструменты вы можете видеть пространство, занимаемое выбранным каталогом, в удобочитаемом для человека виде. формат (например, некоторые как 103151M).

Например, на рисунке ниже показан полный размер ванильных дистрибутивов TeX Live на 2018 и 2017 годы, в то время как версии 2015 и 2016 года показывают только размер inode (но в действительности они имеют почти 5 Гбайт каждый).

То есть, это CtrlSpaceдолжно быть сделано один за одним, только для фактического уровня каталога, но это так быстро и удобно, когда вы перемещаетесь с этим, mcчто, возможно, вам не понадобится ncdu(что действительно, только для этой цели лучше). В противном случае вы также можете запустить ncduиз mc. без выхода mcили запуска другого терминала.

м.в.э.



1

Если вы знаете, что большие файлы были добавлены в последние несколько дней (скажем, 3), то вы можете использовать команду find в сочетании с " ls -ltra", чтобы обнаружить эти недавно добавленные файлы:

find /some/dir -type f -mtime -3 -exec ls -lart {} \;

Это даст вам только файлы (" -type f"), а не каталоги; только файлы со временем модификации за последние 3 дня (" -mtime -3") и выполнение " ls -lart" для каждого найденного файла (" -exec" часть).


1

Чтобы понять непропорциональное использование дискового пространства, часто полезно начать с корневого каталога и пройтись по некоторым из его самых больших дочерних элементов.

Мы можем сделать это

  • сохранение вывода du в файл
  • просматривая результат итеративно

Это:

# sum up the size of all files and directories under the root filesystem
du -a -h -x / > disk_usage.txt
# display the size of root items
grep $'\t/[^/]*$' disk_usage.txt

теперь скажем / usr слишком большой

# display the size of /usr items
grep $'\t/usr/[^/]*$' disk_usage.txt

теперь, если / usr / local подозрительно велик

# display the size /usr/local items
grep $'\t/usr/local/[^/]*$' disk_usage.txt

и так далее...


1

Я использовал эту команду, чтобы найти файлы размером более 100 МБ:

find / -size +100M -exec ls -l {} \;

0

Мне удалось отследить худшего преступника (ей), передающего duрезультаты в удобочитаемой формеegrep и соответствующие регулярному выражению.

Например:

du -h | egrep "[0-9]+G.*|[5-9][0-9][0-9]M.*"

что должно вернуть вам все 500 мег или выше.


Не используйте для Grep арифметических операций - использование AWK вместо: du -k | awk '$1 > 500000'. Гораздо проще понять, отредактировать и исправить с первой попытки.
ndemou

0

Если вам нужна скорость, вы можете включить квоты в файловых системах, которые вы хотите отслеживать (вам не нужно устанавливать квоты для какого-либо пользователя), и использовать сценарий, который использует команду quota для отображения дискового пространства, используемого каждым пользователем. Например:

quota -v $user | grep $filesystem | awk '{ print $2 }'

даст вам использование диска в блоках для конкретного пользователя в конкретной файловой системе. Таким образом, вы сможете проверить использование за несколько секунд.

Чтобы включить квоты, вам нужно добавить usrquota в опции файловой системы в вашем файле / etc / fstab, а затем, вероятно, перезагрузиться, чтобы quotacheck можно было запустить в незанятой файловой системе перед вызовом quotaon.


0

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

void walk(string sDir, int iPass, int64& n, int64& n1, int64 step){
    foreach(string sSubDir in sDir){
        walk(sDir + "/" + sSubDir, iPass, n, n1, step);
    }
    foreach(string sFile in sDir){
        string sPath = sDir + "/" + sFile;
        int64 len = File.Size(sPath);
        if (iPass == 2){
            while(n1 <= n+len){
               print sPath;
               n1 += step;
            }
        }
        n += len;
    }
}

void dscan(){
    int64 n = 0, n1 = 0, step = 0;
    // pass 1, measure
    walk(".", 1, n, n1);
    print n;
    // pass 2, print
    step = n/20; n1 = step/2; n = 0;
    walk(".", 2, n, n1);
    print n;
}

Вывод выглядит так для моей папки Program Files:

 7,908,634,694
.\ArcSoft\PhotoStudio 2000\Samples\3.jpg
.\Common Files\Java\Update\Base Images\j2re1.4.2-b28\core1.zip
.\Common Files\Wise Installation Wizard\WISDED53B0BB67C4244AE6AD6FD3C28D1EF_7_0_2_7.MSI
.\Insightful\splus62\java\jre\lib\jaws.jar
.\Intel\Compiler\Fortran\9.1\em64t\bin\tselect.exe
.\Intel\Download\IntelFortranProCompiler91\Compiler\Itanium\Data1.cab
.\Intel\MKL\8.0.1\em64t\bin\mkl_lapack32.dll
.\Java\jre1.6.0\bin\client\classes.jsa
.\Microsoft SQL Server\90\Setup Bootstrap\sqlsval.dll
.\Microsoft Visual Studio\DF98\DOC\TAPI.CHM
.\Microsoft Visual Studio .NET 2003\CompactFrameworkSDK\v1.0.5000\Windows CE\sqlce20sql2ksp1.exe
.\Microsoft Visual Studio .NET 2003\SDK\v1.1\Tool Developers Guide\docs\Partition II Metadata.doc
.\Microsoft Visual Studio .NET 2003\Visual Studio .NET Enterprise Architect 2003 - English\Logs\VSMsiLog0A34.txt
.\Microsoft Visual Studio 8\Microsoft Visual Studio 2005 Professional Edition - ENU\Logs\VSMsiLog1A9E.txt
.\Microsoft Visual Studio 8\SmartDevices\SDK\CompactFramework\2.0\v2.0\WindowsCE\wce500\mipsiv\NETCFv2.wce5.mipsiv.cab
.\Microsoft Visual Studio 8\VC\ce\atlmfc\lib\armv4i\UafxcW.lib
.\Microsoft Visual Studio 8\VC\ce\Dll\mipsii\mfc80ud.pdb
.\Movie Maker\MUI\0409\moviemk.chm
.\TheCompany\TheProduct\docs\TheProduct User's Guide.pdf
.\VNI\CTT6.0\help\StatV1.pdf
7,908,634,694

Это говорит мне, что каталог 7,9 ГБ, из которых

  • ~ 15% идет на компилятор Intel Fortran
  • ~ 15% идет на VS .NET 2003
  • ~ 20% идет на VS 8

Достаточно просто спросить, можно ли выгрузить какой-либо из них.

Он также рассказывает о типах файлов, которые распределены по файловой системе, но вместе взятые предоставляют возможность для экономии места:

  • ~ 15% примерно идет в файлы .cab и .MSI
  • ~ 10% примерно идет на регистрацию текстовых файлов

Он также показывает множество других вещей, без которых я, вероятно, мог бы обойтись, таких как «SmartDevices» и поддержка «ce» (~ 15%).

Это занимает линейное время, но это не нужно делать часто.

Примеры вещей, которые он нашел:

  • резервные копии библиотек DLL во многих хранилищах кода, которые на самом деле не нужно сохранять
  • резервная копия чьего-то жесткого диска на сервере в неясной директории
  • объемные временные интернет-файлы
  • древние документы и справочные файлы давно нужны

0

У меня была похожая проблема, но ответов на этой странице было недостаточно. Я нашел следующую команду наиболее полезной для листинга:

du -a / | sort -n -r | head -n 20

Который покажет мне 20 крупнейших преступников. Однако, несмотря на то, что я запустил это, это не показало мне реальной проблемы, потому что я уже удалил файл. Загвоздка была в том, что все еще работал процесс, который ссылался на удаленный файл журнала ... поэтому мне пришлось сначала убить этот процесс, а затем место на диске оказалось свободным.


Хороший вопрос, но это должен быть комментарий, а не ответ сам по себе - на этот вопрос слишком много ответов
ndemou

0

Вы можете использовать DiskReport.net для создания онлайн-отчета по всем вашим дискам.

С помощью многих прогонов он покажет вам график истории для всех ваших папок, легко найти то, что выросло


Этот инструмент не соответствует двум основным пунктам вопроса: «Я часто изо всех сил пытаюсь отследить виновника после заполнения раздела» и «Я бы предпочел решение для командной строки, основанное на стандартных командах Linux»
ndemou

0

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

Пример скриншота:
JDiskReport скриншот

Конечно, вам нужно будет очистить немного места вручную, прежде чем вы сможете загрузить и установить его или загрузить его на другой диск (например, USB-накопитель).


(Скопировано здесь из того же авторского ответа на дубликат вопроса)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.