如何在ext3上对目录进行“碎片整理”?

时间:2010-11-29 10:51:18

标签: filesystems directory ext3

我正在运行一个守护程序来分析目录中的文件,然后删除它们。如果守护程序由于某种原因未运行,则文件会堆叠在那里。今天我在该目录中有90k文件。再次启动守护程序后,它处理了所有文件。

但是,目录仍然很大; “ls -dh。”返回5.6M的大小。我怎样才能“整理”该目录?我已经发现重命名该目录,并创建一个具有相同名称和权限的新目录解决了这个问题。但是,随着文件随时写入文件,似乎没有一种安全的方法来重命名目录并创建一个新目录,目标目录不存在。

那么a)是否有一种方法/一个(shell)程序可以对ext3文件系统上的目录进行碎片整理?或者b)有没有办法在目录上创建一个锁,以便尝试写文件阻塞,直到重命名/创建完成?

3 个答案:

答案 0 :(得分:1)

“优化文件系统中的目录。此选项使e2fsck尝试优化所有目录,如果文件系统支持目录索引,则通过重新索引它们,或者使用传统线性目录对文件系统进行排序和压缩。” - fsck.ext3 -D

当然,这不应该在挂载的文件系统上完成。

答案 1 :(得分:1)

不适用于Ext3,但可能对其他文件系统的用户有用:

但我没有尝试过这两种解决方案。

答案 2 :(得分:0)

我不知道从目录中回收可用空间的方法。

5MB的空间不是很大,所以忽略它可能是最容易的。如果这个问题(文件堆叠在目录中)定期发生,那么只要目录再次填满,该空间就会被重用。

如果您迫切需要缩小目录的能力,这可能会起作用(丑陋)黑客攻击。

将目录替换为指向空目录的符号链接。如果再次出现此问题,则可以创建新的空目录,然后将符号链接更改为指向新目录。更改符号链接应该是原子的,因此您不会丢失任何传入的文件。然后,您可以安全地清空并删除旧目录。

[编辑补充:事实证明这不起作用。正如Bada在评论中指出的那样,你不能以我建议的方式原子地改变符号链接。这让我得到了原点。我熟悉的文件系统不提供回收目录块中可用空间的机制。]