简单来说,扇区是对硬盘而言,块是对文件系统而言
扇区:硬盘的最小单位就是扇区,是真实存在的。一般大小是512字节,这个大小是在硬盘出厂时设置,不能修改。
块:也称为逻辑块,是文件系统层面的概念。文件系统不是一个扇区一个扇区的来读数据,太慢了,它是一个块一个块的读取数据,就是说块(block)是文件系统存取数据的最小单位,一般大小是4KB(这个值可以修改,在格式化分区的时候修改)。
读取一个块,实际上是从硬件设备读取一个或多个扇区,一个block只能存放一个文件内容,无论这个文件有多小。一个文件可能会占用多个block,每读取一个block就会消耗一次磁盘io。如果要提升磁盘io性能,那么尽可能一次io读取更多的数据,但是block也不是越大越好,需要结合业务来设置。
例如:block设置为4K,那么创建大量的1K小文件后,磁盘空间会被大量浪费。一个文件占用一个block,100G的小文件(都是1K大小),那么会占用400G的空间,浪费300G,可以做个实验验证下:
- 分配一个100M的磁盘,然后格式化成ext4文件系统,block size默认为1K,并挂载
mkfs.ext4 /dev/sdj
mount /dev/sdj /mnt/test3
在往/mnt/test3目录下创建20480个1k的小文件前后,分别统计下df命令输出的结果如下
在实际操作中出现几个疑点:虽然这不是这个实验的重点,但还是先记录下来,后续研究
- 空的分区中,有1550个block已用,这些block存的是什么数据?
- 总个数95054 != 已用个数1550 + 可用个数86336,why?但是xfs文件系统中,是相等的。
- 20480个1K的文件,应该会占用20480个block,但是20480 != 22446 - 1550,多出来的416个block存的是什么数据?
抛开这三个疑点,可以看到当block为1K时,创建20480个1K的文件,基本上就占用了20480个block。占用的容量大概20M,空间没有浪费。再做一个对比实验
- 分配一个100M的磁盘,然后格式化成ext4文件系统,block size设置为4K,并挂载
mkfs.ext4 -b 4096 /dev/sdk
mount /dev/sdk /mnt/test4
在往/mnt/test3目录下创建20480个1k的小文件前后,分别统计下df命令输出的结果如下
可以看到已用的blocks个数82444/4 = 20611个,这里面有20480个是存的是20480个1K的小文件,但是由于每个block的大小为4K,所以占用空间大概80M,而20480个1K的文件只有20M,所以相当于浪费60M。
简言之:如果不想浪费空间,block设置为1K。但当文件都是1000K大小时,又过于消耗磁盘io(1000K的文件,block为4K时占用250个block,block为1K时占用1000个block,分别消耗磁盘io为250次和1000次)。所以具体业务场景得设置不同的block会好一点,大文件多(比如都是视频文件)时,block设置大一点,小文件多(比如小说TXT文件)时,block设置小一点。
通常,一个文件系统占用的多个block在磁盘上是不连续存储的,因为如果连续存储,则经过频繁的删除、建立、移动文件等操作,最后磁盘上将形成大量的空洞,很快磁盘上将无空间可用。因此,必须提供一种方法将一个文件占用的多个block映射到对应的非连续存储的扇区上,文件系统是用索引节点解决这个问题的。文件系统怎样从文件名索引到存放文件内容的block区的,这些将在下一节讲到。