【问题标题】:How to "defragment" a directory on ext3?如何对 ext3 上的目录进行“碎片整理”?
【发布时间】:2010-11-29 10:51:18
【问题描述】:

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

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

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

【问题讨论】:

标签: filesystems directory ext3


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    不过,我还没有尝试过这两种解决方案。

    【讨论】:

      【解决方案3】:

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

      5MB 的空间并不大,因此忽略它可能是最简单的。如果这个问题(目录中的文件堆积)经常发生,那么只要目录再次填满,就会重新使用该空间。

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

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

      [编辑添加:事实证明这不起作用。正如 Bada 在 cmets 中指出的那样,您不能以我建议的方式原子地更改符号链接。这让我有了我原来的观点。我熟悉的文件系统不提供回收目录块内可用空间的机制。]

      【讨论】:

      • 如何更改符号链接?如果目标已经存在,则在目标内部创建指向自身的符号链接,尝试“mkdir haha​​ hehe && ln -vs haha​​ hoi && ln -vs hehe hoi”。并且根据 symlink(2),如果目标已经存在,它会返回 EEXIST。我还没有看到它是原子的。
      • @bada:你是对的。我记错了符号链接的创建方式。所以我的黑客既丑陋又错误!对于那个很抱歉。恐怕这会让我对如何解决您的问题没有任何建议......
      • 其实重命名是原子的。因此,创建一个新链接,然后使用操作系统调用重命名 (python os.rename) 或命令“mv -f -T newlink oldlink”将其移动到位。 -T 告诉不要放入目录,而是替换链接。
      猜你喜欢
      • 2018-01-03
      • 2012-05-13
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 2021-04-29
      • 2021-01-07
      相关资源
      最近更新 更多