资讯专栏INFORMATION COLUMN

【学习理解】文件系统的解读

BlackHole1 / 893人阅读

摘要:磁盘的结构记录了开启启动的一些信息磁盘分区的结构文件系统不同的分区可以使用不同的文件系统文件系统中,通过来记录整个文件系统的使用信息。在磁盘分区的时候,特别说过。

按照我个人的理解慢慢说,可能顺序不是很流畅,但是我尽量说的通畅一点。
先梳理自己的思路,再慢慢整理格式。 先想下怎么写文章的脉络
写一篇文章真的好慢啊!!!
先写大概 脉络结构,后面再整理文字。 最后自己再组织语言。
本意: 是梳理自己的理解,让自己更好讲解,但是写着写着方法,还是别人的思路 这真的不好, 这只能说明理解的还是不深,加强理解。 可以去除一些多余的解释
写作思路,带着问题 解决问题
1. 文件系统的来源

在电脑中容量比较大的存储介质是:磁盘。 (关于磁盘的介绍不在此多引申)

所谓的文件系统,就是按照我们比较容易理解的文件概念(似乎看的到),把其对应的结构和数据保存在磁盘中。

如同我们装机时候一样,把文件系统的内容保存到磁盘上,需要以下几个小步骤。

初始化,分区

用文件系统格式化

挂载

多带带说的步骤1,2,3 总是觉得莫名其妙,但是看下每一步做的工作,以后最后形成的系统格式。 那么每一步的必然性就很明显了。

第一步: 可以通过在虚拟机上添加一块移动硬盘,然后进行模拟分区

分区之后

第二步: 文件系统有很多种不同的文件格式

可以使用命令 mkfs 来预览

选择比较常用的 ext4 进行格式化分区

注意:看上图 ext 文件系统格式化 分区 sdb1 之后的提示信息,特别重要

重要的备注信息如下 :

261888 4k 大小的 blocks

65536 inodes

superblock

inode table

因为正是这些,属于文件系统的基本结构,决定了文件怎么读写 来使用的,后续介绍文件的时候,这里面的概念会一直论述。

第三步: : 挂载到不同的目录

之后对挂载文件夹内mnt的操作,就是等同于磁盘的操作了。

如果当前inode 有挂载信息,那么它本身的文件功能会被忽略。 查找文件的时候也是这样,后面具体解释
错误 tips

如果不格式化 直接挂载

如果按照结构体的顺序来介绍,会感觉一下子把人给搞楞,搞的迷糊。 为了简单说明,我们为什么这么做之前,我们先来看看我们用文件系统作甚本,然后循环渐进的引入不同的术语和概念

术语真是不同程序员之间交流的关键,可以减少很多交流偏差成本。
2. 文件是什么?

查看 :我们在电脑上或者客户端看到的文件和文件夹(前面已经说过,他们是以一定的形式保存在磁盘上)

开发使用:用户通过系统调用,来进行 read, write

我们知道,磁盘是通过扇区保存00011这些字节来保存数据的,以及磁盘的最小单位是扇区。

本质上,我们读取或者写入,都是选择固定磁道的 Noxxx 扇区,来进行数据的读写

2.1 文件的信息内容

磁盘是如何保存是文件的?文件的格式是什么? 他是如何读存的? 带着这些问题,我们来看看文件的具体内容。

先按照我们日常使用习惯,进入一个目录,查看一个文件的详细信息

ls -ahl -i

第一列 :比如 262547,就是文件的 inode。
我们日常都是通过 inode 查找文件信息 和 文件内容。

2.2 新建一个文件

当文件系统新建一个文件,比如 新建一个hello.txt 时,是如何记录文件的。

上图分为二部分,第一部分是 inodetable ,第二部分是 data。
我们通过inode table 选择一个空闲地址,生成一个 inode 节点,然后再data层保存数据,之后把数据的地址回写入到 inode 的结构体上。

比如 table 中会保存,文件inode 节点对应的 扇区地址编号
(上面的图 为了更好说明,为了更好理解 不做纠错)

通过上图我们来查询一个文件的时候,可以定位到固定的扇区,然后通过磁盘寻道读取内容

2.3 block

不同的文件系统 ,扇区的大小不一样,有的 512b,有的1024b 等等。 为了统一化,引入了一个中间层 block
比如定义 block 大小为4k,不同的文件系统,不同大小的扇区,可以用不同的数量来填充。

比如 用4个 1024B的扇区,8个512B的扇区来来实现。 这样保证了每个block的大小是相同的。

所谓磁盘的最小单位是: 扇区
文件的最小单位是: 块

这也就是开头所说的,分区之后包含的 多少个 block。

2.4 存储映射

如图所示,当我们查看文件内容时,我们按照一定的规则找到该文件的inode,然后通过inode 获取文件的数据。
大的文件,可能保存在n个block中。(比如一部4G的mv,可能需要很多个block)
小的文件,用一个block来保存。

通过block 关联的扇区,就是记录文件的内容。
(如果更好的利用局部性,以及按照一定的电梯算法)通过记录的扇区,按照先后顺序,开始旋转磁道,读取数据到内存。

2.5 inode 记录了什么信息

linux 根据 inode 查找文件的存储位置和文件信息

2.6 inode table

找到一个空闲的inode ,然后存储到 block,然后把地址写到 inode 上

每一个文件,都需要一个inode 节点来描述

3. super block

我们通过 stat 可以查看文件的使用情况。
但是我们在新建一个文件的时候,需要分配 inode 和 data addr 对应的block

他们是如何知道自己系统中,还有空闲的inode 和 block。

