====== Faire une sauvegarde avec zfs ====== zfs(8) va vous permettre de sauvegarder vos systèmes et données d'une machine à une autre très simplement. \\ Dans cet article désigne le système à sauvegarder et , le système qui va contenir la sauvegarde. ===== Que sauvegarder ===== Faites un [[https://www.freebsd.org/doc/handbook/zfs-term.html#zfs-term-snapshot|cliché]] de votre système : $ zfs snap -r zroot@maintenant Dans le cas présent, je fais un instantané de toute la hiérarchie qui se trouve sous le [[https://www.freebsd.org/doc/handbook/zfs-term.html#zfs-term-dataset|dataset]] ''zroot''. En général, il s'agit de tout votre [[https://www.freebsd.org/doc/handbook/zfs-term.html#zfs-term-pool|pool]]. Pensez à nettoyer tout ce qui pourrait être mis en //cache// et qu'il n'est pas nécessaire de sauvegarder avant de lancer la procédure. $ pkg clean -a Par exemple, les paquets téléchargé, dans ''/usr/ports/distfiles'': * depuis une [[ports::poudriere]]: $ poudriere distclean -a . ===== L'hôte ===== Préparez votre hôte pour recevoir la sauvegarde. ==== Disque ==== Si vous avez un disque dédié à la sauvegarde, préparez le: zpool create svgd /dev/da0 ==== Dataset ==== Créer vos //dataset//: $ zfs create svgd/BCK $ zfs create svgd/BCK/S $ zfs set canmount=off svgd/BCK/S La dernière ligne vous assure que votre sauvegarde ne sera jamais remontée automatiquement, ce qui va éviter de sérieux problèmes si la sauvegarde contient des points de montage de la hiérarchie standard, hier(7). Ce qui est en général le cas. === Chiffrement === Vous pouvez aussi chiffrer le disque, pour éviter que votre disque soit lisible par d'autres: zfs create -o encryption=aes-256-gcm -o keyformat=passphrase svgd/BCK === Permissions === Nous allons faire passer le flux de données au travers d'un tunnel //ssh//, nous allons avoir besoin: - d'un utilisateur sans droits ''root'' ; - que cet utilisateur puisse travailler sur le [[https://www.freebsd.org/doc/handbook/zfs-term.html#zfs-term-dataset|dataset]] cible. $ zfs allow -u david create,mount,destroy,receive svgd/BCK/S ==== options ==== Comme ce //dataset// est dédié à la sauvegarde, utilisez des paramètres appropriés: $ zfs set -o compression=lz4 svgd/BCK/S $ zfs set copies=2 svgd/BCK/S $ zfs set atime=off svgd/BCK/S $ zfs set dedup=off svgd/BCK/S ===== Sauvegarder ===== Depuis le système , envoyer votre [[https://www.freebsd.org/doc/handbook/zfs-term.html#zfs-term-snapshot|cliché]] vers la cible : $ zfs send -R zroot@maintenant | ssh -i my_id_rsa david@sauvegarde.D.net zfs recv -Fduv svgd/BCK/S * ''my_id_rsa'' est [[net::ssh|la clef SSH]] pour se connecter à . * ''-d'' va supprimer le nom du ''pool'' du chemin de la sauvegarde. * ''-u'' ne pas monter le système sur la cible. * ''-F'' va supprimer sur la cible les clichés qui ne sont plus sur la source. Ne fonctionne qu'avec ''-R''. Affinez et accélérer le transfert par : $ zfs send -c -R zroot@maintenant | ssh -i my_id_rsa david@sauvegarde.D.net zfs recv -Fduv svgd/BCK/S * ''-c'' pour compresser ce qui peut l'être Selon les capacités de vos ''pool'', soit ''large_blocks'' et ''embedded_data'', autant sur la cible que sur la source: root@popeye:~ # zpool get feature@embedded_data zroot NAME PROPERTY VALUE SOURCE zroot feature@embedded_data active local root@popeye:~ # zpool get feature@large_blocks zroot NAME PROPERTY VALUE SOURCE zroot feature@large_blocks enabled local vous pouvez ajouter les options ''-L'' et ''-e'' à la commande ''send''. Attention à ne pas activer certaines capacités dans l'unique but d'accélérer le transfert. Consultez d'abord la documentation, zpool-features(7). \\ En particulier, un //dataset// qui aurait des blocs de taille supérieurs à ''128K'' (paramètre ''recordsize'') autorisé par l'option ''large_blocks'' n'est pas pris en charge par le boot-loader. ==== Précautions ==== Pour éviter des montages inattendus sur la machine cible, évitez de transférer les point de montages avec la sauvegarde * '' zfs recv … -x canmount -x mountpoint '' ou *'' zfs recv … -o canmount=off -x mountpoint '' Si vous avez autorisé le passage de la propriété ''canmount'' sur . ==== Sauvegarde incrémentale ==== Une fois le premier cliché sauvegardé, vous allez pourvoir utiliser la sauvegarde incrémentale. \\ C'est à dire, faire une sauvegarde à partir de deux clichés. Typiquement, entre le cliché le plus récent que vous avez pris sur la source et le dernier que vous avez envoyé à l'hôte , qui doit bien sûr toujours exister sur . \\ Il suffit de donner ces deux clichés à ''send'' derrière l'option ''-i''. zfs send -c -i zroot/dataset@${REMOTE_ZLAST} zroot/dataset@${LOCAL_ZLAST} | ssh user@D zfs recv -Fdu zfs/${REMOTE_POOL} - ''${REMOTE_ZLAST}'', cliché le plus récent transféré sur ; - ''${LOCAL_ZLAST}'' , cliché le plus récent pris sur . Une fois transféré, vous pouvez supprimer le cliché ''${REMOTE_ZLAST}'' de , ''${LOCAL_ZLAST}'' prenant sa place. ==== En cascade ==== L'option ''-R'' (//replicate//) donnée à ''zfs send'' va envoyer en cascade le ''dataset'' parent ainsi que ses enfants. Ça a un coté pratique, puisque vous n'aurez pas à définir un par un les éléments que vous voulez sauvegarder et qu'il est nécessaire pour que ''-F'' fonctionne. D'un autre coté, vous allez absolument tout sauvegarder, en particulier de nombreuses données dont vous n'aurez pas besoin ensuite, par exemple ''/usr/src'', ''/tmp'' et une partie des enfants de ''/var''. Par contre, si la machine contient des [[jails:zfs|jails]], vous allez sauvegarder non seulement ces dernières, mais aussi la base qui a servi à les construire.Sans parler de vos [[ports:poudriere|poudrières]]. Assurez vous par ailleurs que toutes vos [[https://www.freebsd.org/doc/handbook/zfs-term.html#zfs-term-clone|clones]] sont promus, en particulier ceux des [[jails:zfs#multiplier|jails]].\\ Sinon, attendez vous à un beau bordel.les clichés à l'origine des clones vont entrer en conflit avec ceux destinés à la sauvegarde. Bien entendu , Vous allez automatiser tout ça dans un script, n'est-ce pas 😉? Ce qui rend le ''send'' en cascade inutile. Choisissez ceux que vous allez sauvegarder et intégrez les dans une boucle. ==== Nettoyer ==== Pour éviter de multiplier les clichés sur un hôte, effacer régulièrement, ou par script, les clichés les plus vieux: $ zfs destroy -vr zroot@%vieux ==== Sauvegarde dans un fichier ==== Vous pouvez tout simplement sauvegarder vos //dataset// dans des fichiers. Pour les transférer ensuite à votre guise sur un autre support: zfs send -c -e ${dataset}@${LAST} > /bck/${ZFILE}.bck Avec: ZFILE=`echo "${dataset}" | sed 's+\/+_+g'` par exemple, pour remplacer les séparateurs. ===== En savoir plus ===== * [[https://gitlab.com/TurtleCrazy/zfsbackup|jeu de scripts pour automatiser les sauvegardes]] ; * [[https://www.freebsd.org/doc/handbook/zfs-zfs.html|Le manuel ]].