之前写了一篇Linux的文件描述符博客,是针对打开的文件来说的。那么如果一个文件没有被打开呢?存在哪里呢?又怎么存储?今天让我们一起来坐上"贼船"到知识的海洋中学习吧~

目录

磁盘

什么是磁盘?

磁盘vs线性结构

磁盘管理

Data block

inode Table

inode Table和Data block关系

inode Bitmap

Block Bitmap

补充&总结

软连接

创建软连接

删除软链接

硬链接

创建硬链接

删除硬链接

软链接和硬链接区别

补充

彩蛋&问题


磁盘

一个被打开的文件是要被加载到内存中,进而创建进程的。那么没有被打开的文件是要被存储到磁盘上。

文件 = 文件内容 + 文件属性。也就是说,一个空文件,也是有属性数据的,在磁盘上存储,也是要占空间的。

什么是磁盘?

磁盘是我们计算机中的一个机械设备(例如:SSD、FLASH卡、u盘)。

在这里,我们以机械硬盘为例:

盘面的正反面都可以写数据,同时盘面这里是一摞的,有很多个盘面,实物图没展现出来。

我们再来找个图形象化一点:

我们就可以通过找到具体的盘面,在盘面上找到特定的磁道, 在磁道上找到对应的扇区,我们就可以定位一个存储数据的位置。就像三维坐标系的(x,y,z)一样。

我们可不可以把盘片想象成线性的结构?

磁盘vs线性结构

不知道老铁们还记不记得小时候我们玩过的磁带:

磁带里面有一卷磁条(盘面形状),上面是可以存储数据的,我们可以把它拉出来,发现它是线性结构的。就可好比磁盘,我们能不能也把它拉出来,也变成线性结构呢?

我们可以看到,盘面可以被展成线性结构,LBA是对应的扇区地址,同时他可以被转换成对应的实际物理地址,找到硬件上对应扇区存储数据的位置。

所以到这里,基本的硬件知识大概了解一下就好。接下来才是我们的重点。

磁盘管理

我们知道一个磁盘的空间是很大的,管理成本也就变得非常高了。磁盘是怎么应对这种情况呢?分区!

由上图我们可以看到,我们把大磁盘分为若干个区,然后给区内写入文件系统,进行管理。

Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。政府管理各区的例子
超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了
GDT,Group Descriptor Table:块组描述符,描述块组属性信息。
块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用
inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。
inode Table: 存放文件属性 如 文件大小,所有者,最近修改时间等
Data block:存放文件内容。

Data block

存放文件内容。

比如下面结构:

inode Table

存放文件属性如文件大小,所有者,最近修改时间等。

inode Table我们也可以看成数组,每个数组里面存放了一个结构体,是用来描述文件属性信息的。我们知道文件 = 文件属性 + 文件内容。

inode Table和Data block关系

inode Table的每一个table里面的结构体,一定存储能找到Data block对应文件内容的那一块空间。就好比是int block[3],那么通过它,可以找到该文件在Data block存储的文件内容信息。

inode Bitmap

每个bit表示一个inode是否空闲可用。

我们知道了文件属性和文件内容存储位置,那么当我们新创建文件时,怎么确定哪些inode table块被使用了,哪些没有被使用?如果直接遍历inode table的话,效率太低了,于是就设计出位图的形式,通过判断0和1来确定当前空间是否被使用。

我们使用一个inode编号时,把对应的比特位由0置1,就可以了。

Block Bitmap

Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。

这个和inode Bitmap很类似,也是用比特位来标记的,本质上也是为了提高效率。

当我们要存储数据时,我们就需要通过Block Bitmap判断是否找到可存储数据的空间。

补充&总结

目录是文件吗??答案是,是的!目录里面也有数据,但是目录的数据块里面放什么呢?

文件名:inode编号。

所以说,我们创建的所有文件,全部都是在一个特定的目录下!!!

上面讲的都是在Linux系统下,特有的EXT系列的文件系统。

