Filesystems 如何";“碎片整理”;ext3上的目录?

Filesystems 如何";“碎片整理”;ext3上的目录?,filesystems,directory,ext3,Filesystems,Directory,Ext3,我正在运行一个守护进程,它分析目录中的文件,然后删除它们。如果守护进程由于任何原因没有运行,文件就会堆积在那里。今天我在那个目录中有90k个文件。再次启动守护进程后,它将处理所有文件 然而,目录仍然很大;“ls-dh.”返回5.6M的大小。如何“整理”该目录?我已经发现,重命名该目录,并创建一个具有相同名称和权限的新目录可以解决问题。但是,随着文件随时写入其中,似乎没有一种安全的方法来重命名目录并创建一个新目录,因为目标目录暂时不存在 那么a)是否有一种方法/a(shell)程序可以对ext3文

我正在运行一个守护进程,它分析目录中的文件,然后删除它们。如果守护进程由于任何原因没有运行,文件就会堆积在那里。今天我在那个目录中有90k个文件。再次启动守护进程后,它将处理所有文件

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


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

我不知道有什么方法可以从目录中回收可用空间

5MB空间不大,所以忽略它可能是最容易的。如果此问题(目录中的文件堆积)经常发生,则该空间将在目录再次填满时重新使用

如果你迫切需要缩小目录的能力,这里有一个(丑陋的)黑客可能会奏效

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

[编辑为添加:结果证明这不起作用。正如Bada在评论中指出的那样,您不能以我建议的方式自动更改符号链接。这让我保留了我的原始观点。我熟悉的文件系统没有提供回收目录块内可用空间的机制。]

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


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

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

  • 根据,使用Btrfs显然可以对目录的元数据进行碎片整理:
    Btrfs filesystem defragment/
    将对根文件夹的元数据进行碎片整理。这使用了Btrfs的联机碎片整理支持

  • 虽然Ext4确实支持在线碎片整理(使用
    e4defrag
    ),但这似乎不适用于目录元数据(根据)


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

如何更改符号链接?如果目标已经存在,则符号链接将在指向自身的目标内部创建,请尝试“mkdir-haha-hehe&&ln-vs-haha-hoi&&ln-vs-hehe-hoi”。根据符号链接(2),如果目标已经存在,它将返回EEXIST。我还没有看到它是原子的。@bada:你是对的。我错误地记住了符号链接是如何创建的。所以我的黑客行为既丑陋又错误!对此表示抱歉。我恐怕没有任何关于如何解决你的问题的建议…实际上,重命名是原子的。所以创建一个新的链接,一个然后使用OS调用重命名(python OS.rename)或命令“mv-f-T newlink oldlink”.-T告诉不要放入目录,而是替换链接。顺便说一句。显然,您可以使用“filefrag”命令检查目录是否分段。另请参见和