В каком случае размер физического файла будет меньше логического размера?

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

Ответ 1

В современной файловой системе, такой как ZFS, существует три способа уменьшить физический размер файла, чем его логический:

  • Разреженные файлы, где блоки данных, содержащие только нули, физически не хранятся. Это поддерживается большинством современных файловых систем, но исключает FAT и HFS +.

  • Сжатые файлы, в которых ОС использует алгоритм сжатия для хранения данных меньше его первоначального размера. ZFS, btrfs и HFS + реализуют сжатие данных.

  • Дедуплицированные файлы, где блоки, относящиеся к различным файлам, но имеющие один и тот же контент, хранятся только один раз. Это реализовано, по крайней мере, с помощью ZFS, btrfs, vxfs и NTFS VHD (Windows Server 2012.)

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

Можно добавить жесткие ссылки, которые позволяют нескольким "файлам" (точнее, пути) делиться одними и теми же данными.

Наконец, символические ссылки не хранят данные, но файл, на который они указывают, если таковые имеются, обычно имеет размер, отличный от нуля.

Ответ 2

Наиболее распространенным случаем, когда это верно, является разреженные файлы. Эти файлы физически меньше их логического размера, потому что не все их экстенты выделены - в файле есть "дыры".

Обратите внимание, что не все файловые системы поддерживают разреженные файлы. (В частности, FAT не делает.)

Ответ 3

Физический размер файла обычно представляет собой сумму всех блоков, назначенных файлу, тогда как логический размер является фактическим использованием этих блоков. Чтобы файл, логически больший, чем его физический размер, подразумевал бы, что некоторые данные могут быть сгенерированы "на лету" (поскольку у него больше, чем блоки могут удерживаться).

Вы можете достичь этой концепции, сжимая файл и скрывая сжатие в деталях драйвера файловой системы. Таким образом, у вас может быть два блока размером 512 байт, поддерживающих 1024 физических байта, но при распаковке данных может обнаружиться более 1024 логических байтов в файле.

Есть и другие нетривиальные способы выполнить то, что вы просите, но я не думаю, что вы столкнетесь с ними в дикой природе (если вы не работаете в очень нишевом уголке мира).