姓名:邝念君

学号:14020150024

【嵌牛导读】:EXT3,EXT4,BTRFS和XFS是现在最常见的四个Linux文件系统。为了便于理解,本文以相对简单的EXT2为切入点,介绍其原理。便不难理解Linux文件系统。

【嵌牛鼻子】:文件系统、 分区、描述表、寻址方式

【嵌牛正文】:

1、ext2文件系统

我们知道,一个磁盘可以划分成多个分区,每个分区必须先用格式化工具(例如某种mkfs命令)格式化成某种格式的文件系统,然后才能存储文件,格式化的过程会在磁盘上写一些管理存储布局的信息。下图是一个磁盘分区格式化成ext2文件系统后的存储布局。

图1  ext2文件系统

文件系统中存储的最小单位是块(Block),一个块究竟多大是在格式化时确定的,例如mke2fs的-b选项可以设定块大小为1024、2048或4096字节。而上图中启动(BootBlock)的大小是确定的,就是1KB,启动块是由PC标准规定的,用来存储磁盘分区信息和启动信息,任何文件系统都不能使用启动块。启动块之后才是ext2文件系统的开始,ext2文件系统将整个分区划成若干个同样大小的块组(Block Group),每个块组都由以下部分组成。

超级块(Super Block)描述整个分区的文件系统信息,例如块大小、文件系统版本号、上次mount的时间等等。超级块在每个块组的开头都有一份拷贝。

块组描述符表(GDT,Group Descriptor Table)由很多块组描述符组成,整个分区分成多少个块组就对应有多少个块组描述符。每个块组描述符(Group Descriptor)存储一个块组的描述信息,例如在这个块组中从哪里开始是inode表,从哪里开始是数据块,空闲的inode和数据块还有多少个等等。和超级块类似,块组描述符表在每个块组的开头也都有一份拷贝,这些信息是非常重要的,一旦超级块意外损坏就会丢失整个分区的数据,一旦块组描述符意外损坏就会丢失整个块组的数据,因此它们都有多份拷贝。通常内核只用到第0个块组中的拷贝,当执行e2fsck检查文件系统一致性时,第0个块组中的超级块和块组描述符表就会拷贝到其它块组,这样当第0个块组的开头意外损坏时就可以用其它拷贝来恢复,从而减少损失。

块位图(Block Bitmap)一个块组中的块是这样利用的:数据块存储所有文件的数据,比如某个分区的块大小是1024字节,某个文件是2049字节,那么就需要三个数据块来存,即使第三个块只存了一个字节也需要占用一个整块;超级块、块组描述符表、块位图、inode位图、inode表这几部分存储该块组的描述信息。那么如何知道哪些块已经用来存储文件数据或其它描述信息,哪些块仍然空闲可用呢?块位图就是用来描述整个块组中哪些块已用哪些块空闲的,它本身占一个块,其中的每个bit代表本块组中的一个块,这个bit为1表示该块已用,这个bit为0表示该块空闲可用。

为什么用df命令统计整个磁盘的已用空间非常快呢?因为只需要查看每个块组的块位图即可,而不需要搜遍整个分区。相反,用du命令查看一个较大目录的已用空间就非常慢,因为不可避免地要搜遍整个目录的所有文件。

与此相联系的另一个问题是:在格式化一个分区时究竟会划出多少个块组呢?主要的限制在于块位图本身必须只占一个块。用mke2fs格式化时默认块大小是1024字节,可以用-b参数指定块大小,现在设块大小指定为b字节,那么一个块可以有8b个bit,这样大小的一个块位图就可以表示8b个块的占用情况,因此一个块组最多可以有8b个块,如果整个分区有s个块,那么就可以有s/(8b)个块组。格式化时可以用-g参数指定一个块组有多少个块,但是通常不需要手动指定,mke2fs工具会计算出最优的数值。

inode位图(inode Bitmap)和块位图类似,本身占一个块,其中每个bit表示一个inode是否空闲可用。

