ZFS имеет ограниченную возможность постепенного обновления зеркального диска после того, как он некоторое время находился в автономном режиме. TL; DR: Вы можете делать то, что вы ищете, так, как вы предлагаете, но это не то, что предназначены для зеркал.
На практике то, что вы предлагаете, почти наверняка потребовало бы каждый раз полного пересчета, потому что временные изменения привели бы к тому, что прошло бы слишком много ревизий уберблока, поэтому не было бы общей базовой точки для добавочного пересчета. Если во время этого процесса произойдет сбой, вероятно, у вас возникнут серьезные проблемы с данными. Также имейте в виду, что из-за формата данных на диске дерева Merkle ресиверы ZFS могут (и выполняются) "в порядке уменьшения важности данных", а не последовательно, как RAID-системы, не основанные на файловой системе. Конечно, "важность данных" здесь касается ZFS, а не того, что вы считаете важным или стоит сохранить. Результирующая поисковая активность может легко создать серьезную нагрузку, особенно на один диск.
Канонический способ синхронизировать две файловые системы ZFS - использовать zfs send | zfs receive
между ними. Это требует, чтобы обе файловые системы были доступны (но вы можете сохранить выходные данные zfs send и использовать их в качестве входных данных для zfs, получаемых позже, если вы будете слишком склонны, но вы должны знать, что это сопровождается огромным предостережением: zfs receive
не предпринимает попыток восстановления из частично поврежденного потока данных и просто прерывает работу при обнаружении ошибок).
- Есть один пул для каждого резервного диска. Давайте назовем их танком и трубой. Допустим, у нас есть данные о резервуаре, которые мы хотим скопировать в трубу.
- Подключите оба привода, и
zpool import
оба бака и трубы. Вы можете передать -N
в zpool import, чтобы он не монтировал файловые системы.
- Сделайте снимок исходной файловой системы, танк.
zfs snapshot tank@current1984 -r
- Найдите самый последний снимок, который объединяет и танк, и трубу. Используйте что-то вроде
zfs list tank pipe -t snapshot
чтобы получить необработанный список для работы. Скажем, последний общий снимок, который у них есть, это current1948
.
- Запустите что-то вроде
zfs send -R -I tank@current1948 tank@current1984 | zfs receive pipe
для постепенной передачи дельты между current1948
и current1984
из резервуара в pipe. Прочтите справочную страницу zfs
для более подробной информации о подкомандах send и receive.
- Подождите, пока это не закончится, затем при необходимости удалите все снимки, которые больше не нужны. Убедитесь, что у вас есть хотя бы один снимок (например,
current1984
), который объединяет оба пула (скорее, файловые системы), чтобы использовать его в качестве базы в следующий раз.
На этом этапе оба пула будут иметь одинаковое содержимое, вплоть до используемого снимка. Если все сделано правильно, это также должно потребовать только передачи различий; Я не могу представить сценарий, в котором пошаговая zfs send | zfs receive
нужно сделать что-либо, например, полное зеркальное преобразование. Это также позволяет позже добавить избыточность в резервные пулы, если вы захотите это сделать. Если во время копирования происходит сбой исходного диска, старая резервная копия все равно должна быть доступна; будут потеряны только те различия, которые вы пытались перенести.