查看原文
其他

Linux硬盘与文件系统(4)

Cloud研习社 Cloud研习社 2023-06-06
前面的文章我们说过,ext2/ext3/ext4文件系统是典型的索引式文件系统。所以这个文件系统会自动划分inode、block。inode、block在格式化完成后就已经确定了,不能再修改(实际上用resize2fs命令可以修改,但是我们坚决反对)。
block(区块)是用来存放文件的内容的,但是ext2支持的区块大小有1K,2K,4K三种,在存放数据时,有以下几个原则:
  • block的数量与大小在格式化的时候就已经确定了,无法修改(除非重新格式化)

  • 一个block只能放置一个文件的数据

  • 如果文件大小比block大,那这个文件就会占用多个block

  • 如果文件大小小于block,那这个区块的剩余容量也不能被其他文件使用

关于block的其他说明:
1)    硬盘读取数据是按block为单位读取的
2)    一个文件可能占用多个block,每读一个block就会消耗一次硬盘IO
3)    如果要提升硬盘IO性能,那么就要尽可能一次性读取数据尽量的多
4)    一个block只能存放一个文件的内容,无论内容有多少,如果block 4k,那存放1k的文件,剩余3k就浪费了
5)    block并非越大越好,block太大对于小文件存放就会浪费硬盘空间,例如:1M的文件,block为4k,占用约250个block,block为1k,占用1000个block,访问效率谁更高?消耗IO分别为250次和1000次
6)    大文件(大于16k)一般设置block大一些,小文件一般设置block小一些
7)    block太大,例如4k,文件都是0.1k的,大量浪费硬盘空间
8)    block太小,例如1k,文件都是1000k,消耗硬盘IO
9)    block的设置也是格式化分区的时候确定的
10)  文件较大时,block设置大一点会提升硬盘访问效率
11)  ext3、ext4文件一般设置为4k
当前的生产环境一般设置为4k,特殊业务如视频可以加大block的大小。
block块越大对于小文件多的业务,会非常浪费空间,因为一个文件无论多大都会占用至少一个block,磁盘读取数据是按照block为单位读取,但是对于大文件,可以提升读取的效率,因为如果block太小,就要读取多个block,这样就会消耗硬盘IO,如果block大,则会读较少的block就能读完数据,从而减少硬盘IO。
block块太小又会影响硬盘读取大文件数据的效率,block块越小,同样存储一个文件就需要更多的block,这样读取数据时就需要读取多个block,因此效率就越低。
block分大了,浪费空间;分小了,影响硬盘读取性能。
inode、block总结:
1)    硬盘分区格式化文件系统后,会分为inode和block两部分内容
2)    inode存放文件的属性以及执行文件实体的指针,文件名不在inode里,一般存放在上级目录的block里
3)    访问文件,通过文件名àinodeàblock
4)    inode一般情况默认大小256B,block大小1,2,4k,默认4k,注意,引导分区等特殊分区除外。
5)    通过df -i查看inode的数量及使用情况,dumpe2fs、xfs-info查看inode及block的大小及数量。
6)    一个文件至少占用一个inode及一个block,多个文件可以占用同一个inode(硬链接),相同文件
7)    一个block只能被一个文件占用,如果文件很小,block很大,剩余空间浪费。无法继续被其他文件使用。
8)    block不是越大越好,要根据业务需求进行选择。
9)    在格式化时就决定了inode和block大小,以后无法更改。
[root@studyclub ~]# mkfs.xfs -b size=4096 -i size=512 /dev/sdb
meta-data=/dev/sdb isize=512    agcount=4, agsize=655360 blks
         = sectsz=512   attr=2, projid32bit=1
         = crc=1        finobt=0, sparse=0
data = bsize=4096   blocks=2621440, imaxpct=25
         = sunit=0      swidth=0 blks
naming =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         = sectsz=512   sunit=0 blks, lazy-count=1
realtime =none extsz=4096   blocks=0, rtextents=0

[root@studyclub ~]# mount /dev/sdb /mnt
[root@studyclub ~]# xfs_info /dev/sdb
meta-data=/dev/sdb isize=512    agcount=4, agsize=655360 blks
         = sectsz=512   attr=2, projid32bit=1
         = crc=1        finobt=0 spinodes=0
data = bsize=4096   blocks=2621440, imaxpct=25
         = sunit=0      swidth=0 blks
naming =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal bsize=4096   blocks=2560, version=2
         = sectsz=512   sunit=0 blks, lazy-count=1
realtime =none extsz=4096   blocks=0, rtextents=0


企业面试题:
一个100M(100000K)的硬盘分区,分别写入1k和1M的文件,分别可以写多少个?

错误解答:很容易计算1k的个数:100*1000=100000个,1M的文件个数:100/1=100个。
假设block为4k大小,写入1k文件的数量
假设inode数量够多的时候,实际存放的文件数就是block的数量,浪费3/4的容量
假设inode数量小于block的数量,实际存放的文件数就是inode的数量,浪费3/4的容量
假设block为4k,写入1M的文件
硬盘空间多大,就可以写入100/1M的数量。
a)    上面的考试题考查的是文件系统inode和block的知识。
b)    inode是存放文件属性信息的(也包含执行文件实体的指针),默认大小256字节,在centos7里,xfs默认是512字节。
c)    block是存放文件实际内容的,默认大小4K
d)    一个文件至少要占用一个inode及一个block
默认较大分区常规企业真实场景情况下,inode数量是足够的,而block数量消耗的会更快。
企业面试题:
  1. 一个100M(block的总大小、个数和单个block大小有关)的硬盘分区,分别写入0.5k的文件,及写入1M的文件,分别可以写多少个?为什么?

解答思路:先答四点知识
inode是存放文件属性信息的(也包含执行文件实体的指针),默认大小256字节,在centos7里,xfs默认是512字节。
block是存放文件实际内容的,默认大小4K
一个文件至少要占用一个inode及一个block
默认较大分区常规企业真实场景情况下,inode数量是足够的,而block数量消耗的会更快
正确解答:
默认分区常规情况下,对大文件来讲inode是足够的,而block数量消耗的会更快,block为4k的情况下,1m的文件不会有硬盘浪费,所以文件数量大概为100/1=100个
对于小文件0.1k,inode会消耗的更快,默认分区的时候block数量是大于inode数量的。每个小文件都会占用一个inode和一个block,所以最终文件的数量inode会先消耗完,文件总量是inode的最大数量。

  1. 如果向硬盘写入数据提示如下错误:No space left on device。通过df -h查看硬盘空间,发现没满,请问可能原因是什么?

 答:可能是inode数量被消耗尽了。



手应知:    尝鲜Rocky Linux
《Linux基础及进阶》:

    014 - Linux文件与目录管理(11)

    015 - Linux文件与目录管理(12)    016 - Linux硬盘与文件系统(1)    017 - Linux硬盘与文件系统(2)    018 - Linux硬盘与文件系统(3)


看完本文有收获?请分享给更多人


推荐关注「Cloud研习社」,带你从零开始掌握云计算技术!

微信号|bjdream-1


Cloud研习社 · 

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存