Отправить снимок 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