Linux-鸟菜-7-Linux文件系统-EXT

Linux最传统的磁盘文件系统(filesystem)使用的是EXT2,所以先从EXT2开始了解。

/dev/sd[a-p][1-128]  为实体磁盘的磁盘文件名

/dev/vd[a-d][1-128]  为虚拟磁盘的磁盘文件名

Ext2(Linux second extended file system,ext2fs)

一个可被挂载的数据为一个文件系统而不是一个分区槽。

文件系统通常会将这两部分的数据分别存放在不同的区块,权限与属性放置到inode中,至于实际数据则放置到data block 区块中。另外,还有一个超级区块(superblock)会记录整个文件系统的整体信息,包括inode与block的总量、使用量、剩余量等。

每个inode与block都有编号,相关数据意义如下:

Superblock: 记录此filesystem的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息等。

Inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码。

Block:实际记录文件的内容,若文件太大时,会占用多个block。

Inode/block资料存储示意图(索引式文件系统)

FAT文件系统图

文件系统一开始就将inode与block规划好了,除非重新格式化(或者利用resize2fs等指令更改文件系统大小),否则inode与block固定后就不再变动。但是如果文件系统过大,将所有inode与block放在一起有点不好维护。于是Ext2文件系统在格式化的时候基本上是区分为多个区块群组(block group)的,每个区块群组都有独立的inode/block/superblock系统。

在整体的规划当中,文件系统最前面有一个启动山扇区(boot sector),这个启动扇区可以安装开机管理程序,这个非常重要的设计,因为这样就可以将不同的开机管理程序安装到个别的文件系统最前端,而不用覆盖磁盘卫衣MBR,这样也才能制作出多重引导的环境。Block group下面的留个模块下面细说:

Data block [以ext2系统为例]

实际存储数据的地方,有编号,大小可以为1 2 4 K,在格式化的时候确定的,根据大小的不同,导致系统对文件管理的限制也就不同。如下:

*原则上,block的大小与数量在格式化完就不能够再改变了(除非重新格式化);

*每个block内最多只能防止一个文件的数据;

*如果文件大于block的大小,这一个文件会占用多个block数量;

*若文件小于block,则该block的剩余容量就不能够再被使用了(磁盘空间浪费)

Inode table(inode 表格)

*该文件的存储模式(rwx);

*该文件的拥有者与组群(owner/group);

*该文件的容量;

*该文件建立或状态改变的时间(ctime);

*该文件最近一次的读取时间(atime);

*最近修改时间(mtime);

*定义特殊性的标志,如SetUID

*真正内容指向(pointer);

*每个inode大小均固定为128bytes(新的ext4与xfs可设定到256bytes);

*每个文件都仅会占用一个inode而已;

*因此文件系统能够建立的文件数与inode数量有关;

*系统读取文件时需要先找到inode,并分析inode所记录的权限与用户是否符合,若符合才能够开始读取block的内容。

下面例子是展示128b的inode怎么存400MB的文件,通常每个block占用4b的index。直接存肯定不够,假如block位4K,那么400MB/4K*4b 远远大于128b,而每个文件又只能使用一个index来存,所以出现了直接,间接,双间接三间接等等。

Inode(假如block=1K)

12个直连接指向:12*1K=12K

间接 :256*1K=256K

双间接:256*256*1K=256^2K

三间接:256*256*256*1K=256^3K

总值:

将直连接、间接、双间接、三间接贾总,得到12+256+256*256+256*256*256=16G

所以当block为1K大小时,能够容纳的最大文件为16GB,但是不能用同样的方法计算2K以及4K block,因为大雨2K的block将会受到Ext2文件系统本身的限制。

Superblock(超级区块) 

Suiperblock是记录整个filesystem相关信息的地方,没有Superblock就没有filesystem了。

*block与inode的总量;

*未使用与已使用的inode/block数量;

*block与inode的大小(block与1,2,3K,inode为128/256bytes);

*filesystem的挂载时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等文件系统相关信息;

