ext2 转储/恢复问题

ext2 转储/恢复问题

我正在运行一个带有 maildir 存储的邮件服务器。这意味着创建了很多文件,而我的 inode 已经用完了。据我所知,没有神奇的命令可以增加 ext# 文件系统上的 inode 数量(或者我错了?),所以我必须备份并恢复整个文件系统。但我该怎么做呢?我尝试创建另一个分区并执行以下操作:

dump -f - -0 /vservers/mail | restore rf - -u -v

虽然这似乎有效,但它花费的时间比我愿意等待的时间要长得多(在我停止该过程之前,它在 2 小时内成功创建了 500 个空目录;strace 显示 restore 调用了大量无用的 lseeks)。还有其他方法可以复制完整的文件系统(包括套接字、设备文件、所有者、权限、acls 等)吗?附加信息:源 fs 是 ext3,目标是 ext4,文件系统在 lvm 上,我想要移动的 fs 是 vserver 的根 fs。

答案1

以下是我复制文件系统的替代建议。请记住,我遇到过的最接近这个问题的方法是使用 find+xargs+rm 来清除一个充斥着无用垃圾的邮件目录,因此您应该在一小时左右后看到这样做的效果。

cd root_of_source ; find . -print0 | tar -c --null -T - -f - | tar -sxf - -C root_of_target

这个结构的功能是

  • 按原始顺序检索文件列表
    • 这就是为什么我使用 find 而不是 tar 的默认设置...我不知道 tar 的默认设置不好,我只知道 find 的好,
  • 将该列表传递给 tar null 终止(以便正确处理任何特殊字符)。
  • 获取 tar 格式的输出,并在目标目录中解压结果(不重新排序输入(-s))。

无论使用何种方法:

  • 如果这些数据在同一个物理磁盘上开始和结束,那么与正常操作相比,您的性能自然会下降很多(从源读取和写入目标之间需要进行大量搜索)。
  • 如果您有一些可用的 CPU,那么进行少量的压缩不会有什么坏处,而且可能会有所帮助,只需在 tar 命令之间添加“gzip -c -1”阶段,并在第二个 tar 中添加 -z。

答案2

您是否考虑过尝试使用 unionfs 将现有文件系统与新文件系统联合起来,并将写入操作转到新文件系统?

我自己从未使用过 UnionFS,但我听说它似乎可以让您上线并开始再次将数据写入磁盘,而无需通过将现有文件系统合并为只读文件系统,将新文件系统合并为可写文件系统来重新创建文件系统。可能会有性能下降或其他问题导致无法使用,但如果您只是在寻找想法并且在转储运行时有一些时间,您可能可以研究一组可行的命令。

答案3

除此以外dump | restore,您还可以使用tar | tar,或者只使用cp -axrsync将所有文件复制到新文件系统。根据我的经验,dump | restore这是最快的方法。

作为参考,在一台相当老旧且速度很慢的机器上,我花了 35 分钟来复制一个 fs,dump | restore其中 fs 有 420,774 个 inode,使用了 7.8 GB 的空间。

相比之下,使用 需要 61 分钟tar | tar,使用 需要 64 分钟cp -ax

几个月前,我发布了一个补丁来加快dump速度,但那是在 0.4b44 发布之后,而且还没有其他版本。你可以在邮件列表。使用此补丁自行构建 0.4b44 可能会产生重大影响。对我来说,它将时间从 35 分钟缩短到仅 25 分钟。邮件列表上的反馈会很有帮助。

相关内容