Поддержка разреженных файлов ntfs что это

Обновлено: 07.07.2024

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

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

Разреженные и сжатые файлы представляют собой две совершенно разные независимые структуры, предназначенные для сокращения объема используемого дискового пространства. Файл может быть сжатым, но неразреженным и наоборот. Сжатие рассматривается в разделе 6.5.8.

Термин разреженный относится к файлам, содержащим данные, после которых идет большая область без данных, за ней небольшой фрагмент данных и т.д. Файловая система NTFS не выделяет дискового пространства для хранения пустых областей файлов. Вспомните, что виртуальный номер кластера определяет положение кластера относительно начала файла, а логический номер кластера определяет положение кластера относительно начала тома. Для разреженных файлов в NTFS выделяется виртуальный номер кластера, однако кластеры'тома не выделяются. Таким образом, логический номер кластера, относящийся к тому, для некоторых виртуальных номеров кластеров не выделяется. Если приложение пытается считать файл, NTFS заполняет участки буфера, соответствующие пустым пространствам файла, нулями. Если приложение попытается записать данные в пустые области файла, файловая система выделит необходимый объем дискового пространства.

Обратите внимание йа рис. 6.6: виртуальный номер кластера определяет положение относительно начала файла, а логический номер - положение относительно начала тома.

Рис. 6.6. Выделение кластеров для разреженных файлов в NTFS

На рис. 6.6 показаны две цепочки кластеров: для неразреженного файла и для того же файла, но разреженного. Цепочка кластеров для неразреженного файла содержит три записи. Первая начинается с нулевого значения виртуального номера кластера (указывая на начало файла), расположенного в логическом кластере 125. Вместе с этой информацией указано четыре кластера, т.е. четыре кластера расположены в непрерывном участке диска. Вторая запись указывает, что следующий фрагмент файла с виртуальным номером кластера 4 (пятый кластер файла) начинается по смещению логического номера кластера, равного 251, и имеет размер в восемь кластеров. Этот кластер на рис. 6.6 показан не так, как другие кластеры, поскольку в соответствующей области файла нет данных. Последняя запись показывает, что следующий кластер файла расположен по смещению логического номера кластера, равного 1251.

Первая запись второй цепочки кластеров практически идентична. Файл по-прежнему .состойт из четырех кластеров, начиная с логического номера кластера 125. Следующая запись в цепочке указывает на последние семь кластеров файла. Виртуальный номер кластера, равный 12 (11-й кластер файла), начинается с логического номера кластера 1251. Для промежуточной области файла, не содержащей данных, запись в цепочке кластеров отсутствует.

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

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

Приложения могут указать атрибут разреженности для файла с помощью параметра FSCTL_SET_SPARSE функции DeviceloControl. Для получения информации о разреженности файла требуется функция GetFileAttributes.

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

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

Разреженные файлы распознаются многими основными файловыми системами, задействованными при работе в Windows, Linux и MacOS.

Как и многие типы файловой организации, разреженные файлы обладают отличительными особенностями, предлагающими пользователям как выгоду, так и отдельные неудобства. К приоритетным выгодам безусловно относится эффективное использование дискового пространства. Любой, даже очень большой, файл может занимать на диске минимальный объем. И только по мере записи дополнительных данных область для хранения будет дополнительно увеличиваться. Процесс создания разреженных файлов также выгодно отличается от обычных, ведь системе требуется существенно меньше времени по причине пропуска последовательности нулевых байт. Дополнительно, меньший объем записи меньше нагружает диск и увеличивает срок его безотказной службы.

Помимо преимуществ, есть и недостатки. Система выполняет дополнительные операции с метаданными при записи информации о пропуске нулевых последовательностей. Не все ФС поддерживают разреженные файлы, и при переносе файла в такую систему, объем его может значительно возрасти по сравнению с исходником. А при ограниченном объеме конечного носителя операция копирования может быть полностью заблокирована или привести к непредсказуемым последствиям, ошибкам, логическим конфликтам, в том числе частичной перезаписи выделенной разреженной области. Также принудительная фрагментация при записи может сказаться на производительности, особенно при частой записи.

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

Для создания разреженных файлов требуется использовать возможности командной строки в ОС Windows или терминала в Linux и MacOS.

