因为zfs send
和zfs
recv
使用流来交换数据,您可以使用它们通过组合
zfs send
、ssh
和
将信息从一个系统复制到另一个系统zfs recv
。
例如,要将
scratchpool
文件系统的快照复制到新服务器上调用的新文件系统slavepool
,您可以使用以下命令。此序列结合了 的快照
scratchpool
、到副本机器的传输(使用带有登录凭据的ssh )以及使用zfs recv在副本机器上恢复快照:
#> zfs send scratchpool@snap1 |ssh id@host pfexec zfs recv -F slavepool
管道的第一部分zfs send
scratchpool@snap1
,流式传输快照。该
ssh
命令及其在另一台服务器上执行的命令pfexec zfs recv -F
slavepool
接收流式快照数据并将其写入 slavepool。在本例中,我指定了
-F
强制应用快照数据的选项,因此具有破坏性。这很好,因为我正在创建我的复制文件系统的第一个版本。
在副本机器上,复制的文件系统包含完全相同的内容:
#> 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
将两个快照之间的更改再次发送到副本机器:
#> zfs send -i scratchpool@snapshot1 scratchpool@snapshot2 |ssh id@host pfexec zfs recv slavepool
仅当副本计算机上的文件系统根本未被修改时,此操作才会成功。您不能将增量更改应用于已更改的目标文件系统。在上面的示例中,该ls
命令会通过更改元数据(例如文件或目录的上次访问时间)而导致问题。
要防止副本文件系统发生更改,请将副本上的文件系统设置为只读:
#> zfs set readonly=on slavepool
设置readonly
意味着您不能通过正常方式更改副本上的文件系统,包括文件系统元数据。通常会更新元数据的操作(如我们的ls
)静默执行其功能,而不会尝试更新文件系统状态。
本质上,副本文件系统不过是原始文件系统的静态副本。但是,即使配置为只读,文件系统也可以应用快照。将文件系统设置为只读,重新运行初始副本:
#> zfs send scratchpool@snap1 |ssh id@host pfexec zfs recv -F slavepool
现在您可以对原始文件系统进行更改并将它们复制到副本。