У каждого ветерана серверной есть набор инструментов, о которых младшие коллеги вспоминают лишь тогда, когда что-то уже пошло не по плану. Утилита fsutil занимает в таком наборе почётное место. Она живёт в системе с эпохи Windows XP, не требует установки, работает из обычной командной строки с повышенными правами и умеет заглядывать туда, куда проводник и даже PowerShell без COM-обёрток не суётся: в журналы изменений тома, в карты экстентов, в таблицу MFT, в точки повторной обработки и в разреженные области файлов. Эта статья разбирает инструмент по разделам, с фабулами из практики: зачем мастеру каждый флажок, где команда спасает ночь, а где одно неловкое движение ломает пути приложений.

Общий синтаксис прост: fsutil, дальше имя подсистемы, затем действие и параметры. Почти всё требует запуска консоли от имени администратора, а часть команд вообще общается с драйвером NTFS напрямую. Ниже разобраны подсистемы 8dot3name, file, hardlink, quota, reparsepoint, sparse, usn, volume, behavior, resource и repair, то есть именно те, что пригождаются в буднях, а не только на экзамене.

Обзор разделов инструмента и карта возможностей

Утилита устроена как набор подсистем, и полезно один раз увидеть карту целиком, чтобы потом не гуглить в панике. Подсистема file работает с отдельными файлами: создание тестовых объектов, карты экстентов, короткие имена, назначение валидных данных. Подсистема hardlink создаёт и перечисляет жёсткие ссылки. Подсистема usn открывает доступ к журналу изменений тома, на котором построены антивирусы, системы резервного копирования и поисковые индексаторы. Подсистема volume сообщает метаданные тома, свободное место и флаги состояния. Подсистема sparse управляет разреженными файлами. Подсистема quota включает и опрашивает дисковые квоты. Подсистема reparsepoint читает и удаляет точки повторной обработки, включая символические ссылки и точки монтирования. Подсистема 8dot3name управляет генерацией коротких имён. Подсистема behavior показывает и меняет глобальные настройки NTFS, от выделения памяти до политики симлинков. Наконец, resource и repair отвечают за самолечение файловой системы и управление точкой восстановления транзакций.

Команда fsutil без параметров выводит список подсистем, а fsutil имя_подсистемы без действия показывает уже список действий внутри неё. Это встроенная шпаргалка, и ей стоит пользоваться прямо на боевом сервере, когда интернет недоступен или слишком медленный. Все примеры ниже проверялись на Windows 10, Windows 11 и Windows Server 2019–2022, и поведение устойчиво между версиями, хотя отдельные флаги появляются только в свежих выпусках.

Файловая хирургия через createnew queryextents и setshortname

Подсистема file - рабочая лошадка. Классическая фабула: нужно проверить скорость записи на новый массив или поведение скрипта архивации на больших файлах, а под рукой нет ничего подходящего. Команда fsutil file createnew D:\test\blob.bin 1073741824 создаёт файл ровно в один гибибайт за долю секунды, потому что данные не пишутся, а просто выделяется место и файл заполняется нулями логически. Скрипты нагрузочного тестирования строят цикл из таких вызовов и получают десятки гигабайт тестового корма за секунды. Важно помнить: содержимое там формально не истинные нули до первой записи, поэтому для бенчмарков чтения файл стоит один раз перезаписать реальными данными.

Вторая фабула - фрагментация. Файл базы данных на старом сервере тормозит, дефрагментатор показывает общую картину, а администратор хочет точно знать, сколько кусков у конкретного файла и где они лежат. Команда fsutil file queryextents C:\data\base.mdf выводит список экстентов с виртуальными и логическими номерами кластеров. Если файл в сто гигабайт размазан на тысячи экстентов, причина медленного последовательного чтения найдена, и пора планировать окно обслуживания. Тот же приём помогает понять, почему файл на тонком томе занимает меньше, чем заявлено.

