
Когда я суммирую размеры моих файлов, я получаю одну цифру. Если я запускаю du
, я получаю другую цифру. Если я запускаю du
для всех файлов в моем разделе, это не соответствует тому, что df
утверждается. Почему так много разных цифр для общего размера моих файлов? Компьютеры не могут складывать?
Говоря о сложении: когда я складываю столбцы «Использовано» и «Доступно» df
, я не получаю общую цифру. И эта общая цифра меньше размера моего раздела. И если я складываю размеры разделов, я не получаю размер моего диска! Что получается?
решение1
Складывать числа легко. Проблема в том, что нужно складывать много разных чисел.
Сколько места на диске занимает файл?
Основная идея заключается в том, что файл, содержащийнбайты используютнбайт дискового пространства, плюс немного для некоторой управляющей информации: метаданные файла (разрешения, временные метки и т. д.), и немного накладных расходов на информацию, которая нужна системе, чтобы найти, где хранится файл. Однако есть много сложностей.
Микроскопические осложнения
Представьте себе каждый файл как ряд книг в библиотеке. Меньшие файлы составляют всего один том, но большие файлы состоят из многих томов, как энциклопедия. Чтобы иметь возможность находить файлы, существует карточный каталог, который ссылается на каждый том. Каждый том имеет немного накладных расходов из-за обложек. Если файл очень маленький, эти накладные расходы относительно велики. Кроме того, сам карточный каталог занимает некоторое место.
Если говорить немного более технически, то в типичной простой файловой системе пространство разделено наблоки. Типичный размер блока — 4 КБ. Каждый файл занимает целое число блоков. Если размер файла не кратен размеру блока, последний блок используется лишь частично. Таким образом, файл размером 1 байт и файл размером 4096 байт занимают по 1 блоку, тогда как файл размером 4097 байт занимает два блока. Вы можете наблюдать это с помощью ls
или du
: если ваша файловая система имеет размер блока 4 КБ, то ls -s
и du
сообщит 4 КБ для файла размером 1 байт.
Если файл большой, то дополнительные блоки нужны только для хранения списка блоков, из которых состоит файл (этокосвенные блоки; более сложные файловые системы могут оптимизировать это в формеэкстенты). Они не отображаются в размере файла, как сообщается ls -l
или GNU du --apparent-size
. du
и ls -s
, которые сообщают об использовании диска, а не о размере, учитывают их.
Некоторые файловые системы пытаются повторно использовать свободное пространство, оставшееся в последнем блоке,упаковать несколько файловых хвостов в один блок. Некоторые файловые системы (такие какext4 начиная с Linux 3.8используйте 0 блоков для небольших файлов (всего несколько байтов), которые полностью помещаются в inode.
Макроскопические осложнения
Как правило, как показано выше, общий размер, сообщаемый файлом, du
представляет собой сумму размеров блоков или экстентов, используемых файлом.
Размер, сообщаемый du
может быть меньше, если файл сжат. Системы Unix традиционно поддерживают грубую форму сжатия: если блок файла содержит только нулевые байты, то вместо того, чтобы хранить блок нулей, файловая система может вообще пропустить этот блок. Файл с пропущенными блоками, как этот, называетсяразреженный файлРазреженные файлы не создаются автоматически, если файл содержит большую серию нулевых байтов, приложение должно сделать файл разреженным.
Некоторые файловые системы, такие какbtrfsизфсподдержка общего назначениясжатие.
Расширенные осложнения
Две основные особенности современных файловых систем, таких как zfs и btrfs, значительно отдаляют связь между размером файла и использованием диска: моментальные снимки и дедупликация.
Снимкиявляются замороженным состоянием файловой системы на определенную дату. Файловые системы, поддерживающие эту функцию, могут содержать несколько снимков, сделанных в разные даты. Эти снимки, конечно, занимают место. С одной стороны, если вы удалите все файлы из активной версии файловой системы, файловая система не станет пустой, если останутся снимки.
Любой файл или блок, который не изменился с момента создания снимка или между двумя снимками, существует идентично в снимке и в активной версии или другом снимке. Это реализовано с помощьюкопирование при записи. В некоторых крайних случаях возможно, что удаление файла в заполненной файловой системе не удастся из-за нехватки свободного места, поскольку удаление этого файла потребует создания копии блока в каталоге, а места даже для этого одного блока больше нет.
Дедупликацияэто метод оптимизации хранения, который заключается в избегании хранения идентичных блоков. С типичными данными поиск дубликатов не всегда стоит усилий. Обазфсиbtrfsподдержка дедупликации в качестве дополнительной функции.
Почему общая сумма отличается du
от суммы размеров файлов?
Как мы видели выше, размер, сообщаемый du
для каждого файла, обычно является суммой размеров блоков или экстентов, используемых файлом. Обратите внимание, что по умолчанию ls -l
перечисляет размеры в байтах, но du
перечисляет размеры в КиБ или в 512-байтовых единицах (секторах) в некоторых более традиционных системах ( du -k
заставляет использовать килобайты). Большинство современных unice поддерживают ls -lh
и du -h
для использования «человечески читаемых» чисел достаточно использовать K, M, G и т. д. (для КиБ, МиБ, ГиБ) по мере необходимости.
При запуске du
в каталоге он суммирует использование диска всеми файлами в дереве каталогов,включая каталогисами по себе. Каталог содержит данные (имена файлов и указатель на местонахождение метаданных файла), поэтому ему нужно немного дискового пространства. Маленький каталог займет один блок, больший каталог потребует больше блоков. Объем дискового пространства, используемого каталогом, иногда зависит не только от содержащихся в нем файлов, но и от порядка, в котором они были вставлены и в котором некоторые файлы были удалены (в некоторых файловых системах это может оставить дыры — компромисс между дисковым пространством и производительностью), но разница будет незначительной (дополнительный блок здесь и там). Когда вы запускаете ls -ld /some/directory
, отображается размер каталога. (Обратите внимание, что строка «total NNN» в верхней части вывода ls -l
— это несвязанное число, это сумма размеров в блоках перечисленных элементов, выраженная в КиБ или секторах.)
Имейте в виду, чтоdu
включает в себяточечные файлыкоторый ls
не отображается, если вы не используете опцию -A
или -a
.
Иногдаdu
отчеты меньше ожидаемой суммы. Это происходит, если естьжесткие ссылкивнутри дерева каталогов: du
каждый файл считается только один раз. Используйтеdu -l
switch для подсчета файловНраз, если у них естьНжесткие ссылки.
В некоторых файловых системах, например ZFS
в Linux, du
не отображается полное дисковое пространство, занятое расширенными атрибутами файла.
Будьте осторожны, если в каталоге есть точки монтирования, du
будут подсчитаны все файлы в этих точках монтирования, если не указана соответствующая -x
опция. Так что если, например, вам нужен общий размер файлов в вашей корневой файловой системе, запустите du -x /
, а не du /
.
Если файловая система смонтирована в непустой каталог, файлы в этом каталоге скрыты смонтированной файловой системой. Они по-прежнему занимают свое место, но du
их не найдут.
Удаленные файлы
Когда файлудалено, это удаляет только запись каталога, не обязательно сам файл. Для того, чтобы действительно удалить файл и таким образом освободить его дисковое пространство, необходимы два условия:
- Количество ссылок файла должно быть уменьшено до 0: если файл имеет несколько жестких ссылок, удаление одной не повлияет на остальные.
- Пока файл открыт каким-либо процессом, данные остаются. Только когда все процессы закроют файл, файл удаляется. Вывод
fuser -m
илиlsof
в точке монтирования включаются процессы, у которых открыт файл в этой файловой системе, даже если файл удален. - даже если ни один процесс не открыл удаленный файл, пространство файла не может быть восстановлено, если этот файл является бэкэндом устройства
loop
.losetup -a
(asroot
) может сообщить вам, какиеloop
устройства в данный момент настроены и на каком файле. Устройство цикла должно быть уничтожено (сlosetup -d
) перед тем, как можно будет восстановить дисковое пространство.
Если вы удалите файл в некоторых файловых менеджерах или средах с графическим интерфейсом, он может быть помещен в корзину, где его можно восстановить. Пока файл можно восстановить, его пространство все еще используется.
Откуда df
именно взялись эти цифры?
Типичная файловая система содержит:
- Блоки, содержащие данные файлов (включая каталоги) и некоторые метаданные (включая косвенные блоки и расширенные атрибуты в некоторых файловых системах).
- Бесплатные блоки.
- Блоки, зарезервированные для пользователя root.
- суперблоки и другая управляющая информация.
- Иноды
- Ажурнал
Только первый тип сообщается du
. Что касается df
, то то, что попадает в столбцы «используется», «доступно» и «всего», зависит от файловой системы (конечно, используемые блоки (включая косвенные) всегда находятся в столбце «используется», а неиспользуемые блоки всегда находятся в столбце «доступно»).
Файловые системы в ext2/ext3/ext4бронировать5% пространства пользователю root. Это полезно в корневой файловой системе, чтобы поддерживать работу системы в случае ее заполнения (в частности, для ведения журнала и для того, чтобы системный администратор мог хранить немного данных, пока устраняет проблему). Даже для разделов данных, таких как /home
, сохранение этого зарезервированного пространства полезно, поскольку почти полная файловая система склонна к фрагментации. Linux пытается избежать фрагментации (которая замедляет доступ к файлам, особенно на вращающихся механических устройствах, таких как жесткие диски), предварительно выделяя много последовательных блоков при записи файла, но если последовательных блоков немного, это не сработает.
Традиционные файловые системы, вплоть до ext4, но не btrfs, резервируют фиксированное количествоинодыпри создании файловой системы. Это значительно упрощает проектирование файловой системы, но имеет недостаток, заключающийся в том, что количество инодов должно быть правильно рассчитано: при слишком большом количестве инодов пространство тратится впустую; при слишком малом количестве инодов файловая система может исчерпать иноды до того, как закончится место. Команда df -i
сообщает, сколько инодов используется и сколько доступно (файловые системы, где эта концепция неприменима, могут сообщать 0).
При запуске tune2fs -l
на томе, содержащем файловую систему ext2/ext3/ext4, выводится некоторая статистика, включая общее количество и количество свободных инодов и блоков.
Еще одна особенность, которая может запутать дело, этоподтома(поддерживается вbtrfs, а в zfs под именемнаборы данных). Несколько подтомов используют одно и то же пространство, но имеют отдельные корни дерева каталогов.
Если файловая система смонтирована по сети (NFS, Samba и т. д.) и сервер экспортирует часть этой файловой системы (например,сервер имеет /home
файловую систему и экспортирует/home/bob
), то df
на клиенте отражаются данные для всей файловой системы, а не только для той части, которая экспортируется и монтируется на клиенте.
Что занимает место на моем диске?
Как мы видели выше, общий размер, сообщаемый df
не всегда учитывает все контрольные данные файловой системы. Используйте специфические для файловой системы инструменты, чтобы получить точный размер файловой системы, если это необходимо. Например, для ext2/ext3/ext4 запустите tune2fs -l
и умножьте размер блока на количество блоков.
Когда вы создаете файловую систему, она обычно заполняет доступное пространство на включающем разделе или томе. Иногда вы можете получить меньшую файловую систему, когда перемещаете файловые системы или изменяете размер томов.
В Linux, lsblk
представляет собой хороший обзор доступных томов хранения. Для получения дополнительной информации или если у вас нет lsblk
, используйте специализированные инструменты управления томами или разбиения на разделы, чтобы проверить, какие разделы у вас есть. В Linux есть lvs
, vgs
,pvs
дляЛВМ,fdisk
для традиционных разделов в стиле ПК («MBR») (а также GPT в последних системах),gdisk
дляГПТперегородки,disklabel
для меток дисков BSD,Рассталисьи т.д. Под Linux,cat /proc/partitions
дает краткий обзор. Типичные установки имеют по крайней мере два раздела или тома, используемых операционной системой: файловую систему (иногда больше) именятьобъем.
Некоторые компьютеры имеют раздел, содержащийБИОСили другое диагностическое программное обеспечение. Компьютеры сУЕФИиметь выделенный раздел загрузчика.
Наконец, обратите внимание, что большинство компьютерных программ используют единицы, основанные на степенях числа 1024 = 2· 10 (потому что программисты любят двоичную систему и степени 2). Так, 1 КБ = 1024 Б, 1 МБ = 1048576 Б, 1 ГБ = 1073741824, 1 ТБ = 1099511627776 Б, … Официально эти единицы известны каккибибайтКиБ,мебибайтМиБ и т. д., но большинство программ просто сообщают k или kB, M или MB и т. д. С другой стороны, производители жестких дисков систематически используют метрические единицы (единицы на основе 1000). Так что диск емкостью 1 ТБ имеет емкость всего 931 GiB или 0,904 TiB.
решение2
Краткое описание сложностей, связанных с расчетом размеров файлов и дискового пространства:
Место, которое файл занимает на диске, является множителем числа блоков, которые он занимает, на размер каждого блока + число инодов, которые он занимает. Файл длиной 1 байт займет как минимум 1 блок, 1 инод и одну запись каталога.
Но если файл является жесткой ссылкой на другой файл, то может потребоваться только 1 дополнительная запись каталога. Это будет просто еще одна ссылка на тот же набор блоков.
- Размер содержимого файла. Это то, что
ls
отображается. - Свободное дисковое пространство — это не размер самого большого файла, который вы можете вместить, и не сумма размеров содержимого всех файлов, которые поместятся на диске. Это где-то посередине. Это зависит от количества файлов (занимающих inodes), размера блока и того, насколько близко содержимое каждого файла заполняет блоки полностью.
Это всего лишь поверхностное описание файловых систем, и оно слишком упрощено. Также помните, что разные файловые системы работают по-разному.
stat
очень полезно для обнаружения некоторой части этой информации. Вот несколько примеров того, как использовать stat и для чего это полезно:http://landoflinux.com/linux_stat_command_examples.html
решение3
df
обычно используется для просмотра файловых систем, их заполненности и того, где они смонтированы. Очень полезно, когда в файловой системе заканчивается место, и, возможно, вы хотите переместить что-то между файловыми системами или купить диск большего размера и т. д.
du
показывает подробности о том, сколько совокупного хранилища потребляет каждый из каталогов (что-то вроде windirstat
Windows). Отлично подходит для поиска мест, где вы забиваете место, когда пытаетесь выполнить очистку файлов.
Помимо небольших числовых различий, объясненных другими, я думаю, что утилиты du
и df
служат совершенно разным целям.
решение4
Я проиллюстрирую здесь различные случаи, которые вызывают du
отличие от df
.
df
подсчитывает выделенные файловой системой блоки, du
использует информацию о размере каждого файла. Разница может иметь много причин:
Несвязанные (удаленные) файлы, которые все еще открыты приложением. Информация о файлах отсутствует, блок все еще выделен.
lsof +aL1 <filesystem>
поможет вам идентифицировать процессы. В большинстве случаев вам приходится убивать процессы, чтобы освободить место (это зависит от процесса, иногда достаточно перезагрузки конфигурации).Файлы под точками монтирования, скрытыми от ,
du
но не отdf
,debugfs
могут помочь вам прочитать файловую систему.$ sudo debugfs debugfs 1.42.12 (29-Aug-2014) debugfs: open /dev/xxx (the desired file system device) debugfs: cd /boot debugfs: ls -l 1966081 40755 (2) 0 0 4096 26-May-2016 16:28 . 2 40555 (2) 0 0 4096 11-May-2016 10:43 .. 1974291 100644 (1) 0 0 0 26-May-2016 16:28 bob <---<<< /boot/bob is hidden by /boot fs
Разреженные файлыкоторый выглядит больше, чем реальность. Нераспределенные блоки не учитываются,
df
но кажущийся размер файла учитываетсяdu
.
Обратите внимание, что жесткие ссылки не обманывают du
.