Все операции с разряженными файлами осуществляет инструмент ФС «fsutil». В Windows запустите командную строку с привилегиями администратора. На первом этапе перейдите в требуемую папку, а потом наберите команду следующего вида, опустив граничные кавычки, для создания простого файла: «fsutil file createnew sparse-file 1000000000».

Атрибуты «sparse-file» и «1000000000» соответственно означают наименование файла и объем (единица измерения – байт).

Затем задайте новому файлу формат «разреженный», для чего следом введите в консоли команду (также без кавычек): «fsutil sparse setflag sparse-file».

Примечание. Если возникла потребность сменить атрибут файла и удалить присвоенное значение «разреженный», то внесите изменения в его формат посредством набора команды «fsutil sparse setflag sparse-file 0» (кавычки не использовать).

Дополнительно. Пользователи всегда могут проверить состояние формата файла и его заданную характеристику при помощи команды «fsutil sparse queryflag sparse-file». Сведения об атрибуте будут непосредственно сразу указаны в следующей строке после запроса.

На следующем этапе необходимо произвести разметку дисковой области, высвобождаемой внутри, чтобы экономично использовать накопитель. Наберите в консоли команду (без кавычек): «fsutil sparse setrange sparse-file 0 1000000000».

Примечание. Цифровые значения означают смещение. Единица измерения – байт. В нашем примере диапазон от 0 до одного гигабайта. Можно указать как полный объем, так и задать превышающее установленное значение.

Проверить факт присвоения атрибута можно командой «fsutil file layout sparse-file» (ограничивающие кавычки не использовать).

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

Создать разреженный файл в данной ОС несколько легче и можно воспользоваться двумя разными инструментами. Откройте терминал и введите указание к действию с командами «dd» или «truncate». Форма команды для создания разреженного файла в первом случае будет иметь вид (не использовать кавычки): «dd if=/dev/zero of=file-sparse bs=1 count=0 seek=2G».

Примечание. Атрибут «file-sparse» означает наименование файла. Заключительная цифра – готовый объем. Единица измерения – по выбору пользователя (мы указали в гигабайтах).

Второй вариант создания разреженного файла предполагает следующий вид команды (без обрамляющих кавычек): «truncate –s1G file-sparse2».

Примечание. Порядок записи атрибутов, по сравнению с первым способом, изменен, после характеристики «s» сначала задан объем файла, а потом указано его наименование.

Каждый способ непосредственно сразу напрямую создает разреженный файл и не требует последовательного двух шагового исполнения разных команд, как в операционной системе Windows.

Если же требуется привести к разреженному формату представления другой простой файл, то в Linux следует использовать следующую команду (кавычки опустить): «cp --sparse=always ./025.jpg ./0251.jpg».

Примечание. В представленной команде замените значения «025.jpg» и «0251.jpg» именами простого обычного файла и нового разреженного соответственно.

Для увеличения исходного готового файла задействуйте команду (кавычки не учитывать): «dd if=/dev/zero of=025.jpg bs=1 count=0 seek=2G».

Примечание. В нашем примере значение «025.jpg» указывает на имя увеличиваемого файла, а параметр в конце команды «2G» устанавливает его новый объем в два гигабайта.

Чтобы убедиться, какой размер выделен, введите без кавычек команду с именем проверяемого файла (в нашем примере имя файла «025.jpg») следующего вида: «du -h --apparent-size 025.jpg».

Файловая система ApFS, эксклюзивно используемая Apple, также поддерживает разреженные файлы, управлять которыми пользователи могут посредством команд для операционной системы Linux, представленными в предыдущем разделе, с отдельными уточнениями.

Например, для MacOS Catalina возможно использование только команды на основе утилиты формата «dd» с обязательным указанием объема разреженного файла только в одной единице измерения – байт. В противном случае система просигнализирует об ошибке. Вид команды в терминале выглядит следующим образом (без кавычек): «sudo dd if=/dev/zero of=sparse_APFS bs=1 count=0 seek=1000000000».

Указание для увеличения объема файла также требует задавать новый размер в байтах. Так, для увеличения объема до 400Мб команда примет вид (исключить кавычки): «dd if=/dev/zero of=025.jpg bs=1 count=0 seek=400000000».

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

Полную версию статьи со всеми дополнительными видео уроками смотрите в источнике. А также зайдите на наш Youtube канал, там собраны более 400 обучающих видео.

