Je souhaite supprimer un répertoire contenant de grandes quantités de données. Il s'agit de ma baie de sauvegarde, qui est un système de fichiers ZFS , une étendue linéaire, un pool unique appelé "san". San est monté sur /san
donc je veux supprimer en bloc / san / thispc / certainFolder
$ du -h -d 1 certainFolder/
1.2T certainFolder/
Plutôt que de devoir attendre, rm -rf certainFolder/
je ne peux pas simplement détruire le descripteur de ce répertoire pour qu'il soit écrasable (même par le même nom de répertoire si je choisis de le recréer) ??
Par exemple, pour ne pas savoir grand-chose sur la gestion interne de zfs fs, spécifiquement sur la façon dont il mappe les répertoires, mais si je trouve cette carte, par exemple, et que je supprime les bonnes entrées pour, par exemple, le répertoire ne s'affichera plus, et cet espace que le répertoire contenait auparavant. doit également être retiré d'une sorte d'audit.
Existe-t-il un moyen facile de le faire, même sur un ext3 fs, ou est-ce déjà ce que la commande de suppression récursive doit faire en premier lieu, à savoir piloter et éditer des journaux?
J'espère juste faire quelque chose du genre kill thisDir
où il supprime simplement une sorte d'ID, et poof le répertoire n'apparaît plus ls -la
et les données sont toujours là sur le lecteur, bien sûr, mais l'espace sera maintenant réutilisé ( écrasé), parce que ZFS est juste cool?
Je veux dire, je pense que zfs est vraiment cool, comment pouvons-nous le faire? Idéalement? se frotter les mains :-)
Mon cas d'utilisation spécifique (outre mon amour pour zfs) est la gestion de mes archives de sauvegarde. Ce répertoire de sauvegarde est poussé vers via freefilesync (AWESOME PROG) sur ma boîte Windows vers un partage de fichiers smb, mais a également un répertoire de version où les anciens fichiers vont. Je supprime les répertoires de niveau supérieur qui résident dans la sauvegarde principale, qui ont été copiés dans la version - par exemple /san/version/someStuff
, comme un nettoyage bimensuel d' rm -rf /san/version/someStuff/*
un terminal de mastic, maintenant je dois ouvrir un autre terminal; Je ne veux pas faire ça à chaque fois, je suis fatigué de devoir inutilement surveiller rm -rf.
Je veux dire, je devrais peut-être définir la commande pour simplement relâcher la poignée, puis imprimer sur std out, cela pourrait être bien. Plus réaliste , recréez l'ensemble de données en quelques secondes zfs destroy san/version; zfs create -p -o compression=on san/version
après les réflexions de la réponse de @Gilles.
zfs create dataset -p -o compression=on yourPoolName/BackupRootDir/hostNameYourPc/somesubdir
Réponses:
Le suivi des blocs libérés est inévitable dans tout système de fichiers décent et ZFS ne fait pas exception . Il existe cependant un moyen simple sous ZFS d'avoir une suppression de répertoire presque instantanée en "différant" le nettoyage sous-jacent. Elle est techniquement très similaire à la suggestion de Gilles mais est intrinsèquement fiable sans nécessiter de code supplémentaire.
Si vous créez un instantané de votre système de fichiers avant de supprimer le répertoire, la suppression du répertoire sera très rapide car rien ne devra être exploré / libéré en dessous, tous étant toujours référencés par l'instantané. Vous pouvez ensuite détruire l'instantané en arrière-plan afin que l'espace soit progressivement récupéré.
la source
feature@async_destroy
peut également aider à accélérer cela (du point de vue d'un utilisateur ou d'un administrateur) s'il est activé; voirzpool get all $pool
. Notez qu'au moins j'ai regardé, s'il y a une destruction en cours en cours lors de l'importation du pool , alors cette destruction devient synchrone et l'importation du pool ne se terminera pas avant la fin de la destruction. Attention si vous devez redémarrer!Ce que vous demandez est impossible. Ou, plus précisément, il y a un coût à payer lors de la suppression d'un répertoire et de ses fichiers; si vous ne le payez pas au moment de la suppression, vous devrez le payer ailleurs.
Vous ne supprimez pas seulement un répertoire - ce serait presque instantané. Vous supprimez un répertoire et tous les fichiers qu'il contient et supprimez également de manière récursive tous ses sous-répertoires. Supprimer un fichier signifie décrémenter son nombre de liens, puis marquer ses ressources (les blocs utilisent pour le contenu du fichier et les métadonnées de fichier, et l'inode si le système de fichiers utilise une table d'inode) comme libre si le nombre de liens atteint 0 et que le fichier n'est pas ouvert. Il s'agit d'une opération qui doit être effectuée pour chaque fichier dans l'arborescence de répertoires, donc le temps qu'il faut est au moins proportionnel au nombre de fichiers.
Vous pourriez retarder le coût du marquage des ressources comme gratuites. Par exemple, il existe des systèmes de fichiers à récupération de place, où vous pouvez supprimer un répertoire sans supprimer les fichiers qu'il contient. Une exécution du garbage collector détectera les fichiers qui ne sont pas accessibles via la structure de répertoires et les marquera comme libres. Faire
rm -f directory; garbage-collect
sur un système de fichiers récupéré fait la même chose querm -rf
sur un système de fichiers traditionnel, avec différents déclencheurs. Il y a peu de systèmes de fichiers récupérés car le GC est une complexité supplémentaire qui est rarement nécessaire. L'heure du GC peut arriver à tout moment, lorsque le système de fichiers a besoin de blocs libres et n'en trouve aucun, de sorte que les performances d'une opération dépendent de l'historique, et pas seulement de l'opération, ce qui est généralement indésirable. Vous auriez besoin d'exécuter le garbage collector juste pour obtenir la quantité réelle d'espace libre.Si vous souhaitez simuler le comportement du GC sur un système de fichiers normal, vous pouvez le faire:
(J'ai omis de nombreux détails importants tels que la vérification des erreurs, la résilience aux coupures de courant, etc.) Le nom du répertoire devient immédiatement inexistant; l'espace est progressivement récupéré.
Une approche différente pour éviter de payer le coût lors de l'enlèvement sans GC serait de le payer lors de l'allocation. Marquez l'arborescence des répertoires comme supprimée et parcourez les répertoires supprimés lors de l'allocation des blocs. Ce serait difficile à concilier avec des liens durs, mais sur un système de fichiers sans liens durs, cela peut être fait avec une augmentation de coût O (1) dans l'allocation. Cependant, cela rendrait une opération très courante (création ou agrandissement d'un fichier) plus coûteuse, avec pour seul avantage une opération relativement rare (suppression d'une grande arborescence de répertoires) moins coûteuse.
Vous pouvez supprimer en bloc une arborescence de répertoires si cette arborescence était stockée comme son propre pool de blocs. (Remarque: j'utilise le mot «pool» dans un sens différent de «pool de stockage» de ZFS. Je ne connais pas la terminologie appropriée.) Cela pourrait être très rapide. Mais que faites-vous de l'espace libre? Si vous le réaffectez à un autre pool, cela a un coût, bien que beaucoup moins que la suppression de fichiers individuellement. Si vous laissez l'espace comme espace de réserve inutilisé, vous ne pouvez pas le récupérer immédiatement. Avoir un pool individuel pour une arborescence de répertoires signifie des coûts supplémentaires pour augmenter ou réduire la taille de ce pool (à la volée ou explicitement). Faire de l'arborescence son propre pool de stockage augmente également le coût de déplacement des fichiers dans et hors de l'arborescence.
la source
zfs list
. Jusque-là, en espérant que quelqu'un d'autre ait une entrée sur la façon de supprimer en bloc ZFS dans un sous-répertoire d'un pool. :-)Si cela doit être rapide, je génère un nouveau répertoire temporaire,
mv
le répertoire en dessous, puis supprime récursivement le temporaire:la source
rm
commande ne s'exécute pas pour une autre raison, le répertoire fantôme n'est pas supprimé.&
simplement en arrière-plan le processus, vous pouvez donc continuer à faire d'autres choses dans le même shell pendant la suppression (sous réserve des éventuelles pénalités de performances pertinentes).