ZFS pozwala na wydajne przenoszenie danych między różnymi systemai opartymi o ten system plików. Do przesyłania danych między odległymi komputerami warto skorzystać z opcji zfs send oraz zfs recv. Warto by komputery były połączone VPNem, w przeciwnym przypadku do tunelowania wypada użyć SSH.
Polecnia send i recv nie potrafią utworzyć nowej puli, trzeba ją utworzyć na docelowej maszynie samodzielnie. Nie wszystkie ustawienia datasetów są kopiowane, trzeba pamiętać by na docelowej maszynie ustawić dla puli parametry typu recordsize, atime takie, jakie mają być odziedziczone przez datasety jakie zostaną utworzone podczas przesyłania danych. Przy tworzeniu puli warto pamiętać o parametrze ashift. Parametry nie muszą być zgodne - wystarczy, że pula będzie miała wystarczającą ilość wolnego miejsca do przechowywania danych.
Przesyłanie danych polega na wydaniu na jednym komputerze polecenia zfs send a na innym zfs receive. Tutaj omówiony zostanie przypadek kopiowania z użyciem SSH.
Zaczynamy od utworzenia snapshota, który będzie punktem odniesienia przy kopiowaniu danych
zfs snapshot source_pool/dataset@replication1
Zaczymy właściwe przesyłanie:
zfs send -R source_pool/dataset@replication1 | ssh 192.168.x.y zfs recv -Fduv dest_pool/dataset
Co oznaczają konkretne opcje? Otóż: zfs send: -R = recursive replication - przesyła wszystko -I = przesyła inkrementalne snapshoty, istotne przy inkrementalnym przesyłaniu
zfs recv: -F = usuwa z docelowego miejsca istniejące dane jeśli zachodzi koilizja -d = zachowuje nazwę docelowej puli odpowiednio dostosowując ścieżki -u = nie montuje datasetów w docelowym systemie po dokonaniu exportu danych -v = verbose, daje informacje zwrotne
Jeżeli mamy zaufane połączenie między hostami to możemy użyć mbuffer, pozwoli to zoptymalizować transfery i uzyskać maksymalną wydajność łącza. Na docelowej maszynie wydajemy polecenie:
mbuffer -s 128k -m 1G -I 9090 | zfs recv -Fduv dest_pool/dataset
Na maszynie z której wysyłamy dane:
zfs send -RI source_pool/dataset@replication1 | mbuffer -s 128k -m 1G -O 192.168.x.y:9090
W przypadku jeśli łącze nie jest za szybkie a mamy nadmiar czasu procesora możemy uruchomić kompresję w locie przesyłanych danych:
zfs send -RI source_pool/dataset@replication1 | gzip | ssh 192.168.x.y "gunzip | zfs recv -Fduv dest_pool/dataset"
W przypadku kiedy chcemy przetransferować wszystkie datasety można zrobić snapshota rekurencyjnego i przesłać taki snapshot
zfs snapshot -r source_pool@xfer
zfs send -R source_pool@xfer | ssh 192.168.x.y zfs recv -Fduv dest_pool
Tak przesłaną pulę przed właściwym zaimportowaniem wypada zweryfikować w sensie sprawdzić czy wszystkie punkty montowania są we właściwych miejscach:
zpool import -N dest_pool
zfs list
Po udanyn transferze danych można usunąć rekurencyjnego snapshota na obu maszynach:
zfs destroy -rv source_pool@xfer
ssh 192.168.x.y zfs destroy -rv dest_pool@xfer