Linux:

文件名在系统层面是没有意义的!这是给用户看的。

Linux中真正标识一个文件是通过inode编号!!一个文件一个inode!

另外,我们把存储文件属性和文件内容的空间想象成数组,这是为了更加好理解。如果我们存储的数据超过了当前空间块大小,OS会再找一块空间接着储存,同时在上一个空间末尾处加一个指针来指向附加的空间的地址,这样就不会出现我们担心的空间不够情况了,实际上这个细节我们不用去关注。

软连接

创建软连接

ln -s 某路径下的文件 要形成软连接的名字

比如说我们在一个递归比较深的路径下有一个可执行程序test:

我们在当前目录下形成该可执行程序的软连接:

[cyq@VM-0-7-centos test]$ ln -s dir1/dir2/dir3/dir4/test myexe

我们再来查看一下:

我们来运行一下:

我们发现运行成功了,这就好比我们在windows环境下在桌面创建qq的快捷方式。

删除软链接

我们在这里最好不要使用rm去删除,而是使用unlink:

[cyq@VM-0-7-centos test]$ unlink myexe

硬链接

创建硬链接

ln + 某路径下的文件 + 创建硬链接的文件名

[cyq@VM-0-7-centos test]$ ln file.txt file_hard

演示:

删除硬链接

rm就可以直接删除

软链接和硬链接区别

我们来看2组软链接的inode编号

我们这时候可以发现,生成的软连接和原来的文件inode不一样,说明生成的软连接是有自己的inode的!

我们来看一组硬链接inode的关系:

我们发现生成的硬链接和原来的文件的inode一样,说明file_hard就不是一个独立的文件!

总结

软连接是有自己独立的inode的,软链接是一个独立文件!!有自己的inode属性,也有自己的数据块(保存的是指向文件的所在路径+文件名)。

硬链接没有自己独立的inode,硬链接根本就不是一个独立的文件,而是一个文件名和inode编号的映射关系,创建硬链接,本质就是在特定的目录下,填写一对文件名和inode的映射关系。

补充

我们在在命令行上有一串数字,我们今天就可以来了解了:

实际上这个数字也是文件属性,会被保存到该文件对应的inode Table里对应的结构体里面。

也就是我们在上面写的int ref;

注意:

这里的删除并不是清空数据,而是把对应的比特位由1置0。这种方法,效率还是很高的~

我们用一个目录为例,看看硬链接数怎么计算的:

我们发现dir目录硬链接数为3,那其余两个呢?

我们发现在dir1目录下还有一个.目录,在dir2目录中还有一个..目录 ,他们三个的inode编号都是一样的。

我们就在这里清楚了,创建一个目录,它的硬链接数至少为2。

彩蛋&问题

我们cat test.c就打印出了该文件里面的内容,结合上面知识,这一个指令底层都做了什么?

cat test.c后,OS先查看test.c的inode编号,比如1234,然后通过inode编号找到inode Table表里对应的空间,空间里有一个结构体,找到该结构体里面映射的Data Blocks对应的空间的位置block[],该数据块里面存储该文件的内容,然后打印文件内容。

看到这里,支持博主一下吧~

