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. Fastjson1.2.24RCE漏洞复现

    Fastjson1.2.24RCE漏洞复现 环境搭建 这里用的Vulhub靶场 cd /vulhub/fastjson/1.2.24-rce docker-compose up -d 报错 ERROR ...

  2. PTE 准备之 Read aloud

    Read aloud A text appears on screen.Read the text aloud rext up tp 60 words varies by task, dependin ...

  3. ES6学习笔记(2)- 箭头函数

    1. 箭头函数声明 箭头函数的声明方式示例: 1 const printValue = (condition) => { 2 let testValue = 55; 3 if (conditio ...

  4. python爬去壁纸网站上的所有壁纸

    import requests as r 2 from bs4 import BeautifulSoup 3 import os 4 base_url = "http://www.win40 ...

  5. PTA 统计二叉树叶子结点个数

    6-2 统计二叉树叶子结点个数 (10 分)   本题要求实现一个函数,可统计二叉树的叶子结点个数. 函数接口定义: int LeafCount ( BiTree T); T是二叉树树根指针,函数Le ...

  6. windows 以管理员身份运行 代码

    1 // 以管理员身份运行本进程 2 // 1 获取本进程的文件路径. 3 TCHAR path[MAX_PATH] = { 0 }; // 需要初始化 4 DWORD dwPathSize = MA ...

  7. java例题_44 一个偶数总能表示为两个素数之和

    1 /*44 [程序 44 偶数的素数和] 2 题目:一个偶数总能表示为两个素数之和. 3 */ 4 5 /*分析 6 * 1.从键盘得到一个偶数(大于2的偶数,因为1不是素数) 7 * 2.用for ...

  8. Java入门环境的搭建

    入门环境搭建 Java帝国的诞生 C & C++ 1972年C诞生 贴近硬件,运行极快,效率极高 操作系统,编译器,数据库,网络系统等 指针和内存管理 1982年C++诞生 面向对象 兼容C ...

  9. 面试官:聊一聊SpringBoot服务监控机制

    目录 前言 SpringBoot 监控 HTTP Endpoints 监控 内置端点 health 端点 loggers 端点 metrics 端点 自定义监控端点 自定义监控端点常用注解 来,一起写 ...

  10. Redis系列-存储篇sorted set主要操作命令

    Redis系列-存储篇sorted set主要操作函数小结 redis支持有序集合,即sorted set.sorted set在set的基础上,增加了排序属性,是set的升级版.这里简要谈谈sort ...