我有大量的小日志文件本质上只写,除非我出于某种原因必须查看它们。目前,它们会累积在日志文件夹中按天分类的子目录中(例如,2018-12-29
昨天的、2018-12-30
今天的等等),然后我最终将tar
它们bzip2
整理成每天的单个文件。
这对我来说不太方便,我在想,如果我可以为每一天创建一个压缩文件系统,我就可以直接写入这些文件系统,使用更少的磁盘空间,而不必“返回”并将每个目录压缩为 tarball。这也使得以后检查单个文件更加容易,因为我可以挂载文件系统并使用它——使用 grep、find、less 等,而不是尝试tar
通过某些命令管道传输数据。
我知道我可以创建一个任意大小的环回设备,但我必须提前知道这个大小,如果我猜“太高”,我最终会浪费未使用的磁盘空间,如果我选择“太低”,我将耗尽磁盘空间,我的软件将失败(或至少会发出很大的抱怨)。
我知道我可以创造稀疏文件,但我不太清楚它将如何与 ext 等文件系统交互否fs 或 Linux 上可用的其他文件系统;由于备份超级块和类似的东西,它最终可能会扩展到比必要的大得多。
有没有办法创建一个可以占用磁盘上最少物理空间的循环设备?
答案1
您可以基于纯文件创建一个 gzip 压缩的 ZFS 池,并将日志存储在其中。除了将日志写入其中之外,无需执行任何其他操作。
从一开始,它们在 ZFS 文件系统中就只使用压缩后的大小。之后您可以读取数据(grep、find、less 等),甚至可以修改、删除它们,即使这不是您的要求。
如果池已满,您可以扩大后端文件(将自动扩展属性设置为开启)或添加新的后端文件,文件系统容量也会相应增加。
答案2
你应该调查使用logrotate(8)帮助管理日志文件。可以将其配置为将文件重命名为特定日期格式并自动压缩。您还可以将其配置为保留指定数量的日志(以及许多其他内容)。一旦您按照自己的意愿设置好它,您基本上就可以忘掉它了。
另外,看看 gzip/bzip2 附带的工具,例如 zgrep、zless、bzgrep、bzless 等。它们允许您处理档案而无需创建管道。
答案3
我知道logrotate
这里已经有人为你提出了建议,但如果你仍然想继续使用压缩文件系统的想法,为什么不只创建那些呢?后一天就结束了?然后,您的 shell 脚本将计算日志文件夹的大小,创建所需大小的环回设备文件,安装环回映像,将日志文件移至那里,最后卸载环回映像。
如果某个愚蠢的应用程序无法/不允许你做任何事情,它每天在某个目录下创建数百万个日志文件,而你仍然需要将这些文件保留在磁盘上半年左右,我能感受到这种痛苦。在这种情况下,回送映像可能是一个好主意,因为某个分区上的活跃小文件数量将大幅下降。