为什么即使文本文件只有一个字节,文本文件也至少占用 4kB?

tkb*_*kbx 50 filesystems disk-usage

出于某种原因,当我在 OS X 上制作文本文件时,它总是至少 4kB,除非它是空白的。为什么是这样?1 字节的纯文本可能有 4,000 字节的元数据吗?

在此处输入图片说明

Hea*_*ohn 56

文件系统的块大小必须为 4 kB。当数据写入文件系统中包含的文件时,操作系统必须分配存储块以包含将写入文件的数据。

通常,在创建文件系统时,包含在该文件系统中的存储被分段为固定大小的块。 这篇维基百科文章简要解释了这个过程。

此文件的文件系统的底层块大小必须具有 4K 字节的块大小。该文件使用 1 个 4K 块,并且该块中只有一个字节包含实际数据。

  • 注释:在Windows中,默认显示实际文件大小,而磁盘上的大小显示在选项窗格中。 (10认同)

Chr*_*her 13

所有文件系统都有一个簇或块大小,或者可以分配来保存文件的最小磁盘空间量。即使实际文件大小小于簇/块大小,它仍然会消耗一个簇,或文件系统上的 4K。集群大小取决于文件系统和文件系统选项。

如果它包含零字节,正如Gilles 指出的那样,它在典型的 *nix 文件系统上使用零个块/集群,但使用一个 inode,这更好地回答了警告,“除非它是空白的。”

  • “即使文件大小为零字节,它仍然会消耗一个集群。” 实际上,没有:在典型的 unix 文件系统上,一个空文件消耗一个 inode 和零个块,并且没有与块不同的集群概念。 (6认同)

Jon*_*art 10

一个小实验来帮助说明这一点:

首先,让我们看看我的根 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
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,它是 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
Run Code Online (Sandbox Code Playgroud)


现在,我们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
Run Code Online (Sandbox Code Playgroud)

这里可以注意两件事:

  • 零字节文件在文件系统中占用零块,证实了Giles 所说的
  • 尽管其他两个文件的文件大小不同,但它们都占用 4*1024 = 一个 4KiB ext4 块。

稀疏文件

稀疏文件是具有大块零的文件。由于已知数据全部为零,因此将其存储在磁盘上毫无意义。通过这种方式,文件的表观大小实际上可能大于磁盘上的大小。

内联数据

请注意,某些文件系统允许将非常小的文件内容存储在inode本身中。请参阅是否可以将数据直接存储在 Unix / Linux 文件系统上的 inode 中?.

  • 这是不正确的。像您提到的文件元数据不会“吃掉”任何 4KiB。这些结构是文件系统格式化开销的一部分。请参阅我上面的答案以获取证据。如果你说的是真的,那么我的 4096 字节文件将需要不止一个块。 (3认同)
  • 我是说 4 KiB 块大小中的 * 无 * 用于元数据。我想我的例子证明了这一点。 (3认同)
  • @pvn:乔纳森是对的。元数据存储在文件的 inode 中,它与用于存储文件数据的块是分开的。 (3认同)