为什么要有inode

信息是存储在硬盘上的,当我们访问文件系统的时候,实际上是按照硬盘上的磁道不断进行读取的。硬盘上是分块存储的,现在我们假定,有一个文件a是动态扩展的,一开始存在块1,然后文件b比较大,存储的时候占用了个4块(即块2-5),当a不断增长,仅有块1已经不足以满足我们的需求了,a需要的就是块1,块6等,也就是文件a的存储不一定是连续的。磁盘结构如下

假设现在文件a的存储占用了块1和块10,其他位置的块都被占用了,不久后,块5被重置为空闲,那么a在动态增长的过程中,文件a会继续占用块5,也就是说会出现先访问块1,再访问块10,然后再访问块5这样的逻辑顺序。而实际上,磁盘在读取时,是按照磁道顺序读的(假设块1-5在同一个磁道,叫做磁道1,而块10恰好在第二个磁道,叫做磁道2),那么在访问文件a的时候会出现一种很尴尬的情况,就是磁头需要先跳到磁道2,然后再跳到磁道1,这样效率很低,如果磁头在扫描磁道1的时候能直接访问块5就好了。也就是说,如果一开始我们就知道这个文件就存到了哪几个块就好了。这就引出了inode,一个文件对应一个inode,而通过inode我们能知道很多信息。

Inode的表结构

从这个表结构中我们能够看到inode的一个重要功能就是指针,指向文件所存储的块,而且inode不仅自身有指针,他所指向的block数据块也存储的有指针,这样我们就能够单单通过inode知道该文件所存储的位置。

目录和文件的关系

首先我们知道文件里面存储的有数据和元数据,那么问题来了,文件名既不属于文件的数据,也不属于文件的元数据,那么文件名在哪里存放着呢?在linux中,处处皆文件,那么目录也是文件,目录自然也有数据,文件名就存放在目录中,文件名和Inode号构成的映射表就是目录的数据。也就是说在实际存储中,目录和目录下的文件是同级的,二者都是存储在硬盘上的普通数据,不过由于目录中的数据是Inode Table表,我们能从这个入口对其目录下的文件进行操作,这就是目录和文件的真实关系。

深层次理解拷贝,删除和移动

拷贝时,若目的文件存在,则是将源文件的内容覆盖目的文件的内容,文件的内容改变,其他不变。若目的文件不存在的时候,实际上是重新创立了一个文件,也就是说,给新文件分配了空闲的inode号和空闲的数据块,拷贝数据到这个新文件中。

删除,删除的实质就是删除硬链接(硬链接解释见下)的数目,当硬链接的数目减少至0时就会将inode块和block块都置为空闲,注意,此处是都置为空闲,不是清空,也就是说,所谓的被删除实际上就是把他的block块和inode块都标记为空闲,内容并没有消失,当这些块重新被占用时,会覆盖以往内容。

,这就是为什么会存在数据恢复这一说法。因为你本来就没有把数据删除掉哇。

移动,移动并不一定是把整个数据块从这个地方移动到另一个区域。同分区的移动,实际上是删除原有硬链接,并重新加上一个硬链接的过程;跨分区的移动,实际上是产生新的文件,并复制其内容,而原本的内容不会消失,只会删除他的硬链接,当数据块重新被占用时会被覆盖。

硬链接和软链接

软链接其实就是路径,一般来说都是相对路径,当然用绝对路径也可以实现,如果要我打个比方的话,那么软链接就好像我们windows系统中的快捷方式,一个指针,本身并不存储任何实际的内容,只是单纯的记录下了到达另一个文件的路径。

硬链接是在不同目录下引用同一个文件,同一个数据区,同一个inode号,其到达的路径和文件的名称可能不同,单是本质是一样的,不会发生改变的。举个例子,家里有条狗我有时候叫它二狗子,有时候叫它狗娃子,但无论我怎么叫它都不会改变它的本质,当我敲打狗的时候,二狗子和狗娃子都会感觉到疼痛。同理,当我修改硬链接下的文件的时候,与该文件i节点号相同的文件都会变化,牵一发而动全身。其实最好的理解就是,硬链接只是一个不同的名字,其本质仍是一个东西。