inode表(inode Table)我们知道,一个文件除了数据需要存储之外,一些描述信息也需要存储,例如文件类型(常规、目录、符号链接等),权限,文件大小,创建/修改/访问时间等,也就是ls -l命令看到的那些信息,这些信息存在inode中而不是数据块中。每个文件都有一个inode,一个块组中的所有inode组成了inode表。inode表占多少个块在格式化时就要决定并写入块组描述符中,mke2fs格式化工具的默认策略是一个块组有多少个8KB就分配多少个inode。由于数据块占了整个块组的绝大部分,也可以近似认为数据块有多少个8KB就分配多少个inode,换句话说,如果平均每个文件的大小是8KB,当分区存满的时候inode表会得到比较充分的利用,数据块也不浪费。如果这个分区存的都是很大的文件(比如电影),则数据块用完的时候inode会有一些浪费,如果这个分区存的都是很小的文件(比如源代码),则有可能数据块还没用完inode就已经用完了,数据块可能有很大的浪费。如果用户在格式化时能够对这个分区以后要存储的文件大小做一个预测,也可以用mke2fs的-i参数手动指定每多少个字节分配一个inode。

数据块(Data Block)根据不同的文件类型有以下几种情况

(1)对于常规文件,文件的数据存储在数据块中。

(2)对于目录,该目录下的所有文件名和目录名存储在数据块中,注意文件名保存在它所在目录的数据块中,除文件名之外,ls -l命令看到的其它信息都保存在该文件的inode中。注意这个概念:目录也是一种文件,是一种特殊类型的文件。

(3)对于符号链接,如果目标路径名较短则直接保存在inode中以便更快地查找,如果目标路径名较长则分配一个数据块来保存。

(4)设备文件、FIFO和socket等特殊文件没有数据块,设备文件的主设备号和次设备号保存在inode中。

2、数据块寻址

图 2 数据块寻址

从上图可以看出,索引项Blocks[13]指向两级的间接寻址块,最多可表示(b/4)2+b/4+12个数据块,对于1K的块大小最大可表示64.26MB的文件。索引项Blocks[14]指向三级的间接寻址块,最多可表示(b/4)3+(b/4)2+b/4+12个数据块,对于1K的块大小最大可表示16.06GB的文件。

可见,这种寻址方式对于访问不超过12个数据块的小文件是非常快的,访问文件中的任意数据只需要两次读盘操作,一次读inode(也就是读索引项)一次读数据块。而访问大文件中的数据则需要最多五次读盘操作:inode、一级间接寻址块、二级间接寻址块、三级间接寻址块、数据块。实际上,磁盘中的inode和数据块往往已经被内核缓存了,读大文件的效率也不会太低。

