Сегодня я разберу, как работают файлы по запросу в OneDrive, iCloud Drive и Photos, Nextcloud и других облачных дисках, опирающихся на API Windows. Я расскажу про графический интерфейс, управление состоянием файлов из командной строки, а также загляну под капот происходящего в контексте файловой системы.
[+] Сегодня в программе
Зачем нужны файлы по запросу
Смысл файлов по запросу в том, чтобы предоставить вам полный синхронизируемый набор файлов из облачного хранилища, при этом существенно экономя место на диске. Это достигается за счет локального хранения только метаданных. Свойства файла индексируются поиском, да и внешне заглушка выглядит как обычный файл. Когда в файле возникает необходимость, он автоматически загружается из облака на диск.
Конечно, вы всегда можете указать отдельные файлы и целые папки для автономного хранения на постоянной основе.
В Параметрах вы также можете настроить период времени, после которого файлы переходят из автономного состояния в облачное, если их не открывали.
Основы работы файлов по запросу доступно объясняет справочная статья. Она относится к OneDrive, но применима ко всем облачным провайдерам, внедрившим технологию в своем клиенте. Список не ограничивается упомянутыми выше сервисами, но в него не входит Google Drive со своим велосипедом, несмотря на некоторое внешнее сходство. Прочитав мою статью, вы легко отличите зерна от плевел.
История вопроса
Ход событий очень подробно отражен в блоге, поэтому ограничусь тезисами и ссылками.
Файлы по запросу впервые появились у OneDrive в Windows 8.1 под именами «умные файлы» и «заглушки» (smart files, placeholders). Тогда OneDrive был частью операционной системы. См. [видео] OneDrive в Windows 8.1: настройка, принцип работы, вопросы и ответы.
В Windows 10 на смену встроенному решению пришла клиентская программа, просто включенная в состав дистрибутива. См. Нюансы установки клиента OneDrive. Хороших нововведений было с гулькин нос, а разочарованием стало выпиливание умных файлов. Объяснения Microsoft и свои мысли по поводу я излагал в Регрессия OneDrive.
Однако компания не забросила идею умных файлов, столь полюбившихся многим. Их вновь анонсировали на Build 2017, затем они появились в предварительной сборке 16215, а общедоступными стали в версии 1709 под именем «файлы по запросу» (files on demand). На тот момент казалось, что Microsoft просто затянула реинкарнацию. Но впоследствии стало понятно, что реализация более глобальная нежели в Windows 8.1. API движка облачной синхронизации опубликовали в 2019 году.
Управление файлами по запросу
Files on demand – изначально терминология OneDrive, причем удачная – понятная и легко переводимая на другие языки.
У других клиентов название может отличаться, конечно, равно как и настройка технологии.
Состояния файлов по запросу
Если файлы по запросу включены, у каждого файла три состояния, которые отображаются в отдельном столбце проводника и тултипе.
Ниже в подзаголовках мое краткое объяснение каждого состояния, а в скобках — терминология в проводнике.
Доступен только в облаке (Когда подключен к сети)
Локально хранятся только метаданные, поэтому место на диске практически не расходуется. В этом легко убедиться, посмотрев размер на диске в свойствах более-менее большого файла (картинка выше).
При наличии доступа к интернету, когда вы открываете файл в любой программе, он автоматически скачивается из облака и становится доступен автономно. Тогда размер на диске становится равен размеру файла. Вы также можете скачать файл из облака вручную.
Доступен автономно (Всегда доступно на этом устройстве)
В этом состоянии файл может оказаться, если:
- доступный только в облаке файл был открыт в программе, что повлекло его автоматическое скачивание
- файл вручную был переведен из состояния «всегда доступен автономно»
Такой файл открывается без интернета. Его можно перевести в состояние «доступен только в облаке» вручную или автоматически в соответствии с настройками контроля памяти (storage sense).
Срок автономного хранения задается для каждого облачного провайдера отдельно.
Всегда доступен автономно (Доступно на этом устройстве)
Файл открывается без интернета, но не переходит в облачное состояние автоматически, только вручную.
Управление состоянием файлов и папок
Как я сказал выше, открытие облачных файлов в любой программе делает их доступными автономно. Вы также можете менять состояние файла из контекстного меню.
На картинке новое контекстное меню Windows 11 (выбран автономный файл). Опций маловато в сравнении с классикой (Shift + F10), но думаю, что в итоге добавят раскрывающееся меню с второстепенными функциями.
У папок есть такое же контекстное меню, и вы можете массово делать файлы доступными в облаке или автономными. Однако значок состояния папки равняется на наименее доступный уровень. Проще объяснить на примере:
- Из контекстного меню папки вы делаете все файлы всегда доступными автономно. Значок папки и всех файлов внутри будет ✅.
- Вы делаете любой файл доступным только в облаке. Значок папки будет ☁, поскольку в ней есть как минимум один такой файл.
Вы также можете управлять доступностью файлов из командной строки, о чем я расскажу ниже.
Как работают файлы по запросу
В подноготной можно разбираться путем изучения API облачных файлов, хотя такой подход понятнее разработчикам. Кроме того, я узнал о существовании этих документов, когда уже почти закончил статью. Изначально мне на глаза попалась документация по управлению атрибутами файлов из командной строки, и я решил немного покопаться в теме. Давайте посмотрим, что можно сделать, владея только этой информацией.
Драйвер мини-фильтра файловой системы
Работа файлов по запросу опирается на службу Windows Cloud Files Filter Driver, которая реализована с помощью драйвера мини-фильтра файловой системы – cldflt.sys. Он обеспечивает взаимодействие между движком синхронизации (клиентом) и оболочкой операционной системы (explorer).
Get-Service cldflt | select displayname,name,status,starttype DisplayName Name Status StartType ----------- ---- ------ --------- Windows Cloud Files Filter Driver cldflt Running Automatic
Драйверы мини-фильтра интересны тем, что не фигурируют в стеке явно. Другими словами, если вы запишете процесс синхронизации файлов с помощью Process Monitor, то в стеке будет только fltmgr.sys – диспетчер зарегистрированных фильтров.
Однако мини-фильтры покажет встроенная утилита fltmc. Видно, что у CldFlt зарегистрирован один экземпляр. Это том NTFS, где размещен OneDrive.
fltmc Filter Name Num Instances Altitude Frame ------------------------------ ------------- ------------ ----- bindflt 1 409800 0 WdFilter 5 328010 0 storqosflt 0 244000 0 wcifs 1 189900 0 CldFlt 1 180451 0 FileCrypt 0 141100 0 luafv 1 135000 0 npsvctrig 1 46000 0 Wof 3 40700 0 FileInfo 5 40500 0
Если вы хотите нырнуть поглубже в тему мини-фильтров, рекомендую разбор Hunting for Bugs in Windows Mini-Filter Drivers за авторством James Forshaw из Google Project Zero.
Я же вернусь к трем состояниям синхронизируемых файлов.
Атрибуты файлов
Каждому из трех состояний файла соответствует свой атрибут. Сделайте любой файл OneDrive или другого клиента доступным только в облаке и выполните команды ниже в командной строке, заменяя path
на полный путь к файлу. После каждой команды должно меняться состояние файла в проводнике, следите за значком.
# всегда доступен автономно attrib +p path # доступен автономно в соответствии с настройками контроля памяти attrib -p path # только в облаке attrib +u path
Вы можете сравнить атрибуты файла в каждом из трех состояний. Можно воспользоваться командлетом Get-ChildItem, но специфичные атрибуты драйвера он отображает в виде чисел.
Get-ChildItem "$env:userprofile\onedrive\test" test.txt | fl Attributes Attributes : 4199968
Поэтому в данном случае нагляднее результат fsutil.
fsutil file layout "%userprofile%\OneDrive\test\test.txt" ********* File 0x0025000000003265 ********* File reference number : 0x0025000000003265 File attributes : 0x00501620: Archive | Sparse | Reparse point | Offline | Unpinned | Recall on data access
Я свел в таблицу атрибуты для каждого состояния. Казалось бы, «всегда доступен автономно» — это естественное состояние файла в NTFS. Но атрибуты рисуют другую картину.
Состояние | Атрибуты |
---|---|
Доступен только в облаке | Archive | Sparse | Reparse point | Offline | Unpinned | Recall on data access |
Всегда доступен автономно | Archive | Reparse point | Pinned |
Доступен автономно | Archive | Reparse point |
Для начала, только Archive, Sparse, и Reparse point входят в список атрибутов NTFS, который вы также можете вывести в PowerShell.
[enum]::GetValues([system.io.fileattributes]) ReadOnly Hidden System Directory Archive Normal Temporary SparseFile ReparsePoint Compressed Offline Encrypted IntegrityStream NoScrubData
Очевидно, остальные служат для потребления фильтром файловой системы (cldflt.sys).
Атрибут | Принадлежность | Комментарий |
---|---|---|
Archive | Файловая система | Стандартный атрибут всех файлов. |
Sparse | Файловая система | Разреженный файл. Используется для облачного файла. Это можно также проверить командой fsutil sparse queryflag C:\path . |
Reparse point | Файловая система | Разбор ниже. |
Pinned | Драйвер мини-фильтра | Файл всегда доступен автономно. Ноги у буквы p в attrib +p растут именно из pinned. |
Unpinned | Драйвер мини-фильтра | Файл доступен только в облаке (attrib -p ). |
Recall on data access | Драйвер мини-фильтра | У облачного файла атрибут отзывается при открытии файла, т.е. при переходе в автономное состояние. |
Offline | Драйвер мини-фильтра | Несколько странно для облачного файла. |
У всех файлов архивный атрибут вполне стандартный. А вот Reparse point – необычен.
Reparse point
Официальный русский перевод этого термина – точка повторной обработки, но я буду придерживаться английской версии. Reparse points уже встречались в блоге в контексте точки подключения (junction) в статье Что произойдет, когда в Windows закончатся буквы дисков. Здесь другая история.
Давайте посмотрим, что происходит с файлом без драйвера мини-фильтра. На видео файл всегда доступен автономно, но после отключения службы его невозможно открыть.
Можно подумать, что раз NTFS известны оба атрибута (Archive, ReparsePoint), файловая система должна корректно обработать доступный автономно файл и без специального фильтра. На практике же фильтр нужен файловой системе для понимания того, что делать с объектом, обладающим этим атрибутом.
Рассмотрим файл, который доступен автономно. Когда служба облачных файлов выключена, NTFS беспомощна. Атрибут ReparsePoint ей только мешает: файл нельзя ни открыть, ни скопировать. Однако можно удалить атрибут с помощью fsutil и файл оживет!
И действительно, в API прямо говорится, что заглушки реализованы с помощью Reparse Points. Там же любопытное замечание, что разработчики приложений иногда путают их с символическими ссылками, что приводит к ошибкам обработки. Поэтому API скрывает точки от приложений, делая исключение только для клиентов синхронизации и системных программ из %systemroot%. Однако грамотно написанные приложения могут сорвать покровы с помощью специальных функций.
Взаимодействие файлов по запросу с жесткими и символическими ссылками
Ссылки NTFS – одна из моих любимых фич Windows, и я не мог не проверить взаимодействие между их разными типами. Эксперименты привели к таким результатам:
- Когда файл доступен только в облаке, он становится доступным автономно при:
- создании или удалении символической ссылки
- создании жесткой ссылки
- Если на файл по запросу существует жесткая ссылка за пределами синхронизируемой папки, состояние файла нельзя изменить на доступное только в облаке. Это логично – файл один, а атрибуты обрабатываются драйвером мини-фильтра только в сфере клиента.
Бонус: как присвоить OneDrive букву диска
Об этом я рассказывал в канале Telegram.
Заключение
OneDrive – мое основное облачное хранилище для личных файлов (фотографии я тоже туда лью, но повседневно предпочитаю Google Photos). Поэтому я включаю OneDrive на всех своих ПК и на вспомогательных компьютерах использую файлы по запросу, чтобы не занимать лишнее место на диске. Для подписчиков Office 365 с 1TB в облаке это еще более актуально. Если им есть чем заполнить терабайт, конечно :)
Я также использую эту технологию на работе в Office 365 — как для персональных файлов в OneDrive, так и для общих проектных на SharePoint. Здесь у меня тон задает поиск Windows – я хорошо знаю его возможности, да и в облако лезть не надо.
Файлы по запросу подчеркивают, на мой взгляд, одно из самых интересных преимуществ учетной записи Microsoft на ПК. Впрочем, с публикацией API и реализацией технологии в сторонних облачных клиентах эта эксклюзивность растворилась.
Однако у меня есть ощущение, что технология в целом недооценена – многие пользователи облачных клиентов просто хранят все файлы на диске автономно.
Опрос покажет расклад. В комментариях напишите, пользуетесь ли вы файлами по запросу в любых клиентах. Если нет, объясните причину.
Пользуетесь ли вы файлами по запросу?
- Да (43%, голосов: 52)
- Нет, и мне это не нужно (28%, голосов: 34)
- Не пользуюсь облачными клиентами / Другое (16%, голосов: 20)
- Нет, но теперь буду (9%, голосов: 11)
- Нет, но лишь из-за отсутствия в клиенте (4%, голосов: 5)
Проголосовало: 122 [архив опросов]
Я благодарю читателей Нику и Александра за помощь в подготовке статьи.
Lecron
Вещь несомненно полезная. Если проблемы со свободным местом более вероятны, чем со связью. У меня скорее наоборот, а проблем с местом вообще нет. Поэтому пусть валяется.
Кстати, а как по запросу происходит доступ к большим файлам? Ждет полной закачки или можно открыть поток не дожидаясь завершения? А если метка «только в облаке»? И прекратится ли закачка при закрытии файла? Вообще, нужно две технологии доступа. Блочный, с кешированием отдельных блоков и поддержкой потокового доступа, и файловый, то что я понял из описания нынешней реализации. Как-то неразумно загружать все, если нужно 4кБ начиная с 1073741824 байта (1 ГБ).
Vadim Sterkin
По запросу = Только в облаке. Иначе файл доступен автономно, и разница лишь в том, перейдет ли он в облачное состояние автоматически.
Потокового воспроизведения нет. Закачка прекращается при закрытии диалога закачки в проводнике (выглядит как копирование) или закрытии программы, если открыто из нее.
Если первый раз из программы потянули файл из облака, система спросит, можно ли программе качать (но продолжит закачку, пока решение не принято). Список настраивается в Параметрах.
Евгений Грицан
У меня облачное хранилище Nextcloud на домашнем сервере, клиенты Windows только на рабочем и домашнем ПК и их использую как резервные копии и поэтому полностью синхронизирую с основным хранилищем. По запросу только клиенты IOS и Android использую
Vadim Sterkin
Да, у OneDrive в мобильных ОС тоже есть файлы по запросу. Но там просто переключатель хранить автономно. Перевода в облачное состояние через N дней нет (или я об этом не знаю).
Сергей Савчук
Файлами по запросу пользуюсь, очень удобно при работе на рабочем ПК/домашнем ПК/ноутбуке.
Обратил внимание, что для некоторых файлов (например, desktop.ini в корне папки OneDrive) состояние доступности установлено Исключено (не синхронизировано). Возник вопрос — а как такое можно сделать с каким-либо файлом по своему выбору? В качестве примера — файл конфигурации с привязкой к конкретному ПК — он должен быть на каждом ПК свой, а остальные файлы нужно синхронизировать и хранить в облаке.
Vadim Sterkin
Сергей, интересное наблюдение. Сразу ясно, что у вас включены скрытые и системные файлы, а у меня — нет :)
Навскидку — попробуйте сделать такие же атрибуты, как у desktop.ini, как-то так
А может еще и назвать его надо desktop.ini :)
Непонятно, почему этот файл должен обязательно лежать в OneDrive. Если не хотите его синхронизировать, не держите в сфере клиента синхронизации.
Игорь Пахмутов
Более интересен вариант когда у вас есть папка вне облака, и вы хотите ее закидывать в облако жесткой ссылкой.
В справке вариант такой не описан, но он работает с ммм… вроде так, по моим опытам
идея простая есть папка на диске и жесткая ссылка на него в папку ван драйва
что будет происходить?
а будет происходить следующее
папка будет в первый раз отправлена полностью в облаке, но иконка будет всегда синхронизация
при изменении вне ван драйва не ловит изменения. однако, при перезапуске службы ван драйва — синхронизирует последнее что есть на момент запуска службы
Vadim Sterkin
Жесткие ссылки предусмотрены только для файлов, см. сравнительную таблицу. Символические ссылки раньше вроде нормально работали, но с файлами по запросу у меня необходимость отпала.
В чем у вас практический смысл хранения файлов на другом диске вместо хранения в OneDrive по запросу?
Игорь Пахмутов
Потому что нужно временно дать для работы папку, которая должна потом остаться вне OneDrive, и в варианте экономии места — не хранить 2 версии. Нет, контроль версий тут не нужен, там нет такой совместной работы над одними и теми же файлами, и вариант получить две версии не получится.
Да, вероятно симлинк. Вспоминаю раз в полгода когда надо такое сделать. проверил, да junction там.
В общем, тут иная парадигма — папка и файлы локальные и не планируется их хранить в облаке, кроме варианта временно предоставить доступ для совместной работы через onedrive а архив будет локальным.