Разреженные файлы в Windows это такие файлы, которые занимают меньше дискового пространства, чем их реальный размер. При этом не используется сжатие данных. Экономия места в разреженных файлах достигается за счёт компактного представления пустых областей файла, которые содержат одни лишь нули (символы 0x00). По-английски разреженные файлы называются sparse files.

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

Файл делится на логические блоки размером 64 Кб. Анализируется каждый такой блок. Если любой байт в пределах блока имеет значение, отличное от 0x00, значит этот блок не пустой, он содержит данные. Блок, содержащий данные пишется на диск. Если же все байты в пределах блока имеют одинаковое значение 0x00, такой блок считается пустым. Содержимое такого блока вообще не сохраняется на диск.

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

Если происходит чтение из области, не совпадающей ни с одним из имеющихся блоков, драйвер NTFS отдаёт символы 0x00. Ведь известно, что раз подходящего блока данных нет, значит он не был записан на диск, следовательно он является пустым блоком, состоящим из одних лишь нулей.

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

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

С помощью программы NTFS Stream Explorer 1.07 я исследовал внутреннее устройство разреженных файлов. Вообще-то эта версия не показывает, как устроены такие файлы на диске, вместо этого она показывает их в виде формата Microsoft Backup (используемого в функциях BackupRead и BackupWrite). Это особый формат представления файлов, созданный Microsoft для целей архивации и резервного копирования. Устройство разреженных файлов в этом формате может не отображать реального положения вещей, но может показать некоторые принципы хранения таких файлов.

Создадим для экспериментов пустой файл размером 256 Кб, зададим ему атрибут «разреженный» и установим диапазон разреженности, равный его длине. Сделаем все эти операции с помощью системной консольной утилиты fsutil:

Откроем файл в программе NTFS Stream Explorer, чтобы посмотреть его внутренее представление в виде потоков. В списке потоков отобразится один безымянный поток, имеющий тип «Блок разреженного файла», размером 8 байт.

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

Сделаем дамп всех потоков и получим дамп размером всего лишь 48 байт:

На картинке выделен sparse-поток. Его последние восемь байт содержат размер файла. Действительно, созданный файл имеет размер 256 Кб, в шестнадцатиричной системе счисления это 0x40000. Попробуем поменять это значение в hex-редакторе на какое-нибудь другое и восстановим файл из дампа с помощью NTFS BackupRead Dumper. Восстановленный файл назовём file2. Например, можно поменять значение 00004000 00000000 на 00000000 000F0000 . Проверим размер восстановленного файла в диалоге его свойств (на картинке справа).

Как видно, восстановленный файл получился размером 15 терабайт, но на диске по-прежнему занимает всего лишь 4 Кб. Технология разреженных файлов позволяет создавать очень большие файлы. Размер файла даже может превышать размер жёсткого диска, на котором он расположен. Так, на моём жёстком диске, разумеется, нет свободного места для 15 терабайт.

Итак, видно, что пустой разреженный файл хранит на диске только собственный размер. Теперь нужно записать что-нибудь в разреженный файл, чтобы увидеть, как устроены потоки sparse-данных. Возьмём hex-редактор, и запишем что угодно по любому смещению нашего гигантского разреженного файла. Откроем file2 в NTFS Stream Explorer, чтобы посмотреть, какие потоки он содержит теперь. Видно, что потоков стало два.

Второй разреженный поток размером 65544 байт это поток данных разреженного файла. Его первые 8 байт занимает смещение, по которому начинается данный блок в файле. Остальные байты это байты данных. 65544 - 8 = 65536 , а значение 65536 это 64 Кб — минимальный размер логического блока внутри sparse-файла. Если произвести запись в соседний блок, то он увеличится уже до 128 Кб. Также файл может содержать несколько sparse-блоков с данными.

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

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

При чтении разреженных файлов файловая система прозрачно преобразует метаданные, представляющие пустые блоки, в «настоящие» блоки, заполненные нулевыми байтами во время выполнения. Приложение не знает об этом преобразовании.

