我想在linux上的磁盘上存储一些数据。我希望这些数据存储在物理磁盘中的连续磁盘块中。如果为了将此数据写入普通文件,可能该文件占用的块在物理磁盘中不连续。有没有办法做这个工作?
答案 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 个范围找到”意味着它是连续的,超过一个意味着它是碎片化的。