浅谈Linux标准的文件系统(Ext2/Ext3/Ext4)
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
挑选一个已格式化好的设备,查看文件系统的详细信息:<span> </span>dumpe2fs /dev/vda1
备注:通过上面的Magic签名为0xEF53,说明我们的磁盘分区是一个标准的ext2和ext3文件系统。类似于通过文件开头的Magic,可以判断文件类型一样。
【文章福利】小编推荐自己的Linux内核技术交流群: 【977878001】整理一些个人觉得比较好得学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!前100进群领取,额外赠送一份 价值699的内核资料包(含视频教程、电子书、实战项目及代码)
内核资料直通车:Linux内核源码技术学习路线+视频教程代码资料
学习直通车:Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈
示例说明
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是一种适合大容量磁盘和处理巨型文件的文件系统。
原文作者:首页 - 内核技术中文网 - 构建全国最权威的内核技术交流分享论坛
原文地址:浅谈Linux标准的文件系统(Ext2/Ext3/Ext4) - 圈点 - 内核技术中文网 - 构建全国最权威的内核技术交流分享论坛(版权归原文作者所有,侵权联系删除)
浅谈Linux标准的文件系统(Ext2/Ext3/Ext4)相关推荐
- linux分区之ext2,ext3,ext4,gpt
linux分区之ext2,ext3,ext4,gpt 2013-07-10 12:00:24 标签: ext3 gpt 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本 ...
- linux 易语言窗口程序_浅谈Linux入门的基本知识
浅谈Linux入门的基本知识 图形模式与文字模式的切换方式Linux预设提供了六个命令窗口终端机让我们来登录. 默认我们登录的就是第一个窗口,也就是tty1,这个六个窗口分别为tty1.tty2 - ...
- EXT2/EXT3/EXT4文件系统数据恢复工具开发计划
D-Recovery For Linux数据恢复软件已经开发完成,现在把研发计划贴出来,留个纪念. EXT2/EXT3/EXT4文件系统数据恢复工具开发计划 EXT2/EXT3/EXT4是Linux下 ...
- Linux系统常用函数,浅谈linux下的一些常用函数的总结(必看篇)
1.exit()函数 exit(int n) 其实就是直接退出程序, 因为默认的标准程序入口为int main(int argc, char** argv),返回值是int型的. 一般在shell下 ...
- 浅谈 Linux 高负载的系统化分析
简介: 浅谈 Linux 高负载的系统化分析,阿里云系统组工程师杨勇通过对线上各种问题的系统化分析. 讲解 Linux Load 高如何排查的话题属于老生常谈了,但多数文章只是聚焦了几个点,缺少整体排 ...
- Windows 7下读写Ext2/Ext3/Ext4文件系统
Linux文件系统格式一般是Ext3,现在Ext4也出来了.如何在Windows上读写这些分区呢? 推荐以下几款软件: 1. ext2Fsd (http://www.ext2fsd.com/) 可以读 ...
- 浅谈 Linux 系统中的 SNMP Trap 【转】
文章来源:浅谈 Linux 系统中的 SNMP Trap 简介 本文讲解 SNMP Trap,在介绍 Trap 概念之前,首先认识一下 SNMP 吧. 简单网络管理协议(Simple Network ...
- 浅谈Linux下的媒体播放器(转)
浅谈Linux下的媒体播放器(转)[@more@]Linux开放实验室(Linux OpenLab)郝煜.季冰Linux开放实验室校园爱好者小组 陈强(农大).吴迪.雷凌.戴二红.刘志强(北科大)Li ...
- 浅谈Linux中ldconfig和ldd的用法
ldd 查看程序依赖库 ldd 作用:用来查看程式运行所需的共享库,常用来解决程式因缺少某个库文件而不能运行的一些问题. 示例:查看test程序运行所依赖的库: /opt/app/todeav1/te ...
最新文章
- 独家 | 一文带你熟悉贝叶斯统计
- AI大厂算法测试心得:人脸识别关键性能指标有哪些?
- python零基础怎么学-零基础python入门分析,如何做到一个月学会(深思极恐)
- Oracle VM VirtualBox上安装windows server2008R2做SharePointServer2010开发(中)
- Python编程语言学习:for循环实现对多个不同的DataFrame数据执行相同操作(可用于对分开的测试集、训练集实现执行相同逻辑任务)
- Jar 打包 EXE文件,可以脱离java环境运行 Jsmooth的使用
- Android 第十五课 如何使用LitePal从SQLite数据库中删除数据(十四课用来保留讲解如何向SQLite数据库中存入数据)
- python中json使用方法总结_python中的json总结
- CISA 已遭利用漏洞列表新增17项
- 调节汉化版Eclipse的字体大小
- matlab三维数据转置,【转】求matlab三维数组转置函数
- 大数据如何可以推动员工敬业度
- wc2018冲刺期总结
- 2019/10/13中国工商银行笔试编程题
- php 怎么使用sql server 2000,Linux下PHP支持MSSQL(SQL Server2000)
- Ubuntu网络下载速度慢解决方法
- 用html如何做发帖的页面,如何用html发帖
- THREE.JS自定义中心旋转轴
- babel安装及使用
- 安装系列—火狐浏览器添加组件‘firebug’却无法找到?