Ext

全称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

核心设计

数据存放区

这些元素相对稳定,磁盘格式化后,就固定下来了。

  • inode(索引节点)

    记录文件的权限、属性和数据所在块block的号码,每个文件都有且仅有一个的inode,每个inode都有自己的编号,可以把inode简单地理解为文档索引

备注:在磁盘格式化后,inode的大小和数量都已经固定了,大小均为128Bytes(新的Ext4和xfs为258Bytes)。读取文件时,先读取inode里面记录的文件属性和权限,匹配正确后,才会读取文件内容(block)。在Linux系统中,实际使用inode来识别文件,而不是文件名,类似于用户标识和昵称的设计

  • inode table

    存储文件系统的所有inode编号的表格
  • block(数据区块)

    存储的文件内容,也叫数据区块(data block),每个block都有自己的编号,Ext2支持的单位block容量仅为1k、2k、4k

备注:为了方便inode的记录,在磁盘格式化后,block的大小都已经固定了。每一个块只能存放一个文件的数据,若文件太大,将占用多个block;若文件太小,block剩余空间就不能被使用了,就会导致磁盘空间浪费,所以在磁盘分区后,文件系统格式化前,请先仔细想想文件系统的预计使用情况

查看文件或者文件系统的状态

stat [options] [filename]

查看系统各个文件系统的inode使用情况

df -i

中介数据(metadata)

这些元素是为了维持文件系统状态而设计出来的,当新增、编辑、删除文档时,都需要变更这些状态信息。

  • superblock(超级块)

    记录文件系统(filesystem)的整体信息,包括inode/block的总量、使用量、剩余量、大小、以及文件系统的格式和相关信息。

备注:整个文件系统的基本信息全部记录在superblock,它的大小一般为1024Bytes,如果它死掉,将会花费大量的时间去补救哦!!!

  • block group(区块群组)

    试想一下,假如我们的磁盘容量高达数百G,当我们格式后,inode和block会非常庞大,为了便于管理,Ext文件系统在格式化时,引入了区块群组(block group)的概念,每个区块群组都保持独立inode/block/superblock,拥有固定数量的block,这样就分成了一群一群最基础的子文件系统。

备注:superblock对于文件系统太重要了,但是文件系统的superblock又只有一个,所以除了第一个block group含有superblock外,后续block group都可能会含有备份的superblock,目的就是为了避免superblock单点无法救援的问题。

  • block bitmap(区块对照表)

    一个block只能被一个文件使用,当我们新增文件时,肯定需要使用新的block来记录文件数据。那么如何快速地知道,哪些block是新的?哪些block是已经使用了的?block bitmap就是这样被设计出来,记录所有使用和未使用的block号码。同样的,当我们删除文件时,先从block bitmap中找到对应的block号码,然后更新标志为未使用,最后释放block。
  • inode bitmap(inode 对照表)

    和block bitmap一样的设计理念,只不过它记录地是已使用和未使用的inode号码,这里就不再敖述了。
  • group descriptor

    描述每个区段(block group)开始和结束的block号码,以及说明每个区段(inodemap、blockmap、inode table)分别介于哪些block号码之间。

列出目前系统所有被格式化的设备:blkid



挑选一个已格式化好的设备,查看文件系统的详细信息: dumpe2fs /dev/vda1



备注:通过上面的Magic签名为0xEF53,说明我们的磁盘分区是一个标准的ext2和ext3文件系统。类似于通过文件开头的Magic,可以判断文件类型一样。

示例说明

1. inode的作用

当用户搜索或者访问一个文件时,UNIX 系统通过 inode 表查找正确的 inode 编号。在找到 inode 编号之后,相关的命令才可以访问该 inode ,并对其进行适当的更改。

示例

例如使用vi来编辑一个文件。当您键入vi<filename>时,在inode表中找到inode编号之后,才允许您打开该inode 。在 vi 的编辑会话期间,更改了该inode中的某些属性,当您完成操作并键入 :wq 时,将关闭并释放该 inode 。通过这种方式,如果两个用户试图对同一个文件进行编辑, inode 已经在第一个编辑会话期间分配给了另一个用户 ID (UID),因此第二个编辑任务就必须等待,直到该 inode 释放为止。

备注:大家可以参考百度百科。

2. block的重要性

通过上面的分析,我们知道block是文件数据存储的原子单位,且每一个block只能存储一个文件的数据。当格式化一个文件系统时,如果选择不当,就会造成大量的磁盘空间浪费。