Третья фабула - наследие. Старое приложение ищет свои библиотеки по коротким путям вида PROGRA~1, а после миграции папка переехала, и короткое имя пропало. Команда fsutil file setshortname "C:\Program Files\MyOldApp" MYOLD~1 присваивает каталогу имя в формате 8.3. Здесь же и главное предупреждение статьи: setshortname способна сломать пути, если короткое имя уже использовалось где-то в реестре, ярлыках или конфигурациях других программ, а обратная операция не предусмотрена. Перед вызовом стоит проверить fsutil 8dot3name query для тома и сделать резервную копию веток реестра, где фигурирует короткий путь. Правило ветерана простое: короткие имена не трогают, пока не тронут тебя.

Жёсткие ссылки hardlink и экономия места без трюков

Фабула общеизвестная: на диске три полные копии одной папки отчётов - рабочая, архив за прошлый месяц и снимок для аудита, - и две трети байтов в них совпадают. Удалять нельзя, место жалко. Команда fsutil hardlink create решает задачу изящно: fsutil hardlink create D:\audit\report.pdf D:\work\report.pdf создаёт второе имя для того же содержимого, и файл физически хранится один раз. Удаление любого из имён не трогает данные, пока живо хотя бы одно имя. Проверить, сколько имён у файла, помогает fsutil hardlink list D:\work\report.pdf: утилита перечислит все пути, ссылающиеся на одну и ту же запись в MFT.

Отличие от символической ссылки принципиальное, и его стоит твёрдо знать. Жёсткая ссылка - это второе имя того же файла внутри одного тома, она неотличима от оригинала, не содержит пути-указателя и не может ссылаться на каталог или другой диск. Симлинк - это отдельный объект с путём внутри, он умеет указывать куда угодно, но бьётся, если цель исчезла, и некоторые приложения открывают саму ссылку вместо цели. Практический вывод: для дедупликации наборов файлов внутри тома берут hardlink, для перенаправления путей через границы томов берут mklink. Комбинация из скрипта поиска дубликатов по хешу и массового fsutil hardlink create регулярно экономит админам по сорок процентов места на файловых помойках, причём совершенно прозрачно для пользователей и программ.

Журнал USN и почему антивирус не сканирует диск заново

Самая недооценённая подсистема - usn. На каждом томе NTFS ведётся журнал изменений (USN journal), куда драйвер пишет каждое событие: файл создан, переименован, записан, удалён, сменились атрибуты. Каждой записи присваивается монотонно растущий номер USN. Именно благодаря этому журналу антивирусы, системы резервного копирования и поисковые службы не сканируют диск заново при каждом проходе: они запоминают номер последней обработанной записи и при следующем запуске читают только хвост журнала, получая готовый список всего, что изменилось. Инкрементальный бэкап терабайтного тома, который иначе занял бы часы, сводится к минутам.

Администратору журнал полезен и сам по себе. Команда fsutil usn queryjournal C: показывает размер журнала, максимальный допустимый и идентификатор тома. Команда fsutil usn readjournal C: startusn=0 выводит записи с указанной позиции, а связка fsutil usn readdata с номером ссылки файла показывает состояние конкретного объекта. Фабула из практики: пользователь клянчит, что отчёт исчез сам, а вызов readjournal с фильтрацией по времени честно показывает запись об удалении с меткой процесса, и инцидент закрывается за минуту без восстановления из бэкапа. Журнал по умолчанию ограничен десятками мегабайт и перезаписывается кольцевым образом; на серверах с миллионами изменений в день его расширяют через fsutil usn createjournal, чтобы окно истории покрывало интервал между бэкапами. Резать журнал до нуля ради места не стоит: приложения, завязанные на USN, после такого фокуса уходят в полное пересканирование.

Том кластеры и свободное место через volume

Подсистема volume отвечает на вопросы, которые проводник обходит стороной. Команда fsutil volume diskfree C: выводит суммарное число кластеров, число свободных кластеров и размер сектора, откуда сразу виден размер единицы выделения. Фабула: на томе с миллионами мелких файлов свободно десять гигабайт, а записать ничего нельзя, потому что файлы по два килобайта сожрали кластеры по шестьдесят четыре килобайта, и реальная утилизация куда хуже формальной. Отчёт diskfree показывает именно кластерную арифметику, а не маркетинговые гигабайты. Команда fsutil volume allocationreport в новых версиях даёт ещё более детальный разбор занятости по зонам тома.

