Je photographie actuellement mon NAS basé sur ZFS tous les soirs et toutes les semaines, un processus qui m'a sauvé le cul plusieurs fois. Cependant, bien que la création de l'instantané soit automatique (à partir de cron), la suppression des anciens instantanés reste une tâche manuelle. Évidemment, il y a un risque que si je suis frappé par un bus ou que la tâche manuelle ne soit pas effectuée, le NAS manquera d'espace disque.
Quelqu'un a-t-il de bons moyens / scripts pour gérer le nombre d'instantanés stockés sur ses systèmes ZFS? Idéalement, je voudrais un script qui itère à travers tous les instantanés pour un système de fichiers ZFS donné et supprime tous, sauf les n derniers instantanés pour ce système de fichiers.
Par exemple, j'ai deux systèmes de fichiers, l'un appelé tank
et l'autre appelé sastank
. Les instantanés sont nommés avec la date à laquelle ils ont été créés: sastank@AutoD-2011-12-13
une simple sort
commande doit donc les répertorier dans l'ordre. Je cherche à garder la valeur des instantanés quotidiens des 2 dernières semaines tank
, mais seulement les deux derniers jours des instantanés sastank
.
sort -r
avant lased
commande.sed
semble afficher le bas de la liste au-delà des 15 premières lignes, qui dans le tri par défaut est la plus récente. Inverser la liste signifie que j'obtiens les plus anciens instantanés en bas.Cas plus général d'obtention de l'instantané le plus récent en fonction de la date de création, et non par nom.
zfs list -H -t snapshot -o name -S creation | head -1
Portée vers un nom de système de fichiers spécifique
TestOne
zfs list -H -t snapshot -o name -S creation -d1 TestOne | head -1
-H
: Pas d'en-tête pour que la première ligne soit un nom d'instantané-t snapshot
: Liste des instantanés (la liste peut répertorier d'autres choses comme les pools et les volumes)-o name
: Affiche la propriété du nom de l'instantané.-S creation
: Le capitalS
indique un tri décroissant , basé sur le temps de création. Cela place l'instantané le plus récent en première ligne.-d1 TestOne
: Dit inclure les enfants, ce qui semble déroutant mais c'est parce qu'en ce qui concerne cette commande, les instantanés de TestOne sont des enfants. Cela ne répertoriera PAS les instantanés des volumes dans TestOne tels queTestOne/SubVol@someSnapshot
.| head -1
: Dirigez-vous vers la tête et ne renvoyez que la première ligne.la source
-d1
. C'était la clé de la question "Comment puis-je obtenir tous les instantanés pour un ensemble de données donné?"Cela ne répond pas totalement à la question elle-même, mais n'oubliez pas que vous pouvez supprimer des plages d'instantanés.
Détruirait tous les instantanés de "20160918" à "20161107" inclus. L'une ou l'autre extrémité peut être laissée en blanc, pour signifier "la plus ancienne" ou "la plus récente". Vous pouvez donc préparer quelque chose qui calcule le "n" puis détruire "...% n" ..
Désolé de ressusciter une vieille question.
la source
growse n'a pas fonctionné sur OpenIndiana pour moi. Il ne comprenait pas -0 pour xargs.
Si vous utilisez le tri, sachez qu'il trie par ordre alphabétique, ce qui peut ne pas être souhaité car vous souhaitez probablement trouver le plus récent.
Voici le code qui supprimera tous les instantanés sauf les derniers.
Supprimez l '«écho» pour aller en direct.
Sources: http://sed.sourceforge.net/sed1line.txt
la source
J'ai peut-être résolu cela avec du bash-fu.
Sensationnel. Ça fait tellement mal.
la source
Le chemin pour la tête est nécessaire sur Solaris, mais devrait fonctionner sans le chemin sur les autres distributions.
la source