示例

假如文件系统选择的block为4k,存储10000个小文件,每个500bytes,请问此时浪费了多少磁盘空间容量?

每个文件浪费的磁盘容量 = 4096 - 500 = 3596bytes,10000个文件浪费的磁盘容量 = 10000 * 3596 ~=34M,实际文件容量 = 10000 * 500 ~=4.7M,没有对比就没有伤害啊,实际存储容量不到5M,就浪费了34M,浪费率680%,而且文件越多浪费越严重。

备注:从原理上分析,只有当实际文件容量刚好等于系统最小存储单位容量时,磁盘不会存在浪费的情况,但这是理想情况,那么我们选择最小的block不就行了,没毛病。不过,此时又有新的问题产生了,大型文件会占用过多的block,造成inode记录过多的block号码,文件系统的读写性能就会下降,所以说凡事都要有个度,把握好这个度,才能从整体上提高文件系统的性能和利用率。

3. inode和block与文件大小的关系

数据实际存储在block,为了能够快速地读取文件,每个文件都对应一个inode索引文件,记录所有的block编号,但是inode的大小只有128bytes或256bytes(ext4),如果一个文件太大,block数量很有可能会超过inode可记录的数量,为此,inode记录block号码的区域被设计为12个直接、一个间接、一个双间接、一个三间接记录区。

备注:所谓的间接就是拿一个block来作为block号码记录区,只有最后一个间接才会真正用来记录block号码,其他的间接层,都只是依次引用。

计算单文件最大容量

每个block号码为数字,需要占据4bytes。

  • 假设block的单位容量为1K,每个block能记录的block号码为1k/4=256

    • 12个直接容量 = 12 * 1k =12k
    • 单间接容量 = 256 * 1k = 256k
    • 双间接容量 = 256 * 256 * 1k = 65536k
    • 三间接容量 = 256 * 256 * 256 * 1k = 16777216k
    • 单文件最大总量 = 12个直接容量 + 单间接容量 + 双间接容量 + 三间接容量 = (12 + 256 + 65536 + 16777216) / (1024 * 1024) = 16.06G
  • 假设block的单位容量为2K,每个block能记录的block号码为2k/4=512

    • 12个直接容量 = 12 * 2k =24k
    • 单间接容量 = 512 * 2k = 1024k
    • 双间接容量 = 512 * 512 * 2k = 524288k
    • 三间接容量 = 512 * 512 * 512 * 2k = 268435456k
    • 单文件最大总量 = 12个直接容量 + 单间接容量 + 双间接容量 + 三间接容量 = (24 + 1024 + 524288 + 268435456) / (1024 * 1024) = 256.50G
  • 假设block的单位容量为4K,每个block能记录的block号码为4k/4=1024

    • 同理,单文件最大总量 = 12个直接容量 + 单间接容量 + 双间接容量 + 三间接容量 = 4.00T

Linux标准的文件系统限制表

备注:当block单位容量为4K时,由于文件系统本身的限制(2T),所以才与计算的结果不太吻合。

查看磁盘和文档的容量

1. 查看文件系统的整体磁盘容量

df  [-ahikHTm] [目录或文件名]

2. 查看目录和文件容量

du [options] []

查看目录geekbuying下所有目录的容量

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

