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