如何在linux中的连续磁盘块中存储文件

时间:2012-04-09 10:34:50

标签: linux filesystems block store

我想在linux上的磁盘上存储一些数据。我希望这些数据存储在物理磁盘中的连续磁盘块中。如果为了将此数据写入普通文件,可能该文件占用的块在物理磁盘中不连续。有没有办法做这个工作?

4 个答案:

答案 0 :(得分:8)

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

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

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

/dev/sdxn

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

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

/dev/sdx

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

警告:不要输入错误并写入错误的文件系统(包含文件系统),否则会损坏它。最好制作符号链接ln -s / dev / sdxn / home / fred / mydata,然后始终写入mydata文件。

答案 1 :(得分:4)

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

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

内核文件系统代码非常好,内核文件系统缓存非常高效。

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

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

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

答案 2 :(得分:4)

您无法要求使用常规文件系统。

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

答案 3 :(得分:0)

尝试使用 rsync --preallocate:

import 'package:connectivity/connectivity.dart'; ... @override initState() { super.initState(); subscription = Connectivity().onConnectivityChanged.listen((ConnectivityResult result) { if (result == ConnectivityResult.none) { showDialog(...); } }); } // Be sure to cancel subscription after you are done @override dispose() { super.dispose(); subscription.cancel(); }

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

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

验证它是否连续复制:

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

“1 个范围找到”意味着它是连续的,超过一个意味着它是碎片化的。