我想在linux的磁盘上存储一些数据。 我想把这些数据存储在物理磁盘的连续磁盘块中。 如果我把这个数据写入一个普通的文件,也许这个文件占用的块在物理磁盘上是不连续的。 有没有办法做这个工作?
磁盘分区是磁盘的连续区域。
因此,一种方法是调整磁盘分区的大小,并使用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文件系统中)管理用于给定文件的磁盘块。 所以你不能自己组织你的一些文件的磁盘块。 然而,你可能会使用一些奇怪的系统调用给内核一些提示。
如果你不喜欢,你可以通过直接写入一个未挂载的分区来避免所有的文件系统,例如,通过写(2)系统调用来获得文件描述符(例如/dev/sda2
。 但除非你真的知道自己在做什么(并且提出你的问题让我觉得你不明白文件系统的确切角色),我不会推荐这么做。
内核文件系统代码相当不错,内核文件系统缓存非常高效。
如果你想加快你的阅读速度,可以考虑使用readahead(2) , fadvise(2)或madvise(2)系统调用。
您也可以在创建文件系统时针对您的特定目的调整它。 例如,如果你知道你的文件大部分是相当大的,你可以使用比标准块大的文件(比如mke2fs -b 8192
)等等。
但是不要认为软件技巧会加速你的应用程序; 如果你做了很多的磁盘IO,真正的瓶颈是硬件(所以使用SSD而不是硬盘可能会更容易)。
你不能要求一个普通的文件系统。
如果由于某种原因,您确实想要将连续的数据存储在磁盘上,则需要使用(免费)原始设备,并自行管理其上的数据布局。 这是一些数据库正在做的事情。 请注意,即使在这种情况下,块也不能保证是连续的。 该设备可能由硬件或软件RAID层提供,也可能是来自ZFS池的zvol。