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

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

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

Логическая структура файловой системы и понятие кластера

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

Размер кластера задается при форматировании раздела и может варьироваться от 512 байт до 64 КБ и более. NTFS по умолчанию часто выбирает значение в 4 КБ для баланса между эффективностью использования места и скоростью доступа. Если файл занимает 1 байт, он все равно «съест» целый кластер, и в таблице размещения файлов будет записан именно этот полный объем.

  • 📏 Минимальная единица: Файл не может занимать меньше одного кластера, даже если его реальный размер ничтожен.
  • Влияние на скорость: Большие кластеры уменьшают размер таблиц адресации и ускоряют чтение больших файлов.
  • 💾 Потери места: При малом размере кластера снижается фрагментация, но увеличивается накладная нагрузка на служебные структуры.

Важно различать логический размер файла (количество байт полезной информации) и размер на диске (количество байт, фактически зарезервированных файловой системой). Разница между ними называется slack space или пространством расточкования. Именно в этой области часто остаются следы удаленных данных, которые можно обнаружить при глубоком анализе диска.

📊 Какой размер кластера вы обычно выбираете при форматировании?
512 байт
4 КБ (стандарт)
64 КБ (для больших файлов)
Не знаю/Не выбираю

Таблица MFT: сердце файловой системы NTFS

В файловой системе NTFS вся информация о файлах, включая их размер, хранится в специальной системной файловой таблице, известной как Master File Table (MFT). Это не просто список имен, а сложная база данных, где каждому файлу или папке соответствует запись длиной обычно 1024 байта. Внутри этой записи находятся так называемые атрибуты.

Атрибуты — это структурированные блоки данных, описывающие различные свойства объекта. Нас интересует атрибут с кодом 0x20, который носит имя $DATA. Именно в заголовке этого атрибута содержится поле, указывающее на реальный размер данных. Для небольших файлов (обычно до 800 байт) содержимое может храниться прямо внутри записи MFT (resident data), и тогда размер указывается в заголовке атрибута.

Если файл не помещается в запись MFT, он становится нерезидентным (non-resident). В этом случае атрибут $DATA содержит не сами данные, а список кластеров (Data Runs), где они разбросаны по диску. Даже в этом случае, в заголовке атрибута присутствуют два ключевых значения размера: реальный размер и выделенный размер (округленный до кластера).

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

Поиск размера в MFT осуществляется по смещению. Например, в заголовке атрибута есть поле «Length of Resident Data» (для резидентных файлов) или «Allocated Length» (для нерезидентных). Эти значения хранятся в шестнадцатеричном формате и занимают 8 байт (64 бита), что позволяет поддерживать огромные размеры файлов.

Структура атрибута данных и поля размеров

Чтобы точно ответить на вопрос, где на диске указан размер, нужно заглянуть внутрь структуры атрибута $DATA. Каждый атрибут начинается с заголовка, который содержит тип атрибута, длину заголовка и флаги. Сразу за заголовком следует информация о размере.

Для резидентных файлов (находящихся внутри MFT) используется поле Resident Data Length. Оно указывает точное количество байт полезных данных. Для нерезидентных файлов структура сложнее: здесь присутствуют два 64-битных значения. Первое — это Real Size (реальный размер данных), а второе — Allocated Size (выделенный размер в байтах, кратный размеру кластера).

Разница между Real Size и Allocated Size как раз и составляет то самое свободное место в последнем кластере. Файловая система использует Allocated Size для управления выделением места, а Real Size — для того, чтобы знать, где файл фактически заканчивается при чтении.

  • 🔢 Real Size: Точное количество байт информации, записанной приложением.
  • 📦 Allocated Size: Объем дискового пространства, зарезервированный под файл (округлен вверх до кластера).
  • 📍 Initial VCN: Поле, указывающее начальный виртуальный номер кластера, важное для больших файлов.

При анализе диска hex-редактором вы можете увидеть эти значения в виде последовательности байтов. Например, значение 0A 00 00 00 00 00 00 00 в little-endian формате будет означать размер в 10 байт. Понимание формата хранения чисел (little-endian) критично для правильной интерпретации данных.

Размер раздела в таблице разделов (MBR и GPT)

Размер самих файлов — не единственное, что интересует системного администратора. Часто вопрос «где на диске указан размер» касается объема всего раздела или диска. Эта информация хранится в служебных областях, предшествующих файловой системе. Существует два основных стандарта разметки: MBR и GPT.

В схеме MBR (Master Boot Record), которая находится в самом первом секторе диска (LBA 0), таблица разделов начинается со смещения 0x1BE. Каждая запись о разделе занимает 16 байт. Внутри этой записи, начиная с 5-го байта (смещение 0x1C6 для первого раздела), находятся 4 байта, указывающие на количество секторов в разделе. Умножив это число на размер сектора (обычно 512 байт), мы получим полный размер раздела.

