![稀疏文件](https://linux22.com/image/28170/%E7%A8%80%E7%96%8F%E6%96%87%E4%BB%B6.png)
由于某种原因,当我在 OS X 上创建文本文件时,它总是至少 4kB,除非它是空白的。为什么是这样? 1 字节的纯文本可能包含 4,000 字节的元数据吗?
答案1
文件系统的块大小必须为 4 kB。当数据写入文件系统中包含的文件时,操作系统必须分配存储块来包含将写入文件的数据。
通常,当创建文件系统时,该文件系统中包含的存储被分段为固定大小的块。 这篇维基百科文章简要解释一下这个过程。
该文件的文件系统的底层块大小必须为 4K 字节块大小。该文件使用 1 4K 块,该块中只有一个字节包含实际数据。
答案2
所有文件系统都有簇或块大小,或者可以分配用于保存文件的最小磁盘空间量。即使实际文件大小小于簇/块大小,它仍然会消耗文件系统上的 1 个簇或 4K。簇大小取决于文件系统和文件系统选项。
如果它包含零字节,如吉尔斯指出,它在典型的 *nix 文件系统上使用零个块/簇,但使用一个 inode,这更好地回答了这一警告,“除非它是空白的”。
答案3
一个小实验可以帮助说明这一点:
首先,让我们看看我的根 ext4 (LVM) 分区的实际块大小是多少:
[root@fedora17 blocksize]# dumpe2fs /dev/mapper/vg_fedora17-lv_root | grep -i "block size"
dumpe2fs 1.42.3 (14-May-2012)
Block size: 4096
正如预期的那样,它是 4096 (4 KiB)。现在,让我们创建三个文件:第一个是零字节,第二个是一个字节,第三个是 4 KiB(块大小):
[root@fedora17 blocksize]# touch 0_bytes.bin
[root@fedora17 blocksize]# dd if=/dev/zero of=1_byte.bin bs=1 count=1
[root@fedora17 blocksize]# dd if=/dev/zero of=4096_bytes.bin bs=1 count=4096
现在,我们的ls
目录。我们使用该-s
选项来查看分配的大小(最左边的列),以 1024 字节“块”的数量表示。
(ls 不知道实际的块大小是 4096 ——我们可以指定,--block-size
但是可以缩放一切通过这个值,我们希望看到实际的文件大小也以字节为单位)。
[root@fedora17 blocksize]# ls -ls
total 8
0 -rw-r--r--. 1 root root 0 Jan 21 23:56 0_bytes.bin
4 -rw-r--r--. 1 root root 1 Jan 21 23:38 1_byte.bin
4 -rw-r--r--. 1 root root 4096 Jan 21 23:38 4096_bytes.bin
这里需要注意两件事:
- 零字节文件占用文件系统中的零个块,确认了什么贾尔斯表示。
- 尽管其他两个文件的文件大小不同,但它们都占用 4*1024 = 1 个 4KiB ext4 块。
稀疏文件
稀疏文件是带有大块零的文件。由于已知数据全部为零,因此将其存储在磁盘上是没有意义的。这样,文件的表观大小实际上可以是更大比磁盘上的大小。
内联数据
请注意,某些文件系统允许将内容非常小的文件存储在索引节点本身。看是否可以将数据直接存储在 Unix / Linux 文件系统上的 inode 内?。