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

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

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

  • как установить этот диск?
  • Создание раздела ext2 для FreeBSD 10.1, работающего на базе x86 с разделением MBR
  • файловые системы ext4 часто развращают
  • Почему ядро ​​не наследует информацию о файловой системе от GRUB?
  • Как символическая ссылка представлена ​​в файловой системе по жесткой ссылке?
  • Как fsnotify влияет на производительность системы?
  • Как сжать каталог
  • Являются ли кратковременные файлы сброшенными на диск?
  • Как запись каталога точки монтирования отличается от обычной записи каталога в файловой системе
  • Как отобразить размер каждого файла рядом с ним после выполнения команды «locate»?
  • Можно ли отключить права доступа к файлу файловой системы ext3 или ext4?
  • Оптимальные корневые флагов для rootfs для файловой системы ext4, работающей на USB-накопителе
  • 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 - лучшая ОС в мире.