我想在linux的磁盘上存储一些数据。我希望这些数据存储在物理磁盘的连续磁盘块中。如果我为了将这些数据写入一个普通文件,可能文件占用的块在物理磁盘中是不连续的。有什么办法可以完成这项工作吗?
4 回答
磁盘分区是磁盘的连续区域。
所以做你想做的事情的一种方法是调整磁盘分区的大小,并使用gparted (gnome) 或partitionmanager (kde) 或类似文件创建一个新的分区 - 大小适合你的文件。
然后,您可以使用以下文件直接写入新分区(不使用和绕过文件系统):
/dev/sdxn
其中 sdxn = {sda1, sda2, ..., sdb1, ... ...} 等是分区的字母/编号。
或者,您可以通过使用文件直接写入(完全绕过分区表)来留出整个磁盘:
/dev/sdx
其中 sdx = {sda, sdb, sdc, ...} 等是磁盘的字母。
警告:不要打错字并写错一个(上面有文件系统),否则你会损坏它。最好做一个符号链接 ln -s /dev/sdxn /home/fred/mydata,然后总是写入 mydata 文件。
您不能向常规文件系统询问。
如果出于某种原因,您真的想在磁盘上存储连续数据,则需要使用(免费)原始设备并自行管理其上的数据布局。这就是一些数据库正在做的事情。请注意,即使在这种情况下,也不能保证块是连续的。该设备可能由硬件或软件 RAID 层提供,或者是来自 ZFS 池的 zvol。
文件系统代码(在内核中,例如在linux-3.1.6/fs/ext4/
linux-3.1.6 内核源代码中的 ext4 文件系统中)正在管理用于给定文件的磁盘块。所以你不能自己组织一些文件的磁盘块。但是,您可能会使用一些奇怪的系统调用给内核一些提示。
如果您不喜欢这样,您可以通过直接写入未挂载的分区来避免文件系统,例如通过对open(2)获得的文件描述符执行write(2)系统调用 -例如;但是除非您真的知道自己在做什么(并且您的问题的表述让我觉得您不了解文件系统的确切作用),否则我不建议您这样做。/dev/sda2
内核文件系统代码相当不错,内核文件系统缓存效率很高。
如果您想加快读取速度,可以考虑使用readahead(2)或fadvise(2)或madvise(2)系统调用。
您还可以在创建文件系统时针对您的特定目的对其进行调整。例如,如果您知道其中大部分文件很大,则可以使用大于标准块大小(例如mke2fs -b 8192
)等...
但是不要认为软件技巧会显着加速您的应用程序;如果你做了很多磁盘 IO,真正的瓶颈是硬件(所以使用 SSD 代替硬盘可能更容易)。
尝试使用 rsync --preallocate:
rsync --preallocate /path/to/source/file /path/to/destination/
rsync 将预先分配一个连续的存储块并将文件复制到其中。
只需确保文件不在目标位置,否则 rsync 不会重新分配和重新复制它。如果是,请将其删除,清空垃圾箱以确保它真的消失了,然后运行此命令。
验证它是否连续复制:
filefrag /path/to/destination/file
“找到 1 个范围”意味着它是连续的,一个以上意味着它是零散的。