Você parece bem definido usando rsync
e um RaspberryPi, então aqui está outra resposta com um pouco de informações sobre o cérebro que, esperamos, o ajudará a chegar a uma solução.
Now I'm wondering if there is any way to view a recursive snapshot, including all the datasets, or whether there is some other recommended way to rsync an entire zpool.
Não que eu saiba ... espero que as recomendações sejam da mesma forma que a minha outra resposta.
Se você estivesse satisfeito em simplesmente executar rsync
no pool do ZFS montado, poderá excluir os diretórios .zfs
(se estiverem visíveis para você) usando rsync --exclude='/.zfs/'
ou definir a propriedade snapdir=hidden
.
Isso causa problemas, já que cada conjunto de dados pode ser montado em qualquer lugar, e você provavelmente não vai querer perder nenhum ...
Você desejará gerenciar snapshots e criar um novo snapshot para " agora ", fazer o backup e provavelmente excluí-lo depois. Adotar essa abordagem (em vez de apenas usar os sistemas de arquivos montados " ao vivo ") fornecerá um backup consistente de um ponto no tempo. Ele também garantirá que você não faça backup de nenhuma hierarquia estranha ou perca nenhum sistema de arquivos que possa ser montado em outro lugar.
$ SNAPSHOT_NAME="rsync_$(date +%s)"
$ zfs snapshot -r ${ROOT}@${SNAPSHOT_NAME}
$ # do the backup...
$ zfs destroy -r ${ROOT}@${SNAPSHOT_NAME}
Em seguida, você precisará obter uma lista completa de conjuntos de dados dos quais deseja fazer backup executando zfs list -Hrt filesystem -o name ${ROOT}
. Por exemplo, eu gostaria de fazer backup da minha árvore users
, abaixo está um exemplo:
$ zfs list -Hrt filesystem -o name ell/users
ell/users
ell/users/attie
ell/users/attie/archive
ell/users/attie/dropbox
ell/users/attie/email
ell/users/attie/filing_cabinet
ell/users/attie/home
ell/users/attie/photos
ell/users/attie/junk
ell/users/nobody
ell/users/nobody/downloads
ell/users/nobody/home
ell/users/nobody/photos
ell/users/nobody/scans
Isto lhe dá uma lista recursiva dos sistemas de arquivos nos quais você está interessado ...
No entanto, você pode pular determinados conjuntos de dados e eu recomendo usar uma propriedade para isso - por exemplo, rsync:sync=true
impediria a sincronização do conjunto de dados. Esta é a mesma abordagem que eu recentemente adicionado ao syncoid
.
Os campos abaixo são separados por um caractere de tabulação.
$ zfs list -Hrt filesystem -o name,rsync:sync ell/users
ell/users -
ell/users/attie -
ell/users/attie/archive -
ell/users/attie/dropbox -
ell/users/attie/email -
ell/users/attie/filing_cabinet -
ell/users/attie/home -
ell/users/attie/photos -
ell/users/attie/junk false
ell/users/nobody -
ell/users/nobody/downloads -
ell/users/nobody/home -
ell/users/nobody/photos -
ell/users/nobody/scans -
Você também precisa entender que (como apontado acima) porque os conjuntos de dados do ZFS podem ser montados em qualquer lugar , não é realmente correto pensar neles como eles são apresentados no VFS ... Eles são entidades separadas e você deve tratá-las como tal.
Para conseguir isso, vamos nivelar os nomes dos sistemas de arquivos substituindo qualquer barra /
por três underscores ___
(ou algum outro delimitador que normalmente não apareça no nome de um sistema de arquivos).
$ filesystem="ell/users/attie/archive"
$ echo "${filesystem//\//___}"
ell___users___attie___archive
Tudo isso pode ser reunido em um script simples ... algo assim:
OBSERVAÇÃO: Eu apenas testei isso brevemente ... e deve haver mais tratamento de erros.
#!/bin/bash -eu
ROOT="${ZFS_ROOT}"
SNAPSHOT_NAME="rsync_$(date +%s)"
TMP_MNT="$(mktemp -d)"
RSYNC_TARGET="${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}"
# take the sanpshots
zfs snapshot -r "${ROOT}"@"${SNAPSHOT_NAME}"
# push the changes... mounting each snapshot as we go
zfs list -Hrt filesystem -o name,rsync:sync "${ROOT}" \
| while read filesystem sync; do
[ "${sync}" != "false" ] && continue
echo "Processing ${filesystem}..."
# make a safe target for us to use... flattening out the ZFS hierarchy
rsync_target="${RSYNC_TARGET}/${filesystem//\//___}"
# mount, rsync umount
mount -t zfs -o ro "${filesystem}"@"${SNAPSHOT_NAME}" "${TMP_MNT}"
rsync -avP --exclude="/.zfs/" "${TMP_MNT}/" "${rsync_target}"
umount "${TMP_MNT}"
done
# destroy the snapshots
zfs destroy -r "${ROOT}"@"${SNAPSHOT_NAME}"
# double check it's not mounted, and get rid of it
umount "${TMP_MNT}" 2>/dev/null || true
rm -rf "${TMP_MNT}"