【发布时间】:2023-03-09 14:42:02
【问题描述】:
我想在 linux 的磁盘上存储一些数据。我希望这些数据存储在物理磁盘中的连续磁盘块中。如果我为了将这些数据写入一个普通文件,那么文件占用的块在物理磁盘中可能是不连续的。有什么办法可以完成这项工作吗?
【问题讨论】:
-
为什么?你想达到什么目的?
标签: linux filesystems block store
我想在 linux 的磁盘上存储一些数据。我希望这些数据存储在物理磁盘中的连续磁盘块中。如果我为了将这些数据写入一个普通文件,那么文件占用的块在物理磁盘中可能是不连续的。有什么办法可以完成这项工作吗?
【问题讨论】:
标签: linux filesystems block store
磁盘分区是磁盘的连续区域。
因此,一种方法是调整磁盘分区的大小并使用 gparted (gnome) 或 partitionmanager (kde) 或类似方法创建一个新分区- 适合您的文件大小。
然后您可以使用该文件直接写入新分区(不使用和绕过文件系统):
/dev/sdxn
其中 sdxn = {sda1, sda2, ..., sdb1, ... ...} 等是分区的字母/编号。
或者,您可以通过使用文件直接写入(完全绕过分区表)来留出整个磁盘:
/dev/sdx
其中 sdx = {sda, sdb, sdc, ...} 等是磁盘的盘符。
警告:不要打错字并写入错误的(上面有文件系统),否则会损坏它。最好做一个符号链接 ln -s /dev/sdxn /home/fred/mydata,然后总是写入 mydata 文件。
【讨论】:
文件系统代码(在内核内部,例如在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 代替硬盘可能更容易)。
【讨论】:
*nix 文件系统。
您不能向常规文件系统询问。
如果出于某种原因,您真的想在磁盘上存储连续数据,则需要使用(免费)原始设备并自行管理其上的数据布局。这就是一些数据库正在做的事情。请注意,即使在这种情况下,也不能保证块是连续的。该设备可能由硬件或软件 RAID 层提供,或者是来自 ZFS 池的 zvol。
【讨论】:
尝试使用 rsync --preallocate:
rsync --preallocate /path/to/source/file /path/to/destination/
rsync 将预先分配一个连续的存储块并将文件复制到其中。
只需确保文件不在目标位置,否则 rsync 不会重新分配和重新复制它。如果是,请将其删除,清空垃圾箱以确保它真的消失了,然后运行此命令。
验证它是连续复制的:
filefrag /path/to/destination/file
“找到 1 个范围”表示它是连续的,超过一个表示它是零散的。
【讨论】: