分配文件而不清零,并且在Linux中不创建稀疏文件

问题描述 投票:0回答:1

我的目标是立即为文件分配大量空间,而不制作稀疏文件。从文件读取应该输出留在可用空间中的垃圾,而不是0。

truncatefallocate都创建稀疏文件。

这可能吗?

linux filesize sparse-file fallocate
1个回答
0
投票

我们可以避免零点吗?

没有这是不可能的。

出于明显的安全原因,内核将清除在删除,截断等操作时释放的扇区。因此,当您分配新文件时,它是自动全零。清除可能是virtual(与在磁盘上物理写入零相对,特别是因为它在SSD上不起作用-有关详细信息,请参见shred(1)。)>

如果想要真正快速的分配,唯一的方法是创建自己的分区并自己进行管理。如果您当前依靠ext4或许多其他类似文件系统的许多功能,这并不是一件容易的事。

由于扇区应该已经设置为零,所以在磁盘上分配新的(大)文件时,对速度不会有任何影响。

稀疏文件

根据经验,当您将零写入文件时,它物理上将零写入磁盘。它根本不会创建稀疏文件。

在软件中,创建稀疏文件需要您使用shred(1) / truncate()函数来放大文件,并在下一个ftruncate()之前使用lseek()超出文件末尾。但是,如果您将全零设为write(),则OS不会尝试将其转换为稀疏文件。

换句话说,您可以在C ++中编写类似的内容,而不会得到稀疏文件:

write()

此代码示例假定一个较小的int fd = open(filename, O_CREAT | O_WRONLY, 0600); std::vector<uint8_t> buffer(size); write(fd, buffer.data(), buffer.size()); close(fd); 参数。否则,使用循环会更有效率。

在您的控制台中,这使用一种工具进行转换,该工具会将每个字节写入目标文件。对于非常大的文件(例如,写入1Tb ...您知道...),它的运行速度会很慢。这是一种工作方式:

size

请注意,某些专用工具支持稀疏文件。例如,head -c${size} /dev/zero >"${OUTPUT}" 可用于复制稀疏文件。 cp将完成在输入文件中查找零的工作,并适当地dd在不写入零的情况下增大输出,等等。

当然,有充分的理由在磁盘上分配物理文件,即使该操作很慢:

  • 您正在创建数据库文件;在这种情况下使用稀疏文件确实很危险(例如,写入可能在错误的时间]失败],并且分配新的inode是slow,因此您的数据库吞吐量可能会受到影响(尽管这种情况只会发生在写入和扩展数据库文件类似于在必要时向文件分配索引节点。]
  • 您正在创建虚拟磁盘;我用稀疏文件测试了这些文件,这太可怕了。至少在装有HDD的旧计算机上,运行VPS时速度太慢了
  • 您正在创建交换文件;使用稀疏文件进行交换确实不是一个好主意(这就像故意寻找麻烦!在分配新块的速度缓慢,文件可能会碎片化的事实,磁盘被损坏的可能性之间)。在您需要交换空间时已满...)
© www.soinside.com 2019 - 2024. All rights reserved.