将 ZFS 快照发送到远程机器

将 ZFS 快照发送到远程机器

编辑

这个问题最初集中在传输时反转 ssh 连接方向的问题上,但我意识到这不是导致我遇到的问题的原因,所以我简化了它。


尽管Ubuntu 文档zfs讨论通过文件发送-接收,但该方法对于大型数据集来说是不可行的。Oracle 文档建议在管道中使用ssh,即

# zfs send tank/dana@snap1 | ssh sys2 zfs recv newtank/dana

zfs但是,尝试使用我创建的包含单个 10M 文件的测试数据集执行此过程时,我遇到了 Ubuntu Xenial 的(ZFS-on-Linux) 实现需要 root 权限(在接收端)的问题:

$ sudo -i
# zfs send tank/dana@snap1 | ssh sys2 zfs recv newtank/dana
Permission denied the ZFS utilities must be run as root.
warning: cannot send 'tank/dana@snap1': Broken pipe

我尝试通过传递标志来解决这个问题ssh-t即发出

# zfs send tank/dana@snap1 | ssh -t sys2 "sudo zfs recv newtank/dana"

失败了

Pseudo-terminal will not be allocated because stdin is not a terminal.

在询问sys2的凭证之前,之后会收到以下消息:

sudo: no tty present and no askpass program specified
warning: cannot send 'tank/dana@snap1': Broken pipe

尝试使用另一个方向进行测试传输,使用

# ssh -t sys2 "sudo zfs send newtank/dana2@snap1" | zfs recv tank/dana2

在询问 的sys2凭证后就挂起了。(回想一下,每个快照只包含一个 10M 的文件,所以我相信它实际上并没有尝试做任何事情,但我不确定它为什么会挂起。)

答案1

鉴于允许 root 通过 ssh 登录通常被认为是一个坏主意,另一种方法是让目标用户(比如说)foo在目标主机上成为 sudoer,并将其命名为remote。此外,无密码登录也是一个优点。

然后,以下命令就足够了

$ sudo zfs send <dataset1> | ssh foo@remote "sudo zfs recv <dataset2>"

答案2

sudo zfs send tank/dana@snap1 | ssh sys2Root zfs recv newtank/dana

其中 sys2root 是 ~/.ssh/config 中的条目,即:

host sys2Root
  HostName 192.168.0.x
  User root

答案3

从 Xigma-nas (FreeBSD) 发送我使用了来自 ubuntu 服务器的以下命令并且成功了。

ssh username@hostname_or_ip_where_snap_shot_exist "zfs send pool_name/dataset@01" | sudo zfs recv pool_name/desired_dataset_name

相关内容