Отправить снимок ZFS на удаленную машину

Редактировать:

Первоначально этот вопрос был сосредоточен на проблеме изменения направления соединения ssh при передаче, но я понял, что это не является причиной проблем, с которыми я столкнулся, поэтому я упростил это.


Хотя документация Ubuntu о zfs обсуждается только отправка-получение через файл, такой подход невозможен для больших наборов данных. Документация Oracle рекомендует использовать ssh в трубе, т. е.

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

Однако, пытаясь выполнить эту процедуру с созданным мной тестовым набором данных, содержащим один файл 10M, я столкнулся с проблемой реализации Ubuntu Xenial: zfs (ZFS-on-Linux), требующие привилегий суперпользователя (на принимающей стороне):

$ 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 файл, поэтому я считаю, что он на самом деле ничего не пытается сделать, но я не уверен, почему он зависает.)

3 ответа

Решение
sudo zfs send tank/dana@snap1 | ssh sys2Root zfs recv newtank/dana

где sys2root - это запись в ~/.ssh/config, т.е.

host sys2Root
  HostName 192.168.0.x
  User root

Учитывая, что обычно считается плохой идеей разрешить вход root через ssh, альтернативой является наличие целевого пользователя, скажем foo, будьте sudoer на целевом хосте, назовите его remote. Также плюсом является вход без пароля.

Тогда будет достаточно следующей команды

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

для отправки из 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
Другие вопросы по тегам