Большинство современных файловых систем поддерживают разреженные файлы, включая большинство вариантов Unix и NTFS . Apple HFS + не поддерживает разреженные файлы, но в OS X уровень виртуальной файловой системы поддерживает их хранение в любой поддерживаемой файловой системе, включая HFS +. Файловая система Apple (APFS), анонсированная в июне 2016 года на WWDC, также поддерживает их. Разреженные файлы обычно используются для образов дисков , моментальных снимков баз данных , файлов журналов и в научных приложениях.

СОДЕРЖАНИЕ

Преимущества

Преимущество разреженных файлов заключается в том, что хранилище выделяется только тогда, когда это действительно необходимо: дисковое пространство сохраняется, и большие файлы могут быть созданы, даже если в файловой системе недостаточно свободного места. Это также сокращает время первой записи, поскольку системе не нужно выделять блоки для «пропущенного» пространства. Если начальное выделение требует записи всех нулей в пространство, это также избавляет систему от необходимости дважды перезаписывать «пропущенное» пространство.

Например, для образа виртуальной машины с максимальным размером 100 ГБ, на котором фактически записано 2 ГБ файлов, потребуются полные 100 ГБ при поддержке предварительно выделенного хранилища и только 2 ГБ для разреженного файла. Если файловая система поддерживает перфорацию и гостевая операционная система выдает команды TRIM , удаление файлов в гостевой системе соответственно уменьшит необходимое пространство.

Недостатки

Недостатки в том, что разреженные файлы могут стать фрагментированными ; отчеты о свободном пространстве файловой системы могут вводить в заблуждение; заполнение файловых систем, содержащих разреженные файлы, может иметь неожиданные последствия (например, ошибки переполнения диска или превышения квоты при простой перезаписи существующей части файла, которая оказалась разреженной); и копирование разреженного файла с помощью программы , которая явно не поддерживает их, может скопировать весь несжатый размер файла, включая нулевые разделы, которые не размещены на диске, теряя преимущества свойства разреженности в файле. Разреженные файлы также полностью не поддерживаются всеми программами и приложениями для резервного копирования. Однако реализация VFS обошла два предыдущих недостатка. Загрузка исполняемых файлов в 32-битной Windows (exe или dll), которые являются разреженными, занимает гораздо больше времени, поскольку файл не может быть отображен в памяти в ограниченном адресном пространстве 4 ГБ и не кэшируется, поскольку отсутствует кодовый путь для кэширования 32-битных разреженных исполняемых файлов (Windows на 64-битные архитектуры могут отображать разреженные исполняемые файлы). В NTFS разреженный файл (а точнее его ненулевые области) не может быть сжат. NTFS реализует разреженность как особый вид сжатия, поэтому файл может быть разреженным или сжатым.

Разреженные файлы в Unix

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

Творчество

создаст файл размером пять мебибайт , но без данных, хранящихся на диске (только метаданные ). ( GNU dd имеет такое поведение, потому что он вызывает ftruncate установку размера файла; другие реализации могут просто создать пустой файл.)

Аналогичным образом можно использовать команду truncate, если она доступна:

В Linux существующий файл можно преобразовать в разреженный:

Увы, портативного способа пробивать отверстия нет; системный вызов - fallocate (FALLOC_FL_PUNCH_HOLE) в Linux, fcntl (F_FREESP) в Solaris .

Обнаружение

-s Вариант из ls команды показывает занятое пространство в блоках.

В качестве альтернативы du команда печатает занимаемое пространство, а ls печатает видимый размер. В некоторых нестандартных версиях du опция --block-size=1 печатает занятое пространство в байтах вместо блоков, чтобы его можно было сравнить с ls выводом:

Кроме того, инструмент filefrag из e2fsprogs пакета можно использовать для отображения деталей распределения блоков в файле.

Копирование

Обычно версия GNU cp хорошо определяет, является ли файл разреженным, поэтому

создает новый файл, который будет разреженным. Однако у GNU cp есть --sparse опция. Это особенно полезно, если файл, содержащий длинные нулевые блоки, сохраняется не разреженным (т.е. нулевые блоки были записаны на диск полностью). Место на диске можно сэкономить, выполнив:

Некоторые реализации cp, такие как cp во FreeBSD , не поддерживают эту --sparse опцию и всегда будут расширять разреженные файлы. Частично жизнеспособная альтернатива в этих системах - использовать rsync с собственной --sparse опцией вместо cp. К сожалению, --sparse нельзя комбинировать с --inplace .

Читайте также: