Добавлять номера легко. Проблема в том, что нужно добавить много разных чисел.
Сколько дискового пространства использует файл?
Основная идея заключается в том, что файл, содержащий n байтов, использует n байтов дискового пространства, плюс бит для некоторой управляющей информации: метаданные файла (разрешения, временные метки и т. Д.) И немного служебной информации для информации, которая нужна системе. найти, где хранится файл. Однако есть много осложнений.
Микроскопические осложнения
Думайте о каждом файле как о серии книг в библиотеке. Меньшие файлы составляют только один том, но большие файлы состоят из многих томов, как энциклопедия. Для того, чтобы можно было найти файлы, есть карточный каталог, который ссылается на каждый том. Каждый том имеет немного накладных расходов из-за обложек. Если файл очень маленький, эти издержки относительно велики. Также сам каталог карт занимает некоторое место.
Проще говоря, в типичной простой файловой системе пространство делится на блоки . Типичный размер блока составляет 4 КБ. Каждый файл занимает целое число блоков. Если размер файла не кратен размеру блока, последний блок используется только частично. Таким образом, 1-байтовый файл и 4096-байтовый файл занимают 1 блок, тогда как 4097-байтовый файл занимает два блока. Вы можете наблюдать это с помощью du
команды: если ваша файловая система имеет размер блока 4 КБ, то du
сообщит о 4 КБ для 1-байтового файла.
Если файл большой, то дополнительные блоки необходимы просто для хранения списка блоков, составляющих файл (это косвенные блоки ; более сложные файловые системы могут оптимизировать это в форме экстентов ). Они не отображаются в размере файла, указанном в ls -l
GNU du --apparent-size
; du
, который сообщает об использовании диска в отличие от размера, отвечает за них.
Некоторые файловые системы пытаются повторно использовать свободное место, оставшееся в последнем блоке, чтобы упаковать несколько файловых хвостов в один блок . Некоторые файловые системы (такие как ext4 начиная с Linux 3.8 используют 0 блоков для крошечных файлов (всего несколько байтов), которые полностью помещаются в inode.
Макроскопические осложнения
Как правило, как видно выше, общий размер, представленный как, du
является суммой размеров блоков или экстентов, используемых файлом.
Размер сообщения du
может быть меньше, если файл сжат. Системы Unix традиционно поддерживают грубую форму сжатия: если файловый блок содержит только нулевые байты, то вместо сохранения нулевого блока файловая система может вообще пропустить этот блок. Файл с пропущенными блоками, подобными этому, называется разреженным файлом . Разреженные файлы не создаются автоматически, если файл содержит большую серию нулевых байтов, приложение должно обеспечить редкость файла.
Некоторые файловые системы, такие как btrfs и zfs, поддерживают сжатие общего назначения .
Расширенные осложнения
Две основные особенности очень современных файловых систем, таких как zfs и btrfs, делают связь между размером файла и использованием диска значительно более отдаленной: снимки и дедупликация.
Снимки - это замороженное состояние файловой системы на определенную дату. Файловые системы, поддерживающие эту функцию, могут содержать несколько снимков, сделанных в разные даты. Эти снимки занимают место, конечно. В одном крайнем случае, если вы удалите все файлы из активной версии файловой системы, файловая система не станет пустой, если остаются оставшиеся снимки.
Любой файл или блок, который не изменился с момента создания моментального снимка или между двумя моментальными снимками, существует одинаково в моментальном снимке и в активной версии или другом снимке. Это реализовано посредством копирования при записи . В некоторых крайних случаях возможно, что удаление файла в полной файловой системе завершится неудачей из-за недостатка доступного пространства - потому что удаление этого файла потребует создания копии блока в каталоге, и даже для этого одного блока не останется места.
Дедупликация - это метод оптимизации хранения, который заключается в том, чтобы избегать хранения идентичных блоков. С типичными данными поиск дубликатов не всегда стоит усилий. И zfs, и btrfs поддерживают дедупликацию как дополнительную функцию.
Почему сумма du
отличается от суммы размеров файла?
Как мы видели выше, размер, сообщаемый du
для каждого файла, обычно является суммой размеров блоков или экстентов, используемых файлом. Обратите внимание, что по умолчанию ls -l
перечисляет размеры в байтах, но du
перечисляет размеры в килобайтах или в 512-байтовых единицах (секторах) в некоторых более традиционных системах ( du -k
принудительно использует килобайты). Большинство современных устройств поддерживают ls -lh
и du -h
используют «читаемые человеком» числа с использованием K, M, G и т. Д. (Для KiB, MiB, GiB).
Когда вы запускаете du
каталог, он суммирует использование диском всех файлов в дереве каталогов, включая сами каталоги . Каталог содержит данные (имена файлов и указатель на то, где находятся метаданные файла), поэтому ему требуется немного места для хранения. Небольшой каталог займет один блок, больший каталог потребует больше блоков. Объем хранилища, используемого каталогом, иногда зависит не только от файлов, которые он содержит, но также от порядка, в котором они были вставлены и в котором некоторые файлы удалены (в некоторых файловых системах это может оставить дыры - компромисс между дисковым пространством и производительностью ), но разница будет крошечной (дополнительный блок тут и там). Когда ты бежишьls -ld /some/directory
, размер каталога указан. (Обратите внимание, что строка «total NNN» в верхней части выходных данных ls -l
является не связанным числом, это сумма размеров в блоках перечисленных элементов, выраженных в КиБ или секторах.)
Имейте в виду , что du
включает в себя точечные файлы , которые ls
не показывают , если вы не используете -A
или -a
вариант.
Иногда du
отчеты меньше ожидаемой суммы. Это происходит, если в дереве каталогов есть жесткие ссылки : du
каждый файл считается только один раз.
В некоторых файловых системах, например ZFS
в Linux, du
не отображается полное дисковое пространство, занимаемое расширенными атрибутами файла.
Имейте в виду, что если в каталоге есть точки монтирования, du
все файлы в этих точках монтирования также будут учитываться, если не предоставлена -x
опция. Так что, если, например, вам нужен общий размер файлов в корневой файловой системе, запустите du -x /
, а не du /
.
Если файловая система смонтирована в непустом каталоге , файлы в этом каталоге скрыты смонтированной файловой системой. Они все еще занимают свое пространство, но du
не найдут их.
Удаленные файлы
Когда файл удаляется , это только удаляет запись каталога, но не обязательно сам файл. Два факта необходимы для того, чтобы фактически удалить файл и таким образом освободить место на диске:
- Количество ссылок файла должно упасть до 0: если файл имеет несколько жестких ссылок, удаление одной не влияет на другие.
- Пока файл открыт каким-либо процессом, данные остаются. Файл удаляется только после закрытия всех процессов. Вывод
fuser -m
или lsof
точка монтирования включает в себя процессы, в которых файл открыт в этой файловой системе, даже если файл удален.
- даже если ни один процесс не имеет открытого удаленного файла, пространство файла не может быть восстановлено, если этот файл является серверной частью
loop
устройства. losetup -a
(как root
) может сказать вам, какие loop
устройства в настоящее время настроены и на каком файле. Устройство цикла должно быть уничтожено (с losetup -d
) до того, как дисковое пространство может быть восстановлено.
Если вы удалите файл в некоторых файловых менеджерах или средах с графическим интерфейсом, он может быть помещен в корзину, где его можно восстановить. Пока файл можно восстановить, его пространство все еще используется.
Откуда эти цифры df
?
Типичная файловая система содержит:
- Блоки, содержащие данные файлов (включая каталоги) и некоторые метаданные (включая косвенные блоки и расширенные атрибуты в некоторых файловых системах).
- Бесплатные блоки.
- Блоки, которые зарезервированы для пользователя root.
- суперблоки и другая контрольная информация.
- Inodes
- журнал
Только первый вид сообщен du
. Когда дело доходит до того df
, что входит в столбцы «используется», «доступно» и общее количество, зависит от файловой системы (конечно, используемые блоки (включая косвенные) всегда находятся в столбце «используется», а неиспользуемые блоки всегда находятся в « доступно ».
Файловые системы в ext2 / ext3 / ext4 резервируют 5% пространства для пользователя root. Это полезно в корневой файловой системе, чтобы поддерживать работу системы, если она заполняется (в частности, для ведения журналов, и позволить системному администратору хранить немного данных при устранении проблемы). Даже для таких разделов данных, как /home
сохранение этого зарезервированного пространства, полезно, потому что почти полная файловая система подвержена фрагментации. Linux пытается избежать фрагментации (что замедляет доступ к файлам, особенно на вращающихся механических устройствах, таких как жесткие диски), предварительно выделяя много последовательных блоков во время записи файла, но если не много последовательных блоков, это не может работать ,
Традиционные файловые системы, вплоть до ext4, но не включая btrfs, резервируют фиксированное количество inode при создании файловой системы. Это значительно упрощает проектирование файловой системы, но имеет недостаток, заключающийся в том, что число инодов должно быть правильно измерено: при слишком большом количестве инодов пространство теряется; при слишком малом количестве inode файловая система может исчерпать inode перед тем, как закончится свободное место. Команда df -i
сообщает, сколько inode используется и сколько доступно (файловые системы, где концепция не применима, могут сообщать 0).
Запуск tune2fs -l
на томе, содержащем файловую систему ext2 / ext3 / ext4, сообщает некоторую статистику, включая общее количество и количество свободных инодов и блоков.
Другая особенность, которая может сбить с толку материю - это подобъемы (поддерживаются в btrfs и в zfs под наборами данных name ). Несколько подобъемов разделяют одно и то же пространство, но имеют отдельные корни дерева каталогов.
Если файловая система смонтирована по сети (NFS, Samba и т. Д.) И сервер экспортирует часть этой файловой системы (например, сервер имеет /home
файловую систему и экспортирует/home/bob
), то df
на клиенте отображаются данные для всей файловой системы, а не только для части, которая экспортируется и монтируется на клиенте.
Что использует место на моем диске?
Как мы видели выше, общий размер сообщения df
не всегда учитывает все управляющие данные файловой системы. Используйте инструменты, специфичные для файловой системы, чтобы получить точный размер файловой системы, если это необходимо. Например, с ext2 / ext3 / ext4, запустите tune2fs -l
и умножьте размер блока на количество блоков.
Когда вы создаете файловую систему, она обычно заполняет доступное пространство на включающем разделе или томе. Иногда вы можете получить файловую систему меньшего размера, когда перемещаете файловую систему или изменяете размер тома.
В Linux lsblk
представлен хороший обзор доступных томов хранения. Для получения дополнительной информации или, если у вас ее нет lsblk
, используйте специализированные инструменты управления томами или разделов, чтобы проверить, какие разделы у вас есть. В Linux, там lvs
, vgs
, pvs
для LVM , fdisk
для традиционных PC-стиля ( «MBR») разделы (как и GPT в последних системы), gdisk
для GPT разделов, disklabel
для дисковой метки, Parted и т.д. Под Linux, cat /proc/partitions
дает краткий обзор. Типичные установки имеют как минимум два раздела или тома, используемых операционной системой: файловую систему (иногда больше) и том подкачки .
Некоторые компьютеры имеют раздел, содержащий BIOS или другое диагностическое программное обеспечение. Компьютеры с UEFI имеют выделенный раздел загрузчика.
Наконец, обратите внимание, что большинство компьютерных программ используют модули, основанные на степенях 1024 = 2 10 (потому что программисты любят двоичные файлы и степени 2). Таким образом, 1 кБ = 1024 В, 1 МБ = 1048576 В, 1 ГБ = 1073741824, 1 ТБ = 1099511627776 В,… Официально эти устройства известны как кибибайт KiB, мебибайт MiB и т. Д., Но большинство программного обеспечения просто сообщает k или кБ, М или МБ и т. Д. С другой стороны, производители жестких дисков систематически используют метрики (единицы на основе 1000). Так что 1 ТБ накопителя составляет всего 931 ГиБ или 0,904 ТиБ.
tune2fs
требуется доступ на чтение к блочному устройству, содержащему файловую систему, которая, как правило, требует наличия прав root, поскольку позволяет читать содержимое любого файла.du
делает счет косвенных блоков. Это основное отличие от размера файлаls -l
.Краткое описание сложностей при расчете размеров файлов и дискового пространства:
Пространство, которое занимает файл на диске, является множителем количества блоков, которое он занимает, против размера каждого блока + количества инодов, которые он занимает. Файл длиной 1 байт займет как минимум 1 блок, 1 индекс и одну запись каталога.
Но это может занять только 1 дополнительную запись каталога, если файл является жесткой ссылкой на другой файл. Это будет просто еще одна ссылка на тот же набор блоков.
ls
отображает.Это просто царапает поверхность файловых систем, и это слишком упрощено. Также помните, что разные файловые системы работают по-разному.
stat
очень полезно при поиске некоторых из этой информации. Вот несколько примеров того, как использовать stat и для чего он нужен: http://landoflinux.com/linux_stat_command_examples.htmlисточник
Я проиллюстрирую здесь различные случаи, которые вызывают
du
отличия отdf
.df
подсчитывает выделенные блоки файловой системы,du
использует информацию о размере каждого файла. Разница может иметь много причин:1) Несвязанные (удаленные) файлы, которые все еще открыты приложением. Информация о файле отсутствует, блок все еще выделен.
lsof +aL1 <filesystem>
воля поможет вам определить процессы. Большую часть времени вам приходится убивать процессы, чтобы освободить пространство (это зависит от процесса, иногда достаточно перезагрузить конфигурацию).2) Файлы под точками монтирования скрыты,
du
но не скрытыdf
.debugfs
Может помочь вам прочитать файловую систему.3) Разреженные файлы, которые выглядят больше, чем реальность. нераспределенные блоки не учитываются,
df
но видимый размер файла считаетсяdu
.Обратите внимание, что жесткие ссылки не дураки
du
источник
df
обычно используется для просмотра файловых систем, их полноты и места монтирования. Очень полезно, когда вам не хватает места в файловой системе, и, возможно, вы хотите переместить вещи между файловыми системами, или купить больший диск, и т. Д.du
показывает детали того, сколько накопительного хранилища использует каждый из своих каталогов (какwindirstat
в Windows). Отлично подходит для поиска места, где вы занимаетесь, когда пытаетесь выполнить очистку файла.Помимо небольших числовых различий, объясняемых другими, я думаю, что утилиты
du
иdf
утилиты служат совершенно другим целям.источник