【Linux系统】文件系统 && 软硬链接

文件被打开了?

这个文件已经被打开???什么意思,我们的Linux中存在非常多的文件,被打开的文件是少量的,我们要找到这个文件,先在磁盘中找到,就必须要通过这个文件的文件名和其路径来锁定其位置,那么问题来了,没有被打开的文件存放在哪里呢?磁盘中,磁盘文件,那我们得知道文件是如何存储的!!!

物理磁盘

我们知道文件=内容+属性,内容是数据,那属性应该也是数据啊,既然都是数据,那都是二进制数据,这些数据必然在磁盘上,那在磁盘上如何存储???

如下图是一个物理磁盘,在磁盘上会有正反两面,两面皆可存储数据,由于计算机只认识二进制数据,那存储的方式就必然是0,1序列。

 磁盘有正反两面,磁盘上有很多的磁道,通过主轴高速旋转带动磁盘高速旋转,磁头左右旋转来访问磁盘上的任意位置的数据。

 磁盘上有若干磁道组成柱面,1个磁道对应若干扇区,把一个扇区(512字节)作为磁盘读写的基本单位。

 如何找到一个指定的扇区呢?

我们是使用CHS定址法来实现的

  1. 找到指定的磁头(Header)
  2. 找到指定的磁道(柱面)  (Cylinder)
  3. 找到指定的扇区(Sector)

 那么文件其实就是在磁盘中占有几个扇区的问题!

 文件=内容+属性,Linux对文件需要管理,我们已经知道OS已经打开了的文件进行了管理,那对这未打开的文件如何管理呢,这些文件都是存在于磁盘中的!!!那么我们就要需要对磁盘进行管理,磁盘管理,那就得先描述,在组织!!!

为什么?OS直接使用CHS,耦合度太高,为了方便实现内核进行磁盘管理,把磁盘中的磁道的扇区进行抽象,组成一个线性结构,就可以利用数组下标来一一对应磁盘的扇区,一个扇区512字节,规定8个连续的扇区为一个块(4kb),所以文件就等于很多个扇区的数组下标。

那么我们想找到对应的扇区就可以去找对应的数组下标,我们又引入了块的概念,一个块有若干个扇区。

对于OS而言,未来我们读取数据可以以块为单位了!

 只要知道一个起始地址,和磁盘的总大小,有多少块,每个块的块号,如何转换到对应的CHS地址就全都知道了!!!这就是LBA  ---  逻辑区块地址(Logical Block Address,LBA)

我们知道自己的电脑上实际有几个磁盘吗?我们笔记本电脑实际用的是ssd固态盘,那么我们也知道我们的电脑上文件系统有c盘、d盘等等盘,那我们的硬件就分这么多盘???

实际不是这样,其实盘只有一个,只是进行了分区!!!

分区之后再分就是分组!!!

 我们这样只要管理好一个组就能管理好每个组,那管理好所有的组就能管理好一个分区,管理好一个分区那就能管理好所有的分区,那么文件管理就完成了!!!

那我们可以思考一下了,我们常常需要格式化某一个盘,c盘?d盘?

那格式化实质是在做什么工作呢???

现在有了答案!就是在每一个分区内部分组,然后写入文件系统的管理数据,这就是格式化过程的工作原理!!!

总结:格式化其实就是在磁盘中写入文件系统!!!

我们现在搭建出来了文件系统的一个框架,就该谈谈文件系统的细节部分了!!!

作为磁盘级的文件系统就要有其对应的各种信息,文件=内容+属性,都是存在哪里???

inode

 上图是Linux et2文件系统,磁盘文件系统图!!!

我们知道文件=内容+属性(也是数据),文件在磁盘存储,本质是文件的内容+文件的属性数据,而Linux特定,文件的内容和文件属性是分开存储的!!!

  • 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是否空闲可用。
  • i节点表:存放文件属性 如 文件大小,所有者,最近修改时间等
  • 数据区:存放文件内容
     

我们重点要谈一个inode,也就是i节点表(固定128字节)。

inode内部,不包含文件名!内核层面,每一个文件都要有inode number!我们通过inode号标识一个文件。每一个正常文件都要有一个inode属性集合!!