Команда fsutil fsinfo ntfsinfo C: технически относится к подсистеме fsinfo, но обычно идёт той же связкой: она показывает серийный номер тома, версию NTFS, размер MFT и число зарезервированных под неё записей. По этим цифрам ветеран за минуту оценивает, как том создавался, не уменьшали ли его штатным ресайзом с потерей кластерной оптимизации и не грозит ли исчерпание MFT на файловом сервере с миллиардами мелких объектов. Проверка грязного бита через fsutil dirty query C: тоже сюда: если бит установлен, при перезагрузке том уйдёт в chkdsk, и лучше узнать об этом днём, чем посреди ночной перезагрузки кластера.

Разреженные файлы и работа с дырами через sparse

Разреженный файл - это файл, у которого диапазоны нулей не занимают места на диске, а хранятся как пометка в метаданных. Подсистема sparse управляет этим механизмом вручную. Команда fsutil sparse setflag D:\vm\disk.vhd включает атрибут разреженности, fsutil sparse setrange D:\vm\disk.vhd 0 104857600 помечает диапазон как нулевой, и драйвер освобождает выделенные под него кластеры. Команда fsutil sparse queryflag показывает состояние, а queryrange - карту разреженных областей.

Фабула: виртуальная машина выключена, динамический диск VHD раздулся до максимума, а внутри гостя половина данных давно удалена. После очистки гостевой системы нулями свободных областей администратор на хосте проходит файл setflag и setrange по диапазонам и возвращает массиву сотни гигабайт без выключения других машин. Вторая фабула - тестирование: приложению нужен файл журнала на десятки гигабайт, реально заполненный на процент, и разреженность позволяет держать такие файлы на маленьком тестовом диске. Предупреждение: разреженные файлы не любят некоторые системы резервного копирования и репликации, перед боевым применением стоит проверить, как конкретное ПО копирует их - с сохранением дыр или с полной распаковкой нулей.

Настройки поведения NTFS через behavior и самолечение resource

Подсистема behavior показывает и крутит глобальные ручки NTFS. Команда fsutil behavior query all выводит весь пульт разом, а точечные вызовы полезнее. fsutil behavior query memoryusage показывает режим использования памяти: значение 2 заставляет NTFS держать больше страничного пула под кэш метаданных, что заметно помогает файловым серверам с миллионами открытых описателей. fsutil behavior query mftzone показывает зарезервированную долю тома под зону MFT; на серверах мелких файлов зону поднимают заранее, чтобы таблица не фрагментировалась. fsutil behavior query symlinkevaluation показывает четыре флага, управляющих тем, разрешены ли локальные и удалённые симлинки; в изолированных контурах удалённые переходы отключают по соображениям безопасности, и тогда приложения, ходящие по сетевым симлинкам, честно получают отказ вместо тихого обхода политики. fsutil behavior query disablelastaccess и quotanotify завершают картину: отключение обновления времени доступа снимает лишнюю нагрузку записи, а интервал уведомлений квот влияет на реактивность ограничений.

Завершают обзор resource и repair. Команда fsutil resource selfhealing C: стартует самолечение тома: современная NTFS умеет исправлять мелкие повреждения метаданных на лету, без отключения диска, а этот вызов запускает проход по журналу самолечения и показывает, что система чинила. Команда fsutil repair query C: показывает состояние механизма починки и флаги, а fsutil repair set позволяет включать или отключать отдельные стадии для тонкой диагностики. Фабула: том периодически помечается грязным после сбоев питания, и связка selfhealing, repair query и чтения журнала событий показывает, чинится ли всё штатно в фоне или пора планировать офлайн-проверку. Главное правило безопасности всей статьи повторим здесь: fsutil - инструмент точный и бескомпромиссный, сначала query, потом backup, и только затем set. Тот, кто соблюдает эту последовательность, спит спокойно, а тот, кто нет, однажды узнает о setshortname больше, чем хотел.