Современный стандарт GPT (GUID Partition Table) использует более надежную структуру. Заголовок GPT находится во втором секторе диска (LBA 1). В нем содержится массив из 128 байтовых записей о разделах. Каждая запись содержит поля «Starting LBA» и «Ending LBA». Разница между ними, умноженная на размер сектора, дает точный размер раздела.

Параметр MBR (Legacy) GPT (Modern)
Расположение таблицы Сектор 0 (LBA 0) Сектор 1 (LBA 1) и конец диска
Макс. размер раздела 2 ТБ (ограничение) 9.4 ЗБ (практически безлимитно)
Поле размера 4 байта (кол-во секторов) 8 байт (LBA начала и конца)
Резервирование Нет (только копия MBR) Полная копия заголовка в конце диска

Знание структуры GPT особенно важно при работе с дисками объемом более 2 ТБ, так как MBR просто не способен корректно отобразить их полный размер. Операционная система считывает эти значения при загрузке и строит карту доступного пространства.

☑️ Проверка целостности разделов

Выполнено: 0 / 4

Скрытые размеры и служебные области диска

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

Файл $LogFile используется для обеспечения отказоустойчивости. В него записываются транзакции перед их-commit-ом в основную таблицу. Его размер динамически меняется, но имеет предопределенный максимум, который также хранится в служебных записях файловой системы. При внезапном отключении питания именно анализ этого лога позволяет восстановить целостность данных.

⚠️ Внимание: Попытка вручную изменить размер служебных файлов (например, через hex-редактор) без понимания структуры B-деревьев NTFS гарантированно приведет к потере доступа ко всему разделу.

Также стоит упомянуть о теневых копиях (Shadow Copies). Система создает снимки состояния файлов, которые могут занимать до 20% и более объема диска. Информация о размере, занимаемом теневыми копиями, хранится в мета-файле $Extend\$Quota и специальных системных файлах, невидимых в обычном режиме проводника.

Для анализа реального распределения места, включая скрытые области, стандартных средств Windows может быть недостаточно. Специалисты используют утилиты вроде WinHex или DMDE, которые умеют читать диск посекторно, минуя файловую систему. Это позволяет увидеть «сырой» размер всех структур, включая неиспользуемое пространство.

Практические методы анализа и восстановления размеров

Если вы столкнулись с ситуацией, когда размер файла отображается неверно или равен нулю, это часто свидетельствует о повреждении атрибута $DATA в MFT. Восстановление размера возможно несколькими методами. Первый — эвристический анализ: программы сканируют содержимое кластеров и пытаются найти сигнатуры файлов (заголовки), чтобы определить конец данных.

Второй метод — анализ соседних записей. Если файл был удален, его запись MFT может быть помечена как свободная, но данные о размере часто сохраняются до момента перезаписи. В hex-редакторе удаленные записи помечаются байтом 00 в первом байте записи, но структура атрибутов остается читаемой.

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

chkdsk X: /f
просканирует структуру MFT, проверит согласованность полей Real Size и Allocated Size и при необходимости пересчитаетное пространство.

  • 🔍 Поиск сигнатур: Поиск магических чисел (например, 50 4B 03 04 для ZIP) помогает определить начало и часто конец файла.
  • 🛠 Использование Chkdsk: Стандартный инструмент для проверки логической целостности размеров.
  • 💻 Hex-анализ: Ручная проверка полей в MFT для опытных пользователей.

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

FAQ: Часто задаваемые вопросы

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

Это происходит из-за кластеризации. Файловая система выделяет место блоками (кластерами). Если файл весит 1 КБ, а размер кластера 4 КБ, файлу будет выделено 4 КБ. Оставшиеся 3 КБ называются slack space и не используются для других файлов.

Можно ли изменить размер кластера без форматирования диска?

Нет, размер кластера (Allocation Unit Size) задается только при форматировании раздела. Изменение этого параметра требует полного стирания данных и создания новой файловой системы, либо использования сторонних утилит для конвертации разделов без потери данных (что всегда рискованно).

Где хранится размер диска в GPT?

В заголовке GPT (LBA 1) есть поле «Last Usable LBA», которое указывает адрес последнего сектора, доступного для разделов. Умножение этого адреса на размер сектора дает максимально доступный объем.

Что такое Resident и Non-resident файлы в NTFS?

Resident (резидентные) — это очень маленькие файлы, данные которых хранятся прямо внутри записи MFT. Non-resident (нерезидентные) — файлы, данные которых слишком велики для MFT и хранятся в отдельных кластерах на диске, а в MFT записаны только ссылки на них.

Как увидеть скрытый размер теневых копий?

Используйте командную строку и команду vssadmin list shadowstorage. Она покажет, сколько места зарезервировано и используется системой для хранения предыдущих версий файлов.