スナップショット (ファイルシステム)

ファイルシステムにおけるスナップショットとは、ストレージ中に過去のある一時点で存在したファイルとディレクトリの集合、またはその記録処理を実現する仕組みである。

**目的**
あるファイル・ディレクトリ群をバックアップする際に、対象中のファイルがバックアップ処理中に更新されると、ファイル・ディレクトリ相互の整合性が合わなくなる可能性がある。バックアップ処理開始近辺にバックアップされるファイルと、処理終了近辺にバックアップされるファイルとでは、各々がバックアップされる時刻が異なっているためである。更新のかかるデータベースファイルや、メールサーバのスプールフォルダなどのバックアップでは、このような時刻のずれに対処しないと不整合が起きやすい例である。
そこで、ある一時点のファイル・ディレクトリの状態を統一的に保持してその内容（またはその内容から得たスナップショットデータ）をバックアップすることで、ファイル・ディレクトリ相互の時間的整合性を保つために導入される仕組みの一種が「スナップショット」である。
データ保全のためのバックアップ用途以外に、スナップショットデータの有用性を生かした他の用途でも利用される。
スナップショットデータを作成する際には、作成している間その対象が更新されてはならない。ただし、スナップショットデータ作成中でも対象のデータを「更新可能」な仕組みがある。原理としては「スナップショットデータ作成中はファイル・ディレクトリ更新において実データを直接更新させず、特別に用意した別の領域（ジャーナル、トランザクションログなどとも呼ばれる）にそのことを記録させ、スナップショットデータ作成中の実データの情報を固定させる。スナップショットデータ作成中に読み出しアクセスを受けた際は、実データに特別な領域の情報を加味した内容を返す。スナップショットデータ作成終了後に、実データに特別な領域に記録した更新情報を反映させる」方法などが用いられる。

**注意点**
スナップショットには、ストレージレベル(LVM,ZFSのボリュームを使っている場合等)とファイルシステムレベル(ZFS,UFS,NTFS等)のスナップショットの2種類がある。
前者はストレージレベルでスナップショットが作成されるため、いかなるファイルシステムであってもスナップショットを作成することが可能である(LVMのようにOS上のソフトウェアで実現される場合はそのOSが作成できる範囲にはなる)が、
スナップショットを正しく取れる状況は限定されるので利用上の注意が必要である。
昨今のOSではライトバックキャッシュを持ち、なるべくストレージに書き込まない制御を行っているので、
ストレージスナップショットは原則としてストレージをアンマウントした状態でのみ、壊れていないイメージを作成することができる。
スナップショット用のサポートツールがある場合は、それを使うことによって、OSのバッファをフラッシュし、書き込み操作をブロックしたのち、スナップショットを作成し、書き込みを再開する手順を取ることにより、壊れていない(厳密に言えば壊れているが、ジャーナルログ等により復旧されるため実害が発生しない)スナップショットを撮ることが可能である
ファイルシステムスナップショットは、ストレージ効率も良く、キャッシュ上のデータを含めてスナップショットの対象となるため、
上記のような問題は発生しない(書き込み中のファイルについては、書き込まれたところまで有効であることに注意)が、
スナップショットに対応したファイルシステムである必要がある。

**スナップショット機能の拡張**
ファイルシステムによっては、内部的に過去のバージョンのファイルを追跡記録しており、特別な名前空間を使ってそのスナップショットにアクセスできるものもある。そのようなファイルシステムとしては、WAFL、ベル研究所のPlan 9用ファイルシステムFossil、ODS-5が挙げられる。他にもNTFSやUFS2のように、ファイルのヒストリにアクセスするためのAPIをオペレーティングシステム (OS) が備えている場合もある。
スナップショットに読み書き可能なものは特にbranching snapshotとも呼ばれる。これは、この機能が、スナップショット中のデータの枝分かれしたバージョンを暗黙のうちに作成することによる。ZFSではこの機能をcloneと呼ぶ。

**実装**

**Unix系システム**
Linuxを含むUnix系システムの中には、スナップショットを利用できるLVMを備えるものがある。これらは、ブロックデバイス全体に対するコピーオンライトを実装している。具体的には、変更対象のブロックをストレージの別の場所にコピーすることで実現している。
これによって、矛盾のないブロックデバイスのイメージを保存することができる。このイメージ上のファイルシステムは、読み取り専用メディアとしてマウントすることもできる。ほとんどの場合において、ブロック単位でのスナップショットは、ファイルシステムレベルでサポートするスナップショットと比べて、記憶容量の点で効率が劣る。例外はZFSで、スナップショットがファイルシステムに必要不可欠な構成要素となっている。

**Windows のファイルシステム**
Windows XP と Windows Server 2003 以降では、NTFS ボリューム向けにShadow Copy(Volume Shadow copy Service、VSS) と呼ばれるスナップショット機能を提供している。OS の次の機能で主に利用されており、アプリケーションからも利用可能である。
バックアップと復元:ファイルデータのバックアップ処理の際に、スナップショットを採取してそのデータからバックアップ先に書きだしている。
「以前のバージョン」:定期的またはオンデマンドでスナップショットを採取させ、採取時点のファイルの内容を抽出できる機能。ファイルデータの世代管理に近い機能を実現している。
システムの保護（システム復元ポイント、システム回復オプションなど）:ソフトウエアやデバイスドライバのインストールなどのあとにOS環境が不調になったりした場合に、過去の良好な時点に復元する機能。ドライバなどOSに大きな影響を与える処理の直前に、スナップショットを採取するようになっている。
スナップショットのデータは、内部的なシャドウコピー用の「記憶域」内に記録される。差分の記録であるため、繰り返しスナップショットを取得した場合でも取得回数分に正比例して増えることはない。また、採取の際に、スナップショット個数の上限や、指定した記憶域のサイズを超える場合は、古いスナップショットデータから削除されていく。
シャドウコピーの管理には、エクスプローラ、vssadmin コマンド、WMI の Win32_ShadowCopy などを用いる。スナップショットデータ内のファイルにアクセスする際には、フォルダのネットワーク共有機能（共有フォルダ）を介する。これはローカルファイルに対しても同じであり、たとえば日本標準時 (JST) 2012年8月20日 12:05:10 に採取した C:\Windows\System32 内を参照する際は、 "\\localhost\C$\@GMT-2012.08.20-03.05.10\Windows\System32" といわゆるドライブの「管理共有」を介して指定する。

**プラットフォーム仮想化システム**
VMware社の各種仮想化ソリューション、Microsoft Hyper-V、Oracle VirtualBox などにおいて、仮想環境のスナップショットを採取することが可能である。過去の時点に復元させたり、スナップショットデータを複製することで別に用意された仮想環境に複製元の仮想環境の状態から動作させることが可能である。

**スナップショットの応用**
シャドウページングとログ先行書き込みはスナップショットによく似たメカニズムで、これは多くのデータベースでトランザクションを実装するために使われている。 
スナップショットの考えかたは、メモリ上にしか存在しないデータ構造に対しても適用できる。例としてソフトウェアトランザクショナルメモリが挙げられる。事実上、永続データ構造はメモリ上のデータのスナップショットであると言える。
バックアップソフトウェアの中にはスナップショットの機能をオプションとして別で提供しているものもある。例えばBackup Execでは、これはOpen File Optionという名前で提供されている。

**脚注 ==