zfs send
および zfs recv
はストリームを使用してデータを交換するため、これらを使用して zfs send
、ssh
、および zfs recv
を結合することで、あるシステムから別のシステムに情報を複製できます。
たとえば、scratchpool
ファイルシステムのスナップショットを、新しいサーバー上の slavepool
と呼ばれる新しいファイルシステムにコピーするには、次のコマンドを使用します。このシーケンスは、scratchpool
のスナップショット、スレーブマシンへの転送 (ssh とログイン資格証明を使用)、および zfs recv を使用したスレーブでのスナップショットのリカバリを結合します。
root-shell> zfs send scratchpool@snap1 |ssh id@host pfexec zfs recv -F slavepool
パイプラインの最初の部分 zfs send scratchpool@snap1
はスナップショットをストリームします。ssh
コマンドと、他方のサーバーでそれが実行するコマンド pfexec zfs recv -F slavepool
は、ストリームされたスナップショットデータを受け取り、slavepool に書き込みます。この例では -F
オプションを指定しました (スナップショットデータが強制的に適用されるため破壊的)。複製されたファイルシステムの最初のバージョンを作成しているため、これで問題ありません。
スレーブマシンでは、複製されたファイルシステムに正確に同じ内容が含まれています。
root-shell> ls -al /slavepool/
total 23
drwxr-xr-x 6 root root 7 Nov 8 09:13 ./
drwxr-xr-x 29 root root 34 Nov 9 07:06 ../
drwxr-xr-x 31 root bin 50 Jul 21 07:32 DTT/
drwxr-xr-x 4 root bin 5 Jul 21 07:32 SUNWmlib/
drwxr-xr-x 14 root sys 16 Nov 5 09:56 SUNWspro/
drwxrwxrwx 19 1000 1000 40 Nov 6 19:16 emacs-22.1/
スナップショットが作成されたあとに、ファイルシステムを再度同期するには、新しいスナップショットを作成してから、zfs send
の増分スナップショット機能を使用して 2 つのスナップショット間の変更をスレーブマシンに再度送ります。
root-shell> zfs send -i scratchpool@snapshot1 scratchpool@snapshot2 |ssh id@host pfexec zfs recv slavepool
この操作は、スレーブマシン上のファイルシステムがまったく変更されなかった場合にのみ成功します。変更された宛先ファイルシステムには増分変更を適用できません。上記の例では、ls
コマンドがファイルまたはディレクトリの最終アクセス時間などのメタデータを変更することで問題を引き起こします。
スレーブファイルシステムでの変更を防ぐには、スレーブ上のファイルシステムを読み取り専用に設定します。
root-shell> zfs set readonly=on slavepool
readonly
を設定することは、通常の方法ではスレーブ上のファイルシステムを変更できないことを意味します (ファイルシステムメタデータを含む)。一般的にメタデータを更新する操作 (ls
のように) は、ファイルシステム状態の更新を試みることなく、サイレントにそれらの関数を実行します。
スレーブファイルシステムの本質は元のファイルシステムの静的コピーにすぎません。ただし、読み取り専用に構成されている場合でも、ファイルシステムはそれに適用されるスナップショットを持つことができます。読み取り専用に設定されているファイルシステムで、初期コピーを再実行します。
root-shell> zfs send scratchpool@snap1 |ssh id@host pfexec zfs recv -F slavepool
これで、元のファイルシステムに変更を行い、それらをスレーブに複製できます。