所以次数就需要一个字段,或者说结构体来记录 当前文件的 inode和 block的使用情况。

让我们先把话题回溯到磁盘的格式化,看看他们做了什么工作。

磁盘的结构 :

MBR : 记录了开启启动的一些信息

磁盘分区的结构 :

boot sector

ext 文件系统

不同的分区可以使用不同的文件系统

文件系统中,通过 super block 来记录 整个文件系统的使用信息。

每一个 block group中,使用 block bitmap 和 inode bitmap 记录group内 inode 和 data的使用情况。
便于分配和管理。

先从 data block 找一个空闲的存放文件的数据,然后从 innode table 找一个空闲的节点 描述文件的地址和属性
,存放 data block 的地址

所以新建文件的时候,这二个位置会发生变化。

super block : 在磁盘分区的时候,特别说过。

至此,我们在整体的看下 文件在磁盘上的存储

我们是如何查找到一个文件的 ,在找到文件path 之前我们先了解下 目录

4. 目录和目录项 4.1 问题的引入

inode 信息保存的是 文件的各种信息,具体的我们可以看下他的 struct,里面的字段。

我们都是通过inode 来查找文件。

但是inode没有保存文件名,用户习惯是通过文件名来查找文件内容。

4.2 目录

datablock 文件保存的是数据,目录存放的是 表格

如果查看一个文件, 根据path
首先先找 根目录 的 inode 这个目录,文件内容是表格。

找到 /bin 的地址是 6029313. 的inode 编号
inode table 查找到对应的inode 节点 包括文件的名称。

inode 有一个约束 2:一定是根目录的 inode
1 : 一般代表文件初始化保留的
5. 文件path

文件的相对路径 :

文件夹的 . 和 ..

分别对应 当前目录的硬链接 和 上级目录的硬链接。

然后通过上级目录的 block table 一点一点回溯找到

6. 挂载

父文件系统是 电脑磁盘上的系统

子文件系统: 可以是 U盘 移动硬盘上的文件

6.2 如何访问一个U盘的文件

从根目录寻址path,到固定的inode ,如果编辑为没有挂载,那么就访问文件。
如果标记为已经挂载,那么久去 hash table 里面找挂载的 vfsmout 信息,找到挂载点 的根目录
然后依次找到path 下的文件

这也解释了为什么,一个文件夹目录被挂载之后,之前的文件无法访问和读写了

7. VFS

8. 文件描述符

文件是如何动态操作一个文件的

可以参考操作系统的

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/63693.html

相关文章

  • Karaf(OSGi)+CXF荆棘之路

    摘要:笔者很菜,文章仅供自己复习使用,不专业之处请见谅。现在公司让用的框架,未来也许某天也会成为主流的吧,本文主要讲解如何简单使用进行开发。这里谈的是不是,两个技术名词长得很像却是两码事看错文章的朋友请打住。在标签下指定属性所对应的类。 吐槽:不断的JAVA新技术学习中,幸得笔者同事xunhua是大神,真的是大神级那种,一路抱大腿走过荆棘之路,真的可以用荆棘来形容Karaf(OSGi)+ C...

    hankkin 评论0 收藏0
  • 文森特系统用深度学习将涂鸦变成艺术创作

    摘要:研究者创建了一个名叫文森特的系统是的,就是梵高那个文森特使用深度学习,将简笔画转变为艺术品。研究人员认为,除了在艺术绘画方面大放异彩,类似文森特的技术还有一系列潜在的应用。 如果你喜欢艺术但下笔皆为灵魂画作,那么今天要介绍的这个项目肯定合你心意。AI研究者创建了一个名叫文森特(Vincet)的系统——是的,就是梵高那个文森特——使用深度学习,将简笔画转变为艺术品。用户在平板上的涂鸦经过文森特...

    PumpkinDylan 评论0 收藏0
  • 精读《源码学习

    摘要:精读原文介绍了学习源码的两个技巧,并利用实例说明了源码学习过程中可以学到许多周边知识,都让我们受益匪浅。讨论地址是精读源码学习如果你想参与讨论,请点击这里,每周都有新的主题,周末或周一发布。 1. 引言 javascript-knowledge-reading-source-code 这篇文章介绍了阅读源码的重要性,精读系列也已有八期源码系列文章,分别是: 精读《Immer.js》源...

    aboutU 评论0 收藏0
  • 深度学习即将攻陷下一领域:NLP—ACL2016优秀论文解读

    摘要:而自然语言处理被视为深度学习即将攻陷的下一个技术领域,在今年全球较高级的学术会议上,我们也看到大量的在深度学习引入方面的探索研究。和也是近几年暂露头角的青年学者,尤其是在将深度学习应用于领域做了不少创新的研究。 深度学习的出现让很多人工智能相关技术取得了大幅度的进展,比如语音识别已经逼近临界点,即将达到Game Changer水平;机器视觉也已经在安防、机器人、自动驾驶等多个领域得到应用。 ...

    mengera88 评论0 收藏0
  • React 源码深度解读(二):首次 DOM 元素渲染 - Part 2

    摘要:本文将要讲解的调用栈是下面这个样子的平台无关相关如果看源码,我们会留意到很多相关的代码,我们暂时先将其忽略,会在后续的文章中进行讲解。现在我们来看一下各实例间的关系目前为止的调用栈平台无关相关下一篇讲解三总结本文讲解了转化为的过程。 欢迎关注我的公众号睿Talk,获取我最新的文章:showImg(https://segmentfault.com/img/bVbmYjo); 一、前言 R...

    wean 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<