inode结构详解(深层次理解拷贝,删除,移动的本质)以及硬链接和软链接的区别(图文)相关推荐

  1. php 删除硬链接,RHCE系列之文件管理----硬链接和软链接

    Linux 文件系统最重要的特点之一是它的文件链接. 链接是对文件的引用,这样你可以让文件在文件系统中多处被看到. 在 Linux 中,链接可以如同原始文件一样来对待.链接可以与普通的文件一样被执行. ...

  2. Linux 系统的硬链接和软链接详解

    文章目录 什么是链接 链接用来干什么的 硬链接和软链接的区别 硬链接和软链接的图示 总结 我们知道文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 ...

  3. Transformer(二)--论文理解:transformer 结构详解

    转载请注明出处:https://blog.csdn.net/nocml/article/details/110920221 本系列传送门: Transformer(一)–论文翻译:Attention ...

  4. Linux文件系统的目录结构详解(转)

    Linux文件系统的目录结构详解(转) 原文链接https://www.cnblogs.com/cyjaysun/p/4462325.html 一.前 言 文章对Linux下所有目录一一说明,对比较重 ...

  5. 微信小程序01【目录结构详解、视图与渲染、事件、input、scroll-view】

    学习地址:https://www.bilibili.com/video/BV1sx411z77P 笔记01:https://blog.csdn.net/weixin_44949135/article/ ...

  6. 搞一下 车载以太网实战 | 01 车载以太网帧结构详解

    前言 搞SOA.搞 AP & CP AUTOSAR.搞异构SoC.搞车载以太网.搞车载OS等就找搞一下汽车电子. 全系内容可在<搞一下汽车电子>后台回复 "系列" ...

  7. 数据结构图,图存储结构详解

    1. 数据结构的图存储结构 我们知道,数据之间的关系有 3 种,分别是 "一对一"."一对多" 和 "多对多",前两种关系的数据可分别用线性 ...

  8. Android 8.0学习(32)---Android 8.0源码目录结构详解

    Android 8.0源码目录结构详解 android的移植按如下流程:     (1)android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来.     (2)正确挂载文件系统 ...

  9. Windows GPT磁盘GUID结构详解

    前一篇 Windows磁盘MBR结构详解 中我们介绍了Basic Disk中的Master Boot Record结构.GPT Disk作为Windows 2003以后引入的分区结构.使用了GUID分 ...

  10. [java] 虚拟机(JVM)底层结构详解[转]

    [java] 虚拟机(JVM)底层结构详解[转] 本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 在以前的博客里面,我们介绍了在java领 ...

最新文章

  1. 学习JavaScript 的必备
  2. Ubuntu18.04安装pymol
  3. MDK:assert_param函数未定义的错误:Error: L6218E
  4. 数据结构:二叉搜索树(BST)的基本操作
  5. STS插件_ springsource-tool-suite插件各个历史版本
  6. 【方便自己使用】KKT条件
  7. 【普通の随笔】3.26
  8. SqlParameter类——带参数的SQL语句
  9. Java设计模式汇总详解
  10. thymeleaf参考手册
  11. mysql strict_MySQL模式 Strict Mode知识点详解
  12. java学习总结(16.06.07)类的静态成员和非静态成员
  13. 电阻(6)限流、分压、采样、频率特性篇
  14. Django dWebScoket 实时消息推送
  15. 钉邮登陆 服务器响应超时,链接id服务器超时怎么回事啊
  16. 【TV Picture Quality - 03】TV屏幕解读
  17. python数据分析怎么学
  18. 智慧供应链解决方案-最新全套文件
  19. MySQL之——MySQL远程连接丢失问题解决方法(Lost connection to MySQL server)
  20. 树莓派蓝牙ble gattlib c语言,树莓派的蓝牙通讯(bluez、gattlib)

热门文章

  1. 机器学习基础算法22-提升理论-GBDT、XGBoost、Adaboost、方差与偏方
  2. 吴恩达深度学习——深度学习的实用指南
  3. iPhone SDK开发基础之 OpenFlow编程
  4. 博文视点大讲堂第33期——如何让你既能干得漂亮又说得清楚?
  5. 19【推荐系统3】AutoRec
  6. 03矩阵02——初等变换与高斯消元法、行阶梯形矩阵、行简化阶梯形矩阵、行阶梯形状与方程组解的关系、相抵
  7. 「三分钟系列04」3分钟看懂Python黑魔法之__repr__和__str__
  8. Python模块 - itertools循环器模块
  9. Flask运行时Unicode编码错误
  10. .net 移动端 web 上传图片_vue使用cropperjs实现移动端图片裁剪上传组件