由于某种原因,当我在OS X上制作文本文件时,除非空白,它始终至少为4kB。为什么是这样?大约有1字节的纯文本会存在4,000字节的元数据吗?
:P
由于某种原因,当我在OS X上制作文本文件时,除非空白,它始终至少为4kB。为什么是这样?大约有1字节的纯文本会存在4,000字节的元数据吗?
:P
Answers:
文件系统的块大小必须为4 kB。将数据写入文件系统中包含的文件时,操作系统必须分配存储块以包含将要写入文件的数据。
通常,在创建文件系统时,该文件系统中包含的存储将分成固定大小的块。 这篇Wikipedia文章简要解释了此过程。
此文件的文件系统的基础块大小必须具有4K字节的块大小。该文件使用1个4K块,该块中只有一个字节包含实际数据。
所有文件系统都具有群集或块大小,或者可以分配以容纳文件的最小磁盘空间。即使实际文件大小小于群集/块大小,它仍然会占用一个群集或文件系统上的4K。群集大小取决于文件系统和文件系统选项。
如Gilles所指出的,如果它包含零字节,则它使用零块/簇,而在典型的* nix文件系统上使用一个inode,这更好地回答了警告,“除非它是空白的”。
一个小实验可以帮助说明这一点:
首先,让我们看看我的根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
这里可以注意两点:
稀疏文件是带有大块零的文件。由于已知数据全为零,因此将其存储在磁盘上毫无意义。这样,文件的视在大小实际上可以大于磁盘上的大小。
请注意,某些文件系统允许将内容非常小的文件存储在inode本身中。请参阅是否可以将数据直接存储在Unix / Linux文件系统上的inode中?。