我有一个关于块大小和簇大小的问题。根据我所读到的内容,我假设如下:
- 块大小是块的物理大小,大部分为 512 字节。没有办法改变这一点。
- 簇大小是操作系统可读写的块的最小大小。如果我创建一个新的文件系统,例如 ext3,我可以使用开关 -b 指定这个最小块大小。几乎所有程序(例如 dumpe2fs、mke2fs)都使用块大小作为簇大小的名称。
如果我得到以下输出:
$ stat test
File: `test'
Size: 13 Blocks: 4 IO Block: 2048 regular file
Device: 700h/1792d Inode: 15 Links: 1
size 是实际空间(以字节为单位),block 是物理使用的块(每个 512 字节),IO block 与创建 FS 时指定的块大小相关,这是否正确?
答案1
我认为您很困惑,可能是因为您阅读了多个使用不同术语的文档。即使在文件系统文献的上下文中,“块大小”和“簇大小”等术语也没有通用含义。
文件系统
为了外部2或者外部3,情况比较简单:每个文件占用一定数量块。给定文件系统上的所有块都具有相同的大小,通常为 1024、2048 或 4096 字节之一。大小在 N 块加一个字节和 N+1 块之间的文件 1 占用 N+1 块。该块大小是您用 指定的mke2fs -b
。没有单独的集群概念。
这胖的特别是 MS-DOS 和早期版本的 Windows 使用的文件系统具有类似的简单空间分配。 ext2 称为块,FAT 称为集群;这个概念是一样的。
一些文件系统具有更复杂的分配方案:它们具有固定大小的块,但可以使用同一块来存储多个文件的最后几个字节。这被称为块再分配;赖瑟夫斯和Btrfs这样做,但不是 ext3 甚至 ext4。
公用事业
Unix 实用程序经常使用“块”一词来表示任意大小的单元,通常为 512 字节或 1kB。此用法与任何特定文件系统或磁盘硬件无关。从历史上看,512B 块确实出现了,因为当时的磁盘和文件系统经常以 512B 块运行,但现代的用法只是任意的。不过,传统的 UNIX 实用程序和接口有时仍然使用 512B 块现在通常首选 1kB 块。您需要检查每个实用程序的文档以了解其使用的块大小(有些有开关,例如Linux 上的du -B
或df -B
)。
在GNU/Linuxstat
实用程序中,该blocks
数字是文件使用的512B块的数量。该IO Block
数字是文件输入输出的首选大小,原则上不相关,但通常指示底层文件系统的块大小(或簇大小,如果您想这样称呼它)。这里,你有一个 13 字节的文件,它在 ext3 文件系统上占用一个块,块大小为 2048;因此该文件占用 4 512 字节单元(称为“块” stat
)。
磁盘
大多数磁盘都会提供一个界面,将磁盘显示为一堆部门。磁盘只能写入或读取整个扇区,而不能写入或读取单个位或字节。大多数硬盘都有 512 字节扇区,尽管 4kB 扇区磁盘几年前就开始出现。
磁盘扇区大小与文件系统块大小没有直接关系,但让一个块由扇区的整数个组成可以更好地提高性能。
¹ 例外情况:稀疏文件节省空间。
答案2
非常重要的一点是,如果您的文件系统有 4KB unut\cluster\extent\无论大小,这并不意味着操作系统会在硬盘上读取和写入 4KB 大小的数据。 FS 范围\簇\无论大小是什么并不重要。操作系统可以以512B粒度从硬盘读取和写入数据。其中 512B 是硬盘上块的物理大小。你可以很容易地检查它。在 Windows 上启动 ioemeter 和 perfon。并在你自己身上看到它
假设我们有 4k 簇大小\单元分配大小的 ntfs,并且 hdd 有 512B 扇区大小。我们用 512B rand 写入的模式发射 iometer。您将在 perfmon 中看到操作系统一次写入 512B 没有任何问题,并且没有任何读取 IO,正如您所期望的那样。 OS直接将512B写入FS。它不会像操作系统读取 4k 更改其中的 512B 并写回 4K 那样发生。没有。
答案3
认为破解“块”一词可能会授予对该问题的一个(但可能只是可能>1)答案的访问权限:在以前,当“软盘”存在时,有时问题是我是否主要存储 SMAL 或主要存储“硬盘”上的大文件(例如软盘),因为这样我可能会浪费一些数学上可能的“空间”......因为一个文件肯定需要一个块(这是一个“规则”/“成本”)。我认为“扇区”更多的是与设备相关的硬件和固件,而不是“软件块”。 (〜因为文件系统的目录也需要“物理”空间,因此块大小越小,“目录”越大(或者我认为“日志”也是一个名称))。