我的目标是立即为文件分配大量空间,而不制作稀疏文件。从文件读取应该输出留在可用空间中的垃圾,而不是0。
truncate
和fallocate
都创建稀疏文件。
这可能吗?
没有这是不可能的。
出于明显的安全原因,内核将清除在删除,截断等操作时释放的扇区。因此,当您分配新文件时,它是自动全零。清除可能是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
在不写入零的情况下增大输出,等等。
当然,有充分的理由在磁盘上分配物理文件,即使该操作很慢: