制作一致的maildir副本

假设我使用Dovecot,并且它是maildir格式来保存和访问服务器上的邮件。 如何在复制maildir时避免竞争条件?


我读了一些关于备份和使用maildir的教程,但没有看到有人写这个。 他们只是使用cprsync将目录复制到另一个地方。 maildir不可能通过复制成为不一致的状态,还是需要某种locking?

编辑:我想做定期备份,但我不认为它真的是metters的问题。 我知道我可以停止邮件服务器(Dovecot和Postfix),但我认为应该可以不这样做。 据我所知,maildir支持不同应用程序的并发访问。

我刚刚阅读了Dovecot的 Maildir文档以及Maildir和Maildir ++的其他一些文档。 我希望我没有错过任何重要的事情。


Maildir被devise成无锁的工作。 现代文件系统中最需要的操作是primefaces操作。 这意味着你不必关心不一致的阅读等竞争条件。 但是,如果您想在邮件服务器运行时备份Maildir,还是有一些问题。

问题

  • 备份和恢复tmp/是无用的。 每个Maildir包含目录new/cur/tmp/ 。 目录tmp/包含正在写入磁盘的邮件。 当它们写入成功时,它们被移动到new/ 。 这意味着tmp/中的文件可能还不完整。 即使文件已完成,恢复备份后,写入文件的进程也不再运行。 这意味着如果这样的文件被恢复,它永远不会被添加到邮箱,它可能永远不会被删除。

  • 从备份中排除dovecot-uidlist.lock可能是明智的。 Dovecot使用称为Maildir ++的Maildir的扩展。 这个扩展需要locking。 获取锁读取扩展不需要,但从备份中排除locking文件可能是明智的。

  • 获取dovecot-uidlist.lock或使用文件系统的快照。 基本上,你可以复制目录,但可能会错过一些邮件的竞争条件。 原因是列表和复制目录的内容(recursion)不是primefaces的。 这意味着,当用户更改标签(例如看到/看不见)或移动邮件时,创build备份时可能会错过电子邮件。 为了处理这种情况,Dovecot为每个动作获取locking文件(与上面相同)。 如果您正在使用Dovecot,则可以在创build备份之前通过获取锁来解决问题。 这可以用/usr/lib/dovecot/maildirlock 。 另一种可能性是使用文件系统的快照。 由于创build快照是primefaces化的,所以在快照上不会发生这个问题。

作为一个简单的总结:如果你想在Dovecot运行的时候做一个备份,你应该先获得锁文件dovecot-uidlist.lock或者为你的文件系统创build一个快照。 然后,你可以复制Maildir。 从备份中排除tmp/dovecot-uidlist.lock可能是明智的。