在Linux系统上快速创建大文件
1. 概述
在本教程中,我们将讨论如何在 Linux 系统上创建大文件 (> 100 MB)。在深入了解实际代码和命令之前,我们需要了解 Linux 文件的外观以及如何维护存储结构。
2. 索引节点
Linux 将信息作为文件存储在特定结构中的索引节点中,inodes 是索引节点的缩写。文件和 Inode 之间存在 1-1 的关系。为了适应不同的文件大小,每个 Inode 都有 12 个用于较小文件的指针和 3 个用于较大文件的其他指针。今天将重点介绍三个大文件指针。
2.1.间接表
**三指针中的第一个,第 13个指针,指向一个单间接表。**单个索引表具有指向其他存储集群的指针集群。在具有 4kb 集群的 64 位机器上,单个间接表可以达到 2MB 的最大大小。(4kb 簇大小 / 每个指针 8 字节 * 每个簇一个指针指向的 4kb)
**第 14个指针指向一个双间接表。**这个指针指向一个指针簇,这个簇中的每个指针都指向一个单间接表,给它两层指针。因此,在具有 4kb 集群的 64 位机器上,双间接表最多可容纳 1GB。(4kb / 8 字节 * 2MB)
**最后一个指针指向一个三重间接表。**它的名字简单地告诉我们,在 Inode 和实际的存储集群之间存在三层指针。64 位 4kb 集群机器上的三重间接表的大小最多可容纳 512GB。(4kb / 8 bytes * 1GB) 至此,大小已经超过了一些存储的容量。
如果我们增加文件簇大小,Inode 的最大大小也会增加。但是,我们不会在本教程中介绍它。
2.2. Linux 如何处理间接表
当使用节点和间接表创建文件时,Linux 允许用户将文件的某些部分保留为“空白”。我们在文件中将这些空白区域称为“孔”,我们可以使用许多不同的方法来创建这些孔。
当我们想到这些知识时,我们终于可以深入研究 Linux 命令和 POSIX 方法,将其应用到实际案例中。Linux 提供了各种类型的解决方案来快速创建如此大的文件,无论文件中的内容是什么。
3. Linux 命令: truncate和 fallocate
Linux 有两个创建大文件的命令。我们可以使用truncate 或fallocate 来实现相同的目标,但这两个命令以不同的方式创建文件。
3.1. truncate命令_
** truncate命令专门将文件列表缩小或扩展至所需大小**。但是,如果我们缩小文件的大小,我们可能会冒丢失文件中某些内容的风险。如果我们尝试将文件扩展至特定大小,则 truncate 命令将用零填充额外的空间。因此,我们可能会冒着破坏某些文件的编码约定并使它们无法读取的风险。
如果我们不使用-c 参数指定truncate命令,那么如果指定的文件不存在,则truncate将创建新文件**。truncate命令的典型用法带有*-s*参数。下面是我们将如何使用它来处理这个论点。大小单位必须大写。
$ truncate -s 5K test.txt
此命令不提供任何终端输出。相反,如果该文件不存在,我们会在当前目录中找到一个名为 test.txt 的文件。否则,此命令会将专用文件调整为给定大小。我们可以使用ls -lh 命令验证这一点:
$ ls -lh test.txt
-rw-rw-r-- 1 username username 5.0K Mar 25 21:01 test.txt
但是,如果没有参数*–apparent-size* ,du 命令无法检测到这种填充零的文件。**这背后的原因是du只计算磁盘使用量。**填充零但未显式分配给任何内容的群集不被视为已使用。可以在下面找到差异的比较:
$ du -sh test.txt
0 test.txt
=================================
$ du --apparent-size -h test.txt
5.0K test.txt
简而言之,我们可以使用truncate命令创建任意大小的文件。但是,这样做可能会破坏文件,因为它会将文件占用的所有空间都填充为零,而且效率也不高。
3.2. fallocate命令
Linux 还提供了一个更好的命令解决方案,称为fallocate。**它比truncate命令更好,因为它只为文件分配存储集群,而不是用零填充所有空白空间。**没有 I/O 操作使得fallocate比truncate命令快得多。
但是,此命令仅要求操作系统为文件保留空间,而不是初始化它们。因此,当我们尝试打开这样一个未初始化集群的分配文件时,我们仍然可能会遇到问题。
要创建具有特定大小的文件,我们需要使用*-l*参数。我们可以找到下面的语法:
$ fallocate -l 5K test2.txt
要验证结果,我们可以简单地使用ls -lh命令:
$ ls -lh test2.txt
-rw-rw-r-- 1 username username 5.0K Mar 25 21:22 test2.txt
如果我们尝试对第二个文本文件使用du命令,结果会大不相同:
$ du -sh test2.txt
8.0K test2.txt
=================================
$ du --apparent-size test2.txt
5.0K test2.txt
在这种情况下,du -sh命令根据分配的集群数计算存储使用量。典型机器的集群大小为 4.0K,这是机器可以分配的最小大小。操作系统必须为一个 5KB 的文件分配两个集群。