我的目标是立即为文件分配大量空间,而不会生成稀疏文件。从文件中读取应该输出剩余空间中的垃圾,而不是 0。
两者都truncate
制作fallocate
稀疏文件。
这可能吗?
我的目标是立即为文件分配大量空间,而不会生成稀疏文件。从文件中读取应该输出剩余空间中的垃圾,而不是 0。
两者都truncate
制作fallocate
稀疏文件。
这可能吗?
不,这是不可能的。
出于明显的安全原因,内核将清除在删除、截断等时释放的扇区。因此,当您分配新文件时,它会自动全为零。该清除可能是虚拟的(与在磁盘上物理写入零相反,特别是因为它不适用于 SSD - 详情请参阅shred(1)
)。
如果您想要非常快速的分配,唯一的方法是创建自己的分区并自己管理它。如果您目前依赖 ext4 或其他类似文件系统的许多功能,这不是一件容易的事。
由于扇区应该已经设置为零,因此在磁盘上分配新(大)文件时不应该对速度产生任何影响。
根据经验,当您将零写入文件时,它会将零物理写入磁盘。它根本不会创建稀疏文件。
在软件中,创建稀疏文件需要您使用truncate()
/ftruncate()
函数来放大文件并lseek()
在下一个write()
. 但是,如果您执行write()
全零操作,则操作系统不会尝试将它们转换为稀疏文件。
换句话说,你可以用 C++ 写这样的东西,你不会得到一个稀疏文件:
int fd = open(filename, O_CREAT | O_WRONLY, 0600);
std::vector<uint8_t> buffer(size);
write(fd, buffer.data(), buffer.size());
close(fd);
此代码示例假定一个相对较小的size
参数。否则使用循环会更有效率,而且不太可能破坏你的记忆。
在您的控制台中,这意味着使用将每个字节写入目标文件的工具。对于非常大的文件(即写入 1Tb ......你知道......)它会很慢这是一个这样的工作方式:
head -c${SIZE} /dev/zero >"${OUTPUT}"
请注意,某些工具有意支持稀疏文件。例如:
cp
可用于复制稀疏文件。dd
将完成在输入文件中查找零的工作,并在truncate()
不写入零的情况下适当地增加输出。在磁盘上分配物理文件当然有很好的理由,即使该操作很慢: