Почему разница в размере файла и его размере на диске больше 4 KiB?

Файловая система ext4 обычно использует 4 блока KiB. Таким образом, когда вы пишете небольшой файл, а размер меньше 4 KiB, вы увидите разницу в любом файловом менеджере. Обычно есть два значения: размер файла и размер на диске. Первый кусок имеет правильное значение, а другой – умножение на 4 KiB.

В случае больших файлов я всегда думал, что размер не может отличаться более чем на 4 KiB (последний, не полностью написанный блок). Но в случае некоторых файлов на моем диске я вижу, что разница составляет более 4 KiB, например 9425 байт. Поэтому вопрос прост, почему размеры отличаются более чем на 4 KiB. Это из-за фрагментации или чего-то еще? Разве не странно, что некоторые блоки в середине файла не полностью написаны?

  • отключение журнала vs data = обратная запись в файловой системе ext4
  • Использовать -c0 -i0 в файловых системах с журналом
  • Семейство файловой системы EXT: Почему первый суперблок начинается со смещения 1024?
  • Запись в файловую систему ext4 зависает, пока лазинит в фоновом режиме
  • Можно ли восстановить восстановленные файлы?
  • Преобразование ext4 в btrfs: Если я случайно потеряю питание системы во время преобразования, я потеряю данные?
  • ext4: Может ли чистая файловая система нуждаться в восстановлении журнала?
  • Как я могу подтвердить, поддерживает ли мой сервер дыру?
  • 2 Solutions collect form web for “Почему разница в размере файла и его размере на диске больше 4 KiB?”

    Список блоков, которые составляют файл, должен быть где-то сохранен. Как правило, в inode немного места, но если в индексном дескрипторе имеется слишком много блоков, файловая система выделяет непрямые блоки для хранения адреса блоков, в дополнение к блокам, которые содержат данные файла. По крайней мере, для ext2 / ext3 / ext4 в Linux, и я думаю, что для большинства Unix-подобных файловых систем в большинстве Unix-подобных операционных систем косвенные блоки учитываются при использовании диска на диске.

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

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

    Вы можете изучить файловую систему ext2 / ext3 / ext4 с помощью команды debugfs . В debugfs, block blocks /path/to/file перечисляет блоки, используемые файлом; это показывает, насколько фрагментирован файл. Команда filefrag /path/to/file дает количество фрагментов; для ext4 это коррелирует с количеством непрямых блоков и, следовательно, с разницей между размером файла и использованием дискового пространства.

    Я думаю, это может произойти в этой ситуации :

    Если флаг FALLOC_FL_KEEP_SIZE указан в режиме, поведение вызова аналогично, но размер файла не изменяется, даже если offset + len больше размера файла. Предопределение нулевых блоков за пределами файла таким образом полезно для оптимизации загружаемых рабочих нагрузок.

    Linux и Unix - лучшая ОС в мире.