【问题标题】:how to store a file in continuous disk block in linux如何在linux中将文件存储在连续磁盘块中
【发布时间】:2023-03-09 14:42:02
【问题描述】:

我想在 linux 的磁盘上存储一些数据。我希望这些数据存储在物理磁盘中的连续磁盘块中。如果我为了将这些数据写入一个普通文件,那么文件占用的块在物理磁盘中可能是不连续的。有什么办法可以完成这项工作吗?

【问题讨论】:

  • 为什么?你想达到什么目的?

标签: linux filesystems block store


【解决方案1】:

磁盘分区是磁盘的连续区域。

因此,一种方法是调整磁盘分区的大小并使用 gparted (gnome) 或 partitionmanager (kde) 或类似方法创建一个新分区- 适合您的文件大小。

然后您可以使用该文件直接写入新分区(不使用和绕过文件系统):

/dev/sdxn

其中 sdxn = {sda1, sda2, ..., sdb1, ... ...} 等是分区的字母/编号。

或者,您可以通过使用文件直接写入(完全绕过分区表)来留出整个磁盘:

/dev/sdx

其中 sdx = {sda, sdb, sdc, ...} 等是磁盘的盘符。

警告:不要打错字并写入错误的(上面有文件系统),否则会损坏它。最好做一个符号链接 ln -s /dev/sdxn /home/fred/mydata,然后总是写入 mydata 文件。

【讨论】:

    【解决方案2】:

    文件系统代码(在内核内部,例如在linux-3.1.6/fs/ext4/ 中用于 linux-3.1.6 内核源代码中的 ext4 文件系统)正在管理用于给定文件的磁盘块。所以你不能自己组织一些文件的磁盘块。但是,您可能会使用一些奇怪的系统调用给内核一些提示。

    如果你不喜欢这样,你可以通过直接写入 unmounted 分区来避免文件系统,例如通过对open(2)-ing 获得的文件描述符执行write(2) 系统调用,例如/dev/sda2;但除非您真的知道自己在做什么(而且您的问题的表述让我觉得您不了解文件系统的确切作用),否则我不建议您这样做。

    内核文件系统代码不错,内核文件系统缓存效率很高。

    如果您想加快读取速度,不妨考虑使用readahead(2)fadvise(2)madvise(2) 系统调用。

    您还可以在创建文件系统时针对您的特定目的对其进行调整。例如,如果您知道其中大部分文件都很大,您可以使用大于标准大小的块(例如mke2fs -b 8192)等...

    但不要认为软件技巧会显着加速您的应用程序;如果你做了很多磁盘 IO,真正的瓶颈是硬件(所以使用 SSD 代替硬盘可能更容易)。

    【讨论】:

    • 事实证明 EXT4 的最大范围大小为 128MiB,因此大于此大小的文件在 EXT4 上无法连续。您提到的这些提示 - 是否有任何此类“奇怪”的系统调用来提示内核写入?或者也许分配一个连续的零文件,然后可以写入。我在 FAT32 上使用 LiveCD ISO 文件(通常为 ~700MiB)looking to do this,最好也使用*nix 文件系统。
    【解决方案3】:

    您不能向常规文件系统询问。

    如果出于某种原因,您真的想在磁盘上存储连续数据,则需要使用(免费)原始设备并自行管理其上的数据布局。这就是一些数据库正在做的事情。请注意,即使在这种情况下,也不能保证块是连续的。该设备可能由硬件或软件 RAID 层提供,或者是来自 ZFS 池的 zvol。

    【讨论】:

      【解决方案4】:

      尝试使用 rsync --preallocate:

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

      rsync 将预先分配一个连续的存储块并将文件复制到其中。

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

      验证它是连续复制的:

      filefrag /path/to/destination/file

      “找到 1 个范围”表示它是连续的,超过一个表示它是零散的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-10
        • 2012-01-20
        • 1970-01-01
        • 2011-10-04
        • 2012-05-13
        • 2015-10-23
        • 2011-12-25
        • 1970-01-01
        相关资源
        最近更新 更多