代码之家  ›  专栏  ›  技术社区  ›  Daffy

在linux中分配文件时不必归零,也不创建稀疏文件

  •  0
  • Daffy  · 技术社区  · 6 年前

    我的目标是立即为一个文件分配大量空间,而不创建稀疏文件。从文件中读取应该输出剩余的空闲空间垃圾,而不是0。

    两者 truncate fallocate 创建稀疏文件。

    这可能吗?

    0 回复  |  直到 6 年前
        1
  •  0
  •   Alexis Wilke    5 年前

    我们能避开零吗?

    不,不可能。

    出于明显的安全原因,内核将清除在删除、截断等操作时释放的扇区。因此,当分配新文件时,它是 全是零。清算可能是 事实上的 shred(1)

    稀疏文件

    根据经验,当你在文件中写零的时候 身体上 将零写入磁盘。它根本不会创建稀疏文件。

    在软件中,创建稀疏文件需要使用 truncate() / ftruncate() lseek() 在下一个文件之前超过文件结尾 write() . 但是,如果你 在所有的0中,操作系统不会试图转换稀疏文件中的那些。

    换句话说,你可以在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 参数。否则,使用循环将更有效,也不太可能炸毁您的内存。

    head -c${SIZE} /dev/zero >"${OUTPUT}"
    

    注意,一些专用工具支持稀疏文件。例如:

    • cp 可用于复制稀疏文件。
    • dd 将在输入文件中正确地查找零 截断() 在不写入零的情况下增大输出。

    • 您正在创建一个数据库文件;在这种情况下使用稀疏文件会非常危险(即写入可能会失败 在错误的时间 )分配新的inode是 因此,您的数据库吞吐量可能会受到影响(尽管这种情况只发生在写入和增长数据库文件时,这类似于在必要时为文件分配inode)。
    • 你正在创建一个虚拟磁盘;我用稀疏文件测试了那些磁盘,结果太糟糕了;至少在我用HDD的旧计算机上,运行VPS的速度太慢了
    • 您正在创建交换文件;使用稀疏文件进行交换确实不是一个好主意(这就像故意找麻烦一样!)!在分配新块的缓慢性、文件可能会被碎片化、磁盘在需要交换空间时已满的可能性之间…)