I'm running an email server with OpenSMTPD and Dovecot on Linux and accessing emails using IMAP with a Thunderbird client. When I delete an email in Thunderbird, why doesn't disk space usage go down?
As an example, one user's mbox files are stored in /var/vmail/${domain}/$[user}/:
$ ls
Archives Drafts inbox Sent Spam TrainSpam Trash
I'm not sure if mbox files are sparse files, so instead of du
(which also shows the issue), I expect ls
will have the most accurate "effective" file sizes, so I added up all sizes of all files in this directory:
$ ls -al | grep vmail | awk '{print $5}' | paste -sd+ | bc
1119217444
Next, I go to Thunderbird, and delete a large email with attachment which shows a size of 1MB. Thunderbird sends it to the Deleted folder, then I go to the Deleted folder, delete it there, confirm the permanent deletion dialog and re-count the file sizes:
$ ls -al | grep vmail | awk '{print $5}' | paste -sd+ | bc
1119217443
So it went down 1 byte. Perhaps it's just marking it deleted? How to I actually get back the disk space? I understand this may be non-trivial since an mbox file is just a huge, flat file.
В формате MBOX сообщения хранятся в одном огромном файле одно под другим , с очень простой структурой:
From envelope-sender@example.com Sat Nov 10 06:00:00 2018
From: Author <author@example.com>
To: Recipient <recipient@example.com>
Subject: Sample message 1
Message body.
>From is escaped. Otherwise it would break the MBOX file.
From envelope-sender@example.net Sat Nov 10 06:30:00 2018
From: Author <author@example.net>
To: Recipient <recipient@example.com>
Subject: Sample message 2
Another message body.
Следовательно,удаление сообщения из середины файла приведет к перезаписи остальной части файла, что может отрицательно сказаться как на производительности, так и на целостности данных, поскольку файл может быть поврежден, если запись будет прервана.
Одно из решений состоит в том, чтобы пометить сообщение как удаленное, а не удалять его на самом деле, так как для этого требуется изменить только одну строку, оставив остальную часть файла нетронутой. Это позволяет позже объединить несколько удалений в одну операцию.
В статье MozillaZine Сжатие папок это объясняется с точки зрения Thunderbird:
Когда вы удаляете сообщения в почтовом клиенте, таком как Thunderbird, они не удаляются физически. Даже очистка корзины не избавляет от их. Вместо этого они отмечены для удаления и скрыты от просмотра. Oни физически не удаляются, пока вы не «сжали» папку. Это компромисс для повышения производительности в больших папках.
В статье Dovecot Формат почтового ящика Mbox объясняется, как Dovecot решает проблемы с форматом MBOX. Удаление сохраняется в заголовке X-Status: D
, добавленном к заголовкам сообщений.
Dovecot использует заголовки, совместимые с C-Client (например, UW-IMAP, Pine) в mbox сообщения для хранения метаданных. Это заголовки:
X-IMAPbase:
Содержит UIDVALIDITY, последний использованный UID и список использованных ключевых словX-IMAP:
То же, что X-IMAPbase, но также указывает, что сообщение является «псевдо message "X-UID:
Назначенный UID сообщенияСтатус:
R
(\ Seen) иO
(не \ Recent) флагиX -Статус:
A
(\ Ответил),F
(\ Flagged),T
(\ Draft) иD
(\ Deleted) flagsX-Keywords:
Ключевые слова сообщенияContent-Length:
Длина тела сообщения в байтахВсякий раз, когда существует какой-либо из этих заголовков, Dovecot рассматривает их как свои собственные личные метаданные. Он проверяет их работоспособность, поэтому заголовки могут также могут быть изменены или удалены полностью. Ни один из этих заголовков не отправляется клиентам IMAP / POP3, когда они читают почту.