OneDriveのファイルオンデマンド
実データが手元にないクラウド上のファイルをプレースホルダー(リパースポイント)としてローカルに見せ、アクセス時にクラウドフィルターが実体を取得する仕組み。
クラウドファイル
プレースホルダー
ファイル名・サイズ・タイムスタンプなどのメタデータ(約1KB)だけを持ち、中身のデータを持たないリパースポイント。
KFM(既知のフォルダーの移動)
デスクトップ・ドキュメント・ピクチャをOneDrive配下へ移動する仕組み。プロンプト・サイレント適用のいずれでも構成できる。
ユーザーフォルダーのパス変更
デスクトップ・ドキュメント・ピクチャなどの既知のフォルダーの実体パスが移動されること。固定パスを前提にしたアプリの想定を壊す。
Cloud Files API(cldflt.sys)
プレースホルダーを支えるWindowsの仕組みと、その実働部隊であるファイルシステムミニフィルター。OneDriveはこのAPIを使う同期プロバイダーのひとつ。
NTFS
現行のWindowsが標準で使うファイルシステム。MFT(マスターファイルテーブル)などの構造でボリューム上のファイルを管理する。
ハイドレーション
プレースホルダーの中身を同期プロバイダーから取り寄せること。逆にローカルの実体を捨ててプレースホルダーへ戻すのがデハイドレーション。
デハイドレーション
FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS
中身の一部または全部がローカルになく、読むとリモートからの取り寄せが発生することを示すファイル属性。
PINNED / UNPINNED属性
ユーザーが常にローカルへ保持したいのか(PINNED)、実体を持たなくてよいのか(UNPINNED)という意図を表すファイル属性。attribではPとUで見える。
0x8007016A(クラウド ファイル プロバイダーが実行されていません)
OneDriveが構成不良・停止しているときにクラウドファイルの操作が返すエラー。
FILE_FLAG_OPEN_NO_RECALL
要求されたデータをローカルストレージへ移送し戻さず、リモート側に置いたまま開くことを指示するCreateFileのフラグ。
ローカルへの実体保持
取り寄せたファイル内容をローカルストレージへ移送して保持し続けること。データを読みつつローカルには残さない開き方も選べる。
FileSystemWatcher
.NETが提供する、ファイル・ディレクトリの作成・変更・削除・名前変更をイベントで通知するAPI。ディレクトリ通知はアプリが動いている間しか受け取れず、内部バッファのoverflowで個別通知を取りこぼすことがある。
共有違反(ERROR_SHARING_VIOLATION)
既存のハンドルの共有モードと競合するアクセスを要求したオープンが失敗すること。
OneDrive同期の失敗
同期クライアントがファイルをアップロード・更新できない状態。他のアプリが排他ロックで開いている間などに起きる。
ストレージセンサー
一定日数開かれていないクラウドファイルを自動でオンライン専用に戻せる機能。既定値は0(自動では戻さない)。
自動オンライン専用化
しばらく使われていないローカル実体を自動でクラウドのみの状態に戻すこと。Storage Senseの空き容量確保などが行う。
OneDrive同期アプリのポリシー
FilesOnDemandEnabled・KFMSilentOptIn・KFMBlockOptIn・KFMBlockOptOut・DehydrateSyncedTeamSitesなど、同期の挙動をグループポリシーやIntuneで構成する設定群。
グループポリシー
Active Directoryドメイン環境でWindowsの設定を集中構成する仕組み。
Microsoft Intune
クラウドからPC・モバイルデバイスを管理するMicrosoftのMDMサービス。
KFMはデスクトップ・ドキュメント・ピクチャをOneDrive配下へ移動する。新PCの初期セットアップで有効化されやすく、組織ではポリシーで一斉適用もできるため、固定パスを前提にしたアプリはここで壊れる。
ファイル オンデマンドはCloud Files APIというOSの仕組みの上に実装され、ファイルシステム側の実働部隊はcldflt.sysというミニフィルターである。OneDriveはこのAPIを使う同期プロバイダーのひとつにすぎない。
プレースホルダーは技術的にはリパースポイントで、ファイルシステム上には約1KBのメタデータだけが存在し中身のデータはない。エクスプローラーのプロパティでは「サイズ」に本来のサイズが出るのに「ディスク上のサイズ」がほぼ0になる。
Cloud Files APIはプレースホルダーを作成・管理し、互換性のため、同期エンジンと%systemroot%配下のプロセス以外にはリパースポイントであることを隠す。普通のアプリからは少し開くのが遅いだけの普通のファイルに見えるため、アプリが気づかないまま前提を壊される。
アプリがファイルを開いて読むとミニフィルターが要求を検知し、同期プロバイダーにデータ転送を指示してダウンロード完了を待ってから読み取りが進む。
RECALL_ON_DATA_ACCESSは中身の一部または全部がローカルにないことを示す。属性の確認だけならダウンロードは発生しないので、調査や一括チェックに安心して使える。
ファイル オンデマンドの状態はPINNED(常に利用可能)・どちらでもない(ローカルで利用可能)・UNPINNED(オンライン専用)で表され、attrib +p / -p / +uで設定する。オンライン専用から戻すときは-pだけではUが残るので、+p -uのように反対側の属性も同時に外す。
OneDriveが停止・サインアウト・一時停止しているときや、ネットワークが不調なときは取り寄せができず、「存在するのに開けないファイル」になる。存在確認や属性・サイズの取得は成功するため、存在確認は通ったのに読み取りで失敗するというエラーパターンになる。
FILE_FLAG_OPEN_NO_RECALLは要求されたデータをローカルストレージへ移送し戻さず、リモート側に置いたまま開くことを指示する。
この属性が付いたファイルへ不用意な読み書きを発行しないようガイダンスが明記している。カーネルドライバー向けの文書だが、属性が付いたファイルの中身に触れれば取り寄せコストが発生するという原則はユーザーモードのアプリにも当てはまる。
OneDrive配下を監視すると、他のデバイスでの変更が同期されるたび、ハイドレーション・デハイドレーションで属性やサイズが変わるたびにChangedイベントが発生し得る。取り込んだ結果を同じフォルダーへ書き戻す設計では変更通知のループになる。
業務アプリがファイルを排他ロックで開いている間、同期アプリはそのファイルをアップロードも更新もできない。長時間ロックを保持するアプリをOneDrive配下に置くと同期エラーが常態化する。
ストレージセンサーは一定日数開かれていないクラウドファイルを自動でオンライン専用に戻せる。既定値は0(自動では戻さない)だが、ユーザーが有効化していたり組織で構成していたりすると「先週まで開けたファイルが雲マークに戻っている」が正常動作として起こる。ピン留めされたファイルは対象外になる。
業務アプリが読むフォルダーをピン留めしておけば実体がローカルに保証され、自動オンライン専用化の対象からも外れる。
FilesOnDemandEnabled・KFMSilentOptIn・KFMBlockOptIn・KFMBlockOptOut・DehydrateSyncedTeamSitesなどをグループポリシーで構成し、「気づいたら有効」ではなく意図して構成する。
同じポリシー群はIntuneからも配布できる。