バックアップ
ZFSでは,スナップショット単位でバックアップとリストアができる.
データセットとスナップショット単位で可能なため,構成が異なるプールにリストアすることも可能である.
Oracle Solaris ZFS 管理ガイド "データを送信および受信する"
http://docs.oracle.com/cd/E19253-01/819-6260/gbchx/index.html
スナップショット全体
バックアップ
zfs send
コマンドにより,スナップショットを標準出力に吐くことができる.
標準出力にリダイレクトを使って,ファイルに保存するなり,SSHで転送し,他のマシンのzfs recv
に引き渡すなり,好みの方法でバックアップを扱うことができるのである.
$ sudo zfs send pool0/hoge@first > first.bin
リストア
zfs recv
コマンドにより,標準入力からスナップショットをリストアすることができる.
例として,上記で保存したファイルから別のデータセットにリストアしてみる.
$ sudo zfs recv pool0/fuga < first.bin
このコマンドにより,新たに pool0/fuga
データセットとスナップショットが作成され,ファイルがリストアされていることが確認できる.
$ sudo zfs list -t snapshot -r pool0/fuga
NAME USED AVAIL REFER MOUNTPOINT
pool0/fuga@first 0 - 49.1K -
$ cat /pool0/fuga/hello.txt
Hello World
差分バックアップ
例示のために,さらに2つほどスナップショットを作ってある状態とする.
$ echo "Second Snapshot" > /pool0/hoge/hello.txt
$ sudo zfs snapshot pool0/hoge@second
$ echo "Third Snapshot" > /pool0/hoge/hello.txt
$ sudo zfs snapshot pool0/hoge@third
バックアップ
zfs send
に-i
または,-I
オプションを指定することで,特定のスナップショットから,特定のスナップショットまでの差分を送信することができる.これにより,転送量の削減をすることができる.
-i
オプションの場合には,途中のスナップショットを含まず,-I
オプションの場合には,途中のスナップショットを含んでバックアップする.
$ sudo zfs send -I pool0/hoge@first pool0/hoge@third > first-to-third.bin
リストア
差分バックアップをリストアするときもzfs recv
コマンドを利用する.差分リストアの場合には,入力されるバックアップデータの始点となっているスナップショットと,リストア先のが同一の状態になっていることが要求される.
$ sudo zfs rollback pool0/fuga@first
始点となるスナップショットから変更点がある場合には次のようなエラーが発生する.
cannot receive incremental stream: destination pool0/fuga has been modified
since most recent snapshot
このような場合には,前述のロールバックを行ってからリストアする必要がある.
$ sudo zfs rollback pool0/fuga@first
$ sudo zfs recv pool0/fuga < first-to-third.bin
SSHを使った他のマシンへのバックアップ
$ sudo zfs send pool0/hoge@first | ssh 192.168.1.10 sudo zfs recv pool1/hoge
のように,SSHをパイプでつなぐことによって,リモートホストの別のプールに送信することができる.
さくらのBASE StorageやAmazon S3へのアップロード
筆者が開発中の cloudbackup
コマンドを利用すると,標準入力から受け取ったストリームをさくらのBase Storageや,Amazon S3などのクラウドストレージへアップロードできる.
本題とは外れるので,このようなこともできるという例のひとつとして,セットアップと実行例のみを記載する.
また,このコマンドは開発中のため,動作の保証はできない.
インストールと設定ファイルの作成
$ sudo apt-get install python3-pip
$ sudo pip3 install cloudbackup
設定ファイルを ~/.cloudbackup.json
に作成する.
{
"s3":{
"token":"token",
"secret":"secret",
"host":"https://example.b.storage.sakura.ad.jp/"
}
}
スナップショットの転送
$ sudo zfs send pool0/hoge@first | \
cloudbackup send --output=s3:sakurabk/pool0/hoge/first1