ext3 ファイルシステムへの スナップショット機能の設計と実装 NTT コムウェア株式会社オープンソースソフトウェア推進部前野真輝 ( E-Mail: maeno.masaki@nttcom.co.jp )
目次 背景 スナップショットの概要及び実装例 ext3 スナップショットの実現動機 ext3 スナップショットの実現方針 ffs スナップショットの概要 ext3 ファイルシステムのジャーナル機能の概要 ext3 スナップショットの設計 現時点の実装とその評価 今後の課題 2005/06/01 Linux Conference 2005 1
背景
スナップショットの概要 スナップショットはある瞬間のイメージを保持 利点 : 短い時間でイメージを取得可能 スナップショットを取得する時 スナップショット取得元ファイルシステムポインタの作成のみ データ 1 データ 2 データ 3 データ 1 へのポインタデータ 2 へのポインタデータ 3 へのポインタ スナップショット スナップショット取得後に元の FS 上のデータ更新が発生する時 データ 1 データ 2 データ 3 更新前のデータのコピーポインタの変更 データ 1 へのポインタデータ 2 への ポインタデータ 3 へのポインタデータ3 2005/06/01 Linux Conference 2005 3
スナップショットの既存の実装例 名称 OS レイヤ 特徴 LVM (=logical volume manager) スナップショット Linux ブロックデバイスレイヤ Device-mapper を利用 ffs FreeBSD FS レイヤ ffs を拡張 (=BSD fast file system) スナップショット NetBSD ( 更新型 ) soft updates を利用 WAFL (=write anywhere file layout) スナップショット ストレージシステム FS レイヤ ( 追記型 (LFS)) NetApp 社が特許を持つ WAFL を拡張 スナップショットが同じ inode 番号を持つ SnapView TimeFinder ストレージシステム FS レイヤ EMC 社の Symmetrix 等の製品に採用 2005/06/01 Linux Conference 2005 4
ext3 スナップショットの実現動機 現在 Linux 上で有力なのは LVM スナップショット ブロックデバイスレイヤでの実装 スナップショット専用領域を別に確保して差分情報を格納 chunk 単位 (= 大きなサイズ ) でスナップショット取得後の更新前データのコピー (=Copy-On-Write) して保護 利点 スナップショット取得時に存在したデータの更新が速い スナップショットとして利用できる量を自由に決定可能 欠点 FS レベルでみると 更新されていないデータもコピーが行われるため 余分なコピーが発生し 余分にディスク容量を消費 利用できる量を超えるとスナップショットは消滅 FSレイヤで実装する事により欠点を解決できるのではないか 現在 Linuxで標準 FSである ext3fsへの実装 2005/06/01 Linux Conference 2005 5
ext3 スナップショットの実現目標 スナップショットを通常通り ext3fs としてマウントして利用可能 ジャーナリング FS でスナップショット機能が実装可能である事を実証する スナップショット数に FS レイアウト上の制限を付けない スーパブロックにスナップショット inode 番号を埋め込む事は受け入れない 短時間での ( スナップショットの ) クラッシュリカバリ ext3fs の特徴を失わない 2005/06/01 Linux Conference 2005 6
ext3 スナップショット 実現方針
ext3 スナップショットの実現方針 ffs と ext3 の関係 ffs BSD ffs を元に設計 soft updates(soft dep) を利用して ffs snapshot スナップショット機能付加 ffs snapshot を元に設計 Linux ext2fs ジャーナル機能付加 ext3fs スナップショット機能付加 ext3 snapshot ext3 スナップショットも ffs スナップショットを基本にする ただし ext3fs のジャーナリングに関する制限を克服する実装が必要 2005/06/01 Linux Conference 2005 8
ext3 スナップショットの実現方針 ffs と ext3 の関係 ffs BSD ffs を元に設計 soft updates(soft dep) を利用して ffs snapshot スナップショット機能付加 ffs snapshot を元に設計 Linux ext2fs ジャーナル機能付加 ext3fs スナップショット機能付加 ext3 snapshot ext3 スナップショットも ffs スナップショットを基本にする ただし ext3fs のジャーナリングに関する制限を克服する実装が必要 まず ffs スナップショットと ext3fs のジャーナル機能について説明する 2005/06/01 Linux Conference 2005 9
ffs スナップショット
ffs スナップショットの概要 あらゆる更新操作についてデータを書き換えた後にポインタを変更する soft updates の機構を利用 inode 更新, 直接 / 間接ブロック確保, truncate down/up, ディレクトリ / エントリの追加 / 削除等のあらゆる更新操作のデータ依存関係を考慮 ブロック書き出し時に Copy-On-Write する事により スナップショット取得時のデータを保護 前述した動作と同じ データ 1 データ 2 データ 3 更新前のデータのコピーポインタの変更 データ データ1 へのポインタデータ2 へのポインタデータ3 へのポインタ ポインタデータ 3 2005/06/01 Linux Conference 2005 11
1 1 2 2 3 4 4 ffs スナップショットのデータ退避先とその利用 Copy-On-Write したデータ退避先は取得元 FS 内の通常ファイル (= スナップショットファイル : 取得元 FS と見かけ同容量の sparse ファイル ) へ行う 2: vnode 仮想デバイスへスナップショットファイルと取得元 FS を関連付ける 0 0 1 2 3 4 1 2 4 5 5 6 6 = スナップショット取得後に更新されたデータブロック 4: vnode 仮想デバイスをマウントしスナップショットを FS として利用 vnode 仮想デバイス (= スナップショット用デバイス ) 3: スナップショットファイルにブロックが存在すればスナップショットファイルから 存在しなければ取得元 FS から読み出し スナップショットファイル 1: スナップショット取得後から更新されるブロックを更新前にスナップショットファイルへコピー (=Copy-On-Write) スナップショット取得元 FS = スナップショット取得後に更新されていないデータブロック 2005/06/01 Linux Conference 2005 12
ext3 ファイルシステム ( ジャーナル機能 )
ext3fs のジャーナルの仕組みとその役割 複数のブロックにわたる不可分な変更内容をまずジャーナル領域へ書き出す事で システムクラッシュしても ジャーナルリプレイにより高速なリカバリを実現する ジャーナルも通常ファイルと同様に inode やデータブロックを持つ ジャーナルは別デバイスに確保する事も可能 1: データ変更要求 ext3fs 2: 変更内容を先に書き出す 3: 実際のデータを書き出す ジャーナル 実際のデータ 3 : 3 中にクラッシュした場合ジャーナル内のデータを利用してリカバリする 2005/06/01 Linux Conference 2005 14
ext3fs のジャーナルモード data=journal データを含む全ての変更をジャーナルする data=ordered (ext3 のデフォルトモード ) 通常ファイルのデータ以外 (inode や間接ブロックやビットマップブロックなどのメタデータ ) に対しジャーナルする ジャーナルを書き出す前に実際の通常ファイルのデータを書き出す data=writeback 通常ファイルのデータ以外 ( メタデータ ) に対しジャーナルする ジャーナルと通常ファイルのデータの書き出し順序は問わない 2005/06/01 Linux Conference 2005 15
ffs soft updates と ext3fs のディスク書き出し依存関係 ffs soft updates soft updatesは全ての追加 / 更新 / 削除の各操作に対して細かい単位でディスク書き出しの依存関係を追跡する必要有 ext3 ジャーナル data=journal メタデータ ジャーナル データ data=journal data=ordered ジャーナルは soft updatesに比べてディスク書き出しの依存関係が大幅に単純化 data=journal : メタデータとデータ それ以外 : メタデータのみ ディスク書き込み依存関係 (B を書き出し完了後, A を書き出す ) ジャーナル解放依存関係 (Bを書き出し完了後, Aを解放する ) 2005/06/01 Linux Conference 2005 16 A A B B
ext3 スナップショット 設計
ext3 スナップショットの実現方針 基本的な考え方は ffs スナップショットと同様 スナップショットの作成 スナップショットを取得する元のパーティション内へ見かけ上同容量のスナップショットファイルを作成 スナップショットの保護 ファイルシステム上のデータが更新される直前にスナップショット取得時のデータをスナップショットファイルへ退避 (=Copy-On-Write) スナップショットの利用 スナップショットファイルを関連付けたスナップショット専用のブロックデバイスからスナップショットを利用 基本的な考え方は ffs スナップショットと同様で既に動作を説明済みなので 処理の流れに沿うのではなく 各機能に焦点を当てて説明する 2005/06/01 Linux Conference 2005 18
ext3 スナップショットへ必要な機能 ffs スナップショットと異なる方式で実装する機能 Copy-On-Write beforeイメージジャーナル スナップショットファイルの delayed allocation クラッシュリカバリ ffs スナップショットと同じ考え方で実装する機能 スナップショット初期化 ( スナップショットファイル作成 ) ブロック解放抑止 スナップショット用デバイス 2005/06/01 Linux Conference 2005 19
必要な機能 : Copy-On-Write スナップショットのデータの保護 実際のデータが更新される前にスナップショット取得時のデータをスナップショットファイルへコピーする (=Copy-On-Write) 4: 実際のデータの更新 1: データ更新要求 ext3fs with ext3スナップショット 3: スナップショット 2: スナップショットのメタデータの更新取得時のデータを退避 メタデータ データ スナップショットファイルメタデータ データ 2005/06/01 Linux Conference 2005 20
必要な機能 : Copy-On-Write 問題点 ffs スナップショットではディスクブロックの書き出し前に Copy-On-Write しているが ext3fs では既にジャーナル領域に書き出されてしまった後である 解決策 その間にクラッシュするとスナップショットデータはジャーナルリプレイにより失われる ディスクブロック書き出し時ではなく データ更新時に Copy-On-Write する 2005/06/01 Linux Conference 2005 21
必要な機能 : Copy-On-Write Copy-On-Write のタイミング メタデータ更新の直前 ジャーナルの変更前処理 inode bitmap による inode ブロック内クリア処理 データ更新の直前 write() 処理 mmap() 処理 direct_io() 処理 ブロック境界でない truncate down 処理 2005/06/01 Linux Conference 2005 22
必要な機能 : before イメージジャーナル クラッシュ時のスナップショットのデータの保護 スナップショット取得時のメタデータとデータをジャーナルへ書き出す (= ジャーナル量増加 ) data=journal ただし ジャーナルモードに依存せずにそれを行わなければならない メタデータ データ data=journal data=ordered A A B ディスク書き込み依存関係 (B を書き出し完了後, A を書き出す ) B スナップショット取得時に存在した ジャーナル解放依存関係 (Bを書き出し完了後, Aを解放する ) データが変更される場合 ジャーナル data=journal : メタデータとデータ それ以外 : メタデータのみ スナップショット取得時の + メタデータとデータ (=Copy-On-Write されるデータ ) 2005/06/01 Linux Conference 2005 23
必要な機能 : before イメージジャーナル 問題点 data=ordered data=ordered ではジャーナルよりもデータへの書き出しを先に行わねばならず 既存のジャーナルへスナップショットのデータを追加する方針には問題がある data=journal では問題なく data=writeback では新たな制約を設ければ良い メタデータ データ 実際のデータ変更中にシステムクラッシュすると ジャーナル中にあるスナップショットのデータはまだディスクに書き出されておらず消滅してしまう ジャーナル 実際のメタデータ スナップショット取得時のメタデータとデータ (=Copy-On-Write されるデータ ) 2005/06/01 Linux Conference 2005 24
必要な機能 : before イメージジャーナル 解決策 従来のジャーナルとは別のスナップショット用のジャーナル (=before イメージジャーナル ) を設ける 従来のジャーナルは after イメージジャーナルと呼ぶ メタデータ スナップショットファイルメタデータ ( 取得元 FS 上にある ) スナップショットファイル自身のメタデータを指す データ スナップショットファイルデータ data=journal data=journal data=ordered COW COW after イメージジャーナル before イメージジャーナル スナップショット取得時のメタデータとデータ (=Copy-On-Writeされるデータ ) 2005/06/01 Linux Conference 2005 25
必要な機能 : Copy-On-Write と before イメージジャーナル スナップショットファイルスナップショットファイルメタデータメタデータ Copy-On-Write 処理によるスナップショット取得時のデータの流れ 1:after イメージジャーナル (data=ordered の場合はデータ ) を書き出す前にスナップショット取得時の情報をコピー メタデータ 1 の前後 ( スナップショット取得時の情報が更新されるのを検知した後 ): スナップショット取得時の情報を各々のスナップショットファイルへコピー データ after イメージジャーナル COW COW COW COW スナップショットファイルスナップショットファイルデータデータ before イメージジャーナル 2005/06/01 Linux Conference 2005 26
必要な機能 : スナップショットファイルの delayed allocation 複数スナップショット取得時の問題点 スナップショット数が増えれば増えるほど システムコールを完了するための変更ブロック数が増加し after イメージジャーナル量が多くなり過ぎ 処理が破綻 メタデータ スナップショットファイルスナップショットファイルメタデータメタデータメタデータ データ after イメージジャーナル COW COW COW COW COW COW スナップショットファイルスナップショットファイルデータデータ ジャーナル量がスナップショット数に比例し多くなり過ぎる before イメージジャーナル 2005/06/01 Linux Conference 2005 27
必要な機能 : スナップショットファイルの delayed allocation 解決策 ブロック割り当て処理を write() 時に行うのではなく ページ書き出し時に行うようにする Copy-On-Write 時に (after イメージ ) ジャーナルを必要としなくなる メタデータ スナップショットファイルスナップショットファイルメタデータメタデータメタデータ データ after イメージジャーナル COW COW COW COW COW COW スナップショットファイルスナップショットファイルデータデータ スナップショットファイルに対して before delayed イメージジャーナル allocationを行う 2005/06/01 Linux Conference 2005 28
必要な機能 : クラッシュリカバリ スナップショットの回復処理の追加 クラッシュリカバリの流れ従来のジャーナルのリプレイ従来のジャーナルの有効化 スナップショットの回復処理 before イメージジャーナルからスナップショットファイルに対して更新 クラッシュ時に truncate/unlink 中であったファイルの処理 2005/06/01 Linux Conference 2005 29
必要な機能 : スナップショット初期化 スナップショットファイル作成 見かけ上 FSと同容量のファイルを作成 FSを停止させてメタデータをコピー 1: スナップショット取得要求 ext3fs with ext3 スナップショット 4: メタデータのコピー 2: スナップショットファイル作成 メタデータ データ Any: FSへの要求 3: ファイルシステム停止 5: ファイルシステム再開 この時間が mkfs.ext3 程度掛かってしまう (=FS 停止時間が長すぎる ) スナップショットファイルメタデータデータ 2005/06/01 Linux Conference 2005 30
必要な機能 : スナップショット初期化 解決策 FSの停止時間を短くするために前もってメタデータをコピーし コピー中に変化したメタデータだけを FSを停止させて再度コピー 1: スナップショット取得要求 ext3fs with ext3 スナップショット 3: メタデータのコピーと変更追跡 Any: FSへの要求 4: ファイルシステム停止 6: ファイルシステム再開 2: スナップショットファイル作成 メタデータ 5: メタデータのコピー中に変更されたメタデータのデータ再コピー スナップショットファイルメタデータ データ 2005/06/01 Linux Conference 2005 31
必要な機能 : ブロック解放抑止 ブロック解放時のスナップショットのデータの保護 スナップショット取得後は スナップショットが該当ブロックを参照している可能性があり もし参照している場合はブロック解放しない ブロック解放抑止のタイミング ブロック解放時 free_blocks() 処理 Copy-On-Write 時と異なり 解放処理はジャーナルされない ( 必要がない ) ために解放抑止処理はブロック解放時で問題無い 2005/06/01 Linux Conference 2005 32
必要な機能 : スナップショット用デバイス スナップショットの利用 スナップ取得元デバイスのデータとスナップショットファイルを選択的に読み込む専用ブロックデバイスから利用 0 1 2 3 4 5 6 スナップショット専用ブロックデバイス 1 2 4 スナップショットファイル 0 1 1 2 2 3 4 4 5 6 スナップショット取得元 FS = スナップショット取得後に更新されたデータブロック = スナップショット取得後に更新されていないデータブロック 2005/06/01 Linux Conference 2005 33
ext3 スナップショット 現時点の実装状況
現時点での実装 スナップショットの基本動作は実装完了 FS 毎に 1 つのスナップショットが取得でき スナップショット用デバイスを介してスナップショットをマウントし読み出せ スナップショットを解放できる 制約条件 アンマウントやシステムクラッシュによりスナップショットは消滅する ディスクフル時はスナップショット取得元 FS が ReadOnly へ移行する ディスクフルに関与しない部分への読み出しはスナップショット 取得 FS 共に可能 2005/06/01 Linux Conference 2005 35
現時点で実装した機能 実装済が青色, 未実装が赤色 ffs スナップショットと異なる方式で実装する機能 Copy-On-Write before イメージジャーナル 既存のジャーナル量を増やして data=journal でスナップショットファイルをジャーナルしたアドホックな実装 スナップショットファイルの delayed allocation クラッシュリカバリ ffs スナップショットと同じ考え方で実装する機能 スナップショット初期化 ( スナップショットファイル作成 ) ブロック解放抑止 スナップショット用デバイス 2005/06/01 Linux Conference 2005 36
ext3 スナップショット 現時点の実装の評価
評価観点と測定内容 評価観点 LVM スナップショット (ext3 on LVM) との比較 スナップショット未取得時のデータ更新 新規作成の速さ スナップショットを取得する速さ スナップショット取得後のデータ更新の速さ スナップショット取得後のデータ新規作成の速さ ext3 スナップショットでは Copy-On-Write 処理が発生しないが LVM スナップショットでは Copy-On-Write 処理が発生する 測定内容 (3 回測定した各平均時間 ) スナップショット未取得時のデータ更新 新規作成の時間 スナップショット取得の時間とその際の FS 停止の時間 スナップショット取得後の既存ファイルのデータ更新の時間 スナップショット取得後の新規ファイルのデータ作成の時間 2005/06/01 Linux Conference 2005 38
スナップショット未取得時の既存データ更新と新規データ作成の時間 既存データ更新時間 新規データ作成時間 既存データ更新時間 ( スナップショット未取得時 ) 新規データ作成時間 ( スナップショット未取得時 ) 350 300 250 350 300 250 sec 200 150 ext3ss LVMss sec 200 150 ext3ss LVMss 100 100 50 50 0 200MBx2/1GB 1GBx2/20GB 0 200MBx2/1GB 1GBx2/20GB 既存データ更新容量 / 取得元 FS 容量 新規データ作成容量 / 取得元 FS 容量 データの更新 新規作成ともに若干遅い Copy-On-Write のために予約するジャーナル量が増え ジャーナルのディスク書き出し動作が増えているため 2005/06/01 Linux Conference 2005 39
スナップショット取得の時間 スナップショット取得時間 スナップショット取得時間 (I/O 負荷無 ) dd コマンドで新規データ作成しながらスナップショットを取得 スナップショット取得時間 (I/O 負荷有 ) sec 5 4.5 4 3.5 3 2.5 2 1.5 1 0.5 0 ext3ss LVMss sec 160 140 120 100 80 60 40 20 0 ext3ss LVMss 1GB 20GB 1GB 20GB スナップショット取得元 FS 容量 スナップショット取得元 FS 容量 ext3 の方が 3~4 倍程度遅い メタデータのコピー処理で必要なブロックを前もって確保するのではなく その都度ブロックを確保しているため 両者とも数十秒以上掛かっている LVM は I/O 高負荷時スナップショット取得が遅いためか dd コマンドによるデータの作成が速いためか 2005/06/01 Linux Conference 2005 40
スナップショット取得時の FS 停止の時間 スナップショット取得時 FS 停止時間 FS 停止時間 (I/O 負荷無 ) dd コマンドで新規データ作成しながらスナップショットを取得 FS 停止時間 (I/O 負荷有 ) sec 5 4.5 4 3.5 3 2.5 2 1.5 1 0.5 0 ext3ss sec 45 40 35 30 25 20 15 10 5 0 ext3ss 1GB 20GB 1GB 20GB スナップショット取得元 FS 容量 スナップショット取得元 FS 容量 I/O 負荷が無い時は問題無い I/O 負荷が有る時は数十秒も FS 停止していて問題有り もしくはやむを得ない ( かも ) 2005/06/01 Linux Conference 2005 41
スナップショット取得後の既存データ更新と新規データ作成の時間 既存データ更新時間 既存データ更新時間 ( スナップショット取得時 ) 新規データ作成時間 新規データ作成時間 ( スナップショット取得時 ) 1400 1400 1200 1200 1000 1000 sec 800 600 400 200 0 200MBx2/1GB 1GBx2/20GB 既存データ更新容量 / 取得元 FS 容量 ext3ss LVMss sec 800 600 400 200 0 200MBx2/1GB 1GBx2/20GB 新規データ作成容量 / 取得元 FS 容量 ext3ss LVMss ext3 の方が 1.5~4 倍程度遅い ext3 の方が 1.5 倍 ~3 倍程度速い LVM の方が Copy-On-Write 単位が大きいため 効率が良い 少し遅すぎる ( かも ) LVM の方が Copy-On-Write 単位が大きいため 余分な Copy- On-Write が発生している 2005/06/01 Linux Conference 2005 42
利点 現時点の実装の評価のまとめ (LVM との比較 ) スナップショット取得後の新規データ作成が速い 更新されないデータは Copy-On-Write されないので 余分なディスク容量の消費が無い 欠点 (= 今後の課題 ) スナップショット取得後の既存データ更新が遅い スナップショット取得時間や I/O 高負荷下の FS 停止が長い 課題はあるものの FS レイヤで実装する事により LVM スナップショットと異なる性能特性を示し ext3 スナップショットの存在意義が認められる ただし実装途中なので数値は参考程度に 2005/06/01 Linux Conference 2005 43
ext3 スナップショット デモ 時間があれば
ext3 スナップショットの利用の流れ 利用例 スナップショットの取得から利用まで # e3snapconfig c /mnt/src/snapshot.img 1 # ssdevconfig c /mnt/src/snapshot.img /dev/ssdev/0 2 # mount /dev/ssdev/0 /mnt/ss 3 # cd /mnt/ss 4 スナップショットの利用終了から解放まで # umount /mnt/ss 5 # ssdevconfig d /dev/ssdev/0 6 # e3snapconfig d /mnt/src/snapshot.img 7 2005/06/01 Linux Conference 2005 45
まとめ
まとめ ext3fs へのスナップショット機能追加の設計と実装について述べ その存在意義を示した 現時点のソースコード及び利用手順を以下で公開している http://sourceforge.net/projects/ext3snapshot/ 今後の課題 スナップショット取得の性能向上 未実装部分の実装 スナップショットの永続化 before イメージジャーナルの実装 クラッシュリカバリの実装 複数のスナップショットの取得 スナップショットファイルの delayed allocation の実装 2005/06/01 Linux Conference 2005 47
ご静聴頂きまして 誠にありがとうございました 前野真輝 松尾隆利 山幡為佐久 所属 : =NTT コムウェア株式会社, =VALinuxSystemsJapan 株式会社