Могу ли я создать файловую систему со сжатым циклическим устройством, которая может расширяться до размера данных?

У меня есть большое количество небольших файлов журнала, которые по существу предназначены только для записи, если только мне не нужно просматривать их по какой-либо причине. Прямо сейчас они накапливаются в подкаталогах, относящихся к конкретному дню, в папке журналов (например, 2018-12-29 для вчерашнего дня, 2018-12-30 на сегодня и т. д.) и я в итоге tar/bzip2затем их объединение в отдельные файлы в день.

Это не очень удобно для меня, и я подумал, что, если бы я мог создать сжатую файловую систему для каждого дня, я мог бы писать напрямую в эти файловые системы, использовать меньше дискового пространства и не должен был "возвращаться" и сжимать каждый каталог в tarball, Это также облегчает проверку отдельных файлов позже, потому что я могу смонтировать файловую систему и использовать ее, однако - используйте grep, find, less и т. Д. Вместо того, чтобы пытаться использовать tar для потоковой передачи данных через какой-либо командный конвейер.

Я знаю, что могу создать петлевое устройство произвольного размера, но мне нужно знать этот размер заранее, и если я угадаю "слишком много", я теряю место на диске с неиспользуемым пространством, и если я выберу "слишком мало", я буду не хватит места на диске, и мое программное обеспечение выйдет из строя (или, по крайней мере, очень громко жалуется).

Я знаю, что могу создать разреженный файл, но я не совсем уверен, как он будет взаимодействовать с файловой системой, такой как extN fs или другими файловыми системами, доступными в Linux; это может закончиться расширением намного больше, чем необходимо из-за резервных суперблоков и тому подобного.

Есть ли способ создать петлевое устройство, которое может занимать минимальное количество физического пространства на диске?

3 ответа

Вы можете создать сжатый GZIP пул ZFS на основе простых файлов и хранить в нем свои журналы. Там не будет необходимости делать что-либо еще, кроме записи логов там.

С самого начала они будут использовать только свой сжатый размер в файловых системах ZFS. Вы сможете читать данные впоследствии (grep, find, less и т. Д.) И даже изменять, удалять их, даже если это не является частью ваших требований.

Если пул заполнится, вы можете либо увеличить внутренний файл (со включенным свойством autoexpand), либо добавить новые внутренние файлы, и емкость файловых систем должна соответственно возрасти.

Вам следует изучить использование logrotate(8) для управления файлами журналов. Он может быть настроен на переименование ваших файлов в определенный формат даты и их автоматическое сжатие. Вы также можете настроить его, чтобы хранить указанное количество журналов (и многое другое). Как только вы настроите его так, как хотите, вы можете забыть об этом.

Также обратите внимание на инструменты, которые поставляются с gzip/bzip2, например, zgrep, zless, bzgrep, bzless и т. Д. Они позволяют работать с архивами без необходимости создавать каналы.

Я знаю logrotate было предложено для вас здесь, но если вы все еще хотели бы продолжить идею сжатой файловой системы, почему бы вам не создать их только после того, как день закончится? Затем ваш сценарий оболочки вычислит размер папки журнала, создаст файл петлевого устройства необходимого размера, смонтирует образ петли, переместит туда файлы журнала и, наконец, размонтирует образ петли.

Я чувствую боль, если какое-то глупое приложение, которое вы не можете / не можете ничего сделать, создает миллионы файлов журналов в день в каком-то каталоге, и вам все равно нужно хранить их на диске около полугода или около того. В этом случае неплохо было бы использовать изображение с обратной связью, поскольку активное количество небольших файлов на каком-либо разделе резко уменьшилось бы.

Другие вопросы по тегам