在Linux系统中我们要查看文件的inode编号需要使用命令 ls -li

 我们寻找文件的时候,都必须先得到文件的inode号,inode号是以分区为单位的(所以不同的分区内是可能有相同的inode号的)!datablock也是如此!

datablock数组能找到数据的内容在哪里,其中在找到对应位置的数据,如果该数组的大小无法保证去保存特大文件,这时该数组就会在大数据块中找到一些位置然后会继续从此位置映射出很多的数据的其他位置,保证了数据能够被完整的找到!!!

学习完inode等知识我们已经可以更深层次理解一些我们之前的知识了!!!

如何理解目录?

你凭什么直接拿到了inode编号,我们一直用的可都是文件名啊???

谈谈我们的目录文件,目录也是文件我们能理解,那是文件就得有文件=内容+属性,属性是啥我们已经学习了inode,明白了,那内容呢???

答案是:目录文件的内容其实是文件名和inode的映射关系!!!

如何理解一个目录不能建立同名文件?

因为我们需要用文件名+inode映射关系去唯一标识文件!!!

查找文件的顺序?文件名-->inode

如何理解目录的r权限?

本质是否运行我们读取文件的内容,也就是是否允许我们能够看到文件名与inode!!!

如何理解目录的w权限?

新建文件,最后一定要向当前所处的目录内容中写入,文件名和inode的映射关系!!!

如何理解一个文件的增删查改?

文件的增删查改不就是对文件名与其inode的映射关系进行增删查改吗!!!

还有一点我们平常执行文件操作时,往往不需要在文件名前面加入当前工作路径!!!

这是为什么?

找到指定的文件不就是找到文件所在的指定目录吗,打开这个文件就是根据这个文件名找到inode的映射关系往磁盘中查找。

 这个路径通过pwd怎么得到的???linux会缓存路径结构!!!

这是通过逆向路径解析,OS自己做的!!!

为什么我们在Linux中定位一个文件,在任何时候都要有路径的原因!!!

目录通常是谁提供的呢???你或者你的进程早就已经提供了!!!!

内核文件系统提取写入并组织好,然后我们提供的(我们的进程)!!!

我们知道inode在不同分区可能有相同的编号!

我们要想找到对应的文件就必须先找到对应的根目录啊!!!

那其实不用我们担心了,因为在分区时就被挂载到指定的目录下,一个文件在访问前,都是先有目录的!!!

软硬链接

软链接 执行命令ln -s 

 

硬链接 执行命令 ln

 用过了软硬链接,我们得到了一些特征:

  1. 软链接是一个独立的文件,因为有独立的inode number。
  2. 硬链接不是一个独立的文件,因为你没有独立的inode number,你用的是目标文件的inode。
  3. 属性中有一列硬链接数。

定位一个文件只有两种方式:

  1. 通过路径。
  2. 直接找到目标文件的inode。

最终都是通过inode找到!!!

 软链接的内容:目标文件对应的路径字符串(类似于Windows的快捷方式)

 硬链接是什么?

硬链接就是一个文件名和inode的映射关系,建立硬链接,就是在指定目录下,添加一个新的文件名和inode number的映射关系!

硬链接数,文件的磁盘级引用计数:意思是有多少个文件名字符串通过inode number指向我这个inode!

 什么是软硬链接,有什么用(为什么)?

软链接我们可以很清楚,类似Windows中的快捷方式!!!

那硬链接是怎么回事???

 硬链接一般有两个用处:

  1.  构建Linux路径结构,我们可以使用. ..来进行路径定位。
  2. 一般用硬链接做文件备份

 任何一个目录新建时,引用计数一定是2!!!

目录A内部,新建一个目录,会让A目录的引用计数自动加1,所以想知道一个目录中有几个目录:A引用计数-2即可求得!!!

Linux系统中不允许给目录建立硬链接,避免形成路径环绕!!!

. ..为何可以存在???

因为文件名是固定的,所有的系统指令在设定时几乎都能知道. ..是干什么的!!!

总结

打开的文件是存储在内核、内存中,而没有打开的文件则存放在磁盘中,与文件系统相关!!!

我们打开文件时有文本写入和二进制写入,计算机是只认识二进制的,所以文本写入这些都是语言层帮我们做的!!!

  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花影随风_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值