Linux文件系统(ext4)中一组文件的连续物理分配

Linux文件系统(ext4)中一组文件的连续物理分配

我有一组文件,希望它们在文件系统中连续分配。我将在一次读取中依次访问所有这些文件,并且我想优化读取它们。我无法将它们合并为一个文件,我正在寻找一种允许它们成为单独文件的解决方案。

我正在使用 ext4 文件系统,我想知道是否有一些现有的工具可以为我做到这一点,因为我了解到 ext4 支持在线块交换和碎片整理。我尝试e4defrag在我的文件目录中使用,虽然它确保每个单独的文件都经过碎片整理,但每个文件本身都在一个单独的块中,不一定与其他文件相邻。(我曾经filefrag -v file_name验证它们是否被分配在一起)

编辑:只是为了澄清文件访问模式,这些文件将被写入一次,并且永远不会再次修改。它们将被频繁读取,但读取方式是,如果读取其中任何一个文件,则集合中的所有其他文件也可能需要读取。我打算一次性将所有这些文件一起预取到文件系统缓冲区/缓存中,以便随后对任何这些文件的随机读取都非常快。(总文件大小足够小,100~200MB,可以放入缓存中)。我现在试图改进的是尝试将这些文件加载​​到缓存中的读取性能。现在,尝试将它们预取到缓存中时,读取性能会受到影响,因为它们位于不相交的段中,因此存在多个磁盘寻道。

答案1

这并不是重新组织文件系统块的正确方法,但是……

您希望将文件保存在 RAM 中,并且您在评论中说您已经尝试过 ramdisk。我们可以改进这种方法。

我的想法是,不直接从文件系统读取文件,ext4而是从.tar文件读取文件。你可以创建此文件一次,将其放在ext4文件系统上,然后碎片整理然后e4defrag在每次启动时

cd /mnt/target_tmpfs/ &&  tar -xf /mnt/ext4/defragmented_archive.tar

我认为它不会tar在给定的文件中四处查找,来回搜索。但如果你确实这么认为,那么你总是可以使用cat … | tar -x。在这种情况下,tar只能以连续的方式读取其输入,并且最多读取一次。

我知道你无法通过这种方式轻松加载整个操作系统,除非你准备initramfs这样做。我对此了解不多,但我发现了这一点:自定义 Initramfs. 来自其中:

以下是一些你可以使用的示例initramfs

  • 挂载根分区(用于加密、逻辑和其他特殊分区);
  • […]

那里有示例脚本ext4然后挂载tmpfs并从中填充它.tar,然后使用它作为/——总的来说这一切似乎都是可能的。

显然,您希望对您的文件custom-initramfs.cpio.gz进行碎片整理.tar

答案2

rsync 可以连续写入文件:

rsync --preallocate /path/to/source/file /path/to/destination/

rysnc 预先分配一个连续的存储块并将文件复制到其中。也适用于 FAT。

只需确保该文件在目标位置不存在,否则 rsync 将不会重新分配并重新复制它。如果存在,请删除它,清空垃圾以确保它确实消失了,然后运行此命令。

验证其是否连续复制:

filefrag /path/to/destination/file

“找到 1 个区”表示文件是连续的。如果找到多个区,则表示文件有碎片。

执行您需要的操作可能需要更多的脚本,但使用此命令应该可以完成。

相关内容