Я использую zfs send/receive для репликации файловой системы zfs на другой сервер каждый день. Рабочий процесс — стандартный send receive:
# 1. create snapshot on source
zfs snapshot ${source_fs}@${today}
# 2. send incremental update from yesterday to today to target
zfs send -i ${one_day_ago} ${source_fs}@${today} | ssh user@${target_host} "zfs receive ${target_fs}"
# 3. destroy old snapshots from two days ago on source and target
zfs destroy ${source_fs}@${two_days_ago}
ssh user@${target_host} "sudo zfs destroy ${target_fs}@${two_days_ago}"
Некоторое время это работало нормально. Однако теперь я получаю эту ошибку от zfs receive
:
cannot receive incremental stream: destination pool/filesystem has been modified since most recent snapshot
zfs list -t snapshot
на цели показывает небольшое значение в USED
столбце последнего снимка (что-то около 100К). Оно должно быть равно нулю. Файловая система не смонтирована на цели.
У меня есть скрипт, который проверяет квоты zpools и zfs. Запрос текущих квот (с zfs userspace $filesystem -pH -o name,used,quota -s used
) похоже изменяет файловую систему. Этого следовало ожидать? Я не понимаю, почему запрос некоторых чисел изменяет файловую систему.
Я использую Ubuntu 20.04 с OpenZFS 0.8.3 из репозиториев Ubuntu.
решение1
Непримонтированные файловые системы zfs не могут быть изменены ничем, кроме запросов receive/destroy и .... (ну, это почти все). Любые запросы zfs о статистике файловой системы не должны изменять содержимое fs. Итак, в заключение, я очень сомневаюсь, что это zfs userspace
что-то изменяет (и я сомневаюсь, что ваши наборы данных zfs не примонтированы). Но если я не прав (насчет zfs userspace
) - это явно ошибка, и огромная.