*一个validbit的数值,若此文件系统已被挂载,则valid bit为0,若未被挂载,则valid bit为1。

Superblock的大小为1024bytes,每个block group都可能含有superblock,但是我们也说一个文件系统应该仅有一个superblock,事实上除了第一个block group内会含有superblock之外,后续的block group不一定含有superblock,而若有superblock则该superblock主要是做为第一个block group内superblock的备份。

Filesystem Description(文件系统描述说明)

这个区段可以描述每个block group的开始于结束的block号码,以及说明每个区段(superblock bitmap inodemap datablock)分别位于哪一个block号码之间。

Block bitmap(区块对照表)

从block bitmap 当中可以知道哪些block是空的,因此我们的系统就能够很快速的找到可以使用空间来处理文件。同时如果删除文件时,也会在这里标记相关位置是空的了。

Inode bitmap(inode对照表)

和上面一样,只不过这个是标记inode的。

查看superblock用dumpe2fs相关命令,xfs(CentOS 7.X)用不了。

与目录树的关系

在Linux上建立一个目录时,文件系统会分配一个inode与至少一块block给该目录。其中,inode记录该目录的相关权限与属性,并记录分配到的那块block号码;而block则是记录在这个目录下的文件名与该文件名占用的inode号码数据。如下block记录的:

想要观察文件占用的inode号码时,可以使用 ls -i

目录树读取

经过上面的说明克制,inode本身宾补记录文件名,文件名的记录是在目录的block中,所以之前说 文件增删改查与目录的w权限有关。那么因为文件名是记录在目录的block当中,因此当我们要读取某个文件时,就无比会经过目录的inode与block,然后才能找到那个带读取文件的inode号码,最后才会督导正确文件的block内的数据。

由于目录是是由根目录开始读起,因此系统透过挂载的信息可以找到挂载点的inode号码,次数就能够找到根目录的inode内容,并依据该inode读取根目录的block内文件名的数据,再一层一层的往下读到正确的文件。

Linux-鸟菜-7-Linux文件系统-EXT的更多相关文章

  1. 《鸟哥的linux私房菜》 - linux命令温故而知新

    在公司的某角落里,看到了<鸟哥的linux私房菜>,顿时想看看是什么鬼. 其他时候还要自己去买才有,现在正好,比图书馆方便.看完了,写点啥! 编辑器很重要,一个vim就主要是我的使用方向: ...

  2. 鸟哥的Linux私房菜-----8、文件系统的装载

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVrZXdhbmd6aQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  3. linux 私房菜 CH8 linux 磁盘与文件系统管理

    索引式文件系统 superblock 记录此系统的整体信息,包括 inode/block 的总量.使用量.剩余量,以及文件系统的格式与相关信息等: inode 记录档案的属性,一个档案占用一个 ino ...

  4. linux 私房菜 CH7 Linux 档案与目录管理

    路径 ``` . 此层目录 .. 上一级目录 前一个工作目录 ~ 当前用户的家的目录 ``` 变换目录 cd 显示目录 pwd [-P] -P 显示出确实的路径,而非使用链接 (link) 路径. 创 ...

  5. linux 私房菜 CH6 Linux 的档案权限与目录配置

    查看文件属性 ls -al 第一栏:类型与权限 d:目录: -:档案: l:链接档: b:可随机存取装置: c:一次性存取装置: 第二栏:有多少档名连结到此节点 第三栏:拥有者 第四栏:所属群组 第五 ...

  6. 学习鸟哥的Linux私房菜笔记(15)——文件系统

    一.文件结构 为了能在设备上存储与读取文件,我们需要在分区上创立文件系统 文件系统记录目录与文件我们称之为文件结构 每一个文件系统在Linux里都被解释成由一个根目录为起点的目录结构 Linux将各个 ...

  7. 鸟哥的linux私房菜勘误表

    博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://github.com/jiangxincode 知乎地址: https://ww ...

  8. 鸟哥Linux私房菜知识汇总8至9章

    一看最近<鸟哥Linux私房菜>. 这是一个基本的书,万丈高楼平地起,学. 这是我整理的一些知识点.尽管非常基础. 希望和大家共同交流. 第8章 Linux磁盘与文件系统管理 一.Linu ...

  9. 鸟哥的Linux私房菜笔记第四章

    前言 对着<鸟哥的Linux私房菜-基础版>做了简化笔记.不想让自己知其然而不知其所然.所以写个博客让自己好好巩固一下,当然不可能把书中的内容全部写下来.在这里就简化一点把命令写下来. 让 ...

  10. 鸟哥Linux私房菜基础学习篇学习笔记2

    鸟哥Linux私房菜基础学习篇学习笔记2 第九章 文件与文件系统的压缩打包: Linux下的扩展名没有什么特殊的意义,仅为了方便记忆. 压缩文件的扩展名一般为: *.tar, *.tar.gz, *. ...