linux对文件的描述,对Linux文件系统的简单理解相关推荐

  1. linux拷贝文件断电后丢失,linux突然断电重启,配置文件丢失/程序无法打开/文件损坏...

    电脑突然断电,重新开机后发现有的程序无法正常启动,原因是配置文件损坏了.感觉奇怪,为什么在硬盘里的文件会内容丢失? 1.可能:写数据的过程被中断,只完成了一部分.可能会出现乱码(因为只写了几个字节,不 ...

  2. linux误删文件咋恢复,恢复Linux误删文件

    恢复Linux误删文件 目录方法一 方法二 不小心执行了rm删除了某些文件,是有点倒霉.不过我一般都会设置alias rm='rm -i'在删除的时候需要输入Y才能真正删除,当然此时用rm -f那也会 ...

  3. linux加密文件_如何在Linux上使用Gocryptfs加密文件

    linux加密文件 Gocryptfs是安装在用户空间(FUSE)中的文件系统文件级加密程序. FUSE安装意味着将加密文件存储在使用FUSE接口安装的单个目录树中,就像USB密钥一样. 这样一来,任 ...

  4. linux查看文件的特殊权限,linux文件的特殊权限及隐藏权限

    基础知识 相信大家应该都知道linux的文件基本权限,使用ls -l命令可以显示文件的基本权限,"-rwxrwxrwx.",第一位表示文件的属性(是文件-  ,目录d等),后面每隔 ...

  5. linux传文件到其他用户,Linux怎样拷贝文件到其他用户

    正在Linux体系外,不少人没有知叙差别的用户之间要若何拷贝文件,其真复造文件到另外一个用户的要领有不少,昨天小编便给各人引见高Linux拷贝文件到其余用户的二种要领,一同去教习高吧. 情形: foo ...

  6. linux新建文件夹明率,linux新建文件和文件夹命令

    1.touch命令 touch命令用来修改文件的访问时间.修改时间.如果没有指定时间,则将文件时间属性改为当前时间. 当指定文件不存在,touch命令变为创建该文件. 语法: touch [-acm] ...

  7. linux删除文件里夹命令,Linux删除文件(夹)、创建文件(夹)命令是什么

    Linux删除文件(夹).创建文件(夹)命令是什么?在Linux系统中删除文件,很多用户都惯用rmdir命令,因为Linux没有回收站功能,所以笔者建议用户使用rm-rf命令,具体用法可以按照以下命令 ...

  8. linux 获取文件父目录权限,Linux 文件权限中,操作一个文件需要父目录的那些权限?...

    eudore:linux 文件权限中,操作一个文件需要父目录的那些权限? 是否需要检查每级目录?想找到一份完整规范正确的指导,自己在写检查 linux 用户文件权限的代码. 例如读取一个文件 /hom ...

  9. linux windows文件 编码_解决Linux与Windows文件显示乱码的问题

    重点:如果windows 下和虚拟机共享文件,先将文件移到其他位置使用notepad++ 改变编码模式为UTF-8,然后复制到共享目录,然后用编辑器打开中文就不是乱码了. 问题: 在Windows下用 ...

最新文章

  1. Solr索引和基本数据操作
  2. au加载默认的输入和输出设备失败_Mac OS X的音频输入输出时如何调整音量
  3. windows文本缩放影响mfc对话框_PhotoShop创建金属文本提示技巧
  4. UISegmentedControl swift
  5. HDU1002 大数相加
  6. js 根据时间生成唯一订单号
  7. JSP--(使用请求转发的动作标识jsp:forward)
  8. iOS仿支付宝芝麻信用仪表盘效果
  9. word2vec模型评估_NLP之文本分类:「Tf-Idf、Word2Vec和BERT」三种模型比较
  10. 使用之后,谈谈国产芯片的体验
  11. 仿真作业3:噪声通过DSB-SC解调器
  12. react全局状态管理_Reto:在React中使用hooks管理全局状态
  13. MRR(Mean Reciprocal Rank)笔记
  14. 计算机桌面音量键在哪,电脑音量调节快捷键_电脑音量快捷键设置
  15. 趋势追踪交易课堂:复盘的意义和方法
  16. bzoj2555 SubString (SAM+LCT维护子树大小/ETT)
  17. Android笔记之(图片高斯+Glide实现微信图片加载策略+仿微信进度条)
  18. 程序员养娃记:撸一手好代码,却带不好一个娃?!
  19. 使用posman访问post请求
  20. 从零开始学习3D可视化之摄像机

热门文章

  1. kml 解析 java_KML文件解析显示在地图
  2. css less 不要作用到子对象_不要盲目的在项目中使用LESS CSS
  3. MBE:ggtreeExtra-用图层叠加方法绘制环形进化树
  4. ISME:根系招募特异型菌群增强植物对盐胁迫的抗性
  5. MPB:西农焦硕组-微生物生物地理学研究方法
  6. R语言绘图:28个实用程序包
  7. R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、设置transpose参数转置三线表、变量作为列,子组(strata)作为行
  8. R语言使用ggplot2包使用geom_density()函数绘制密度图(填充色、线性设置)实战(density plot)
  9. python使用imbalanced-learn的AllKNN方法进行下采样处理数据不平衡问题
  10. 李迅雷+但斌+趋势的力量+对话PPT