FreeBSD ftruncate()+mmap()大漏洞警告



FreeBSD13.1手动页面mmap((有以下警告:

警告!使用ftruncate(2(扩展文件,从而创建一个大洞,然后通过修改共享的mmap((来填充这个洞,可能会导致严重的文件碎片。为了避免这种碎片化,在通过mmap((修改区域之前,应始终通过将零写入((新扩展的区域来预分配文件的后备存储。碎片问题对MAP_NOSYNC页面特别敏感,因为页面可能以完全随机的顺序刷新到磁盘。

问题:

  1. 这个大洞是什么;为什么CCD_ 1具有创建它的效果;以及为什么CCD_ 2是该问题的拟议解决方案
  2. 如何在ftruncate()之后和mmap()之前有效地零填充空穴?重复调用write()听起来像是需要更多的系统调用
  3. 其他操作系统上是否存在同样的问题?我在macOS或Linux上找不到这样的警告

您可以通过使用posix_fallocate预分配所需区域来避免此问题。

创建这个洞是因为文件可能是稀疏的,只占用实际使用区域所需的空间,所以当只使用ftruncate时,新区域的备份是虚拟的,在分配或写入之前,它不会保留在磁盘上。

它也适用于Linux,只是没有提到。您可以预期大多数文件系统实现都会做类似的事情;通常,他们会努力做到聪明,如果时间上一个写得很近,他们会对你的写进行碎片整理,但不能发挥神奇的作用。

最新更新