全称Linux extended file system, extfs,即Linux扩展文件系统,Ext2就代表第二代文件扩展系统,Ext3/Ext4以此类推,它们都是Ext2的升级版,只不过为了快速恢复文件系统,减少一致性检查的时间,增加了日志功能,所以Ext2被称为索引式文件系统,而Ext3/Ext4被称为日志式文件系统。
备注:Linux支持很多文件系统,包括网络文件系统(NFS)、Windows的Fat文件系统。
查看Linux支持的文件系统:ls -l /lib/modules/$(uname -r)/kernel/fs
查看Linux支持的文件系统(已载入到内存中):cat /proc/filesystems
这些元素相对稳定,磁盘格式化后,就固定下来了。
block
的号码,每个文件都有且仅有一个的inode
,每个inode
都有自己的编号,可以把inode
简单地理解为文档索引。
备注:在磁盘格式化后,inode的大小和数量都已经固定了,大小均为128Bytes(新的Ext4和xfs为258Bytes)。读取文件时,先读取inode里面记录的文件属性和权限,匹配正确后,才会读取文件内容(block)。在Linux系统中,实际使用inode来识别文件,而不是文件名,类似于用户标识和昵称的设计。
block
都有自己的编号,Ext2
支持的单位block
容量仅为1k、2k、4k。
备注:为了方便inode的记录,在磁盘格式化后,block的大小都已经固定了。每一个块只能存放一个文件的数据,若文件太大,将占用多个block;若文件太小,block剩余空间就不能被使用了,就会导致磁盘空间浪费,所以在磁盘分区后,文件系统格式化前,请先仔细想想文件系统的预计使用情况。
stat [options] [filename]
df -i
这些元素是为了维持文件系统状态而设计出来的,当新增、编辑、删除文档时,都需要变更这些状态信息。
inode/block
的总量、使用量、剩余量、大小、以及文件系统的格式和相关信息。
备注:整个文件系统的基本信息全部记录在superblock,它的大小一般为1024Bytes,如果它死掉,将会花费大量的时间去补救哦!!!
列出目前系统所有被格式化的设备:blkid
挑选一个已格式化好的设备,查看文件系统的详细信息:dumpe2fs /dev/vda1
备注:通过上面的Magic签名为0xEF53,说明我们的磁盘分区是一个标准的ext2和ext3文件系统。类似于通过文件开头的Magic,可以判断文件类型一样。
当用户搜索或者访问一个文件时,UNIX 系统通过 inode 表查找正确的 inode 编号。在找到 inode 编号之后,相关的命令才可以访问该 inode ,并对其进行适当的更改。
例如使用vi
来编辑一个文件。当您键入vi<filename>
时,在inode表中找到inode编号之后,才允许您打开该inode 。在 vi 的编辑会话期间,更改了该inode中的某些属性,当您完成操作并键入 :wq 时,将关闭并释放该 inode 。通过这种方式,如果两个用户试图对同一个文件进行编辑, inode 已经在第一个编辑会话期间分配给了另一个用户 ID (UID),因此第二个编辑任务就必须等待,直到该 inode 释放为止。
备注:大家可以参考百度百科。
通过上面的分析,我们知道block是文件数据存储的原子单位,且每一个block只能存储一个文件的数据。当格式化一个文件系统时,如果选择不当,就会造成大量的磁盘空间浪费。
假如文件系统选择的block为4k,存储10000个小文件,每个500bytes,请问此时浪费了多少磁盘空间容量? 每个文件浪费的磁盘容量 = 4096 - 500 = 3596bytes,10000个文件浪费的磁盘容量 = 10000 * 3596 ~=34M,实际文件容量 = 10000 * 500 ~=4.7M,没有对比就没有伤害啊,实际存储容量不到5M,就浪费了34M,浪费率680%,而且文件越多浪费越严重。
备注:从原理上分析,只有当实际文件容量刚好等于系统最小存储单位容量时,磁盘不会存在浪费的情况,但这是理想情况,那么我们选择最小的block不就行了,没毛病。不过,此时又有新的问题产生了,大型文件会占用过多的block,造成inode记录过多的block号码,文件系统的读写性能就会下降,所以说凡事都要有个度,把握好这个度,才能从整体上提高文件系统的性能和利用率。
数据实际存储在block,为了能够快速地读取文件,每个文件都对应一个inode索引文件,记录所有的block编号,但是inode的大小只有128bytes或256bytes(ext4),如果一个文件太大,block数量很有可能会超过inode可记录的数量,为此,inode记录block号码的区域被设计为12个直接、一个间接、一个双间接、一个三间接记录区。
备注:所谓的间接就是拿一个block来作为block号码记录区,只有最后一个间接才会真正用来记录block号码,其他的间接层,都只是依次引用。
每个block号码为数字,需要占据4bytes。
Linux标准的文件系统限制表
备注:当block单位容量为4K时,由于文件系统本身的限制(2T),所以才与计算的结果不太吻合。
df [-ahikHTm] [目录或文件名]
du [options] []
du -sm geekbuying/*
du -sm 单位M
Ext家族是Linux支持度最广、最完整的文件系统,当我们格式化磁盘后,就已经为我们规划好了所有的inode/block/metadate等数据,这样系统可以直接使用,不需要再进行动态的配置,这也是它最优秀的特点,不过这也是它最显著的缺点,磁盘容量越大,格式化越慢,centos7.x已经选用xfs作为默认文件系统,xfs是一种适合大容量磁盘和处理巨型文件的文件系统。
https://en.wikipedia.org/wiki/Unix_filesystem https://en.wikipedia.org/wiki/Inode https://en.wikipedia.org/wiki/Unix_filesystem#/media/File:Standard-unix-filesystem-hierarchy.svg https://en.wikipedia.org/wiki/File:Version_7_UNIX_SIMH_PDP11_Filesystem_Layout.png