随机推荐

  1. ClickHouse元数据异常-MySQLHandlerFactory:Failed to read RSA key pair from server

    Clickhouse版本:20.3.6.40-2 clickhouse集群三个节点,一分片,三副本,三个节点数据完全一样 1. 问题描述 在使用连接工具操作时,发现其中一个节点连接拒绝,无法操作,另外 ...

  2. 【python+selenium的web自动化】- 元素的常用操作详解(二)

    如果想从头学起selenium,可以去看看这个系列的文章哦! https://www.cnblogs.com/miki-peng/category/1942527.html ​ 本篇主要内容:1.鼠标 ...

  3. golang 二维平面求多重遮挡三角形总面积

    解决问题描述:二维平面有很多三角形错落,可能会相互叠加落在一起,也可能互相远离.目标求出这些三角形的总占地面积. 我最开始想的解决方案是用总面积-总重叠面积 = 总占地面积.后来实现起来发现当面临多次 ...

  4. JetBrains Projector 体验

    先来一张最终效果图: JetBrains Projector 是 JetBrains 的"远程开发"解决方案,基于 Client + Server 架构,对标的是微软 VSCode ...

  5. 论Redis分布式锁的正确使用姿势

    前言 日常开发中,秒杀下单.抢红包等等业务场景,都需要用到分布式锁.而Redis非常适合作为分布式锁使用.本文将分七个方案展开,跟大家探讨Redis分布式锁的正确使用方式.如果有不正确的地方,欢迎大家 ...

  6. SQL 存储过程里调用另一个存储过程

    由于创建了一个存储过程,并且要在另一个存储过程里调用这个存储过程所以在网上找了一下相关的代码,现在总结一下,防止以后还会用到 由于这次我写的存储过程只需要返回一个求和的结果,所以我使用了output ...

  7. 【linux】驱动-9-设备树插件

    目录 前言 9. Linux设备树插件 9.1 格式 9.2 设备树插件的编译和加载 9.2.1 单独使用dtc工具编译 9.2.2 内核dtc工具编译设备树插件 9.2.3 加载设备树插件 9.2. ...

  8. vue 快速入门 系列 —— vue 的基础应用(上)

    其他章节请看: vue 快速入门 系列 vue 的基础应用(上) Tip: vue 的基础应用分上下两篇,上篇是基础,下篇是应用. 在初步认识 vue一文中,我们已经写了一个 vue 的 hello- ...

  9. python基础(四):切片和索引

    Python中的序列有元组.列表和字符串,因此我们都可以通过索引和切片的方式,来获取其中的元素. 索引 Python中的索引,对于正向索引,都是从0开始的.但是对于反向索引,确实从-1开始的.如图所示 ...

  10. (十二)struts2的类型转换

    所有的MVC框架,都属于表现层的解决方案,都需要负责收集用户请求参数,并将请求参数传给应用的控制器组件. 这时问题出现了,所有的请求参数都是字符串类型数据,因此MVC框架必须具备将这些字符串请求参数转 ...