目录
在学习文件系统前我们先来了解一下磁盘。
在我们之前的学习中,我们对于文件的操作,都是在文件已经被打开的前提下进行的;
被打开的文件 -->找到这个文件 -->磁盘中先找到 -->文件路径+文件名 -->执行文件操作
那你们有没有一个疑问?没有被打开的文件在哪里存放呢⁉️
没有被打开的文件是被放到磁盘里的!!磁盘中有磁盘文件,那这个没有被打开的文件是如何存取的呢?
想要知道这个问题的答案,我们先来了解一下磁盘;
磁盘
磁盘到底长啥样啊?
磁盘的结构
一个磁盘有多个盘片,一个盘片有两个盘面,每个盘面都有对应的磁头;
我们知道,在计算机中只认识二进制,那么磁盘是怎么存储数据的呢?
盘片的表面涂有磁性物质
,这些磁性物质用来记录二进制数据。
注意:磁头并不会碰到盘面,如果磁头和盘面接触,那么读取数据的时候,就会使盘面受到损害,那么存储的数据就会丢失;所以磁头是悬浮在盘片上的;
把一个盘片单独的拿出来:
每个盘面被划分成一个个磁道,磁道又被划分为多个扇区;
我们从图纸可以看到,每个磁道的大小都不一样,在外圈的磁道比较大,内圈的磁道比较小,但是不管有多大有多小,每个磁道存储内容的大小都是一样的;只不过扇区小的存储的数据紧密点已;
磁盘读写的基本单位是扇区,一个扇区大部分存储的是512字节,但是也有的扇区存储的是4KB;
小问题解答:
如何找到一个指定位置的扇区?
- 找到指定的磁头(Header)
- 找到指定的磁道(Cylinder)
- 找到指定的扇区(Sector)
上面的方法就是CHS定址法;
磁片中的盘面为什么要旋转?
- 通过旋转来定位扇区;
磁头为什么要左右摇摆?
- 通过左右摇摆来定位磁道;
通过学习磁盘的结构,我们可以知道,文件就是在磁盘中占几个扇区的问题!!
磁盘存储的逻辑抽象
对磁盘的存储进行逻辑抽象其实就是OS对磁盘进行管理和抽象;
为什么要对磁盘的存储进行逻辑抽象呢?
- OS直接使用CHS定址法,耦合度太高;
- 方便实现内核进行磁盘管理
不知道你们有没有见过磁带(没有见过的可以看下面图片):
我们就可以把整个磁盘看成一个一个的扇区这样来分:
假如有一个盘面1000个扇区,10个磁道;我们可以知道1个磁道有100个扇区;index为扇区的编号;
index/1000=H;
index%1000=tmp;[0,999]
tmp/100=C;
tmp%100=S;
文件系统
假如磁盘可以存储800GB,OS管理数据时会把它先分区在分组;
查看分区:
df -h
文件=文件内容+文件属性;
文件在磁盘中存储,本质上文件内容+文件属性数据;
Linux文件系统特定,文件内容和属性并不是存放在同一个地方,而是分开放的;
我们来看分别看一下每个组里面有什么;
- data blocks:数据区,存放文件内容;
- block bitmap:块位图,Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用
- i节点表:存放文件属性 如 文件大小,所有者,最近修改时间等
- inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用
- GDT,Group Descriptor Table:块组描述符,描述块组属性信息
- 超级块(Super Block):存放文件系统本身的结构信息。(并不是每个分组都有)
注意:
inode 内部不含文件名!!!
内核层面,每一个文件都要有inode number,我们可以通过inode号标识文件!!!
如何查找文件的inode号呢?
ll -li
每个分区内部分组,然后写入文件系统的管理数据(格式化!!!)-->在磁盘中写入文件系统!!!
问题解答:⭐⭐⭐⭐
我们先来看目录:
目录也是一个文件,那目录里面有什么呢?
存放的是文件名和inode号的映射关系
我们要查找一个文件 ,要先找到他的inode号(inode号是以分区为单位),我们平时查找一个文件时并没有用它的inode号啊,我们用的一直都是文件名,他俩有什么关系呢?我们上面不是说文件名和inode号不存放在同一个地区嘛,怎么通过文件名查找到inode号的?;
找到指定文件:先找到文件所在目录 --->打开目录 ---->根据文件名查找inode号 ---->目标文件的inode号
补充:(文件名和inode映射关系)
- 一个目录下不能建立同名文件
- 查找文件顺序:文件名-->inode号
- 进入目录,要x权限;r权限:本质是是否允许读取目录的内容文件名;w:是否新建文件;
那又会有一个疑问,我们通过目录来查找,可是目录也是文件啊,目录的inode怎么找到?
其实就是递归似的一直向上进行路径解析,解析完毕后,找到根目录,然后再反向逐次打开我们对应的文件!!!
我们指定每一个分区都有它的inode机制,我们怎么指定这个inode在哪一个分区呢?
因为一个文件在访问之前,都是先有目录的!!!/a/b/c...
这样就可以直接找到路径下的哪一个分区,就能找到inode,根据inode就直接去指定分区下找指定文件了;
磁盘-->分区-->写入文件系统(格式化)-->挂载到指定目录下-->进入该目录-->在指定分区下进行文件操作;
那目录是由谁提供的呢?
内核文件系统提前写入并组织好,然后你或你的进程提供!!!
软链接
我们先来看一下软链接长什么样子?
创建软链接:ln -s 目标文件 软链接文件名
如:ln -s test.txt test.link
看一下下面的代码,我们来分析一下软链接有什么特征:
我们会发现,我们刚才创建的软链接是有它自己的inode number;所以软链接的特征就是软链接是一个独立的文件;
那有人要问了,软链接有什么用途呢?
软链接在windows中就是一个快捷方式;
我们来查看一下test.txt文件中的内容,和对test.txt生成文件的软链接文件的内容;
他们的内容都是一样的;
由此可知:软链接内容:目标文件所对应的路径字符串;
硬链接
和软链接的流程一样,我们先来看一下硬链接长啥样;
创建硬链接:ln 目标文件 软链接文件名
如:ln test.txt test.link
软硬链接创建的区别就是-s
然后我们来查看一下文件对应的inode number;
test.txt和我们创建的硬链接文件的inode number是一样的;
所以硬链接特征:
硬链接不是一个独立的文件,因为它没有独立的inode number;用的是目标文件的inode number;
那硬链接不是文件的话,它是什么?
硬链接是文件名和inode的映射关系;就是在指定目录下,添加一个新的文件名和inode号的映射关系;
如果我们把目标文件删除,test.txt的内容不会丢失;因为test.txt的内容对应的inode number是可以找到的--------硬链接记录了;
文件属性引用计数
下面图片中圈起来的就是文件所对应的引用计数;
创建文件目录默认的引用计数是2:
为什么目录的引用计数默认是2呢?
任何一个目录都有两个文件: . 和 .. ;
我们会发现dir目录和 . 文件的inode号是一样的;
所以目录的引用计数默认是2;
如果在目录下在创建一个目录,会发现这个目录的引用计数变成的3,新创建的目录的引用计数是2;为什么原目录的引用计数会+1呢?
我们进入到新创建的目录查看,会发现 .. 文件的inode number和原目录的inode number是一样的;
- . 相当于当前目录的重命名, .. 相当于上级目录;
- 目录A内,新建一个目录,默认目录A的引用计数+1;
小知识点:
(1)定位一个文件,只要两种方式:
- 通过路径
- 直接找到目标文件的inode number;
(2)Linux下,不允许给目录创建硬链接,为了避免形成路径环绕;
(3)一般用硬链接作为文件备份;
以上就是文件系统和软硬链接的全部内容,希望有所帮助。😉😉😉