漫谈Linux标准的文件系统(Ext2/Ext3/Ext4)的更多相关文章

  1. Linux文件系统Ext2,Ext3,Ext4性能大比拼

    Linux kernel 自 2.6.28 开始正式支持新的文件系统 Ext4. Ext4 是 Ext3 的改进版,修改了 Ext3 中部分重要的数据结构,而不仅仅像 Ext3 对 Ext2 那样,只 ...

  2. linux分区之ext2,ext3,ext4,gpt

    linux分区之ext2,ext3,ext4,gpt 2013-07-10 12:00:24 标签:ext3 gpt 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明 ...

  3. 使用 parted 命令可以查看系统采用什么类型的分区表 gpt/mbr/msdos/ext/ext/ext2/ext3/ext4

      Linux磁盘表示方式 Linux以字母标识磁盘的个数 a:第一块 b:第二块 Linux用数字标识分区:1-4标识主分区或扩展分区 逻辑分区从5开始 例如:sda.sda1.sda2 低级格式化 ...

  4. 【转载】格式化存储装置成为 Ext2/Ext3/Ext4 档案系统

    格式化 用系统管理员帐户 (即 root) 身份打「mkfs -t ext2|ext3|ext4 储存装置」: mkfs -t ext3 /dev/sdb5 要格式化档案系统为 Ext2,亦可以直接使 ...

  5. dumpe2fs 命令的使用,转储 ext2/ext3/ext4 文件系统信息

    使用man 命令可以查看 dumpe2fs 命令具体的使用的方法: NAME dumpe2fs - dump ext2/ext3/ext4 filesystem information SYNOPSI ...

  6. Linux 磁盘与文件系统(EXT2)简介

    Linux 中,一切(或几乎一切)都是文件. 一.Linux 磁盘分区与文件系统 1.1 磁盘分区 磁盘的分区主要分为主分区和扩展分区 1)主分区:总共最多只能有四个主分区: 2)扩展分区:只能有一个 ...

  7. ext2,ext3,ext4文件系统管理软件包e2fsprogs

    e2fsprogs(也叫做e2fs programs)是一个Ext2(及Ext3/4)文件系统工具集(Ext2 Filesystems Utilities[2] ),它包含了诸如创建.修复.配置.调试 ...

  8. 调整分区大小(ext2\ext3\ext4)

    现在的时间是2017年5月27日 我想说调整分区大小没那么麻烦,至少我直接将一个ext3格式分区从50G减少到了30G. 步骤如下 1 首先确保那个分区是没被挂载的. 2 调整分区大小,但是其实并没有 ...

  9. 在不损坏数据的情况下调整分区大小(ext2\ext3\ext4)

    现在的时间是2017年5月27日 我想说调整分区大小没那么麻烦,至少我直接将一个ext3格式分区从50G减少到了30G. 步骤如下 1 首先确保那个分区是未挂载的. 2 调整分区大小,但是其实并没有实 ...

随机推荐

  1. 【转】mysql 中int类型字段unsigned和signed的区别

    转自https://www.cnblogs.com/wangzhongqiu/p/6424827.html 用法: mysql> CREATE TABLE t ( a INT UNSIGNED, ...

  2. 进击Node.js基础(二)promise

    一.Promise—Promise似乎是ES6中的规范 PROMISE的语言标准,PROMISE/A+规范,如何使用,在什么场景下使用 Promise时JS对异步操作场景提出的解决方案(回调,观察者模 ...

  3. Zepto源码(2016)——Zepto模块(核心模块)

    // Zepto.js // (c) 2010-2016 Thomas Fuchs // Zepto.js may be freely distributed under the MIT licens ...

  4. windows命令中的cd

    cd命令的作用为改变文件夹,也就是跳转目录.切换路径的意思.它后面可以接驱动器符号.完整路径和相对路径. 打开命令行窗口的时候,默认的目录位于当前用户所在的路径下,比如:C:\Users\koi\De ...

  5. 嘿嘿嘿,开始自学mysql

    开始学习mysql了,作为非计算机专业学生,必须需要一个地方来给自己的知识进行一些记录和总结. 一SQL语句 数据库是不认识java语言的,但是我们同样要与数据库交互,这时需要使用到数据库认识的语言S ...

  6. FTP用户无法登陆排错详解

    FTP作为一种简单便捷的文件共享技术,在许多企业内部得到使用.若启用FTP的验证控制,管理员更可对不同的用户设置不同的访问权限,控制用户对特定内容的访问.IIS中的FTP站点只有一种验证方式,即基本验 ...

  7. Java之Collections.emptyList()、emptySet()、emptyMap()的作用和好处以及要注意的地方

    转自https://www.cnblogs.com/qiumingcheng/p/7126281.html 先说明一下好处有哪些:1,如果你想 new 一个空的 List ,而这个 List 以后也不 ...

  8. 深入理解Java:内省(Introspector)

    深入理解Java:内省(Introspector) 内省(Introspector) 是Java 语言对 JavaBean 类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传 ...

  9. 微信jssdk config:invalid signature 签名错误 ,问题排查过程

    invalid signature签名错误.建议按如下顺序检查: 确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisi ...

  10. Eclipse 出现项目没有错但是项目名称却有红色感叹号或者红叉的解决办法

    错误的起因是本人因为一不小心点了下面圈出来的某一个按钮,具体记不清楚了(好像是"remove from build path"),然后整个项目变得很奇怪了,所有的包都变成了一个普通 ...