Linux inode相关推荐

  1. Linux inode 之我见

    Linux硬盘组织方式为:引导区.超级块(superblock),索引结点(inode),数据块(datablock),目录块(diredtory block).其中超级块中包含了关于该硬盘或分区上的 ...

  2. linux 的文件软链接隐藏,Linux inode及硬链接软链接详解

    Linux inode及硬链接软链接详解 York • 2020 年 09 月 28 日 Loading... 操作系统的文件数据除了实际内容之外,通常含有非常多的属性,例如 `Linux`操作系统的 ...

  3. linux查看inode使用情况,Linux Inode信息及inode使用率是指什么? - 新手站长网

    Linux服务器云监控会显示Inode信息及inode使用率选项,很多用户什么原因,新手站长网分享Linux系统下的inode原理.inode使用率及inode查询命令: 什么是inode信息? Li ...

  4. linux变量inode,Linux inode cache分析

    摘要 本文深入分析了Linux索引节点缓存的实现 1. Linux inode cache分析 Linux inode cache机制实现在fs/inode.c文件中. 1.1 Inode的slab分 ...

  5. 宝塔显示linux inode,Linux显示inode的信息

    Linux显示inode的信息 [email protected]:~$ df -i 文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点 /dev/sda8 1250928 23877 ...

  6. linux inode详解

    在Linux文件系统中,很多人对Inode都不太明白,今天我就和大家一起来分享一下我对Inode的认识,如果有理解错误的地方,请大家多多批评指点. 在上一篇一天一点学习Linux之认识文件系统中,在最 ...

  7. OS / Linux / Inode 详解

    一.inode是什么 理解 inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存 512 字节(相当于 0.5 KB). ...

  8. Linux inode与文件系统关系

    inode只有在linux文件系统的概念(ext3,ext4) .inode节点数量与文件存储的关系. 二.在文件系统初始化时设置合适的节点数量. linux服务器在存储文件小而数量多的情况下,需要考 ...

  9. Linux inode 详解

    目录(?)[-] 理解inode 图4 磁盘与文件系统 一天一点学习Linux之Inode详解 先看看Inode的结构图 再来了解一下文件系统如何存取文件的 我们以RHEL6系统为例 下面我们再来看看 ...

  10. linux ----Inode的结构图

    http://www.ruanyifeng.com/blog/2011/12/inode.html 先看看Inode的结构图 再来了解一下文件系统如何存取文件的 1.根据文件名,通过Directory ...

最新文章

  1. Prometheus监控业务指标
  2. X265-线程池-1
  3. java bean状态_无状态和有状态企业Java Bean
  4. LTE学习:关于CNTI
  5. Java基础教程【第四章:Java流程控制】
  6. 阿里云成为云原生计算基金会金牌会员
  7. Opencascade关键词
  8. 如何更新计算机的flash player,在电脑上如何升级Adobe Flash Player插件|电脑进行Flash Player更新的方法...
  9. 单链表之快慢指针技巧
  10. Array 常用函数
  11. 极域电子教室学生端全屏广播的破解及编程处理(附静态库)
  12. AOSP、AOKP、CM的区别
  13. BIT_陆小果的一元多项式
  14. 《计算机网络》——IEEE 802.11 无线局域网、无线局域网的分类、广域网、PPP协议、HDLC协议、链路层设备、冲突域和广播域
  15. 女生适合干【长期第一线编程工作】 男生能干的女生照样可以做的更好
  16. UTF-8不是兼容Unicode吗? 那UTF-8也应该支持中文啊, 为什么上面的XML文档会 出现字符集错误的情况呢?
  17. 在Windows下安装Vim编辑器
  18. 通过京东商品ID获取京东优惠券信息,京东优惠券信息接口,京东优惠券API接口,接口说明接入方案
  19. JEP 286: Local-Variable Type Inference
  20. 利用Cadence软件中的Model Editor工具和元器件的模型文本文件创建Spice模型

热门文章

  1. Desktop is unable to push commits to this branch
  2. 涉密计算机审计报告范文,涉密信息安全保密审计报告
  3. 计算机office13,如何关闭Office2013自动弹出的“您的计算机已安装最新版本的Office”提示...
  4. ASP.NET站点配置以及VS2008下C#、JavaScript联合调试(Ajax) ----以最短路径Dijstra最短路问题为例
  5. 一个简单的分频器结果时钟信号总是呈现高阻态。
  6. JAVA使用魔法数值
  7. 10种经典的错误提示信息
  8. 小程序+动易SF制作随手拍实例全景式操作(2)
  9. 计算机如何连接网络扫描仪,Win7系统怎么连接扫描仪 win7连接扫描仪的方法
  10. 华为认证HCIA-AI人工智能