2010-11-29 31 views
4

Je cours un démon qui analyse les fichiers dans un répertoire puis les supprime. Dans le cas où le démon ne fonctionne pas pour une raison quelconque, les fichiers sont empilés là-bas. Aujourd'hui, j'avais 90k fichiers dans ce répertoire. Après avoir redémarré le démon, il a traité tous les fichiers.Comment "défragmenter" un répertoire sur ext3?

Cependant, le répertoire reste grand; "ls -dh." renvoie une taille de 5,6M. Comment puis-je "défragmenter" ce répertoire? J'ai déjà compris que renommer ce répertoire, et en créer un nouveau avec le même nom et les mêmes permissions résout le problème. Cependant, comme les fichiers y sont écrits à tout moment, il ne semble pas y avoir de moyen sûr de renommer le répertoire et d'en créer un nouveau car, pour un instant, le répertoire cible n'existe pas. Donc a) existe-t-il un programme way/a (shell) qui peut défragmenter les répertoires sur un système de fichiers ext3? ou b) existe-t-il un moyen de créer un verrou sur un répertoire afin que l'écriture de fichiers se bloque tant que le renommage/création n'est pas terminé?

+0

Btw.apparemment, vous pouvez utiliser la commande "filefrag" pour vérifier si un répertoire est fragmenté. – oliver

+0

Voir également http://serverfault.com/questions/264124/shrink-reset-directory-size et http://unix.stackexchange.com/questions/38639/how-to-compact-a-directory – oliver

Répondre

0

Je ne suis pas au courant d'un moyen de récupérer de l'espace libre à partir d'un répertoire.

5Mo n'est pas beaucoup d'espace, il peut donc être plus facile de simplement l'ignorer. Si ce problème (empilement de fichiers dans le répertoire) se produit régulièrement, cet espace sera réutilisé chaque fois que le répertoire se remplira à nouveau.

Si vous avez désespérément besoin de pouvoir réduire le répertoire, voici un bidouillage (moche) qui pourrait fonctionner.

Remplacez le répertoire par un lien symbolique vers un répertoire vide. Si ce problème se reproduit, vous pouvez créer un nouveau répertoire vide, puis modifiez le lien symbolique pour pointer vers le nouveau répertoire. Changer le lien symbolique devrait être atomique, ainsi vous ne perdrez aucun fichier entrant. Vous pouvez ensuite vider et supprimer l'ancien répertoire en toute sécurité.

[Modifié pour ajouter: Il s'avère que cela ne fonctionne pas. Comme Bada le fait remarquer dans les commentaires, vous ne pouvez pas modifier de façon atomique un lien symbolique comme je l'ai suggéré. Cela me laisse avec mon point original. Les systèmes de fichiers que je connais ne permettent pas de récupérer de l'espace libre dans les blocs de répertoires.]

+1

Comment le lien symbolique être changé? Si la cible existe déjà, le lien symbolique est créé * à l'intérieur * de la cible pointant sur elle-même, essayez "mkdir haha ​​hehe && ln -vs haha ​​hoi && ln -vs hehe hoi". Et selon symlink (2), il renvoie EEXIST dans le cas où la cible existe déjà. Je ne le vois pas encore être atomique. – Bada

+0

@bada: Vous avez raison. J'ai mal noté la façon dont les liens symboliques sont créés. Donc, mon hack est à la fois moche et faux! Désolé pour ça. Je crains que cela me laisse sans aucune suggestion sur la façon de résoudre votre problème ... –

+1

En fait, renommer est atomique. Créez donc un nouveau lien, puis déplacez-le en place, soit en utilisant le renommage de l'appel OS (python os.rename) ou la commande "mv -f -T newlink oldlink". -T dit de ne pas mettre dans le répertoire, mais de remplacer le lien à la place. –

1

"Optimiser les répertoires dans le système de fichiers: cette option permet à e2fsck d'optimiser tous les répertoires, soit en les réindexant si le système de fichiers prend en charge l'indexation de répertoire, ou en triant et en compressant des répertoires pour des répertoires plus petits, ou pour des systèmes de fichiers utilisant des répertoires linéaires traditionnels. " - fsck.ext3 -D

Bien sûr, cela ne devrait pas être fait sur un système de fichiers monté.

1

Pas vraiment applicable pour Ext3, mais peut-être utile pour les utilisateurs d'autres systèmes de fichiers:

Cependant, je n'ai pas essayé l'une ou l'autre de ces solutions.