Почему существует так много разных способов измерения использования диска?


114

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

Говоря о добавлении: когда я добавляю столбцы «Используется» и «Доступно» df, я не получаю общую цифру. И эта общая цифра меньше, чем размер моего раздела. И если я добавлю размеры разделов, я не получу размер диска! Что дает?

Ответы:


144

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

Сколько дискового пространства использует файл?

Основная идея заключается в том, что файл, содержащий n байтов, использует n байтов дискового пространства, плюс бит для некоторой управляющей информации: метаданные файла (разрешения, временные метки и т. Д.) И немного служебной информации для информации, которая нужна системе. найти, где хранится файл. Однако есть много осложнений.

Микроскопические осложнения

Думайте о каждом файле как о серии книг в библиотеке. Меньшие файлы составляют только один том, но большие файлы состоят из многих томов, как энциклопедия. Для того, чтобы можно было найти файлы, есть карточный каталог, который ссылается на каждый том. Каждый том имеет немного накладных расходов из-за обложек. Если файл очень маленький, эти издержки относительно велики. Также сам каталог карт занимает некоторое место.

Проще говоря, в типичной простой файловой системе пространство делится на блоки . Типичный размер блока составляет 4 КБ. Каждый файл занимает целое число блоков. Если размер файла не кратен размеру блока, последний блок используется только частично. Таким образом, 1-байтовый файл и 4096-байтовый файл занимают 1 блок, тогда как 4097-байтовый файл занимает два блока. Вы можете наблюдать это с помощью duкоманды: если ваша файловая система имеет размер блока 4 КБ, то duсообщит о 4 КБ для 1-байтового файла.

Если файл большой, то дополнительные блоки необходимы просто для хранения списка блоков, составляющих файл (это косвенные блоки ; более сложные файловые системы могут оптимизировать это в форме экстентов ). Они не отображаются в размере файла, указанном в ls -lGNU 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 ТиБ.


1
Для @Kiwy tune2fsтребуется доступ на чтение к блочному устройству, содержащему файловую систему, которая, как правило, требует наличия прав root, поскольку позволяет читать содержимое любого файла.
Жиль

21
Я знаю, что «спасибо» не рекомендуется в SE, но Жиль, вы заслуживаете огромное «Спасибо» за этот потрясающий пост.
dotancohen

1
Я помню, как видел карточный каталог, когда мне было 6 лет. Интересно, сколько из них не знает, кто они?
Изката

1
@освета Это слишком продвинутый Солярис для меня, я не знаю, на каком уровне он подходит.
Жиль

1
du делает счет косвенных блоков. Это основное отличие от размера файла ls -l.
Стефан

4

Краткое описание сложностей при расчете размеров файлов и дискового пространства:

  • Пространство, которое занимает файл на диске, является множителем количества блоков, которое он занимает, против размера каждого блока + количества инодов, которые он занимает. Файл длиной 1 байт займет как минимум 1 блок, 1 индекс и одну запись каталога.

    Но это может занять только 1 дополнительную запись каталога, если файл является жесткой ссылкой на другой файл. Это будет просто еще одна ссылка на тот же набор блоков.

  • Размер содержимого файла. Это то, что lsотображает.
  • Свободное дисковое пространство - это не размер самого большого файла, который вы можете разместить, или сумма всех размеров содержимого файла, которые поместятся на диске. Это где-то посередине. Это зависит от количества файлов (принимающих inode), размера блока и от того, насколько близко содержимое каждого файла заполняет блоки полностью.

Это просто царапает поверхность файловых систем, и это слишком упрощено. Также помните, что разные файловые системы работают по-разному.

statочень полезно при поиске некоторых из этой информации. Вот несколько примеров того, как использовать stat и для чего он нужен: http://landoflinux.com/linux_stat_command_examples.html


1
Однобайтовый файл обычно занимает один блок, а не 8. Создание жесткой ссылки вовсе не создает инод: один файл - это один инод, независимо от того, сколько существует ссылок на файл. Создание жесткой ссылки требует только места для записи каталога.
Жиль

Спасибо за исправления, по общему признанию моя память re: углубленное изучение ext2 теперь немного размыто. Я следил за выводом stat re: количество блоков - оно было чрезмерным, но это то, что есть. Я исправлю ответ.
Педро

1
Это связано с тем, что 1 блок ext2 = 8 блоков статистики, если файловая система ext2 использует блоки по 4 КБ: статистика рассчитывается в блоках по 512 байт по историческим причинам. См. Unix.stackexchange.com/questions/14409/…
Жиль

3

Я проиллюстрирую здесь различные случаи, которые вызывают duотличия от df.

dfподсчитывает выделенные блоки файловой системы, duиспользует информацию о размере каждого файла. Разница может иметь много причин:

1) Несвязанные (удаленные) файлы, которые все еще открыты приложением. Информация о файле отсутствует, блок все еще выделен. lsof +aL1 <filesystem>воля поможет вам определить процессы. Большую часть времени вам приходится убивать процессы, чтобы освободить пространство (это зависит от процесса, иногда достаточно перезагрузить конфигурацию).

2) Файлы под точками монтирования скрыты, 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

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

Обратите внимание, что жесткие ссылки не дураки du


3

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

duпоказывает детали того, сколько накопительного хранилища использует каждый из своих каталогов (как windirstatв Windows). Отлично подходит для поиска места, где вы занимаетесь, когда пытаетесь выполнить очистку файла.

Помимо небольших числовых различий, объясняемых другими, я думаю, что утилиты duи dfутилиты служат совершенно другим целям.

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